viba-cli 0.26.0 → 0.28.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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/fallback-build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/credentials/page/server-reference-manifest.json +49 -4
- package/.next/server/app/credentials/page.js +1 -1
- package/.next/server/app/credentials/page.js.nft.json +1 -1
- package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
- package/.next/server/app/credentials.html +1 -1
- package/.next/server/app/credentials.rsc +4 -3
- package/.next/server/app/credentials.segments/_full.segment.rsc +4 -3
- package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
- package/.next/server/app/credentials.segments/_index.segment.rsc +3 -2
- package/.next/server/app/credentials.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +4 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +3 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
- package/.next/server/app/new/page/server-reference-manifest.json +40 -25
- package/.next/server/app/new/page.js +2 -2
- package/.next/server/app/new/page.js.nft.json +1 -1
- package/.next/server/app/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page/server-reference-manifest.json +40 -25
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +19 -34
- package/.next/server/app/session/[sessionId]/page.js +1 -1
- package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__01151db2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__01151db2._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0522f852._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0522f852._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6c63d5b8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6c63d5b8._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b2d91bdd._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__b2d91bdd._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e5ccf6ef._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e5ccf6ef._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_8cba5059._.js → node_modules_1924b56e._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_1924b56e._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_e604472b._.js → node_modules_4ebcf1df._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_4ebcf1df._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_8d27431f._.js → node_modules_9819fed1._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_9819fed1._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_61fa9608._.js → node_modules_a6b22d4e._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_a6b22d4e._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +3 -0
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +8 -2
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +102 -58
- package/.next/static/chunks/13c27cbcbed10be4.js +9 -0
- package/.next/static/chunks/2473c16c0c2f6b5f.css +2 -0
- package/.next/static/chunks/2648731e67ebd2ac.js +1 -0
- package/.next/static/chunks/453fc76d2d553c51.js +3 -0
- package/.next/static/chunks/63e62f1fed4c4271.js +3 -0
- package/.next/static/chunks/afd3fb06f06c56af.js +3 -0
- package/.next/static/chunks/d658bac82c8382da.js +3 -0
- package/.next/static/chunks/dc6ca47e0eb2b1af.css +1 -0
- package/package.json +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__04684e03._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__04684e03._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__04bf0b15._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__04bf0b15._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1c2594e3._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__1c2594e3._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__319c1c59._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__319c1c59._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a091a4c1._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a091a4c1._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b2c27322._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b2c27322._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ba6de807._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__ba6de807._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ee9c5185._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__ee9c5185._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fbfe5cd5._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__fbfe5cd5._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_61fa9608._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_8cba5059._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_8d27431f._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_e604472b._.js.map +0 -1
- package/.next/static/chunks/2da4ff7bd7ef7984.js +0 -3
- package/.next/static/chunks/4cb45c81c3579aa0.js +0 -3
- package/.next/static/chunks/68be4ececa8dedfc.js +0 -1
- package/.next/static/chunks/7dad2f2e170a6bec.css +0 -3
- package/.next/static/chunks/8347c7b3b84ae4c2.js +0 -3
- package/.next/static/chunks/8f4ebe93d38185fb.js +0 -3
- package/.next/static/chunks/c814bb803eca5aea.js +0 -3
- /package/.next/static/{T2HRQ3n5Gcw83spbEWvCi → FS2_5AqvTArHxxuNAA0Or}/_buildManifest.js +0 -0
- /package/.next/static/{T2HRQ3n5Gcw83spbEWvCi → FS2_5AqvTArHxxuNAA0Or}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{T2HRQ3n5Gcw83spbEWvCi → FS2_5AqvTArHxxuNAA0Or}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/actions/data%3A35573b%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ade6d7d%20%3Ctext/javascript%3E","../../../../src/components/FileBrowser.tsx","../../../../src/app/actions/data%3Aa7280e%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ab89583%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A63b1db%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac8717b%20%3Ctext/javascript%3E","../../../../src/components/GitRepoSelector.tsx","../../../../src/app/actions/data%3Acee727%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A913650%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae678c6%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ace6179%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A7fcc4d%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A71138f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A135d09%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A1f2e12%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac295c8%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Abae1bc%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A6fc553%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A3372aa%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A321bfe%20%3Ctext/javascript%3E","../../../../node_modules/lucide-react/src/icons/chevron-right.ts","../../../../node_modules/lucide-react/src/icons/check.ts","../../../../node_modules/lucide-react/src/icons/x.ts","../../../../node_modules/lucide-react/src/icons/bot.ts","../../../../node_modules/lucide-react/src/icons/cpu.ts","../../../../node_modules/lucide-react/src/icons/cloud-download.ts","../../../../node_modules/lucide-react/src/icons/folder-cog.ts","../../../../node_modules/lucide-react/src/icons/settings.ts","../../../../node_modules/lucide-react/src/icons/folder-git-2.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"7f6a15dd7e521d79dd61908dc784fd2013c4bc39b0\":\"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(\"7f6a15dd7e521d79dd61908dc784fd2013c4bc39b0\",callServer,void 0,findSourceMapURL,\"getDefaultDevServerScript\");export{$$RSC_SERVER_ACTION_17 as getDefaultDevServerScript};","/* __next_internal_action_entry_do_not_use__ [{\"4071dd27fbdd25bab02b32c1dd7cae0c7aabe1d331\":\"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(\"4071dd27fbdd25bab02b32c1dd7cae0c7aabe1d331\",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=\"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=\"badge badge-xs badge-primary\">git</span>\n )}\n </div>\n {item.isGitRepo && (\n <button\n className=\"btn btn-xs btn-primary\"\n onClick={(e) => {\n e.stopPropagation();\n void handleSelectPath(item.path);\n }}\n title={`Select ${item.name}`}\n >\n <Check className=\"w-3 h-3\" />\n Select\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 "Select Current Folder" to choose it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b539ada759c41a4d5b2f94373b454d817b8b5853\":\"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(\"40b539ada759c41a4d5b2f94373b454d817b8b5853\",callServer,void 0,findSourceMapURL,\"checkIsGitRepo\");export{$$RSC_SERVER_ACTION_6 as checkIsGitRepo};","/* __next_internal_action_entry_do_not_use__ [{\"4070bef6e368a632fdfb8653bf0b2b46771a1537a1\":\"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(\"4070bef6e368a632fdfb8653bf0b2b46771a1537a1\",callServer,void 0,findSourceMapURL,\"getBranches\");export{$$RSC_SERVER_ACTION_4 as getBranches};","/* __next_internal_action_entry_do_not_use__ [{\"602e4b1ef0f5c65211b613592fcc29fe30dd19ddf2\":\"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(\"602e4b1ef0f5c65211b613592fcc29fe30dd19ddf2\",callServer,void 0,findSourceMapURL,\"checkoutBranch\");export{$$RSC_SERVER_ACTION_5 as checkoutBranch};","/* __next_internal_action_entry_do_not_use__ [{\"7f56e97b91b82b114b2b888f7669f74f3a3919ceef\":\"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(\"7f56e97b91b82b114b2b888f7669f74f3a3919ceef\",callServer,void 0,findSourceMapURL,\"getStartupScript\");export{$$RSC_SERVER_ACTION_16 as getStartupScript};","'use client';\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { FolderGit2, GitBranch as GitBranchIcon, Plus, X, ChevronRight, FolderCog, Bot, Cpu, Trash2, Play, KeyRound, Settings, ExternalLink, CloudDownload } 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 { listCredentials } from '@/app/actions/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { useRouter } from 'next/navigation';\nimport { getBaseName } from '@/lib/path';\nimport { notifySessionsUpdated, SESSIONS_UPDATED_EVENT, SESSIONS_UPDATED_STORAGE_KEY } from '@/lib/session-updates';\nimport Image from 'next/image';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\nimport agentProvidersDataRaw from '@/data/agent-providers.json';\n\ntype Model = {\n id: string;\n label: string;\n description?: string;\n};\n\ntype AgentProvider = {\n name: string;\n cli: string;\n description?: string;\n models: Model[];\n};\n\ntype SessionMode = 'fast' | 'plan';\ntype RepoCredentialSelection = 'auto' | string;\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 agentProvidersData = agentProvidersDataRaw as unknown as AgentProvider[];\nconst SESSION_MODE_STORAGE_KEY = 'viba:new-session-mode';\nconst AGENT_LOGIN_COMMANDS: Record<SupportedAgentCli, string> = {\n gemini: 'gemini',\n codex: 'codex',\n agent: 'agent',\n};\nconst AGENT_CLI_LABELS: Record<SupportedAgentCli, string> = {\n gemini: 'Gemini CLI',\n codex: 'Codex CLI',\n agent: 'Cursor Agent 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\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\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 [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 [selectedProvider, setSelectedProvider] = useState<AgentProvider | null>(null);\n const [selectedModel, setSelectedModel] = useState<string>('');\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 [title, setTitle] = 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 [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 = selectedProvider && selectedModel\n ? `Show Session Setup (${selectedProvider.name} / ${selectedModel})`\n : '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 toSupportedAgentCli = useCallback((value: string | null | undefined): SupportedAgentCli | null => {\n if (value === 'gemini' || value === 'codex' || value === 'agent') return value;\n return null;\n }, []);\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 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 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 provider/model\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 const provider = agentProvidersData.find(p => p.cli === context.agentProvider);\n if (provider) {\n setSelectedProvider(provider);\n if (context.model && (context.model === 'auto' || provider.models.some(m => m.id === context.model))) {\n setSelectedModel(context.model);\n } else {\n setSelectedModel('auto');\n }\n }\n\n setTitle(context.title || '');\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 savedProviderCli = settings.agentProvider;\n const savedModel = settings.agentModel;\n const savedStartupScript = settings.startupScript;\n const savedDevServerScript = settings.devServerScript;\n\n if (savedProviderCli) {\n const provider = agentProvidersData.find(p => p.cli === savedProviderCli);\n if (provider) {\n setSelectedProvider(provider);\n if (savedModel && (savedModel === 'auto' || provider.models.some(m => m.id === savedModel))) {\n setSelectedModel(savedModel);\n } else {\n setSelectedModel('auto');\n }\n } else {\n // Default if saved one is invalid\n setSelectedProvider(agentProvidersData[0]);\n setSelectedModel('auto');\n }\n } else {\n // Default\n setSelectedProvider(agentProvidersData[0]);\n setSelectedModel('auto');\n }\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 handleProviderChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const cli = e.target.value;\n const provider = agentProvidersData.find(p => p.cli === cli);\n if (provider && selectedRepo) {\n setSelectedProvider(provider);\n // Default to auto\n const defaultModel = 'auto';\n setSelectedModel(defaultModel);\n\n const newConfig = await updateRepoSettings(selectedRepo, {\n agentProvider: provider.cli,\n agentModel: defaultModel\n });\n setConfig(newConfig);\n }\n };\n\n const handleModelChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const model = e.target.value;\n setSelectedModel(model);\n if (selectedRepo) {\n const newConfig = await updateRepoSettings(selectedRepo, { agentModel: model });\n setConfig(newConfig);\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 setRepoForSettings(repo);\n setRepoCredentialSelection(resolveRepoCredentialSelection(repo));\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\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 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 ensureAgentCliReady = useCallback(async (): Promise<boolean> => {\n const agentCli = toSupportedAgentCli(selectedProvider?.cli);\n if (!agentCli) return true;\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 setLoginAgentCli(agentCli);\n setLoginCommand(AGENT_LOGIN_COMMANDS[agentCli]);\n setLoginCommandInjected(false);\n setLoginModalError(null);\n setIsLoginModalOpen(true);\n return false;\n }, [selectedProvider?.cli, toSupportedAgentCli]);\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\n const wtResult = await createSession(selectedRepo, baseBranch, {\n agent: selectedProvider?.cli || 'agent',\n model: selectedModel || '',\n title: title,\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: title || undefined,\n initialMessage: processedMessage || undefined,\n rawInitialMessage: trimmedInitialMessage || undefined,\n startupScript: startupScript || undefined,\n attachmentNames: allAttachmentNames,\n agentProvider: selectedProvider?.cli || 'agent',\n model: selectedModel || '',\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 = config?.recentRepos ?? [];\n const selectableRepos = selectedRepo\n ? (recentRepos.includes(selectedRepo) ? recentRepos : [selectedRepo, ...recentRepos])\n : recentRepos;\n\n return (\n <>\n {mode === 'home' && (\n <div className=\"card w-full max-w-4xl bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <Image src=\"/icon.png\" alt=\"Viba\" width={24} height={24} className=\"rounded-sm\" />\n Viba\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"btn btn-ghost btn-sm gap-2\"\n onClick={() => router.push('/credentials')}\n title=\"Manage GitHub/GitLab credentials\"\n >\n <KeyRound className=\"w-4 h-4\" />\n Credentials\n </button>\n <button\n className=\"btn btn-ghost btn-sm gap-2\"\n onClick={() => setIsSelectingRoot(true)}\n title={config?.defaultRoot ? `Default: ${config.defaultRoot}` : \"Set default browsing folder\"}\n >\n <FolderCog className=\"w-4 h-4\" />\n {config?.defaultRoot ? \"Change Default\" : \"Set Default Root\"}\n </button>\n <button className=\"btn btn-secondary btn-sm gap-2\" onClick={openCloneRemoteDialog}>\n <CloudDownload className=\"w-4 h-4\" /> Clone Remote Repo\n </button>\n <button className=\"btn btn-primary btn-sm gap-2\" onClick={() => setIsBrowsing(true)}>\n <Plus className=\"w-4 h-4\" /> Open Local Repo\n </button>\n </div>\n </h2>\n\n {error && <div className=\"alert alert-error text-sm py-2 px-3 mt-2\">{error}</div>}\n\n <div className=\"mt-4 space-y-4\">\n\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold opacity-70 uppercase tracking-wide\">Recent Repositories</h3>\n {!isLoaded ? (\n <div className=\"flex items-center justify-center py-8 bg-base-100 rounded-lg\">\n <span className=\"loading loading-spinner loading-md\"></span>\n </div>\n ) : (!config || config.recentRepos.length === 0) ? (\n <div className=\"text-center py-8 text-base-content/40 italic bg-base-100 rounded-lg\">\n No recent repositories found.\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {config.recentRepos.map(repo => {\n const credentialLabel = getRepoCredentialLabel(repo);\n const runningSessionCount = runningSessionCountByRepo.get(repo) ?? 0;\n\n return (\n <div\n key={repo}\n onClick={() => handleSelectRepo(repo)}\n className=\"flex items-center justify-between p-3 bg-base-100 hover:bg-base-300 rounded-md cursor-pointer group transition-all border border-base-300\"\n >\n <div className=\"flex items-center gap-3 overflow-hidden shrink min-w-0\">\n <FolderGit2 className=\"w-5 h-5 text-secondary shrink-0\" />\n <div className=\"flex flex-col overflow-hidden\">\n <span className=\"font-medium truncate\">{getBaseName(repo)}</span>\n <span className=\"text-xs opacity-50 truncate\">{repo}</span>\n <span className=\"text-[10px] opacity-60 mt-0.5\">\n Credential: {credentialLabel}\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {runningSessionCount > 0 && (\n <span\n className=\"badge badge-sm badge-secondary\"\n title={`${runningSessionCount} running session${runningSessionCount === 1 ? '' : 's'}`}\n >\n {runningSessionCount}\n </span>\n )}\n <button\n onClick={(e) => {\n void handleOpenRepoSettings(e, repo);\n }}\n className=\"btn btn-circle btn-ghost btn-xs opacity-0 group-hover:opacity-100\"\n title=\"Repository settings\"\n >\n <Settings className=\"w-3 h-3\" />\n </button>\n <button\n onClick={(e) => handleRemoveRecent(e, repo)}\n className=\"btn btn-circle btn-ghost btn-xs opacity-0 group-hover:opacity-100 text-error\"\n title=\"Remove from history\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n <ChevronRight className=\"w-4 h-4 opacity-30\" />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\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-base-content/60 p-4\">\n <div className=\"w-full max-w-xl 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\">Repository Settings</h3>\n <p className=\"text-sm opacity-75\">\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 uppercase tracking-wide opacity-70\">Repository</label>\n <div className=\"rounded-md border border-base-300 bg-base-200 px-3 py-2 font-mono text-xs break-all\">\n {repoForSettings}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs uppercase tracking-wide opacity-70\">Credential</label>\n <select\n className=\"select select-bordered w-full\"\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 opacity-60\">\n No credentials found. Add credentials from the Credentials page.\n </div>\n )}\n </div>\n\n {isLoadingCredentialOptions && (\n <div className=\"text-sm opacity-70 flex items-center gap-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {repoSettingsError && (\n <div className=\"alert alert-error text-sm py-2\">\n {repoSettingsError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-2\">\n <button\n className=\"btn btn-ghost\"\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-base-content/60 p-4\">\n <div className=\"w-full max-w-xl 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\">Clone Remote Repository</h3>\n <p className=\"text-sm opacity-75\">\n Clone into <span className=\"font-mono\">~/.viba/repos</span> and open it as the selected repository.\n </p>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs uppercase tracking-wide opacity-70\">Remote URL</label>\n <input\n className=\"input input-bordered w-full font-mono text-sm\"\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 uppercase tracking-wide opacity-70\">Credential</label>\n <select\n className=\"select select-bordered w-full\"\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 opacity-60\">\n No credentials found. Clone will use anonymous access unless remote auth is otherwise configured.\n </div>\n )}\n </div>\n\n {isLoadingCloneCredentialOptions && (\n <div className=\"text-sm opacity-70 flex items-center gap-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Loading credentials...\n </div>\n )}\n\n {isCloningRemote && (\n <div className=\"alert py-2 text-sm flex items-center gap-2\">\n <span className=\"loading loading-spinner loading-xs\"></span>\n Cloning repository...\n </div>\n )}\n\n {cloneRemoteError && (\n <div className=\"alert alert-error text-sm py-2\">\n {cloneRemoteError}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-2\">\n <button\n className=\"btn btn-ghost\"\n onClick={dismissCloneRemoteDialog}\n disabled={isCloningRemote}\n >\n Cancel\n </button>\n <button\n className=\"btn btn-primary\"\n onClick={() => void handleCloneRemoteRepo()}\n disabled={isCloningRemote || !remoteRepoUrl.trim() || isLoadingCloneCredentialOptions}\n >\n {isCloningRemote ? <span className=\"loading loading-spinner loading-xs\"></span> : null}\n Clone\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && selectedRepo && (\n <div className=\"w-full max-w-6xl space-y-4\">\n {error && <div className=\"alert alert-error text-sm py-2 px-3\">{error}</div>}\n <div className=\"flex flex-col gap-4 w-full\">\n <div className=\"card w-full bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n <FolderGit2 className=\"w-6 h-6 text-primary\" />\n Git Repository Selector\n </div>\n <button className=\"btn btn-sm btn-ghost\" onClick={() => router.push('/')}>\n Change Repo\n </button>\n </h2>\n\n <div className=\"mt-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"bg-base-100 p-4 rounded-lg border border-base-300 space-y-2\">\n <label className=\"text-xs opacity-50 uppercase tracking-widest\">Current Repository</label>\n <div className=\"join w-full\">\n <div className=\"join-item bg-base-300 flex items-center px-3 border border-base-content/20 border-r-0\">\n <FolderGit2 className=\"w-4 h-4 text-primary\" />\n </div>\n <select\n className=\"select select-bordered join-item w-full font-mono focus:outline-none\"\n value={selectedRepo}\n onChange={(e) => {\n void handleCurrentRepoChange(e);\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 </div>\n <div className=\"text-[10px] opacity-50 font-mono truncate px-1\" title={selectedRepo}>\n {selectedRepo}\n </div>\n </div>\n\n {/* Branch Selection */}\n <div className=\"bg-base-100 p-4 rounded-lg border border-base-300 space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium opacity-70 uppercase tracking-widest\">Current Branch</label>\n {loading && <span className=\"loading loading-spinner loading-xs\"></span>}\n </div>\n\n <div className=\"join w-full\">\n <div className=\"join-item bg-base-300 flex items-center px-3 border border-base-content/20 border-r-0\">\n <GitBranchIcon className=\"w-4 h-4\" />\n </div>\n <select\n className=\"select select-bordered join-item w-full font-mono focus:outline-none\"\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} {branch.current ? '(checked out)' : ''}\n </option>\n ))}\n </select>\n </div>\n <div className=\"text-[10px] opacity-50 px-1 italic\">\n Switching branches updates the working directory.\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Continue Existing Session Card */}\n {existingSessions.length > 0 && (\n <div className=\"card w-full bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex items-center gap-2\">\n <Play className=\"w-6 h-6 text-success\" />\n Continue Existing Session\n </h2>\n <div className=\"flex flex-col gap-2 mt-4 max-h-64 overflow-y-auto\">\n {existingSessions.map((session) => (\n <div key={session.sessionName} className=\"flex flex-col gap-2 p-3 bg-base-100 rounded-md border border-base-300\">\n <div className=\"flex justify-between items-start\">\n <div>\n {session.title && <div className=\"font-semibold\">{session.title}</div>}\n <div className=\"text-xs opacity-60 font-mono\">{session.sessionName}</div>\n <div className=\"text-xs opacity-60 mt-1\">\n Agent: {session.agent} • Model: {session.model}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"btn btn-sm btn-success btn-outline gap-2\"\n onClick={() => handleResumeSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <ExternalLink className=\"w-3 h-3\" /> Open\n </button>\n <button\n className=\"btn btn-sm btn-secondary btn-outline gap-2\"\n onClick={() => handleNewAttemptFromSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n title=\"Start a new attempt prefilled from this session\"\n >\n <Plus className=\"w-3 h-3\" /> New Attempt\n </button>\n <button\n className=\"btn btn-sm btn-error btn-outline gap-2\"\n onClick={() => handleDeleteSession(session)}\n disabled={loading || deletingSessionName === session.sessionName}\n >\n <Trash2 className=\"w-3 h-3\" />\n {deletingSessionName === session.sessionName ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Start New Session Card */}\n <div className=\"card w-full bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n <h2 className=\"card-title flex items-center gap-2\">\n <Bot className=\"w-6 h-6 text-secondary\" />\n Start New Session\n </h2>\n\n <div className=\"mt-4 space-y-6\">\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-sm px-2 h-auto min-h-0 normal-case justify-start gap-2\"\n onClick={() => setShowSessionAdvanced(prev => !prev)}\n >\n <ChevronRight className={`w-4 h-4 transition-transform ${showSessionAdvanced ? 'rotate-90' : ''}`} />\n {showSessionAdvanced ? 'Hide Session Setup' : collapsedSessionSetupLabel}\n </button>\n\n {showSessionAdvanced && (\n <>\n {/* Agent Selection */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Agent Provider</label>\n <div className=\"join w-full\">\n <div className=\"join-item bg-base-300 flex items-center px-3 border border-base-content/20 border-r-0\">\n <Bot className=\"w-4 h-4\" />\n </div>\n <select\n className=\"select select-bordered join-item w-full focus:outline-none\"\n value={selectedProvider?.cli || ''}\n onChange={handleProviderChange}\n disabled={loading}\n >\n {agentProvidersData.map(provider => (\n <option key={provider.cli} value={provider.cli}>\n {provider.name}\n </option>\n ))}\n </select>\n </div>\n {selectedProvider?.description && (\n <p className=\"text-[10px] opacity-60 mt-1 pl-1 italic leading-tight\">\n {selectedProvider.description}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Model</label>\n <div className=\"join w-full\">\n <div className=\"join-item bg-base-300 flex items-center px-3 border border-base-content/20 border-r-0\">\n <Cpu className=\"w-4 h-4\" />\n </div>\n <select\n className=\"select select-bordered join-item w-full focus:outline-none\"\n value={selectedModel}\n onChange={handleModelChange}\n disabled={loading || !selectedProvider}\n >\n <option value=\"auto\">Auto</option>\n {selectedProvider?.models.map(model => (\n <option key={model.id} value={model.id}>\n {model.label}\n </option>\n ))}\n </select>\n </div>\n {selectedProvider?.models.find(m => m.id === selectedModel)?.description && (\n <p className=\"text-[10px] opacity-60 mt-1 pl-1 italic leading-tight\">\n {selectedProvider.models.find(m => m.id === selectedModel)?.description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Start up script (Optional)</label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono text-sm\"\n placeholder=\"npm i\"\n value={startupScript}\n onChange={handleStartupScriptChange}\n onBlur={saveStartupScript}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n <div className=\"text-xs opacity-50 px-1\">\n Script to run in the terminal agent iframe upon startup.\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Dev server script (Optional)</label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono text-sm\"\n placeholder=\"npm run dev\"\n value={devServerScript}\n onChange={handleDevServerScriptChange}\n onBlur={saveDevServerScript}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n <div className=\"text-xs opacity-50 px-1\">\n Script for the Session View Start Dev Server button in the right terminal.\n </div>\n </div>\n </>\n )}\n </div>\n\n <div className=\"divider\"></div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Session Mode</label>\n <select\n className=\"select select-bordered w-full focus:outline-none\"\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 <div className=\"text-xs opacity-50 px-1\">\n {sessionMode === 'plan'\n ? 'Plan mode asks the agent to study the repo, propose a plan, and wait for your approval before implementation.'\n : 'Fast mode starts the agent with current behavior.'}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Title (Optional)</label>\n <input\n type=\"text\"\n className=\"input input-bordered w-full font-mono text-sm\"\n placeholder=\"Task Title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault();\n handleStartSession();\n }\n }}\n disabled={loading}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Initial Message (Optional)</label>\n <div className=\"relative\">\n <textarea\n className=\"textarea textarea-bordered w-full h-64 font-mono text-sm leading-tight resize-none\"\n placeholder=\"Describe what you want the agent to do... Type @ to mention files.\"\n value={initialMessage}\n onChange={handleMessageChange}\n onKeyDown={handleKeyDown}\n onClick={(e) => {\n setCursorPosition(e.currentTarget.selectionStart);\n setShowSuggestions(false); // Hide on click? Or re-val?\n }}\n onKeyUp={(e) => setCursorPosition(e.currentTarget.selectionStart)}\n disabled={loading}\n ></textarea>\n {showSuggestions && suggestionList.length > 0 && (\n <div className=\"absolute left-0 right-0 z-50 mt-1 max-h-48 overflow-y-auto bg-base-100 border border-base-300 rounded-md shadow-lg\">\n {suggestionList.map((s, idx) => (\n <button\n key={s}\n className={`w-full text-left px-3 py-2 text-xs border-b border-base-200 last:border-0 truncate ${idx === selectedIndex ? 'bg-primary text-primary-content' : 'hover:bg-primary/10'\n }`}\n onMouseDown={(e) => {\n e.preventDefault(); // Prevent blur\n handleSelectSuggestion(s);\n }}\n >\n {s}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium opacity-70\">Attachments (Optional)</label>\n <input\n type=\"file\"\n multiple\n className=\"file-input file-input-bordered w-full\"\n onChange={handleFileSelect}\n disabled={loading}\n />\n <div className=\"text-xs opacity-50 px-1\">\n Paste files from clipboard with Cmd/Ctrl+V anywhere on this page.\n </div>\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {attachments.map((file, idx) => (\n <span key={`upload-${idx}`} className=\"badge badge-neutral gap-2 p-3\">\n {file.name}\n <button onClick={() => removeAttachment(idx)} className=\"btn btn-ghost btn-xs btn-circle text-error\">\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n {prefilledAttachmentNames.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {prefilledAttachmentNames.map((name, idx) => (\n <span key={`prefill-${name}-${idx}`} className=\"badge badge-secondary gap-2 p-3\">\n {name}\n <button\n onClick={() => removePrefilledAttachment(idx)}\n className=\"btn btn-ghost btn-xs btn-circle text-error\"\n title=\"Remove carried attachment\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"card-actions justify-end mt-4\">\n <button\n className=\"btn btn-primary btn-wide shadow-lg\"\n onClick={handleStartSession}\n disabled={loading}\n >\n {loading ? <span className=\"loading loading-spinner\"></span> : \"Start Session\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {mode === 'new' && !selectedRepo && (\n <div className=\"card w-full max-w-2xl bg-base-200 shadow-xl\">\n <div className=\"card-body\">\n {error && <div className=\"alert alert-error text-sm py-2 px-3\">{error}</div>}\n <h2 className=\"card-title\">Select a Repository</h2>\n <p className=\"opacity-70 text-sm\">Choose a repository first, then start or resume a session.</p>\n <div className=\"card-actions justify-end mt-4\">\n <button className=\"btn btn-primary\" onClick={() => router.push('/')}>\n Go to Home\n </button>\n </div>\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__ [{\"40e86f65dddc3e4892a55bce7304157ebe1ac298d9\":\"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(\"40e86f65dddc3e4892a55bce7304157ebe1ac298d9\",callServer,void 0,findSourceMapURL,\"checkDirectoryAccessible\");export{$$RSC_SERVER_ACTION_3 as checkDirectoryAccessible};","/* __next_internal_action_entry_do_not_use__ [{\"40b2586fc78398531dbe936975765befa293dfc724\":\"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(\"40b2586fc78398531dbe936975765befa293dfc724\",callServer,void 0,findSourceMapURL,\"checkAgentCliInstalled\");export{$$RSC_SERVER_ACTION_7 as checkAgentCliInstalled};","/* __next_internal_action_entry_do_not_use__ [{\"408d0a7a715dd00211611eafe71c0bd64c256c7d0d\":\"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(\"408d0a7a715dd00211611eafe71c0bd64c256c7d0d\",callServer,void 0,findSourceMapURL,\"installAgentCli\");export{$$RSC_SERVER_ACTION_8 as installAgentCli};","/* __next_internal_action_entry_do_not_use__ [{\"605c2869ff7584c223302da590d721c1edb79926cd\":\"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(\"605c2869ff7584c223302da590d721c1edb79926cd\",callServer,void 0,findSourceMapURL,\"cloneRemoteRepository\");export{$$RSC_SERVER_ACTION_1 as cloneRemoteRepository};","/* __next_internal_action_entry_do_not_use__ [{\"402785bac6d7a4ec171604f890489f74aa43e7c664\":\"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(\"402785bac6d7a4ec171604f890489f74aa43e7c664\",callServer,void 0,findSourceMapURL,\"resolveRepositoryByName\");export{$$RSC_SERVER_ACTION_0 as resolveRepositoryByName};","/* __next_internal_action_entry_do_not_use__ [{\"70e7c32ce12f69479fc1538c2ab2717fd71fd9a046\":\"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(\"70e7c32ce12f69479fc1538c2ab2717fd71fd9a046\",callServer,void 0,findSourceMapURL,\"copySessionAttachments\");export{$$RSC_SERVER_ACTION_5 as copySessionAttachments};","/* __next_internal_action_entry_do_not_use__ [{\"704c6db357061b7c99acb44a58eda1bf6d4c865893\":\"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(\"704c6db357061b7c99acb44a58eda1bf6d4c865893\",callServer,void 0,findSourceMapURL,\"createSession\");export{$$RSC_SERVER_ACTION_8 as createSession};","/* __next_internal_action_entry_do_not_use__ [{\"4074be8f086727129c5a1284fac149576065894991\":\"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(\"4074be8f086727129c5a1284fac149576065894991\",callServer,void 0,findSourceMapURL,\"deleteSession\");export{$$RSC_SERVER_ACTION_10 as deleteSession};","/* __next_internal_action_entry_do_not_use__ [{\"40a8fbf268edeeab3bb0b8c6d56461c83f24384eb5\":\"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(\"40a8fbf268edeeab3bb0b8c6d56461c83f24384eb5\",callServer,void 0,findSourceMapURL,\"getSessionPrefillContext\");export{$$RSC_SERVER_ACTION_4 as getSessionPrefillContext};","/* __next_internal_action_entry_do_not_use__ [{\"40b0d902b232cda8947813ec2182844c0be8fbe1c9\":\"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(\"40b0d902b232cda8947813ec2182844c0be8fbe1c9\",callServer,void 0,findSourceMapURL,\"listSessions\");export{$$RSC_SERVER_ACTION_7 as listSessions};","/* __next_internal_action_entry_do_not_use__ [{\"600c4c4f9bb1a5ab32de387bdbd9d9718fe5ffe1ca\":\"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(\"600c4c4f9bb1a5ab32de387bdbd9d9718fe5ffe1ca\",callServer,void 0,findSourceMapURL,\"saveSessionLaunchContext\");export{$$RSC_SERVER_ACTION_2 as saveSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"602a22c8f189f56968fc888dd45d1b76fe46a65ed1\":\"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(\"602a22c8f189f56968fc888dd45d1b76fe46a65ed1\",callServer,void 0,findSourceMapURL,\"updateRepoSettings\");export{$$RSC_SERVER_ACTION_3 as updateRepoSettings};","/* __next_internal_action_entry_do_not_use__ [{\"7f825383c336ac9922840528e36687b255cb8ad82e\":\"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(\"7f825383c336ac9922840528e36687b255cb8ad82e\",callServer,void 0,findSourceMapURL,\"listRepoFiles\");export{$$RSC_SERVER_ACTION_18 as listRepoFiles};","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/chevron-right\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 ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\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  - 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 ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/x\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 X = createLucideIcon('x', __iconNode);\n\nexport default X;\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  - 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: 'M12 20v2', key: '1lh1kg' }],\n ['path', { d: 'M12 2v2', key: 'tus03m' }],\n ['path', { d: 'M17 20v2', key: '1rnc9c' }],\n ['path', { d: 'M17 2v2', key: '11trls' }],\n ['path', { d: 'M2 12h2', key: '1t8f8n' }],\n ['path', { d: 'M2 17h2', key: '7oei6x' }],\n ['path', { d: 'M2 7h2', key: 'asdhe0' }],\n ['path', { d: 'M20 12h2', key: '1q8mjw' }],\n ['path', { d: 'M20 17h2', key: '1fpfkl' }],\n ['path', { d: 'M20 7h2', key: '1o8tra' }],\n ['path', { d: 'M7 20v2', key: '4gnj0m' }],\n ['path', { d: 'M7 2v2', key: '1i4yhu' }],\n ['rect', { x: '4', y: '4', width: '16', height: '16', rx: '2', key: '1vbyd7' }],\n ['rect', { x: '8', y: '8', width: '8', height: '8', rx: '1', key: 'z9xiuo' }],\n];\n\n/**\n * @component @name Cpu\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/cpu\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 Cpu = createLucideIcon('cpu', __iconNode);\n\nexport default Cpu;\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  - 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 [\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  - 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: '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  - 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 ['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  - 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"],"names":[],"mappings":"wDOEA,EAAA,EAAA,CAAA,CAAA,sHsBMS,CJAN,AEAG,AHAH,AIAG,ACAG,oHACE,CJCR,CAAA,CAAA,CAAA,CAAA,CAAA,OIEU,CAAA,AAAE,GAAI,CJAH,AEAA,AEAG,CJAH,AEAA,AEAG,CFAH,AEAG,AJAH,CAAA,AIAG,AFAH,CAAA,AFAA,cIA2B,IAAK,UAAU,YAC3C,GAAA,mBAA4B,IAAA,atBV3C,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,gCgBgBgC,kDAdhB,CEAA,ADAH,AEAG,AHAA,CGAA,AHAA,ACAH,ACAG,CCAA,AFAH,ADAG,AEAA,4DJWuC,QAbT,CAAA,ACAA,gCDAsC,GM8B9E,EAAA,CAAA,EAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,UAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,6KAtBF,CACvD,sCAA0C,CAAA,CEAD,AFAC,CAAA,AEAD,CFAM,CAAA,AEAD,CAAA,AFAC,CEAD,AFAC,CAAA,AEAD,CAAA,AFAC,CEAD,AFAC,CAAA,AEAD,GFAW,2CACV,CAAA,ACYH,CDZG,ACYH,CAAA,ADZG,CCYH,ADZG,CAAA,ACYH,CDZG,ACYH,CAAU,ACZR,AFAC,GAAU,SAChD,CFAA,AEAA,AAAE,EAAG,CFAA,AEAA,CFAA,AEAA,CFAA,AEAA,CAAA,AFAA,CAAA,AEAA,CFAA,AEAA,CFAA,AEAA,CFAA,AEAA,CAAA,AFAA,CEAA,AFAA,gBEA2B,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,EACvD,CFAA,AEAA,AEYH,CJZG,AEAA,AEYH,KFZW,CAAA,AFAA,4BEAgC,CAAA,AEYP,CAAA,AFZO,CEYP,AFZO,CEYP,AFZO,AAAK,CEYZ,AFZY,CEYZ,AFZY,CAAA,OAAU,CEYN,CAAA,CAAU,CAAA,kCFXnB,CAAA,AFAD,CEAC,AFAD,CEAC,AFAD,CAAA,AEAC,AAAK,CAAA,UAC9C,CAAC,CFAA,AEAA,CAAA,AFAA,CAAA,AEAA,CFAA,AEAA,CAAA,AFAA,CAAA,AEAA,CFAA,AEAA,AAAQ,CFAA,AEAA,4BAAgC,CAAA,AFAF,GEAO,YAC7C,CAAA,CAAA,CAAA,CAAA,GAAQ,CAAA,AAAE,EAAG,CAAA,CAAA,CAAA,CAAA,CAAA,oBAA0B,CAAA,CAAA,CAAA,CAAA,AAAK,QAAA,EAAU,EACtD,CFYH,AEZG,CFYH,AEZG,WAAgB,CFYP,CAAA,CAAA,CEZO,AFYP,CAAA,AEZO,QAAgB,EAAA,QAAa,QAAA,CAAU,CAAA,CAC1D,EHGM,CCZH,AEAA,ACAA,CAAA,ADAA,AFAA,ADYS,CGZT,ACAA,AHAA,ADYG,AAAM,CIZT,ADAA,AFAA,ADYG,CAAM,EAAA,OAAA,EAAA,OAAwB,CAAA,AGZpB,AFAiB,AGAE,oDJNf,CAAA,ACAJ,ACAA,AHAA,CGAA,AFAI,ACAJ,AFAA,CCAI,ACAJ,ACAA,AHAA,CAAA,AEAA,ACAA,CAAA,ADAA,AFAA,OCAkB,OAAS,IAAK,EAAG,CAAA,CAAA,CAAA,CAAK,AAAL,CAAK,CAAA,CAAA,AAAI,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAK,AAAL,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,sBACrD,IAAA,0GAGA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,CCAA,ADAA,AAAK,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CAAA,ADAA,CCAA,ADAA,CAAA,ACAA,CDAA,ACAA,IDChC,OCqBY,EAAA,OAAA,EAAA,sGAzBgB,CDAD,AEAX,ADAY,CCAZ,AFAW,ACAC,CDAD,AEAX,ADAY,CAAK,CCAjB,AFAgB,ACAC,CDAD,ACAC,ACAjB,CDAiB,ACAjB,AFAgB,CAAA,ACAC,ACAjB,CDAiB,ACAjB,AFAgB,CAAA,ACAC,ACAjB,CDAiB,ACAjB,eDCA,CFYN,AIZD,ACAA,AJAO,ACAA,CAAA,ADAA,AGAP,AJYC,AKZD,CAAA,AHAO,AEAP,AJYC,ACZM,CIAP,AHAO,ADAA,AGAP,AJYC,CIZD,AHAO,ACAA,AFYN,AKZD,CLYC,AEZM,AGAP,AJAO,AGAP,CHAO,AIAP,AH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","ignoreList":[21,22,23,24,25,26,27,28,29]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/GitRepoSelector.tsx","../../../../src/app/actions/data%3A468b8c%20%3Ctext/javascript%3E","../../../../src/components/FileBrowser.tsx","../../../../src/app/actions/data%3A5fa9a0%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A343bf4%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A8d9c5d%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A616ed3%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A475e28%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af7d527%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A722734%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A975e32%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A6afc4a%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A5885f5%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aef2577%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A501ccd%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A773db1%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A9f6ab3%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac04dc1%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A5b9140%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A63a917%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Acc53a4%20%3Ctext/javascript%3E","../../../../src/lib/repo-card-gradient.ts","../../../../node_modules/lucide-react/src/icons/check.ts","../../../../node_modules/lucide-react/src/icons/folder-cog.ts","../../../../node_modules/lucide-react/src/icons/folder-git-2.ts","../../../../node_modules/lucide-react/src/icons/search.ts","../../../../node_modules/lucide-react/src/icons/bot.ts","../../../../node_modules/lucide-react/src/icons/cloud-download.ts","../../../../node_modules/lucide-react/src/icons/x.ts","../../../../node_modules/lucide-react/src/icons/settings.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 } 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;\nconst DEFAULT_REPO_STARTUP_COMMAND = 'npm install';\nconst DEFAULT_REPO_DEV_SERVER_COMMAND = 'npm run dev';\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\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 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\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)]\">\n <header className=\"relative z-10 flex flex-col gap-4 border-b border-slate-200/80 px-4 py-4 md:flex-row md:items-center md:justify-between md:px-7\">\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\">\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\">Viba</h2>\n <p className=\"text-xs text-slate-500\">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 md:w-72\">\n <Search className=\"h-4 w-4 text-slate-400\" />\n <input\n type=\"text\"\n className=\"grow text-sm\"\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\"\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 </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\">\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\">\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\">\n <p className=\"text-sm text-slate-500\">\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)]\"\n style={cardGradient}\n >\n <div className=\"absolute inset-0 bg-white/40\" />\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\">\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\"\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\"\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\">\n {getBaseName(repo)}\n </h3>\n <p className=\"truncate font-mono text-xs text-slate-600\">{repo}</p>\n <p className=\"truncate text-[11px] font-medium text-slate-500\">\n Credential: {credentialLabel}\n </p>\n </div>\n\n <div className=\"flex items-center justify-between text-sm font-semibold text-slate-700\">\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\"\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\">\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\">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\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/70 px-5 py-4 md:px-6\">\n <h3 className=\"text-lg font-bold text-slate-900\">Repository Settings</h3>\n <button\n className=\"btn btn-circle btn-ghost btn-sm text-slate-500\"\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\">\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\">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\">\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\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-slate-50 text-slate-700 focus:border-primary focus:outline-none\"\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\">\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\">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\"\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\">\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\">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\"\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\">\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\">\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\">\n <button\n className=\"btn btn-ghost text-slate-700\"\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\">\n <div className=\"flex items-center justify-between border-b border-slate-100 bg-slate-50/60 px-5 py-4 md:px-6\">\n <div>\n <h3 className=\"text-lg font-bold text-slate-900\">Add New Repository</h3>\n <p className=\"text-sm text-slate-500\">Connect a local folder or clone from URL</p>\n </div>\n <button className=\"btn btn-circle btn-ghost btn-sm text-slate-500\" 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\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500\">Browse Local</h4>\n <p className=\"text-sm text-slate-600\">\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\">\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\"\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\">\n <h4 className=\"text-sm font-semibold uppercase tracking-wide text-slate-500\">Clone Remote</h4>\n <p className=\"text-sm text-slate-600\">\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\">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\"\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\">Credential</label>\n <select\n className=\"select w-full border-slate-200 bg-white text-slate-700 focus:border-primary focus:outline-none\"\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\">\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\">\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\">\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\">\n <button\n className=\"btn btn-ghost text-slate-700\"\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 && <div className=\"mb-4 rounded-xl border border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700\">{error}</div>}\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\"\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\">Assign New Task</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base\">\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\">\n <h3 className=\"mb-5 flex items-center gap-2 text-lg font-bold text-slate-900\">\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\">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\"\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\" />\n </div>\n <span className=\"truncate font-mono text-[11px] text-slate-500\" 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\">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\"\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\" />}\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\"\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\">\n <label className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-slate-500\">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\"\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\">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\"\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\">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\"\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\">\n <h3 className=\"mb-4 text-lg font-bold text-slate-900\">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\">\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\"\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\">{session.title || session.sessionName}</p>\n <p className=\"truncate text-xs text-slate-500\">\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\"\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\"\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\"\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\">\n <label className=\"mb-4 flex items-center gap-2 text-lg font-bold text-slate-900\" 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\"\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\">\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 ? 'bg-primary text-white' : 'text-slate-700 hover:bg-slate-50'\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\">\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\">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\">\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\">\n <span className=\"px-2 text-center text-[11px] font-medium text-slate-700\">{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\"\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\">{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\">\n <span className=\"px-2 text-center text-[11px] font-medium text-slate-700\">\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\"\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\">{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\"\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\">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\">\n <span className=\"mr-auto hidden text-xs text-slate-400 sm:block\">\n Press <kbd className=\"rounded border border-slate-200 bg-slate-100 px-2 py-1 font-sans text-[11px]\">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\">\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\">Loading repository...</h2>\n <p className=\"text-sm text-slate-500\">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__ [{\"40c55bf7b4d0c0d00a28f84c0e869db369112068ef\":\"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(\"40c55bf7b4d0c0d00a28f84c0e869db369112068ef\",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 "Select Current Folder" to choose it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"403487cb68411809c7176236043abff671bfc73293\":\"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(\"403487cb68411809c7176236043abff671bfc73293\",callServer,void 0,findSourceMapURL,\"checkIsGitRepo\");export{$$RSC_SERVER_ACTION_6 as checkIsGitRepo};","/* __next_internal_action_entry_do_not_use__ [{\"408afca08d03d654fa0c08ac92b70df0f08fa3e602\":\"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(\"408afca08d03d654fa0c08ac92b70df0f08fa3e602\",callServer,void 0,findSourceMapURL,\"getBranches\");export{$$RSC_SERVER_ACTION_4 as getBranches};","/* __next_internal_action_entry_do_not_use__ [{\"60b0f9a4bc37887d785acdbada3f4fef6c52f2d2e0\":\"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(\"60b0f9a4bc37887d785acdbada3f4fef6c52f2d2e0\",callServer,void 0,findSourceMapURL,\"checkoutBranch\");export{$$RSC_SERVER_ACTION_5 as checkoutBranch};","/* __next_internal_action_entry_do_not_use__ [{\"7ff12f43b8493f24eed19a88ff4aa38922f9380b36\":\"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(\"7ff12f43b8493f24eed19a88ff4aa38922f9380b36\",callServer,void 0,findSourceMapURL,\"getStartupScript\");export{$$RSC_SERVER_ACTION_16 as getStartupScript};","/* __next_internal_action_entry_do_not_use__ [{\"403a91cd6c4dd299e377991b05c24b694c35d631ad\":\"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(\"403a91cd6c4dd299e377991b05c24b694c35d631ad\",callServer,void 0,findSourceMapURL,\"checkDirectoryAccessible\");export{$$RSC_SERVER_ACTION_3 as checkDirectoryAccessible};","/* __next_internal_action_entry_do_not_use__ [{\"7fd7c9ea27398f8984956bdcfffb9ece83f53cb3db\":\"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(\"7fd7c9ea27398f8984956bdcfffb9ece83f53cb3db\",callServer,void 0,findSourceMapURL,\"listRepoFiles\");export{$$RSC_SERVER_ACTION_18 as listRepoFiles};","/* __next_internal_action_entry_do_not_use__ [{\"40a83f00a7f1a7b02e09d6f15f1f2c7a04615598ec\":\"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(\"40a83f00a7f1a7b02e09d6f15f1f2c7a04615598ec\",callServer,void 0,findSourceMapURL,\"checkAgentCliInstalled\");export{$$RSC_SERVER_ACTION_7 as checkAgentCliInstalled};","/* __next_internal_action_entry_do_not_use__ [{\"4041de2f7bb6af0b56369f9e323be73c4673e9c3e7\":\"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(\"4041de2f7bb6af0b56369f9e323be73c4673e9c3e7\",callServer,void 0,findSourceMapURL,\"installAgentCli\");export{$$RSC_SERVER_ACTION_8 as installAgentCli};","/* __next_internal_action_entry_do_not_use__ [{\"60ed8bc1a64ceeb92bff88ce0981ea6bf083f76392\":\"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(\"60ed8bc1a64ceeb92bff88ce0981ea6bf083f76392\",callServer,void 0,findSourceMapURL,\"cloneRemoteRepository\");export{$$RSC_SERVER_ACTION_1 as cloneRemoteRepository};","/* __next_internal_action_entry_do_not_use__ [{\"4049a5b2db629077fb7339be6f394f57adad5908a5\":\"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(\"4049a5b2db629077fb7339be6f394f57adad5908a5\",callServer,void 0,findSourceMapURL,\"resolveRepositoryByName\");export{$$RSC_SERVER_ACTION_0 as resolveRepositoryByName};","/* __next_internal_action_entry_do_not_use__ [{\"7071e732bce3733c50a450da5855fba4917a4dd643\":\"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(\"7071e732bce3733c50a450da5855fba4917a4dd643\",callServer,void 0,findSourceMapURL,\"copySessionAttachments\");export{$$RSC_SERVER_ACTION_5 as copySessionAttachments};","/* __next_internal_action_entry_do_not_use__ [{\"7066dd9be576a5164d05bc682d076f394ace4fd616\":\"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(\"7066dd9be576a5164d05bc682d076f394ace4fd616\",callServer,void 0,findSourceMapURL,\"createSession\");export{$$RSC_SERVER_ACTION_8 as createSession};","/* __next_internal_action_entry_do_not_use__ [{\"40b74648865c3f96a89f2120707ee6d90b41f44fb6\":\"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(\"40b74648865c3f96a89f2120707ee6d90b41f44fb6\",callServer,void 0,findSourceMapURL,\"deleteSession\");export{$$RSC_SERVER_ACTION_10 as deleteSession};","/* __next_internal_action_entry_do_not_use__ [{\"40aaed6b3cf41086823030eea94f06c1bb60d4d68b\":\"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(\"40aaed6b3cf41086823030eea94f06c1bb60d4d68b\",callServer,void 0,findSourceMapURL,\"getSessionPrefillContext\");export{$$RSC_SERVER_ACTION_4 as getSessionPrefillContext};","/* __next_internal_action_entry_do_not_use__ [{\"407a7efc36c0bc482ceba47501668efd9d3a54aa5d\":\"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(\"407a7efc36c0bc482ceba47501668efd9d3a54aa5d\",callServer,void 0,findSourceMapURL,\"listSessions\");export{$$RSC_SERVER_ACTION_7 as listSessions};","/* __next_internal_action_entry_do_not_use__ [{\"60b016bcf07bca25b0f2375839c271c241748f3068\":\"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(\"60b016bcf07bca25b0f2375839c271c241748f3068\",callServer,void 0,findSourceMapURL,\"saveSessionLaunchContext\");export{$$RSC_SERVER_ACTION_2 as saveSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"60a021ad5d6b8db3ea7848f99beee1a6f598eb03b4\":\"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(\"60a021ad5d6b8db3ea7848f99beee1a6f598eb03b4\",callServer,void 0,findSourceMapURL,\"updateRepoSettings\");export{$$RSC_SERVER_ACTION_3 as updateRepoSettings};","/* __next_internal_action_entry_do_not_use__ [{\"7f3b95a6dd4be9498014339de58b9213722569b211\":\"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(\"7f3b95a6dd4be9498014339de58b9213722569b211\",callServer,void 0,findSourceMapURL,\"getDefaultDevServerScript\");export{$$RSC_SERVER_ACTION_17 as getDefaultDevServerScript};","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  - 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 [\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  - 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 ['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  - 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 ['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  - 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 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  - 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: '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  - 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 ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/x\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 X = createLucideIcon('x', __iconNode);\n\nexport default X;\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  - 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"],"names":[],"mappings":"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","ignoreList":[22,23,24,25,26,27,28,29]}
|