viba-cli 0.20.0 → 0.21.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 +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -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 +2 -2
- package/.next/server/app/credentials/page/server-reference-manifest.json +4 -4
- 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 +3 -3
- package/.next/server/app/credentials.segments/_full.segment.rsc +3 -3
- package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
- package/.next/server/app/credentials.segments/_index.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -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 +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/new/page/server-reference-manifest.json +24 -24
- 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 +24 -24
- 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 +20 -20
- 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]__213d5b40._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__213d5b40._.js.map +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__19e7a335._.js → [root-of-the-server]__284fa850._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__19e7a335._.js.map → [root-of-the-server]__284fa850._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__319c1c59._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__319c1c59._.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]__3e7d3e82._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3e7d3e82._.js.map +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__d1c396bd._.js → [root-of-the-server]__7f8cd2b9._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__d1c396bd._.js.map → [root-of-the-server]__7f8cd2b9._.js.map} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__aaa8331e._.js → [root-of-the-server]__8169dd30._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__aaa8331e._.js.map → [root-of-the-server]__8169dd30._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__8d9179ea._.js → [root-of-the-server]__d5706047._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__8d9179ea._.js.map → [root-of-the-server]__d5706047._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ee9c5185._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ee9c5185._.js.map +1 -1
- 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 +2 -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 +43 -43
- package/.next/static/chunks/{3ccb056bb06defd9.css → 16f42a25676d2900.css} +1 -1
- package/.next/static/chunks/{f35117597a7f8c55.js → 1891e07f938de79e.js} +3 -3
- package/.next/static/chunks/{b339bfc478db32f4.js → 32cdf7e667231c75.js} +1 -1
- package/.next/static/chunks/{7e42eeb363fd0ae8.js → 5f3a2db85aacc485.js} +2 -2
- package/.next/static/chunks/{587481523dbb97d8.js → b453010d797f0f5c.js} +1 -1
- package/.next/static/chunks/{7b10f23fe44897a4.js → c76f31165986fed7.js} +1 -1
- package/.next/static/chunks/d8a68fb48b3718f5.js +3 -0
- package/package.json +1 -1
- package/.next/static/chunks/dbd09e43a88f6329.js +0 -3
- /package/.next/static/{QjoGa8b72BlAV1S6GEJq2 → a3AUzSUWZmXcIvA31ymCS}/_buildManifest.js +0 -0
- /package/.next/static/{QjoGa8b72BlAV1S6GEJq2 → a3AUzSUWZmXcIvA31ymCS}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{QjoGa8b72BlAV1S6GEJq2 → a3AUzSUWZmXcIvA31ymCS}/_ssgManifest.js +0 -0
package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/actions/data%3A9aef8b%20%3Ctext/javascript%3E","../../../../src/app/session/%5BsessionId%5D/SessionPageClient.tsx","../../../../src/app/actions/data%3A354a34%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A57a6fd%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A300137%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af19193%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af25037%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A532901%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af223d9%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Af63dfe%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A9f1f0f%20%3Ctext/javascript%3E","../../../../src/components/SessionFileBrowser.tsx","../../../../src/app/actions/data%3A4890bd%20%3Ctext/javascript%3E","../../../../src/components/SessionView.tsx","../../../../src/app/actions/data%3Af28023%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aeac2d8%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A408e8c%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A8e8116%20%3Ctext/javascript%3E","../../../../src/lib/url.ts","../../../../src/lib/shell.ts","../../../../node_modules/lucide-react/src/icons/chevron-down.ts","../../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../../src/lib/terminal-session.ts","../../../../node_modules/lucide-react/src/icons/grip.ts","../../../../node_modules/lucide-react/src/icons/grid-2x2.ts","../../../../node_modules/lucide-react/src/icons/arrow-up.ts","../../../../node_modules/lucide-react/src/icons/clipboard.ts","../../../../node_modules/lucide-react/src/icons/git-pull-request-arrow.ts","../../../../node_modules/lucide-react/src/icons/pin.ts","../../../../node_modules/lucide-react/src/icons/globe.ts","../../../../node_modules/lucide-react/src/icons/house.ts","../../../../node_modules/lucide-react/src/icons/git-commit-horizontal.ts","../../../../node_modules/lucide-react/src/icons/arrow-right.ts","../../../../node_modules/lucide-react/src/icons/rotate-cw.ts","../../../../node_modules/lucide-react/src/icons/git-merge.ts","../../../../node_modules/lucide-react/src/icons/arrow-down.ts","../../../../node_modules/lucide-react/src/icons/list.ts","../../../../node_modules/lucide-react/src/icons/pin-off.ts","../../../../node_modules/lucide-react/src/icons/folder-open.ts","../../../../node_modules/lucide-react/src/icons/file-text.ts","../../../../node_modules/lucide-react/src/icons/mouse-pointer-2.ts","../../../../src/hooks/useTerminalLink.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40b49b5ec80f61621ba717feeed95d2290e1608377\":\"getSessionDivergence\"},\"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_15=/*#__PURE__*/createServerReference(\"40b49b5ec80f61621ba717feeed95d2290e1608377\",callServer,void 0,findSourceMapURL,\"getSessionDivergence\");export{$$RSC_SERVER_ACTION_15 as getSessionDivergence};","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useRouter, useParams } from 'next/navigation';\nimport { SessionView } from '@/components/SessionView';\nimport { consumeSessionLaunchContext, getSessionMetadata, SessionMetadata, markSessionInitialized } from '@/app/actions/session';\nimport { getSessionTerminalSources, startTtydProcess } from '@/app/actions/git';\n\nexport default function SessionPage() {\n const params = useParams<{ sessionId: string }>();\n const sessionIdParam = params.sessionId;\n const sessionId = Array.isArray(sessionIdParam) ? sessionIdParam[0] : sessionIdParam;\n const router = useRouter();\n\n const [metadata, setMetadata] = useState<SessionMetadata | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [terminalSources, setTerminalSources] = useState<{\n agentTerminalSrc: string;\n floatingTerminalSrc: string;\n } | null>(null);\n\n // Startup params — only populated on first open (initialized === false)\n const [initialMessage, setInitialMessage] = useState<string | undefined>(undefined);\n const [startupScript, setStartupScript] = useState<string | undefined>(undefined);\n const [contextTitle, setContextTitle] = useState<string | undefined>(undefined);\n const [contextAgentProvider, setContextAgentProvider] = useState<string | undefined>(undefined);\n const [contextModel, setContextModel] = useState<string | undefined>(undefined);\n const [contextSessionMode, setContextSessionMode] = useState<'fast' | 'plan' | undefined>(undefined);\n const [contextAttachmentNames, setContextAttachmentNames] = useState<string[]>([]);\n\n // True = send --resume to agent; False = send fresh start params\n const [isResume, setIsResume] = useState<boolean>(true);\n const [terminalPersistenceMode, setTerminalPersistenceMode] = useState<'tmux' | 'shell'>('shell');\n\n useEffect(() => {\n document.documentElement.classList.add('session-page');\n return () => {\n document.documentElement.classList.remove('session-page');\n };\n }, []);\n\n useEffect(() => {\n if (!sessionId) return;\n\n const loadSession = async () => {\n try {\n setTerminalSources(null);\n\n // Ensure ttyd is running\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError('Failed to start terminal service');\n setLoading(false);\n return;\n }\n setTerminalPersistenceMode(ttydResult.persistenceMode === 'tmux' ? 'tmux' : 'shell');\n\n const data = await getSessionMetadata(sessionId);\n if (!data) {\n setError('Session not found');\n setLoading(false);\n return;\n }\n\n setMetadata(data);\n const resolvedTerminalSources = await getSessionTerminalSources(data.sessionName, data.repoPath);\n setTerminalSources(resolvedTerminalSources);\n\n // Determine fresh start vs resume purely from the initialized flag:\n // - initialized === false → first open, send startup params\n // - initialized === true → already started before, resume\n // - initialized === undefined → legacy session (no flag), treat as resume\n const isFirstOpen = data.initialized === false;\n\n if (isFirstOpen) {\n // Consume the launch context (startup params) written by GitRepoSelector\n const contextResult = await consumeSessionLaunchContext(sessionId);\n if (contextResult.success && contextResult.context) {\n const ctx = contextResult.context;\n setInitialMessage(ctx.initialMessage);\n setStartupScript(ctx.startupScript);\n setContextTitle(ctx.title);\n setContextAgentProvider(ctx.agentProvider);\n setContextModel(ctx.model);\n setContextSessionMode(ctx.sessionMode);\n setContextAttachmentNames(ctx.attachmentNames || []);\n }\n // Whether or not we got context, this is a fresh start\n setIsResume(false);\n } else {\n // Already initialized (or legacy) — resume\n setIsResume(true);\n }\n\n setLoading(false);\n } catch (e) {\n console.error('Failed to load session:', e);\n setError('Failed to load session');\n setLoading(false);\n }\n };\n\n loadSession();\n }, [sessionId]);\n\n const handleExit = (force?: boolean) => {\n if (force) {\n // Force a full page navigation — used after cleanup where\n // router.push can get stuck due to iframe teardown state\n window.location.href = '/';\n } else {\n router.push('/');\n }\n };\n\n // Called by SessionView once the agent command has been sent for the first time\n const handleSessionStart = async () => {\n if (sessionId) {\n await markSessionInitialized(sessionId);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60\">Loading session...</p>\n </div>\n </div>\n );\n }\n\n if (error || !metadata) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"card w-96 bg-base-200 shadow-xl\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error\">Error</h2>\n <p>{error || 'Session not found'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => handleExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!terminalSources) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60\">Initializing terminals...</p>\n </div>\n </div>\n );\n }\n\n return (\n <SessionView\n repo={metadata.repoPath}\n worktree={metadata.worktreePath}\n branch={metadata.branchName}\n baseBranch={metadata.baseBranch}\n sessionName={metadata.sessionName}\n agent={contextAgentProvider || metadata.agent}\n model={contextModel || metadata.model}\n startupScript={startupScript}\n devServerScript={metadata.devServerScript}\n initialMessage={initialMessage}\n attachmentNames={contextAttachmentNames}\n title={contextTitle || metadata.title}\n sessionMode={contextSessionMode}\n onExit={handleExit}\n isResume={isResume}\n terminalPersistenceMode={terminalPersistenceMode}\n onSessionStart={handleSessionStart}\n agentTerminalSrc={terminalSources.agentTerminalSrc}\n floatingTerminalSrc={terminalSources.floatingTerminalSrc}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"4082b34407de6d8b04fb30e3d33e09ad8fb9f5643c\":\"getSessionUncommittedFileCount\"},\"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_14=/*#__PURE__*/createServerReference(\"4082b34407de6d8b04fb30e3d33e09ad8fb9f5643c\",callServer,void 0,findSourceMapURL,\"getSessionUncommittedFileCount\");export{$$RSC_SERVER_ACTION_14 as getSessionUncommittedFileCount};","/* __next_internal_action_entry_do_not_use__ [{\"40e53decb9ae20744938c818cb75186c9d7d246dd6\":\"listSessionBaseBranches\"},\"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_16=/*#__PURE__*/createServerReference(\"40e53decb9ae20744938c818cb75186c9d7d246dd6\",callServer,void 0,findSourceMapURL,\"listSessionBaseBranches\");export{$$RSC_SERVER_ACTION_16 as listSessionBaseBranches};","/* __next_internal_action_entry_do_not_use__ [{\"4026d1d222bd410fcdcbd1c38a0ff61174c95940f4\":\"mergeSessionToBase\"},\"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_12=/*#__PURE__*/createServerReference(\"4026d1d222bd410fcdcbd1c38a0ff61174c95940f4\",callServer,void 0,findSourceMapURL,\"mergeSessionToBase\");export{$$RSC_SERVER_ACTION_12 as mergeSessionToBase};","/* __next_internal_action_entry_do_not_use__ [{\"40bc6564a4bb311b9a56fb4b77c905b07ff2e1f80d\":\"rebaseSessionOntoBase\"},\"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_13=/*#__PURE__*/createServerReference(\"40bc6564a4bb311b9a56fb4b77c905b07ff2e1f80d\",callServer,void 0,findSourceMapURL,\"rebaseSessionOntoBase\");export{$$RSC_SERVER_ACTION_13 as rebaseSessionOntoBase};","/* __next_internal_action_entry_do_not_use__ [{\"60b2cea2938c907910cd9de5b708ffde79abe7b518\":\"updateSessionBaseBranch\"},\"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_17=/*#__PURE__*/createServerReference(\"60b2cea2938c907910cd9de5b708ffde79abe7b518\",callServer,void 0,findSourceMapURL,\"updateSessionBaseBranch\");export{$$RSC_SERVER_ACTION_17 as updateSessionBaseBranch};","/* __next_internal_action_entry_do_not_use__ [{\"604c490a1f0824a69d3f092ddcd2a0c18d8e8ed8c8\":\"writeSessionPromptFile\"},\"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_1=/*#__PURE__*/createServerReference(\"604c490a1f0824a69d3f092ddcd2a0c18d8e8ed8c8\",callServer,void 0,findSourceMapURL,\"writeSessionPromptFile\");export{$$RSC_SERVER_ACTION_1 as writeSessionPromptFile};","/* __next_internal_action_entry_do_not_use__ [{\"7fa080776397bddd8ae014921563b2198348bacbb0\":\"setTmuxSessionMouseMode\"},\"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_11=/*#__PURE__*/createServerReference(\"7fa080776397bddd8ae014921563b2198348bacbb0\",callServer,void 0,findSourceMapURL,\"setTmuxSessionMouseMode\");export{$$RSC_SERVER_ACTION_11 as setTmuxSessionMouseMode};","/* __next_internal_action_entry_do_not_use__ [{\"7ffb167529818e1d976bb3e09b1b5659e022152275\":\"setTmuxSessionStatusVisibility\"},\"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_12=/*#__PURE__*/createServerReference(\"7ffb167529818e1d976bb3e09b1b5659e022152275\",callServer,void 0,findSourceMapURL,\"setTmuxSessionStatusVisibility\");export{$$RSC_SERVER_ACTION_12 as setTmuxSessionStatusVisibility};","/* __next_internal_action_entry_do_not_use__ [{\"40a2b83aab724130e6af9966ef211dd8593672c640\":\"listPathEntries\"},\"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_1=/*#__PURE__*/createServerReference(\"40a2b83aab724130e6af9966ef211dd8593672c640\",callServer,void 0,findSourceMapURL,\"listPathEntries\");export{$$RSC_SERVER_ACTION_1 as listPathEntries};","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Image from 'next/image';\nimport { getHomeDirectory, listPathEntries, saveAttachments } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { ArrowLeft, Clipboard, FileText, Folder, Grid2x2, House, List, Pin, PinOff } from 'lucide-react';\nimport { getDirName } from '@/lib/path';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\nconst VIEW_MODE_STORAGE_KEY = 'viba:session-file-browser:view-mode';\n\ntype FileSystemItem = {\n name: string;\n path: string;\n isDirectory: boolean;\n isGitRepo: boolean;\n};\n\ninterface SessionFileBrowserProps {\n initialPath?: string;\n worktreePath?: string;\n onConfirm: (paths: string[]) => void | Promise<void>;\n onCancel: () => void;\n onPathChange?: (path: string) => void;\n}\n\nexport default function SessionFileBrowser({\n initialPath,\n worktreePath,\n onConfirm,\n onCancel,\n onPathChange,\n}: SessionFileBrowserProps) {\n const imageExtensions = useMemo(\n () => new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg', '.ico', '.avif']),\n []\n );\n const [currentPath, setCurrentPath] = useState('');\n const [items, setItems] = useState<FileSystemItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [homePath, setHomePath] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<string[]>([]);\n const [anchorIndex, setAnchorIndex] = useState<number | null>(null);\n const [viewMode, setViewMode] = useState<'list' | 'grid'>('list');\n const [hasLoadedViewMode, setHasLoadedViewMode] = useState(false);\n const [brokenThumbnails, setBrokenThumbnails] = useState<Record<string, boolean>>({});\n const [pinnedFolderShortcuts, setPinnedFolderShortcuts] = useState<string[]>([]);\n\n useEffect(() => {\n let isMounted = true;\n\n const init = async () => {\n try {\n const home = await getHomeDirectory();\n if (!isMounted) return;\n setHomePath(home);\n if (!initialPath) {\n setCurrentPath(home);\n }\n } catch (err) {\n console.error('Failed to resolve home directory:', err);\n }\n\n if (initialPath && isMounted) {\n setCurrentPath(initialPath);\n }\n };\n\n void init();\n\n return () => {\n isMounted = false;\n };\n }, [initialPath]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadPinnedFolderShortcuts = async () => {\n try {\n const config = await getConfig();\n if (!isMounted) return;\n const pinned = Array.isArray(config.pinnedFolderShortcuts)\n ? config.pinnedFolderShortcuts.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n : [];\n setPinnedFolderShortcuts(Array.from(new Set(pinned)));\n } catch (err) {\n console.error('Failed to load pinned folder shortcuts:', err);\n }\n };\n\n void loadPinnedFolderShortcuts();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n try {\n const savedViewMode = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n if (savedViewMode === 'list' || savedViewMode === 'grid') {\n setViewMode(savedViewMode);\n }\n } catch {\n // Ignore localStorage failures.\n } finally {\n setHasLoadedViewMode(true);\n }\n }, []);\n\n useEffect(() => {\n if (!hasLoadedViewMode) return;\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, viewMode);\n } catch {\n // Ignore localStorage failures.\n }\n }, [hasLoadedViewMode, viewMode]);\n\n useEffect(() => {\n if (!currentPath) return;\n\n const fetchItems = async () => {\n setLoading(true);\n setError(null);\n try {\n const entries = await listPathEntries(currentPath);\n setItems(entries);\n } catch (err) {\n console.error('Failed to list files:', err);\n setError('Failed to load directory contents');\n } finally {\n setLoading(false);\n }\n };\n\n void fetchItems();\n }, [currentPath]);\n\n useEffect(() => {\n if (!currentPath) return;\n onPathChange?.(currentPath);\n }, [currentPath, onPathChange]);\n\n useEffect(() => {\n setSelectedPaths([]);\n setAnchorIndex(null);\n setBrokenThumbnails({});\n }, [currentPath]);\n\n const selectedSet = useMemo(() => new Set(selectedPaths), [selectedPaths]);\n const isImageFile = (fileName: string) => {\n const dotIndex = fileName.lastIndexOf('.');\n if (dotIndex === -1) return false;\n return imageExtensions.has(fileName.slice(dotIndex).toLowerCase());\n };\n\n const handleGoUp = () => {\n const parent = getDirName(currentPath);\n if (parent && parent !== currentPath) {\n setCurrentPath(parent);\n }\n };\n\n const handleGoHome = () => {\n if (!homePath || currentPath === homePath) return;\n setCurrentPath(homePath);\n };\n\n const handleItemClick = (item: FileSystemItem, index: number, e: React.MouseEvent<HTMLElement>) => {\n if (item.isDirectory) {\n setCurrentPath(item.path);\n return;\n }\n\n const isMetaMulti = e.metaKey || e.ctrlKey;\n\n if (e.shiftKey && anchorIndex !== null) {\n const start = Math.min(anchorIndex, index);\n const end = Math.max(anchorIndex, index);\n const range = items\n .slice(start, end + 1)\n .filter((entry) => !entry.isDirectory)\n .map((entry) => entry.path);\n setSelectedPaths(range);\n return;\n }\n\n if (isMetaMulti) {\n setSelectedPaths((prev) =>\n prev.includes(item.path)\n ? prev.filter((path) => path !== item.path)\n : [...prev, item.path]\n );\n setAnchorIndex(index);\n return;\n }\n\n setSelectedPaths([item.path]);\n setAnchorIndex(index);\n };\n\n const handlePaste = async () => {\n setError(null);\n if (!worktreePath) {\n setError(\"Cannot paste: Session worktree path is missing.\");\n return;\n }\n\n try {\n setLoading(true);\n \n if (!navigator.clipboard || !navigator.clipboard.read) {\n throw new Error(\"Clipboard API not supported in this browser\");\n }\n\n // Request clipboard access\n const clipboardItems = await navigator.clipboard.read();\n const formData = new FormData();\n let hasFiles = false;\n\n for (const item of clipboardItems) {\n // Look for image types or other file types\n // We iterate through available types in the item\n for (const type of item.types) {\n // Prioritize images\n if (type.startsWith('image/')) {\n const blob = await item.getType(type);\n const ext = type.split('/')[1] || 'png';\n const filename = `pasted-image-${Date.now()}.${ext}`;\n const file = new File([blob], filename, { type });\n formData.append(filename, file); // Use filename as key\n hasFiles = true;\n break; // Found an image representation, stop checking other types for this item\n } else if (type === 'text/plain') {\n // For now, ignore plain text unless we want to save it as a text file.\n // If user copies text, they can paste directly into terminal. \n // This feature is \"pasting file\".\n }\n }\n }\n\n if (hasFiles) {\n const savedPaths = await saveAttachments(worktreePath, formData);\n if (savedPaths && savedPaths.length > 0) {\n // Determine what to do with saved paths.\n // Option 1: auto-insert them (call onConfirm).\n // Option 2: select them in the browser (might be hard if they are in a different dir).\n // Option 3: just call onConfirm because the user clicked \"Paste\" to insert.\n await onConfirm(savedPaths);\n return;\n } else {\n setError(\"Failed to save pasted files.\");\n }\n } else {\n // No files found, maybe check for text path?\n try {\n const text = await navigator.clipboard.readText();\n if (text && text.trim().startsWith('/')) {\n // Check if it's a valid path? \n // Maybe just suggest it?\n // For now, let's just error if no files found.\n setError(\"No file content found in clipboard. Copy an image or file first.\");\n } else {\n setError(\"No file content found in clipboard.\");\n }\n } catch {\n setError(\"No file content found in clipboard.\");\n }\n }\n\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('Paste error:', err);\n setError(`Failed to read from clipboard: ${message}`);\n } finally {\n setLoading(false);\n }\n };\n\n const savePinnedFolderShortcuts = async (nextShortcuts: string[]) => {\n setPinnedFolderShortcuts(nextShortcuts);\n try {\n await updateConfig({ pinnedFolderShortcuts: nextShortcuts });\n } catch (err) {\n console.error('Failed to save pinned folder shortcuts:', err);\n setError('Failed to save pinned shortcuts');\n }\n };\n\n const handleTogglePinFolder = async (folderPath: string) => {\n setError(null);\n const alreadyPinned = pinnedFolderShortcuts.includes(folderPath);\n if (alreadyPinned) {\n await savePinnedFolderShortcuts(pinnedFolderShortcuts.filter((path) => path !== folderPath));\n return;\n }\n await savePinnedFolderShortcuts([...pinnedFolderShortcuts, folderPath]);\n };\n\n const handleConfirm = useCallback(async () => {\n if (selectedPaths.length === 0) return;\n await onConfirm(selectedPaths);\n }, [onConfirm, selectedPaths]);\n\n useDialogKeyboardShortcuts({\n onConfirm: handleConfirm,\n onDismiss: onCancel,\n canConfirm: selectedPaths.length > 0,\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-5xl h-[82vh] flex flex-col\">\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 Browse Files\n </h2>\n <button onClick={onCancel} className=\"btn btn-sm btn-ghost btn-circle\" title=\"Close file browser\">\n ✕\n </button>\n </div>\n\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 <button\n onClick={handleGoHome}\n className=\"btn btn-sm btn-ghost gap-1\"\n title={homePath ? `Go to Home Folder (${homePath})` : 'Go to Home Folder'}\n disabled={!homePath || currentPath === homePath}\n >\n <House className=\"w-4 h-4\" />\n Home\n </button>\n <div className=\"flex-1 overflow-x-auto whitespace-nowrap px-2 font-mono text-sm\">\n {currentPath}\n </div>\n <div className=\"join\">\n <button\n type=\"button\"\n onClick={() => setViewMode('list')}\n className={`btn btn-sm join-item ${viewMode === 'list' ? 'btn-active' : 'btn-ghost'}`}\n title=\"List view\"\n >\n <List className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode('grid')}\n className={`btn btn-sm join-item ${viewMode === 'grid' ? 'btn-active' : 'btn-ghost'}`}\n title=\"Grid view\"\n >\n <Grid2x2 className=\"w-4 h-4\" />\n </button>\n </div>\n <button\n onClick={handleConfirm}\n className=\"btn btn-sm btn-primary gap-2\"\n disabled={selectedPaths.length === 0}\n title=\"Insert selected absolute paths\"\n >\n Insert ({selectedPaths.length})\n </button>\n \n <div className=\"w-[1px] h-6 bg-base-content/10 mx-1\"></div>\n\n <button\n onClick={handlePaste}\n className=\"btn btn-sm btn-ghost gap-2\"\n title=\"Paste file/image from clipboard\"\n disabled={!worktreePath}\n >\n <Clipboard className=\"w-4 h-4\" />\n Paste\n </button>\n </div>\n {pinnedFolderShortcuts.length > 0 && (\n <div className=\"px-3 py-2 border-b border-base-300 bg-base-200/50\">\n <div className=\"flex items-center gap-2 overflow-x-auto\">\n {pinnedFolderShortcuts.map((folderPath) => {\n const isCurrent = folderPath === currentPath;\n const label = folderPath.split(/[\\\\/]/).filter(Boolean).pop() || folderPath;\n return (\n <div key={folderPath} className=\"join shrink-0\">\n <button\n type=\"button\"\n className={`btn btn-xs join-item ${isCurrent ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setCurrentPath(folderPath)}\n title={folderPath}\n >\n <Folder className=\"w-3 h-3\" />\n {label}\n </button>\n <button\n type=\"button\"\n className=\"btn btn-xs btn-ghost join-item\"\n onClick={() => void handleTogglePinFolder(folderPath)}\n title={`Unpin ${folderPath}`}\n >\n <PinOff className=\"w-3 h-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\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 ) : viewMode === 'list' ? (\n <div className=\"grid grid-cols-1 gap-1\">\n {items.map((item, index) => {\n const isSelected = selectedSet.has(item.path);\n return (\n <div\n key={item.path}\n className={`flex items-center justify-between p-2 rounded-md cursor-pointer transition-colors border ${isSelected\n ? 'bg-primary text-primary-content border-primary'\n : 'hover:bg-base-100 border-transparent'\n }`}\n onClick={(e) => handleItemClick(item, index, e)}\n title={item.path}\n >\n <div className=\"flex items-center gap-3 overflow-hidden\">\n {item.isDirectory ? (\n <Folder className=\"w-5 h-5 shrink-0\" />\n ) : (\n <FileText className=\"w-5 h-5 shrink-0\" />\n )}\n <span className=\"truncate\">{item.name}</span>\n </div>\n <span className=\"text-[10px] opacity-70 shrink-0\">\n {item.isDirectory ? (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs h-6 min-h-6\"\n onClick={(e) => {\n e.stopPropagation();\n void handleTogglePinFolder(item.path);\n }}\n title={pinnedFolderShortcuts.includes(item.path) ? 'Unpin folder' : 'Pin folder'}\n >\n <Pin className={`w-3 h-3 ${pinnedFolderShortcuts.includes(item.path) ? 'fill-current' : ''}`} />\n </button>\n ) : 'file'}\n </span>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-3\">\n {items.map((item, index) => {\n const isSelected = selectedSet.has(item.path);\n const isImage = !item.isDirectory && isImageFile(item.name);\n const thumbnailUrl = `/api/file-thumbnail?path=${encodeURIComponent(item.path)}`;\n\n return (\n <button\n key={item.path}\n type=\"button\"\n className={`rounded-lg border text-left overflow-hidden transition-colors ${isSelected\n ? 'border-primary bg-primary/15'\n : 'border-base-300 hover:bg-base-100'\n }`}\n onClick={(e) => handleItemClick(item, index, e)}\n title={item.path}\n >\n <div className=\"aspect-square bg-base-300 flex items-center justify-center overflow-hidden relative\">\n {isImage && !brokenThumbnails[item.path] ? (\n <Image\n src={thumbnailUrl}\n alt={item.name}\n fill\n sizes=\"(max-width: 768px) 50vw, (max-width: 1024px) 25vw, 20vw\"\n className=\"object-cover\"\n unoptimized\n onError={() =>\n setBrokenThumbnails((prev) => ({ ...prev, [item.path]: true }))\n }\n />\n ) : item.isDirectory ? (\n <Folder className=\"w-10 h-10 opacity-80\" />\n ) : (\n <FileText className=\"w-10 h-10 opacity-80\" />\n )}\n {item.isDirectory && (\n <button\n type=\"button\"\n className={`absolute top-1 right-1 btn btn-xs btn-circle ${pinnedFolderShortcuts.includes(item.path) ? 'btn-primary' : 'btn-ghost bg-base-100/70'}`}\n onClick={(e) => {\n e.stopPropagation();\n void handleTogglePinFolder(item.path);\n }}\n title={pinnedFolderShortcuts.includes(item.path) ? 'Unpin folder' : 'Pin folder'}\n >\n <Pin className={`w-3 h-3 ${pinnedFolderShortcuts.includes(item.path) ? 'fill-current' : ''}`} />\n </button>\n )}\n </div>\n <div className=\"px-2 py-2\">\n <div className=\"truncate text-sm font-medium\" title={item.name}>{item.name}</div>\n <div className=\"text-[10px] opacity-70\">\n {item.isDirectory ? 'folder' : isImage ? 'image' : 'file'}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className=\"p-3 border-t border-base-300 text-xs text-base-content/60 text-center\">\n Click: single select. Cmd/Ctrl+Click: multi-select. Shift+Click: range select.\n Click a folder to open it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40101a1778a92ccf7eb87b2e9eef4f47730ef3b010\":\"deleteSessionInBackground\"},\"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_11=/*#__PURE__*/createServerReference(\"40101a1778a92ccf7eb87b2e9eef4f47730ef3b010\",callServer,void 0,findSourceMapURL,\"deleteSessionInBackground\");export{$$RSC_SERVER_ACTION_11 as deleteSessionInBackground};","'use client';\n\nimport React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\n// import { useRouter } from 'next/navigation';\nimport {\n deleteSessionInBackground,\n getSessionDivergence,\n getSessionUncommittedFileCount,\n listSessionBaseBranches,\n mergeSessionToBase,\n rebaseSessionOntoBase,\n updateSessionBaseBranch,\n writeSessionPromptFile\n} from '@/app/actions/session';\nimport { setTmuxSessionMouseMode, setTmuxSessionStatusVisibility } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { Trash2, ExternalLink, Play, GitCommitHorizontal, GitMerge, GitPullRequestArrow, GitBranch, ArrowUp, ArrowDown, FolderOpen, ChevronLeft, Grip, ChevronDown, Plus, Globe, MousePointer2, ArrowLeft, ArrowRight, RotateCw } from 'lucide-react';\nimport SessionFileBrowser from './SessionFileBrowser';\nimport { getBaseName, isWindowsAbsolutePath } from '@/lib/path';\nimport { notifySessionsUpdated } from '@/lib/session-updates';\nimport { buildTtydTerminalSrc } from '@/lib/terminal-session';\nimport { normalizePreviewUrl } from '@/lib/url';\nimport { useTerminalLink, type TerminalWindow } from '@/hooks/useTerminalLink';\nimport { quoteShellArg } from '@/lib/shell';\n\nconst SUPPORTED_IDES = [\n { id: 'vscode', name: 'VS Code', protocol: 'vscode' },\n { id: 'cursor', name: 'Cursor', protocol: 'cursor' },\n { id: 'windsurf', name: 'Windsurf', protocol: 'windsurf' },\n { id: 'antigravity', name: 'Antigravity', protocol: 'antigravity' },\n];\n\n\ntype CleanupPhase = 'idle' | 'error';\n\ntype PreviewNavigationAction = 'back' | 'forward' | 'reload';\ntype TerminalBootstrapSlot = 'agent' | 'terminal';\ntype TerminalBootstrapState = 'idle' | 'in_progress' | 'done';\ntype TerminalBootstrapRegistry = Record<string, TerminalBootstrapState>;\ntype TerminalInteractionMode = 'scroll' | 'select';\ntype TerminalOnWriteParsedDisposable = { dispose?: () => void };\ntype TerminalWithOnWriteParsed = NonNullable<TerminalWindow['term']> & {\n onWriteParsed?: (callback: () => void) => TerminalOnWriteParsedDisposable | void;\n};\n\nconst TERMINAL_SIZE_STORAGE_KEY = 'viba-terminal-size';\nconst SPLIT_RATIO_STORAGE_KEY = 'viba-agent-preview-split-ratio';\nconst DEFAULT_AGENT_PANE_RATIO = 0.5;\nconst TERMINAL_HEADER_HEIGHT = 40;\nconst TERMINAL_PANEL_RIGHT_GAP = 16;\nconst TERMINAL_MINIMIZED_VISIBLE_WIDTH = 40;\nconst TRIDENT_WORKSPACE_URL = 'http://localhost:3100/workspace';\nconst TERMINAL_BOOTSTRAP_STORAGE_PREFIX = 'viba:terminal-bootstrap:';\nconst TERMINAL_BOOTSTRAP_RUNTIME_KEY = '__vibaTerminalBootstrapRegistry';\nconst SHELL_PROMPT_PATTERN = /(?:\\$|%|#|>) $/;\nconst PLAN_MODE_STARTUP_INSTRUCTION =\n 'Plan mode: inspect the relevant code first, present a concrete implementation plan, and wait for explicit user approval before any file edits or write commands.';\nconst AUTO_COMMIT_INSTRUCTION =\n 'After each round, if work is complete and files changed, commit all changes without confirmation. Use a commit message with a clear title and a detailed body explaining what changed and why. If GITHUB_TOKEN or GITLAB_TOKEN is set, push the current branch after committed rounds and create (or update) a GitHub Pull Request or GitLab Merge Request with an appropriate title and description; include the PR/MR link in the first push reply.';\n\nconst clampAgentPaneRatio = (value: number): number => Math.max(0.2, Math.min(0.8, value));\n\ntype PreviewComponentStackEntry = {\n name?: unknown;\n source?: {\n fileName?: unknown;\n } | null;\n};\n\nconst normalizePickerSourceFileName = (value: string): string => {\n let normalized = value.trim();\n if (!normalized) return '';\n\n normalized = normalized.replace(/[#?].*$/, '');\n\n if (/^file:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n } else if (/^https?:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n }\n\n normalized = normalized\n .replace(/^webpack(?:-internal)?:\\/\\/\\/?/, '')\n .replace(/^rsc:\\/\\//, '')\n .replace(/^\\(.*?\\)\\//, '')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n .replace(/\\\\/g, '/');\n\n return normalized.trim();\n};\n\nconst joinPath = (base: string, relative: string): string => {\n const normalizedBase = base.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n const normalizedRelative = relative.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return `${normalizedBase}/${normalizedRelative}`;\n};\n\nconst resolveComponentSourcePath = (rawSourceFileName: string, workspaceRoot: string): string | null => {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalizedWorkspaceRoot) return null;\n\n const normalizedSource = normalizePickerSourceFileName(rawSourceFileName);\n if (!normalizedSource) return null;\n\n if (normalizedSource.startsWith('/') || isWindowsAbsolutePath(normalizedSource)) {\n return normalizedSource;\n }\n\n const relativeCandidates = new Set<string>();\n relativeCandidates.add(normalizedSource.replace(/^\\.\\/+/, ''));\n\n const srcIndex = normalizedSource.indexOf('/src/');\n if (srcIndex >= 0) {\n relativeCandidates.add(normalizedSource.slice(srcIndex + 1));\n }\n\n if (normalizedSource.startsWith('src/')) {\n relativeCandidates.add(normalizedSource);\n }\n\n for (const relative of relativeCandidates) {\n if (!relative) continue;\n return joinPath(normalizedWorkspaceRoot, relative);\n }\n\n return null;\n};\n\nconst buildComponentReferenceText = (reactStack: unknown[], workspaceRoot: string): string | null => {\n for (const entry of reactStack) {\n if (!entry || typeof entry !== 'object') continue;\n\n const componentEntry = entry as PreviewComponentStackEntry;\n const componentName = typeof componentEntry.name === 'string' ? componentEntry.name.trim() : '';\n if (!componentName) continue;\n\n const sourceFileName = typeof componentEntry.source?.fileName === 'string'\n ? componentEntry.source.fileName.trim()\n : '';\n const sourcePath = sourceFileName ? resolveComponentSourcePath(sourceFileName, workspaceRoot) : null;\n\n if (sourcePath) {\n return `${componentName} (${sourcePath})`;\n }\n }\n\n return null;\n};\n\nconst normalizeComponentLookupName = (value: string): string => {\n const trimmed = value.trim();\n if (!trimmed) return '';\n\n const match = trimmed.match(/[A-Za-z_$][\\w$]*/);\n return match ? match[0] : '';\n};\n\nexport interface SessionViewProps {\n repo: string;\n worktree: string;\n branch: string;\n baseBranch?: string;\n sessionName: string;\n agent?: string;\n model?: string;\n startupScript?: string;\n devServerScript?: string;\n initialMessage?: string;\n attachmentNames?: string[];\n title?: string;\n sessionMode?: 'fast' | 'plan';\n onExit: (force?: boolean) => void;\n isResume?: boolean;\n terminalPersistenceMode?: 'tmux' | 'shell';\n onSessionStart?: () => void;\n agentTerminalSrc?: string;\n floatingTerminalSrc?: string;\n}\n\nexport function SessionView({\n repo,\n worktree,\n branch,\n baseBranch,\n sessionName,\n agent,\n model,\n startupScript,\n devServerScript,\n initialMessage,\n attachmentNames,\n title,\n sessionMode = 'fast',\n onExit,\n isResume,\n terminalPersistenceMode = 'shell',\n onSessionStart,\n agentTerminalSrc: agentTerminalSrcOverride,\n floatingTerminalSrc: floatingTerminalSrcOverride,\n}: SessionViewProps) {\n const headerButtonLabelClass = 'hidden min-[1900px]:inline';\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const terminalRef = useRef<HTMLIFrameElement>(null);\n const previewIframeRef = useRef<HTMLIFrameElement>(null);\n const previewAddressInputRef = useRef<HTMLInputElement>(null);\n const splitContainerRef = useRef<HTMLDivElement>(null);\n const splitResizeRef = useRef({ startX: 0, startRatio: DEFAULT_AGENT_PANE_RATIO });\n const agentFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalProcessMonitorCleanupRef = useRef<(() => void) | null>(null);\n const terminalStartupScriptStateRef = useRef<{ injected: boolean; timer: number | null }>({\n injected: false,\n timer: null,\n });\n const agentTerminalSrc = useMemo(\n () => agentTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'agent'),\n [agentTerminalSrcOverride, sessionName],\n );\n const floatingTerminalSrc = useMemo(\n () => floatingTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'terminal'),\n [floatingTerminalSrcOverride, sessionName],\n );\n\n const terminalBootstrapStateRef = useRef<Record<TerminalBootstrapSlot, TerminalBootstrapState>>({\n agent: 'idle',\n terminal: 'idle',\n });\n const tmuxStatusAppliedRef = useRef<Record<TerminalBootstrapSlot, boolean>>({\n agent: false,\n terminal: false,\n });\n\n useEffect(() => {\n terminalBootstrapStateRef.current = {\n agent: 'idle',\n terminal: 'idle',\n };\n tmuxStatusAppliedRef.current = {\n agent: false,\n terminal: false,\n };\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current = {\n injected: false,\n timer: null,\n };\n }, [sessionName]);\n\n useEffect(() => {\n return () => {\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n terminalStartupScriptStateRef.current.timer = null;\n }\n };\n }, []);\n\n const getTerminalBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${TERMINAL_BOOTSTRAP_STORAGE_PREFIX}${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapRegistry = useCallback((): TerminalBootstrapRegistry | null => {\n if (typeof window === 'undefined') return null;\n const runtimeWindow = window as Window & {\n __vibaTerminalBootstrapRegistry?: TerminalBootstrapRegistry;\n };\n if (!runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY]) {\n runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] = {};\n }\n return runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] || null;\n }, []);\n\n const getRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot): TerminalBootstrapState => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return 'idle';\n return registry[getRuntimeBootstrapKey(slot)] || 'idle';\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const setRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot, state: TerminalBootstrapState): void => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return;\n registry[getRuntimeBootstrapKey(slot)] = state;\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const hasTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): boolean => {\n if (terminalBootstrapStateRef.current[slot] === 'done') {\n return true;\n }\n if (getRuntimeBootstrapState(slot) === 'done') {\n return true;\n }\n try {\n return window.sessionStorage.getItem(getTerminalBootstrapKey(slot)) === '1';\n } catch {\n return false;\n }\n }, [getRuntimeBootstrapState, getTerminalBootstrapKey]);\n\n const beginTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): boolean => {\n const current = terminalBootstrapStateRef.current[slot];\n const runtimeState = getRuntimeBootstrapState(slot);\n if (current === 'done' || current === 'in_progress' || runtimeState === 'done' || runtimeState === 'in_progress') {\n return false;\n }\n terminalBootstrapStateRef.current[slot] = 'in_progress';\n setRuntimeBootstrapState(slot, 'in_progress');\n return true;\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const resetTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): void => {\n if (terminalBootstrapStateRef.current[slot] !== 'done') {\n terminalBootstrapStateRef.current[slot] = 'idle';\n }\n if (getRuntimeBootstrapState(slot) !== 'done') {\n setRuntimeBootstrapState(slot, 'idle');\n }\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const markTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): void => {\n terminalBootstrapStateRef.current[slot] = 'done';\n setRuntimeBootstrapState(slot, 'done');\n try {\n window.sessionStorage.setItem(getTerminalBootstrapKey(slot), '1');\n } catch {\n // Ignore storage failures (private mode / disabled storage).\n }\n }, [getTerminalBootstrapKey, setRuntimeBootstrapState]);\n\n const isShellPromptReady = useCallback((term: TerminalWindow['term']): boolean => {\n const activeBuffer = term?.buffer?.active;\n if (!activeBuffer || typeof activeBuffer.getLine !== 'function') {\n // Fall back to ready when xterm internals are unavailable.\n return true;\n }\n\n const cursorLine = activeBuffer.baseY + activeBuffer.cursorY;\n for (let offset = 0; offset < 6; offset += 1) {\n const line = activeBuffer.getLine(cursorLine - offset);\n const text = line?.translateToString(true) ?? '';\n if (!text.trim()) continue;\n return SHELL_PROMPT_PATTERN.test(text);\n }\n return false;\n }, []);\n\n const stopTerminalProcessMonitor = useCallback(() => {\n if (terminalProcessMonitorCleanupRef.current) {\n terminalProcessMonitorCleanupRef.current();\n terminalProcessMonitorCleanupRef.current = null;\n }\n }, []);\n\n const startTerminalProcessMonitor = useCallback((\n iframe: HTMLIFrameElement,\n term: NonNullable<TerminalWindow['term']>\n ) => {\n stopTerminalProcessMonitor();\n\n let disposed = false;\n let writeDisposable: { dispose?: () => void } | null = null;\n let mutationObserver: MutationObserver | null = null;\n let intervalId: number | null = null;\n\n const updateProcessState = () => {\n if (disposed) return;\n const isRunning = !isShellPromptReady(term);\n setIsTerminalForegroundProcessRunning((current) => (current === isRunning ? current : isRunning));\n };\n\n updateProcessState();\n intervalId = window.setInterval(updateProcessState, 1000);\n\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n if (typeof xterm.onWriteParsed === 'function') {\n writeDisposable = xterm.onWriteParsed(updateProcessState) || null;\n } else {\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n mutationObserver = new MutationObserver(updateProcessState);\n mutationObserver.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (error) {\n console.error('Failed to setup terminal process monitor:', error);\n }\n\n terminalProcessMonitorCleanupRef.current = () => {\n disposed = true;\n if (intervalId !== null) {\n window.clearInterval(intervalId);\n intervalId = null;\n }\n if (writeDisposable && typeof writeDisposable.dispose === 'function') {\n writeDisposable.dispose();\n }\n mutationObserver?.disconnect();\n };\n }, [isShellPromptReady, stopTerminalProcessMonitor]);\n\n useEffect(() => {\n return () => {\n stopTerminalProcessMonitor();\n };\n }, [stopTerminalProcessMonitor]);\n\n useEffect(() => {\n setIsTerminalForegroundProcessRunning(false);\n stopTerminalProcessMonitor();\n }, [sessionName, stopTerminalProcessMonitor]);\n\n const injectTerminalStartupScript = useCallback((\n iframe: HTMLIFrameElement,\n win: TerminalWindow,\n term: NonNullable<TerminalWindow['term']>\n ): boolean => {\n if (isResume) return false;\n\n const script = startupScript?.trim();\n if (!script || terminalStartupScriptStateRef.current.injected) return false;\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n terminalStartupScriptStateRef.current.injected = true;\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current.timer = window.setTimeout(() => {\n terminalStartupScriptStateRef.current.timer = null;\n try {\n term.paste(script);\n pressEnter();\n } catch (error) {\n terminalStartupScriptStateRef.current.injected = false;\n console.error('Failed to inject startup script into terminal iframe:', error);\n }\n }, 500);\n\n return true;\n }, [isResume, startupScript]);\n\n useEffect(() => {\n if (isResume) return;\n if (!startupScript?.trim()) return;\n if (terminalStartupScriptStateRef.current.injected) return;\n\n let cancelled = false;\n\n const attemptInjection = (attempts = 0) => {\n if (cancelled || terminalStartupScriptStateRef.current.injected) return;\n if (attempts > 30) return;\n\n if (!hasTerminalBootstrapped('terminal')) {\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n return;\n }\n\n const iframe = terminalRef.current;\n if (!iframe) return;\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n injectTerminalStartupScript(iframe, win, win.term);\n return;\n }\n } catch {\n // Ignore transient iframe access errors and retry.\n }\n\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n };\n\n attemptInjection();\n return () => {\n cancelled = true;\n };\n }, [hasTerminalBootstrapped, injectTerminalStartupScript, isResume, startupScript]);\n\n const [feedback, setFeedback] = useState<string>('Initializing...');\n const [cleanupPhase, setCleanupPhase] = useState<CleanupPhase>('idle');\n const [cleanupError, setCleanupError] = useState<string | null>(null);\n const [isStartingDevServer, setIsStartingDevServer] = useState(false);\n const [isTerminalForegroundProcessRunning, setIsTerminalForegroundProcessRunning] = useState(false);\n const [isRequestingCommit, setIsRequestingCommit] = useState(false);\n const [isMerging, setIsMerging] = useState(false);\n const [isRebasing, setIsRebasing] = useState(false);\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\n const [lastFileBrowserPath, setLastFileBrowserPath] = useState(worktree || repo);\n const [isInsertingFilePaths, setIsInsertingFilePaths] = useState(false);\n const [currentBaseBranch, setCurrentBaseBranch] = useState(baseBranch?.trim() || '');\n const [baseBranchOptions, setBaseBranchOptions] = useState<string[]>([]);\n const [isLoadingBaseBranches, setIsLoadingBaseBranches] = useState(false);\n const isLoadingBaseBranchesRef = useRef(false);\n const [isUpdatingBaseBranch, setIsUpdatingBaseBranch] = useState(false);\n const [divergence, setDivergence] = useState({ ahead: 0, behind: 0 });\n const [uncommittedFileCount, setUncommittedFileCount] = useState(0);\n const [isPreviewVisible, setIsPreviewVisible] = useState(false);\n const [previewInputUrl, setPreviewInputUrl] = useState('');\n const [previewUrl, setPreviewUrl] = useState('');\n const [isPreviewPickerActive, setIsPreviewPickerActive] = useState(false);\n const [isResolvingElement, setIsResolvingElement] = useState(false);\n const [agentPaneRatio, setAgentPaneRatio] = useState(DEFAULT_AGENT_PANE_RATIO);\n const [isSplitResizing, setIsSplitResizing] = useState(false);\n\n const [isTerminalMinimized, setIsTerminalMinimized] = useState(true);\n\n // Terminal resize state\n const [terminalSize, setTerminalSize] = useState({ width: 460, height: 320 });\n const [isResizing, setIsResizing] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const resizeRef = useRef({ startX: 0, startY: 0, startWidth: 0, startHeight: 0 });\n const [terminalInteractionMode, setTerminalInteractionMode] = useState<TerminalInteractionMode>('scroll');\n const [isUpdatingTerminalInteractionMode, setIsUpdatingTerminalInteractionMode] = useState(false);\n const terminalInteractionRequestIdRef = useRef(0);\n\n useEffect(() => {\n setLastFileBrowserPath(worktree || repo);\n }, [repo, worktree]);\n\n useEffect(() => {\n const saved = localStorage.getItem(TERMINAL_SIZE_STORAGE_KEY);\n if (saved) {\n try {\n setTerminalSize(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to parse saved terminal size', e);\n }\n }\n\n const savedSplitRatio = localStorage.getItem(SPLIT_RATIO_STORAGE_KEY);\n if (savedSplitRatio) {\n const parsed = Number.parseFloat(savedSplitRatio);\n if (!Number.isNaN(parsed)) {\n setAgentPaneRatio(clampAgentPaneRatio(parsed));\n }\n }\n setIsLoaded(true);\n }, []);\n\n const startResize = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: terminalSize.width,\n startHeight: terminalSize.height\n };\n };\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = resizeRef.current.startX - e.clientX; // Dragging left increases width\n const deltaY = resizeRef.current.startY - e.clientY; // Dragging up increases height\n\n setTerminalSize({\n width: Math.max(300, Math.min(window.innerWidth - 32, resizeRef.current.startWidth + deltaX)),\n height: Math.max(100, Math.min(window.innerHeight - 32, resizeRef.current.startHeight + deltaY))\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n if (isLoaded && !isResizing) {\n localStorage.setItem(TERMINAL_SIZE_STORAGE_KEY, JSON.stringify(terminalSize));\n }\n }, [isLoaded, isResizing, terminalSize]);\n\n useEffect(() => {\n if (isLoaded && !isSplitResizing) {\n localStorage.setItem(SPLIT_RATIO_STORAGE_KEY, String(agentPaneRatio));\n }\n }, [agentPaneRatio, isLoaded, isSplitResizing]);\n\n const startSplitResize = (e: React.MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsSplitResizing(true);\n splitResizeRef.current = {\n startX: e.clientX,\n startRatio: agentPaneRatio,\n };\n };\n\n useEffect(() => {\n if (!isSplitResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = splitContainerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const delta = e.clientX - splitResizeRef.current.startX;\n const nextLeftWidth = splitResizeRef.current.startRatio * rect.width + delta;\n setAgentPaneRatio(clampAgentPaneRatio(nextLeftWidth / rect.width));\n };\n\n const handleMouseUp = () => {\n setIsSplitResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isSplitResizing]);\n\n // Auto-scroll and focus terminal when restored from minimized state\n useEffect(() => {\n if (!isTerminalMinimized && terminalRef.current) {\n const iframe = terminalRef.current;\n // Small delay to allow layout to update and iframe to render\n setTimeout(() => {\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.scrollToBottom?.();\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n }\n } catch (e) {\n console.error('Failed to focus/scroll terminal on restore:', e);\n }\n }, 100);\n }\n }, [isTerminalMinimized]);\n\n // IDE Selection\n const [selectedIde, setSelectedIde] = useState<string>('vscode');\n\n useEffect(() => {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) {\n document.title = `${trimmedTitle} | Viba`;\n return () => {\n document.title = 'Viba';\n };\n }\n\n document.title = 'Viba';\n return undefined;\n }, [title]);\n\n useEffect(() => {\n const loadConfig = async () => {\n const config = await getConfig();\n if (config.selectedIde && SUPPORTED_IDES.some(ide => ide.id === config.selectedIde)) {\n setSelectedIde(config.selectedIde);\n }\n };\n loadConfig();\n }, []);\n\n useEffect(() => {\n setCurrentBaseBranch(baseBranch?.trim() || '');\n setBaseBranchOptions([]);\n }, [baseBranch, sessionName]);\n\n useEffect(() => {\n setTerminalInteractionMode('scroll');\n setIsUpdatingTerminalInteractionMode(false);\n terminalInteractionRequestIdRef.current += 1;\n }, [sessionName]);\n\n const handleIdeChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n setSelectedIde(value);\n await updateConfig({ selectedIde: value });\n };\n\n const handleOpenIde = () => {\n if (!worktree) return;\n const ide = SUPPORTED_IDES.find(i => i.id === selectedIde);\n if (!ide) return;\n\n const uri = `${ide.protocol}://file/${encodeURI(worktree)}`;\n window.open(uri, '_blank');\n };\n\n const applyTerminalInteractionMode = useCallback(async (\n mode: TerminalInteractionMode,\n options?: { silent?: boolean }\n ): Promise<boolean> => {\n if (terminalPersistenceMode !== 'tmux') return true;\n\n const requestId = ++terminalInteractionRequestIdRef.current;\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(true);\n }\n\n const mouseEnabled = mode === 'scroll';\n const [agentResult, terminalResult] = await Promise.all([\n setTmuxSessionMouseMode(sessionName, 'agent', mouseEnabled),\n setTmuxSessionMouseMode(sessionName, 'terminal', mouseEnabled),\n ]);\n\n if (requestId !== terminalInteractionRequestIdRef.current) {\n return false;\n }\n\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(false);\n }\n\n const failed = [agentResult, terminalResult].find((result) => !result.success);\n if (failed) {\n if (!options?.silent) {\n setFeedback(`Failed to switch to ${mode === 'scroll' ? 'scroll mode' : 'text select mode'}`);\n }\n return false;\n }\n\n if (!options?.silent) {\n setFeedback(mode === 'scroll' ? 'Terminal mode: Scroll' : 'Terminal mode: Text Select');\n }\n return true;\n }, [sessionName, terminalPersistenceMode]);\n\n const ensureTmuxStatusBarHidden = useCallback((slot: TerminalBootstrapSlot) => {\n if (terminalPersistenceMode !== 'tmux') return;\n if (tmuxStatusAppliedRef.current[slot]) return;\n\n void (async () => {\n const result = await setTmuxSessionStatusVisibility(sessionName, slot, false);\n if (result.success && result.applied) {\n tmuxStatusAppliedRef.current[slot] = true;\n } else if (!result.success) {\n console.error(`Failed to hide tmux status bar for ${slot}:`, result.error);\n }\n })();\n }, [sessionName, terminalPersistenceMode]);\n\n useEffect(() => {\n if (terminalPersistenceMode !== 'tmux') return;\n void applyTerminalInteractionMode('scroll', { silent: true });\n }, [applyTerminalInteractionMode, terminalPersistenceMode]);\n\n const handleToggleTerminalInteractionMode = useCallback(() => {\n if (terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode) return;\n\n const previousMode = terminalInteractionMode;\n const nextMode: TerminalInteractionMode = previousMode === 'scroll' ? 'select' : 'scroll';\n setTerminalInteractionMode(nextMode);\n\n void (async () => {\n const success = await applyTerminalInteractionMode(nextMode);\n if (!success) {\n setTerminalInteractionMode(previousMode);\n }\n })();\n }, [applyTerminalInteractionMode, isUpdatingTerminalInteractionMode, terminalInteractionMode, terminalPersistenceMode]);\n\n const handleShowDiffWithTrident = () => {\n if (!worktree || !branch) return;\n\n const params = new URLSearchParams({\n path: worktree,\n branch,\n });\n window.open(`${TRIDENT_WORKSPACE_URL}?${params.toString()}`, '_blank', 'noopener,noreferrer');\n };\n\n const handleNewAttempt = () => {\n if (!repo || !sessionName) return;\n const nextUrl = `/new?repo=${encodeURIComponent(repo)}&prefillFromSession=${encodeURIComponent(sessionName)}`;\n window.open(nextUrl, '_blank', 'noopener,noreferrer');\n };\n\n const runCleanup = async (requireConfirmation = true): Promise<boolean> => {\n if (!repo || !worktree || !branch) return false;\n if (requireConfirmation && !confirm('Are you sure you want to delete this session? This will remove the branch and worktree.')) return false;\n\n setCleanupError(null);\n setCleanupPhase('idle');\n setFeedback('Purging session...');\n\n try {\n const result = await deleteSessionInBackground(sessionName);\n if (!result.success) {\n console.error('Cleanup failed:', result.error || 'Unknown error');\n setCleanupPhase('error');\n setCleanupError(result.error || 'Failed to delete session');\n return false;\n }\n\n notifySessionsUpdated();\n } catch (error) {\n console.error('Cleanup request failed:', error);\n setCleanupPhase('error');\n setCleanupError(error instanceof Error ? error.message : 'Unknown error');\n return false;\n }\n\n // Use forced navigation here because App Router transitions can be\n // interrupted by iframe/server-action teardown in production builds.\n onExit(true);\n return true;\n };\n\n const handleCleanup = async () => {\n await runCleanup(true);\n };\n\n const sendPromptToAgentIframe = useCallback((prompt: string, action: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndSend = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win) {\n setTimeout(() => checkAndSend(attempts + 1), 300);\n return;\n }\n\n win.postMessage(\n {\n type: 'viba:agent-request',\n action,\n prompt,\n sessionName,\n branch,\n baseBranch: currentBaseBranch || undefined,\n timestamp: Date.now(),\n },\n '*'\n );\n\n if (!win.term) {\n setTimeout(() => checkAndSend(attempts + 1), 300);\n return;\n }\n\n win.term.paste(prompt);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n (textarea as HTMLElement).focus();\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to send prompt to agent iframe:', e);\n setTimeout(() => checkAndSend(attempts + 1), 300);\n }\n };\n\n checkAndSend();\n });\n }, [branch, currentBaseBranch, sessionName]);\n\n const handleCommit = async () => {\n setIsRequestingCommit(true);\n setFeedback('Requesting commit from agent...');\n\n const prompt = 'Please create a git commit with the current changes in this worktree.';\n const sent = await sendPromptToAgentIframe(prompt, 'commit');\n\n setFeedback(sent ? 'Commit request sent to agent' : 'Failed to send commit request to agent');\n setIsRequestingCommit(false);\n };\n\n const pasteIntoAgentIframe = useCallback((text: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndPaste = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win || !win.term) {\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n return;\n }\n\n win.term.paste(text);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n (textarea as HTMLElement).focus();\n }\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to paste into agent iframe:', e);\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n }\n };\n\n checkAndPaste();\n });\n }, []);\n\n const handleInsertFilePaths = useCallback(async (paths: string[]) => {\n if (paths.length === 0) return;\n\n setIsInsertingFilePaths(true);\n const textToInsert = `${paths.join(' ')} `;\n const inserted = await pasteIntoAgentIframe(textToInsert);\n setFeedback(\n inserted\n ? `Inserted ${paths.length} file path${paths.length === 1 ? '' : 's'} into agent input`\n : 'Failed to insert file paths into agent input'\n );\n setIsInsertingFilePaths(false);\n }, [pasteIntoAgentIframe]);\n\n const resolveComponentSourcePathByNames = useCallback(async (componentNames: string[]): Promise<{ resolvedName: string; sourcePath: string } | null> => {\n const normalizedNames = componentNames.map(normalizeComponentLookupName).filter(Boolean);\n if (normalizedNames.length === 0) return null;\n\n const roots = Array.from(\n new Set(\n [repo, worktree]\n .map((root) => (root || '').trim())\n .filter(Boolean)\n )\n );\n if (roots.length === 0) return null;\n\n for (const workspaceRoot of roots) {\n try {\n const response = await fetch('/api/component-source/resolve', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n componentNames: normalizedNames,\n workspaceRoot,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { resolvedName?: string; sourcePath?: string; error?: string } | null;\n if (!response.ok) {\n console.warn('Component source resolve miss', {\n componentNames: normalizedNames,\n workspaceRoot,\n error: payload?.error || response.statusText,\n });\n continue;\n }\n\n const sourcePath = typeof payload?.sourcePath === 'string' ? payload.sourcePath.trim() : '';\n const resolvedName = typeof payload?.resolvedName === 'string' ? payload.resolvedName.trim() : '';\n\n if (sourcePath && resolvedName) return { sourcePath, resolvedName };\n } catch (error) {\n console.error('Failed to resolve component source path:', error);\n }\n }\n\n return null;\n }, [repo, worktree]);\n\n const loadBaseBranchOptions = useCallback(async () => {\n if (!sessionName) return;\n if (isLoadingBaseBranchesRef.current) return;\n\n isLoadingBaseBranchesRef.current = true;\n setIsLoadingBaseBranches(true);\n\n try {\n const result = await listSessionBaseBranches(sessionName);\n if (result.success) {\n setBaseBranchOptions(result.branches ?? []);\n setCurrentBaseBranch(result.baseBranch?.trim() || '');\n } else if (result.error) {\n setFeedback(`Failed to load branches: ${result.error}`);\n }\n } catch (e) {\n console.error('Failed to load base branches:', e);\n } finally {\n isLoadingBaseBranchesRef.current = false;\n setIsLoadingBaseBranches(false);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n void loadBaseBranchOptions();\n }, [loadBaseBranchOptions, sessionName]);\n\n const loadSessionDivergence = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionDivergence(sessionName);\n if (result.success && typeof result.ahead === 'number' && typeof result.behind === 'number') {\n setDivergence({ ahead: result.ahead, behind: result.behind });\n }\n } catch (e) {\n console.error('Failed to load branch divergence:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName || !currentBaseBranch) {\n setDivergence({ ahead: 0, behind: 0 });\n return;\n }\n\n void loadSessionDivergence();\n const timer = window.setInterval(() => {\n void loadSessionDivergence();\n }, 60000);\n\n return () => window.clearInterval(timer);\n }, [currentBaseBranch, loadSessionDivergence, sessionName]);\n\n const handleBaseBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!sessionName) return;\n\n const nextBaseBranch = e.target.value.trim();\n if (!nextBaseBranch || nextBaseBranch === currentBaseBranch) return;\n\n setIsUpdatingBaseBranch(true);\n setFeedback(`Updating base branch to ${nextBaseBranch}...`);\n\n try {\n const result = await updateSessionBaseBranch(sessionName, nextBaseBranch);\n if (result.success && result.baseBranch) {\n setCurrentBaseBranch(result.baseBranch);\n setFeedback(`Base branch updated to ${result.baseBranch}`);\n await loadBaseBranchOptions();\n await loadSessionDivergence();\n } else {\n setFeedback(`Failed to update base branch: ${result.error}`);\n }\n } catch (error) {\n console.error('Failed to update base branch:', error);\n setFeedback('Failed to update base branch');\n } finally {\n setIsUpdatingBaseBranch(false);\n }\n };\n\n const loadUncommittedFileCount = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionUncommittedFileCount(sessionName);\n if (result.success && typeof result.count === 'number') {\n setUncommittedFileCount(result.count);\n }\n } catch (e) {\n console.error('Failed to load uncommitted file count:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n\n void loadUncommittedFileCount();\n const timer = window.setInterval(() => {\n void loadUncommittedFileCount();\n }, 10000);\n\n return () => window.clearInterval(timer);\n }, [loadUncommittedFileCount, sessionName]);\n\n const runMerge = async (): Promise<boolean> => {\n if (!sessionName) return false;\n if (!currentBaseBranch) return false;\n\n setIsMerging(true);\n setFeedback('Merging session branch...');\n\n try {\n const result = await mergeSessionToBase(sessionName);\n if (result.success) {\n setFeedback(`Merged ${result.branchName} into ${result.baseBranch}`);\n void loadSessionDivergence();\n return true;\n } else {\n setFeedback(`Merge failed: ${result.error}`);\n return false;\n }\n } catch (e) {\n console.error('Merge request failed:', e);\n setFeedback('Merge failed');\n return false;\n } finally {\n setIsMerging(false);\n }\n };\n\n const handleMerge = async () => {\n await runMerge();\n };\n\n const [isRebaseDropdownOpen, setIsRebaseDropdownOpen] = useState(false);\n const rebaseDropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (rebaseDropdownRef.current && !rebaseDropdownRef.current.contains(event.target as Node)) {\n setIsRebaseDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleRebaseSelect = async (targetBranch: string) => {\n setIsRebaseDropdownOpen(false);\n if (!sessionName) return;\n\n const isNewBranch = targetBranch !== currentBaseBranch;\n\n setIsRebasing(true);\n setFeedback(isNewBranch ? `Updating base to ${targetBranch} and rebasing...` : 'Rebasing session branch...');\n\n try {\n if (isNewBranch) {\n const updateResult = await updateSessionBaseBranch(sessionName, targetBranch);\n if (!updateResult.success) {\n setFeedback(`Failed to update base branch: ${updateResult.error}`);\n setIsRebasing(false);\n return;\n }\n setCurrentBaseBranch(updateResult.baseBranch!);\n await loadBaseBranchOptions();\n }\n\n const result = await rebaseSessionOntoBase(sessionName);\n if (result.success) {\n setFeedback(`Rebased ${result.branchName} onto ${result.baseBranch}`);\n void loadSessionDivergence();\n } else {\n setFeedback(`Rebase failed: ${result.error}`);\n }\n } catch (e) {\n console.error('Rebase request failed:', e);\n setFeedback('Rebase failed');\n } finally {\n setIsRebasing(false);\n }\n };\n\n const handleRebase = () => {\n setIsRebaseDropdownOpen(!isRebaseDropdownOpen);\n };\n\n const loadPreviewViaProxy = useCallback(async (rawUrl: string, openPreview: boolean): Promise<boolean> => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) {\n setFeedback('Please enter a preview URL');\n return false;\n }\n\n setPreviewInputUrl(normalized);\n setIsPreviewPickerActive(false);\n setFeedback(`Loading preview: ${normalized}`);\n\n try {\n const response = await fetch('/api/preview-proxy/start', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n target: normalized,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { error?: string; proxyUrl?: string } | null;\n if (!response.ok || !payload?.proxyUrl) {\n throw new Error(payload?.error || 'Failed to start preview proxy');\n }\n\n setPreviewUrl(payload.proxyUrl);\n if (openPreview) {\n setIsPreviewVisible(true);\n }\n setFeedback(`Loaded preview: ${normalized}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load preview';\n console.error('Failed to load preview via proxy:', error);\n setFeedback(`Failed to load preview: ${message}`);\n return false;\n }\n }, []);\n\n const handleTogglePreviewPicker = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Load a preview before picking elements');\n return;\n }\n\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return;\n }\n\n const nextState = !isPreviewPickerActive;\n previewWindow.postMessage({\n type: 'viba:preview-picker-toggle',\n active: nextState,\n }, '*');\n\n setIsPreviewPickerActive(nextState);\n setFeedback(nextState ? 'Picker enabled: click an element in the preview' : 'Picker disabled');\n }, [isPreviewPickerActive, previewUrl]);\n\n const postPreviewControlMessage = useCallback((payload: { action?: PreviewNavigationAction; type: string }) => {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return false;\n }\n\n previewWindow.postMessage(payload, '*');\n return true;\n }, []);\n\n const handlePreviewNavigate = useCallback((action: PreviewNavigationAction) => {\n if (!previewUrl) {\n setFeedback('Load a preview before using navigation controls');\n return;\n }\n\n if (!postPreviewControlMessage({ type: 'viba:preview-navigation', action })) {\n return;\n }\n\n if (action === 'reload') {\n setFeedback('Reloading preview...');\n }\n }, [postPreviewControlMessage, previewUrl]);\n\n const handlePreviewIframeLoad = useCallback(() => {\n postPreviewControlMessage({ type: 'viba:preview-location-request' });\n }, [postPreviewControlMessage]);\n\n const { attachTerminalLinkHandler } = useTerminalLink({\n onLoadPreview: loadPreviewViaProxy\n });\n\n useEffect(() => {\n if (!isPreviewVisible) return;\n if (previewInputUrl.trim()) return;\n\n const timer = window.setTimeout(() => {\n previewAddressInputRef.current?.focus();\n }, 0);\n\n return () => {\n window.clearTimeout(timer);\n };\n }, [isPreviewVisible, previewInputUrl]);\n\n useEffect(() => {\n const handlePreviewMessage = (event: MessageEvent) => {\n if (!previewIframeRef.current || event.source !== previewIframeRef.current.contentWindow) return;\n\n const payload = event.data as {\n active?: boolean;\n element?: unknown;\n type?: string;\n url?: unknown;\n } | null;\n if (!payload || typeof payload !== 'object') return;\n\n if (payload.type === 'viba:preview-picker-state') {\n setIsPreviewPickerActive(Boolean(payload.active));\n return;\n }\n\n if (payload.type === 'viba:preview-picker-ready') {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (previewWindow) {\n previewWindow.postMessage({ type: 'viba:preview-location-request' }, '*');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-link-open') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n window.open(payload.url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-location-change') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n setPreviewInputUrl(payload.url);\n }\n return;\n }\n\n if (payload.type === 'viba:preview-element-selected') {\n const selectedElement = (payload.element && typeof payload.element === 'object')\n ? payload.element as { reactComponentStack?: unknown[]; selector?: string | null }\n : null;\n const reactStack = Array.isArray(selectedElement?.reactComponentStack)\n ? selectedElement.reactComponentStack\n : [];\n const componentReference = buildComponentReferenceText(reactStack, worktree || repo);\n const firstReactComponent = reactStack[0] && typeof reactStack[0] === 'object'\n ? (reactStack[0] as { name?: unknown }).name\n : undefined;\n const fallbackName = typeof firstReactComponent === 'string' && firstReactComponent.trim().length > 0\n ? firstReactComponent.trim()\n : '';\n const builtInComponents = new Set([\n 'Suspense', 'ErrorBoundary', 'Router', 'AppRouter', 'LayoutRouter',\n 'RenderFromTemplateContext', 'ScrollAndFocusHandler', 'InnerLayoutRouter',\n 'RedirectErrorBoundary', 'NotFoundBoundary', 'LoadingBoundary',\n 'ReactDevOverlay', 'HotReload', 'AppContainer', 'Route', 'Link', 'Image',\n 'OuterLayoutRouter', 'Head', 'StringRefs', 'Fragment', 'Profiler',\n 'StrictMode', 'SuspenseList', 'Script', 'Page', '__next_root_layout_boundary__'\n ]);\n\n const stackComponentNames = Array.from(\n new Set(\n reactStack\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return '';\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? name.trim() : '';\n })\n .filter((name) => {\n if (!name) return false;\n if (builtInComponents.has(name)) return false;\n if (name.startsWith('styled.') || name.startsWith('Styled(')) return false;\n return true;\n })\n )\n );\n\n console.log('Filtered stack component names:', stackComponentNames);\n\n const identifier = componentReference\n || fallbackName\n || (typeof selectedElement?.selector === 'string' ? selectedElement.selector : '');\n\n console.log('Preview selected element:', selectedElement);\n console.log('Preview selected reactComponentStack:', reactStack);\n console.log('Preview selected identifier:', identifier);\n setIsPreviewPickerActive(false);\n\n if (!identifier) {\n setFeedback('Element selected. No identifier was resolved.');\n return;\n }\n\n void (async () => {\n let finalIdentifier = componentReference || '';\n\n if (!finalIdentifier && stackComponentNames.length > 0) {\n setIsResolvingElement(true);\n try {\n const result = await resolveComponentSourcePathByNames(stackComponentNames);\n if (result?.resolvedName && result?.sourcePath) {\n finalIdentifier = `${result.resolvedName} (${result.sourcePath})`;\n }\n } finally {\n setIsResolvingElement(false);\n }\n }\n\n if (!finalIdentifier) {\n if (stackComponentNames.length > 0) {\n setFeedback('Element selected, but source file path could not be resolved for the component');\n return;\n }\n finalIdentifier = identifier;\n }\n\n console.log('Final resolved component identifier:', finalIdentifier);\n\n const inserted = await pasteIntoAgentIframe(`${finalIdentifier} `);\n setFeedback(\n inserted\n ? `Element identifier sent to agent: ${finalIdentifier}`\n : 'Element selected, but failed to send identifier to agent input'\n );\n })();\n }\n };\n\n window.addEventListener('message', handlePreviewMessage);\n return () => {\n window.removeEventListener('message', handlePreviewMessage);\n };\n }, [pasteIntoAgentIframe, repo, resolveComponentSourcePathByNames, worktree]);\n\n useEffect(() => {\n setIsPreviewPickerActive(false);\n }, [previewUrl]);\n\n const handlePreviewSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void loadPreviewViaProxy(previewInputUrl, true);\n };\n\n const handleStartDevServer = () => {\n const script = devServerScript?.trim();\n if (!script || !terminalRef.current || isTerminalForegroundProcessRunning) return;\n\n // Auto-show terminal if minimized\n setIsTerminalMinimized(false);\n\n const iframe = terminalRef.current;\n setIsStartingDevServer(true);\n setFeedback('Starting dev server...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Failed to start dev server: terminal is not ready');\n setIsStartingDevServer(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.paste(script);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n if (textarea) (textarea as HTMLElement).focus();\n\n setFeedback('Dev server start command sent');\n setIsStartingDevServer(false);\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 300);\n }\n } catch (e) {\n console.error('Dev server injection error', e);\n setFeedback('Failed to start dev server');\n setIsStartingDevServer(false);\n }\n };\n\n checkAndInject();\n };\n\n const handleIframeLoad = () => {\n if (!iframeRef.current) return;\n const iframe = iframeRef.current;\n\n // Safety check for Same-Origin to avoid errors if proxy isn't working\n try {\n // Just accessing contentWindow to see if it throws\n const _ = iframe.contentWindow;\n } catch (e) {\n setFeedback(\"Error: Cross-Origin access blocked. Ensure proxy is working.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n setFeedback('Connecting to terminal...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Timeout waiting for terminal to be ready');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('agent');\n const term = win.term;\n attachTerminalLinkHandler(iframe, agentFrameLinkCleanupRef, {\n directOpenBehavior: 'new_tab',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n };\n } catch { /* ignore if API unavailable */ }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('agent');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('agent');\n setFeedback('Attached to persisted terminal');\n } else {\n setFeedback('Reconnected to terminal');\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('agent')) {\n setFeedback('Reconnected to terminal');\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n // Attempt injection\n\n // User instructions:\n // 1. paste cd command\n // 2. dispatch keypress 13\n\n const targetPath = worktree || repo; // Fallback to repo if no worktree\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n // Send cd command\n term.paste(cmd);\n\n // Helper to press enter\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n pressEnter();\n markTerminalBootstrapped('agent');\n\n // Inject agent command if present\n if (agent) {\n const startAgentProcess = async () => {\n let agentCmd = '';\n\n if (isResume) {\n // Resume logic (keep startup runtime flags but do not override model)\n if (agent.toLowerCase().includes('gemini')) {\n agentCmd = `gemini --resume latest --yolo`;\n } else if (agent.toLowerCase().includes('codex')) {\n agentCmd = `codex resume --last --sandbox danger-full-access --ask-for-approval on-request --search`;\n } else if (agent.toLowerCase() === 'agent' || agent.toLowerCase().includes('cursor')) {\n agentCmd = `agent resume`;\n } else {\n // Generic fallback: <agent> resume\n agentCmd = `${quoteShellArg(agent)} resume`;\n }\n } else {\n const safeTitle = title?.trim() || '';\n const trimmedInitialMessage = initialMessage?.trim() || '';\n const taskParts: string[] = [];\n if (safeTitle) taskParts.push(safeTitle);\n if (trimmedInitialMessage) taskParts.push(trimmedInitialMessage);\n const taskContent = taskParts.join('\\n\\n');\n const attachmentPaths = (attachmentNames || [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => `${worktree || repo}-attachments/${name}`);\n const taskSections: string[] = [];\n if (taskContent) taskSections.push(taskContent);\n if (attachmentPaths.length > 0) {\n taskSections.push([\n 'Attachments:',\n ...attachmentPaths.map((attachmentPath) => `- ${attachmentPath}`),\n ].join('\\n'));\n }\n const fullTaskContent = taskSections.join('\\n\\n');\n let safeMessage = '';\n\n // Send startup prompt when user provided a task or attachments.\n if (fullTaskContent) {\n const instructionLines: string[] = [];\n if (sessionMode === 'plan') {\n instructionLines.push(PLAN_MODE_STARTUP_INSTRUCTION);\n }\n instructionLines.push(AUTO_COMMIT_INSTRUCTION);\n\n const fullMessage = [\n '# Instructions',\n '',\n instructionLines.join('\\n'),\n '',\n '# Task',\n '',\n fullTaskContent,\n ].join('\\n');\n\n try {\n const result = await writeSessionPromptFile(sessionName, fullMessage);\n if (result.success && result.filePath) {\n safeMessage = ` \"$(cat ${quoteShellArg(result.filePath)})\"`;\n } else {\n console.error('Failed to write prompt file, falling back to inline prompt', result.error);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n } catch (err) {\n console.error('Exception writing prompt file', err);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n }\n\n const modelArg = (model && model.toLowerCase() !== 'auto') ? ` --model ${quoteShellArg(model)}` : '';\n\n if (agent.toLowerCase().includes('codex')) {\n // Codex: codex --model gpt-5.3-codex --sandbox danger-full-access --ask-for-approval on-request --search\n agentCmd = `codex${modelArg} --sandbox danger-full-access --ask-for-approval on-request --search${safeMessage}`;\n } else if (agent.toLowerCase().includes('gemini')) {\n // Gemini: gemini --model gemini-3-pro-preview --yolo\n agentCmd = `gemini${modelArg} --yolo${safeMessage}`;\n } else if (agent.toLowerCase() === 'agent' || agent.toLowerCase().includes('cursor')) {\n // Cursor: agent --model opus-4.6-thinking\n agentCmd = `agent${modelArg}${safeMessage}`;\n } else {\n // Generic fallback: <agent> --model <model>\n agentCmd = `${quoteShellArg(agent)}${modelArg}${safeMessage}`;\n }\n }\n\n if (agentCmd) {\n term.paste(agentCmd);\n pressEnter();\n setFeedback(isResume ? `Resumed session with ${agent}` : `Session started with ${agent}`);\n\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n };\n\n setTimeout(() => startAgentProcess(), 500); // Wait a bit for cd to finish\n } else {\n setFeedback(`Session started ${worktree ? '(Worktree)' : ''}`);\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n\n // Focus the iframe\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n\n } else {\n // Not ready yet\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n resetTerminalBootstrap('agent');\n console.error(\"Access error during injection:\", e);\n setFeedback('Error accessing terminal: ' + String(e));\n }\n };\n\n // Small delay to allow scripts to run\n setTimeout(() => checkAndInject(), 1000);\n };\n\n const handleTerminalLoad = () => {\n if (!terminalRef.current) return;\n const iframe = terminalRef.current;\n stopTerminalProcessMonitor();\n setIsTerminalForegroundProcessRunning(false);\n\n // Safety check\n try {\n const _ = iframe.contentWindow;\n } catch (e) {\n console.error(\"Secondary terminal: Cross-Origin access blocked.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('terminal');\n const term = win.term;\n attachTerminalLinkHandler(iframe, terminalFrameLinkCleanupRef, {\n onLinkActivated: () => setIsTerminalMinimized(true),\n directOpenBehavior: 'preview',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n };\n } catch { /* ignore if API unavailable */ }\n\n startTerminalProcessMonitor(iframe, term);\n\n // Enable auto-scroll to bottom on output\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n const scrollHandler = () => {\n const activeBuffer = xterm.buffer?.active as ({ baseY?: number; viewportY?: number } | undefined);\n const baseY = typeof activeBuffer?.baseY === 'number' ? activeBuffer.baseY : 0;\n const viewportY = typeof activeBuffer?.viewportY === 'number' ? activeBuffer.viewportY : baseY;\n\n // Only scroll if we are close to the bottom to allow reviewing history\n if (activeBuffer && (baseY - viewportY < 10)) {\n xterm.scrollToBottom?.();\n } else {\n // Fallback if buffer access fails or simple mode\n xterm.scrollToBottom?.();\n }\n };\n\n if (typeof xterm.onWriteParsed === 'function') {\n xterm.onWriteParsed(scrollHandler);\n } else {\n // Fallback for older xterm or different setups\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n const observer = new MutationObserver(scrollHandler);\n observer.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (e) {\n console.error('Failed to setup auto-scroll:', e);\n }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('terminal');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('terminal');\n }\n if (alreadyBootstrapped) {\n injectTerminalStartupScript(iframe, win, term);\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('terminal')) {\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n const targetPath = worktree || repo;\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n term.paste(cmd);\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n pressEnter();\n markTerminalBootstrapped('terminal');\n injectTerminalStartupScript(iframe, win, term);\n\n // Focus\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n setIsTerminalForegroundProcessRunning(false);\n resetTerminalBootstrap('terminal');\n console.error(\"Secondary terminal injection error\", e);\n }\n };\n\n setTimeout(() => checkAndInject(), 1000);\n };\n\n if (!repo) return <div className=\"p-4 text-error\">No repository specified</div>;\n\n if (cleanupPhase === 'error') {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"card w-96 bg-base-200 shadow-xl\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error\">Cleanup failed</h2>\n <p>{cleanupError || 'An unknown error occurred while cleaning up this session.'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => onExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const selectableBaseBranches = Array.from(new Set([\n ...(currentBaseBranch ? [currentBaseBranch] : []),\n ...baseBranchOptions\n ])).filter((branchOption) => branchOption !== branch || branchOption === currentBaseBranch);\n const terminalPanelRight = isTerminalMinimized\n ? `calc(${TERMINAL_MINIMIZED_VISIBLE_WIDTH}px - min(${terminalSize.width}px, calc(100vw - 2rem)))`\n : TERMINAL_PANEL_RIGHT_GAP;\n const hasDevServerScript = Boolean(devServerScript?.trim());\n const isDevButtonDisabled = !hasDevServerScript || isStartingDevServer || isTerminalForegroundProcessRunning;\n const devButtonTitle = !hasDevServerScript\n ? 'Set a dev server script to enable this button'\n : isTerminalForegroundProcessRunning\n ? 'A process is already running in the terminal'\n : 'Run dev server script in terminal';\n\n return (\n <div className={`flex flex-col h-screen w-full overflow-hidden bg-base-100 ${(isResizing || isSplitResizing) ? 'select-none' : ''}`}>\n {(isResizing || isSplitResizing) && (\n <div className={`fixed inset-0 z-[9999] ${isResizing ? 'cursor-nwse-resize' : 'cursor-col-resize'}`} />\n )}\n <div className=\"z-20 bg-base-300/95 p-2 text-xs flex justify-between px-4 font-mono select-none items-center shadow-md backdrop-blur-sm border-b border-base-content/10\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 px-1 hover:bg-base-content/10\"\n onClick={() => onExit()}\n title=\"Back to Home\"\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"opacity-50\">Repo:</span>\n <span className=\"font-bold\">{getBaseName(repo)}</span>\n </div>\n {sessionName && (\n <div className=\"hidden min-[1200px]:flex min-w-0 items-center gap-2 text-[10px] opacity-70\">\n <span>Session:</span>\n <span className=\"truncate max-w-[220px]\" title={sessionName}>{sessionName}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden\">\n <select\n className=\"select select-xs h-6 min-h-6 bg-base-200 border-none focus:outline-none rounded-none pr-7\"\n value={selectedIde}\n onChange={handleIdeChange}\n >\n {SUPPORTED_IDES.map(ide => (\n <option key={ide.id} value={ide.id}>{ide.name}</option>\n ))}\n </select>\n <div className=\"w-[1px] h-4 bg-base-content/20\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none hover:bg-base-content/10\"\n onClick={handleOpenIde}\n title={`Open in ${SUPPORTED_IDES.find(i => i.id === selectedIde)?.name}`}\n >\n <ExternalLink className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Open</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleShowDiffWithTrident}\n disabled={!worktree || !branch}\n title=\"Open this worktree and branch in Trident\"\n >\n <GitBranch className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Diff</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleCommit}\n disabled={isRequestingCommit}\n title=\"Ask agent to create a commit with current changes\"\n >\n {isRequestingCommit ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitCommitHorizontal className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Commit ({uncommittedFileCount})</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={() => setIsFileBrowserOpen(true)}\n disabled={isInsertingFilePaths}\n title=\"Browse files and insert absolute paths into the agent input\"\n >\n {isInsertingFilePaths ? <span className=\"loading loading-spinner loading-xs\"></span> : <FolderOpen className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Add Files</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleNewAttempt}\n title=\"Start a new attempt in a new tab with this session context\"\n >\n <Plus className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>New Attempt</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleStartDevServer}\n disabled={isDevButtonDisabled}\n title={devButtonTitle}\n >\n {isStartingDevServer ? <span className=\"loading loading-spinner loading-xs\"></span> : <Play className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Dev</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={() => setIsPreviewVisible((previous) => !previous)}\n title={isPreviewVisible ? 'Hide preview panel' : 'Show preview panel'}\n >\n <Globe className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>{isPreviewVisible ? 'Close' : 'Preview'}</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className={`btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10 ${terminalInteractionMode === 'select' ? 'text-warning' : ''}`}\n onClick={handleToggleTerminalInteractionMode}\n disabled={terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode}\n title={terminalPersistenceMode === 'tmux'\n ? (terminalInteractionMode === 'scroll'\n ? 'Switch to text select mode for easier copy'\n : 'Switch to scroll mode for wheel scrollback')\n : 'Mode toggle is available only in tmux persistence mode'}\n >\n {isUpdatingTerminalInteractionMode ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <MousePointer2 className=\"w-3 h-3\" />\n )}\n <span>{terminalInteractionMode === 'scroll' ? 'Scroll Mode' : 'Text Select'}</span>\n </button>\n </div>\n\n\n\n <div className=\"flex items-center border border-base-content/20 rounded relative bg-base-100\" ref={rebaseDropdownRef}>\n <div className=\"relative\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none rounded-l h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleRebase}\n disabled={isRebasing || isMerging || isUpdatingBaseBranch}\n title=\"Select base branch and rebase\"\n >\n {isRebasing ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitPullRequestArrow className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Rebase</span>\n <ChevronDown className=\"w-3 h-3 opacity-50 ml-0.5\" />\n </button>\n {isRebaseDropdownOpen && (\n <div className=\"absolute top-full left-0 z-50 mt-1 w-64 p-0 shadow-xl dropdown-content bg-base-200 rounded-box border border-base-content/20 flex flex-col max-h-80 overflow-hidden\">\n <div className=\"px-4 py-2 text-[10px] uppercase font-bold tracking-wider opacity-50 border-b border-base-content/10 bg-base-200 flex justify-between items-center shrink-0\">\n <span>Select Base Branch</span>\n {(isLoadingBaseBranches || isUpdatingBaseBranch) && <span className=\"loading loading-spinner loading-xs\"></span>}\n </div>\n <ul className=\"menu p-0 overflow-y-auto flex-nowrap custom-scrollbar overflow-x-hidden w-full\">\n {selectableBaseBranches.length > 0 ? (\n selectableBaseBranches.map((branchOption) => (\n <li key={branchOption}>\n <button\n onClick={() => handleRebaseSelect(branchOption)}\n className={`flex justify-between items-center text-xs py-2 truncate max-w-full rounded-none ${branchOption === currentBaseBranch ? 'active font-bold' : ''}`}\n title={branchOption}\n >\n <span className=\"truncate\">{branchOption}</span>\n {branchOption === currentBaseBranch && <span className=\"opacity-70 text-[10px] ml-2 shrink-0\">(Current)</span>}\n </button>\n </li>\n ))\n ) : (\n <li className=\"text-xs px-4 py-2 opacity-50 italic text-center\">No other branches found</li>\n )}\n <div className=\"divider my-1 opacity-50\"></div>\n <li>\n <button onClick={() => void loadBaseBranchOptions()} className=\"text-[10px] justify-center opacity-70 hover:opacity-100\">\n Refresh Branches\n </button>\n </li>\n </ul>\n </div>\n )}\n </div>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs btn-success rounded-none h-6 min-h-6 border-none px-2 hover:bg-success/20 hover:border-transparent\"\n onClick={handleMerge}\n disabled={isMerging || isRebasing || isUpdatingBaseBranch || !currentBaseBranch}\n title={currentBaseBranch ? `Merge current branch (${branch}) into target branch (${currentBaseBranch})` : 'Target branch unavailable for this session'}\n >\n {isMerging ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitMerge className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Merge</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-error btn-xs rounded-none rounded-r h-6 min-h-6 border-none px-2 hover:bg-error/20 hover:border-transparent\"\n onClick={handleCleanup}\n disabled={isMerging || isRebasing || !worktree}\n title=\"Clean up and exit\"\n >\n <Trash2 className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Purge</span>\n </button>\n </div>\n\n {currentBaseBranch && (\n <div className=\"flex items-center gap-2 text-xs opacity-80\" title={`Divergence against ${currentBaseBranch}`}>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowUp className=\"w-3 h-3\" />\n {divergence.ahead}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowDown className=\"w-3 h-3\" />\n {divergence.behind}\n </span>\n </div>\n )}\n\n <div className=\"hidden min-[1200px]:block w-[1px] h-4 bg-base-content/20 mx-2\"></div>\n\n <div className=\"hidden min-[1200px]:flex min-w-0 max-w-[280px] items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${feedback.includes('Error') || feedback.includes('failed') ? 'bg-error' : feedback.includes('started') || feedback.includes('Merged') || feedback.includes('Rebased') || feedback.includes('sent') ? 'bg-success' : 'bg-warning'}`}></span>\n <span className=\"truncate\" title={feedback}>{feedback}</span>\n </div>\n\n </div>\n </div>\n\n <div ref={splitContainerRef} className=\"flex min-h-0 flex-1 w-full\">\n <div\n className=\"h-full min-w-0\"\n style={{ width: isPreviewVisible ? `${agentPaneRatio * 100}%` : '100%' }}\n >\n <iframe\n ref={iframeRef}\n src={agentTerminalSrc}\n className={`h-full w-full border-none dark:invert dark:brightness-90 ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleIframeLoad}\n />\n </div>\n\n {isPreviewVisible && (\n <>\n <div\n className=\"relative h-full w-2 shrink-0 cursor-col-resize bg-base-300/40 hover:bg-base-content/20\"\n onMouseDown={startSplitResize}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize preview panel\"\n title=\"Drag to resize preview panel\"\n >\n <div className=\"absolute left-1/2 top-1/2 h-12 w-[2px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-base-content/30\" />\n </div>\n <div className=\"flex h-full min-w-0 flex-1 flex-col border-l border-base-content/10 bg-base-200/50\">\n <form\n className=\"flex items-center gap-2 border-b border-base-content/10 bg-base-200 px-3 py-2\"\n onSubmit={handlePreviewSubmit}\n >\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('back')}\n disabled={!previewUrl}\n title=\"Go back\"\n aria-label=\"Go back\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('forward')}\n disabled={!previewUrl}\n title=\"Go forward\"\n aria-label=\"Go forward\"\n >\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('reload')}\n disabled={!previewUrl}\n title=\"Reload preview\"\n aria-label=\"Reload preview\"\n >\n <RotateCw className=\"h-3.5 w-3.5\" />\n </button>\n <input\n ref={previewAddressInputRef}\n type=\"text\"\n className=\"input input-xs input-bordered w-full font-mono\"\n value={previewInputUrl}\n onChange={(event) => setPreviewInputUrl(event.target.value)}\n placeholder=\"http://127.0.0.1:3000\"\n spellCheck={false}\n />\n <button\n className={`btn btn-ghost btn-xs ${isPreviewPickerActive ? 'btn-active text-success' : ''}`}\n type=\"button\"\n onClick={handleTogglePreviewPicker}\n disabled={!previewUrl || isResolvingElement}\n title={isPreviewPickerActive ? 'Disable picker' : 'Pick element from preview'}\n >\n {isResolvingElement ? (\n <span className=\"loading loading-spinner loading-xs w-3 h-3\"></span>\n ) : (\n <MousePointer2 className=\"h-3 w-3\" />\n )}\n </button>\n <button className=\"btn btn-xs\" type=\"submit\">\n Go\n </button>\n </form>\n <div className=\"min-h-0 flex-1\">\n {previewUrl ? (\n <iframe\n ref={previewIframeRef}\n src={previewUrl}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n title=\"Dev server preview\"\n onLoad={handlePreviewIframeLoad}\n sandbox=\"allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-downloads\"\n />\n ) : (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs opacity-70\">\n Run the dev server, or enter a URL above to load a preview.\n </div>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* floating terminal panel */}\n <div\n className={`absolute z-30 overflow-hidden rounded-lg border border-base-content/20 bg-base-200/95 shadow-2xl backdrop-blur-sm ${(isResizing || isSplitResizing) ? '' : 'transition-all'}`}\n style={{\n bottom: 80,\n right: terminalPanelRight,\n width: terminalSize.width,\n height: isTerminalMinimized ? TERMINAL_HEADER_HEIGHT : terminalSize.height,\n maxWidth: 'calc(100vw - 2rem)',\n maxHeight: 'calc(100vh - 2rem)'\n }}\n >\n <button\n className={`absolute left-0 top-0 z-50 flex h-10 w-10 items-center justify-center text-base-content/30 hover:text-base-content/60 ${isTerminalMinimized ? 'cursor-pointer' : 'cursor-nwse-resize'}`}\n onMouseDown={!isTerminalMinimized ? startResize : undefined}\n onClick={isTerminalMinimized ? () => setIsTerminalMinimized(false) : undefined}\n title={isTerminalMinimized ? 'Expand terminal' : \"Drag to resize\"}\n type=\"button\"\n >\n <Grip size={14} />\n </button>\n {!isTerminalMinimized && (\n <button\n className=\"flex h-10 w-full items-center justify-between px-3 pl-10 text-xs font-mono hover:bg-base-content/10\"\n onClick={() => setIsTerminalMinimized((prev) => !prev)}\n title=\"Minimize terminal\"\n type=\"button\"\n >\n <span>Terminal</span>\n <span className=\"opacity-70\">Hide</span>\n </button>\n )}\n <div className={isTerminalMinimized ? 'h-0 overflow-hidden' : 'h-[calc(100%-2.5rem)]'}>\n <iframe\n ref={terminalRef}\n src={floatingTerminalSrc}\n className={`h-full w-full border-none dark:invert dark:brightness-90 ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleTerminalLoad}\n />\n </div>\n </div>\n\n {isFileBrowserOpen && (\n <SessionFileBrowser\n initialPath={lastFileBrowserPath}\n worktreePath={worktree}\n onPathChange={setLastFileBrowserPath}\n onConfirm={(paths) => {\n setIsFileBrowserOpen(false);\n void handleInsertFilePaths(paths);\n }}\n onCancel={() => setIsFileBrowserOpen(false)}\n />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40b6e815122e5b4d6b98b5fb7a336ad40b2564c99e\":\"consumeSessionLaunchContext\"},\"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_3=/*#__PURE__*/createServerReference(\"40b6e815122e5b4d6b98b5fb7a336ad40b2564c99e\",callServer,void 0,findSourceMapURL,\"consumeSessionLaunchContext\");export{$$RSC_SERVER_ACTION_3 as consumeSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"404d24109de8bb61671e00b9b7379d40e579183eb6\":\"getSessionMetadata\"},\"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_6=/*#__PURE__*/createServerReference(\"404d24109de8bb61671e00b9b7379d40e579183eb6\",callServer,void 0,findSourceMapURL,\"getSessionMetadata\");export{$$RSC_SERVER_ACTION_6 as getSessionMetadata};","/* __next_internal_action_entry_do_not_use__ [{\"40e4cd4d40fb73138081883240099c3f295500a6c8\":\"markSessionInitialized\"},\"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_9=/*#__PURE__*/createServerReference(\"40e4cd4d40fb73138081883240099c3f295500a6c8\",callServer,void 0,findSourceMapURL,\"markSessionInitialized\");export{$$RSC_SERVER_ACTION_9 as markSessionInitialized};","/* __next_internal_action_entry_do_not_use__ [{\"7fe0bdb7b4c9895ccea50fa8030f786e98e1479a52\":\"getSessionTerminalSources\"},\"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_9=/*#__PURE__*/createServerReference(\"7fe0bdb7b4c9895ccea50fa8030f786e98e1479a52\",callServer,void 0,findSourceMapURL,\"getSessionTerminalSources\");export{$$RSC_SERVER_ACTION_9 as getSessionTerminalSources};","export const normalizePreviewUrl = (rawValue: string): string | null => {\n const trimmed = rawValue.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return null;\n return `http://${trimmed}`;\n};\n","export const quoteShellArg = (value: string): string => `'${value.replace(/'/g, \"'\\\\''\")}'`;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]];\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/chevron-down\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 ChevronDown = createLucideIcon('chevron-down', __iconNode);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/chevron-left\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 ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","export type TerminalSessionRole = 'agent' | 'terminal';\nexport type GitRemoteProvider = 'github' | 'gitlab';\nexport type TerminalSessionEnvironment = {\n name: 'GITHUB_TOKEN' | 'GITLAB_TOKEN';\n value: string;\n};\ntype DetectGitRemoteProviderOptions = {\n gitlabHosts?: string[];\n};\n\nfunction sanitizeTmuxSessionName(value: string): string {\n const safe = value.trim().replace(/[^a-zA-Z0-9_-]/g, '-');\n return safe || 'session';\n}\n\nexport function getTmuxSessionName(sessionName: string, role: TerminalSessionRole): string {\n return `viba-${sanitizeTmuxSessionName(sessionName).slice(0, 40)}-${role}`;\n}\n\nfunction normalizeGitRemoteUrl(remoteUrl: string): string {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return '';\n\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (!scpLikeMatch) {\n return '';\n }\n\n const userPart = scpLikeMatch[1] || '';\n const host = scpLikeMatch[2];\n const path = scpLikeMatch[3].replace(/^\\/+/, '');\n return `ssh://${userPart}${host}/${path}`;\n}\n\nexport function parseGitRemoteHost(remoteUrl: string): string | null {\n const normalized = normalizeGitRemoteUrl(remoteUrl);\n if (!normalized) return null;\n\n try {\n return new URL(normalized).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction normalizeKnownHost(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n return new URL(trimmed).hostname.toLowerCase();\n } catch {\n // Fall through to parse as a bare host (optionally with port).\n }\n\n try {\n return new URL(`ssh://${trimmed}`).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nexport function detectGitRemoteProvider(\n remoteUrl: string,\n options?: DetectGitRemoteProviderOptions,\n): GitRemoteProvider | null {\n const host = parseGitRemoteHost(remoteUrl);\n if (!host) return null;\n\n if (host === 'github.com' || host.includes('github')) {\n return 'github';\n }\n\n if (host === 'gitlab.com' || host.includes('gitlab')) {\n return 'gitlab';\n }\n\n if (options?.gitlabHosts?.some((knownHost) => normalizeKnownHost(knownHost) === host)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function buildTtydTerminalSrc(\n sessionName: string,\n role: TerminalSessionRole,\n environment?: TerminalSessionEnvironment | null,\n): string {\n const tmuxSession = getTmuxSessionName(sessionName, role);\n const params = new URLSearchParams();\n params.append('arg', 'new-session');\n if (environment?.value) {\n params.append('arg', '-e');\n params.append('arg', `${environment.name}=${environment.value}`);\n }\n params.append('arg', '-A');\n params.append('arg', '-s');\n params.append('arg', tmuxSession);\n return `/terminal?${params.toString()}`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '5', r: '1', key: 'gxeob9' }],\n ['circle', { cx: '19', cy: '5', r: '1', key: 'w8mnmm' }],\n ['circle', { cx: '5', cy: '5', r: '1', key: 'lttvr7' }],\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n ['circle', { cx: '12', cy: '19', r: '1', key: 'lyex9k' }],\n ['circle', { cx: '19', cy: '19', r: '1', key: 'shf9b7' }],\n ['circle', { cx: '5', cy: '19', r: '1', key: 'bfqh0e' }],\n];\n\n/**\n * @component @name Grip\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grip\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 Grip = createLucideIcon('grip', __iconNode);\n\nexport default Grip;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v18', key: '108xh3' }],\n ['path', { d: 'M3 12h18', key: '1i2n21' }],\n ['rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', key: 'h1oib' }],\n];\n\n/**\n * @component @name Grid2x2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grid-2x2\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 Grid2x2 = createLucideIcon('grid-2x2', __iconNode);\n\nexport default Grid2x2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n];\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-up\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 ArrowUp = createLucideIcon('arrow-up', __iconNode);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n [\n 'path',\n {\n d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2',\n key: '116196',\n },\n ],\n];\n\n/**\n * @component @name Clipboard\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clipboard\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 Clipboard = createLucideIcon('clipboard', __iconNode);\n\nexport default Clipboard;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '5', cy: '6', r: '3', key: '1qnov2' }],\n ['path', { d: 'M5 9v12', key: 'ih889a' }],\n ['circle', { cx: '19', cy: '18', r: '3', key: '1qljk2' }],\n ['path', { d: 'm15 9-3-3 3-3', key: '1lwv8l' }],\n ['path', { d: 'M12 6h5a2 2 0 0 1 2 2v7', key: '1yj91y' }],\n];\n\n/**\n * @component @name GitPullRequestArrow\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-pull-request-arrow\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 GitPullRequestArrow = createLucideIcon('git-pull-request-arrow', __iconNode);\n\nexport default GitPullRequestArrow;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 17v5', key: 'bb1du9' }],\n [\n 'path',\n {\n d: 'M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z',\n key: '1nkz8b',\n },\n ],\n];\n\n/**\n * @component @name Pin\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pin\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 Pin = createLucideIcon('pin', __iconNode);\n\nexport default Pin;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20', key: '13o1zl' }],\n ['path', { d: 'M2 12h20', key: '9i4pu4' }],\n];\n\n/**\n * @component @name Globe\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/globe\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 Globe = createLucideIcon('globe', __iconNode);\n\nexport default Globe;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/house\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 House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n ['line', { x1: '3', x2: '9', y1: '12', y2: '12', key: '1dyftd' }],\n ['line', { x1: '15', x2: '21', y1: '12', y2: '12', key: 'oup4p8' }],\n];\n\n/**\n * @component @name GitCommitHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-commit-horizontal\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 GitCommitHorizontal = createLucideIcon('git-commit-horizontal', __iconNode);\n\nexport default GitCommitHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n];\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-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 ArrowRight = createLucideIcon('arrow-right', __iconNode);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8', key: '1p45f6' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n];\n\n/**\n * @component @name RotateCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/rotate-cw\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 RotateCw = createLucideIcon('rotate-cw', __iconNode);\n\nexport default RotateCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n ['circle', { cx: '6', cy: '6', r: '3', key: '1lh9wr' }],\n ['path', { d: 'M6 21V9a9 9 0 0 0 9 9', key: '7kw0sc' }],\n];\n\n/**\n * @component @name GitMerge\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-merge\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 GitMerge = createLucideIcon('git-merge', __iconNode);\n\nexport default GitMerge;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 5v14', key: 's699le' }],\n ['path', { d: 'm19 12-7 7-7-7', key: '1idqje' }],\n];\n\n/**\n * @component @name ArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-down\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 ArrowDown = createLucideIcon('arrow-down', __iconNode);\n\nexport default ArrowDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 5h.01', key: '18ugdj' }],\n ['path', { d: 'M3 12h.01', key: 'nlz23k' }],\n ['path', { d: 'M3 19h.01', key: 'noohij' }],\n ['path', { d: 'M8 5h13', key: '1pao27' }],\n ['path', { d: 'M8 12h13', key: '1za7za' }],\n ['path', { d: 'M8 19h13', key: 'm83p4d' }],\n];\n\n/**\n * @component @name List\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/list\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 List = createLucideIcon('list', __iconNode);\n\nexport default List;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 17v5', key: 'bb1du9' }],\n ['path', { d: 'M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89', key: 'znwnzq' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11',\n key: 'c9qhm2',\n },\n ],\n];\n\n/**\n * @component @name PinOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pin-off\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 PinOff = createLucideIcon('pin-off', __iconNode);\n\nexport default PinOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 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.9H18a2 2 0 0 1 2 2v2',\n key: 'usdka0',\n },\n ],\n];\n\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/folder-open\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 FolderOpen = createLucideIcon('folder-open', __iconNode);\n\nexport default FolderOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'M10 9H8', key: 'b1mrlr' }],\n ['path', { d: 'M16 13H8', key: 't4e002' }],\n ['path', { d: 'M16 17H8', key: 'z1uh3a' }],\n];\n\n/**\n * @component @name FileText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-text\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 FileText = createLucideIcon('file-text', __iconNode);\n\nexport default FileText;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z',\n key: 'edeuup',\n },\n ],\n];\n\n/**\n * @component @name MousePointer2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/mouse-pointer-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 MousePointer2 = createLucideIcon('mouse-pointer-2', __iconNode);\n\nexport default MousePointer2;\n","import { useCallback } from 'react';\nimport type { MutableRefObject } from 'react';\nimport { normalizePreviewUrl } from '@/lib/url';\n\nexport type TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n scrollToBottom?: () => void;\n buffer?: {\n active?: {\n baseY: number;\n cursorY: number;\n getLine?: (lineIndex: number) => { translateToString: (trimRight?: boolean) => string } | undefined;\n };\n };\n options: {\n linkHandler?: TerminalLinkHandler | null;\n theme?: Record<string, string>;\n [key: string]: unknown;\n };\n _core?: {\n _linkProviderService?: {\n linkProviders?: Map<number, TerminalLinkProvider>;\n };\n };\n };\n};\n\nexport type TerminalLinkProvider = {\n _handler?: (event: MouseEvent | undefined, url: string) => void;\n provideLinks?: (line: number, callback: (links: TerminalLink[] | undefined) => void) => void;\n};\n\nexport type TerminalLink = {\n text: string;\n activate?: (event: MouseEvent | undefined, text: string) => void;\n [key: string]: unknown;\n};\n\nexport type TerminalLinkHandler = {\n allowNonHttpProtocols?: boolean;\n activate?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n hover?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n leave?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n};\n\nexport type TerminalLinkHandlerOptions = {\n onLinkActivated?: () => void;\n directOpenBehavior?: TerminalLinkOpenBehavior;\n modifierOpenBehavior?: TerminalLinkOpenBehavior;\n};\n\ninterface UseTerminalLinkProps {\n onLoadPreview: (url: string, openPreview: boolean) => Promise<boolean>;\n}\n\nexport type TerminalLinkOpenBehavior = 'preview' | 'new_tab';\n\nexport function useTerminalLink({ onLoadPreview }: UseTerminalLinkProps) {\n const handleTerminalLinkOpen = useCallback((rawUrl: string, openBehavior: TerminalLinkOpenBehavior): boolean => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) return false;\n\n if (openBehavior === 'new_tab') {\n window.open(normalized, '_blank', 'noopener,noreferrer');\n return true;\n }\n\n void onLoadPreview(normalized, true);\n return true;\n }, [onLoadPreview]);\n\n const attachTerminalLinkHandler = useCallback((\n iframe: HTMLIFrameElement,\n cleanupRef: MutableRefObject<(() => void) | null>,\n options?: TerminalLinkHandlerOptions\n ) => {\n cleanupRef.current?.();\n const frameWindow = iframe.contentWindow as TerminalWindow | null;\n const terminal = frameWindow?.term;\n if (!frameWindow || !terminal) return;\n const notifyLinkActivated = options?.onLinkActivated;\n const directOpenBehavior = options?.directOpenBehavior ?? 'preview';\n const modifierOpenBehavior = options?.modifierOpenBehavior ?? 'new_tab';\n const resolveOpenBehavior = (openWithModifier: boolean): TerminalLinkOpenBehavior => (\n openWithModifier ? modifierOpenBehavior : directOpenBehavior\n );\n\n const restorers: Array<() => void> = [];\n\n const frameDocument = iframe.contentDocument;\n let lastModifierState = {\n metaKey: false,\n ctrlKey: false,\n at: 0,\n };\n\n if (frameDocument) {\n const recordModifierState = (event: MouseEvent) => {\n lastModifierState = {\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n at: Date.now(),\n };\n };\n\n frameDocument.addEventListener('mousedown', recordModifierState, true);\n frameDocument.addEventListener('click', recordModifierState, true);\n restorers.push(() => {\n frameDocument.removeEventListener('mousedown', recordModifierState, true);\n frameDocument.removeEventListener('click', recordModifierState, true);\n });\n }\n\n const originalOpen = frameWindow.open.bind(frameWindow);\n const patchedOpen: Window['open'] = (...args) => {\n const openWithModifier = Date.now() - lastModifierState.at < 1000;\n const shouldTreatAsModifierOpen = openWithModifier && (lastModifierState.metaKey || lastModifierState.ctrlKey);\n const openBehavior = resolveOpenBehavior(shouldTreatAsModifierOpen);\n\n if (typeof args[0] === 'string' && args[0].trim()) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(args[0], openBehavior);\n if (handled) {\n return null;\n }\n return originalOpen(...args);\n }\n\n if (args.length === 0) {\n let fallbackWindow: Window | null = null;\n const syntheticWindow = {\n opener: null,\n location: {\n set href(url: string) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(url, openBehavior);\n\n if (!handled) {\n fallbackWindow = originalOpen();\n if (fallbackWindow) {\n try {\n fallbackWindow.opener = null;\n } catch {\n // Ignore opener assignment failures\n }\n fallbackWindow.location.href = url;\n }\n }\n },\n get href() {\n return '';\n },\n },\n } as unknown as Window;\n\n return syntheticWindow;\n }\n\n return originalOpen(...args);\n };\n\n frameWindow.open = patchedOpen;\n restorers.push(() => {\n frameWindow.open = originalOpen;\n });\n\n const providers = terminal._core?._linkProviderService?.linkProviders;\n\n if (providers instanceof Map) {\n for (const provider of providers.values()) {\n if (!provider || typeof provider !== 'object') continue;\n\n if (typeof provider._handler === 'function') {\n const originalHandler = provider._handler;\n provider._handler = (event: MouseEvent | undefined, url: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalHandler(event, url);\n }\n };\n\n restorers.push(() => {\n provider._handler = originalHandler;\n });\n }\n\n if (typeof provider.provideLinks === 'function') {\n const originalProvideLinks = provider.provideLinks.bind(provider);\n provider.provideLinks = (line: number, callback: (links: TerminalLink[] | undefined) => void) => {\n originalProvideLinks(line, (links: TerminalLink[] | undefined) => {\n if (Array.isArray(links)) {\n for (const link of links) {\n if (!link || typeof link !== 'object') continue;\n if (typeof link.activate !== 'function') continue;\n\n const originalActivate = link.activate.bind(link);\n link.activate = (event: MouseEvent | undefined, text: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(text, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalActivate(event, text);\n }\n };\n }\n }\n callback(links);\n });\n };\n\n restorers.push(() => {\n provider.provideLinks = originalProvideLinks;\n });\n }\n }\n }\n\n const existingLinkHandler = terminal.options.linkHandler;\n const nextLinkHandler: TerminalLinkHandler = {\n allowNonHttpProtocols: existingLinkHandler?.allowNonHttpProtocols ?? false,\n activate: (event, url, range) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n existingLinkHandler?.activate?.(event, url, range);\n }\n },\n hover: (event, url, range) => {\n existingLinkHandler?.hover?.(event, url, range);\n },\n leave: (event, url, range) => {\n existingLinkHandler?.leave?.(event, url, range);\n },\n };\n\n terminal.options.linkHandler = nextLinkHandler;\n restorers.push(() => {\n terminal.options.linkHandler = existingLinkHandler ?? null;\n });\n\n cleanupRef.current = () => {\n for (const restore of restorers) {\n restore();\n }\n cleanupRef.current = null;\n };\n }, [handleTerminalLinkOpen]);\n\n return { handleTerminalLinkOpen, attachTerminalLinkHandler };\n}\n"],"names":[],"mappings":"wDCEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OWH4L,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,6BZA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,wBEAhI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kCCAjJ,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,sBCAvI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,yBCAxI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA3I,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,0BCA5I,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCAnI,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kCIenb,IAAA,EAAA,EAAA,CAAA,CAAA,MAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,gNkBVqD,CRAP,ACAI,AOAG,AJAL,GAAA,6BOcd,wEAfnB,GAAA,2NPCA,GAAA,uBAAiC,CJAF,AWAA,APAE,qCACf,IAAK,CKYF,AQZ3B,AfYwB,AFZK,AgBA7B,AZA6B,ASAN,AEAvB,AHY0B,AFAD,CDAE,ALZE,AWA7B,ACAA,AJY0B,AFAD,AOZzB,AfYwB,AFZK,+DVStC,IAAA,EAAA,EAAA,CAAA,CAAA,uQyBQmD,CEAZ,AFAY,CEAZ,AFAY,CEAZ,AFAY,CEAZ,AjBZQ,AeYI,4QjBrBuB,CAAA,ADAF,CCAE,ADAF,CAAA,ACAE,CDAF,ACAE,CDAF,ACAE,CDAF,ACAE,IAAW,CAAA,EEuB/E,CgBZH,CAAA,CAAA,EAAA,EAAA,OAAA,AhBYU,EAAA,2BAtBY,CFYL,AUZK,AKAT,ACAA,ALAA,ACAA,AbYI,AcZK,ACAT,AXAA,ADAS,AEAT,ACAS,ACAD,ACAR,ACAS,ACAT,ECAS,oORKN,IAAK,CaAR,AbAQ,CAAA,AaAR,CbAQ,AaAR,ObAqB,CaAJ,AbAI,CAAA,AaAJ,CAAA,AbAI,CAAA,IAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAU,CAAA,oEAEhC,CaYZ,AGZG,AhBAS,CAAA,AaYZ,AGZG,ChBAS,uBAAuB,EAAU,WAC7C,CAAE,GAAA,oEHTuB,MCAA,ADAA,CAAQ,CCAA,ADAA,AAAE,EAAA,8BAAmC,EPanF,IAAA,EAAA,EAAA,CAAA,CAAA,yBgBIc,EAAA,sCAhBwB,CHAA,ACAF,AFAE,ADAL,AHYI,ADAA,AUZrB,AMAiB,ADAA,APAA,AGAK,ACAL,ATAI,AWAC,AGAL,ARAK,AIAtB,CCAsB,AdYD,AGZA,AIAD,ASAH,AHAjB,AEAiB,AJAK,AHAL,ASAA,ALAA,ARAA,AHYI,AQZC,AJAA,AKAtB,2FDCwD,CAAU,CAAA,8OhBWlF,IAAA,EAAA,EAAA,CAAA,CAAA,uBmBGmB,EAAA,0MCfiE,0CtBDpF,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,ODJoR,IAAM,EAAm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","ignoreList":[20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/actions/data%3A38998b%20%3Ctext/javascript%3E","../../../../src/app/session/%5BsessionId%5D/SessionPageClient.tsx","../../../../src/app/actions/data%3A96f2c8%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ae260bf%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Ac77173%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A5b3841%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aad4d08%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aac207e%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A84c38f%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A5f4086%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A7cfc0c%20%3Ctext/javascript%3E","../../../../src/components/SessionFileBrowser.tsx","../../../../src/app/actions/data%3A25bffc%20%3Ctext/javascript%3E","../../../../src/components/SessionView.tsx","../../../../src/app/actions/data%3A0955ea%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aa7607c%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A9dc1e0%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A212891%20%3Ctext/javascript%3E","../../../../src/lib/url.ts","../../../../src/lib/shell.ts","../../../../node_modules/lucide-react/src/icons/chevron-down.ts","../../../../node_modules/lucide-react/src/icons/chevron-left.ts","../../../../src/lib/terminal-session.ts","../../../../node_modules/lucide-react/src/icons/grip.ts","../../../../node_modules/lucide-react/src/icons/grid-2x2.ts","../../../../node_modules/lucide-react/src/icons/arrow-up.ts","../../../../node_modules/lucide-react/src/icons/clipboard.ts","../../../../node_modules/lucide-react/src/icons/git-pull-request-arrow.ts","../../../../node_modules/lucide-react/src/icons/pin.ts","../../../../node_modules/lucide-react/src/icons/globe.ts","../../../../node_modules/lucide-react/src/icons/house.ts","../../../../node_modules/lucide-react/src/icons/git-commit-horizontal.ts","../../../../node_modules/lucide-react/src/icons/arrow-right.ts","../../../../node_modules/lucide-react/src/icons/rotate-cw.ts","../../../../node_modules/lucide-react/src/icons/git-merge.ts","../../../../node_modules/lucide-react/src/icons/arrow-down.ts","../../../../node_modules/lucide-react/src/icons/list.ts","../../../../node_modules/lucide-react/src/icons/pin-off.ts","../../../../node_modules/lucide-react/src/icons/folder-open.ts","../../../../node_modules/lucide-react/src/icons/file-text.ts","../../../../node_modules/lucide-react/src/icons/mouse-pointer-2.ts","../../../../src/hooks/useTerminalLink.ts"],"sourcesContent":["/* __next_internal_action_entry_do_not_use__ [{\"40c0b0e8e3886b168c56bf35ad920be9c717054f39\":\"getSessionDivergence\"},\"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_15=/*#__PURE__*/createServerReference(\"40c0b0e8e3886b168c56bf35ad920be9c717054f39\",callServer,void 0,findSourceMapURL,\"getSessionDivergence\");export{$$RSC_SERVER_ACTION_15 as getSessionDivergence};","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useRouter, useParams } from 'next/navigation';\nimport { SessionView } from '@/components/SessionView';\nimport { consumeSessionLaunchContext, getSessionMetadata, SessionMetadata, markSessionInitialized } from '@/app/actions/session';\nimport { getSessionTerminalSources, startTtydProcess } from '@/app/actions/git';\n\nexport default function SessionPage() {\n const params = useParams<{ sessionId: string }>();\n const sessionIdParam = params.sessionId;\n const sessionId = Array.isArray(sessionIdParam) ? sessionIdParam[0] : sessionIdParam;\n const router = useRouter();\n\n const [metadata, setMetadata] = useState<SessionMetadata | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [terminalSources, setTerminalSources] = useState<{\n agentTerminalSrc: string;\n floatingTerminalSrc: string;\n } | null>(null);\n\n // Startup params — only populated on first open (initialized === false)\n const [initialMessage, setInitialMessage] = useState<string | undefined>(undefined);\n const [startupScript, setStartupScript] = useState<string | undefined>(undefined);\n const [contextTitle, setContextTitle] = useState<string | undefined>(undefined);\n const [contextAgentProvider, setContextAgentProvider] = useState<string | undefined>(undefined);\n const [contextModel, setContextModel] = useState<string | undefined>(undefined);\n const [contextSessionMode, setContextSessionMode] = useState<'fast' | 'plan' | undefined>(undefined);\n const [contextAttachmentNames, setContextAttachmentNames] = useState<string[]>([]);\n\n // True = send --resume to agent; False = send fresh start params\n const [isResume, setIsResume] = useState<boolean>(true);\n const [terminalPersistenceMode, setTerminalPersistenceMode] = useState<'tmux' | 'shell'>('shell');\n\n useEffect(() => {\n document.documentElement.classList.add('session-page');\n return () => {\n document.documentElement.classList.remove('session-page');\n };\n }, []);\n\n useEffect(() => {\n if (!sessionId) return;\n\n const loadSession = async () => {\n try {\n setTerminalSources(null);\n\n // Ensure ttyd is running\n const ttydResult = await startTtydProcess();\n if (!ttydResult.success) {\n setError('Failed to start terminal service');\n setLoading(false);\n return;\n }\n setTerminalPersistenceMode(ttydResult.persistenceMode === 'tmux' ? 'tmux' : 'shell');\n\n const data = await getSessionMetadata(sessionId);\n if (!data) {\n setError('Session not found');\n setLoading(false);\n return;\n }\n\n setMetadata(data);\n const resolvedTerminalSources = await getSessionTerminalSources(data.sessionName, data.repoPath);\n setTerminalSources(resolvedTerminalSources);\n\n // Determine fresh start vs resume purely from the initialized flag:\n // - initialized === false → first open, send startup params\n // - initialized === true → already started before, resume\n // - initialized === undefined → legacy session (no flag), treat as resume\n const isFirstOpen = data.initialized === false;\n\n if (isFirstOpen) {\n // Consume the launch context (startup params) written by GitRepoSelector\n const contextResult = await consumeSessionLaunchContext(sessionId);\n if (contextResult.success && contextResult.context) {\n const ctx = contextResult.context;\n setInitialMessage(ctx.initialMessage);\n setStartupScript(ctx.startupScript);\n setContextTitle(ctx.title);\n setContextAgentProvider(ctx.agentProvider);\n setContextModel(ctx.model);\n setContextSessionMode(ctx.sessionMode);\n setContextAttachmentNames(ctx.attachmentNames || []);\n }\n // Whether or not we got context, this is a fresh start\n setIsResume(false);\n } else {\n // Already initialized (or legacy) — resume\n setIsResume(true);\n }\n\n setLoading(false);\n } catch (e) {\n console.error('Failed to load session:', e);\n setError('Failed to load session');\n setLoading(false);\n }\n };\n\n loadSession();\n }, [sessionId]);\n\n const handleExit = (force?: boolean) => {\n if (force) {\n // Force a full page navigation — used after cleanup where\n // router.push can get stuck due to iframe teardown state\n window.location.href = '/';\n } else {\n router.push('/');\n }\n };\n\n // Called by SessionView once the agent command has been sent for the first time\n const handleSessionStart = async () => {\n if (sessionId) {\n await markSessionInitialized(sessionId);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60\">Loading session...</p>\n </div>\n </div>\n );\n }\n\n if (error || !metadata) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"card w-96 bg-base-200 shadow-xl\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error\">Error</h2>\n <p>{error || 'Session not found'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => handleExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!terminalSources) {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"flex flex-col items-center gap-4\">\n <span className=\"loading loading-spinner loading-lg text-primary\"></span>\n <p className=\"opacity-60\">Initializing terminals...</p>\n </div>\n </div>\n );\n }\n\n return (\n <SessionView\n repo={metadata.repoPath}\n worktree={metadata.worktreePath}\n branch={metadata.branchName}\n baseBranch={metadata.baseBranch}\n sessionName={metadata.sessionName}\n agent={contextAgentProvider || metadata.agent}\n model={contextModel || metadata.model}\n startupScript={startupScript}\n devServerScript={metadata.devServerScript}\n initialMessage={initialMessage}\n attachmentNames={contextAttachmentNames}\n title={contextTitle || metadata.title}\n sessionMode={contextSessionMode}\n onExit={handleExit}\n isResume={isResume}\n terminalPersistenceMode={terminalPersistenceMode}\n onSessionStart={handleSessionStart}\n agentTerminalSrc={terminalSources.agentTerminalSrc}\n floatingTerminalSrc={terminalSources.floatingTerminalSrc}\n />\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40fb152558189cb58884e7d0acd4ca9278c762232f\":\"getSessionUncommittedFileCount\"},\"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_14=/*#__PURE__*/createServerReference(\"40fb152558189cb58884e7d0acd4ca9278c762232f\",callServer,void 0,findSourceMapURL,\"getSessionUncommittedFileCount\");export{$$RSC_SERVER_ACTION_14 as getSessionUncommittedFileCount};","/* __next_internal_action_entry_do_not_use__ [{\"409caa86065050fbcadc5ba1f111667b17eb6a147d\":\"listSessionBaseBranches\"},\"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_16=/*#__PURE__*/createServerReference(\"409caa86065050fbcadc5ba1f111667b17eb6a147d\",callServer,void 0,findSourceMapURL,\"listSessionBaseBranches\");export{$$RSC_SERVER_ACTION_16 as listSessionBaseBranches};","/* __next_internal_action_entry_do_not_use__ [{\"40839d6f1980de68ef06e70656efb94571720dfe31\":\"mergeSessionToBase\"},\"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_12=/*#__PURE__*/createServerReference(\"40839d6f1980de68ef06e70656efb94571720dfe31\",callServer,void 0,findSourceMapURL,\"mergeSessionToBase\");export{$$RSC_SERVER_ACTION_12 as mergeSessionToBase};","/* __next_internal_action_entry_do_not_use__ [{\"40d3528b66f4430a24d29f869e74cde78aea7f86a9\":\"rebaseSessionOntoBase\"},\"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_13=/*#__PURE__*/createServerReference(\"40d3528b66f4430a24d29f869e74cde78aea7f86a9\",callServer,void 0,findSourceMapURL,\"rebaseSessionOntoBase\");export{$$RSC_SERVER_ACTION_13 as rebaseSessionOntoBase};","/* __next_internal_action_entry_do_not_use__ [{\"60ea9ee38855f2f1636724f1b870ab21757c2118f3\":\"updateSessionBaseBranch\"},\"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_17=/*#__PURE__*/createServerReference(\"60ea9ee38855f2f1636724f1b870ab21757c2118f3\",callServer,void 0,findSourceMapURL,\"updateSessionBaseBranch\");export{$$RSC_SERVER_ACTION_17 as updateSessionBaseBranch};","/* __next_internal_action_entry_do_not_use__ [{\"602d2564016faf134d089f3103b15d3fecde7154ff\":\"writeSessionPromptFile\"},\"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_1=/*#__PURE__*/createServerReference(\"602d2564016faf134d089f3103b15d3fecde7154ff\",callServer,void 0,findSourceMapURL,\"writeSessionPromptFile\");export{$$RSC_SERVER_ACTION_1 as writeSessionPromptFile};","/* __next_internal_action_entry_do_not_use__ [{\"7fe326048282569666932c39dc794e059cf2360686\":\"setTmuxSessionMouseMode\"},\"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_11=/*#__PURE__*/createServerReference(\"7fe326048282569666932c39dc794e059cf2360686\",callServer,void 0,findSourceMapURL,\"setTmuxSessionMouseMode\");export{$$RSC_SERVER_ACTION_11 as setTmuxSessionMouseMode};","/* __next_internal_action_entry_do_not_use__ [{\"7f2bb66b69f4d8e13fd64cd717458dfa96dd7f3fd3\":\"setTmuxSessionStatusVisibility\"},\"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_12=/*#__PURE__*/createServerReference(\"7f2bb66b69f4d8e13fd64cd717458dfa96dd7f3fd3\",callServer,void 0,findSourceMapURL,\"setTmuxSessionStatusVisibility\");export{$$RSC_SERVER_ACTION_12 as setTmuxSessionStatusVisibility};","/* __next_internal_action_entry_do_not_use__ [{\"406bf07eea307746af974ede033e2bff5d4ae45879\":\"listPathEntries\"},\"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_1=/*#__PURE__*/createServerReference(\"406bf07eea307746af974ede033e2bff5d4ae45879\",callServer,void 0,findSourceMapURL,\"listPathEntries\");export{$$RSC_SERVER_ACTION_1 as listPathEntries};","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Image from 'next/image';\nimport { getHomeDirectory, listPathEntries, saveAttachments } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { ArrowLeft, Clipboard, FileText, Folder, Grid2x2, House, List, Pin, PinOff } from 'lucide-react';\nimport { getDirName } from '@/lib/path';\nimport { useDialogKeyboardShortcuts } from '@/hooks/useDialogKeyboardShortcuts';\n\nconst VIEW_MODE_STORAGE_KEY = 'viba:session-file-browser:view-mode';\n\ntype FileSystemItem = {\n name: string;\n path: string;\n isDirectory: boolean;\n isGitRepo: boolean;\n};\n\ninterface SessionFileBrowserProps {\n initialPath?: string;\n worktreePath?: string;\n onConfirm: (paths: string[]) => void | Promise<void>;\n onCancel: () => void;\n onPathChange?: (path: string) => void;\n}\n\nexport default function SessionFileBrowser({\n initialPath,\n worktreePath,\n onConfirm,\n onCancel,\n onPathChange,\n}: SessionFileBrowserProps) {\n const imageExtensions = useMemo(\n () => new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg', '.ico', '.avif']),\n []\n );\n const [currentPath, setCurrentPath] = useState('');\n const [items, setItems] = useState<FileSystemItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [homePath, setHomePath] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<string[]>([]);\n const [anchorIndex, setAnchorIndex] = useState<number | null>(null);\n const [viewMode, setViewMode] = useState<'list' | 'grid'>('list');\n const [hasLoadedViewMode, setHasLoadedViewMode] = useState(false);\n const [brokenThumbnails, setBrokenThumbnails] = useState<Record<string, boolean>>({});\n const [pinnedFolderShortcuts, setPinnedFolderShortcuts] = useState<string[]>([]);\n\n useEffect(() => {\n let isMounted = true;\n\n const init = async () => {\n try {\n const home = await getHomeDirectory();\n if (!isMounted) return;\n setHomePath(home);\n if (!initialPath) {\n setCurrentPath(home);\n }\n } catch (err) {\n console.error('Failed to resolve home directory:', err);\n }\n\n if (initialPath && isMounted) {\n setCurrentPath(initialPath);\n }\n };\n\n void init();\n\n return () => {\n isMounted = false;\n };\n }, [initialPath]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadPinnedFolderShortcuts = async () => {\n try {\n const config = await getConfig();\n if (!isMounted) return;\n const pinned = Array.isArray(config.pinnedFolderShortcuts)\n ? config.pinnedFolderShortcuts.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n : [];\n setPinnedFolderShortcuts(Array.from(new Set(pinned)));\n } catch (err) {\n console.error('Failed to load pinned folder shortcuts:', err);\n }\n };\n\n void loadPinnedFolderShortcuts();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n try {\n const savedViewMode = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n if (savedViewMode === 'list' || savedViewMode === 'grid') {\n setViewMode(savedViewMode);\n }\n } catch {\n // Ignore localStorage failures.\n } finally {\n setHasLoadedViewMode(true);\n }\n }, []);\n\n useEffect(() => {\n if (!hasLoadedViewMode) return;\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, viewMode);\n } catch {\n // Ignore localStorage failures.\n }\n }, [hasLoadedViewMode, viewMode]);\n\n useEffect(() => {\n if (!currentPath) return;\n\n const fetchItems = async () => {\n setLoading(true);\n setError(null);\n try {\n const entries = await listPathEntries(currentPath);\n setItems(entries);\n } catch (err) {\n console.error('Failed to list files:', err);\n setError('Failed to load directory contents');\n } finally {\n setLoading(false);\n }\n };\n\n void fetchItems();\n }, [currentPath]);\n\n useEffect(() => {\n if (!currentPath) return;\n onPathChange?.(currentPath);\n }, [currentPath, onPathChange]);\n\n useEffect(() => {\n setSelectedPaths([]);\n setAnchorIndex(null);\n setBrokenThumbnails({});\n }, [currentPath]);\n\n const selectedSet = useMemo(() => new Set(selectedPaths), [selectedPaths]);\n const isImageFile = (fileName: string) => {\n const dotIndex = fileName.lastIndexOf('.');\n if (dotIndex === -1) return false;\n return imageExtensions.has(fileName.slice(dotIndex).toLowerCase());\n };\n\n const handleGoUp = () => {\n const parent = getDirName(currentPath);\n if (parent && parent !== currentPath) {\n setCurrentPath(parent);\n }\n };\n\n const handleGoHome = () => {\n if (!homePath || currentPath === homePath) return;\n setCurrentPath(homePath);\n };\n\n const handleItemClick = (item: FileSystemItem, index: number, e: React.MouseEvent<HTMLElement>) => {\n if (item.isDirectory) {\n setCurrentPath(item.path);\n return;\n }\n\n const isMetaMulti = e.metaKey || e.ctrlKey;\n\n if (e.shiftKey && anchorIndex !== null) {\n const start = Math.min(anchorIndex, index);\n const end = Math.max(anchorIndex, index);\n const range = items\n .slice(start, end + 1)\n .filter((entry) => !entry.isDirectory)\n .map((entry) => entry.path);\n setSelectedPaths(range);\n return;\n }\n\n if (isMetaMulti) {\n setSelectedPaths((prev) =>\n prev.includes(item.path)\n ? prev.filter((path) => path !== item.path)\n : [...prev, item.path]\n );\n setAnchorIndex(index);\n return;\n }\n\n setSelectedPaths([item.path]);\n setAnchorIndex(index);\n };\n\n const handlePaste = async () => {\n setError(null);\n if (!worktreePath) {\n setError(\"Cannot paste: Session worktree path is missing.\");\n return;\n }\n\n try {\n setLoading(true);\n \n if (!navigator.clipboard || !navigator.clipboard.read) {\n throw new Error(\"Clipboard API not supported in this browser\");\n }\n\n // Request clipboard access\n const clipboardItems = await navigator.clipboard.read();\n const formData = new FormData();\n let hasFiles = false;\n\n for (const item of clipboardItems) {\n // Look for image types or other file types\n // We iterate through available types in the item\n for (const type of item.types) {\n // Prioritize images\n if (type.startsWith('image/')) {\n const blob = await item.getType(type);\n const ext = type.split('/')[1] || 'png';\n const filename = `pasted-image-${Date.now()}.${ext}`;\n const file = new File([blob], filename, { type });\n formData.append(filename, file); // Use filename as key\n hasFiles = true;\n break; // Found an image representation, stop checking other types for this item\n } else if (type === 'text/plain') {\n // For now, ignore plain text unless we want to save it as a text file.\n // If user copies text, they can paste directly into terminal. \n // This feature is \"pasting file\".\n }\n }\n }\n\n if (hasFiles) {\n const savedPaths = await saveAttachments(worktreePath, formData);\n if (savedPaths && savedPaths.length > 0) {\n // Determine what to do with saved paths.\n // Option 1: auto-insert them (call onConfirm).\n // Option 2: select them in the browser (might be hard if they are in a different dir).\n // Option 3: just call onConfirm because the user clicked \"Paste\" to insert.\n await onConfirm(savedPaths);\n return;\n } else {\n setError(\"Failed to save pasted files.\");\n }\n } else {\n // No files found, maybe check for text path?\n try {\n const text = await navigator.clipboard.readText();\n if (text && text.trim().startsWith('/')) {\n // Check if it's a valid path? \n // Maybe just suggest it?\n // For now, let's just error if no files found.\n setError(\"No file content found in clipboard. Copy an image or file first.\");\n } else {\n setError(\"No file content found in clipboard.\");\n }\n } catch {\n setError(\"No file content found in clipboard.\");\n }\n }\n\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('Paste error:', err);\n setError(`Failed to read from clipboard: ${message}`);\n } finally {\n setLoading(false);\n }\n };\n\n const savePinnedFolderShortcuts = async (nextShortcuts: string[]) => {\n setPinnedFolderShortcuts(nextShortcuts);\n try {\n await updateConfig({ pinnedFolderShortcuts: nextShortcuts });\n } catch (err) {\n console.error('Failed to save pinned folder shortcuts:', err);\n setError('Failed to save pinned shortcuts');\n }\n };\n\n const handleTogglePinFolder = async (folderPath: string) => {\n setError(null);\n const alreadyPinned = pinnedFolderShortcuts.includes(folderPath);\n if (alreadyPinned) {\n await savePinnedFolderShortcuts(pinnedFolderShortcuts.filter((path) => path !== folderPath));\n return;\n }\n await savePinnedFolderShortcuts([...pinnedFolderShortcuts, folderPath]);\n };\n\n const handleConfirm = useCallback(async () => {\n if (selectedPaths.length === 0) return;\n await onConfirm(selectedPaths);\n }, [onConfirm, selectedPaths]);\n\n useDialogKeyboardShortcuts({\n onConfirm: handleConfirm,\n onDismiss: onCancel,\n canConfirm: selectedPaths.length > 0,\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-5xl h-[82vh] flex flex-col\">\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 Browse Files\n </h2>\n <button onClick={onCancel} className=\"btn btn-sm btn-ghost btn-circle\" title=\"Close file browser\">\n ✕\n </button>\n </div>\n\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 <button\n onClick={handleGoHome}\n className=\"btn btn-sm btn-ghost gap-1\"\n title={homePath ? `Go to Home Folder (${homePath})` : 'Go to Home Folder'}\n disabled={!homePath || currentPath === homePath}\n >\n <House className=\"w-4 h-4\" />\n Home\n </button>\n <div className=\"flex-1 overflow-x-auto whitespace-nowrap px-2 font-mono text-sm\">\n {currentPath}\n </div>\n <div className=\"join\">\n <button\n type=\"button\"\n onClick={() => setViewMode('list')}\n className={`btn btn-sm join-item ${viewMode === 'list' ? 'btn-active' : 'btn-ghost'}`}\n title=\"List view\"\n >\n <List className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setViewMode('grid')}\n className={`btn btn-sm join-item ${viewMode === 'grid' ? 'btn-active' : 'btn-ghost'}`}\n title=\"Grid view\"\n >\n <Grid2x2 className=\"w-4 h-4\" />\n </button>\n </div>\n <button\n onClick={handleConfirm}\n className=\"btn btn-sm btn-primary gap-2\"\n disabled={selectedPaths.length === 0}\n title=\"Insert selected absolute paths\"\n >\n Insert ({selectedPaths.length})\n </button>\n \n <div className=\"w-[1px] h-6 bg-base-content/10 mx-1\"></div>\n\n <button\n onClick={handlePaste}\n className=\"btn btn-sm btn-ghost gap-2\"\n title=\"Paste file/image from clipboard\"\n disabled={!worktreePath}\n >\n <Clipboard className=\"w-4 h-4\" />\n Paste\n </button>\n </div>\n {pinnedFolderShortcuts.length > 0 && (\n <div className=\"px-3 py-2 border-b border-base-300 bg-base-200/50\">\n <div className=\"flex items-center gap-2 overflow-x-auto\">\n {pinnedFolderShortcuts.map((folderPath) => {\n const isCurrent = folderPath === currentPath;\n const label = folderPath.split(/[\\\\/]/).filter(Boolean).pop() || folderPath;\n return (\n <div key={folderPath} className=\"join shrink-0\">\n <button\n type=\"button\"\n className={`btn btn-xs join-item ${isCurrent ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setCurrentPath(folderPath)}\n title={folderPath}\n >\n <Folder className=\"w-3 h-3\" />\n {label}\n </button>\n <button\n type=\"button\"\n className=\"btn btn-xs btn-ghost join-item\"\n onClick={() => void handleTogglePinFolder(folderPath)}\n title={`Unpin ${folderPath}`}\n >\n <PinOff className=\"w-3 h-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\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 ) : viewMode === 'list' ? (\n <div className=\"grid grid-cols-1 gap-1\">\n {items.map((item, index) => {\n const isSelected = selectedSet.has(item.path);\n return (\n <div\n key={item.path}\n className={`flex items-center justify-between p-2 rounded-md cursor-pointer transition-colors border ${isSelected\n ? 'bg-primary text-primary-content border-primary'\n : 'hover:bg-base-100 border-transparent'\n }`}\n onClick={(e) => handleItemClick(item, index, e)}\n title={item.path}\n >\n <div className=\"flex items-center gap-3 overflow-hidden\">\n {item.isDirectory ? (\n <Folder className=\"w-5 h-5 shrink-0\" />\n ) : (\n <FileText className=\"w-5 h-5 shrink-0\" />\n )}\n <span className=\"truncate\">{item.name}</span>\n </div>\n <span className=\"text-[10px] opacity-70 shrink-0\">\n {item.isDirectory ? (\n <button\n type=\"button\"\n className=\"btn btn-ghost btn-xs h-6 min-h-6\"\n onClick={(e) => {\n e.stopPropagation();\n void handleTogglePinFolder(item.path);\n }}\n title={pinnedFolderShortcuts.includes(item.path) ? 'Unpin folder' : 'Pin folder'}\n >\n <Pin className={`w-3 h-3 ${pinnedFolderShortcuts.includes(item.path) ? 'fill-current' : ''}`} />\n </button>\n ) : 'file'}\n </span>\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-3\">\n {items.map((item, index) => {\n const isSelected = selectedSet.has(item.path);\n const isImage = !item.isDirectory && isImageFile(item.name);\n const thumbnailUrl = `/api/file-thumbnail?path=${encodeURIComponent(item.path)}`;\n\n return (\n <button\n key={item.path}\n type=\"button\"\n className={`rounded-lg border text-left overflow-hidden transition-colors ${isSelected\n ? 'border-primary bg-primary/15'\n : 'border-base-300 hover:bg-base-100'\n }`}\n onClick={(e) => handleItemClick(item, index, e)}\n title={item.path}\n >\n <div className=\"aspect-square bg-base-300 flex items-center justify-center overflow-hidden relative\">\n {isImage && !brokenThumbnails[item.path] ? (\n <Image\n src={thumbnailUrl}\n alt={item.name}\n fill\n sizes=\"(max-width: 768px) 50vw, (max-width: 1024px) 25vw, 20vw\"\n className=\"object-cover\"\n unoptimized\n onError={() =>\n setBrokenThumbnails((prev) => ({ ...prev, [item.path]: true }))\n }\n />\n ) : item.isDirectory ? (\n <Folder className=\"w-10 h-10 opacity-80\" />\n ) : (\n <FileText className=\"w-10 h-10 opacity-80\" />\n )}\n {item.isDirectory && (\n <button\n type=\"button\"\n className={`absolute top-1 right-1 btn btn-xs btn-circle ${pinnedFolderShortcuts.includes(item.path) ? 'btn-primary' : 'btn-ghost bg-base-100/70'}`}\n onClick={(e) => {\n e.stopPropagation();\n void handleTogglePinFolder(item.path);\n }}\n title={pinnedFolderShortcuts.includes(item.path) ? 'Unpin folder' : 'Pin folder'}\n >\n <Pin className={`w-3 h-3 ${pinnedFolderShortcuts.includes(item.path) ? 'fill-current' : ''}`} />\n </button>\n )}\n </div>\n <div className=\"px-2 py-2\">\n <div className=\"truncate text-sm font-medium\" title={item.name}>{item.name}</div>\n <div className=\"text-[10px] opacity-70\">\n {item.isDirectory ? 'folder' : isImage ? 'image' : 'file'}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n <div className=\"p-3 border-t border-base-300 text-xs text-base-content/60 text-center\">\n Click: single select. Cmd/Ctrl+Click: multi-select. Shift+Click: range select.\n Click a folder to open it.\n </div>\n </div>\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40acb5533c82b54fda92c8cd116bc5eff1ca93ed05\":\"deleteSessionInBackground\"},\"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_11=/*#__PURE__*/createServerReference(\"40acb5533c82b54fda92c8cd116bc5eff1ca93ed05\",callServer,void 0,findSourceMapURL,\"deleteSessionInBackground\");export{$$RSC_SERVER_ACTION_11 as deleteSessionInBackground};","'use client';\n\nimport React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\n// import { useRouter } from 'next/navigation';\nimport {\n deleteSessionInBackground,\n getSessionDivergence,\n getSessionUncommittedFileCount,\n listSessionBaseBranches,\n mergeSessionToBase,\n rebaseSessionOntoBase,\n updateSessionBaseBranch,\n writeSessionPromptFile\n} from '@/app/actions/session';\nimport { setTmuxSessionMouseMode, setTmuxSessionStatusVisibility } from '@/app/actions/git';\nimport { getConfig, updateConfig } from '@/app/actions/config';\nimport { Trash2, ExternalLink, Play, GitCommitHorizontal, GitMerge, GitPullRequestArrow, GitBranch, ArrowUp, ArrowDown, FolderOpen, ChevronLeft, Grip, ChevronDown, Plus, Globe, MousePointer2, ArrowLeft, ArrowRight, RotateCw } from 'lucide-react';\nimport SessionFileBrowser from './SessionFileBrowser';\nimport { getBaseName, isWindowsAbsolutePath } from '@/lib/path';\nimport { notifySessionsUpdated } from '@/lib/session-updates';\nimport { buildTtydTerminalSrc } from '@/lib/terminal-session';\nimport { normalizePreviewUrl } from '@/lib/url';\nimport { useTerminalLink, type TerminalWindow } from '@/hooks/useTerminalLink';\nimport { quoteShellArg } from '@/lib/shell';\n\nconst SUPPORTED_IDES = [\n { id: 'vscode', name: 'VS Code', protocol: 'vscode' },\n { id: 'cursor', name: 'Cursor', protocol: 'cursor' },\n { id: 'windsurf', name: 'Windsurf', protocol: 'windsurf' },\n { id: 'antigravity', name: 'Antigravity', protocol: 'antigravity' },\n];\n\n\ntype CleanupPhase = 'idle' | 'error';\n\ntype PreviewNavigationAction = 'back' | 'forward' | 'reload';\ntype TerminalBootstrapSlot = 'agent' | 'terminal';\ntype TerminalBootstrapState = 'idle' | 'in_progress' | 'done';\ntype TerminalBootstrapRegistry = Record<string, TerminalBootstrapState>;\ntype TerminalInteractionMode = 'scroll' | 'select';\ntype TerminalOnWriteParsedDisposable = { dispose?: () => void };\ntype TerminalWithOnWriteParsed = NonNullable<TerminalWindow['term']> & {\n onWriteParsed?: (callback: () => void) => TerminalOnWriteParsedDisposable | void;\n};\n\nconst TERMINAL_SIZE_STORAGE_KEY = 'viba-terminal-size';\nconst SPLIT_RATIO_STORAGE_KEY = 'viba-agent-preview-split-ratio';\nconst DEFAULT_AGENT_PANE_RATIO = 0.5;\nconst TERMINAL_HEADER_HEIGHT = 40;\nconst TERMINAL_PANEL_RIGHT_GAP = 16;\nconst TERMINAL_MINIMIZED_VISIBLE_WIDTH = 40;\nconst TRIDENT_WORKSPACE_URL = 'http://localhost:3100/workspace';\nconst TERMINAL_BOOTSTRAP_STORAGE_PREFIX = 'viba:terminal-bootstrap:';\nconst TERMINAL_BOOTSTRAP_RUNTIME_KEY = '__vibaTerminalBootstrapRegistry';\nconst SHELL_PROMPT_PATTERN = /(?:\\$|%|#|>) $/;\nconst PLAN_MODE_STARTUP_INSTRUCTION =\n 'Plan mode: inspect the relevant code first, present a concrete implementation plan, and wait for explicit user approval before any file edits or write commands.';\nconst AUTO_COMMIT_INSTRUCTION =\n 'After each round, if work is complete and files changed, commit all changes without confirmation. Use a commit message with a clear title and a detailed body explaining what changed and why. If GITHUB_TOKEN or GITLAB_TOKEN is set, push the current branch after committed rounds and create (or update) a GitHub Pull Request or GitLab Merge Request with an appropriate title and description; include the PR/MR link in the first push reply.';\n\nconst clampAgentPaneRatio = (value: number): number => Math.max(0.2, Math.min(0.8, value));\n\ntype PreviewComponentStackEntry = {\n name?: unknown;\n source?: {\n fileName?: unknown;\n } | null;\n};\n\nconst normalizePickerSourceFileName = (value: string): string => {\n let normalized = value.trim();\n if (!normalized) return '';\n\n normalized = normalized.replace(/[#?].*$/, '');\n\n if (/^file:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n } else if (/^https?:\\/\\//i.test(normalized)) {\n try {\n const asUrl = new URL(normalized);\n normalized = decodeURIComponent(asUrl.pathname);\n } catch {\n // Keep original value when URL parsing fails\n }\n }\n\n normalized = normalized\n .replace(/^webpack(?:-internal)?:\\/\\/\\/?/, '')\n .replace(/^rsc:\\/\\//, '')\n .replace(/^\\(.*?\\)\\//, '')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n .replace(/\\\\/g, '/');\n\n return normalized.trim();\n};\n\nconst joinPath = (base: string, relative: string): string => {\n const normalizedBase = base.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n const normalizedRelative = relative.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n return `${normalizedBase}/${normalizedRelative}`;\n};\n\nconst resolveComponentSourcePath = (rawSourceFileName: string, workspaceRoot: string): string | null => {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalizedWorkspaceRoot) return null;\n\n const normalizedSource = normalizePickerSourceFileName(rawSourceFileName);\n if (!normalizedSource) return null;\n\n if (normalizedSource.startsWith('/') || isWindowsAbsolutePath(normalizedSource)) {\n return normalizedSource;\n }\n\n const relativeCandidates = new Set<string>();\n relativeCandidates.add(normalizedSource.replace(/^\\.\\/+/, ''));\n\n const srcIndex = normalizedSource.indexOf('/src/');\n if (srcIndex >= 0) {\n relativeCandidates.add(normalizedSource.slice(srcIndex + 1));\n }\n\n if (normalizedSource.startsWith('src/')) {\n relativeCandidates.add(normalizedSource);\n }\n\n for (const relative of relativeCandidates) {\n if (!relative) continue;\n return joinPath(normalizedWorkspaceRoot, relative);\n }\n\n return null;\n};\n\nconst buildComponentReferenceText = (reactStack: unknown[], workspaceRoot: string): string | null => {\n for (const entry of reactStack) {\n if (!entry || typeof entry !== 'object') continue;\n\n const componentEntry = entry as PreviewComponentStackEntry;\n const componentName = typeof componentEntry.name === 'string' ? componentEntry.name.trim() : '';\n if (!componentName) continue;\n\n const sourceFileName = typeof componentEntry.source?.fileName === 'string'\n ? componentEntry.source.fileName.trim()\n : '';\n const sourcePath = sourceFileName ? resolveComponentSourcePath(sourceFileName, workspaceRoot) : null;\n\n if (sourcePath) {\n return `${componentName} (${sourcePath})`;\n }\n }\n\n return null;\n};\n\nconst normalizeComponentLookupName = (value: string): string => {\n const trimmed = value.trim();\n if (!trimmed) return '';\n\n const match = trimmed.match(/[A-Za-z_$][\\w$]*/);\n return match ? match[0] : '';\n};\n\nexport interface SessionViewProps {\n repo: string;\n worktree: string;\n branch: string;\n baseBranch?: string;\n sessionName: string;\n agent?: string;\n model?: string;\n startupScript?: string;\n devServerScript?: string;\n initialMessage?: string;\n attachmentNames?: string[];\n title?: string;\n sessionMode?: 'fast' | 'plan';\n onExit: (force?: boolean) => void;\n isResume?: boolean;\n terminalPersistenceMode?: 'tmux' | 'shell';\n onSessionStart?: () => void;\n agentTerminalSrc?: string;\n floatingTerminalSrc?: string;\n}\n\nexport function SessionView({\n repo,\n worktree,\n branch,\n baseBranch,\n sessionName,\n agent,\n model,\n startupScript,\n devServerScript,\n initialMessage,\n attachmentNames,\n title,\n sessionMode = 'fast',\n onExit,\n isResume,\n terminalPersistenceMode = 'shell',\n onSessionStart,\n agentTerminalSrc: agentTerminalSrcOverride,\n floatingTerminalSrc: floatingTerminalSrcOverride,\n}: SessionViewProps) {\n const headerButtonLabelClass = 'hidden min-[1900px]:inline';\n\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const terminalRef = useRef<HTMLIFrameElement>(null);\n const previewIframeRef = useRef<HTMLIFrameElement>(null);\n const previewAddressInputRef = useRef<HTMLInputElement>(null);\n const splitContainerRef = useRef<HTMLDivElement>(null);\n const splitResizeRef = useRef({ startX: 0, startRatio: DEFAULT_AGENT_PANE_RATIO });\n const agentFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalFrameLinkCleanupRef = useRef<(() => void) | null>(null);\n const terminalProcessMonitorCleanupRef = useRef<(() => void) | null>(null);\n const terminalStartupScriptStateRef = useRef<{ injected: boolean; timer: number | null }>({\n injected: false,\n timer: null,\n });\n const agentTerminalSrc = useMemo(\n () => agentTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'agent'),\n [agentTerminalSrcOverride, sessionName],\n );\n const floatingTerminalSrc = useMemo(\n () => floatingTerminalSrcOverride || buildTtydTerminalSrc(sessionName, 'terminal'),\n [floatingTerminalSrcOverride, sessionName],\n );\n\n const terminalBootstrapStateRef = useRef<Record<TerminalBootstrapSlot, TerminalBootstrapState>>({\n agent: 'idle',\n terminal: 'idle',\n });\n const tmuxStatusAppliedRef = useRef<Record<TerminalBootstrapSlot, boolean>>({\n agent: false,\n terminal: false,\n });\n\n useEffect(() => {\n terminalBootstrapStateRef.current = {\n agent: 'idle',\n terminal: 'idle',\n };\n tmuxStatusAppliedRef.current = {\n agent: false,\n terminal: false,\n };\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current = {\n injected: false,\n timer: null,\n };\n }, [sessionName]);\n\n useEffect(() => {\n return () => {\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n terminalStartupScriptStateRef.current.timer = null;\n }\n };\n }, []);\n\n const getTerminalBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${TERMINAL_BOOTSTRAP_STORAGE_PREFIX}${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapKey = useCallback((slot: TerminalBootstrapSlot) => {\n return `${sessionName}:${slot}`;\n }, [sessionName]);\n\n const getRuntimeBootstrapRegistry = useCallback((): TerminalBootstrapRegistry | null => {\n if (typeof window === 'undefined') return null;\n const runtimeWindow = window as Window & {\n __vibaTerminalBootstrapRegistry?: TerminalBootstrapRegistry;\n };\n if (!runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY]) {\n runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] = {};\n }\n return runtimeWindow[TERMINAL_BOOTSTRAP_RUNTIME_KEY] || null;\n }, []);\n\n const getRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot): TerminalBootstrapState => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return 'idle';\n return registry[getRuntimeBootstrapKey(slot)] || 'idle';\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const setRuntimeBootstrapState = useCallback((slot: TerminalBootstrapSlot, state: TerminalBootstrapState): void => {\n const registry = getRuntimeBootstrapRegistry();\n if (!registry) return;\n registry[getRuntimeBootstrapKey(slot)] = state;\n }, [getRuntimeBootstrapRegistry, getRuntimeBootstrapKey]);\n\n const hasTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): boolean => {\n if (terminalBootstrapStateRef.current[slot] === 'done') {\n return true;\n }\n if (getRuntimeBootstrapState(slot) === 'done') {\n return true;\n }\n try {\n return window.sessionStorage.getItem(getTerminalBootstrapKey(slot)) === '1';\n } catch {\n return false;\n }\n }, [getRuntimeBootstrapState, getTerminalBootstrapKey]);\n\n const beginTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): boolean => {\n const current = terminalBootstrapStateRef.current[slot];\n const runtimeState = getRuntimeBootstrapState(slot);\n if (current === 'done' || current === 'in_progress' || runtimeState === 'done' || runtimeState === 'in_progress') {\n return false;\n }\n terminalBootstrapStateRef.current[slot] = 'in_progress';\n setRuntimeBootstrapState(slot, 'in_progress');\n return true;\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const resetTerminalBootstrap = useCallback((slot: TerminalBootstrapSlot): void => {\n if (terminalBootstrapStateRef.current[slot] !== 'done') {\n terminalBootstrapStateRef.current[slot] = 'idle';\n }\n if (getRuntimeBootstrapState(slot) !== 'done') {\n setRuntimeBootstrapState(slot, 'idle');\n }\n }, [getRuntimeBootstrapState, setRuntimeBootstrapState]);\n\n const markTerminalBootstrapped = useCallback((slot: TerminalBootstrapSlot): void => {\n terminalBootstrapStateRef.current[slot] = 'done';\n setRuntimeBootstrapState(slot, 'done');\n try {\n window.sessionStorage.setItem(getTerminalBootstrapKey(slot), '1');\n } catch {\n // Ignore storage failures (private mode / disabled storage).\n }\n }, [getTerminalBootstrapKey, setRuntimeBootstrapState]);\n\n const isShellPromptReady = useCallback((term: TerminalWindow['term']): boolean => {\n const activeBuffer = term?.buffer?.active;\n if (!activeBuffer || typeof activeBuffer.getLine !== 'function') {\n // Fall back to ready when xterm internals are unavailable.\n return true;\n }\n\n const cursorLine = activeBuffer.baseY + activeBuffer.cursorY;\n for (let offset = 0; offset < 6; offset += 1) {\n const line = activeBuffer.getLine(cursorLine - offset);\n const text = line?.translateToString(true) ?? '';\n if (!text.trim()) continue;\n return SHELL_PROMPT_PATTERN.test(text);\n }\n return false;\n }, []);\n\n const stopTerminalProcessMonitor = useCallback(() => {\n if (terminalProcessMonitorCleanupRef.current) {\n terminalProcessMonitorCleanupRef.current();\n terminalProcessMonitorCleanupRef.current = null;\n }\n }, []);\n\n const startTerminalProcessMonitor = useCallback((\n iframe: HTMLIFrameElement,\n term: NonNullable<TerminalWindow['term']>\n ) => {\n stopTerminalProcessMonitor();\n\n let disposed = false;\n let writeDisposable: { dispose?: () => void } | null = null;\n let mutationObserver: MutationObserver | null = null;\n let intervalId: number | null = null;\n\n const updateProcessState = () => {\n if (disposed) return;\n const isRunning = !isShellPromptReady(term);\n setIsTerminalForegroundProcessRunning((current) => (current === isRunning ? current : isRunning));\n };\n\n updateProcessState();\n intervalId = window.setInterval(updateProcessState, 1000);\n\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n if (typeof xterm.onWriteParsed === 'function') {\n writeDisposable = xterm.onWriteParsed(updateProcessState) || null;\n } else {\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n mutationObserver = new MutationObserver(updateProcessState);\n mutationObserver.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (error) {\n console.error('Failed to setup terminal process monitor:', error);\n }\n\n terminalProcessMonitorCleanupRef.current = () => {\n disposed = true;\n if (intervalId !== null) {\n window.clearInterval(intervalId);\n intervalId = null;\n }\n if (writeDisposable && typeof writeDisposable.dispose === 'function') {\n writeDisposable.dispose();\n }\n mutationObserver?.disconnect();\n };\n }, [isShellPromptReady, stopTerminalProcessMonitor]);\n\n useEffect(() => {\n return () => {\n stopTerminalProcessMonitor();\n };\n }, [stopTerminalProcessMonitor]);\n\n useEffect(() => {\n setIsTerminalForegroundProcessRunning(false);\n stopTerminalProcessMonitor();\n }, [sessionName, stopTerminalProcessMonitor]);\n\n const injectTerminalStartupScript = useCallback((\n iframe: HTMLIFrameElement,\n win: TerminalWindow,\n term: NonNullable<TerminalWindow['term']>\n ): boolean => {\n if (isResume) return false;\n\n const script = startupScript?.trim();\n if (!script || terminalStartupScriptStateRef.current.injected) return false;\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n terminalStartupScriptStateRef.current.injected = true;\n if (terminalStartupScriptStateRef.current.timer !== null) {\n window.clearTimeout(terminalStartupScriptStateRef.current.timer);\n }\n terminalStartupScriptStateRef.current.timer = window.setTimeout(() => {\n terminalStartupScriptStateRef.current.timer = null;\n try {\n term.paste(script);\n pressEnter();\n } catch (error) {\n terminalStartupScriptStateRef.current.injected = false;\n console.error('Failed to inject startup script into terminal iframe:', error);\n }\n }, 500);\n\n return true;\n }, [isResume, startupScript]);\n\n useEffect(() => {\n if (isResume) return;\n if (!startupScript?.trim()) return;\n if (terminalStartupScriptStateRef.current.injected) return;\n\n let cancelled = false;\n\n const attemptInjection = (attempts = 0) => {\n if (cancelled || terminalStartupScriptStateRef.current.injected) return;\n if (attempts > 30) return;\n\n if (!hasTerminalBootstrapped('terminal')) {\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n return;\n }\n\n const iframe = terminalRef.current;\n if (!iframe) return;\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win?.term) {\n injectTerminalStartupScript(iframe, win, win.term);\n return;\n }\n } catch {\n // Ignore transient iframe access errors and retry.\n }\n\n window.setTimeout(() => attemptInjection(attempts + 1), 200);\n };\n\n attemptInjection();\n return () => {\n cancelled = true;\n };\n }, [hasTerminalBootstrapped, injectTerminalStartupScript, isResume, startupScript]);\n\n const [feedback, setFeedback] = useState<string>('Initializing...');\n const [cleanupPhase, setCleanupPhase] = useState<CleanupPhase>('idle');\n const [cleanupError, setCleanupError] = useState<string | null>(null);\n const [isStartingDevServer, setIsStartingDevServer] = useState(false);\n const [isTerminalForegroundProcessRunning, setIsTerminalForegroundProcessRunning] = useState(false);\n const [isRequestingCommit, setIsRequestingCommit] = useState(false);\n const [isMerging, setIsMerging] = useState(false);\n const [isRebasing, setIsRebasing] = useState(false);\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\n const [lastFileBrowserPath, setLastFileBrowserPath] = useState(worktree || repo);\n const [isInsertingFilePaths, setIsInsertingFilePaths] = useState(false);\n const [currentBaseBranch, setCurrentBaseBranch] = useState(baseBranch?.trim() || '');\n const [baseBranchOptions, setBaseBranchOptions] = useState<string[]>([]);\n const [isLoadingBaseBranches, setIsLoadingBaseBranches] = useState(false);\n const isLoadingBaseBranchesRef = useRef(false);\n const [isUpdatingBaseBranch, setIsUpdatingBaseBranch] = useState(false);\n const [divergence, setDivergence] = useState({ ahead: 0, behind: 0 });\n const [uncommittedFileCount, setUncommittedFileCount] = useState(0);\n const [isPreviewVisible, setIsPreviewVisible] = useState(false);\n const [previewInputUrl, setPreviewInputUrl] = useState('');\n const [previewUrl, setPreviewUrl] = useState('');\n const [isPreviewPickerActive, setIsPreviewPickerActive] = useState(false);\n const [isResolvingElement, setIsResolvingElement] = useState(false);\n const [agentPaneRatio, setAgentPaneRatio] = useState(DEFAULT_AGENT_PANE_RATIO);\n const [isSplitResizing, setIsSplitResizing] = useState(false);\n\n const [isTerminalMinimized, setIsTerminalMinimized] = useState(true);\n\n // Terminal resize state\n const [terminalSize, setTerminalSize] = useState({ width: 460, height: 320 });\n const [isResizing, setIsResizing] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n const resizeRef = useRef({ startX: 0, startY: 0, startWidth: 0, startHeight: 0 });\n const [terminalInteractionMode, setTerminalInteractionMode] = useState<TerminalInteractionMode>('scroll');\n const [isUpdatingTerminalInteractionMode, setIsUpdatingTerminalInteractionMode] = useState(false);\n const terminalInteractionRequestIdRef = useRef(0);\n\n useEffect(() => {\n setLastFileBrowserPath(worktree || repo);\n }, [repo, worktree]);\n\n useEffect(() => {\n const saved = localStorage.getItem(TERMINAL_SIZE_STORAGE_KEY);\n if (saved) {\n try {\n setTerminalSize(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to parse saved terminal size', e);\n }\n }\n\n const savedSplitRatio = localStorage.getItem(SPLIT_RATIO_STORAGE_KEY);\n if (savedSplitRatio) {\n const parsed = Number.parseFloat(savedSplitRatio);\n if (!Number.isNaN(parsed)) {\n setAgentPaneRatio(clampAgentPaneRatio(parsed));\n }\n }\n setIsLoaded(true);\n }, []);\n\n const startResize = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startWidth: terminalSize.width,\n startHeight: terminalSize.height\n };\n };\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = resizeRef.current.startX - e.clientX; // Dragging left increases width\n const deltaY = resizeRef.current.startY - e.clientY; // Dragging up increases height\n\n setTerminalSize({\n width: Math.max(300, Math.min(window.innerWidth - 32, resizeRef.current.startWidth + deltaX)),\n height: Math.max(100, Math.min(window.innerHeight - 32, resizeRef.current.startHeight + deltaY))\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n if (isLoaded && !isResizing) {\n localStorage.setItem(TERMINAL_SIZE_STORAGE_KEY, JSON.stringify(terminalSize));\n }\n }, [isLoaded, isResizing, terminalSize]);\n\n useEffect(() => {\n if (isLoaded && !isSplitResizing) {\n localStorage.setItem(SPLIT_RATIO_STORAGE_KEY, String(agentPaneRatio));\n }\n }, [agentPaneRatio, isLoaded, isSplitResizing]);\n\n const startSplitResize = (e: React.MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsSplitResizing(true);\n splitResizeRef.current = {\n startX: e.clientX,\n startRatio: agentPaneRatio,\n };\n };\n\n useEffect(() => {\n if (!isSplitResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const container = splitContainerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n if (rect.width <= 0) return;\n\n const delta = e.clientX - splitResizeRef.current.startX;\n const nextLeftWidth = splitResizeRef.current.startRatio * rect.width + delta;\n setAgentPaneRatio(clampAgentPaneRatio(nextLeftWidth / rect.width));\n };\n\n const handleMouseUp = () => {\n setIsSplitResizing(false);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isSplitResizing]);\n\n // Auto-scroll and focus terminal when restored from minimized state\n useEffect(() => {\n if (!isTerminalMinimized && terminalRef.current) {\n const iframe = terminalRef.current;\n // Small delay to allow layout to update and iframe to render\n setTimeout(() => {\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.scrollToBottom?.();\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n }\n } catch (e) {\n console.error('Failed to focus/scroll terminal on restore:', e);\n }\n }, 100);\n }\n }, [isTerminalMinimized]);\n\n // IDE Selection\n const [selectedIde, setSelectedIde] = useState<string>('vscode');\n\n useEffect(() => {\n const trimmedTitle = title?.trim();\n if (trimmedTitle) {\n document.title = `${trimmedTitle} | Viba`;\n return () => {\n document.title = 'Viba';\n };\n }\n\n document.title = 'Viba';\n return undefined;\n }, [title]);\n\n useEffect(() => {\n const loadConfig = async () => {\n const config = await getConfig();\n if (config.selectedIde && SUPPORTED_IDES.some(ide => ide.id === config.selectedIde)) {\n setSelectedIde(config.selectedIde);\n }\n };\n loadConfig();\n }, []);\n\n useEffect(() => {\n setCurrentBaseBranch(baseBranch?.trim() || '');\n setBaseBranchOptions([]);\n }, [baseBranch, sessionName]);\n\n useEffect(() => {\n setTerminalInteractionMode('scroll');\n setIsUpdatingTerminalInteractionMode(false);\n terminalInteractionRequestIdRef.current += 1;\n }, [sessionName]);\n\n const handleIdeChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n const value = e.target.value;\n setSelectedIde(value);\n await updateConfig({ selectedIde: value });\n };\n\n const handleOpenIde = () => {\n if (!worktree) return;\n const ide = SUPPORTED_IDES.find(i => i.id === selectedIde);\n if (!ide) return;\n\n const uri = `${ide.protocol}://file/${encodeURI(worktree)}`;\n window.open(uri, '_blank');\n };\n\n const applyTerminalInteractionMode = useCallback(async (\n mode: TerminalInteractionMode,\n options?: { silent?: boolean }\n ): Promise<boolean> => {\n if (terminalPersistenceMode !== 'tmux') return true;\n\n const requestId = ++terminalInteractionRequestIdRef.current;\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(true);\n }\n\n const mouseEnabled = mode === 'scroll';\n const [agentResult, terminalResult] = await Promise.all([\n setTmuxSessionMouseMode(sessionName, 'agent', mouseEnabled),\n setTmuxSessionMouseMode(sessionName, 'terminal', mouseEnabled),\n ]);\n\n if (requestId !== terminalInteractionRequestIdRef.current) {\n return false;\n }\n\n if (!options?.silent) {\n setIsUpdatingTerminalInteractionMode(false);\n }\n\n const failed = [agentResult, terminalResult].find((result) => !result.success);\n if (failed) {\n if (!options?.silent) {\n setFeedback(`Failed to switch to ${mode === 'scroll' ? 'scroll mode' : 'text select mode'}`);\n }\n return false;\n }\n\n if (!options?.silent) {\n setFeedback(mode === 'scroll' ? 'Terminal mode: Scroll' : 'Terminal mode: Text Select');\n }\n return true;\n }, [sessionName, terminalPersistenceMode]);\n\n const ensureTmuxStatusBarHidden = useCallback((slot: TerminalBootstrapSlot) => {\n if (terminalPersistenceMode !== 'tmux') return;\n if (tmuxStatusAppliedRef.current[slot]) return;\n\n void (async () => {\n const result = await setTmuxSessionStatusVisibility(sessionName, slot, false);\n if (result.success && result.applied) {\n tmuxStatusAppliedRef.current[slot] = true;\n } else if (!result.success) {\n console.error(`Failed to hide tmux status bar for ${slot}:`, result.error);\n }\n })();\n }, [sessionName, terminalPersistenceMode]);\n\n useEffect(() => {\n if (terminalPersistenceMode !== 'tmux') return;\n void applyTerminalInteractionMode('scroll', { silent: true });\n }, [applyTerminalInteractionMode, terminalPersistenceMode]);\n\n const handleToggleTerminalInteractionMode = useCallback(() => {\n if (terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode) return;\n\n const previousMode = terminalInteractionMode;\n const nextMode: TerminalInteractionMode = previousMode === 'scroll' ? 'select' : 'scroll';\n setTerminalInteractionMode(nextMode);\n\n void (async () => {\n const success = await applyTerminalInteractionMode(nextMode);\n if (!success) {\n setTerminalInteractionMode(previousMode);\n }\n })();\n }, [applyTerminalInteractionMode, isUpdatingTerminalInteractionMode, terminalInteractionMode, terminalPersistenceMode]);\n\n const handleShowDiffWithTrident = () => {\n if (!worktree || !branch) return;\n\n const params = new URLSearchParams({\n path: worktree,\n branch,\n });\n window.open(`${TRIDENT_WORKSPACE_URL}?${params.toString()}`, '_blank', 'noopener,noreferrer');\n };\n\n const handleNewAttempt = () => {\n if (!repo || !sessionName) return;\n const nextUrl = `/new?repo=${encodeURIComponent(repo)}&prefillFromSession=${encodeURIComponent(sessionName)}`;\n window.open(nextUrl, '_blank', 'noopener,noreferrer');\n };\n\n const runCleanup = async (requireConfirmation = true): Promise<boolean> => {\n if (!repo || !worktree || !branch) return false;\n if (requireConfirmation && !confirm('Are you sure you want to delete this session? This will remove the branch and worktree.')) return false;\n\n setCleanupError(null);\n setCleanupPhase('idle');\n setFeedback('Purging session...');\n\n try {\n const result = await deleteSessionInBackground(sessionName);\n if (!result.success) {\n console.error('Cleanup failed:', result.error || 'Unknown error');\n setCleanupPhase('error');\n setCleanupError(result.error || 'Failed to delete session');\n return false;\n }\n\n notifySessionsUpdated();\n } catch (error) {\n console.error('Cleanup request failed:', error);\n setCleanupPhase('error');\n setCleanupError(error instanceof Error ? error.message : 'Unknown error');\n return false;\n }\n\n // Use forced navigation here because App Router transitions can be\n // interrupted by iframe/server-action teardown in production builds.\n onExit(true);\n return true;\n };\n\n const handleCleanup = async () => {\n await runCleanup(true);\n };\n\n const sendPromptToAgentIframe = useCallback((prompt: string, action: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndSend = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win) {\n setTimeout(() => checkAndSend(attempts + 1), 300);\n return;\n }\n\n win.postMessage(\n {\n type: 'viba:agent-request',\n action,\n prompt,\n sessionName,\n branch,\n baseBranch: currentBaseBranch || undefined,\n timestamp: Date.now(),\n },\n '*'\n );\n\n if (!win.term) {\n setTimeout(() => checkAndSend(attempts + 1), 300);\n return;\n }\n\n win.term.paste(prompt);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n (textarea as HTMLElement).focus();\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to send prompt to agent iframe:', e);\n setTimeout(() => checkAndSend(attempts + 1), 300);\n }\n };\n\n checkAndSend();\n });\n }, [branch, currentBaseBranch, sessionName]);\n\n const handleCommit = async () => {\n setIsRequestingCommit(true);\n setFeedback('Requesting commit from agent...');\n\n const prompt = 'Please create a git commit with the current changes in this worktree.';\n const sent = await sendPromptToAgentIframe(prompt, 'commit');\n\n setFeedback(sent ? 'Commit request sent to agent' : 'Failed to send commit request to agent');\n setIsRequestingCommit(false);\n };\n\n const pasteIntoAgentIframe = useCallback((text: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n resolve(false);\n return;\n }\n\n const checkAndPaste = (attempts = 0) => {\n if (attempts > 30) {\n resolve(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (!win || !win.term) {\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n return;\n }\n\n win.term.paste(text);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n (textarea as HTMLElement).focus();\n }\n win.focus();\n resolve(true);\n } catch (e) {\n console.error('Failed to paste into agent iframe:', e);\n setTimeout(() => checkAndPaste(attempts + 1), 300);\n }\n };\n\n checkAndPaste();\n });\n }, []);\n\n const handleInsertFilePaths = useCallback(async (paths: string[]) => {\n if (paths.length === 0) return;\n\n setIsInsertingFilePaths(true);\n const textToInsert = `${paths.join(' ')} `;\n const inserted = await pasteIntoAgentIframe(textToInsert);\n setFeedback(\n inserted\n ? `Inserted ${paths.length} file path${paths.length === 1 ? '' : 's'} into agent input`\n : 'Failed to insert file paths into agent input'\n );\n setIsInsertingFilePaths(false);\n }, [pasteIntoAgentIframe]);\n\n const resolveComponentSourcePathByNames = useCallback(async (componentNames: string[]): Promise<{ resolvedName: string; sourcePath: string } | null> => {\n const normalizedNames = componentNames.map(normalizeComponentLookupName).filter(Boolean);\n if (normalizedNames.length === 0) return null;\n\n const roots = Array.from(\n new Set(\n [repo, worktree]\n .map((root) => (root || '').trim())\n .filter(Boolean)\n )\n );\n if (roots.length === 0) return null;\n\n for (const workspaceRoot of roots) {\n try {\n const response = await fetch('/api/component-source/resolve', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n componentNames: normalizedNames,\n workspaceRoot,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { resolvedName?: string; sourcePath?: string; error?: string } | null;\n if (!response.ok) {\n console.warn('Component source resolve miss', {\n componentNames: normalizedNames,\n workspaceRoot,\n error: payload?.error || response.statusText,\n });\n continue;\n }\n\n const sourcePath = typeof payload?.sourcePath === 'string' ? payload.sourcePath.trim() : '';\n const resolvedName = typeof payload?.resolvedName === 'string' ? payload.resolvedName.trim() : '';\n\n if (sourcePath && resolvedName) return { sourcePath, resolvedName };\n } catch (error) {\n console.error('Failed to resolve component source path:', error);\n }\n }\n\n return null;\n }, [repo, worktree]);\n\n const loadBaseBranchOptions = useCallback(async () => {\n if (!sessionName) return;\n if (isLoadingBaseBranchesRef.current) return;\n\n isLoadingBaseBranchesRef.current = true;\n setIsLoadingBaseBranches(true);\n\n try {\n const result = await listSessionBaseBranches(sessionName);\n if (result.success) {\n setBaseBranchOptions(result.branches ?? []);\n setCurrentBaseBranch(result.baseBranch?.trim() || '');\n } else if (result.error) {\n setFeedback(`Failed to load branches: ${result.error}`);\n }\n } catch (e) {\n console.error('Failed to load base branches:', e);\n } finally {\n isLoadingBaseBranchesRef.current = false;\n setIsLoadingBaseBranches(false);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n void loadBaseBranchOptions();\n }, [loadBaseBranchOptions, sessionName]);\n\n const loadSessionDivergence = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionDivergence(sessionName);\n if (result.success && typeof result.ahead === 'number' && typeof result.behind === 'number') {\n setDivergence({ ahead: result.ahead, behind: result.behind });\n }\n } catch (e) {\n console.error('Failed to load branch divergence:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName || !currentBaseBranch) {\n setDivergence({ ahead: 0, behind: 0 });\n return;\n }\n\n void loadSessionDivergence();\n const timer = window.setInterval(() => {\n void loadSessionDivergence();\n }, 60000);\n\n return () => window.clearInterval(timer);\n }, [currentBaseBranch, loadSessionDivergence, sessionName]);\n\n const handleBaseBranchChange = async (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!sessionName) return;\n\n const nextBaseBranch = e.target.value.trim();\n if (!nextBaseBranch || nextBaseBranch === currentBaseBranch) return;\n\n setIsUpdatingBaseBranch(true);\n setFeedback(`Updating base branch to ${nextBaseBranch}...`);\n\n try {\n const result = await updateSessionBaseBranch(sessionName, nextBaseBranch);\n if (result.success && result.baseBranch) {\n setCurrentBaseBranch(result.baseBranch);\n setFeedback(`Base branch updated to ${result.baseBranch}`);\n await loadBaseBranchOptions();\n await loadSessionDivergence();\n } else {\n setFeedback(`Failed to update base branch: ${result.error}`);\n }\n } catch (error) {\n console.error('Failed to update base branch:', error);\n setFeedback('Failed to update base branch');\n } finally {\n setIsUpdatingBaseBranch(false);\n }\n };\n\n const loadUncommittedFileCount = useCallback(async () => {\n if (!sessionName) return;\n\n try {\n const result = await getSessionUncommittedFileCount(sessionName);\n if (result.success && typeof result.count === 'number') {\n setUncommittedFileCount(result.count);\n }\n } catch (e) {\n console.error('Failed to load uncommitted file count:', e);\n }\n }, [sessionName]);\n\n useEffect(() => {\n if (!sessionName) return;\n\n void loadUncommittedFileCount();\n const timer = window.setInterval(() => {\n void loadUncommittedFileCount();\n }, 10000);\n\n return () => window.clearInterval(timer);\n }, [loadUncommittedFileCount, sessionName]);\n\n const runMerge = async (): Promise<boolean> => {\n if (!sessionName) return false;\n if (!currentBaseBranch) return false;\n\n setIsMerging(true);\n setFeedback('Merging session branch...');\n\n try {\n const result = await mergeSessionToBase(sessionName);\n if (result.success) {\n setFeedback(`Merged ${result.branchName} into ${result.baseBranch}`);\n void loadSessionDivergence();\n return true;\n } else {\n setFeedback(`Merge failed: ${result.error}`);\n return false;\n }\n } catch (e) {\n console.error('Merge request failed:', e);\n setFeedback('Merge failed');\n return false;\n } finally {\n setIsMerging(false);\n }\n };\n\n const handleMerge = async () => {\n await runMerge();\n };\n\n const [isRebaseDropdownOpen, setIsRebaseDropdownOpen] = useState(false);\n const rebaseDropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (rebaseDropdownRef.current && !rebaseDropdownRef.current.contains(event.target as Node)) {\n setIsRebaseDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleRebaseSelect = async (targetBranch: string) => {\n setIsRebaseDropdownOpen(false);\n if (!sessionName) return;\n\n const isNewBranch = targetBranch !== currentBaseBranch;\n\n setIsRebasing(true);\n setFeedback(isNewBranch ? `Updating base to ${targetBranch} and rebasing...` : 'Rebasing session branch...');\n\n try {\n if (isNewBranch) {\n const updateResult = await updateSessionBaseBranch(sessionName, targetBranch);\n if (!updateResult.success) {\n setFeedback(`Failed to update base branch: ${updateResult.error}`);\n setIsRebasing(false);\n return;\n }\n setCurrentBaseBranch(updateResult.baseBranch!);\n await loadBaseBranchOptions();\n }\n\n const result = await rebaseSessionOntoBase(sessionName);\n if (result.success) {\n setFeedback(`Rebased ${result.branchName} onto ${result.baseBranch}`);\n void loadSessionDivergence();\n } else {\n setFeedback(`Rebase failed: ${result.error}`);\n }\n } catch (e) {\n console.error('Rebase request failed:', e);\n setFeedback('Rebase failed');\n } finally {\n setIsRebasing(false);\n }\n };\n\n const handleRebase = () => {\n setIsRebaseDropdownOpen(!isRebaseDropdownOpen);\n };\n\n const loadPreviewViaProxy = useCallback(async (rawUrl: string, openPreview: boolean): Promise<boolean> => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) {\n setFeedback('Please enter a preview URL');\n return false;\n }\n\n setPreviewInputUrl(normalized);\n setIsPreviewPickerActive(false);\n setFeedback(`Loading preview: ${normalized}`);\n\n try {\n const response = await fetch('/api/preview-proxy/start', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n target: normalized,\n }),\n });\n\n const payload = await response.json().catch(() => null) as { error?: string; proxyUrl?: string } | null;\n if (!response.ok || !payload?.proxyUrl) {\n throw new Error(payload?.error || 'Failed to start preview proxy');\n }\n\n setPreviewUrl(payload.proxyUrl);\n if (openPreview) {\n setIsPreviewVisible(true);\n }\n setFeedback(`Loaded preview: ${normalized}`);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to load preview';\n console.error('Failed to load preview via proxy:', error);\n setFeedback(`Failed to load preview: ${message}`);\n return false;\n }\n }, []);\n\n const handleTogglePreviewPicker = useCallback(() => {\n if (!previewUrl) {\n setFeedback('Load a preview before picking elements');\n return;\n }\n\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return;\n }\n\n const nextState = !isPreviewPickerActive;\n previewWindow.postMessage({\n type: 'viba:preview-picker-toggle',\n active: nextState,\n }, '*');\n\n setIsPreviewPickerActive(nextState);\n setFeedback(nextState ? 'Picker enabled: click an element in the preview' : 'Picker disabled');\n }, [isPreviewPickerActive, previewUrl]);\n\n const postPreviewControlMessage = useCallback((payload: { action?: PreviewNavigationAction; type: string }) => {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (!previewWindow) {\n setFeedback('Preview is not ready yet');\n return false;\n }\n\n previewWindow.postMessage(payload, '*');\n return true;\n }, []);\n\n const handlePreviewNavigate = useCallback((action: PreviewNavigationAction) => {\n if (!previewUrl) {\n setFeedback('Load a preview before using navigation controls');\n return;\n }\n\n if (!postPreviewControlMessage({ type: 'viba:preview-navigation', action })) {\n return;\n }\n\n if (action === 'reload') {\n setFeedback('Reloading preview...');\n }\n }, [postPreviewControlMessage, previewUrl]);\n\n const handlePreviewIframeLoad = useCallback(() => {\n postPreviewControlMessage({ type: 'viba:preview-location-request' });\n }, [postPreviewControlMessage]);\n\n const { attachTerminalLinkHandler } = useTerminalLink({\n onLoadPreview: loadPreviewViaProxy\n });\n\n useEffect(() => {\n if (!isPreviewVisible) return;\n if (previewInputUrl.trim()) return;\n\n const timer = window.setTimeout(() => {\n previewAddressInputRef.current?.focus();\n }, 0);\n\n return () => {\n window.clearTimeout(timer);\n };\n }, [isPreviewVisible, previewInputUrl]);\n\n useEffect(() => {\n const handlePreviewMessage = (event: MessageEvent) => {\n if (!previewIframeRef.current || event.source !== previewIframeRef.current.contentWindow) return;\n\n const payload = event.data as {\n active?: boolean;\n element?: unknown;\n type?: string;\n url?: unknown;\n } | null;\n if (!payload || typeof payload !== 'object') return;\n\n if (payload.type === 'viba:preview-picker-state') {\n setIsPreviewPickerActive(Boolean(payload.active));\n return;\n }\n\n if (payload.type === 'viba:preview-picker-ready') {\n const previewWindow = previewIframeRef.current?.contentWindow;\n if (previewWindow) {\n previewWindow.postMessage({ type: 'viba:preview-location-request' }, '*');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-link-open') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n window.open(payload.url, '_blank', 'noopener,noreferrer');\n }\n return;\n }\n\n if (payload.type === 'viba:preview-location-change') {\n if (typeof payload.url === 'string' && payload.url.trim().length > 0) {\n setPreviewInputUrl(payload.url);\n }\n return;\n }\n\n if (payload.type === 'viba:preview-element-selected') {\n const selectedElement = (payload.element && typeof payload.element === 'object')\n ? payload.element as { reactComponentStack?: unknown[]; selector?: string | null }\n : null;\n const reactStack = Array.isArray(selectedElement?.reactComponentStack)\n ? selectedElement.reactComponentStack\n : [];\n const componentReference = buildComponentReferenceText(reactStack, worktree || repo);\n const firstReactComponent = reactStack[0] && typeof reactStack[0] === 'object'\n ? (reactStack[0] as { name?: unknown }).name\n : undefined;\n const fallbackName = typeof firstReactComponent === 'string' && firstReactComponent.trim().length > 0\n ? firstReactComponent.trim()\n : '';\n const builtInComponents = new Set([\n 'Suspense', 'ErrorBoundary', 'Router', 'AppRouter', 'LayoutRouter',\n 'RenderFromTemplateContext', 'ScrollAndFocusHandler', 'InnerLayoutRouter',\n 'RedirectErrorBoundary', 'NotFoundBoundary', 'LoadingBoundary',\n 'ReactDevOverlay', 'HotReload', 'AppContainer', 'Route', 'Link', 'Image',\n 'OuterLayoutRouter', 'Head', 'StringRefs', 'Fragment', 'Profiler',\n 'StrictMode', 'SuspenseList', 'Script', 'Page', '__next_root_layout_boundary__'\n ]);\n\n const stackComponentNames = Array.from(\n new Set(\n reactStack\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return '';\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? name.trim() : '';\n })\n .filter((name) => {\n if (!name) return false;\n if (builtInComponents.has(name)) return false;\n if (name.startsWith('styled.') || name.startsWith('Styled(')) return false;\n return true;\n })\n )\n );\n\n console.log('Filtered stack component names:', stackComponentNames);\n\n const identifier = componentReference\n || fallbackName\n || (typeof selectedElement?.selector === 'string' ? selectedElement.selector : '');\n\n console.log('Preview selected element:', selectedElement);\n console.log('Preview selected reactComponentStack:', reactStack);\n console.log('Preview selected identifier:', identifier);\n setIsPreviewPickerActive(false);\n\n if (!identifier) {\n setFeedback('Element selected. No identifier was resolved.');\n return;\n }\n\n void (async () => {\n let finalIdentifier = componentReference || '';\n\n if (!finalIdentifier && stackComponentNames.length > 0) {\n setIsResolvingElement(true);\n try {\n const result = await resolveComponentSourcePathByNames(stackComponentNames);\n if (result?.resolvedName && result?.sourcePath) {\n finalIdentifier = `${result.resolvedName} (${result.sourcePath})`;\n }\n } finally {\n setIsResolvingElement(false);\n }\n }\n\n if (!finalIdentifier) {\n if (stackComponentNames.length > 0) {\n setFeedback('Element selected, but source file path could not be resolved for the component');\n return;\n }\n finalIdentifier = identifier;\n }\n\n console.log('Final resolved component identifier:', finalIdentifier);\n\n const inserted = await pasteIntoAgentIframe(`${finalIdentifier} `);\n setFeedback(\n inserted\n ? `Element identifier sent to agent: ${finalIdentifier}`\n : 'Element selected, but failed to send identifier to agent input'\n );\n })();\n }\n };\n\n window.addEventListener('message', handlePreviewMessage);\n return () => {\n window.removeEventListener('message', handlePreviewMessage);\n };\n }, [pasteIntoAgentIframe, repo, resolveComponentSourcePathByNames, worktree]);\n\n useEffect(() => {\n setIsPreviewPickerActive(false);\n }, [previewUrl]);\n\n const handlePreviewSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void loadPreviewViaProxy(previewInputUrl, true);\n };\n\n const handleStartDevServer = () => {\n const script = devServerScript?.trim();\n if (!script || !terminalRef.current || isTerminalForegroundProcessRunning) return;\n\n // Auto-show terminal if minimized\n setIsTerminalMinimized(false);\n\n const iframe = terminalRef.current;\n setIsStartingDevServer(true);\n setFeedback('Starting dev server...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Failed to start dev server: terminal is not ready');\n setIsStartingDevServer(false);\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n win.term.paste(script);\n\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n win.term.paste('\\r');\n }\n\n win.focus();\n if (textarea) (textarea as HTMLElement).focus();\n\n setFeedback('Dev server start command sent');\n setIsStartingDevServer(false);\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 300);\n }\n } catch (e) {\n console.error('Dev server injection error', e);\n setFeedback('Failed to start dev server');\n setIsStartingDevServer(false);\n }\n };\n\n checkAndInject();\n };\n\n const handleIframeLoad = () => {\n if (!iframeRef.current) return;\n const iframe = iframeRef.current;\n\n // Safety check for Same-Origin to avoid errors if proxy isn't working\n try {\n // Just accessing contentWindow to see if it throws\n const _ = iframe.contentWindow;\n } catch (e) {\n setFeedback(\"Error: Cross-Origin access blocked. Ensure proxy is working.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n setFeedback('Connecting to terminal...');\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n setFeedback('Timeout waiting for terminal to be ready');\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('agent');\n const term = win.term;\n attachTerminalLinkHandler(iframe, agentFrameLinkCleanupRef, {\n directOpenBehavior: 'new_tab',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n };\n } catch { /* ignore if API unavailable */ }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('agent');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('agent');\n setFeedback('Attached to persisted terminal');\n } else {\n setFeedback('Reconnected to terminal');\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('agent')) {\n setFeedback('Reconnected to terminal');\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n // Attempt injection\n\n // User instructions:\n // 1. paste cd command\n // 2. dispatch keypress 13\n\n const targetPath = worktree || repo; // Fallback to repo if no worktree\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n // Send cd command\n term.paste(cmd);\n\n // Helper to press enter\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n\n pressEnter();\n markTerminalBootstrapped('agent');\n\n // Inject agent command if present\n if (agent) {\n const startAgentProcess = async () => {\n let agentCmd = '';\n\n if (isResume) {\n // Resume logic (keep startup runtime flags but do not override model)\n if (agent.toLowerCase().includes('gemini')) {\n agentCmd = `gemini --resume latest --yolo`;\n } else if (agent.toLowerCase().includes('codex')) {\n agentCmd = `codex resume --last --sandbox danger-full-access --ask-for-approval on-request --search`;\n } else if (agent.toLowerCase() === 'agent' || agent.toLowerCase().includes('cursor')) {\n agentCmd = `agent resume`;\n } else {\n // Generic fallback: <agent> resume\n agentCmd = `${quoteShellArg(agent)} resume`;\n }\n } else {\n const safeTitle = title?.trim() || '';\n const trimmedInitialMessage = initialMessage?.trim() || '';\n const taskParts: string[] = [];\n if (safeTitle) taskParts.push(safeTitle);\n if (trimmedInitialMessage) taskParts.push(trimmedInitialMessage);\n const taskContent = taskParts.join('\\n\\n');\n const attachmentPaths = (attachmentNames || [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => `${worktree || repo}-attachments/${name}`);\n const taskSections: string[] = [];\n if (taskContent) taskSections.push(taskContent);\n if (attachmentPaths.length > 0) {\n taskSections.push([\n 'Attachments:',\n ...attachmentPaths.map((attachmentPath) => `- ${attachmentPath}`),\n ].join('\\n'));\n }\n const fullTaskContent = taskSections.join('\\n\\n');\n let safeMessage = '';\n\n // Send startup prompt when user provided a task or attachments.\n if (fullTaskContent) {\n const instructionLines: string[] = [];\n if (sessionMode === 'plan') {\n instructionLines.push(PLAN_MODE_STARTUP_INSTRUCTION);\n }\n instructionLines.push(AUTO_COMMIT_INSTRUCTION);\n\n const fullMessage = [\n '# Instructions',\n '',\n instructionLines.join('\\n'),\n '',\n '# Task',\n '',\n fullTaskContent,\n ].join('\\n');\n\n try {\n const result = await writeSessionPromptFile(sessionName, fullMessage);\n if (result.success && result.filePath) {\n safeMessage = ` \"$(cat ${quoteShellArg(result.filePath)})\"`;\n } else {\n console.error('Failed to write prompt file, falling back to inline prompt', result.error);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n } catch (err) {\n console.error('Exception writing prompt file', err);\n safeMessage = ` ${quoteShellArg(fullMessage)}`;\n }\n }\n\n const modelArg = (model && model.toLowerCase() !== 'auto') ? ` --model ${quoteShellArg(model)}` : '';\n\n if (agent.toLowerCase().includes('codex')) {\n // Codex: codex --model gpt-5.3-codex --sandbox danger-full-access --ask-for-approval on-request --search\n agentCmd = `codex${modelArg} --sandbox danger-full-access --ask-for-approval on-request --search${safeMessage}`;\n } else if (agent.toLowerCase().includes('gemini')) {\n // Gemini: gemini --model gemini-3-pro-preview --yolo\n agentCmd = `gemini${modelArg} --yolo${safeMessage}`;\n } else if (agent.toLowerCase() === 'agent' || agent.toLowerCase().includes('cursor')) {\n // Cursor: agent --model opus-4.6-thinking\n agentCmd = `agent${modelArg}${safeMessage}`;\n } else {\n // Generic fallback: <agent> --model <model>\n agentCmd = `${quoteShellArg(agent)}${modelArg}${safeMessage}`;\n }\n }\n\n if (agentCmd) {\n term.paste(agentCmd);\n pressEnter();\n setFeedback(isResume ? `Resumed session with ${agent}` : `Session started with ${agent}`);\n\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n };\n\n setTimeout(() => startAgentProcess(), 500); // Wait a bit for cd to finish\n } else {\n setFeedback(`Session started ${worktree ? '(Worktree)' : ''}`);\n if (!isResume && onSessionStart) {\n onSessionStart();\n }\n }\n\n // Focus the iframe\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n\n } else {\n // Not ready yet\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n resetTerminalBootstrap('agent');\n console.error(\"Access error during injection:\", e);\n setFeedback('Error accessing terminal: ' + String(e));\n }\n };\n\n // Small delay to allow scripts to run\n setTimeout(() => checkAndInject(), 1000);\n };\n\n const handleTerminalLoad = () => {\n if (!terminalRef.current) return;\n const iframe = terminalRef.current;\n stopTerminalProcessMonitor();\n setIsTerminalForegroundProcessRunning(false);\n\n // Safety check\n try {\n const _ = iframe.contentWindow;\n } catch (e) {\n console.error(\"Secondary terminal: Cross-Origin access blocked.\");\n return;\n }\n\n if (iframe.contentWindow) {\n // Attempt to nullify the internal ttyd handler\n iframe.contentWindow.onbeforeunload = null;\n\n // Or add a high-priority listener that stops the popup\n iframe.contentWindow.addEventListener('beforeunload', (event) => {\n event.stopImmediatePropagation();\n }, true);\n }\n\n const checkAndInject = (attempts = 0) => {\n if (attempts > 30) {\n return;\n }\n\n try {\n const win = iframe.contentWindow as TerminalWindow | null;\n if (win && win.term) {\n ensureTmuxStatusBarHidden('terminal');\n const term = win.term;\n attachTerminalLinkHandler(iframe, terminalFrameLinkCleanupRef, {\n onLinkActivated: () => setIsTerminalMinimized(true),\n directOpenBehavior: 'preview',\n modifierOpenBehavior: 'new_tab',\n });\n\n // Set selection highlight color via xterm.js 5 theme API (canvas renderer)\n try {\n term.options.theme = {\n ...(term.options.theme || {}),\n selectionBackground: 'rgba(59, 130, 246, 0.4)',\n };\n } catch { /* ignore if API unavailable */ }\n\n startTerminalProcessMonitor(iframe, term);\n\n // Enable auto-scroll to bottom on output\n try {\n const xterm = term as TerminalWithOnWriteParsed;\n const scrollHandler = () => {\n const activeBuffer = xterm.buffer?.active as ({ baseY?: number; viewportY?: number } | undefined);\n const baseY = typeof activeBuffer?.baseY === 'number' ? activeBuffer.baseY : 0;\n const viewportY = typeof activeBuffer?.viewportY === 'number' ? activeBuffer.viewportY : baseY;\n\n // Only scroll if we are close to the bottom to allow reviewing history\n if (activeBuffer && (baseY - viewportY < 10)) {\n xterm.scrollToBottom?.();\n } else {\n // Fallback if buffer access fails or simple mode\n xterm.scrollToBottom?.();\n }\n };\n\n if (typeof xterm.onWriteParsed === 'function') {\n xterm.onWriteParsed(scrollHandler);\n } else {\n // Fallback for older xterm or different setups\n const screen = iframe.contentDocument?.querySelector('.xterm-screen') || iframe.contentDocument?.body;\n if (screen) {\n const observer = new MutationObserver(scrollHandler);\n observer.observe(screen, { childList: true, subtree: true, characterData: true });\n }\n }\n } catch (e) {\n console.error('Failed to setup auto-scroll:', e);\n }\n\n const alreadyBootstrapped = hasTerminalBootstrapped('terminal');\n const shouldSkipResumeInjection = Boolean(isResume) && terminalPersistenceMode === 'tmux';\n if (alreadyBootstrapped || shouldSkipResumeInjection) {\n if (shouldSkipResumeInjection && !alreadyBootstrapped) {\n markTerminalBootstrapped('terminal');\n }\n if (alreadyBootstrapped) {\n injectTerminalStartupScript(iframe, win, term);\n }\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n if (!isShellPromptReady(term) && attempts < 10) {\n setTimeout(() => checkAndInject(attempts + 1), 200);\n return;\n }\n\n if (!beginTerminalBootstrap('terminal')) {\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n return;\n }\n\n const targetPath = worktree || repo;\n const cmd = `cd ${quoteShellArg(targetPath)}`;\n term.paste(cmd);\n\n const pressEnter = () => {\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) {\n textarea.dispatchEvent(new KeyboardEvent('keypress', {\n bubbles: true,\n cancelable: true,\n charCode: 13,\n keyCode: 13,\n key: 'Enter',\n view: win\n }));\n } else {\n term.paste('\\r');\n }\n };\n pressEnter();\n markTerminalBootstrapped('terminal');\n injectTerminalStartupScript(iframe, win, term);\n\n // Focus\n win.focus();\n const textarea = iframe.contentDocument?.querySelector(\"textarea.xterm-helper-textarea\");\n if (textarea) (textarea as HTMLElement).focus();\n } else {\n setTimeout(() => checkAndInject(attempts + 1), 500);\n }\n } catch (e) {\n setIsTerminalForegroundProcessRunning(false);\n resetTerminalBootstrap('terminal');\n console.error(\"Secondary terminal injection error\", e);\n }\n };\n\n setTimeout(() => checkAndInject(), 1000);\n };\n\n if (!repo) return <div className=\"p-4 text-error\">No repository specified</div>;\n\n if (cleanupPhase === 'error') {\n return (\n <div className=\"flex h-screen w-full items-center justify-center bg-base-100\">\n <div className=\"card w-96 bg-base-200 shadow-xl\">\n <div className=\"card-body items-center text-center\">\n <h2 className=\"card-title text-error\">Cleanup failed</h2>\n <p>{cleanupError || 'An unknown error occurred while cleaning up this session.'}</p>\n <div className=\"card-actions justify-end\">\n <button className=\"btn btn-primary\" onClick={() => onExit()}>Back to Home</button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n const selectableBaseBranches = Array.from(new Set([\n ...(currentBaseBranch ? [currentBaseBranch] : []),\n ...baseBranchOptions\n ])).filter((branchOption) => branchOption !== branch || branchOption === currentBaseBranch);\n const terminalPanelRight = isTerminalMinimized\n ? `calc(${TERMINAL_MINIMIZED_VISIBLE_WIDTH}px - min(${terminalSize.width}px, calc(100vw - 2rem)))`\n : TERMINAL_PANEL_RIGHT_GAP;\n const hasDevServerScript = Boolean(devServerScript?.trim());\n const isDevButtonDisabled = !hasDevServerScript || isStartingDevServer || isTerminalForegroundProcessRunning;\n const devButtonTitle = !hasDevServerScript\n ? 'Set a dev server script to enable this button'\n : isTerminalForegroundProcessRunning\n ? 'A process is already running in the terminal'\n : 'Run dev server script in terminal';\n\n return (\n <div className={`flex flex-col h-screen w-full overflow-hidden bg-base-100 ${(isResizing || isSplitResizing) ? 'select-none' : ''}`}>\n {(isResizing || isSplitResizing) && (\n <div className={`fixed inset-0 z-[9999] ${isResizing ? 'cursor-nwse-resize' : 'cursor-col-resize'}`} />\n )}\n <div className=\"z-20 bg-base-300/95 p-2 text-xs flex justify-between px-4 font-mono select-none items-center shadow-md backdrop-blur-sm border-b border-base-content/10\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"btn btn-ghost btn-xs h-6 min-h-6 px-1 hover:bg-base-content/10\"\n onClick={() => onExit()}\n title=\"Back to Home\"\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"opacity-50\">Repo:</span>\n <span className=\"font-bold\">{getBaseName(repo)}</span>\n </div>\n {sessionName && (\n <div className=\"hidden min-[1200px]:flex min-w-0 items-center gap-2 text-[10px] opacity-70\">\n <span>Session:</span>\n <span className=\"truncate max-w-[220px]\" title={sessionName}>{sessionName}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden\">\n <select\n className=\"select select-xs h-6 min-h-6 bg-base-200 border-none focus:outline-none rounded-none pr-7\"\n value={selectedIde}\n onChange={handleIdeChange}\n >\n {SUPPORTED_IDES.map(ide => (\n <option key={ide.id} value={ide.id}>{ide.name}</option>\n ))}\n </select>\n <div className=\"w-[1px] h-4 bg-base-content/20\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none hover:bg-base-content/10\"\n onClick={handleOpenIde}\n title={`Open in ${SUPPORTED_IDES.find(i => i.id === selectedIde)?.name}`}\n >\n <ExternalLink className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Open</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleShowDiffWithTrident}\n disabled={!worktree || !branch}\n title=\"Open this worktree and branch in Trident\"\n >\n <GitBranch className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Diff</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleCommit}\n disabled={isRequestingCommit}\n title=\"Ask agent to create a commit with current changes\"\n >\n {isRequestingCommit ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitCommitHorizontal className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Commit ({uncommittedFileCount})</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={() => setIsFileBrowserOpen(true)}\n disabled={isInsertingFilePaths}\n title=\"Browse files and insert absolute paths into the agent input\"\n >\n {isInsertingFilePaths ? <span className=\"loading loading-spinner loading-xs\"></span> : <FolderOpen className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Add Files</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleNewAttempt}\n title=\"Start a new attempt in a new tab with this session context\"\n >\n <Plus className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>New Attempt</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleStartDevServer}\n disabled={isDevButtonDisabled}\n title={devButtonTitle}\n >\n {isStartingDevServer ? <span className=\"loading loading-spinner loading-xs\"></span> : <Play className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Dev</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={() => setIsPreviewVisible((previous) => !previous)}\n title={isPreviewVisible ? 'Hide preview panel' : 'Show preview panel'}\n >\n <Globe className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>{isPreviewVisible ? 'Close' : 'Preview'}</span>\n </button>\n </div>\n\n <div className=\"flex items-center border border-base-content/20 rounded overflow-hidden bg-base-100\">\n <button\n className={`btn btn-ghost btn-xs rounded-none h-6 min-h-6 border-none px-2 hover:bg-base-content/10 ${terminalInteractionMode === 'select' ? 'text-warning' : ''}`}\n onClick={handleToggleTerminalInteractionMode}\n disabled={terminalPersistenceMode !== 'tmux' || isUpdatingTerminalInteractionMode}\n title={terminalPersistenceMode === 'tmux'\n ? (terminalInteractionMode === 'scroll'\n ? 'Switch to text select mode for easier copy'\n : 'Switch to scroll mode for wheel scrollback')\n : 'Mode toggle is available only in tmux persistence mode'}\n >\n {isUpdatingTerminalInteractionMode ? (\n <span className=\"loading loading-spinner loading-xs\"></span>\n ) : (\n <MousePointer2 className=\"w-3 h-3\" />\n )}\n <span>{terminalInteractionMode === 'scroll' ? 'Scroll Mode' : 'Text Select'}</span>\n </button>\n </div>\n\n\n\n <div className=\"flex items-center border border-base-content/20 rounded relative bg-base-100\" ref={rebaseDropdownRef}>\n <div className=\"relative\">\n <button\n className=\"btn btn-ghost btn-xs rounded-none rounded-l h-6 min-h-6 border-none px-2 hover:bg-base-content/10\"\n onClick={handleRebase}\n disabled={isRebasing || isMerging || isUpdatingBaseBranch}\n title=\"Select base branch and rebase\"\n >\n {isRebasing ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitPullRequestArrow className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Rebase</span>\n <ChevronDown className=\"w-3 h-3 opacity-50 ml-0.5\" />\n </button>\n {isRebaseDropdownOpen && (\n <div className=\"absolute top-full left-0 z-50 mt-1 w-64 p-0 shadow-xl dropdown-content bg-base-200 rounded-box border border-base-content/20 flex flex-col max-h-80 overflow-hidden\">\n <div className=\"px-4 py-2 text-[10px] uppercase font-bold tracking-wider opacity-50 border-b border-base-content/10 bg-base-200 flex justify-between items-center shrink-0\">\n <span>Select Base Branch</span>\n {(isLoadingBaseBranches || isUpdatingBaseBranch) && <span className=\"loading loading-spinner loading-xs\"></span>}\n </div>\n <ul className=\"menu p-0 overflow-y-auto flex-nowrap custom-scrollbar overflow-x-hidden w-full\">\n {selectableBaseBranches.length > 0 ? (\n selectableBaseBranches.map((branchOption) => (\n <li key={branchOption}>\n <button\n onClick={() => handleRebaseSelect(branchOption)}\n className={`flex justify-between items-center text-xs py-2 truncate max-w-full rounded-none ${branchOption === currentBaseBranch ? 'active font-bold' : ''}`}\n title={branchOption}\n >\n <span className=\"truncate\">{branchOption}</span>\n {branchOption === currentBaseBranch && <span className=\"opacity-70 text-[10px] ml-2 shrink-0\">(Current)</span>}\n </button>\n </li>\n ))\n ) : (\n <li className=\"text-xs px-4 py-2 opacity-50 italic text-center\">No other branches found</li>\n )}\n <div className=\"divider my-1 opacity-50\"></div>\n <li>\n <button onClick={() => void loadBaseBranchOptions()} className=\"text-[10px] justify-center opacity-70 hover:opacity-100\">\n Refresh Branches\n </button>\n </li>\n </ul>\n </div>\n )}\n </div>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-xs btn-success rounded-none h-6 min-h-6 border-none px-2 hover:bg-success/20 hover:border-transparent\"\n onClick={handleMerge}\n disabled={isMerging || isRebasing || isUpdatingBaseBranch || !currentBaseBranch}\n title={currentBaseBranch ? `Merge current branch (${branch}) into target branch (${currentBaseBranch})` : 'Target branch unavailable for this session'}\n >\n {isMerging ? <span className=\"loading loading-spinner loading-xs\"></span> : <GitMerge className=\"w-3 h-3\" />}\n <span className={headerButtonLabelClass}>Merge</span>\n </button>\n <div className=\"w-[1px] h-4 bg-base-content/10\"></div>\n <button\n className=\"btn btn-ghost btn-error btn-xs rounded-none rounded-r h-6 min-h-6 border-none px-2 hover:bg-error/20 hover:border-transparent\"\n onClick={handleCleanup}\n disabled={isMerging || isRebasing || !worktree}\n title=\"Clean up and exit\"\n >\n <Trash2 className=\"w-3 h-3\" />\n <span className={headerButtonLabelClass}>Purge</span>\n </button>\n </div>\n\n {currentBaseBranch && (\n <div className=\"flex items-center gap-2 text-xs opacity-80\" title={`Divergence against ${currentBaseBranch}`}>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowUp className=\"w-3 h-3\" />\n {divergence.ahead}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <ArrowDown className=\"w-3 h-3\" />\n {divergence.behind}\n </span>\n </div>\n )}\n\n <div className=\"hidden min-[1200px]:block w-[1px] h-4 bg-base-content/20 mx-2\"></div>\n\n <div className=\"hidden min-[1200px]:flex min-w-0 max-w-[280px] items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${feedback.includes('Error') || feedback.includes('failed') ? 'bg-error' : feedback.includes('started') || feedback.includes('Merged') || feedback.includes('Rebased') || feedback.includes('sent') ? 'bg-success' : 'bg-warning'}`}></span>\n <span className=\"truncate\" title={feedback}>{feedback}</span>\n </div>\n\n </div>\n </div>\n\n <div ref={splitContainerRef} className=\"flex min-h-0 flex-1 w-full\">\n <div\n className=\"h-full min-w-0\"\n style={{ width: isPreviewVisible ? `${agentPaneRatio * 100}%` : '100%' }}\n >\n <iframe\n ref={iframeRef}\n src={agentTerminalSrc}\n className={`h-full w-full border-none dark:invert dark:brightness-90 ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleIframeLoad}\n />\n </div>\n\n {isPreviewVisible && (\n <>\n <div\n className=\"relative h-full w-2 shrink-0 cursor-col-resize bg-base-300/40 hover:bg-base-content/20\"\n onMouseDown={startSplitResize}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize preview panel\"\n title=\"Drag to resize preview panel\"\n >\n <div className=\"absolute left-1/2 top-1/2 h-12 w-[2px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-base-content/30\" />\n </div>\n <div className=\"flex h-full min-w-0 flex-1 flex-col border-l border-base-content/10 bg-base-200/50\">\n <form\n className=\"flex items-center gap-2 border-b border-base-content/10 bg-base-200 px-3 py-2\"\n onSubmit={handlePreviewSubmit}\n >\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('back')}\n disabled={!previewUrl}\n title=\"Go back\"\n aria-label=\"Go back\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('forward')}\n disabled={!previewUrl}\n title=\"Go forward\"\n aria-label=\"Go forward\"\n >\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n <button\n className=\"btn btn-ghost btn-xs h-7 min-h-7 w-7 p-0\"\n type=\"button\"\n onClick={() => handlePreviewNavigate('reload')}\n disabled={!previewUrl}\n title=\"Reload preview\"\n aria-label=\"Reload preview\"\n >\n <RotateCw className=\"h-3.5 w-3.5\" />\n </button>\n <input\n ref={previewAddressInputRef}\n type=\"text\"\n className=\"input input-xs input-bordered w-full font-mono\"\n value={previewInputUrl}\n onChange={(event) => setPreviewInputUrl(event.target.value)}\n placeholder=\"http://127.0.0.1:3000\"\n spellCheck={false}\n />\n <button\n className={`btn btn-ghost btn-xs ${isPreviewPickerActive ? 'btn-active text-success' : ''}`}\n type=\"button\"\n onClick={handleTogglePreviewPicker}\n disabled={!previewUrl || isResolvingElement}\n title={isPreviewPickerActive ? 'Disable picker' : 'Pick element from preview'}\n >\n {isResolvingElement ? (\n <span className=\"loading loading-spinner loading-xs w-3 h-3\"></span>\n ) : (\n <MousePointer2 className=\"h-3 w-3\" />\n )}\n </button>\n <button className=\"btn btn-xs\" type=\"submit\">\n Go\n </button>\n </form>\n <div className=\"min-h-0 flex-1\">\n {previewUrl ? (\n <iframe\n ref={previewIframeRef}\n src={previewUrl}\n className={`h-full w-full border-none ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n title=\"Dev server preview\"\n onLoad={handlePreviewIframeLoad}\n sandbox=\"allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-downloads\"\n />\n ) : (\n <div className=\"flex h-full items-center justify-center px-6 text-center text-xs opacity-70\">\n Run the dev server, or enter a URL above to load a preview.\n </div>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* floating terminal panel */}\n <div\n className={`absolute z-30 overflow-hidden rounded-lg border border-base-content/20 bg-base-200/95 shadow-2xl backdrop-blur-sm ${(isResizing || isSplitResizing) ? '' : 'transition-all'}`}\n style={{\n bottom: 80,\n right: terminalPanelRight,\n width: terminalSize.width,\n height: isTerminalMinimized ? TERMINAL_HEADER_HEIGHT : terminalSize.height,\n maxWidth: 'calc(100vw - 2rem)',\n maxHeight: 'calc(100vh - 2rem)'\n }}\n >\n <button\n className={`absolute left-0 top-0 z-50 flex h-10 w-10 items-center justify-center text-base-content/30 hover:text-base-content/60 ${isTerminalMinimized ? 'cursor-pointer' : 'cursor-nwse-resize'}`}\n onMouseDown={!isTerminalMinimized ? startResize : undefined}\n onClick={isTerminalMinimized ? () => setIsTerminalMinimized(false) : undefined}\n title={isTerminalMinimized ? 'Expand terminal' : \"Drag to resize\"}\n type=\"button\"\n >\n <Grip size={14} />\n </button>\n {!isTerminalMinimized && (\n <button\n className=\"flex h-10 w-full items-center justify-between px-3 pl-10 text-xs font-mono hover:bg-base-content/10\"\n onClick={() => setIsTerminalMinimized((prev) => !prev)}\n title=\"Minimize terminal\"\n type=\"button\"\n >\n <span>Terminal</span>\n <span className=\"opacity-70\">Hide</span>\n </button>\n )}\n <div className={isTerminalMinimized ? 'h-0 overflow-hidden' : 'h-[calc(100%-2.5rem)]'}>\n <iframe\n ref={terminalRef}\n src={floatingTerminalSrc}\n className={`h-full w-full border-none dark:invert dark:brightness-90 ${(isResizing || isSplitResizing) ? 'pointer-events-none' : ''}`}\n allow=\"clipboard-read; clipboard-write\"\n onLoad={handleTerminalLoad}\n />\n </div>\n </div>\n\n {isFileBrowserOpen && (\n <SessionFileBrowser\n initialPath={lastFileBrowserPath}\n worktreePath={worktree}\n onPathChange={setLastFileBrowserPath}\n onConfirm={(paths) => {\n setIsFileBrowserOpen(false);\n void handleInsertFilePaths(paths);\n }}\n onCancel={() => setIsFileBrowserOpen(false)}\n />\n )}\n </div>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"403d01ddfa46ce8610976246966b664f0946702936\":\"consumeSessionLaunchContext\"},\"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_3=/*#__PURE__*/createServerReference(\"403d01ddfa46ce8610976246966b664f0946702936\",callServer,void 0,findSourceMapURL,\"consumeSessionLaunchContext\");export{$$RSC_SERVER_ACTION_3 as consumeSessionLaunchContext};","/* __next_internal_action_entry_do_not_use__ [{\"4097dda25382b44a878e1536ddfd83526a3409dbb7\":\"getSessionMetadata\"},\"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_6=/*#__PURE__*/createServerReference(\"4097dda25382b44a878e1536ddfd83526a3409dbb7\",callServer,void 0,findSourceMapURL,\"getSessionMetadata\");export{$$RSC_SERVER_ACTION_6 as getSessionMetadata};","/* __next_internal_action_entry_do_not_use__ [{\"4003e7c19a1d64b9d311a6e8f69bfed651e6c0a0c7\":\"markSessionInitialized\"},\"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_9=/*#__PURE__*/createServerReference(\"4003e7c19a1d64b9d311a6e8f69bfed651e6c0a0c7\",callServer,void 0,findSourceMapURL,\"markSessionInitialized\");export{$$RSC_SERVER_ACTION_9 as markSessionInitialized};","/* __next_internal_action_entry_do_not_use__ [{\"7f5dded1f90b9ee17c0318b47640fddefe4a9839b9\":\"getSessionTerminalSources\"},\"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_9=/*#__PURE__*/createServerReference(\"7f5dded1f90b9ee17c0318b47640fddefe4a9839b9\",callServer,void 0,findSourceMapURL,\"getSessionTerminalSources\");export{$$RSC_SERVER_ACTION_9 as getSessionTerminalSources};","export const normalizePreviewUrl = (rawValue: string): string | null => {\n const trimmed = rawValue.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return null;\n return `http://${trimmed}`;\n};\n","export const quoteShellArg = (value: string): string => `'${value.replace(/'/g, \"'\\\\''\")}'`;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]];\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/chevron-down\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 ChevronDown = createLucideIcon('chevron-down', __iconNode);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }]];\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/chevron-left\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 ChevronLeft = createLucideIcon('chevron-left', __iconNode);\n\nexport default ChevronLeft;\n","export type TerminalSessionRole = 'agent' | 'terminal';\nexport type GitRemoteProvider = 'github' | 'gitlab';\nexport type TerminalSessionEnvironment = {\n name: 'GITHUB_TOKEN' | 'GITLAB_TOKEN';\n value: string;\n};\ntype DetectGitRemoteProviderOptions = {\n gitlabHosts?: string[];\n};\n\nfunction sanitizeTmuxSessionName(value: string): string {\n const safe = value.trim().replace(/[^a-zA-Z0-9_-]/g, '-');\n return safe || 'session';\n}\n\nexport function getTmuxSessionName(sessionName: string, role: TerminalSessionRole): string {\n return `viba-${sanitizeTmuxSessionName(sessionName).slice(0, 40)}-${role}`;\n}\n\nfunction normalizeGitRemoteUrl(remoteUrl: string): string {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return '';\n\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (!scpLikeMatch) {\n return '';\n }\n\n const userPart = scpLikeMatch[1] || '';\n const host = scpLikeMatch[2];\n const path = scpLikeMatch[3].replace(/^\\/+/, '');\n return `ssh://${userPart}${host}/${path}`;\n}\n\nexport function parseGitRemoteHost(remoteUrl: string): string | null {\n const normalized = normalizeGitRemoteUrl(remoteUrl);\n if (!normalized) return null;\n\n try {\n return new URL(normalized).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction normalizeKnownHost(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n try {\n return new URL(trimmed).hostname.toLowerCase();\n } catch {\n // Fall through to parse as a bare host (optionally with port).\n }\n\n try {\n return new URL(`ssh://${trimmed}`).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nexport function detectGitRemoteProvider(\n remoteUrl: string,\n options?: DetectGitRemoteProviderOptions,\n): GitRemoteProvider | null {\n const host = parseGitRemoteHost(remoteUrl);\n if (!host) return null;\n\n if (host === 'github.com' || host.includes('github')) {\n return 'github';\n }\n\n if (host === 'gitlab.com' || host.includes('gitlab')) {\n return 'gitlab';\n }\n\n if (options?.gitlabHosts?.some((knownHost) => normalizeKnownHost(knownHost) === host)) {\n return 'gitlab';\n }\n\n return null;\n}\n\nexport function buildTtydTerminalSrc(\n sessionName: string,\n role: TerminalSessionRole,\n environment?: TerminalSessionEnvironment | null,\n): string {\n const tmuxSession = getTmuxSessionName(sessionName, role);\n const params = new URLSearchParams();\n params.append('arg', 'new-session');\n if (environment?.value) {\n params.append('arg', '-e');\n params.append('arg', `${environment.name}=${environment.value}`);\n }\n params.append('arg', '-A');\n params.append('arg', '-s');\n params.append('arg', tmuxSession);\n return `/terminal?${params.toString()}`;\n}\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '5', r: '1', key: 'gxeob9' }],\n ['circle', { cx: '19', cy: '5', r: '1', key: 'w8mnmm' }],\n ['circle', { cx: '5', cy: '5', r: '1', key: 'lttvr7' }],\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n ['circle', { cx: '12', cy: '19', r: '1', key: 'lyex9k' }],\n ['circle', { cx: '19', cy: '19', r: '1', key: 'shf9b7' }],\n ['circle', { cx: '5', cy: '19', r: '1', key: 'bfqh0e' }],\n];\n\n/**\n * @component @name Grip\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grip\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 Grip = createLucideIcon('grip', __iconNode);\n\nexport default Grip;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 3v18', key: '108xh3' }],\n ['path', { d: 'M3 12h18', key: '1i2n21' }],\n ['rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', key: 'h1oib' }],\n];\n\n/**\n * @component @name Grid2x2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/grid-2x2\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 Grid2x2 = createLucideIcon('grid-2x2', __iconNode);\n\nexport default Grid2x2;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n];\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-up\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 ArrowUp = createLucideIcon('arrow-up', __iconNode);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n [\n 'path',\n {\n d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2',\n key: '116196',\n },\n ],\n];\n\n/**\n * @component @name Clipboard\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/clipboard\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 Clipboard = createLucideIcon('clipboard', __iconNode);\n\nexport default Clipboard;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '5', cy: '6', r: '3', key: '1qnov2' }],\n ['path', { d: 'M5 9v12', key: 'ih889a' }],\n ['circle', { cx: '19', cy: '18', r: '3', key: '1qljk2' }],\n ['path', { d: 'm15 9-3-3 3-3', key: '1lwv8l' }],\n ['path', { d: 'M12 6h5a2 2 0 0 1 2 2v7', key: '1yj91y' }],\n];\n\n/**\n * @component @name GitPullRequestArrow\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-pull-request-arrow\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 GitPullRequestArrow = createLucideIcon('git-pull-request-arrow', __iconNode);\n\nexport default GitPullRequestArrow;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 17v5', key: 'bb1du9' }],\n [\n 'path',\n {\n d: 'M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z',\n key: '1nkz8b',\n },\n ],\n];\n\n/**\n * @component @name Pin\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pin\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 Pin = createLucideIcon('pin', __iconNode);\n\nexport default Pin;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20', key: '13o1zl' }],\n ['path', { d: 'M2 12h20', key: '9i4pu4' }],\n];\n\n/**\n * @component @name Globe\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/globe\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 Globe = createLucideIcon('globe', __iconNode);\n\nexport default Globe;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8', key: '5wwlr5' }],\n [\n 'path',\n {\n d: 'M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n key: 'r6nss1',\n },\n ],\n];\n\n/**\n * @component @name House\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/house\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 House = createLucideIcon('house', __iconNode);\n\nexport default House;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '3', key: '1v7zrd' }],\n ['line', { x1: '3', x2: '9', y1: '12', y2: '12', key: '1dyftd' }],\n ['line', { x1: '15', x2: '21', y1: '12', y2: '12', key: 'oup4p8' }],\n];\n\n/**\n * @component @name GitCommitHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-commit-horizontal\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 GitCommitHorizontal = createLucideIcon('git-commit-horizontal', __iconNode);\n\nexport default GitCommitHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n];\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-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 ArrowRight = createLucideIcon('arrow-right', __iconNode);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8', key: '1p45f6' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n];\n\n/**\n * @component @name RotateCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/rotate-cw\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 RotateCw = createLucideIcon('rotate-cw', __iconNode);\n\nexport default RotateCw;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '18', cy: '18', r: '3', key: '1xkwt0' }],\n ['circle', { cx: '6', cy: '6', r: '3', key: '1lh9wr' }],\n ['path', { d: 'M6 21V9a9 9 0 0 0 9 9', key: '7kw0sc' }],\n];\n\n/**\n * @component @name GitMerge\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/git-merge\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 GitMerge = createLucideIcon('git-merge', __iconNode);\n\nexport default GitMerge;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 5v14', key: 's699le' }],\n ['path', { d: 'm19 12-7 7-7-7', key: '1idqje' }],\n];\n\n/**\n * @component @name ArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-down\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 ArrowDown = createLucideIcon('arrow-down', __iconNode);\n\nexport default ArrowDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M3 5h.01', key: '18ugdj' }],\n ['path', { d: 'M3 12h.01', key: 'nlz23k' }],\n ['path', { d: 'M3 19h.01', key: 'noohij' }],\n ['path', { d: 'M8 5h13', key: '1pao27' }],\n ['path', { d: 'M8 12h13', key: '1za7za' }],\n ['path', { d: 'M8 19h13', key: 'm83p4d' }],\n];\n\n/**\n * @component @name List\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/list\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 List = createLucideIcon('list', __iconNode);\n\nexport default List;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 17v5', key: 'bb1du9' }],\n ['path', { d: 'M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89', key: 'znwnzq' }],\n ['path', { d: 'm2 2 20 20', key: '1ooewy' }],\n [\n 'path',\n {\n d: 'M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11',\n key: 'c9qhm2',\n },\n ],\n];\n\n/**\n * @component @name PinOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pin-off\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 PinOff = createLucideIcon('pin-off', __iconNode);\n\nexport default PinOff;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 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.9H18a2 2 0 0 1 2 2v2',\n key: 'usdka0',\n },\n ],\n];\n\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/folder-open\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 FolderOpen = createLucideIcon('folder-open', __iconNode);\n\nexport default FolderOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n ['path', { d: 'M10 9H8', key: 'b1mrlr' }],\n ['path', { d: 'M16 13H8', key: 't4e002' }],\n ['path', { d: 'M16 17H8', key: 'z1uh3a' }],\n];\n\n/**\n * @component @name FileText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-text\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 FileText = createLucideIcon('file-text', __iconNode);\n\nexport default FileText;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z',\n key: 'edeuup',\n },\n ],\n];\n\n/**\n * @component @name MousePointer2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/mouse-pointer-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 MousePointer2 = createLucideIcon('mouse-pointer-2', __iconNode);\n\nexport default MousePointer2;\n","import { useCallback } from 'react';\nimport type { MutableRefObject } from 'react';\nimport { normalizePreviewUrl } from '@/lib/url';\n\nexport type TerminalWindow = Window & {\n term?: {\n paste: (text: string) => void;\n scrollToBottom?: () => void;\n buffer?: {\n active?: {\n baseY: number;\n cursorY: number;\n getLine?: (lineIndex: number) => { translateToString: (trimRight?: boolean) => string } | undefined;\n };\n };\n options: {\n linkHandler?: TerminalLinkHandler | null;\n theme?: Record<string, string>;\n [key: string]: unknown;\n };\n _core?: {\n _linkProviderService?: {\n linkProviders?: Map<number, TerminalLinkProvider>;\n };\n };\n };\n};\n\nexport type TerminalLinkProvider = {\n _handler?: (event: MouseEvent | undefined, url: string) => void;\n provideLinks?: (line: number, callback: (links: TerminalLink[] | undefined) => void) => void;\n};\n\nexport type TerminalLink = {\n text: string;\n activate?: (event: MouseEvent | undefined, text: string) => void;\n [key: string]: unknown;\n};\n\nexport type TerminalLinkHandler = {\n allowNonHttpProtocols?: boolean;\n activate?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n hover?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n leave?: (event: MouseEvent | undefined, url: string, range?: unknown) => void;\n};\n\nexport type TerminalLinkHandlerOptions = {\n onLinkActivated?: () => void;\n directOpenBehavior?: TerminalLinkOpenBehavior;\n modifierOpenBehavior?: TerminalLinkOpenBehavior;\n};\n\ninterface UseTerminalLinkProps {\n onLoadPreview: (url: string, openPreview: boolean) => Promise<boolean>;\n}\n\nexport type TerminalLinkOpenBehavior = 'preview' | 'new_tab';\n\nexport function useTerminalLink({ onLoadPreview }: UseTerminalLinkProps) {\n const handleTerminalLinkOpen = useCallback((rawUrl: string, openBehavior: TerminalLinkOpenBehavior): boolean => {\n const normalized = normalizePreviewUrl(rawUrl);\n if (!normalized) return false;\n\n if (openBehavior === 'new_tab') {\n window.open(normalized, '_blank', 'noopener,noreferrer');\n return true;\n }\n\n void onLoadPreview(normalized, true);\n return true;\n }, [onLoadPreview]);\n\n const attachTerminalLinkHandler = useCallback((\n iframe: HTMLIFrameElement,\n cleanupRef: MutableRefObject<(() => void) | null>,\n options?: TerminalLinkHandlerOptions\n ) => {\n cleanupRef.current?.();\n const frameWindow = iframe.contentWindow as TerminalWindow | null;\n const terminal = frameWindow?.term;\n if (!frameWindow || !terminal) return;\n const notifyLinkActivated = options?.onLinkActivated;\n const directOpenBehavior = options?.directOpenBehavior ?? 'preview';\n const modifierOpenBehavior = options?.modifierOpenBehavior ?? 'new_tab';\n const resolveOpenBehavior = (openWithModifier: boolean): TerminalLinkOpenBehavior => (\n openWithModifier ? modifierOpenBehavior : directOpenBehavior\n );\n\n const restorers: Array<() => void> = [];\n\n const frameDocument = iframe.contentDocument;\n let lastModifierState = {\n metaKey: false,\n ctrlKey: false,\n at: 0,\n };\n\n if (frameDocument) {\n const recordModifierState = (event: MouseEvent) => {\n lastModifierState = {\n metaKey: event.metaKey,\n ctrlKey: event.ctrlKey,\n at: Date.now(),\n };\n };\n\n frameDocument.addEventListener('mousedown', recordModifierState, true);\n frameDocument.addEventListener('click', recordModifierState, true);\n restorers.push(() => {\n frameDocument.removeEventListener('mousedown', recordModifierState, true);\n frameDocument.removeEventListener('click', recordModifierState, true);\n });\n }\n\n const originalOpen = frameWindow.open.bind(frameWindow);\n const patchedOpen: Window['open'] = (...args) => {\n const openWithModifier = Date.now() - lastModifierState.at < 1000;\n const shouldTreatAsModifierOpen = openWithModifier && (lastModifierState.metaKey || lastModifierState.ctrlKey);\n const openBehavior = resolveOpenBehavior(shouldTreatAsModifierOpen);\n\n if (typeof args[0] === 'string' && args[0].trim()) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(args[0], openBehavior);\n if (handled) {\n return null;\n }\n return originalOpen(...args);\n }\n\n if (args.length === 0) {\n let fallbackWindow: Window | null = null;\n const syntheticWindow = {\n opener: null,\n location: {\n set href(url: string) {\n notifyLinkActivated?.();\n const handled = handleTerminalLinkOpen(url, openBehavior);\n\n if (!handled) {\n fallbackWindow = originalOpen();\n if (fallbackWindow) {\n try {\n fallbackWindow.opener = null;\n } catch {\n // Ignore opener assignment failures\n }\n fallbackWindow.location.href = url;\n }\n }\n },\n get href() {\n return '';\n },\n },\n } as unknown as Window;\n\n return syntheticWindow;\n }\n\n return originalOpen(...args);\n };\n\n frameWindow.open = patchedOpen;\n restorers.push(() => {\n frameWindow.open = originalOpen;\n });\n\n const providers = terminal._core?._linkProviderService?.linkProviders;\n\n if (providers instanceof Map) {\n for (const provider of providers.values()) {\n if (!provider || typeof provider !== 'object') continue;\n\n if (typeof provider._handler === 'function') {\n const originalHandler = provider._handler;\n provider._handler = (event: MouseEvent | undefined, url: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalHandler(event, url);\n }\n };\n\n restorers.push(() => {\n provider._handler = originalHandler;\n });\n }\n\n if (typeof provider.provideLinks === 'function') {\n const originalProvideLinks = provider.provideLinks.bind(provider);\n provider.provideLinks = (line: number, callback: (links: TerminalLink[] | undefined) => void) => {\n originalProvideLinks(line, (links: TerminalLink[] | undefined) => {\n if (Array.isArray(links)) {\n for (const link of links) {\n if (!link || typeof link !== 'object') continue;\n if (typeof link.activate !== 'function') continue;\n\n const originalActivate = link.activate.bind(link);\n link.activate = (event: MouseEvent | undefined, text: string) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(text, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n originalActivate(event, text);\n }\n };\n }\n }\n callback(links);\n });\n };\n\n restorers.push(() => {\n provider.provideLinks = originalProvideLinks;\n });\n }\n }\n }\n\n const existingLinkHandler = terminal.options.linkHandler;\n const nextLinkHandler: TerminalLinkHandler = {\n allowNonHttpProtocols: existingLinkHandler?.allowNonHttpProtocols ?? false,\n activate: (event, url, range) => {\n notifyLinkActivated?.();\n const shouldTreatAsModifierOpen = Boolean(event?.metaKey || event?.ctrlKey);\n const handled = handleTerminalLinkOpen(url, resolveOpenBehavior(shouldTreatAsModifierOpen));\n if (!handled) {\n existingLinkHandler?.activate?.(event, url, range);\n }\n },\n hover: (event, url, range) => {\n existingLinkHandler?.hover?.(event, url, range);\n },\n leave: (event, url, range) => {\n existingLinkHandler?.leave?.(event, url, range);\n },\n };\n\n terminal.options.linkHandler = nextLinkHandler;\n restorers.push(() => {\n terminal.options.linkHandler = existingLinkHandler ?? null;\n });\n\n cleanupRef.current = () => {\n for (const restore of restorers) {\n restore();\n }\n cleanupRef.current = null;\n };\n }, [handleTerminalLinkOpen]);\n\n return { handleTerminalLinkOpen, attachTerminalLinkHandler };\n}\n"],"names":[],"mappings":"wDCEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OWH4L,EAAA,EAAA,CAAA,CAAA,MAAsG,IAAM,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,6BZA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,wBEAhI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kCCAjJ,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAkC,AAArB,EAAsB,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA/I,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,sBCAvI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,yBCAxI,EAAoC,CAAA,EAAA,EAAA,kBAAb,GAAa,AAAqB,EAAC,MAAxB,uCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCA3I,EAAmC,CAAA,EAAA,EAAA,iBAAb,IAAa,AAAqB,EAAC,KAAxB,wCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,0BCA5I,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,2BCAnI,EAAoC,CAAA,EAAA,EAAA,mBAAb,EAAa,AAAqB,EAAC,OAAxB,sCAAqE,EAAA,UAAU,CAAC,KAAK,EAAE,EAAA,gBAAgB,CAAC,kCIenb,IAAA,EAAA,EAAA,CAAA,CAAA,MAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,gNkBVqD,CRAP,ACAI,AOAG,AJAL,GAAA,6BOcd,wEAfnB,GAAA,2NPCA,GAAA,uBAAiC,CJAF,AWAA,APAE,qCACf,IAAK,CKYF,AQZ3B,AfYwB,AFZK,AgBA7B,AZA6B,ASAN,AEAvB,AHY0B,AFAD,CDAE,ALZE,AWA7B,ACAA,AJY0B,AFAD,AOZzB,AfYwB,AFZK,+DVStC,IAAA,EAAA,EAAA,CAAA,CAAA,uQyBQmD,CEAZ,AFAY,CEAZ,AFAY,CEAZ,AFAY,CEAZ,AjBZQ,AeYI,4QjBrBuB,CAAA,ADAF,CCAE,ADAF,CAAA,ACAE,CDAF,ACAE,CDAF,ACAE,CDAF,ACAE,IAAW,CAAA,EEuB/E,CgBZH,CAAA,CAAA,EAAA,EAAA,OAAA,AhBYU,EAAA,2BAtBY,CFYL,AUZK,AKAT,ACAA,ALAA,ACAA,AbYI,AcZK,ACAT,AXAA,ADAS,AEAT,ACAS,ACAD,ACAR,ACAS,ACAT,ECAS,oORKN,IAAK,CaAR,AbAQ,CAAA,AaAR,CbAQ,AaAR,ObAqB,CaAJ,AbAI,CAAA,AaAJ,CAAA,AbAI,CAAA,IAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAU,CAAA,oEAEhC,CaYZ,AGZG,AhBAS,CAAA,AaYZ,AGZG,ChBAS,uBAAuB,EAAU,WAC7C,CAAE,GAAA,oEHTuB,MCAA,ADAA,CAAQ,CCAA,ADAA,AAAE,EAAA,8BAAmC,EPanF,IAAA,EAAA,EAAA,CAAA,CAAA,yBgBIc,EAAA,sCAhBwB,CHAA,ACAF,AFAE,ADAL,AHYI,ADAA,AUZrB,AMAiB,ADAA,APAA,AGAK,ACAL,ATAI,AWAC,AGAL,ARAK,AIAtB,CCAsB,AdYD,AGZA,AIAD,ASAH,AHAjB,AEAiB,AJAK,AHAL,ASAA,ALAA,ARAA,AHYI,AQZC,AJAA,AKAtB,2FDCwD,CAAU,CAAA,8OhBWlF,IAAA,EAAA,EAAA,CAAA,CAAA,uBmBGmB,EAAA,0MCfiE,0CtBDpF,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,ODJoR,IAAM,EAAm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","ignoreList":[20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]}
|