@mindstudio-ai/local-model-tunnel 0.5.21 → 0.5.23

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tui/index.tsx","../src/tui/App.tsx","../src/tui/components/Header.tsx","../src/tui/hooks/useConnection.ts","../src/tui/interfaces/hooks/useEditorSessions.ts","../src/tui/models/hooks/useSetupProviders.ts","../src/tui/models/hooks/useModels.ts","../src/tui/models/hooks/useRequests.ts","../src/tui/models/hooks/useRegisteredModels.ts","../src/tui/models/pages/DashboardPage.tsx","../src/tui/models/components/RequestLog.tsx","../src/tui/components/NavigationMenu.tsx","../src/tui/models/pages/SetupPage.tsx","../src/tui/components/MarkdownText.tsx","../src/tui/interfaces/pages/InterfacesPage.tsx","../src/tui/interfaces/hooks/useLocalInterface.ts","../src/tui/interfaces/pages/InterfaceSessionView.tsx","../src/tui/interfaces/pages/InterfaceRunningView.tsx","../src/tui/pages/OnboardingPage.tsx","../src/tui/hooks/useAuth.ts","../src/tui/dev/pages/DevPage.tsx","../src/tui/dev/components/DevRequestLog.tsx","../src/tui/dev/components/DevPortPrompt.tsx","../src/tui/dev/components/TabBar.tsx","../src/tui/dev/hooks/useDevSession.ts","../src/tui/dev/hooks/useDevServer.ts","../src/tui/dev/hooks/useDevRequests.ts","../src/update.ts","../src/tui/components/UpdatePrompt.tsx"],"sourcesContent":["import React from 'react';\nimport { render } from 'ink';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { createWriteStream, renameSync, unlinkSync, existsSync } from 'node:fs';\nimport { get as httpsGet } from 'node:https';\nimport { get as httpGet } from 'node:http';\nimport { App } from './App';\nimport { TunnelRunner } from '../runner';\nimport { detectAppConfig } from '../dev/app-config';\nimport { checkForUpdate, getInstallMethod, getBinaryDownloadUrl } from '../update';\nimport { UpdatePrompt } from './components/UpdatePrompt';\n\nasync function promptForUpdate(\n currentVersion: string,\n latestVersion: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const { unmount } = render(\n <UpdatePrompt\n currentVersion={currentVersion}\n latestVersion={latestVersion}\n onChoice={(shouldUpdate) => {\n unmount();\n resolve(shouldUpdate);\n }}\n />,\n { exitOnCtrlC: true },\n );\n });\n}\n\nfunction downloadFile(url: string, dest: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const get = url.startsWith('https') ? httpsGet : httpGet;\n get(url, (res) => {\n // Follow redirects\n if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {\n downloadFile(res.headers.location, dest).then(resolve, reject);\n return;\n }\n if (!res.statusCode || res.statusCode >= 400) {\n reject(new Error(`Download failed: HTTP ${res.statusCode}`));\n return;\n }\n const file = createWriteStream(dest);\n res.pipe(file);\n file.on('finish', () => file.close(() => resolve()));\n file.on('error', reject);\n }).on('error', reject);\n });\n}\n\nexport async function startTUI(): Promise<void> {\n // Clean up leftover .old binary from a previous Windows update\n if (process.platform === 'win32') {\n try { unlinkSync(process.execPath + '.old'); } catch {}\n }\n\n // Clear the screen\n console.clear();\n\n // Check for updates before launching the main app\n const update = await checkForUpdate();\n if (update) {\n const shouldUpdate = await promptForUpdate(\n update.currentVersion,\n update.latestVersion,\n );\n if (shouldUpdate) {\n console.log('\\nUpdating to v' + update.latestVersion + '...\\n');\n try {\n if (getInstallMethod() === 'binary') {\n const url = getBinaryDownloadUrl();\n const dest = process.execPath;\n if (process.platform === 'win32') {\n // Windows locks running executables — rename-then-replace trick\n await downloadFile(url, dest + '.new');\n try { unlinkSync(dest + '.old'); } catch {}\n renameSync(dest, dest + '.old');\n renameSync(dest + '.new', dest);\n } else {\n execSync(`curl -fsSL \"${url}\" -o \"${dest}.tmp\" && chmod +x \"${dest}.tmp\" && mv \"${dest}.tmp\" \"${dest}\"`, {\n stdio: 'inherit',\n });\n }\n } else {\n execSync('npm install -g @mindstudio-ai/local-model-tunnel@latest', {\n stdio: 'inherit',\n });\n }\n console.log('\\nRestarting...\\n');\n execFileSync(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n });\n } catch {\n console.error('\\nUpdate failed. Continuing with current version.\\n');\n }\n return;\n }\n console.clear();\n }\n\n // Detect v2 app project in CWD\n const appConfig = detectAppConfig(process.cwd());\n\n // Create the runner instance\n const runner = new TunnelRunner();\n\n // Render the TUI with stdin configured for keyboard input\n const { waitUntilExit } = render(\n <App runner={runner} appConfig={appConfig ?? undefined} />,\n { exitOnCtrlC: true },\n );\n\n // Wait for the app to exit\n await waitUntilExit();\n\n // Ensure clean shutdown\n runner.stop();\n}\n","import React, { useEffect, useCallback, useState, useRef } from 'react';\nimport { Box, useApp, useStdout } from 'ink';\nimport { Header } from './components/Header';\nimport { NavigationMenu } from './components/NavigationMenu';\nimport type { MenuItem } from './components/NavigationMenu';\nimport { useConnection } from './hooks/useConnection';\nimport { useEditorSessions } from './interfaces/hooks/useEditorSessions';\nimport { useSetupProviders } from './models/hooks/useSetupProviders';\nimport { useModels } from './models/hooks/useModels';\nimport { useRequests } from './models/hooks/useRequests';\nimport { useSyncedModels } from './models/hooks/useRegisteredModels';\nimport { DashboardPage } from './models/pages/DashboardPage';\nimport { SetupPage } from './models/pages/SetupPage';\nimport { InterfacesPage } from './interfaces/pages/InterfacesPage';\nimport { OnboardingPage } from './pages/OnboardingPage';\nimport { DevPage } from './dev/pages/DevPage';\nimport { TunnelRunner } from '../runner';\nimport { syncModels, type ModelTypeMindStudio } from '../api';\nimport { getApiKey, getUserId, getConfigPath } from '../config';\nimport type { AppConfig } from '../dev/types';\nimport type { Page } from './types';\n\nconst MODEL_TYPE_MAP: Record<string, ModelTypeMindStudio> = {\n text: 'llm_chat',\n image: 'image_generation',\n video: 'video_generation',\n};\n\ninterface AppProps {\n runner: TunnelRunner;\n appConfig?: AppConfig;\n}\n\nexport function App({ runner, appConfig }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const {\n status: connectionStatus,\n environment,\n error: connectionError,\n retry: retryConnection,\n } = useConnection();\n const editorSessions = useEditorSessions();\n const {\n providers,\n loading: providersLoading,\n refresh: refreshProviders,\n } = useSetupProviders();\n const {\n models,\n warnings: modelWarnings,\n loading: modelsLoading,\n refresh: refreshModels,\n } = useModels();\n const { requests, activeCount: activeRequestCount } = useRequests();\n const {\n syncedNames,\n syncedModels,\n refresh: refreshSynced,\n } = useSyncedModels(connectionStatus);\n const shouldOnboard = getApiKey() === undefined || getUserId() === undefined;\n const [page, setPage] = useState<Page>(\n shouldOnboard ? 'onboarding' : appConfig ? 'dev' : 'dashboard',\n );\n const [syncStatus, setSyncStatus] = useState<'idle' | 'syncing' | 'synced'>(\n 'idle',\n );\n const syncTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const lastSyncPayloadRef = useRef<string>('');\n\n // Redirect to onboarding when not authenticated\n useEffect(() => {\n if (connectionStatus === 'not_authenticated') {\n setPage('onboarding');\n }\n }, [connectionStatus]);\n\n // Refresh everything when returning to dashboard\n useEffect(() => {\n if (page === 'dashboard') {\n refreshAll();\n }\n }, [page]);\n\n // Start runner when connected with synced models\n useEffect(() => {\n if (connectionStatus === 'connected' && syncedModels.length > 0) {\n runner.start(syncedModels);\n }\n }, [connectionStatus, syncedModels, runner]);\n\n // Stop only on unmount\n useEffect(() => () => runner.stop(), [runner]);\n\n // Refresh everything: re-detect providers/models, sync to cloud, update synced state\n const refreshAll = useCallback(\n async (silent = false) => {\n if (!silent) setSyncStatus('syncing');\n\n const [discoveredModels] = await Promise.all([\n refreshModels(),\n refreshProviders(),\n ]);\n\n // Sync discovered models to cloud if anything changed\n const modelsToSync = discoveredModels\n .filter((m) => !m.statusHint)\n .map((m) => ({\n name: m.name,\n provider: m.provider,\n type: MODEL_TYPE_MAP[m.capability] || 'llm_chat',\n parameters: m.parameters,\n }));\n\n const payload = JSON.stringify(modelsToSync);\n if (payload !== lastSyncPayloadRef.current && modelsToSync.length > 0) {\n try {\n await syncModels(modelsToSync);\n lastSyncPayloadRef.current = payload;\n } catch {\n // Sync failure is non-critical\n }\n }\n\n await refreshSynced();\n\n if (!silent) {\n setSyncStatus('synced');\n clearTimeout(syncTimerRef.current);\n syncTimerRef.current = setTimeout(() => setSyncStatus('idle'), 1500);\n }\n },\n [refreshProviders, refreshModels, refreshSynced],\n );\n\n // Auto-sync every 3s while connected on dashboard\n useEffect(() => {\n if (connectionStatus !== 'connected' || page !== 'dashboard') return;\n const interval = setInterval(() => refreshAll(true), 1500);\n return () => clearInterval(interval);\n }, [connectionStatus, page, refreshAll]);\n\n const handleQuit = useCallback(() => {\n runner.stop();\n exit();\n }, [runner, exit]);\n\n const handleOnboardingComplete = useCallback(() => {\n retryConnection();\n refreshAll();\n setPage('dashboard');\n }, [retryConnection, refreshAll]);\n\n const handleNavigate = useCallback(\n (id: string) => {\n switch (id) {\n case 'interfaces':\n setPage('interfaces');\n break;\n case 'auth':\n setPage('onboarding');\n break;\n case 'setup':\n setPage('setup');\n break;\n case 'dev':\n setPage('dev');\n break;\n case 'dashboard':\n setPage('dashboard');\n break;\n case 'refresh':\n refreshAll();\n break;\n case 'quit':\n handleQuit();\n break;\n }\n },\n [refreshAll, handleQuit],\n );\n\n const subpageMenuItems: MenuItem[] = [\n { id: 'back', label: 'Back', description: 'Return to dashboard' },\n ];\n\n const handleSubpageNavigate = useCallback(\n (id: string) => {\n if (id === 'back') {\n setPage('dashboard');\n } else {\n handleNavigate(id);\n }\n },\n [handleNavigate],\n );\n\n const [termSize, setTermSize] = useState({\n rows: stdout?.rows ?? 24,\n columns: stdout?.columns ?? 80,\n });\n\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => {\n stdout.write('\\x1b[2J\\x1b[H');\n setTermSize({ rows: stdout.rows, columns: stdout.columns });\n };\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n const termHeight = termSize.rows - 4;\n const compactHeader = termSize.rows <= 45 || termSize.columns <= 90;\n\n return (\n <Box flexDirection=\"column\" height={termHeight} overflow=\"hidden\">\n {page === 'onboarding' ? (\n <OnboardingPage onComplete={handleOnboardingComplete} />\n ) : (\n <>\n <Header\n connection={connectionStatus}\n environment={environment}\n configPath={getConfigPath()}\n connectionError={connectionError}\n compact={compactHeader}\n hasActiveRequest={activeRequestCount > 0}\n />\n\n {page === 'dashboard' && (\n <DashboardPage\n requests={requests}\n models={models}\n modelWarnings={modelWarnings}\n providers={providers}\n providersLoading={providersLoading}\n syncedNames={syncedNames}\n modelsLoading={modelsLoading}\n syncStatus={syncStatus}\n editorSessions={editorSessions.sessions}\n editorsLoading={editorSessions.loading}\n onNavigate={handleNavigate}\n />\n )}\n {page === 'setup' && (\n <SetupPage onBack={() => setPage('dashboard')} />\n )}\n {page === 'interfaces' && (\n <InterfacesPage\n onBack={() => setPage('dashboard')}\n sessions={editorSessions.sessions}\n refreshStatus={editorSessions.refreshStatus}\n refresh={editorSessions.refresh}\n />\n )}\n {page === 'dev' && appConfig && (\n <DevPage\n appConfig={appConfig}\n onNavigate={handleNavigate}\n termHeight={termHeight}\n />\n )}\n </>\n )}\n </Box>\n );\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport os from 'node:os';\nimport { Box, Text } from 'ink';\nimport chalk from 'chalk';\nimport type { ConnectionStatus } from '../types';\ndeclare const __APP_VERSION__: string;\n\ninterface HeaderProps {\n connection: ConnectionStatus;\n environment: 'prod' | 'local';\n configPath: string;\n connectionError?: string | null;\n compact?: boolean;\n hasActiveRequest?: boolean;\n}\n\nexport const LogoString = ` .=+-. :++.\n *@@@@@+ :%@@@@%:\n .%@@@@@@#..@@@@@@@=\n .*@@@@@@@--@@@@@@@#.**.\n *@@@@@@@.-@@@@@@@@.#@@*\n.#@@@@@@@-.@@@@@@@* #@@@@%.\n=@@@@@@@-.@@@@@@@#.-@@@@@@+\n:@@@@@@: +@@@@@#. .@@@@@@:\n .++: .-*-. .++:`;\n\nfunction useActiveShimmerLogo(active: boolean): string | null {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n useEffect(() => {\n if (!active) return;\n const interval = setInterval(() => {\n setFrame((f) => f + 1);\n }, 25);\n return () => clearInterval(interval);\n }, [active]);\n\n return useMemo(() => {\n if (!active) return null;\n\n const waveLength = 20;\n let charIdx = 0;\n\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n const phase = ((charIdx - frame * 0.5) / waveLength) * Math.PI * 2;\n const brightness = 0.65 + 0.35 * Math.sin(phase);\n\n if (brightness >= 0.85) {\n result += chalk.cyanBright(ch);\n } else if (brightness >= 0.65) {\n result += chalk.cyan(ch);\n } else {\n result += chalk.rgb(0, 140, 160)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [active, frame, lines, totalChars]);\n}\n\nconst getConnectionDisplay = (status: ConnectionStatus) => {\n switch (status) {\n case 'connected':\n return { color: 'green', text: 'Connected to Cloud' };\n case 'connecting':\n return { color: 'yellow', text: 'Connecting...' };\n case 'not_authenticated':\n return { color: 'yellow', text: 'Not Authenticated' };\n case 'disconnected':\n return { color: 'red', text: 'Disconnected' };\n default:\n return { color: 'red', text: 'Error' };\n }\n};\n\nexport function Header({\n connection,\n environment,\n configPath,\n connectionError,\n compact,\n hasActiveRequest,\n}: HeaderProps) {\n const { color: connectionColor, text: connectionText } =\n getConnectionDisplay(connection);\n const shimmerLogo = useActiveShimmerLogo(!compact && !!hasActiveRequest);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n paddingY={1}\n width=\"100%\"\n >\n {!compact && (\n <Box paddingLeft={3}>\n {shimmerLogo ? (\n <Text>{shimmerLogo}</Text>\n ) : (\n <Text color=\"cyan\">{LogoString}</Text>\n )}\n </Box>\n )}\n <Box flexDirection=\"column\" marginLeft={compact ? 0 : 4}>\n <Box>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n {compact && <Text color=\"gray\"> v{__APP_VERSION__}</Text>}\n {environment !== 'prod' && (\n <>\n <Text> </Text>\n <Text color=\"yellow\" bold>\n [LOCAL]\n </Text>\n </>\n )}\n </Box>\n <Text color={connectionColor}>● {connectionText}</Text>\n {connectionError && <Text color=\"red\">{connectionError}</Text>}\n <Text color=\"gray\">\n Config: {configPath.replace(os.homedir(), '~')}\n </Text>\n {!compact && <Text color=\"gray\">v{__APP_VERSION__}</Text>}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { verifyApiKey } from '../../api';\nimport { getApiKey, getUserId, getEnvironment } from '../../config';\nimport type { ConnectionStatus } from '../types';\n\ninterface UseConnectionResult {\n status: ConnectionStatus;\n environment: 'prod' | 'local';\n error: string | null;\n retry: () => void;\n}\n\nexport function useConnection(): UseConnectionResult {\n const [status, setStatus] = useState<ConnectionStatus>('connecting');\n const [error, setError] = useState<string | null>(null);\n const environment = getEnvironment();\n\n const connect = useCallback(async () => {\n setStatus('connecting');\n setError(null);\n\n const apiKey = getApiKey();\n const userId = getUserId();\n if (!apiKey || !userId) {\n setStatus('not_authenticated');\n return;\n }\n\n try {\n const isValid = await verifyApiKey();\n if (isValid) {\n setStatus('connected');\n } else {\n setStatus('not_authenticated');\n }\n } catch (err) {\n setStatus('error');\n setError(err instanceof Error ? err.message : 'Connection failed');\n }\n }, []);\n\n useEffect(() => {\n connect();\n }, [connect]);\n\n return {\n status,\n environment,\n error,\n retry: connect,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { getEditorSessions, type EditorSession } from '../../../api';\n\nexport type RefreshStatus = 'idle' | 'refreshing' | 'refreshed';\n\ninterface UseEditorSessionsResult {\n sessions: EditorSession[];\n loading: boolean;\n error: string | null;\n refreshStatus: RefreshStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useEditorSessions(): UseEditorSessionsResult {\n const [sessions, setSessions] = useState<EditorSession[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [refreshStatus, setRefreshStatus] = useState<RefreshStatus>('idle');\n const initialLoadDone = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const pollRef = useRef<ReturnType<typeof setInterval>>();\n\n const refresh = useCallback(async () => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshStatus('refreshing');\n }\n setError(null);\n\n try {\n const data = await getEditorSessions();\n setSessions(data);\n initialLoadDone.current = true;\n setRefreshStatus('refreshed');\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setRefreshStatus('idle'), 1500);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch sessions');\n setRefreshStatus('idle');\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Silent auto-poll every 5 seconds after initial load\n useEffect(() => {\n pollRef.current = setInterval(async () => {\n if (!initialLoadDone.current) return;\n try {\n const data = await getEditorSessions();\n setSessions(data);\n } catch {\n // Silently ignore — data stays stale until next poll or manual refresh\n }\n }, 5000);\n\n return () => clearInterval(pollRef.current);\n }, []);\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current);\n }, []);\n\n return { sessions, loading, error, refreshStatus, refresh };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n detectAllProviderStatuses,\n type Provider,\n type ProviderSetupStatus,\n} from '../../../providers';\n\ninterface ProviderWithStatus {\n provider: Provider;\n status: ProviderSetupStatus;\n}\n\ninterface UseSetupProvidersResult {\n providers: ProviderWithStatus[];\n loading: boolean;\n refreshing: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useSetupProviders(): UseSetupProvidersResult {\n const [providers, setProviders] = useState<ProviderWithStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const initialLoadDone = useRef(false);\n\n const refresh = useCallback(async () => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshing(true);\n }\n const statuses = await detectAllProviderStatuses();\n setProviders(statuses);\n initialLoadDone.current = true;\n setLoading(false);\n setRefreshing(false);\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { providers, loading, refreshing, refresh };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { discoverAllModelsWithParameters } from '../../../providers';\nimport type { LocalModel } from '../../../providers/types';\n\ninterface UseModelsResult {\n models: LocalModel[];\n warnings: LocalModel[];\n loading: boolean;\n refreshing: boolean;\n refresh: () => Promise<LocalModel[]>;\n}\n\nexport function useModels(): UseModelsResult {\n const [models, setModels] = useState<LocalModel[]>([]);\n const [warnings, setWarnings] = useState<LocalModel[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const initialLoadDone = useRef(false);\n\n const refresh = useCallback(async (): Promise<LocalModel[]> => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshing(true);\n }\n try {\n const discoveredModels = await discoverAllModelsWithParameters();\n setModels(discoveredModels.filter((m) => !m.statusHint));\n setWarnings(discoveredModels.filter((m) => !!m.statusHint));\n initialLoadDone.current = true;\n return discoveredModels;\n } catch {\n // Keep existing state on error\n return [];\n } finally {\n setLoading(false);\n setRefreshing(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n models,\n warnings,\n loading,\n refreshing,\n refresh,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { requestEvents } from '../../../events';\nimport type { RequestLogEntry } from '../../types';\n\ninterface UseRequestsResult {\n requests: RequestLogEntry[];\n activeCount: number;\n clear: () => void;\n}\n\nexport function useRequests(maxHistory: number = 50): UseRequestsResult {\n const [requests, setRequests] = useState<RequestLogEntry[]>([]);\n const requestsRef = useRef<Map<string, RequestLogEntry>>(new Map());\n\n // Update timer for active request durations\n useEffect(() => {\n const interval = setInterval(() => {\n // Force re-render for active requests to update elapsed time\n setRequests((prev) => {\n const hasActive = prev.some((r) => r.status === 'processing');\n return hasActive ? [...prev] : prev;\n });\n }, 1000);\n\n return () => clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const unsubStart = requestEvents.onStart((event) => {\n const entry: RequestLogEntry = {\n id: event.id,\n modelId: event.modelId,\n requestType: event.requestType,\n status: 'processing',\n startTime: event.timestamp,\n };\n\n requestsRef.current.set(event.id, entry);\n setRequests((prev) => [...prev, entry].slice(-maxHistory));\n });\n\n const unsubProgress = requestEvents.onProgress((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing && existing.status === 'processing') {\n const updated: RequestLogEntry = {\n ...existing,\n ...(event.content !== undefined && { content: event.content }),\n ...(event.step !== undefined && { step: event.step }),\n ...(event.totalSteps !== undefined && {\n totalSteps: event.totalSteps,\n }),\n };\n requestsRef.current.set(event.id, updated);\n setRequests((prev) =>\n prev.map((r) => (r.id === event.id ? updated : r)),\n );\n }\n });\n\n const unsubComplete = requestEvents.onComplete((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing) {\n const updated: RequestLogEntry = {\n ...existing,\n status: event.success ? 'completed' : 'failed',\n endTime: Date.now(),\n duration: event.duration,\n result: event.result,\n error: event.error,\n };\n\n requestsRef.current.set(event.id, updated);\n setRequests((prev) =>\n prev.map((r) => (r.id === event.id ? updated : r)),\n );\n }\n });\n\n return () => {\n unsubStart();\n unsubProgress();\n unsubComplete();\n };\n }, [maxHistory]);\n\n const activeCount = requests.filter((r) => r.status === 'processing').length;\n\n const clear = useCallback(() => {\n requestsRef.current.clear();\n setRequests([]);\n }, []);\n\n return {\n requests,\n activeCount,\n clear,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { getSyncedModels, type SyncedModel } from '../../../api';\nimport type { ConnectionStatus } from '../../types';\n\ninterface UseSyncedModelsResult {\n syncedNames: Set<string>;\n syncedModels: SyncedModel[];\n refresh: () => Promise<void>;\n}\n\nexport function useSyncedModels(\n connectionStatus: ConnectionStatus,\n): UseSyncedModelsResult {\n const [syncedNames, setSyncedNames] = useState<Set<string>>(new Set());\n const [syncedModels, setSyncedModels] = useState<SyncedModel[]>([]);\n\n const refresh = useCallback(async () => {\n if (connectionStatus !== 'connected') {\n setSyncedNames(new Set());\n setSyncedModels([]);\n return;\n }\n\n try {\n const models = await getSyncedModels();\n setSyncedNames(new Set(models.map((m) => m.name)));\n setSyncedModels(models);\n } catch {\n // Keep existing state on error\n }\n }, [connectionStatus]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n syncedNames,\n syncedModels,\n refresh,\n };\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { RequestLog } from '../components/RequestLog';\nimport { NavigationMenu } from '../../components/NavigationMenu';\nimport type { MenuItem } from '../../components/NavigationMenu';\nimport type { EditorSession } from '../../../api';\nimport type {\n LocalModel,\n Provider,\n ProviderSetupStatus,\n ComfyWorkflowParameterSchema,\n} from '../../../providers/types';\nimport type { RequestLogEntry } from '../../types';\n\nfunction getWorkflowCount(model: LocalModel): number | null {\n const param = model.parameters?.find((p) => p.type === 'comfyWorkflow');\n if (!param) return null;\n return (param as ComfyWorkflowParameterSchema).comfyWorkflowOptions\n .availableWorkflows.length;\n}\n\nfunction getCapabilityLabel(capability: string): {\n label: string;\n color: string;\n} {\n switch (capability) {\n case 'text':\n return { label: 'Text Generation', color: 'gray' };\n case 'image':\n return { label: 'Image Generation', color: 'gray' };\n case 'video':\n return { label: 'Video Generation', color: 'gray' };\n default:\n return { label: capability, color: 'gray' };\n }\n}\n\ninterface ProviderWithStatus {\n provider: Provider;\n status: ProviderSetupStatus;\n}\n\ninterface DashboardPageProps {\n requests: RequestLogEntry[];\n models: LocalModel[];\n modelWarnings?: LocalModel[];\n providers: ProviderWithStatus[];\n providersLoading?: boolean;\n syncedNames: Set<string>;\n modelsLoading?: boolean;\n syncStatus?: 'idle' | 'syncing' | 'synced';\n editorSessions: EditorSession[];\n editorsLoading: boolean;\n onNavigate: (id: string) => void;\n}\n\nexport function DashboardPage({\n requests,\n models,\n modelWarnings = [],\n providers,\n providersLoading,\n syncedNames,\n modelsLoading,\n syncStatus = 'idle',\n editorSessions,\n editorsLoading,\n onNavigate,\n}: DashboardPageProps) {\n const { stdout } = useStdout();\n\n const installedProviders = providers.filter(({ status }) => status.installed);\n\n const provNameWidth = Math.max(\n ...installedProviders.map((p) => p.provider.displayName.length),\n 8,\n );\n const provStatusWidth = 'Local Server Running'.length;\n\n const allModelNames = new Set(models.map((m) => m.name));\n const unavailableSynced = [...syncedNames].filter(\n (name) => !allModelNames.has(name),\n );\n\n const syncDescription =\n syncStatus === 'syncing'\n ? 'Syncing...'\n : syncStatus === 'synced'\n ? '\\u2713 Synced'\n : 'Re-detect providers and sync models to MindStudio';\n\n const menuItems = useMemo((): MenuItem[] => {\n return [\n {\n id: 'interfaces',\n label: 'Connect to Agent',\n description:\n 'Connect your local editor to a MindStudio interface or script',\n },\n {\n id: 'refresh',\n label: 'Sync Models',\n description: syncDescription,\n },\n {\n id: 'setup',\n label: 'Manage Providers',\n description: 'Manage local AI providers',\n },\n {\n id: 'auth',\n label: 'Re-authenticate',\n description: 'Re-authenticate with MindStudio',\n },\n {\n id: 'quit',\n label: 'Exit',\n description: 'Quit the application',\n },\n ];\n }, [syncDescription]);\n\n // Compute maxVisible for request log based on terminal height\n const termHeight = (stdout?.rows ?? 24) - 4; // matches App's height calculation\n const compactHeader =\n (stdout?.rows ?? 24) <= 45 || (stdout?.columns ?? 80) <= 90;\n\n // Header: compact (no logo, version on title line) = border(2) + padding(2) + 3 text lines = 7, full = border(2) + padding(2) + logo(~10 lines) = 14\n const headerLines = compactHeader ? 7 : 14;\n\n // Providers section: marginTop(1) + title(1) + content gap(1) + content\n const providerContentLines = providersLoading\n ? 1\n : installedProviders.length === 0\n ? 2\n : installedProviders.length;\n const providersLines = 3 + providerContentLines;\n\n // Open Editors section: marginTop(1) + title(1) + content gap(1) + content\n const editorsContentLines = editorsLoading\n ? 1\n : editorSessions.length === 0\n ? 1\n : editorSessions.length;\n const editorsLines = 3 + editorsContentLines;\n\n // Models section: marginTop(1) + title(1) + content gap(1) + content\n const modelContentLines = modelsLoading\n ? 1\n : models.length === 0 &&\n unavailableSynced.length === 0 &&\n modelWarnings.length === 0\n ? 2\n : models.length +\n modelWarnings.length +\n (unavailableSynced.length > 0 ? 1 + unavailableSynced.length : 0);\n const modelsLines = 3 + modelContentLines;\n\n // Request log overhead: marginTop(1) + title(1) + content gap(1)\n const requestLogOverhead = 3;\n\n // Menu: compact = border-top(1) + items(1) + hint(1) = 3, full = border-top(1) + marginTop(1) + title(1) + items + hint(1) + marginTop(1) + marginBottom(1)\n const compactMenu = termHeight + 4 < 40; // stdout rows < 40\n const menuLines = compactMenu ? 2 : menuItems.length + 6;\n\n const usedLines =\n headerLines +\n providersLines +\n editorsLines +\n modelsLines +\n requestLogOverhead +\n menuLines;\n const maxVisible = Math.max(3, termHeight - usedLines);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {/* Open Editors */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Open Agents\n </Text>\n\n {editorsLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Loading editor sessions...</Text>\n </Box>\n ) : editorSessions.length === 0 ? (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Agents you are editing in the MindStudio IDE will appear here.\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {editorSessions.map((session) => (\n <Box key={session.appId}>\n <Text color=\"white\">{session.appName}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n\n {/* Providers */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n AI Model Providers\n </Text>\n\n {providersLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Detecting providers...</Text>\n </Box>\n ) : installedProviders.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No providers installed.</Text>\n <Text color=\"gray\">\n Use \"Manage Providers\" below to install one.\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {installedProviders.map(({ provider, status }) => {\n const url = provider.baseUrl;\n const statusColor = status.running ? 'green' : 'yellow';\n const statusText = status.running\n ? 'Local Server Running'\n : 'Installed (not running)';\n\n return (\n <Box key={provider.name}>\n <Text color=\"white\">\n {provider.displayName.padEnd(provNameWidth + 2)}\n </Text>\n <Text color={statusColor}>\n {statusText.padEnd(provStatusWidth + 2)}\n </Text>\n {status.running && <Text color=\"gray\">{url}</Text>}\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n\n {/* Models */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Local Models\n </Text>\n\n {modelsLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Discovering models...</Text>\n </Box>\n ) : models.length === 0 &&\n unavailableSynced.length === 0 &&\n modelWarnings.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No models found.</Text>\n <Text color=\"gray\">\n Download models using your provider (e.g., ollama pull llama3.2)\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {models.map((model) => {\n const cap = getCapabilityLabel(model.capability);\n const isSynced = syncedNames.has(model.name);\n const displayProvider =\n providers.find((p) => p.provider.name === model.provider)\n ?.provider.displayName ?? model.provider;\n const workflowCount = getWorkflowCount(model);\n const workflowSuffix =\n workflowCount !== null\n ? ` (${workflowCount} workflow${workflowCount !== 1 ? 's' : ''}, ${isSynced ? workflowCount : 0} synced)`\n : '';\n return (\n <Box key={`${model.provider}:${model.name}`}>\n <Text color={isSynced ? 'green' : 'gray'}>\n {isSynced ? '\\u25CF' : '\\u25CB'}\n </Text>\n <Text color=\"white\">{` ${model.name}`}</Text>\n {workflowSuffix && <Text color=\"gray\">{workflowSuffix}</Text>}\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"gray\">{displayProvider}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color={cap.color}>{cap.label}</Text>\n </Box>\n );\n })}\n {modelWarnings.map((warning) => {\n const displayProvider =\n providers.find((p) => p.provider.name === warning.provider)\n ?.provider.displayName ?? warning.provider;\n return (\n <Box key={`${warning.provider}:${warning.name}`}>\n <Text color=\"gray\">{'\\u25CB'}</Text>\n <Text color=\"white\">{` ${warning.name}`}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"gray\">{displayProvider}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"yellow\">{warning.statusHint}</Text>\n </Box>\n );\n })}\n\n {unavailableSynced.length > 0 && (\n <Box flexDirection=\"column\" marginTop={models.length > 0 ? 1 : 0}>\n <Text color=\"gray\">Synced but provider not running:</Text>\n {unavailableSynced.map((name) => (\n <Box key={name}>\n <Text color=\"gray\">{'\\u25CB'}</Text>\n <Text color=\"gray\">{` ${name}`}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n )}\n </Box>\n\n {/* Request log */}\n <RequestLog\n requests={requests}\n maxVisible={maxVisible}\n hasModels={models.length > 0}\n />\n\n {/* Bottom: Navigation menu pane */}\n <NavigationMenu items={menuItems} onSelect={onNavigate} />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { RequestLogEntry } from '../../types';\n\ninterface RequestLogProps {\n requests: RequestLogEntry[];\n maxVisible?: number;\n hasModels?: boolean;\n}\n\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction getRequestTypeLabel(type: string): { label: string; color: string } {\n switch (type) {\n case 'llm_chat':\n return { label: 'text', color: 'gray' };\n case 'image_generation':\n return { label: 'image', color: 'gray' };\n case 'video_generation':\n return { label: 'video', color: 'gray' };\n default:\n return { label: type, color: 'gray' };\n }\n}\n\nfunction snippetLine(content: string, maxWidth: number): string {\n // Collapse whitespace/newlines into single spaces\n const flat = content.replace(/\\s+/g, ' ').trim();\n if (flat.length <= maxWidth) return flat;\n return '\\u2026' + flat.slice(-(maxWidth - 1));\n}\n\nfunction RequestItem({\n request,\n width,\n}: {\n request: RequestLogEntry;\n width: number;\n}) {\n const time = formatTime(request.startTime);\n const typeLabel = getRequestTypeLabel(request.requestType);\n // indent for snippet: status(1) + space(1) + padding for alignment\n const snippetIndent = ' ';\n const snippetWidth = width - snippetIndent.length - 2; // 2 for paddingX\n\n if (request.status === 'processing') {\n const elapsed = Date.now() - request.startTime;\n const snippet =\n request.content && request.requestType === 'llm_chat'\n ? snippetLine(request.content, snippetWidth)\n : null;\n const stepProgress =\n request.step !== undefined && request.totalSteps\n ? `Step ${request.step}/${request.totalSteps}`\n : null;\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"gray\"> {formatDuration(elapsed)}...</Text>\n </Box>\n {snippet && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {snippetIndent}\n {snippet}\n </Text>\n )}\n {stepProgress && (\n <Text color=\"gray\">\n {snippetIndent}\n {stepProgress}\n </Text>\n )}\n </Box>\n );\n }\n\n if (request.status === 'completed') {\n const duration = request.duration ? formatDuration(request.duration) : '';\n let resultInfo = '';\n if (request.result?.chars) {\n resultInfo = ` \\u00B7 ${request.result.chars} chars`;\n } else if (request.result?.imageSize) {\n resultInfo = ` \\u00B7 ${Math.round(request.result.imageSize / 1024)}KB`;\n } else if (request.result?.videoSize) {\n resultInfo = ` \\u00B7 ${Math.round(request.result.videoSize / 1024 / 1024)}MB`;\n }\n\n const snippet =\n request.content && request.requestType === 'llm_chat'\n ? snippetLine(request.content, snippetWidth)\n : null;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"green\">{'\\u2713'}</Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"gray\">\n {' '}\n {duration}\n {resultInfo}\n </Text>\n </Box>\n {snippet && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {snippetIndent}\n {snippet}\n </Text>\n )}\n </Box>\n );\n }\n\n // Failed\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"red\">{'\\u25CF'}</Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"red\"> {request.error || 'Failed'}</Text>\n </Box>\n </Box>\n );\n}\n\nexport function RequestLog({\n requests,\n maxVisible = 8,\n hasModels = true,\n}: RequestLogProps) {\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n\n // Get the most recent requests, with active ones always shown\n const activeRequests = requests.filter((r) => r.status === 'processing');\n const completedRequests = requests.filter((r) => r.status !== 'processing');\n\n // Requests with a snippet or step progress take 2 lines, others take 1\n const itemLines = (r: RequestLogEntry) => {\n if (r.requestType === 'llm_chat' && r.content) return 2;\n if (r.status === 'processing' && r.step !== undefined) return 2;\n return 1;\n };\n\n let completedToShow: RequestLogEntry[] = [];\n let linesUsed = activeRequests.reduce((sum, r) => sum + itemLines(r), 0);\n for (\n let i = completedRequests.length - 1;\n i >= 0 && linesUsed < maxVisible;\n i--\n ) {\n const r = completedRequests[i]!;\n const lines = itemLines(r);\n if (linesUsed + lines <= maxVisible) {\n completedToShow.unshift(r);\n linesUsed += lines;\n } else {\n break;\n }\n }\n\n const visibleRequests = [...completedToShow, ...activeRequests];\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n width=\"100%\"\n paddingX={1}\n marginTop={1}\n >\n <Box>\n <Text bold underline color=\"white\">\n Generation Requests\n </Text>\n {activeRequests.length > 0 && (\n <Text color=\"cyan\"> ({activeRequests.length} active)</Text>\n )}\n </Box>\n\n {requests.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">\n {hasModels\n ? 'Tunnel is live — requests will appear here when models are used in MindStudio'\n : 'Start a model to begin receiving generation requests.'}\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleRequests.map((request) => (\n <RequestItem key={request.id} request={request} width={width} />\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description: string;\n disabled?: boolean;\n disabledReason?: string;\n isSeparator?: boolean;\n color?: string;\n}\n\ninterface NavigationMenuProps {\n items: MenuItem[];\n onSelect: (id: string) => void;\n title?: string;\n}\n\nexport function NavigationMenu({\n items,\n onSelect,\n title,\n}: NavigationMenuProps) {\n const { stdout } = useStdout();\n const compact = (stdout?.rows ?? 24) < 40;\n\n const getDefaultIndex = () => {\n const firstIdx = items.findIndex((i) => !i.disabled && !i.isSeparator);\n return firstIdx >= 0 ? firstIdx : 0;\n };\n const [selectedIndex, setSelectedIndex] = useState(getDefaultIndex);\n\n useEffect(() => {\n setSelectedIndex(getDefaultIndex());\n }, [items]);\n\n const selectableItems = items.filter((i) => !i.isSeparator);\n\n const findNextEnabled = (from: number, direction: 1 | -1): number => {\n let idx = from;\n for (let i = 0; i < items.length; i++) {\n idx = (idx + direction + items.length) % items.length;\n if (!items[idx]!.disabled && !items[idx]!.isSeparator) return idx;\n }\n return from;\n };\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n const backItem = items.find((i) => i.id === 'back');\n if (backItem) {\n onSelect('back');\n } else if (input === 'q') {\n onSelect('quit');\n }\n return;\n }\n if (key.upArrow || (compact && key.leftArrow)) {\n setSelectedIndex((prev) => findNextEnabled(prev, -1));\n } else if (key.downArrow || (compact && key.rightArrow)) {\n setSelectedIndex((prev) => findNextEnabled(prev, 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item && !item.disabled) {\n onSelect(item.id);\n }\n }\n });\n\n const hasBack = items.some((i) => i.id === 'back');\n\n if (compact) {\n const selectedItem = items[selectedIndex];\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box height={1} overflow=\"hidden\" gap={1}>\n {items.map((item, index) => {\n if (item.isSeparator) return null;\n const isSelected = index === selectedIndex;\n return (\n <Text\n key={item.id}\n color={item.disabled ? 'gray' : isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? `❯ ${item.label}` : ` ${item.label}`}\n </Text>\n );\n })}\n </Box>\n </Box>\n );\n }\n\n // Fixed height: header + items + hint + margins\n const separatorExtraLines = items.filter(\n (item, idx) => item.isSeparator && idx > 0,\n ).length;\n const menuHeight = items.length + 4 + separatorExtraLines;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n marginBottom={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box marginTop={1}>\n <Text color=\"gray\">{title ?? 'Actions'}</Text>\n </Box>\n <Box flexDirection=\"column\">\n {items.map((item, index) => {\n if (item.isSeparator) {\n return (\n <Box key={item.id} marginTop={index > 0 ? 1 : 0}>\n {item.label ? (\n <Text bold color={item.color ?? 'gray'} wrap=\"truncate-end\">\n {item.label}\n </Text>\n ) : null}\n </Box>\n );\n }\n\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? '❯' : ' ';\n\n if (item.disabled) {\n return (\n <Box key={item.id} height={1} overflow=\"hidden\">\n <Text color=\"gray\" wrap=\"truncate-end\">\n {prefix} {item.label}\n {item.disabledReason ? ` (${item.disabledReason})` : ''}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.id} height={1} overflow=\"hidden\">\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {prefix} {item.label}\n </Text>\n {isSelected && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {' '}\n - {item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n {hasBack\n ? 'Up/Down Navigate \\u2022 Enter Select \\u2022 q/Esc Back'\n : 'Up/Down Navigate \\u2022 Enter Select \\u2022 q Quit'}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { renderMarkdown } from '../../components/MarkdownText';\nimport { useSetupProviders } from '../hooks/useSetupProviders';\nimport type { Provider } from '../../../providers/types';\n\ninterface SetupPageProps {\n onBack: () => void;\n}\n\nfunction ProviderDetailView({\n provider,\n onBack,\n}: {\n provider: Provider;\n onBack: () => void;\n}) {\n const [scrollOffset, setScrollOffset] = useState(0);\n const { stdout } = useStdout();\n const termHeight = (stdout?.rows ?? 24) - 4; // matches App's height calc\n const headerHeight = 14; // border(2) + padding(2) + logo(9) + 1\n const footerLines = 6; // border-top(1) + margin(1) + \"Actions\"(1) + \"Back\"(1) + margin(1) + hint(1)\n const contentPadding = 2; // paddingY={1}\n const viewHeight = termHeight - headerHeight - footerLines - contentPadding;\n const contentWidth = (stdout?.columns ?? 80) - 4; // 2 padding + 1 scrollbar + 1 margin\n\n const renderedLines = useMemo(() => {\n const rendered = renderMarkdown(provider.readme, contentWidth);\n return rendered.split('\\n');\n }, [provider.readme, contentWidth]);\n\n const maxScroll = Math.max(0, renderedLines.length - viewHeight);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape || key.return) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollOffset((prev) => Math.min(maxScroll, prev + 1));\n }\n });\n\n const visibleContent = renderedLines\n .slice(scrollOffset, scrollOffset + viewHeight)\n .join('\\n');\n\n const scrollbar = useMemo(() => {\n if (maxScroll === 0) return null;\n const thumbSize = Math.max(\n 1,\n Math.round((viewHeight / renderedLines.length) * viewHeight),\n );\n const thumbPos = Math.round(\n (scrollOffset / maxScroll) * (viewHeight - thumbSize),\n );\n\n return Array.from(\n { length: viewHeight },\n (_, i) => i >= thumbPos && i < thumbPos + thumbSize,\n );\n }, [scrollOffset, maxScroll, viewHeight, renderedLines.length]);\n\n return (\n <Box flexDirection=\"column\">\n <Box height={viewHeight}>\n <Box\n flexDirection=\"column\"\n paddingX={1}\n paddingY={1}\n flexGrow={1}\n overflow=\"hidden\"\n >\n <Text>{visibleContent}</Text>\n </Box>\n {scrollbar && (\n <Box flexDirection=\"column\">\n {scrollbar.map((isThumb, i) => (\n <Text\n key={i}\n color={isThumb ? 'cyan' : 'gray'}\n dimColor={!isThumb}\n >\n {isThumb ? '\\u2503' : '\\u2502'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box marginTop={1}>\n <Text color=\"gray\">Actions</Text>\n </Box>\n <Box>\n <Text color=\"cyan\" bold>\n {'\\u276F'} Back\n </Text>\n <Text color=\"gray\"> - Return to providers</Text>\n </Box>\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n Up/Down Scroll {'\\u2022'} Enter/q/Esc Back\n {maxScroll > 0 &&\n ` \\u2022 ${Math.round((scrollOffset / maxScroll) * 100)}%`}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\nexport function SetupPage({ onBack }: SetupPageProps) {\n const { providers, loading } = useSetupProviders();\n const [selectedProvider, setSelectedProvider] = useState<string | null>(null);\n const running = useMemo(\n () => providers.filter((p) => p.status.running),\n [providers],\n );\n const installed = useMemo(\n () => providers.filter((p) => p.status.installed && !p.status.running),\n [providers],\n );\n const notInstalled = useMemo(\n () => providers.filter((p) => !p.status.installed),\n [providers],\n );\n const allProviders = useMemo(\n () => [...running, ...installed, ...notInstalled],\n [running, installed, notInstalled],\n );\n\n const totalItems = allProviders.length + 1; // +1 for Back\n const backIndex = allProviders.length;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [allProviders.length]);\n\n useInput((input, key) => {\n if (selectedProvider) return;\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (allProviders[cursorIndex]) {\n setSelectedProvider(allProviders[cursorIndex]!.provider.name);\n }\n }\n });\n\n if (selectedProvider) {\n const found = providers.find((p) => p.provider.name === selectedProvider);\n if (found) {\n return (\n <ProviderDetailView\n provider={found.provider}\n onBack={() => setSelectedProvider(null)}\n />\n );\n }\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Manage Providers\n </Text>\n <Text color=\"gray\">Select a provider to view its setup guide.</Text>\n\n {loading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Detecting providers...</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {running.length > 0 && (\n <>\n <Text bold color=\"green\">\n Running\n </Text>\n {running.map(({ provider }, i) => {\n const index = i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {'\\u25CF'}{' '}\n {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </>\n )}\n {installed.length > 0 && (\n <Box\n flexDirection=\"column\"\n marginTop={running.length > 0 ? 1 : 0}\n >\n <Text bold color=\"yellow\">\n Installed\n </Text>\n {installed.map(({ provider, status }, i) => {\n const index = running.length + i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {'\\u25CB'}{' '}\n {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n {notInstalled.length > 0 && (\n <Box\n flexDirection=\"column\"\n marginTop={running.length > 0 || installed.length > 0 ? 1 : 0}\n >\n <Text bold color=\"gray\">\n Not Installed\n </Text>\n {notInstalled.map(({ provider }, i) => {\n const index = running.length + installed.length + i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n\n {/* Back option */}\n <Box marginTop={1}>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Text, useStdout } from 'ink';\nimport chalk from 'chalk';\nimport { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\n\nconst codeStyle = chalk.cyan;\nconst identity = (s: string) => s;\n\ninterface MarkdownTextProps {\n content: string;\n width?: number;\n}\n\n/**\n * Render markdown to an ANSI string.\n * Each line is self-contained (no cross-line ANSI escapes).\n */\nexport function renderMarkdown(content: string, width: number): string {\n marked.use(\n markedTerminal({\n width,\n codespan: codeStyle,\n link: identity,\n href: identity,\n }) as any,\n );\n marked.use({\n renderer: {\n code({ text }: { text: string }) {\n const lines = text\n .trim()\n .split('\\n')\n .map((l) => ' ' + codeStyle(l))\n .join('\\n');\n return lines + '\\n\\n';\n },\n link({ href, text }: { href: string; text: string }) {\n if (text && text !== href) {\n return `${text} (${href})`;\n }\n return href;\n },\n },\n });\n return (marked.parse(content) as string).trimEnd();\n}\n\nexport function MarkdownText({ content, width: widthProp }: MarkdownTextProps) {\n const { stdout } = useStdout();\n const width = widthProp ?? (stdout?.columns ?? 80) - 4;\n\n const rendered = useMemo(\n () => renderMarkdown(content, width),\n [content, width],\n );\n\n return <Text wrap=\"wrap\">{rendered}</Text>;\n}\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { RefreshStatus } from '../hooks/useEditorSessions';\nimport { useLocalInterface } from '../hooks/useLocalInterface';\nimport { InterfaceSessionView } from './InterfaceSessionView';\nimport { InterfaceRunningView } from './InterfaceRunningView';\nimport type {\n EditorSession,\n CustomInterfaceStepInfo,\n ScriptStepInfo,\n} from '../../../api';\n\ninterface InterfacesPageProps {\n onBack: () => void;\n sessions: EditorSession[];\n refreshStatus: RefreshStatus;\n refresh: () => Promise<void>;\n}\n\nexport interface InterfaceItem {\n kind: 'interface';\n appId: string;\n appName: string;\n step: CustomInterfaceStepInfo;\n}\n\nexport interface ScriptItem {\n kind: 'script';\n appId: string;\n appName: string;\n step: ScriptStepInfo;\n}\n\ntype ListItem = InterfaceItem | ScriptItem;\n\ntype SessionStatus = 'running' | 'starting' | 'stopped' | 'compiling';\n\nfunction getSessionStatus(item: ListItem): SessionStatus {\n if (item.kind === 'script') return 'running';\n const status = item.step.spaEditorSession?.status;\n if (status === 'running' || status === 'compiling') return status;\n if (status === 'starting') return 'starting';\n return 'stopped';\n}\n\nfunction isItemSelectable(item: ListItem): boolean {\n const status = getSessionStatus(item);\n return status === 'running' || status === 'compiling';\n}\n\nfunction getStatusLabel(status: SessionStatus): {\n text: string;\n color: string;\n} {\n switch (status) {\n case 'running':\n case 'compiling':\n return { text: 'Online', color: 'green' };\n case 'starting':\n return { text: 'Starting', color: 'yellow' };\n case 'stopped':\n return { text: 'Offline', color: 'gray' };\n }\n}\n\nfunction getRefreshSuffix(status: RefreshStatus): string | null {\n switch (status) {\n case 'refreshing':\n return 'Refreshing...';\n case 'refreshed':\n return '\\u2713 Refreshed';\n case 'idle':\n return null;\n }\n}\n\nfunction formatCount(interfaces: number, scripts: number): string {\n const parts: string[] = [];\n if (interfaces > 0) {\n parts.push(`${interfaces} Interface${interfaces !== 1 ? 's' : ''}`);\n }\n if (scripts > 0) {\n parts.push(`${scripts} Script${scripts !== 1 ? 's' : ''}`);\n }\n return parts.join(', ');\n}\n\n// --- Offline view (level 3) ---\n\nfunction OfflineView({ item, onBack }: { item: ListItem; onBack: () => void }) {\n useInput((input, key) => {\n if (input === 'q' || key.escape || key.return) {\n onBack();\n }\n });\n\n const name =\n item.kind === 'interface'\n ? `${item.step.workflowName} - ${item.step.displayName}`\n : `${item.step.workflowName} - ${item.step.displayName}`;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">This interface is offline.</Text>\n <Text color=\"gray\">\n Start the interface designer in MindStudio to connect to it.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n {'\\u276F'} Back\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">Enter/q/Esc Back</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Agent list (level 1) ---\n\nfunction AgentListView({\n sessions,\n onBack,\n onSelectAgent,\n onRefresh,\n refreshStatus,\n}: {\n sessions: EditorSession[];\n onBack: () => void;\n onSelectAgent: (appId: string) => void;\n onRefresh: () => void;\n refreshStatus: RefreshStatus;\n}) {\n // Items: [sessions..., refresh, back]\n const refreshIndex = sessions.length;\n const backIndex = sessions.length + 1;\n const totalItems = sessions.length + 2;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(sessions.length > 0 ? 0 : backIndex);\n }, [sessions.length, backIndex]);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (cursorIndex === refreshIndex) {\n onRefresh();\n } else if (sessions[cursorIndex]) {\n onSelectAgent(sessions[cursorIndex]!.appId);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Choose an Agent\n </Text>\n <Text color=\"gray\">\n Don't see your agent? Make sure it's open in the MindStudio editor.\n </Text>\n\n {sessions.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No active editor sessions.</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {sessions.map((session, i) => {\n const isSelected = i === cursorIndex;\n const stats = formatCount(\n session.customInterfaceSteps.length,\n session.scriptSteps.length,\n );\n return (\n <Box\n key={session.appId}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {session.appName}\n </Text>\n {isSelected && (\n <Text color=\"gray\">{' - Connect to this Agent'}</Text>\n )}\n </Box>\n <Text color=\"gray\">\n {' '}https://app.mindstudio.ai/agents/{session.appId}/edit\n </Text>\n {stats !== '' && (\n <Text color=\"gray\">\n {' '}\n {stats}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text\n color={cursorIndex === refreshIndex ? 'cyan' : 'white'}\n bold={cursorIndex === refreshIndex}\n >\n {cursorIndex === refreshIndex ? '\\u276F' : ' '} Refresh\n </Text>\n {getRefreshSuffix(refreshStatus) && (\n <Text color=\"gray\"> {getRefreshSuffix(refreshStatus)}</Text>\n )}\n </Box>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Agent detail (level 2) ---\n\nfunction AgentDetailView({\n session,\n onBack,\n onSelect,\n onRefresh,\n refreshStatus,\n}: {\n session: EditorSession;\n onBack: () => void;\n onSelect: (item: InterfaceItem | ScriptItem) => void;\n onRefresh: () => void;\n refreshStatus: RefreshStatus;\n}) {\n const [offlineItem, setOfflineItem] = useState<ListItem | null>(null);\n\n // Auto-polling handles background refresh, no need to trigger on mount\n\n const interfaces = useMemo(\n (): InterfaceItem[] =>\n session.customInterfaceSteps.map((step) => ({\n kind: 'interface',\n appId: session.appId,\n appName: session.appName,\n step,\n })),\n [session],\n );\n\n const scripts = useMemo(\n (): ScriptItem[] =>\n session.scriptSteps.map((step) => ({\n kind: 'script',\n appId: session.appId,\n appName: session.appName,\n step,\n })),\n [session],\n );\n\n const allItems = useMemo(\n (): ListItem[] => [...interfaces, ...scripts],\n [interfaces, scripts],\n );\n\n // Items: [allItems..., refresh, back]\n const refreshIndex = allItems.length;\n const backIndex = allItems.length + 1;\n const totalItems = allItems.length + 2;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [allItems.length]);\n\n useInput((input, key) => {\n if (offlineItem) return;\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (cursorIndex === refreshIndex) {\n onRefresh();\n } else {\n const item = allItems[cursorIndex];\n if (item) {\n if (isItemSelectable(item)) {\n onSelect(item);\n } else {\n setOfflineItem(item);\n }\n }\n }\n }\n });\n\n if (offlineItem) {\n return (\n <OfflineView item={offlineItem} onBack={() => setOfflineItem(null)} />\n );\n }\n\n const scriptsOffset = interfaces.length;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {session.appName}\n </Text>\n <Text color=\"gray\">\n https://app.mindstudio.ai/agents/{session.appId}/edit\n </Text>\n <Text color=\"gray\">\n Select an interface or script to connect your local editor.\n </Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"white\">\n Interfaces\n </Text>\n {interfaces.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {interfaces.map((item, i) => {\n const isSelected = i === cursorIndex;\n const status = getSessionStatus(item);\n const statusLabel = getStatusLabel(status);\n\n return (\n <Box\n key={`${item.step.workflowId}:${item.step.stepId}`}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {item.step.workflowName} -{' '}\n {item.step.displayName}\n </Text>\n <Box>\n <Text color={statusLabel.color}>\n {' '}\n {statusLabel.text}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n ) : (\n <Text color=\"gray\"> No interfaces in this agent.</Text>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"white\">\n Scripts\n </Text>\n {scripts.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {scripts.map((item, i) => {\n const index = scriptsOffset + i;\n const isSelected = index === cursorIndex;\n\n return (\n <Box\n key={`${item.step.workflowId}:${item.step.stepId}`}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {item.step.workflowName} -{' '}\n {item.step.displayName}\n </Text>\n <Text color=\"gray\">\n {' '}\n {item.step.entryFile}\n </Text>\n </Box>\n );\n })}\n </Box>\n ) : (\n <Text color=\"gray\"> No scripts in this agent.</Text>\n )}\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text\n color={cursorIndex === refreshIndex ? 'cyan' : 'white'}\n bold={cursorIndex === refreshIndex}\n >\n {cursorIndex === refreshIndex ? '\\u276F' : ' '} Refresh\n </Text>\n {getRefreshSuffix(refreshStatus) && (\n <Text color=\"gray\"> {getRefreshSuffix(refreshStatus)}</Text>\n )}\n </Box>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Local dev view (level 3, interfaces and scripts) ---\n\nfunction LocalDevView({\n item,\n onBack,\n}: {\n item: InterfaceItem | ScriptItem;\n onBack: () => void;\n}) {\n const mode = item.kind === 'script' ? 'script' : 'interface';\n\n let sessionId = '';\n if (item.kind === 'interface') {\n const hotUpdateDomain = item.step.spaEditorSession?.hotUpdateDomain ?? '';\n sessionId = hotUpdateDomain.replace(/^https?:\\/\\//, '').split('.')[0] || '';\n }\n\n const {\n phase,\n hasLocalCopy,\n localPath,\n outputLines,\n errorMessage,\n start,\n stop,\n deleteLocalCopy,\n } = useLocalInterface({\n mode,\n appId: item.appId,\n stepId: item.step.stepId,\n workflowId: item.step.workflowId,\n sessionId,\n });\n\n const name = `${item.step.workflowName} - ${item.step.displayName}`;\n\n const isActive =\n phase === 'cloning' ||\n phase === 'installing' ||\n phase === 'running' ||\n phase === 'deleting';\n\n // If the dev server exits (phase goes from active back to idle), go back to the list\n const wasActiveRef = useRef(false);\n useEffect(() => {\n if (isActive) {\n wasActiveRef.current = true;\n } else if (wasActiveRef.current && phase === 'idle') {\n wasActiveRef.current = false;\n onBack();\n }\n }, [phase, isActive, onBack]);\n\n if (isActive || phase === 'error') {\n return (\n <InterfaceRunningView\n name={name}\n phase={phase}\n outputLines={outputLines}\n errorMessage={errorMessage}\n localPath={localPath}\n onStop={stop}\n onBack={onBack}\n />\n );\n }\n\n return (\n <InterfaceSessionView\n item={item}\n onStart={start}\n onDelete={deleteLocalCopy}\n onBack={onBack}\n hasLocalCopy={hasLocalCopy}\n localPath={localPath}\n />\n );\n}\n\n// --- Main page ---\n\nexport function InterfacesPage({\n onBack,\n sessions,\n refreshStatus,\n refresh,\n}: InterfacesPageProps) {\n const [selectedAppId, setSelectedAppId] = useState<string | null>(null);\n const [selectedItem, setSelectedItem] = useState<\n InterfaceItem | ScriptItem | null\n >(null);\n\n if (selectedItem) {\n return (\n <LocalDevView item={selectedItem} onBack={() => setSelectedItem(null)} />\n );\n }\n\n if (selectedAppId) {\n const session = sessions.find((s) => s.appId === selectedAppId);\n if (session) {\n return (\n <AgentDetailView\n session={session}\n onBack={() => setSelectedAppId(null)}\n onSelect={(item) => {\n setSelectedItem(item);\n }}\n onRefresh={refresh}\n refreshStatus={refreshStatus}\n />\n );\n }\n }\n\n return (\n <AgentListView\n sessions={sessions}\n onBack={onBack}\n onSelectAgent={setSelectedAppId}\n onRefresh={refresh}\n refreshStatus={refreshStatus}\n />\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport {\n getLocalInterfacePath,\n setLocalInterfacePath,\n deleteLocalInterfacePath,\n getLocalInterfacesDir,\n getApiKey,\n getApiBaseUrl,\n getEnvironment,\n} from '../../../config';\nimport path from 'node:path';\n\nconst INTERFACE_SCAFFOLD_REPO =\n 'https://github.com/mindstudio-ai/spa-bundle-scaffold';\nconst SCRIPT_SCAFFOLD_REPO = 'https://github.com/mindstudio-ai/script-scaffold';\nconst MAX_OUTPUT_LINES = 500;\n\nexport type LocalInterfacePhase =\n | 'idle'\n | 'cloning'\n | 'installing'\n | 'running'\n | 'error'\n | 'deleting';\n\ninterface UseLocalInterfaceOptions {\n mode: 'interface' | 'script';\n appId: string;\n stepId: string;\n workflowId: string;\n /** For interfaces: the hot update domain subdomain (e.g. sb-xxx) */\n sessionId?: string;\n}\n\ninterface UseLocalInterfaceResult {\n phase: LocalInterfacePhase;\n hasLocalCopy: boolean;\n outputLines: string[];\n localPath: string | undefined;\n errorMessage: string | null;\n start: () => void;\n stop: () => void;\n deleteLocalCopy: () => void;\n}\n\nexport function useLocalInterface({\n mode,\n appId,\n stepId,\n workflowId,\n sessionId,\n}: UseLocalInterfaceOptions): UseLocalInterfaceResult {\n const key = `${appId}:${stepId}`;\n\n const [hasLocalCopy, setHasLocalCopy] = useState(() => {\n const existing = getLocalInterfacePath(key);\n if (!existing) return false;\n try {\n return fs.existsSync(existing);\n } catch {\n return false;\n }\n });\n\n const [phase, setPhase] = useState<LocalInterfacePhase>('idle');\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const processRef = useRef<ChildProcess | null>(null);\n const mountedRef = useRef(true);\n const stoppedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n processRef.current = null;\n }\n };\n }, []);\n\n const appendOutput = useCallback((line: string) => {\n if (!mountedRef.current) return;\n setOutputLines((prev) => {\n const next = [...prev, line];\n return next.length > MAX_OUTPUT_LINES\n ? next.slice(next.length - MAX_OUTPUT_LINES)\n : next;\n });\n }, []);\n\n const runCommand = useCallback(\n (\n command: string,\n args: string[],\n options: { cwd?: string; env?: Record<string, string> } = {},\n ): Promise<number> => {\n return new Promise((resolve, reject) => {\n const fullCommand = [command, ...args].join(' ');\n const proc = spawn(fullCommand, [], {\n cwd: options.cwd,\n shell: true,\n env: { ...process.env, FORCE_COLOR: '1', ...options.env },\n });\n\n processRef.current = proc;\n\n const handleData = (data: Buffer) => {\n const lines = data.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n appendOutput(line);\n }\n }\n };\n\n proc.stdout?.on('data', handleData);\n proc.stderr?.on('data', handleData);\n\n proc.on('close', (code) => {\n processRef.current = null;\n resolve(code ?? 0);\n });\n\n proc.on('error', (err) => {\n processRef.current = null;\n reject(err);\n });\n });\n },\n [appendOutput],\n );\n\n const getScaffoldRepo = () =>\n mode === 'script' ? SCRIPT_SCAFFOLD_REPO : INTERFACE_SCAFFOLD_REPO;\n\n const getDirPrefix = () => (mode === 'script' ? 'script' : 'interface');\n\n const getDevLocalArgs = (): {\n args: string[];\n env: Record<string, string>;\n } => {\n const env: Record<string, string> = {};\n\n if (getEnvironment() === 'local') {\n env.MINDSTUDIO_API_URL = getApiBaseUrl();\n env.MINDSTUDIO_WS_URL = 'ws://localhost:8888';\n }\n\n env.MINDSTUDIO_API_KEY = getApiKey() ?? '';\n return {\n args: [\n 'run',\n 'dev:local',\n '--',\n '--app',\n appId,\n '--workflow',\n workflowId,\n '--step',\n stepId,\n ],\n env,\n };\n };\n\n const start = useCallback(() => {\n setErrorMessage(null);\n setOutputLines([]);\n stoppedRef.current = false;\n\n const run = async () => {\n const localPath = getLocalInterfacePath(key);\n const dirExists = localPath && fs.existsSync(localPath);\n\n try {\n if (!dirExists) {\n // Clone\n setPhase('cloning');\n const interfacesDir = getLocalInterfacesDir();\n fs.mkdirSync(interfacesDir, { recursive: true });\n\n const shortId = crypto.randomBytes(4).toString('hex');\n const dirName = `${getDirPrefix()}-${shortId}`;\n const targetDir = path.join(interfacesDir, dirName);\n\n appendOutput(`Cloning scaffold into ${targetDir}...`);\n const cloneCode = await runCommand('git', [\n 'clone',\n '--depth',\n '1',\n getScaffoldRepo(),\n targetDir,\n ]);\n\n if (!mountedRef.current) return;\n if (cloneCode !== 0) {\n throw new Error(`git clone failed with exit code ${cloneCode}`);\n }\n\n // Install\n setPhase('installing');\n appendOutput('Installing dependencies...');\n const installCode = await runCommand('npm', ['install'], {\n cwd: targetDir,\n });\n\n if (!mountedRef.current) return;\n if (installCode !== 0) {\n throw new Error(`npm install failed with exit code ${installCode}`);\n }\n\n setLocalInterfacePath(key, targetDir);\n setHasLocalCopy(true);\n\n // Run\n setPhase('running');\n const { args, env } = getDevLocalArgs();\n appendOutput('Starting local dev server...');\n const devCode = await runCommand('npm', args, { cwd: targetDir, env });\n\n if (mountedRef.current) {\n if (devCode !== 0 && !stoppedRef.current) {\n throw new Error(`Dev server exited with code ${devCode}`);\n }\n setPhase('idle');\n setOutputLines([]);\n }\n } else {\n // Already cloned — just run\n setPhase('running');\n const { args, env } = getDevLocalArgs();\n appendOutput('Starting local dev server...');\n const devCode = await runCommand('npm', args, { cwd: localPath, env });\n\n if (mountedRef.current) {\n if (devCode !== 0 && !stoppedRef.current) {\n throw new Error(`Dev server exited with code ${devCode}`);\n }\n setPhase('idle');\n setOutputLines([]);\n }\n }\n } catch (err) {\n if (mountedRef.current) {\n setPhase('error');\n setErrorMessage(err instanceof Error ? err.message : 'Unknown error');\n }\n }\n };\n\n run();\n }, [\n key,\n mode,\n appId,\n stepId,\n workflowId,\n sessionId,\n appendOutput,\n runCommand,\n ]);\n\n const stop = useCallback(() => {\n stoppedRef.current = true;\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n const proc = processRef.current;\n setTimeout(() => {\n if (proc && !proc.killed) {\n proc.kill('SIGKILL');\n }\n }, 2000);\n processRef.current = null;\n }\n setPhase('idle');\n }, []);\n\n const deleteLocalCopy = useCallback(() => {\n const localPath = getLocalInterfacePath(key);\n if (!localPath) return;\n\n setPhase('deleting');\n setOutputLines([]);\n appendOutput(`Deleting ${localPath}...`);\n\n try {\n fs.rmSync(localPath, { recursive: true, force: true });\n deleteLocalInterfacePath(key);\n setHasLocalCopy(false);\n appendOutput('Deleted successfully.');\n } catch (err) {\n setErrorMessage(err instanceof Error ? err.message : 'Failed to delete');\n }\n setPhase('idle');\n }, [key, appendOutput]);\n\n return {\n phase,\n hasLocalCopy,\n localPath: getLocalInterfacePath(key),\n outputLines,\n errorMessage,\n start,\n stop,\n deleteLocalCopy,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport os from 'node:os';\nimport open from 'open';\nimport type { InterfaceItem, ScriptItem } from './InterfacesPage';\n\ninterface InterfaceSessionViewProps {\n item: InterfaceItem | ScriptItem;\n onStart: () => void;\n onDelete: () => void;\n onBack: () => void;\n hasLocalCopy: boolean;\n localPath: string | undefined;\n}\n\nexport function InterfaceSessionView({\n item,\n onStart,\n onDelete,\n onBack,\n hasLocalCopy,\n localPath,\n}: InterfaceSessionViewProps) {\n const menuItems: Array<{ id: string; label: string }> = [\n { id: 'start', label: 'Start Locally' },\n ];\n if (hasLocalCopy) {\n menuItems.push({ id: 'reveal', label: 'Open Folder' });\n menuItems.push({ id: 'delete', label: 'Delete Local Copy' });\n }\n menuItems.push({ id: 'back', label: 'Back' });\n\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [hasLocalCopy]);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const selected = menuItems[cursorIndex];\n if (!selected) return;\n switch (selected.id) {\n case 'start':\n onStart();\n break;\n case 'reveal':\n if (localPath) {\n open(localPath);\n }\n break;\n case 'delete':\n onDelete();\n break;\n case 'back':\n onBack();\n break;\n }\n }\n });\n\n const name = `${item.step.workflowName} - ${item.step.displayName}`;\n const displayPath = localPath?.replace(os.homedir(), '~');\n\n let sessionInfo: string | null = null;\n if (item.kind === 'interface') {\n const hotUpdateDomain = item.step.spaEditorSession?.hotUpdateDomain ?? '';\n sessionInfo =\n hotUpdateDomain.replace(/^https?:\\/\\//, '').split('.')[0] || null;\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {sessionInfo && <Text color=\"gray\">Session: {sessionInfo}</Text>}\n {hasLocalCopy && localPath ? (\n <>\n <Text color=\"green\">Local copy exists</Text>\n <Text color=\"gray\">Path: {displayPath}</Text>\n </>\n ) : (\n <Text color=\"yellow\">\n No local copy. &quot;Start Locally&quot; will clone the scaffold\n and install dependencies.\n </Text>\n )}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((menuItem, i) => {\n const isSelected = i === cursorIndex;\n return (\n <Text\n key={menuItem.id}\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {menuItem.label}\n </Text>\n );\n })}\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { execSync } from 'node:child_process';\nimport os from 'node:os';\nimport open from 'open';\nimport Spinner from 'ink-spinner';\nimport type { LocalInterfacePhase } from '../hooks/useLocalInterface';\n\nfunction copyToClipboard(text: string): boolean {\n try {\n if (process.platform === 'darwin') {\n execSync('pbcopy', { input: text });\n } else if (process.platform === 'win32') {\n execSync('clip', { input: text });\n } else {\n execSync('xclip -selection clipboard', { input: text });\n }\n return true;\n } catch {\n return false;\n }\n}\n\ninterface InterfaceRunningViewProps {\n name: string;\n phase: LocalInterfacePhase;\n outputLines: string[];\n errorMessage: string | null;\n localPath: string | undefined;\n onStop: () => void;\n onBack: () => void;\n}\n\nfunction getPhaseLabel(phase: LocalInterfacePhase): {\n text: string;\n color: string;\n showSpinner: boolean;\n} {\n switch (phase) {\n case 'cloning':\n return { text: 'Cloning scaffold...', color: 'cyan', showSpinner: true };\n case 'installing':\n return {\n text: 'Installing dependencies...',\n color: 'cyan',\n showSpinner: true,\n };\n case 'running':\n return { text: 'Dev server running', color: 'green', showSpinner: true };\n case 'error':\n return { text: 'Error', color: 'red', showSpinner: false };\n case 'deleting':\n return {\n text: 'Deleting local copy...',\n color: 'yellow',\n showSpinner: true,\n };\n default:\n return { text: 'Idle', color: 'gray', showSpinner: false };\n }\n}\n\nexport function InterfaceRunningView({\n name,\n phase,\n outputLines,\n errorMessage,\n localPath,\n onStop,\n onBack,\n}: InterfaceRunningViewProps) {\n const { stdout } = useStdout();\n const termHeight = (stdout?.rows ?? 24) - 4;\n\n const isActive =\n phase === 'cloning' ||\n phase === 'installing' ||\n phase === 'running' ||\n phase === 'deleting';\n\n const displayPath = localPath?.replace(os.homedir(), '~');\n\n // Build menu items\n const menuItems = useMemo(() => {\n const items: Array<{ id: string; label: string; copyValue?: string }> = [];\n if (isActive && displayPath) {\n items.push({\n id: 'claude',\n label: 'Copy Claude Code Command',\n copyValue: `cd ${displayPath}; claude`,\n });\n items.push({\n id: 'codex',\n label: 'Copy Codex Command',\n copyValue: `cd ${displayPath}; codex`,\n });\n items.push({ id: 'reveal', label: 'Open Folder' });\n }\n items.push({ id: 'action', label: isActive ? 'Stop' : 'Back' });\n return items;\n }, [isActive, displayPath]);\n\n const [cursorIndex, setCursorIndex] = useState(0);\n const [copiedId, setCopiedId] = useState<string | null>(null);\n const copiedTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n return () => clearTimeout(copiedTimerRef.current);\n }, []);\n\n // Layout\n const headerHeight = 14;\n const menuHeight = menuItems.length;\n const chromeLines = 7 + menuHeight;\n const logHeight = Math.max(3, termHeight - headerHeight - chromeLines);\n\n // Auto-follow log tail\n const maxScroll = Math.max(0, outputLines.length - logHeight);\n const effectiveOffset = maxScroll;\n\n const copyItem = (item: { id: string; copyValue?: string }) => {\n if (!item.copyValue) return;\n const success = copyToClipboard(item.copyValue);\n if (success) {\n setCopiedId(item.id);\n clearTimeout(copiedTimerRef.current);\n copiedTimerRef.current = setTimeout(() => setCopiedId(null), 2000);\n }\n };\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[cursorIndex];\n if (!item) return;\n if (item.copyValue) {\n copyItem(item);\n } else if (item.id === 'reveal' && localPath) {\n open(localPath);\n } else if (isActive) {\n onStop();\n } else {\n onBack();\n }\n } else if (input === 'q' || key.escape) {\n if (isActive) {\n onStop();\n } else {\n onBack();\n }\n }\n });\n\n const visibleLines = outputLines.slice(\n effectiveOffset,\n effectiveOffset + logHeight,\n );\n\n const phaseInfo = getPhaseLabel(phase);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1}>\n {phaseInfo.showSpinner && (\n <Text color={phaseInfo.color}>\n <Spinner type=\"dots\" />{' '}\n </Text>\n )}\n <Text color={phaseInfo.color}>{phaseInfo.text}</Text>\n </Box>\n\n {errorMessage && (\n <Box marginTop={1}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )}\n\n <Box marginTop={1} height={logHeight}>\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {visibleLines.map((line, i) => (\n <Text key={effectiveOffset + i} wrap=\"truncate-end\" color=\"gray\">\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((item, i) => {\n const isSelected = i === cursorIndex;\n const isCopied = copiedId === item.id;\n return (\n <Box key={item.id}>\n <Text color={isSelected ? 'cyan' : 'white'} bold={isSelected}>\n {isSelected ? '\\u276F' : ' '} {item.label}\n </Text>\n {isCopied && <Text color=\"green\"> {'\\u2713'} Copied!</Text>}\n </Box>\n );\n })}\n </Box>\n\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc{' '}\n {isActive ? 'Stop' : 'Back'}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useCallback, useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport chalk from 'chalk';\nimport { useAuth } from '../hooks/useAuth';\nimport { LogoString } from '../components/Header';\n\ninterface OnboardingPageProps {\n onComplete: () => void;\n}\n\nconst SHIMMER_SPEED = 35;\n\nfunction useShimmerLogo(): string {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n // Full cycle: fade in + hold + fade out + pause\n const cycleLength = totalChars + 40;\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % cycleLength);\n }, SHIMMER_SPEED);\n return () => clearInterval(interval);\n }, [cycleLength]);\n\n return useMemo(() => {\n // Map frame to a wave that fades the whole logo in and out\n // Phase 0..totalChars: characters light up one by one (sweep in)\n // Phase totalChars..totalChars+20: hold bright\n // Phase totalChars+20..cycleLength: all fade out together\n const sweepPos = frame;\n const holdEnd = totalChars + 20;\n\n let charIdx = 0;\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n let brightness: number;\n if (sweepPos <= totalChars) {\n // Sweep phase: characters light up as the wave passes\n const lag = charIdx;\n const t = sweepPos - lag;\n brightness = t <= 0 ? 0.1 : Math.min(1, t / 8);\n } else if (sweepPos <= holdEnd) {\n // Hold phase: everything bright\n brightness = 1;\n } else {\n // Fade out phase\n const fadeProgress = (sweepPos - holdEnd) / (cycleLength - holdEnd);\n brightness = Math.max(0.1, 1 - fadeProgress);\n }\n\n if (brightness >= 0.9) {\n result += chalk.cyanBright.bold(ch);\n } else if (brightness >= 0.6) {\n result += chalk.cyan(ch);\n } else if (brightness >= 0.3) {\n result += chalk.rgb(0, 100, 120)(ch);\n } else {\n result += chalk.rgb(0, 50, 60)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [frame, lines, totalChars, cycleLength]);\n}\n\nexport function OnboardingPage({ onComplete }: OnboardingPageProps) {\n const {\n status: authStatus,\n authUrl,\n timeRemaining,\n startAuth,\n cancel: cancelAuth,\n } = useAuth();\n const shimmerLogo = useShimmerLogo();\n\n // Auto-navigate to dashboard on success\n useEffect(() => {\n if (authStatus === 'success') {\n const timer = setTimeout(() => onComplete(), 1500);\n return () => clearTimeout(timer);\n }\n }, [authStatus, onComplete]);\n\n // Clean up auth on unmount\n useEffect(() => {\n return () => cancelAuth();\n }, []);\n\n const handleAction = useCallback(() => {\n cancelAuth();\n startAuth();\n }, [cancelAuth, startAuth]);\n\n const canAct =\n authStatus === 'idle' ||\n authStatus === 'expired' ||\n authStatus === 'timeout';\n\n useInput((_input, key) => {\n if (canAct && !key.ctrl) {\n handleAction();\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexGrow={1} />\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>{shimmerLogo}</Text>\n\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n {authStatus === 'idle' && (\n <>\n <Text color=\"gray\">\n Connect your MindStudio account to get started.\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to Connect Account\n </Text>\n </Box>\n </>\n )}\n\n {(authStatus === 'expired' || authStatus === 'timeout') && (\n <>\n <Text color=\"red\">\n {authStatus === 'expired'\n ? 'Authorization expired.'\n : 'Authorization timed out.'}\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to Try Again\n </Text>\n </Box>\n </>\n )}\n\n {authStatus === 'waiting' && (\n <>\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text>\n {' '}\n Waiting for browser authorization... ({timeRemaining}s\n remaining)\n </Text>\n </Box>\n {authUrl && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Text color=\"gray\">If browser didn't open, visit:</Text>\n <Text color=\"cyan\">{authUrl}</Text>\n </Box>\n )}\n </>\n )}\n\n {authStatus === 'success' && (\n <Text color=\"green\">{'\\u2713'} Authenticated!</Text>\n )}\n </Box>\n </Box>\n\n <Box flexGrow={1} />\n </Box>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport open from 'open';\nimport { requestDeviceAuth, pollDeviceAuth } from '../../api';\nimport { setApiKey, setUserId } from '../../config';\n\ntype AuthStatus = 'idle' | 'waiting' | 'success' | 'expired' | 'timeout';\n\ninterface UseAuthResult {\n status: AuthStatus;\n authUrl: string | null;\n timeRemaining: number;\n startAuth: () => void;\n cancel: () => void;\n}\n\nconst POLL_INTERVAL = 2000;\nconst MAX_ATTEMPTS = 30;\n\nexport function useAuth(): UseAuthResult {\n const [status, setStatus] = useState<AuthStatus>('idle');\n const [authUrl, setAuthUrl] = useState<string | null>(null);\n const [timeRemaining, setTimeRemaining] = useState(0);\n const cancelledRef = useRef(false);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Clean up timer on unmount\n useEffect(() => {\n return () => {\n cancelledRef.current = true;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, []);\n\n const cancel = useCallback(() => {\n cancelledRef.current = true;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setStatus('idle');\n setAuthUrl(null);\n setTimeRemaining(0);\n }, []);\n\n const startAuth = useCallback(() => {\n cancelledRef.current = false;\n\n const run = async () => {\n try {\n const { url, token } = await requestDeviceAuth();\n if (cancelledRef.current) return;\n\n setAuthUrl(url);\n setStatus('waiting');\n\n const totalTime = (MAX_ATTEMPTS * POLL_INTERVAL) / 1000;\n setTimeRemaining(totalTime);\n\n // Countdown timer\n timerRef.current = setInterval(() => {\n setTimeRemaining((prev) => {\n const next = prev - 1;\n if (next <= 0 && timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return Math.max(0, next);\n });\n }, 1000);\n\n await open(url);\n\n // Poll loop\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL));\n if (cancelledRef.current) return;\n\n const result = await pollDeviceAuth(token);\n\n if (result.status === 'completed' && result.apiKey) {\n if (timerRef.current) clearInterval(timerRef.current);\n setApiKey(result.apiKey);\n if (result.userId) {\n setUserId(result.userId);\n }\n setStatus('success');\n return;\n }\n\n if (result.status === 'expired') {\n if (timerRef.current) clearInterval(timerRef.current);\n setStatus('expired');\n return;\n }\n }\n\n if (!cancelledRef.current) {\n setStatus('timeout');\n }\n } catch {\n if (!cancelledRef.current) {\n setStatus('expired');\n }\n }\n };\n\n run();\n }, []);\n\n return {\n status,\n authUrl,\n timeRemaining,\n startAuth,\n cancel,\n };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { NavigationMenu } from '../../components/NavigationMenu';\nimport type { MenuItem } from '../../components/NavigationMenu';\nimport { DevRequestLog } from '../components/DevRequestLog';\nimport { DevPortPrompt } from '../components/DevPortPrompt';\nimport { TabBar, type Tab } from '../components/TabBar';\nimport { useDevSession } from '../hooks/useDevSession';\nimport { useDevRequests } from '../hooks/useDevRequests';\nimport type { AppConfig } from '../../../dev/types';\n\nconst TABS: Tab[] = [\n { id: 'info', label: 'Info' },\n { id: 'requests', label: 'Requests' },\n { id: 'methods', label: 'Methods' },\n { id: 'server', label: 'Dev Server' },\n];\n\ninterface DevPageProps {\n appConfig: AppConfig;\n onNavigate: (id: string) => void;\n termHeight?: number;\n}\n\nexport function DevPage({ appConfig, onNavigate, termHeight }: DevPageProps) {\n const {\n phase,\n session,\n error,\n devPort,\n proxyPort,\n devServer,\n syncResult,\n scenarioResult,\n roleOverride,\n installStatus,\n start,\n stop,\n resync,\n runScenario,\n setImpersonation,\n clearImpersonation,\n submitPort,\n skipFrontend,\n } = useDevSession(appConfig);\n const { requests, activeCount } = useDevRequests();\n const [activeTab, setActiveTab] = useState('info');\n const [showScenarioPicker, setShowScenarioPicker] = useState(false);\n const [showRolePicker, setShowRolePicker] = useState(false);\n\n const hasScenarios = appConfig.scenarios.length > 0;\n const hasRoles = appConfig.roles.length > 0;\n\n const runningMenuItems: MenuItem[] = useMemo(\n () => [\n ...(hasScenarios\n ? [{ id: 'scenario', label: 'Run Scenario', description: 'Seed database with test data' }]\n : []),\n ...(hasRoles\n ? [{ id: 'impersonate', label: 'Impersonate', description: roleOverride ? `Active: ${roleOverride.join(', ')}` : 'Test as a different role' }]\n : []),\n { id: 'sync', label: 'Sync Schema', description: 'Re-sync table definitions from disk' },\n { id: 'stop', label: 'Stop Session', description: 'Stop the dev session and clean up' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ],\n [hasScenarios, hasRoles, roleOverride],\n );\n\n // Tab navigation with left/right arrows (only when running)\n useInput((_input, key) => {\n if (phase !== 'running') return;\n if (key.leftArrow) {\n const idx = TABS.findIndex((t) => t.id === activeTab);\n setActiveTab(TABS[(idx - 1 + TABS.length) % TABS.length].id);\n } else if (key.rightArrow) {\n const idx = TABS.findIndex((t) => t.id === activeTab);\n setActiveTab(TABS[(idx + 1) % TABS.length].id);\n }\n });\n\n // Auto-start when ready\n useEffect(() => {\n if (phase === 'ready') {\n start();\n }\n }, [phase, start]);\n\n // Detecting state\n if (phase === 'detecting') {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text>\n <Spinner type=\"dots\" /> Checking app configuration...\n </Text>\n </Box>\n );\n }\n\n // Needs port input\n if (phase === 'needs_port') {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <DevPortPrompt onSubmit={submitPort} onSkip={skipFrontend} />\n </Box>\n );\n }\n\n // Starting\n if (phase === 'starting') {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box paddingX={1} marginTop={1} flexDirection=\"column\">\n <Text>\n <Spinner type=\"dots\" /> Starting dev session...\n </Text>\n {installStatus && (\n <Text color=\"gray\">\n <Spinner type=\"dots\" /> {installStatus}\n </Text>\n )}\n {devServer.phase === 'starting' && (\n <Text color=\"gray\">\n <Spinner type=\"dots\" /> Waiting for dev server on port {devPort}...\n </Text>\n )}\n {devServer.outputLines.slice(-6).map((line, i) => (\n <Text key={i} color=\"gray\" dimColor wrap=\"truncate\">{line}</Text>\n ))}\n </Box>\n </Box>\n );\n }\n\n // Error state\n if (phase === 'error') {\n const errorMenuItems: MenuItem[] = [\n { id: 'retry', label: 'Retry', description: 'Try starting the session again' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n {error && <Text color=\"red\">✖ {error}</Text>}\n {devServer.error && <Text color=\"red\">Dev server: {devServer.error}</Text>}\n {devServer.outputLines.slice(-5).map((line, i) => (\n <Text key={i} color=\"gray\" dimColor wrap=\"truncate\">{line}</Text>\n ))}\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={errorMenuItems}\n onSelect={(id) => {\n if (id === 'retry') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Stopped state\n if (phase === 'stopped') {\n const stoppedMenuItems: MenuItem[] = [\n { id: 'restart', label: 'Restart', description: 'Start a new dev session' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">Session stopped.</Text>\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={stoppedMenuItems}\n onSelect={(id) => {\n if (id === 'restart') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Expired state\n if (phase === 'expired') {\n const expiredMenuItems: MenuItem[] = [\n { id: 'restart', label: 'Restart', description: 'Start a new dev session' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">\n ⚠ Dev session expired. The platform may have timed it out.\n </Text>\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={expiredMenuItems}\n onSelect={(id) => {\n if (id === 'restart') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Running state — tabbed view\n const statusLines = 4; // status bar + tab bar\n const menuLines = 8;\n const contentHeight = Math.max(5, (termHeight ?? 30) - statusLines - menuLines);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {/* Persistent status bar */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Box gap={2}>\n <Text bold color=\"white\">{appConfig.name}</Text>\n <Text color=\"green\">● {session?.branch ?? 'main'}</Text>\n <Text color=\"cyan\">{session?.previewUrl ?? session?.webInterfaceUrl ?? ''}</Text>\n </Box>\n </Box>\n\n {/* Tab content */}\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {activeTab === 'info' && (\n <InfoTab\n appConfig={appConfig}\n session={session}\n devPort={devPort}\n proxyPort={proxyPort}\n devServerPhase={devServer.phase}\n requests={requests}\n syncResult={syncResult}\n scenarioResult={scenarioResult}\n roleOverride={roleOverride}\n contentHeight={contentHeight}\n />\n )}\n {activeTab === 'requests' && (\n <DevRequestLog requests={requests} maxVisible={contentHeight} />\n )}\n {activeTab === 'methods' && (\n <MethodsTab appConfig={appConfig} contentHeight={contentHeight} />\n )}\n {activeTab === 'server' && (\n <DevServerTab\n devPort={devPort}\n phase={devServer.phase}\n outputLines={devServer.outputLines}\n error={devServer.error}\n contentHeight={contentHeight}\n />\n )}\n </Box>\n\n {/* Menu, scenario picker, or role picker */}\n {showScenarioPicker ? (\n <NavigationMenu\n title=\"Select Scenario\"\n items={[\n ...appConfig.scenarios.map((s) => ({\n id: `scenario:${s.id}`,\n label: s.name ?? s.id,\n description: s.description ?? `Roles: ${s.roles.length > 0 ? s.roles.join(', ') : 'none'}`,\n })),\n { id: 'back', label: 'Back', description: 'Return to actions' },\n ]}\n onSelect={(id) => {\n setShowScenarioPicker(false);\n if (id.startsWith('scenario:')) {\n runScenario(id.slice('scenario:'.length));\n }\n }}\n />\n ) : showRolePicker ? (\n <NavigationMenu\n title=\"Impersonate Role\"\n items={[\n ...appConfig.roles.map((r) => ({\n id: `role:${r.id}`,\n label: r.name ?? r.id,\n description: r.description ?? r.id,\n })),\n ...(roleOverride ? [{ id: 'clear', label: 'Clear Override', description: 'Revert to default session roles' }] : []),\n { id: 'back', label: 'Back', description: 'Return to actions' },\n ]}\n onSelect={(id) => {\n setShowRolePicker(false);\n if (id === 'clear') {\n clearImpersonation();\n } else if (id.startsWith('role:')) {\n setImpersonation([id.slice('role:'.length)]);\n }\n }}\n />\n ) : (\n <NavigationMenu\n items={runningMenuItems}\n onSelect={(id) => {\n if (id === 'scenario') setShowScenarioPicker(true);\n else if (id === 'impersonate') setShowRolePicker(true);\n else if (id === 'sync') resync();\n else if (id === 'stop') stop();\n else onNavigate(id);\n }}\n />\n )}\n\n {/* Tab bar */}\n <TabBar tabs={TABS} activeTab={activeTab} />\n </Box>\n );\n}\n\n/** Compact header showing app name for non-running states. */\nfunction AppInfoHeader({ appConfig }: { appConfig: AppConfig }) {\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n paddingY={1}\n borderStyle=\"round\"\n borderColor=\"gray\"\n >\n <Text bold color=\"white\">\n {appConfig.name}\n </Text>\n {appConfig.description && (\n <Text color=\"gray\">{appConfig.description}</Text>\n )}\n {!appConfig.appId && (\n <Text color=\"yellow\">\n ⚠ No &quot;appId&quot; field in mindstudio.json — add your app ID to start a dev session\n </Text>\n )}\n </Box>\n );\n}\n\n/** Info tab — session details, databases, summary stats. */\nfunction InfoTab({\n appConfig,\n session,\n devPort,\n proxyPort,\n devServerPhase,\n requests,\n syncResult,\n scenarioResult,\n roleOverride,\n contentHeight,\n}: {\n appConfig: AppConfig;\n session: ReturnType<typeof useDevSession>['session'];\n devPort: number | null;\n proxyPort: number | null;\n devServerPhase: string;\n requests: import('../../../dev/types').DevRequestLogEntry[];\n syncResult: import('../../../dev/types').SyncSchemaResponse | null;\n scenarioResult: { id: string; name?: string; success: boolean; roles: string[]; error?: string } | null;\n roleOverride: string[] | null;\n contentHeight: number;\n}) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>Session</Text>\n <Text>\n <Text color=\"gray\">Session ID: </Text>\n <Text>{session?.sessionId ?? '...'}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Release ID: </Text>\n <Text>{session?.releaseId ?? '...'}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Branch: </Text>\n <Text>{session?.branch ?? '...'}</Text>\n </Text>\n {session?.user && (\n <Text>\n <Text color=\"gray\">User: </Text>\n <Text>{session.user.name} ({session.user.email})</Text>\n </Text>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>App URL</Text></Box>\n <Text color=\"cyan\" bold>\n {session?.previewUrl ?? session?.webInterfaceUrl ?? '...'}\n </Text>\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Dev Server</Text></Box>\n {devPort !== null ? (\n <Text>\n <Text>localhost:{devPort}</Text>\n {devServerPhase === 'running' ? (\n <Text color=\"green\"> ● running</Text>\n ) : devServerPhase === 'starting' ? (\n <Text color=\"yellow\"> ○ starting</Text>\n ) : (\n <Text color=\"gray\"> ○ {devServerPhase}</Text>\n )}\n </Text>\n ) : (\n <Text color=\"gray\" dimColor>Backend-only mode (no frontend)</Text>\n )}\n\n {roleOverride && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Impersonation</Text>\n <Text color=\"yellow\"> ● Active: {roleOverride.join(', ')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Databases</Text></Box>\n {(session?.databases ?? []).length === 0 ? (\n <Text color=\"gray\" dimColor>No databases</Text>\n ) : (\n session?.databases.map((db) => (\n <Box key={db.id} flexDirection=\"column\">\n <Text> <Text color=\"cyan\">{db.name}</Text></Text>\n {db.tables.map((table) => (\n <Text key={table.name} color=\"gray\"> {table.name}</Text>\n ))}\n </Box>\n ))\n )}\n\n {syncResult && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Schema Sync</Text>\n {syncResult.created.length > 0 && (\n <Text color=\"green\"> ✓ Created: {syncResult.created.join(', ')}</Text>\n )}\n {syncResult.altered.length > 0 && (\n <Text color=\"yellow\"> ✓ Altered: {syncResult.altered.join(', ')}</Text>\n )}\n {syncResult.errors.map((err, i) => (\n <Text key={i} color=\"red\"> ✖ {err}</Text>\n ))}\n {syncResult.created.length === 0 && syncResult.altered.length === 0 && syncResult.errors.length === 0 && (\n <Text color=\"gray\" dimColor> No changes</Text>\n )}\n </Box>\n )}\n\n {scenarioResult && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Last Scenario</Text>\n {scenarioResult.success ? (\n <Text color=\"green\"> ✓ &quot;{scenarioResult.name ?? scenarioResult.id}&quot; applied</Text>\n ) : (\n <Text color=\"red\"> ✖ &quot;{scenarioResult.name ?? scenarioResult.id}&quot; failed: {scenarioResult.error}</Text>\n )}\n {scenarioResult.roles.length > 0 && (\n <Text color=\"gray\" dimColor> Roles: {scenarioResult.roles.join(', ')}</Text>\n )}\n </Box>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Recent Requests</Text></Box>\n {requests.length === 0 ? (\n <Text color=\"gray\" dimColor>No requests yet</Text>\n ) : (\n requests.slice(-5).map((req) => (\n <Box key={req.id} gap={1}>\n {req.status === 'completed' && <Text color=\"green\">✓</Text>}\n {req.status === 'failed' && <Text color=\"red\">✖</Text>}\n {req.status === 'processing' && <Text color=\"cyan\">●</Text>}\n <Text>{req.method ?? 'unknown'}</Text>\n {req.duration != null && <Text color=\"gray\">{req.duration}ms</Text>}\n {req.status === 'failed' && req.error && (\n <Text color=\"red\" wrap=\"truncate\">{req.error.split('\\n')[0]}</Text>\n )}\n </Box>\n ))\n )}\n </Box>\n );\n}\n\n/** Methods tab — list all methods from mindstudio.json. */\nfunction MethodsTab({\n appConfig,\n contentHeight,\n}: {\n appConfig: AppConfig;\n contentHeight: number;\n}) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Methods ({appConfig.methods.length})\n </Text>\n {appConfig.methods.slice(0, contentHeight - 2).map((method) => (\n <Box key={method.id} gap={1}>\n <Text color=\"cyan\">{method.export}</Text>\n <Text color=\"gray\" dimColor>→ {method.id}</Text>\n <Text color=\"gray\" dimColor>({method.path})</Text>\n </Box>\n ))}\n {appConfig.methods.length === 0 && (\n <Text color=\"gray\" dimColor>No methods defined</Text>\n )}\n </Box>\n );\n}\n\n/** Dev Server tab — full-height output log. */\nfunction DevServerTab({\n devPort,\n phase,\n outputLines,\n error,\n contentHeight,\n}: {\n devPort: number | null;\n phase: string;\n outputLines: string[];\n error: string | null;\n contentHeight: number;\n}) {\n const visibleLines = contentHeight - 3; // header + port line + padding\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Dev Server\n {phase === 'running' ? (\n <Text color=\"green\"> ● running</Text>\n ) : phase === 'starting' ? (\n <Text color=\"yellow\"> ○ starting</Text>\n ) : phase === 'error' ? (\n <Text color=\"red\"> ✖ error</Text>\n ) : (\n <Text color=\"gray\"> ○ {phase}</Text>\n )}\n </Text>\n {devPort !== null && (\n <Text color=\"gray\" dimColor>localhost:{devPort}</Text>\n )}\n {devPort === null && (\n <Text color=\"gray\" dimColor>Backend-only mode (no frontend)</Text>\n )}\n {error && <Text color=\"red\">{error}</Text>}\n {outputLines.slice(-visibleLines).map((line, i) => (\n <Text key={i} color=\"gray\" wrap=\"truncate\">\n {line}\n </Text>\n ))}\n {outputLines.length === 0 && phase !== 'idle' && !error && (\n <Text color=\"gray\" dimColor>Waiting for output...</Text>\n )}\n {outputLines.length === 0 && phase === 'idle' && !error && (\n <Text color=\"gray\" dimColor>Dev server not started</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { DevRequestLogEntry } from '../../../dev/types';\n\ninterface DevRequestLogProps {\n requests: DevRequestLogEntry[];\n maxVisible?: number;\n}\n\nexport function DevRequestLog({\n requests,\n maxVisible = 10,\n}: DevRequestLogProps) {\n if (requests.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Request Log\n </Text>\n <Text color=\"gray\"> Waiting for requests...</Text>\n </Box>\n );\n }\n\n // Show most recent requests, prioritizing active ones\n const active = requests.filter((r) => r.status === 'processing');\n const completed = requests.filter((r) => r.status !== 'processing');\n const recent = completed.slice(-Math.max(0, maxVisible - active.length));\n const visible = [...recent, ...active].slice(-maxVisible);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Request Log\n </Text>\n {visible.map((entry) => (\n <RequestEntry key={entry.id} entry={entry} />\n ))}\n </Box>\n );\n}\n\nfunction RequestEntry({ entry }: { entry: DevRequestLogEntry }) {\n const methodLabel = entry.method ?? 'unknown';\n\n if (entry.status === 'processing') {\n const elapsed = Math.round((Date.now() - entry.startTime) / 1000);\n return (\n <Box gap={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text>{methodLabel}</Text>\n <Text color=\"gray\">{elapsed}s</Text>\n </Box>\n );\n }\n\n if (entry.status === 'failed') {\n const errorLines = (entry.error ?? 'Unknown error').split('\\n').slice(0, 4);\n return (\n <Box flexDirection=\"column\">\n <Box gap={1}>\n <Text color=\"red\">✖</Text>\n <Text>{methodLabel}</Text>\n {entry.duration != null && <Text color=\"gray\">{entry.duration}ms</Text>}\n </Box>\n {errorLines.map((line, i) => (\n <Text key={i} color=\"red\" wrap=\"truncate\">{' '}{line}</Text>\n ))}\n </Box>\n );\n }\n\n // Completed\n const duration = entry.duration != null ? `${entry.duration}ms` : '';\n return (\n <Box gap={1}>\n <Text color=\"green\">✓</Text>\n <Text>{methodLabel}</Text>\n <Text color=\"gray\">{duration}</Text>\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface DevPortPromptProps {\n onSubmit: (port: number) => void;\n onSkip: () => void;\n}\n\nexport function DevPortPrompt({ onSubmit, onSkip }: DevPortPromptProps) {\n const [value, setValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = (input: string) => {\n const trimmed = input.trim();\n\n if (trimmed === '' || trimmed === 'skip') {\n onSkip();\n return;\n }\n\n const port = parseInt(trimmed, 10);\n if (isNaN(port) || port < 1 || port > 65535) {\n setError('Enter a valid port number (1-65535) or \"skip\"');\n return;\n }\n\n onSubmit(port);\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">\n No devPort found in your web interface config.\n </Text>\n <Text color=\"gray\">\n What port is your local dev server running on?\n </Text>\n <Text color=\"gray\" dimColor>\n Type &quot;skip&quot; for backend-only mode (no frontend proxying).\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\">Port: </Text>\n <TextInput\n value={value}\n onChange={(val) => {\n setValue(val);\n setError(null);\n }}\n onSubmit={handleSubmit}\n placeholder=\"5173\"\n />\n </Box>\n {error && (\n <Text color=\"red\">{error}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\n\nexport interface Tab {\n id: string;\n label: string;\n}\n\ninterface TabBarProps {\n tabs: Tab[];\n activeTab: string;\n}\n\nexport function TabBar({ tabs, activeTab }: TabBarProps) {\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n\n const tabSegments = tabs.map((tab) => {\n const isActive = tab.id === activeTab;\n const padded = ` ${tab.label} `;\n return { tab, isActive, padded };\n });\n\n const labelText = 'Screen ';\n const hint = ' ←/→ ';\n const tabChars = tabSegments.reduce((sum, s) => sum + s.padded.length, 0);\n const remaining = Math.max(0, width - tabChars - hint.length - labelText.length);\n\n return (\n <Box>\n <Text color=\"gray\">{labelText}</Text>\n {tabSegments.map(({ tab, isActive, padded }) => (\n <Text\n key={tab.id}\n bold={isActive}\n color={isActive ? 'white' : '#aaaaaa'}\n backgroundColor={isActive ? 'blueBright' : '#333333'}\n >\n {padded}\n </Text>\n ))}\n <Text color=\"#666666\" backgroundColor=\"#333333\">\n {' '.repeat(remaining)}{hint}\n </Text>\n </Box>\n );\n}\n","// Orchestrates the full dev session lifecycle in TUI mode.\n//\n// Startup sequence (triggered by phase state machine):\n// detecting → detect web config from mindstudio.json\n// needs_port → prompt user for dev server port (if not in config)\n// ready → auto-triggers start()\n// starting → npm install (if needed) → start dev server → start platform\n// session → sync schema → start proxy\n// running → poll loop active, proxy serving, ready for requests\n//\n// On mindstudio.json change: fs.watch detects it, stops everything,\n// re-enters 'ready' phase which re-runs start() with fresh config.\n//\n// This hook is the TUI equivalent of src/headless.ts — same pieces\n// (DevRunner, DevProxy, schema sync) wired together with React state.\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { spawn } from 'node:child_process';\nimport { watchConfigFile } from '../../../dev/config-watcher';\nimport { DevRunner } from '../../../dev/runner';\nimport { DevProxy } from '../../../dev/proxy';\nimport { devRequestEvents } from '../../../dev/events';\nimport {\n detectAppConfig,\n getWebInterfaceConfig,\n getWebProjectDir,\n readTableSources,\n findDirsNeedingInstall,\n} from '../../../dev/app-config';\nimport { syncSchema } from '../../../dev/api';\nimport { initLoggerInteractive } from '../../../dev/logger';\nimport { stablePort, detectGitBranch } from '../../../dev/utils';\nimport { watchTableFiles } from '../../../dev/table-watcher';\nimport { useDevServer } from './useDevServer';\nimport type { AppConfig, DevSession, WebInterfaceConfig, SyncSchemaResponse } from '../../../dev/types';\n\nfunction runNpmInstall(cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn('npm', ['install'], {\n cwd,\n shell: true,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n let stderr = '';\n proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`npm install failed in ${cwd}: ${stderr.slice(-200)}`));\n });\n proc.on('error', reject);\n });\n}\n\nexport type DevPhase =\n | 'detecting'\n | 'needs_port'\n | 'ready'\n | 'starting'\n | 'running'\n | 'error'\n | 'stopped'\n | 'expired';\n\nexport function useDevSession(appConfig: AppConfig) {\n // Init logger once on first render (TUI mode → file-based)\n const logInitRef = useRef(false);\n if (!logInitRef.current) {\n initLoggerInteractive('error');\n logInitRef.current = true;\n }\n\n const [phase, setPhase] = useState<DevPhase>('detecting');\n const [session, setSession] = useState<DevSession | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [devPort, setDevPort] = useState<number | null>(null);\n const [proxyPort, setProxyPort] = useState<number | null>(null);\n const [webConfig, setWebConfig] = useState<WebInterfaceConfig | null>(null);\n const [syncResult, setSyncResult] = useState<SyncSchemaResponse | null>(null);\n const [scenarioResult, setScenarioResult] = useState<{ id: string; name?: string; success: boolean; duration: number; roles: string[]; error?: string } | null>(null);\n const [roleOverride, setRoleOverride] = useState<string[] | null>(null);\n const [installStatus, setInstallStatus] = useState<string | null>(null);\n const [authRefreshUrl, setAuthRefreshUrl] = useState<string | null>(null);\n const runnerRef = useRef<DevRunner | null>(null);\n const proxyRef = useRef<DevProxy | null>(null);\n const tableWatcherCleanupRef = useRef<() => void>(() => {});\n const mountedRef = useRef(true);\n\n const devServer = useDevServer();\n\n const cleanupTableWatchers = useCallback(() => {\n tableWatcherCleanupRef.current();\n tableWatcherCleanupRef.current = () => {};\n }, []);\n\n const setupTableWatchers = useCallback((config: AppConfig) => {\n cleanupTableWatchers();\n tableWatcherCleanupRef.current = watchTableFiles(\n config.tables,\n process.cwd(),\n () => { resyncRef.current?.(); },\n );\n }, [cleanupTableWatchers]);\n\n // Detect web interface config on mount\n useEffect(() => {\n const config = getWebInterfaceConfig(appConfig);\n setWebConfig(config);\n\n if (config?.devPort) {\n setDevPort(config.devPort);\n setPhase('ready');\n } else if (\n !appConfig.interfaces.some(\n (i) => i.type === 'web' && i.enabled !== false,\n )\n ) {\n // No web interface at all — backend-only mode\n setDevPort(null);\n setPhase('ready');\n } else {\n // Web interface exists but no devPort configured\n setPhase('needs_port');\n }\n }, [appConfig]);\n\n // Listen for session expiry and auth refresh\n useEffect(() => {\n const unsubExpired = devRequestEvents.onSessionExpired(() => {\n if (mountedRef.current) {\n setPhase('expired');\n setAuthRefreshUrl(null);\n runnerRef.current = null;\n }\n });\n const unsubImpersonate = devRequestEvents.onImpersonate((event) => {\n if (mountedRef.current) {\n setRoleOverride(event.roles);\n }\n });\n const unsubAuthStart = devRequestEvents.onAuthRefreshStart((url) => {\n if (mountedRef.current) {\n setAuthRefreshUrl(url);\n }\n });\n const unsubAuthSuccess = devRequestEvents.onAuthRefreshSuccess(() => {\n if (mountedRef.current) {\n setAuthRefreshUrl(null);\n }\n });\n const unsubAuthFailed = devRequestEvents.onAuthRefreshFailed(() => {\n if (mountedRef.current) {\n setAuthRefreshUrl(null);\n }\n });\n return () => { unsubExpired(); unsubImpersonate(); unsubAuthStart(); unsubAuthSuccess(); unsubAuthFailed(); };\n }, []);\n\n // Watch mindstudio.json for changes — restart session on edit\n useEffect(() => {\n const cleanup = watchConfigFile(process.cwd(), async () => {\n if (!mountedRef.current || phase !== 'running') return;\n // Stop current session, re-enter ready phase (auto-starts)\n cleanupTableWatchers();\n proxyRef.current?.stop();\n proxyRef.current = null;\n devServer.stop();\n if (runnerRef.current) {\n await runnerRef.current.stop().catch(() => {});\n runnerRef.current = null;\n }\n if (mountedRef.current) {\n setSession(null);\n setProxyPort(null);\n setSyncResult(null);\n setPhase('ready');\n }\n });\n return cleanup;\n }, [phase, devServer]);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cleanupTableWatchers();\n runnerRef.current?.stop().catch(() => {});\n proxyRef.current?.stop();\n devServer.stop();\n };\n }, []);\n\n const start = useCallback(\n async (port?: number) => {\n // Re-read mindstudio.json in case it changed (e.g., restart after edit)\n const currentConfig = detectAppConfig() ?? appConfig;\n const actualPort = port ?? devPort;\n\n if (!currentConfig.appId) {\n setPhase('error');\n return;\n }\n\n if (actualPort !== undefined && actualPort !== null) {\n setDevPort(actualPort);\n }\n\n setPhase('starting');\n setError(null);\n\n try {\n // Install dependencies if needed\n const dirsToInstall = findDirsNeedingInstall(currentConfig);\n for (const dir of dirsToInstall) {\n const dirName = dir.split('/').slice(-2).join('/');\n if (mountedRef.current) {\n setInstallStatus(`Installing dependencies in ${dirName}...`);\n }\n await runNpmInstall(dir);\n }\n if (mountedRef.current) {\n setInstallStatus(null);\n }\n\n // Start local dev server if we have a web interface and a port\n if (actualPort != null) {\n const webProjectDir = getWebProjectDir(currentConfig);\n if (webProjectDir) {\n const devCommand = webConfig?.devCommand ?? 'npm run dev';\n await devServer.start({\n command: devCommand,\n cwd: webProjectDir,\n port: actualPort,\n });\n }\n }\n\n // Start the platform session\n const branch = detectGitBranch();\n const proxyUrl = actualPort != null\n ? `http://localhost:${stablePort(currentConfig.appId!)}`\n : undefined;\n const runner = new DevRunner(\n currentConfig.appId,\n process.cwd(),\n {\n branch,\n proxyUrl,\n methods: currentConfig.methods.map((m) => ({ id: m.id, export: m.export, path: m.path })),\n },\n );\n runnerRef.current = runner;\n const devSession = await runner.start();\n\n // Sync table schema if the app has tables\n if (currentConfig.tables.length > 0) {\n try {\n const tableSources = readTableSources(currentConfig);\n if (tableSources.length > 0) {\n const result = await syncSchema(\n currentConfig.appId,\n devSession.sessionId,\n tableSources,\n );\n devSession.databases = result.databases;\n if (mountedRef.current) {\n setSyncResult(result);\n }\n }\n } catch {\n // Schema sync failure is non-fatal — session still works\n }\n }\n\n // Start the local proxy if we have a frontend port and client context\n if (actualPort != null && devSession.clientContext) {\n const proxy = new DevProxy(actualPort, devSession.clientContext);\n const preferredProxyPort = stablePort(currentConfig.appId!);\n const pPort = await proxy.start(preferredProxyPort);\n proxyRef.current = proxy;\n runner.setProxyUrl(`http://localhost:${pPort}`);\n runner.setProxy(proxy);\n if (mountedRef.current) {\n setProxyPort(pPort);\n }\n }\n\n // Watch table source directories for changes — auto-sync schema\n setupTableWatchers(currentConfig);\n\n if (mountedRef.current) {\n setSession(devSession);\n setPhase('running');\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(\n err instanceof Error ? err.message : 'Failed to start dev session',\n );\n setPhase('error');\n }\n }\n },\n [appConfig, devPort, webConfig, devServer, setupTableWatchers],\n );\n\n const stop = useCallback(async () => {\n cleanupTableWatchers();\n proxyRef.current?.stop();\n proxyRef.current = null;\n devServer.stop();\n if (runnerRef.current) {\n await runnerRef.current.stop().catch(() => {});\n runnerRef.current = null;\n }\n if (mountedRef.current) {\n setSession(null);\n setProxyPort(null);\n setPhase('stopped');\n }\n }, [devServer, cleanupTableWatchers]);\n\n // Ref to latest resync so table watchers don't capture a stale closure\n const resyncRef = useRef<() => Promise<void>>();\n\n const resync = useCallback(async () => {\n if (!session) return;\n const freshConfig = detectAppConfig() ?? appConfig;\n if (!freshConfig.appId) return;\n try {\n const tableSources = readTableSources(freshConfig);\n if (tableSources.length === 0) return;\n const result = await syncSchema(\n freshConfig.appId,\n session.sessionId,\n tableSources,\n );\n if (mountedRef.current) {\n setSyncResult(result);\n setSession((prev) =>\n prev ? { ...prev, databases: result.databases } : prev,\n );\n }\n } catch (err) {\n if (mountedRef.current) {\n setSyncResult({\n created: [],\n altered: [],\n errors: [err instanceof Error ? err.message : 'Sync failed'],\n databases: session.databases,\n });\n }\n }\n }, [appConfig, session]);\n resyncRef.current = resync;\n\n const setImpersonation = useCallback(async (roles: string[]) => {\n if (!runnerRef.current) return;\n await runnerRef.current.setImpersonation(roles);\n }, []);\n\n const clearImpersonation = useCallback(async () => {\n if (!runnerRef.current) return;\n await runnerRef.current.clearImpersonation();\n }, []);\n\n const runScenario = useCallback(async (scenarioId: string) => {\n if (!runnerRef.current) return;\n const freshConfig = detectAppConfig() ?? appConfig;\n const scenario = freshConfig.scenarios.find((s) => s.id === scenarioId);\n if (!scenario) return;\n\n const result = await runnerRef.current.runScenario(scenario);\n if (mountedRef.current) {\n setSession((prev) =>\n prev ? { ...prev, databases: result.databases } : prev,\n );\n setScenarioResult({\n id: scenario.id,\n name: scenario.name,\n success: result.success,\n duration: 0, // filled by event listener if needed\n roles: scenario.roles,\n error: result.error,\n });\n }\n }, [appConfig]);\n\n const submitPort = useCallback(\n (port: number) => {\n setDevPort(port);\n setPhase('ready');\n },\n [],\n );\n\n const skipFrontend = useCallback(() => {\n setDevPort(null);\n setPhase('ready');\n }, []);\n\n return {\n phase,\n session,\n error,\n devPort,\n proxyPort,\n webConfig,\n devServer,\n syncResult,\n scenarioResult,\n roleOverride,\n installStatus,\n authRefreshUrl,\n start,\n stop,\n resync,\n runScenario,\n setImpersonation,\n clearImpersonation,\n submitPort,\n skipFrontend,\n };\n}\n","// Hook that manages the local dev server subprocess.\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { spawn, type ChildProcess } from 'node:child_process';\n\nconst MAX_OUTPUT_LINES = 200;\nconst PORT_READY_TIMEOUT_MS = 30_000;\nconst PORT_CHECK_INTERVAL_MS = 500;\n\nexport type DevServerPhase =\n | 'idle'\n | 'starting'\n | 'running'\n | 'error';\n\nexport function useDevServer() {\n const [phase, setPhase] = useState<DevServerPhase>('idle');\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n const processRef = useRef<ChildProcess | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n killProcess();\n };\n }, []);\n\n const appendOutput = useCallback((line: string) => {\n if (!mountedRef.current) return;\n setOutputLines((prev) => {\n const next = [...prev, line];\n return next.length > MAX_OUTPUT_LINES\n ? next.slice(next.length - MAX_OUTPUT_LINES)\n : next;\n });\n }, []);\n\n const killProcess = useCallback(() => {\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n const proc = processRef.current;\n setTimeout(() => {\n if (proc && !proc.killed) {\n proc.kill('SIGKILL');\n }\n }, 2000);\n processRef.current = null;\n }\n }, []);\n\n const start = useCallback(\n async (opts: {\n command: string;\n cwd: string;\n port: number;\n }): Promise<void> => {\n setPhase('starting');\n setError(null);\n setOutputLines([]);\n\n appendOutput(`$ ${opts.command}`);\n\n const proc = spawn(opts.command, [], {\n cwd: opts.cwd,\n shell: true,\n env: { ...process.env, FORCE_COLOR: '1' },\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n processRef.current = proc;\n\n const handleData = (data: Buffer) => {\n const lines = data.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n appendOutput(line);\n }\n }\n };\n\n proc.stdout?.on('data', handleData);\n proc.stderr?.on('data', handleData);\n\n proc.on('close', (code) => {\n processRef.current = null;\n if (mountedRef.current && phase !== 'idle') {\n if (code !== 0 && code !== null) {\n setError(`Dev server exited with code ${code}`);\n setPhase('error');\n } else {\n setPhase('idle');\n }\n }\n });\n\n proc.on('error', (err) => {\n processRef.current = null;\n if (mountedRef.current) {\n setError(err.message);\n setPhase('error');\n }\n });\n\n // Wait for port to become available\n await waitForPort(opts.port, PORT_READY_TIMEOUT_MS);\n\n if (mountedRef.current && processRef.current) {\n setPhase('running');\n }\n },\n [appendOutput],\n );\n\n const stop = useCallback(() => {\n killProcess();\n if (mountedRef.current) {\n setPhase('idle');\n }\n }, [killProcess]);\n\n return {\n phase,\n outputLines,\n error,\n start,\n stop,\n };\n}\n\nasync function waitForPort(port: number, timeoutMs: number): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const response = await fetch(`http://localhost:${port}/`, {\n signal: AbortSignal.timeout(1000),\n });\n // Any response means the server is up\n return;\n } catch {\n // Not ready yet\n }\n await new Promise((resolve) => setTimeout(resolve, PORT_CHECK_INTERVAL_MS));\n }\n // Timeout is not fatal — the server might still be starting but we\n // proceed anyway. The proxy will return errors until it's ready.\n}\n","// Hook for tracking dev request events in the TUI.\n// Follows the same pattern as src/tui/models/hooks/useRequests.ts.\n\nimport { useState, useEffect, useRef } from 'react';\nimport { devRequestEvents } from '../../../dev/events';\nimport type { DevRequestLogEntry } from '../../../dev/types';\n\nconst MAX_HISTORY = 50;\n\nexport function useDevRequests() {\n const requestsRef = useRef<Map<string, DevRequestLogEntry>>(new Map());\n const [requests, setRequests] = useState<DevRequestLogEntry[]>([]);\n\n useEffect(() => {\n const unsubStart = devRequestEvents.onStart((event) => {\n const entry: DevRequestLogEntry = {\n id: event.id,\n type: event.type,\n method: event.method,\n status: 'processing',\n startTime: event.timestamp,\n };\n\n requestsRef.current.set(event.id, entry);\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n });\n\n const unsubComplete = devRequestEvents.onComplete((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing) {\n existing.status = event.success ? 'completed' : 'failed';\n existing.endTime = existing.startTime + event.duration;\n existing.duration = event.duration;\n existing.error = event.error;\n\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n }\n });\n\n return () => {\n unsubStart();\n unsubComplete();\n };\n }, []);\n\n // Periodic re-render to update elapsed time for active requests\n useEffect(() => {\n const hasActive = requests.some((r) => r.status === 'processing');\n if (!hasActive) return;\n\n const interval = setInterval(() => {\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n }, 1000);\n\n return () => clearInterval(interval);\n }, [requests]);\n\n const activeCount = requests.filter(\n (r) => r.status === 'processing',\n ).length;\n\n return { requests, activeCount };\n}\n","declare const __APP_VERSION__: string;\n\nconst CDN_BASE_URL = 'https://f.mscdn.ai/local-model-tunnel';\n\nexport type InstallMethod = 'binary' | 'npm';\n\nexport function getInstallMethod(): InstallMethod {\n // Bun-compiled binaries embed the runtime — there's no node_modules or global npm prefix\n // Check if we're running from a standalone binary (not inside a node_modules tree)\n const execPath = process.execPath;\n if (\n !execPath.includes('node_modules') &&\n !execPath.includes('node') &&\n !execPath.includes('bun')\n ) {\n return 'binary';\n }\n return 'npm';\n}\n\nexport function getCurrentVersion(): string {\n return __APP_VERSION__;\n}\n\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(\n 'https://registry.npmjs.org/@mindstudio-ai/local-model-tunnel/latest',\n { signal: AbortSignal.timeout(5000) },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const c = currentParts[i] ?? 0;\n const l = latestParts[i] ?? 0;\n if (l > c) return true;\n if (l < c) return false;\n }\n return false;\n}\n\nexport function getBinaryDownloadUrl(): string {\n const platformMap: Record<string, string> = {\n darwin: 'darwin',\n linux: 'linux',\n win32: 'windows',\n };\n const platform = platformMap[process.platform] ?? 'linux';\n const arch = process.arch === 'arm64' ? 'arm64' : 'x64';\n const ext = process.platform === 'win32' ? '.exe' : '';\n return `${CDN_BASE_URL}/latest/mindstudio-local-${platform}-${arch}${ext}`;\n}\n\nexport async function checkForUpdate(): Promise<{\n currentVersion: string;\n latestVersion: string;\n} | null> {\n const currentVersion = getCurrentVersion();\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion) return null;\n if (!isNewerVersion(currentVersion, latestVersion)) return null;\n return { currentVersion, latestVersion };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport chalk from 'chalk';\nimport { LogoString } from './Header';\n\nconst SHIMMER_SPEED = 35;\n\nfunction useShimmerLogo(): string {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n const cycleLength = totalChars + 40;\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % cycleLength);\n }, SHIMMER_SPEED);\n return () => clearInterval(interval);\n }, [cycleLength]);\n\n return useMemo(() => {\n const sweepPos = frame;\n const holdEnd = totalChars + 20;\n\n let charIdx = 0;\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n let brightness: number;\n if (sweepPos <= totalChars) {\n const lag = charIdx;\n const t = sweepPos - lag;\n brightness = t <= 0 ? 0.1 : Math.min(1, t / 8);\n } else if (sweepPos <= holdEnd) {\n brightness = 1;\n } else {\n const fadeProgress = (sweepPos - holdEnd) / (cycleLength - holdEnd);\n brightness = Math.max(0.1, 1 - fadeProgress);\n }\n\n if (brightness >= 0.9) {\n result += chalk.cyanBright.bold(ch);\n } else if (brightness >= 0.6) {\n result += chalk.cyan(ch);\n } else if (brightness >= 0.3) {\n result += chalk.rgb(0, 100, 120)(ch);\n } else {\n result += chalk.rgb(0, 50, 60)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [frame, lines, totalChars, cycleLength]);\n}\n\ninterface UpdatePromptProps {\n currentVersion: string;\n latestVersion: string;\n onChoice: (shouldUpdate: boolean) => void;\n}\n\nexport function UpdatePrompt({\n currentVersion,\n latestVersion,\n onChoice,\n}: UpdatePromptProps) {\n const { stdout } = useStdout();\n const shimmerLogo = useShimmerLogo();\n\n useInput(() => {\n onChoice(true);\n });\n\n const termHeight = (stdout?.rows ?? 24) - 4;\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box flexGrow={1} />\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>{shimmerLogo}</Text>\n\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"gray\">\n Update required {'\\u2022'} v{currentVersion} {'\\u2192'} v\n {latestVersion}\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to update\n </Text>\n </Box>\n </Box>\n </Box>\n\n <Box flexGrow={1} />\n </Box>\n );\n}\n"],"mappings":"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","names":["execSync","useEffect","useCallback","useState","useRef","Box","useStdout","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useEffect","useCallback","useState","useEffect","useCallback","useState","useCallback","useEffect","useMemo","Box","Text","useStdout","Spinner","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","useStdout","jsx","jsxs","jsx","jsxs","useStdout","useMemo","Box","Text","Spinner","useState","useMemo","useEffect","Box","Text","useInput","useStdout","Spinner","useMemo","Text","useStdout","chalk","jsx","Fragment","jsx","jsxs","useState","useStdout","useMemo","useInput","Box","Text","useEffect","Spinner","useState","useMemo","useEffect","useRef","Box","Text","useInput","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useState","useEffect","Box","Text","useInput","os","Fragment","jsx","jsxs","useState","useMemo","useRef","useEffect","Box","Text","useInput","useStdout","os","open","Spinner","jsx","jsxs","jsx","jsxs","useInput","Box","Text","useState","useEffect","useMemo","useRef","useEffect","useCallback","useState","useMemo","Box","Text","useInput","Spinner","chalk","useState","useCallback","useRef","useEffect","open","useState","useRef","useEffect","useCallback","open","Fragment","jsx","jsxs","useState","useMemo","useEffect","chalk","useCallback","useInput","Box","Text","Spinner","useState","useEffect","useMemo","Box","Text","useInput","Spinner","Box","Text","Spinner","jsx","jsxs","useState","Box","Text","jsx","jsxs","Box","Text","useStdout","jsx","jsxs","useState","useEffect","useRef","useCallback","spawn","useState","useCallback","useRef","useEffect","spawn","MAX_OUTPUT_LINES","spawn","useRef","useState","useCallback","useEffect","useState","useEffect","useRef","useRef","useState","useEffect","jsx","jsxs","useState","useMemo","useInput","useEffect","Box","Text","Spinner","Fragment","jsx","jsxs","useStdout","useState","useRef","useEffect","useCallback","Box","useState","useEffect","useMemo","Box","Text","useInput","useStdout","chalk","jsx","jsxs","SHIMMER_SPEED","useShimmerLogo","useState","useMemo","useEffect","chalk","useStdout","useInput","Box","Text","jsx","execSync"]}
1
+ {"version":3,"sources":["../src/tui/index.tsx","../src/tui/App.tsx","../src/tui/components/Header.tsx","../src/tui/hooks/useConnection.ts","../src/tui/interfaces/hooks/useEditorSessions.ts","../src/tui/models/hooks/useSetupProviders.ts","../src/tui/models/hooks/useModels.ts","../src/tui/models/hooks/useRequests.ts","../src/tui/models/hooks/useRegisteredModels.ts","../src/tui/models/pages/DashboardPage.tsx","../src/tui/models/components/RequestLog.tsx","../src/tui/components/NavigationMenu.tsx","../src/tui/models/pages/SetupPage.tsx","../src/tui/components/MarkdownText.tsx","../src/tui/interfaces/pages/InterfacesPage.tsx","../src/tui/interfaces/hooks/useLocalInterface.ts","../src/tui/interfaces/pages/InterfaceSessionView.tsx","../src/tui/interfaces/pages/InterfaceRunningView.tsx","../src/tui/pages/OnboardingPage.tsx","../src/tui/hooks/useAuth.ts","../src/tui/dev/pages/DevPage.tsx","../src/tui/dev/components/DevRequestLog.tsx","../src/tui/dev/components/DevPortPrompt.tsx","../src/tui/dev/components/TabBar.tsx","../src/tui/dev/hooks/useDevSession.ts","../src/tui/dev/hooks/useDevServer.ts","../src/tui/dev/hooks/useDevRequests.ts","../src/update.ts","../src/tui/components/UpdatePrompt.tsx"],"sourcesContent":["import React from 'react';\nimport { render } from 'ink';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { createWriteStream, renameSync, unlinkSync, existsSync } from 'node:fs';\nimport { get as httpsGet } from 'node:https';\nimport { get as httpGet } from 'node:http';\nimport { App } from './App';\nimport { TunnelRunner } from '../runner';\nimport { detectAppConfig } from '../dev/app-config';\nimport { checkForUpdate, getInstallMethod, getBinaryDownloadUrl } from '../update';\nimport { UpdatePrompt } from './components/UpdatePrompt';\n\nasync function promptForUpdate(\n currentVersion: string,\n latestVersion: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const { unmount } = render(\n <UpdatePrompt\n currentVersion={currentVersion}\n latestVersion={latestVersion}\n onChoice={(shouldUpdate) => {\n unmount();\n resolve(shouldUpdate);\n }}\n />,\n { exitOnCtrlC: true },\n );\n });\n}\n\nfunction downloadFile(url: string, dest: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const get = url.startsWith('https') ? httpsGet : httpGet;\n get(url, (res) => {\n // Follow redirects\n if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {\n downloadFile(res.headers.location, dest).then(resolve, reject);\n return;\n }\n if (!res.statusCode || res.statusCode >= 400) {\n reject(new Error(`Download failed: HTTP ${res.statusCode}`));\n return;\n }\n const file = createWriteStream(dest);\n res.pipe(file);\n file.on('finish', () => file.close(() => resolve()));\n file.on('error', reject);\n }).on('error', reject);\n });\n}\n\nexport async function startTUI(): Promise<void> {\n // Clean up leftover .old binary from a previous Windows update\n if (process.platform === 'win32') {\n try { unlinkSync(process.execPath + '.old'); } catch {}\n }\n\n // Clear the screen\n console.clear();\n\n // Check for updates before launching the main app\n const update = await checkForUpdate();\n if (update) {\n const shouldUpdate = await promptForUpdate(\n update.currentVersion,\n update.latestVersion,\n );\n if (shouldUpdate) {\n console.log('\\nUpdating to v' + update.latestVersion + '...\\n');\n try {\n if (getInstallMethod() === 'binary') {\n const url = getBinaryDownloadUrl();\n const dest = process.execPath;\n if (process.platform === 'win32') {\n // Windows locks running executables — rename-then-replace trick\n await downloadFile(url, dest + '.new');\n try { unlinkSync(dest + '.old'); } catch {}\n renameSync(dest, dest + '.old');\n renameSync(dest + '.new', dest);\n } else {\n execSync(`curl -fsSL \"${url}\" -o \"${dest}.tmp\" && chmod +x \"${dest}.tmp\" && mv \"${dest}.tmp\" \"${dest}\"`, {\n stdio: 'inherit',\n });\n }\n } else {\n execSync('npm install -g @mindstudio-ai/local-model-tunnel@latest', {\n stdio: 'inherit',\n });\n }\n console.log('\\nRestarting...\\n');\n execFileSync(process.execPath, process.argv.slice(1), {\n stdio: 'inherit',\n });\n } catch {\n console.error('\\nUpdate failed. Continuing with current version.\\n');\n }\n return;\n }\n console.clear();\n }\n\n // Detect v2 app project in CWD\n const appConfig = detectAppConfig(process.cwd());\n\n // Create the runner instance\n const runner = new TunnelRunner();\n\n // Render the TUI with stdin configured for keyboard input\n const { waitUntilExit } = render(\n <App runner={runner} appConfig={appConfig ?? undefined} />,\n { exitOnCtrlC: true },\n );\n\n // Wait for the app to exit\n await waitUntilExit();\n\n // Ensure clean shutdown\n runner.stop();\n}\n","import React, { useEffect, useCallback, useState, useRef } from 'react';\nimport { Box, useApp, useStdout } from 'ink';\nimport { Header } from './components/Header';\nimport { NavigationMenu } from './components/NavigationMenu';\nimport type { MenuItem } from './components/NavigationMenu';\nimport { useConnection } from './hooks/useConnection';\nimport { useEditorSessions } from './interfaces/hooks/useEditorSessions';\nimport { useSetupProviders } from './models/hooks/useSetupProviders';\nimport { useModels } from './models/hooks/useModels';\nimport { useRequests } from './models/hooks/useRequests';\nimport { useSyncedModels } from './models/hooks/useRegisteredModels';\nimport { DashboardPage } from './models/pages/DashboardPage';\nimport { SetupPage } from './models/pages/SetupPage';\nimport { InterfacesPage } from './interfaces/pages/InterfacesPage';\nimport { OnboardingPage } from './pages/OnboardingPage';\nimport { DevPage } from './dev/pages/DevPage';\nimport { TunnelRunner } from '../runner';\nimport { syncModels, type ModelTypeMindStudio } from '../api';\nimport { getApiKey, getUserId, getConfigPath } from '../config';\nimport type { AppConfig } from '../dev/types';\nimport type { Page } from './types';\n\nconst MODEL_TYPE_MAP: Record<string, ModelTypeMindStudio> = {\n text: 'llm_chat',\n image: 'image_generation',\n video: 'video_generation',\n};\n\ninterface AppProps {\n runner: TunnelRunner;\n appConfig?: AppConfig;\n}\n\nexport function App({ runner, appConfig }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const {\n status: connectionStatus,\n environment,\n error: connectionError,\n retry: retryConnection,\n } = useConnection();\n const editorSessions = useEditorSessions();\n const {\n providers,\n loading: providersLoading,\n refresh: refreshProviders,\n } = useSetupProviders();\n const {\n models,\n warnings: modelWarnings,\n loading: modelsLoading,\n refresh: refreshModels,\n } = useModels();\n const { requests, activeCount: activeRequestCount } = useRequests();\n const {\n syncedNames,\n syncedModels,\n refresh: refreshSynced,\n } = useSyncedModels(connectionStatus);\n const shouldOnboard = getApiKey() === undefined || getUserId() === undefined;\n const [page, setPage] = useState<Page>(\n shouldOnboard ? 'onboarding' : appConfig ? 'dev' : 'dashboard',\n );\n const [syncStatus, setSyncStatus] = useState<'idle' | 'syncing' | 'synced'>(\n 'idle',\n );\n const syncTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const lastSyncPayloadRef = useRef<string>('');\n\n // Redirect to onboarding when not authenticated\n useEffect(() => {\n if (connectionStatus === 'not_authenticated') {\n setPage('onboarding');\n }\n }, [connectionStatus]);\n\n // Refresh everything when returning to dashboard\n useEffect(() => {\n if (page === 'dashboard') {\n refreshAll();\n }\n }, [page]);\n\n // Start runner when connected with synced models\n useEffect(() => {\n if (connectionStatus === 'connected' && syncedModels.length > 0) {\n runner.start(syncedModels);\n }\n }, [connectionStatus, syncedModels, runner]);\n\n // Stop only on unmount\n useEffect(() => () => runner.stop(), [runner]);\n\n // Refresh everything: re-detect providers/models, sync to cloud, update synced state\n const refreshAll = useCallback(\n async (silent = false) => {\n if (!silent) setSyncStatus('syncing');\n\n const [discoveredModels] = await Promise.all([\n refreshModels(),\n refreshProviders(),\n ]);\n\n // Sync discovered models to cloud if anything changed\n const modelsToSync = discoveredModels\n .filter((m) => !m.statusHint)\n .map((m) => ({\n name: m.name,\n provider: m.provider,\n type: MODEL_TYPE_MAP[m.capability] || 'llm_chat',\n parameters: m.parameters,\n }));\n\n const payload = JSON.stringify(modelsToSync);\n if (payload !== lastSyncPayloadRef.current && modelsToSync.length > 0) {\n try {\n await syncModels(modelsToSync);\n lastSyncPayloadRef.current = payload;\n } catch {\n // Sync failure is non-critical\n }\n }\n\n await refreshSynced();\n\n if (!silent) {\n setSyncStatus('synced');\n clearTimeout(syncTimerRef.current);\n syncTimerRef.current = setTimeout(() => setSyncStatus('idle'), 1500);\n }\n },\n [refreshProviders, refreshModels, refreshSynced],\n );\n\n // Auto-sync every 3s while connected on dashboard\n useEffect(() => {\n if (connectionStatus !== 'connected' || page !== 'dashboard') return;\n const interval = setInterval(() => refreshAll(true), 1500);\n return () => clearInterval(interval);\n }, [connectionStatus, page, refreshAll]);\n\n const handleQuit = useCallback(() => {\n runner.stop();\n exit();\n }, [runner, exit]);\n\n const handleOnboardingComplete = useCallback(() => {\n retryConnection();\n refreshAll();\n setPage('dashboard');\n }, [retryConnection, refreshAll]);\n\n const handleNavigate = useCallback(\n (id: string) => {\n switch (id) {\n case 'interfaces':\n setPage('interfaces');\n break;\n case 'auth':\n setPage('onboarding');\n break;\n case 'setup':\n setPage('setup');\n break;\n case 'dev':\n setPage('dev');\n break;\n case 'dashboard':\n setPage('dashboard');\n break;\n case 'refresh':\n refreshAll();\n break;\n case 'quit':\n handleQuit();\n break;\n }\n },\n [refreshAll, handleQuit],\n );\n\n const subpageMenuItems: MenuItem[] = [\n { id: 'back', label: 'Back', description: 'Return to dashboard' },\n ];\n\n const handleSubpageNavigate = useCallback(\n (id: string) => {\n if (id === 'back') {\n setPage('dashboard');\n } else {\n handleNavigate(id);\n }\n },\n [handleNavigate],\n );\n\n const [termSize, setTermSize] = useState({\n rows: stdout?.rows ?? 24,\n columns: stdout?.columns ?? 80,\n });\n\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => {\n stdout.write('\\x1b[2J\\x1b[H');\n setTermSize({ rows: stdout.rows, columns: stdout.columns });\n };\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n const termHeight = termSize.rows - 4;\n const compactHeader = termSize.rows <= 45 || termSize.columns <= 90;\n\n return (\n <Box flexDirection=\"column\" height={termHeight} overflow=\"hidden\">\n {page === 'onboarding' ? (\n <OnboardingPage onComplete={handleOnboardingComplete} />\n ) : (\n <>\n <Header\n connection={connectionStatus}\n environment={environment}\n configPath={getConfigPath()}\n connectionError={connectionError}\n compact={compactHeader}\n hasActiveRequest={activeRequestCount > 0}\n />\n\n {page === 'dashboard' && (\n <DashboardPage\n requests={requests}\n models={models}\n modelWarnings={modelWarnings}\n providers={providers}\n providersLoading={providersLoading}\n syncedNames={syncedNames}\n modelsLoading={modelsLoading}\n syncStatus={syncStatus}\n editorSessions={editorSessions.sessions}\n editorsLoading={editorSessions.loading}\n onNavigate={handleNavigate}\n />\n )}\n {page === 'setup' && (\n <SetupPage onBack={() => setPage('dashboard')} />\n )}\n {page === 'interfaces' && (\n <InterfacesPage\n onBack={() => setPage('dashboard')}\n sessions={editorSessions.sessions}\n refreshStatus={editorSessions.refreshStatus}\n refresh={editorSessions.refresh}\n />\n )}\n {page === 'dev' && appConfig && (\n <DevPage\n appConfig={appConfig}\n onNavigate={handleNavigate}\n termHeight={termHeight}\n />\n )}\n </>\n )}\n </Box>\n );\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport os from 'node:os';\nimport { Box, Text } from 'ink';\nimport chalk from 'chalk';\nimport type { ConnectionStatus } from '../types';\ndeclare const __APP_VERSION__: string;\n\ninterface HeaderProps {\n connection: ConnectionStatus;\n environment: 'prod' | 'local';\n configPath: string;\n connectionError?: string | null;\n compact?: boolean;\n hasActiveRequest?: boolean;\n}\n\nexport const LogoString = ` .=+-. :++.\n *@@@@@+ :%@@@@%:\n .%@@@@@@#..@@@@@@@=\n .*@@@@@@@--@@@@@@@#.**.\n *@@@@@@@.-@@@@@@@@.#@@*\n.#@@@@@@@-.@@@@@@@* #@@@@%.\n=@@@@@@@-.@@@@@@@#.-@@@@@@+\n:@@@@@@: +@@@@@#. .@@@@@@:\n .++: .-*-. .++:`;\n\nfunction useActiveShimmerLogo(active: boolean): string | null {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n useEffect(() => {\n if (!active) return;\n const interval = setInterval(() => {\n setFrame((f) => f + 1);\n }, 25);\n return () => clearInterval(interval);\n }, [active]);\n\n return useMemo(() => {\n if (!active) return null;\n\n const waveLength = 20;\n let charIdx = 0;\n\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n const phase = ((charIdx - frame * 0.5) / waveLength) * Math.PI * 2;\n const brightness = 0.65 + 0.35 * Math.sin(phase);\n\n if (brightness >= 0.85) {\n result += chalk.cyanBright(ch);\n } else if (brightness >= 0.65) {\n result += chalk.cyan(ch);\n } else {\n result += chalk.rgb(0, 140, 160)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [active, frame, lines, totalChars]);\n}\n\nconst getConnectionDisplay = (status: ConnectionStatus) => {\n switch (status) {\n case 'connected':\n return { color: 'green', text: 'Connected to Cloud' };\n case 'connecting':\n return { color: 'yellow', text: 'Connecting...' };\n case 'not_authenticated':\n return { color: 'yellow', text: 'Not Authenticated' };\n case 'disconnected':\n return { color: 'red', text: 'Disconnected' };\n default:\n return { color: 'red', text: 'Error' };\n }\n};\n\nexport function Header({\n connection,\n environment,\n configPath,\n connectionError,\n compact,\n hasActiveRequest,\n}: HeaderProps) {\n const { color: connectionColor, text: connectionText } =\n getConnectionDisplay(connection);\n const shimmerLogo = useActiveShimmerLogo(!compact && !!hasActiveRequest);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n paddingY={1}\n width=\"100%\"\n >\n {!compact && (\n <Box paddingLeft={3}>\n {shimmerLogo ? (\n <Text>{shimmerLogo}</Text>\n ) : (\n <Text color=\"cyan\">{LogoString}</Text>\n )}\n </Box>\n )}\n <Box flexDirection=\"column\" marginLeft={compact ? 0 : 4}>\n <Box>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n {compact && <Text color=\"gray\"> v{__APP_VERSION__}</Text>}\n {environment !== 'prod' && (\n <>\n <Text> </Text>\n <Text color=\"yellow\" bold>\n [LOCAL]\n </Text>\n </>\n )}\n </Box>\n <Text color={connectionColor}>● {connectionText}</Text>\n {connectionError && <Text color=\"red\">{connectionError}</Text>}\n <Text color=\"gray\">\n Config: {configPath.replace(os.homedir(), '~')}\n </Text>\n {!compact && <Text color=\"gray\">v{__APP_VERSION__}</Text>}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { verifyApiKey } from '../../api';\nimport { getApiKey, getUserId, getEnvironment } from '../../config';\nimport type { ConnectionStatus } from '../types';\n\ninterface UseConnectionResult {\n status: ConnectionStatus;\n environment: 'prod' | 'local';\n error: string | null;\n retry: () => void;\n}\n\nexport function useConnection(): UseConnectionResult {\n const [status, setStatus] = useState<ConnectionStatus>('connecting');\n const [error, setError] = useState<string | null>(null);\n const environment = getEnvironment();\n\n const connect = useCallback(async () => {\n setStatus('connecting');\n setError(null);\n\n const apiKey = getApiKey();\n const userId = getUserId();\n if (!apiKey || !userId) {\n setStatus('not_authenticated');\n return;\n }\n\n try {\n const isValid = await verifyApiKey();\n if (isValid) {\n setStatus('connected');\n } else {\n setStatus('not_authenticated');\n }\n } catch (err) {\n setStatus('error');\n setError(err instanceof Error ? err.message : 'Connection failed');\n }\n }, []);\n\n useEffect(() => {\n connect();\n }, [connect]);\n\n return {\n status,\n environment,\n error,\n retry: connect,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { getEditorSessions, type EditorSession } from '../../../api';\n\nexport type RefreshStatus = 'idle' | 'refreshing' | 'refreshed';\n\ninterface UseEditorSessionsResult {\n sessions: EditorSession[];\n loading: boolean;\n error: string | null;\n refreshStatus: RefreshStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useEditorSessions(): UseEditorSessionsResult {\n const [sessions, setSessions] = useState<EditorSession[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [refreshStatus, setRefreshStatus] = useState<RefreshStatus>('idle');\n const initialLoadDone = useRef(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const pollRef = useRef<ReturnType<typeof setInterval>>();\n\n const refresh = useCallback(async () => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshStatus('refreshing');\n }\n setError(null);\n\n try {\n const data = await getEditorSessions();\n setSessions(data);\n initialLoadDone.current = true;\n setRefreshStatus('refreshed');\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setRefreshStatus('idle'), 1500);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to fetch sessions');\n setRefreshStatus('idle');\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Silent auto-poll every 5 seconds after initial load\n useEffect(() => {\n pollRef.current = setInterval(async () => {\n if (!initialLoadDone.current) return;\n try {\n const data = await getEditorSessions();\n setSessions(data);\n } catch {\n // Silently ignore — data stays stale until next poll or manual refresh\n }\n }, 5000);\n\n return () => clearInterval(pollRef.current);\n }, []);\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current);\n }, []);\n\n return { sessions, loading, error, refreshStatus, refresh };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n detectAllProviderStatuses,\n type Provider,\n type ProviderSetupStatus,\n} from '../../../providers';\n\ninterface ProviderWithStatus {\n provider: Provider;\n status: ProviderSetupStatus;\n}\n\ninterface UseSetupProvidersResult {\n providers: ProviderWithStatus[];\n loading: boolean;\n refreshing: boolean;\n refresh: () => Promise<void>;\n}\n\nexport function useSetupProviders(): UseSetupProvidersResult {\n const [providers, setProviders] = useState<ProviderWithStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const initialLoadDone = useRef(false);\n\n const refresh = useCallback(async () => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshing(true);\n }\n const statuses = await detectAllProviderStatuses();\n setProviders(statuses);\n initialLoadDone.current = true;\n setLoading(false);\n setRefreshing(false);\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { providers, loading, refreshing, refresh };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { discoverAllModelsWithParameters } from '../../../providers';\nimport type { LocalModel } from '../../../providers/types';\n\ninterface UseModelsResult {\n models: LocalModel[];\n warnings: LocalModel[];\n loading: boolean;\n refreshing: boolean;\n refresh: () => Promise<LocalModel[]>;\n}\n\nexport function useModels(): UseModelsResult {\n const [models, setModels] = useState<LocalModel[]>([]);\n const [warnings, setWarnings] = useState<LocalModel[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const initialLoadDone = useRef(false);\n\n const refresh = useCallback(async (): Promise<LocalModel[]> => {\n if (!initialLoadDone.current) {\n setLoading(true);\n } else {\n setRefreshing(true);\n }\n try {\n const discoveredModels = await discoverAllModelsWithParameters();\n setModels(discoveredModels.filter((m) => !m.statusHint));\n setWarnings(discoveredModels.filter((m) => !!m.statusHint));\n initialLoadDone.current = true;\n return discoveredModels;\n } catch {\n // Keep existing state on error\n return [];\n } finally {\n setLoading(false);\n setRefreshing(false);\n }\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n models,\n warnings,\n loading,\n refreshing,\n refresh,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { requestEvents } from '../../../events';\nimport type { RequestLogEntry } from '../../types';\n\ninterface UseRequestsResult {\n requests: RequestLogEntry[];\n activeCount: number;\n clear: () => void;\n}\n\nexport function useRequests(maxHistory: number = 50): UseRequestsResult {\n const [requests, setRequests] = useState<RequestLogEntry[]>([]);\n const requestsRef = useRef<Map<string, RequestLogEntry>>(new Map());\n\n // Update timer for active request durations\n useEffect(() => {\n const interval = setInterval(() => {\n // Force re-render for active requests to update elapsed time\n setRequests((prev) => {\n const hasActive = prev.some((r) => r.status === 'processing');\n return hasActive ? [...prev] : prev;\n });\n }, 1000);\n\n return () => clearInterval(interval);\n }, []);\n\n useEffect(() => {\n const unsubStart = requestEvents.onStart((event) => {\n const entry: RequestLogEntry = {\n id: event.id,\n modelId: event.modelId,\n requestType: event.requestType,\n status: 'processing',\n startTime: event.timestamp,\n };\n\n requestsRef.current.set(event.id, entry);\n setRequests((prev) => [...prev, entry].slice(-maxHistory));\n });\n\n const unsubProgress = requestEvents.onProgress((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing && existing.status === 'processing') {\n const updated: RequestLogEntry = {\n ...existing,\n ...(event.content !== undefined && { content: event.content }),\n ...(event.step !== undefined && { step: event.step }),\n ...(event.totalSteps !== undefined && {\n totalSteps: event.totalSteps,\n }),\n };\n requestsRef.current.set(event.id, updated);\n setRequests((prev) =>\n prev.map((r) => (r.id === event.id ? updated : r)),\n );\n }\n });\n\n const unsubComplete = requestEvents.onComplete((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing) {\n const updated: RequestLogEntry = {\n ...existing,\n status: event.success ? 'completed' : 'failed',\n endTime: Date.now(),\n duration: event.duration,\n result: event.result,\n error: event.error,\n };\n\n requestsRef.current.set(event.id, updated);\n setRequests((prev) =>\n prev.map((r) => (r.id === event.id ? updated : r)),\n );\n }\n });\n\n return () => {\n unsubStart();\n unsubProgress();\n unsubComplete();\n };\n }, [maxHistory]);\n\n const activeCount = requests.filter((r) => r.status === 'processing').length;\n\n const clear = useCallback(() => {\n requestsRef.current.clear();\n setRequests([]);\n }, []);\n\n return {\n requests,\n activeCount,\n clear,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { getSyncedModels, type SyncedModel } from '../../../api';\nimport type { ConnectionStatus } from '../../types';\n\ninterface UseSyncedModelsResult {\n syncedNames: Set<string>;\n syncedModels: SyncedModel[];\n refresh: () => Promise<void>;\n}\n\nexport function useSyncedModels(\n connectionStatus: ConnectionStatus,\n): UseSyncedModelsResult {\n const [syncedNames, setSyncedNames] = useState<Set<string>>(new Set());\n const [syncedModels, setSyncedModels] = useState<SyncedModel[]>([]);\n\n const refresh = useCallback(async () => {\n if (connectionStatus !== 'connected') {\n setSyncedNames(new Set());\n setSyncedModels([]);\n return;\n }\n\n try {\n const models = await getSyncedModels();\n setSyncedNames(new Set(models.map((m) => m.name)));\n setSyncedModels(models);\n } catch {\n // Keep existing state on error\n }\n }, [connectionStatus]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n syncedNames,\n syncedModels,\n refresh,\n };\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { RequestLog } from '../components/RequestLog';\nimport { NavigationMenu } from '../../components/NavigationMenu';\nimport type { MenuItem } from '../../components/NavigationMenu';\nimport type { EditorSession } from '../../../api';\nimport type {\n LocalModel,\n Provider,\n ProviderSetupStatus,\n ComfyWorkflowParameterSchema,\n} from '../../../providers/types';\nimport type { RequestLogEntry } from '../../types';\n\nfunction getWorkflowCount(model: LocalModel): number | null {\n const param = model.parameters?.find((p) => p.type === 'comfyWorkflow');\n if (!param) return null;\n return (param as ComfyWorkflowParameterSchema).comfyWorkflowOptions\n .availableWorkflows.length;\n}\n\nfunction getCapabilityLabel(capability: string): {\n label: string;\n color: string;\n} {\n switch (capability) {\n case 'text':\n return { label: 'Text Generation', color: 'gray' };\n case 'image':\n return { label: 'Image Generation', color: 'gray' };\n case 'video':\n return { label: 'Video Generation', color: 'gray' };\n default:\n return { label: capability, color: 'gray' };\n }\n}\n\ninterface ProviderWithStatus {\n provider: Provider;\n status: ProviderSetupStatus;\n}\n\ninterface DashboardPageProps {\n requests: RequestLogEntry[];\n models: LocalModel[];\n modelWarnings?: LocalModel[];\n providers: ProviderWithStatus[];\n providersLoading?: boolean;\n syncedNames: Set<string>;\n modelsLoading?: boolean;\n syncStatus?: 'idle' | 'syncing' | 'synced';\n editorSessions: EditorSession[];\n editorsLoading: boolean;\n onNavigate: (id: string) => void;\n}\n\nexport function DashboardPage({\n requests,\n models,\n modelWarnings = [],\n providers,\n providersLoading,\n syncedNames,\n modelsLoading,\n syncStatus = 'idle',\n editorSessions,\n editorsLoading,\n onNavigate,\n}: DashboardPageProps) {\n const { stdout } = useStdout();\n\n const installedProviders = providers.filter(({ status }) => status.installed);\n\n const provNameWidth = Math.max(\n ...installedProviders.map((p) => p.provider.displayName.length),\n 8,\n );\n const provStatusWidth = 'Local Server Running'.length;\n\n const allModelNames = new Set(models.map((m) => m.name));\n const unavailableSynced = [...syncedNames].filter(\n (name) => !allModelNames.has(name),\n );\n\n const syncDescription =\n syncStatus === 'syncing'\n ? 'Syncing...'\n : syncStatus === 'synced'\n ? '\\u2713 Synced'\n : 'Re-detect providers and sync models to MindStudio';\n\n const menuItems = useMemo((): MenuItem[] => {\n return [\n {\n id: 'interfaces',\n label: 'Connect to Agent',\n description:\n 'Connect your local editor to a MindStudio interface or script',\n },\n {\n id: 'refresh',\n label: 'Sync Models',\n description: syncDescription,\n },\n {\n id: 'setup',\n label: 'Manage Providers',\n description: 'Manage local AI providers',\n },\n {\n id: 'auth',\n label: 'Re-authenticate',\n description: 'Re-authenticate with MindStudio',\n },\n {\n id: 'quit',\n label: 'Exit',\n description: 'Quit the application',\n },\n ];\n }, [syncDescription]);\n\n // Compute maxVisible for request log based on terminal height\n const termHeight = (stdout?.rows ?? 24) - 4; // matches App's height calculation\n const compactHeader =\n (stdout?.rows ?? 24) <= 45 || (stdout?.columns ?? 80) <= 90;\n\n // Header: compact (no logo, version on title line) = border(2) + padding(2) + 3 text lines = 7, full = border(2) + padding(2) + logo(~10 lines) = 14\n const headerLines = compactHeader ? 7 : 14;\n\n // Providers section: marginTop(1) + title(1) + content gap(1) + content\n const providerContentLines = providersLoading\n ? 1\n : installedProviders.length === 0\n ? 2\n : installedProviders.length;\n const providersLines = 3 + providerContentLines;\n\n // Open Editors section: marginTop(1) + title(1) + content gap(1) + content\n const editorsContentLines = editorsLoading\n ? 1\n : editorSessions.length === 0\n ? 1\n : editorSessions.length;\n const editorsLines = 3 + editorsContentLines;\n\n // Models section: marginTop(1) + title(1) + content gap(1) + content\n const modelContentLines = modelsLoading\n ? 1\n : models.length === 0 &&\n unavailableSynced.length === 0 &&\n modelWarnings.length === 0\n ? 2\n : models.length +\n modelWarnings.length +\n (unavailableSynced.length > 0 ? 1 + unavailableSynced.length : 0);\n const modelsLines = 3 + modelContentLines;\n\n // Request log overhead: marginTop(1) + title(1) + content gap(1)\n const requestLogOverhead = 3;\n\n // Menu: compact = border-top(1) + items(1) + hint(1) = 3, full = border-top(1) + marginTop(1) + title(1) + items + hint(1) + marginTop(1) + marginBottom(1)\n const compactMenu = termHeight + 4 < 40; // stdout rows < 40\n const menuLines = compactMenu ? 2 : menuItems.length + 6;\n\n const usedLines =\n headerLines +\n providersLines +\n editorsLines +\n modelsLines +\n requestLogOverhead +\n menuLines;\n const maxVisible = Math.max(3, termHeight - usedLines);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {/* Open Editors */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Open Agents\n </Text>\n\n {editorsLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Loading editor sessions...</Text>\n </Box>\n ) : editorSessions.length === 0 ? (\n <Box marginTop={1}>\n <Text color=\"gray\">\n Agents you are editing in the MindStudio IDE will appear here.\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {editorSessions.map((session) => (\n <Box key={session.appId}>\n <Text color=\"white\">{session.appName}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n\n {/* Providers */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n AI Model Providers\n </Text>\n\n {providersLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Detecting providers...</Text>\n </Box>\n ) : installedProviders.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No providers installed.</Text>\n <Text color=\"gray\">\n Use \"Manage Providers\" below to install one.\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {installedProviders.map(({ provider, status }) => {\n const url = provider.baseUrl;\n const statusColor = status.running ? 'green' : 'yellow';\n const statusText = status.running\n ? 'Local Server Running'\n : 'Installed (not running)';\n\n return (\n <Box key={provider.name}>\n <Text color=\"white\">\n {provider.displayName.padEnd(provNameWidth + 2)}\n </Text>\n <Text color={statusColor}>\n {statusText.padEnd(provStatusWidth + 2)}\n </Text>\n {status.running && <Text color=\"gray\">{url}</Text>}\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n\n {/* Models */}\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Local Models\n </Text>\n\n {modelsLoading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Discovering models...</Text>\n </Box>\n ) : models.length === 0 &&\n unavailableSynced.length === 0 &&\n modelWarnings.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No models found.</Text>\n <Text color=\"gray\">\n Download models using your provider (e.g., ollama pull llama3.2)\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {models.map((model) => {\n const cap = getCapabilityLabel(model.capability);\n const isSynced = syncedNames.has(model.name);\n const displayProvider =\n providers.find((p) => p.provider.name === model.provider)\n ?.provider.displayName ?? model.provider;\n const workflowCount = getWorkflowCount(model);\n const workflowSuffix =\n workflowCount !== null\n ? ` (${workflowCount} workflow${workflowCount !== 1 ? 's' : ''}, ${isSynced ? workflowCount : 0} synced)`\n : '';\n return (\n <Box key={`${model.provider}:${model.name}`}>\n <Text color={isSynced ? 'green' : 'gray'}>\n {isSynced ? '\\u25CF' : '\\u25CB'}\n </Text>\n <Text color=\"white\">{` ${model.name}`}</Text>\n {workflowSuffix && <Text color=\"gray\">{workflowSuffix}</Text>}\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"gray\">{displayProvider}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color={cap.color}>{cap.label}</Text>\n </Box>\n );\n })}\n {modelWarnings.map((warning) => {\n const displayProvider =\n providers.find((p) => p.provider.name === warning.provider)\n ?.provider.displayName ?? warning.provider;\n return (\n <Box key={`${warning.provider}:${warning.name}`}>\n <Text color=\"gray\">{'\\u25CB'}</Text>\n <Text color=\"white\">{` ${warning.name}`}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"gray\">{displayProvider}</Text>\n <Text color=\"gray\">{' - '}</Text>\n <Text color=\"yellow\">{warning.statusHint}</Text>\n </Box>\n );\n })}\n\n {unavailableSynced.length > 0 && (\n <Box flexDirection=\"column\" marginTop={models.length > 0 ? 1 : 0}>\n <Text color=\"gray\">Synced but provider not running:</Text>\n {unavailableSynced.map((name) => (\n <Box key={name}>\n <Text color=\"gray\">{'\\u25CB'}</Text>\n <Text color=\"gray\">{` ${name}`}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n )}\n </Box>\n\n {/* Request log */}\n <RequestLog\n requests={requests}\n maxVisible={maxVisible}\n hasModels={models.length > 0}\n />\n\n {/* Bottom: Navigation menu pane */}\n <NavigationMenu items={menuItems} onSelect={onNavigate} />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { RequestLogEntry } from '../../types';\n\ninterface RequestLogProps {\n requests: RequestLogEntry[];\n maxVisible?: number;\n hasModels?: boolean;\n}\n\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction getRequestTypeLabel(type: string): { label: string; color: string } {\n switch (type) {\n case 'llm_chat':\n return { label: 'text', color: 'gray' };\n case 'image_generation':\n return { label: 'image', color: 'gray' };\n case 'video_generation':\n return { label: 'video', color: 'gray' };\n default:\n return { label: type, color: 'gray' };\n }\n}\n\nfunction snippetLine(content: string, maxWidth: number): string {\n // Collapse whitespace/newlines into single spaces\n const flat = content.replace(/\\s+/g, ' ').trim();\n if (flat.length <= maxWidth) return flat;\n return '\\u2026' + flat.slice(-(maxWidth - 1));\n}\n\nfunction RequestItem({\n request,\n width,\n}: {\n request: RequestLogEntry;\n width: number;\n}) {\n const time = formatTime(request.startTime);\n const typeLabel = getRequestTypeLabel(request.requestType);\n // indent for snippet: status(1) + space(1) + padding for alignment\n const snippetIndent = ' ';\n const snippetWidth = width - snippetIndent.length - 2; // 2 for paddingX\n\n if (request.status === 'processing') {\n const elapsed = Date.now() - request.startTime;\n const snippet =\n request.content && request.requestType === 'llm_chat'\n ? snippetLine(request.content, snippetWidth)\n : null;\n const stepProgress =\n request.step !== undefined && request.totalSteps\n ? `Step ${request.step}/${request.totalSteps}`\n : null;\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"gray\"> {formatDuration(elapsed)}...</Text>\n </Box>\n {snippet && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {snippetIndent}\n {snippet}\n </Text>\n )}\n {stepProgress && (\n <Text color=\"gray\">\n {snippetIndent}\n {stepProgress}\n </Text>\n )}\n </Box>\n );\n }\n\n if (request.status === 'completed') {\n const duration = request.duration ? formatDuration(request.duration) : '';\n let resultInfo = '';\n if (request.result?.chars) {\n resultInfo = ` \\u00B7 ${request.result.chars} chars`;\n } else if (request.result?.imageSize) {\n resultInfo = ` \\u00B7 ${Math.round(request.result.imageSize / 1024)}KB`;\n } else if (request.result?.videoSize) {\n resultInfo = ` \\u00B7 ${Math.round(request.result.videoSize / 1024 / 1024)}MB`;\n }\n\n const snippet =\n request.content && request.requestType === 'llm_chat'\n ? snippetLine(request.content, snippetWidth)\n : null;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"green\">{'\\u2713'}</Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"gray\">\n {' '}\n {duration}\n {resultInfo}\n </Text>\n </Box>\n {snippet && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {snippetIndent}\n {snippet}\n </Text>\n )}\n </Box>\n );\n }\n\n // Failed\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"red\">{'\\u25CF'}</Text>\n <Text color=\"gray\"> {time} </Text>\n <Text color=\"white\">{request.modelId}</Text>\n <Text color=\"gray\"> </Text>\n <Text color={typeLabel.color}>{typeLabel.label}</Text>\n <Text color=\"red\"> {request.error || 'Failed'}</Text>\n </Box>\n </Box>\n );\n}\n\nexport function RequestLog({\n requests,\n maxVisible = 8,\n hasModels = true,\n}: RequestLogProps) {\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n\n // Get the most recent requests, with active ones always shown\n const activeRequests = requests.filter((r) => r.status === 'processing');\n const completedRequests = requests.filter((r) => r.status !== 'processing');\n\n // Requests with a snippet or step progress take 2 lines, others take 1\n const itemLines = (r: RequestLogEntry) => {\n if (r.requestType === 'llm_chat' && r.content) return 2;\n if (r.status === 'processing' && r.step !== undefined) return 2;\n return 1;\n };\n\n let completedToShow: RequestLogEntry[] = [];\n let linesUsed = activeRequests.reduce((sum, r) => sum + itemLines(r), 0);\n for (\n let i = completedRequests.length - 1;\n i >= 0 && linesUsed < maxVisible;\n i--\n ) {\n const r = completedRequests[i]!;\n const lines = itemLines(r);\n if (linesUsed + lines <= maxVisible) {\n completedToShow.unshift(r);\n linesUsed += lines;\n } else {\n break;\n }\n }\n\n const visibleRequests = [...completedToShow, ...activeRequests];\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n width=\"100%\"\n paddingX={1}\n marginTop={1}\n >\n <Box>\n <Text bold underline color=\"white\">\n Generation Requests\n </Text>\n {activeRequests.length > 0 && (\n <Text color=\"cyan\"> ({activeRequests.length} active)</Text>\n )}\n </Box>\n\n {requests.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">\n {hasModels\n ? 'Tunnel is live — requests will appear here when models are used in MindStudio'\n : 'Start a model to begin receiving generation requests.'}\n </Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleRequests.map((request) => (\n <RequestItem key={request.id} request={request} width={width} />\n ))}\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description: string;\n disabled?: boolean;\n disabledReason?: string;\n isSeparator?: boolean;\n color?: string;\n}\n\ninterface NavigationMenuProps {\n items: MenuItem[];\n onSelect: (id: string) => void;\n title?: string;\n}\n\nexport function NavigationMenu({\n items,\n onSelect,\n title,\n}: NavigationMenuProps) {\n const { stdout } = useStdout();\n const compact = (stdout?.rows ?? 24) < 40;\n\n const getDefaultIndex = () => {\n const firstIdx = items.findIndex((i) => !i.disabled && !i.isSeparator);\n return firstIdx >= 0 ? firstIdx : 0;\n };\n const [selectedIndex, setSelectedIndex] = useState(getDefaultIndex);\n\n useEffect(() => {\n setSelectedIndex(getDefaultIndex());\n }, [items]);\n\n const selectableItems = items.filter((i) => !i.isSeparator);\n\n const findNextEnabled = (from: number, direction: 1 | -1): number => {\n let idx = from;\n for (let i = 0; i < items.length; i++) {\n idx = (idx + direction + items.length) % items.length;\n if (!items[idx]!.disabled && !items[idx]!.isSeparator) return idx;\n }\n return from;\n };\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n const backItem = items.find((i) => i.id === 'back');\n if (backItem) {\n onSelect('back');\n } else if (input === 'q') {\n onSelect('quit');\n }\n return;\n }\n if (key.upArrow || (compact && key.leftArrow)) {\n setSelectedIndex((prev) => findNextEnabled(prev, -1));\n } else if (key.downArrow || (compact && key.rightArrow)) {\n setSelectedIndex((prev) => findNextEnabled(prev, 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item && !item.disabled) {\n onSelect(item.id);\n }\n }\n });\n\n const hasBack = items.some((i) => i.id === 'back');\n\n if (compact) {\n const selectedItem = items[selectedIndex];\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box height={1} overflow=\"hidden\" gap={1}>\n {items.map((item, index) => {\n if (item.isSeparator) return null;\n const isSelected = index === selectedIndex;\n return (\n <Text\n key={item.id}\n color={item.disabled ? 'gray' : isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {isSelected ? `❯ ${item.label}` : ` ${item.label}`}\n </Text>\n );\n })}\n </Box>\n </Box>\n );\n }\n\n // Fixed height: header + items + hint + margins\n const separatorExtraLines = items.filter(\n (item, idx) => item.isSeparator && idx > 0,\n ).length;\n const menuHeight = items.length + 4 + separatorExtraLines;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n marginBottom={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box marginTop={1}>\n <Text color=\"gray\">{title ?? 'Actions'}</Text>\n </Box>\n <Box flexDirection=\"column\">\n {items.map((item, index) => {\n if (item.isSeparator) {\n return (\n <Box key={item.id} marginTop={index > 0 ? 1 : 0}>\n {item.label ? (\n <Text bold color={item.color ?? 'gray'} wrap=\"truncate-end\">\n {item.label}\n </Text>\n ) : null}\n </Box>\n );\n }\n\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? '❯' : ' ';\n\n if (item.disabled) {\n return (\n <Box key={item.id} height={1} overflow=\"hidden\">\n <Text color=\"gray\" wrap=\"truncate-end\">\n {prefix} {item.label}\n {item.disabledReason ? ` (${item.disabledReason})` : ''}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.id} height={1} overflow=\"hidden\">\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n wrap=\"truncate-end\"\n >\n {prefix} {item.label}\n </Text>\n {isSelected && (\n <Text color=\"gray\" wrap=\"truncate-end\">\n {' '}\n - {item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n {hasBack\n ? 'Up/Down Navigate \\u2022 Enter Select \\u2022 q/Esc Back'\n : 'Up/Down Navigate \\u2022 Enter Select \\u2022 q Quit'}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { renderMarkdown } from '../../components/MarkdownText';\nimport { useSetupProviders } from '../hooks/useSetupProviders';\nimport type { Provider } from '../../../providers/types';\n\ninterface SetupPageProps {\n onBack: () => void;\n}\n\nfunction ProviderDetailView({\n provider,\n onBack,\n}: {\n provider: Provider;\n onBack: () => void;\n}) {\n const [scrollOffset, setScrollOffset] = useState(0);\n const { stdout } = useStdout();\n const termHeight = (stdout?.rows ?? 24) - 4; // matches App's height calc\n const headerHeight = 14; // border(2) + padding(2) + logo(9) + 1\n const footerLines = 6; // border-top(1) + margin(1) + \"Actions\"(1) + \"Back\"(1) + margin(1) + hint(1)\n const contentPadding = 2; // paddingY={1}\n const viewHeight = termHeight - headerHeight - footerLines - contentPadding;\n const contentWidth = (stdout?.columns ?? 80) - 4; // 2 padding + 1 scrollbar + 1 margin\n\n const renderedLines = useMemo(() => {\n const rendered = renderMarkdown(provider.readme, contentWidth);\n return rendered.split('\\n');\n }, [provider.readme, contentWidth]);\n\n const maxScroll = Math.max(0, renderedLines.length - viewHeight);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape || key.return) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollOffset((prev) => Math.min(maxScroll, prev + 1));\n }\n });\n\n const visibleContent = renderedLines\n .slice(scrollOffset, scrollOffset + viewHeight)\n .join('\\n');\n\n const scrollbar = useMemo(() => {\n if (maxScroll === 0) return null;\n const thumbSize = Math.max(\n 1,\n Math.round((viewHeight / renderedLines.length) * viewHeight),\n );\n const thumbPos = Math.round(\n (scrollOffset / maxScroll) * (viewHeight - thumbSize),\n );\n\n return Array.from(\n { length: viewHeight },\n (_, i) => i >= thumbPos && i < thumbPos + thumbSize,\n );\n }, [scrollOffset, maxScroll, viewHeight, renderedLines.length]);\n\n return (\n <Box flexDirection=\"column\">\n <Box height={viewHeight}>\n <Box\n flexDirection=\"column\"\n paddingX={1}\n paddingY={1}\n flexGrow={1}\n overflow=\"hidden\"\n >\n <Text>{visibleContent}</Text>\n </Box>\n {scrollbar && (\n <Box flexDirection=\"column\">\n {scrollbar.map((isThumb, i) => (\n <Text\n key={i}\n color={isThumb ? 'cyan' : 'gray'}\n dimColor={!isThumb}\n >\n {isThumb ? '\\u2503' : '\\u2502'}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n\n <Box\n flexDirection=\"column\"\n paddingX={1}\n borderStyle=\"single\"\n borderTop\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor=\"gray\"\n >\n <Box marginTop={1}>\n <Text color=\"gray\">Actions</Text>\n </Box>\n <Box>\n <Text color=\"cyan\" bold>\n {'\\u276F'} Back\n </Text>\n <Text color=\"gray\"> - Return to providers</Text>\n </Box>\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n Up/Down Scroll {'\\u2022'} Enter/q/Esc Back\n {maxScroll > 0 &&\n ` \\u2022 ${Math.round((scrollOffset / maxScroll) * 100)}%`}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\nexport function SetupPage({ onBack }: SetupPageProps) {\n const { providers, loading } = useSetupProviders();\n const [selectedProvider, setSelectedProvider] = useState<string | null>(null);\n const running = useMemo(\n () => providers.filter((p) => p.status.running),\n [providers],\n );\n const installed = useMemo(\n () => providers.filter((p) => p.status.installed && !p.status.running),\n [providers],\n );\n const notInstalled = useMemo(\n () => providers.filter((p) => !p.status.installed),\n [providers],\n );\n const allProviders = useMemo(\n () => [...running, ...installed, ...notInstalled],\n [running, installed, notInstalled],\n );\n\n const totalItems = allProviders.length + 1; // +1 for Back\n const backIndex = allProviders.length;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [allProviders.length]);\n\n useInput((input, key) => {\n if (selectedProvider) return;\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (allProviders[cursorIndex]) {\n setSelectedProvider(allProviders[cursorIndex]!.provider.name);\n }\n }\n });\n\n if (selectedProvider) {\n const found = providers.find((p) => p.provider.name === selectedProvider);\n if (found) {\n return (\n <ProviderDetailView\n provider={found.provider}\n onBack={() => setSelectedProvider(null)}\n />\n );\n }\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Manage Providers\n </Text>\n <Text color=\"gray\">Select a provider to view its setup guide.</Text>\n\n {loading ? (\n <Box marginTop={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Detecting providers...</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {running.length > 0 && (\n <>\n <Text bold color=\"green\">\n Running\n </Text>\n {running.map(({ provider }, i) => {\n const index = i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {'\\u25CF'}{' '}\n {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </>\n )}\n {installed.length > 0 && (\n <Box\n flexDirection=\"column\"\n marginTop={running.length > 0 ? 1 : 0}\n >\n <Text bold color=\"yellow\">\n Installed\n </Text>\n {installed.map(({ provider, status }, i) => {\n const index = running.length + i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {'\\u25CB'}{' '}\n {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n {notInstalled.length > 0 && (\n <Box\n flexDirection=\"column\"\n marginTop={running.length > 0 || installed.length > 0 ? 1 : 0}\n >\n <Text bold color=\"gray\">\n Not Installed\n </Text>\n {notInstalled.map(({ provider }, i) => {\n const index = running.length + installed.length + i;\n const isSelected = index === cursorIndex;\n return (\n <Box\n key={provider.name}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {provider.displayName}\n </Text>\n </Box>\n <Text color=\"gray\" wrap=\"wrap\">\n {' '}\n {provider.description}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n\n {/* Back option */}\n <Box marginTop={1}>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Text, useStdout } from 'ink';\nimport chalk from 'chalk';\nimport { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\n\nconst codeStyle = chalk.cyan;\nconst identity = (s: string) => s;\n\ninterface MarkdownTextProps {\n content: string;\n width?: number;\n}\n\n/**\n * Render markdown to an ANSI string.\n * Each line is self-contained (no cross-line ANSI escapes).\n */\nexport function renderMarkdown(content: string, width: number): string {\n marked.use(\n markedTerminal({\n width,\n codespan: codeStyle,\n link: identity,\n href: identity,\n }) as any,\n );\n marked.use({\n renderer: {\n code({ text }: { text: string }) {\n const lines = text\n .trim()\n .split('\\n')\n .map((l) => ' ' + codeStyle(l))\n .join('\\n');\n return lines + '\\n\\n';\n },\n link({ href, text }: { href: string; text: string }) {\n if (text && text !== href) {\n return `${text} (${href})`;\n }\n return href;\n },\n },\n });\n return (marked.parse(content) as string).trimEnd();\n}\n\nexport function MarkdownText({ content, width: widthProp }: MarkdownTextProps) {\n const { stdout } = useStdout();\n const width = widthProp ?? (stdout?.columns ?? 80) - 4;\n\n const rendered = useMemo(\n () => renderMarkdown(content, width),\n [content, width],\n );\n\n return <Text wrap=\"wrap\">{rendered}</Text>;\n}\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { RefreshStatus } from '../hooks/useEditorSessions';\nimport { useLocalInterface } from '../hooks/useLocalInterface';\nimport { InterfaceSessionView } from './InterfaceSessionView';\nimport { InterfaceRunningView } from './InterfaceRunningView';\nimport type {\n EditorSession,\n CustomInterfaceStepInfo,\n ScriptStepInfo,\n} from '../../../api';\n\ninterface InterfacesPageProps {\n onBack: () => void;\n sessions: EditorSession[];\n refreshStatus: RefreshStatus;\n refresh: () => Promise<void>;\n}\n\nexport interface InterfaceItem {\n kind: 'interface';\n appId: string;\n appName: string;\n step: CustomInterfaceStepInfo;\n}\n\nexport interface ScriptItem {\n kind: 'script';\n appId: string;\n appName: string;\n step: ScriptStepInfo;\n}\n\ntype ListItem = InterfaceItem | ScriptItem;\n\ntype SessionStatus = 'running' | 'starting' | 'stopped' | 'compiling';\n\nfunction getSessionStatus(item: ListItem): SessionStatus {\n if (item.kind === 'script') return 'running';\n const status = item.step.spaEditorSession?.status;\n if (status === 'running' || status === 'compiling') return status;\n if (status === 'starting') return 'starting';\n return 'stopped';\n}\n\nfunction isItemSelectable(item: ListItem): boolean {\n const status = getSessionStatus(item);\n return status === 'running' || status === 'compiling';\n}\n\nfunction getStatusLabel(status: SessionStatus): {\n text: string;\n color: string;\n} {\n switch (status) {\n case 'running':\n case 'compiling':\n return { text: 'Online', color: 'green' };\n case 'starting':\n return { text: 'Starting', color: 'yellow' };\n case 'stopped':\n return { text: 'Offline', color: 'gray' };\n }\n}\n\nfunction getRefreshSuffix(status: RefreshStatus): string | null {\n switch (status) {\n case 'refreshing':\n return 'Refreshing...';\n case 'refreshed':\n return '\\u2713 Refreshed';\n case 'idle':\n return null;\n }\n}\n\nfunction formatCount(interfaces: number, scripts: number): string {\n const parts: string[] = [];\n if (interfaces > 0) {\n parts.push(`${interfaces} Interface${interfaces !== 1 ? 's' : ''}`);\n }\n if (scripts > 0) {\n parts.push(`${scripts} Script${scripts !== 1 ? 's' : ''}`);\n }\n return parts.join(', ');\n}\n\n// --- Offline view (level 3) ---\n\nfunction OfflineView({ item, onBack }: { item: ListItem; onBack: () => void }) {\n useInput((input, key) => {\n if (input === 'q' || key.escape || key.return) {\n onBack();\n }\n });\n\n const name =\n item.kind === 'interface'\n ? `${item.step.workflowName} - ${item.step.displayName}`\n : `${item.step.workflowName} - ${item.step.displayName}`;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">This interface is offline.</Text>\n <Text color=\"gray\">\n Start the interface designer in MindStudio to connect to it.\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n {'\\u276F'} Back\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">Enter/q/Esc Back</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Agent list (level 1) ---\n\nfunction AgentListView({\n sessions,\n onBack,\n onSelectAgent,\n onRefresh,\n refreshStatus,\n}: {\n sessions: EditorSession[];\n onBack: () => void;\n onSelectAgent: (appId: string) => void;\n onRefresh: () => void;\n refreshStatus: RefreshStatus;\n}) {\n // Items: [sessions..., refresh, back]\n const refreshIndex = sessions.length;\n const backIndex = sessions.length + 1;\n const totalItems = sessions.length + 2;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(sessions.length > 0 ? 0 : backIndex);\n }, [sessions.length, backIndex]);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (cursorIndex === refreshIndex) {\n onRefresh();\n } else if (sessions[cursorIndex]) {\n onSelectAgent(sessions[cursorIndex]!.appId);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Choose an Agent\n </Text>\n <Text color=\"gray\">\n Don't see your agent? Make sure it's open in the MindStudio editor.\n </Text>\n\n {sessions.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"yellow\">No active editor sessions.</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {sessions.map((session, i) => {\n const isSelected = i === cursorIndex;\n const stats = formatCount(\n session.customInterfaceSteps.length,\n session.scriptSteps.length,\n );\n return (\n <Box\n key={session.appId}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Box>\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {session.appName}\n </Text>\n {isSelected && (\n <Text color=\"gray\">{' - Connect to this Agent'}</Text>\n )}\n </Box>\n <Text color=\"gray\">\n {' '}https://app.mindstudio.ai/agents/{session.appId}/edit\n </Text>\n {stats !== '' && (\n <Text color=\"gray\">\n {' '}\n {stats}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text\n color={cursorIndex === refreshIndex ? 'cyan' : 'white'}\n bold={cursorIndex === refreshIndex}\n >\n {cursorIndex === refreshIndex ? '\\u276F' : ' '} Refresh\n </Text>\n {getRefreshSuffix(refreshStatus) && (\n <Text color=\"gray\"> {getRefreshSuffix(refreshStatus)}</Text>\n )}\n </Box>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Agent detail (level 2) ---\n\nfunction AgentDetailView({\n session,\n onBack,\n onSelect,\n onRefresh,\n refreshStatus,\n}: {\n session: EditorSession;\n onBack: () => void;\n onSelect: (item: InterfaceItem | ScriptItem) => void;\n onRefresh: () => void;\n refreshStatus: RefreshStatus;\n}) {\n const [offlineItem, setOfflineItem] = useState<ListItem | null>(null);\n\n // Auto-polling handles background refresh, no need to trigger on mount\n\n const interfaces = useMemo(\n (): InterfaceItem[] =>\n session.customInterfaceSteps.map((step) => ({\n kind: 'interface',\n appId: session.appId,\n appName: session.appName,\n step,\n })),\n [session],\n );\n\n const scripts = useMemo(\n (): ScriptItem[] =>\n session.scriptSteps.map((step) => ({\n kind: 'script',\n appId: session.appId,\n appName: session.appName,\n step,\n })),\n [session],\n );\n\n const allItems = useMemo(\n (): ListItem[] => [...interfaces, ...scripts],\n [interfaces, scripts],\n );\n\n // Items: [allItems..., refresh, back]\n const refreshIndex = allItems.length;\n const backIndex = allItems.length + 1;\n const totalItems = allItems.length + 2;\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [allItems.length]);\n\n useInput((input, key) => {\n if (offlineItem) return;\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(totalItems - 1, prev + 1));\n } else if (key.return) {\n if (cursorIndex === backIndex) {\n onBack();\n } else if (cursorIndex === refreshIndex) {\n onRefresh();\n } else {\n const item = allItems[cursorIndex];\n if (item) {\n if (isItemSelectable(item)) {\n onSelect(item);\n } else {\n setOfflineItem(item);\n }\n }\n }\n }\n });\n\n if (offlineItem) {\n return (\n <OfflineView item={offlineItem} onBack={() => setOfflineItem(null)} />\n );\n }\n\n const scriptsOffset = interfaces.length;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {session.appName}\n </Text>\n <Text color=\"gray\">\n https://app.mindstudio.ai/agents/{session.appId}/edit\n </Text>\n <Text color=\"gray\">\n Select an interface or script to connect your local editor.\n </Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"white\">\n Interfaces\n </Text>\n {interfaces.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {interfaces.map((item, i) => {\n const isSelected = i === cursorIndex;\n const status = getSessionStatus(item);\n const statusLabel = getStatusLabel(status);\n\n return (\n <Box\n key={`${item.step.workflowId}:${item.step.stepId}`}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {item.step.workflowName} -{' '}\n {item.step.displayName}\n </Text>\n <Box>\n <Text color={statusLabel.color}>\n {' '}\n {statusLabel.text}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n ) : (\n <Text color=\"gray\"> No interfaces in this agent.</Text>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"white\">\n Scripts\n </Text>\n {scripts.length > 0 ? (\n <Box flexDirection=\"column\" marginTop={1}>\n {scripts.map((item, i) => {\n const index = scriptsOffset + i;\n const isSelected = index === cursorIndex;\n\n return (\n <Box\n key={`${item.step.workflowId}:${item.step.stepId}`}\n flexDirection=\"column\"\n marginTop={i > 0 ? 1 : 0}\n >\n <Text\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {item.step.workflowName} -{' '}\n {item.step.displayName}\n </Text>\n <Text color=\"gray\">\n {' '}\n {item.step.entryFile}\n </Text>\n </Box>\n );\n })}\n </Box>\n ) : (\n <Text color=\"gray\"> No scripts in this agent.</Text>\n )}\n </Box>\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box>\n <Text\n color={cursorIndex === refreshIndex ? 'cyan' : 'white'}\n bold={cursorIndex === refreshIndex}\n >\n {cursorIndex === refreshIndex ? '\\u276F' : ' '} Refresh\n </Text>\n {getRefreshSuffix(refreshStatus) && (\n <Text color=\"gray\"> {getRefreshSuffix(refreshStatus)}</Text>\n )}\n </Box>\n <Text\n color={cursorIndex === backIndex ? 'cyan' : 'white'}\n bold={cursorIndex === backIndex}\n >\n {cursorIndex === backIndex ? '\\u276F' : ' '} Back\n </Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n\n// --- Local dev view (level 3, interfaces and scripts) ---\n\nfunction LocalDevView({\n item,\n onBack,\n}: {\n item: InterfaceItem | ScriptItem;\n onBack: () => void;\n}) {\n const mode = item.kind === 'script' ? 'script' : 'interface';\n\n let sessionId = '';\n if (item.kind === 'interface') {\n const hotUpdateDomain = item.step.spaEditorSession?.hotUpdateDomain ?? '';\n sessionId = hotUpdateDomain.replace(/^https?:\\/\\//, '').split('.')[0] || '';\n }\n\n const {\n phase,\n hasLocalCopy,\n localPath,\n outputLines,\n errorMessage,\n start,\n stop,\n deleteLocalCopy,\n } = useLocalInterface({\n mode,\n appId: item.appId,\n stepId: item.step.stepId,\n workflowId: item.step.workflowId,\n sessionId,\n });\n\n const name = `${item.step.workflowName} - ${item.step.displayName}`;\n\n const isActive =\n phase === 'cloning' ||\n phase === 'installing' ||\n phase === 'running' ||\n phase === 'deleting';\n\n // If the dev server exits (phase goes from active back to idle), go back to the list\n const wasActiveRef = useRef(false);\n useEffect(() => {\n if (isActive) {\n wasActiveRef.current = true;\n } else if (wasActiveRef.current && phase === 'idle') {\n wasActiveRef.current = false;\n onBack();\n }\n }, [phase, isActive, onBack]);\n\n if (isActive || phase === 'error') {\n return (\n <InterfaceRunningView\n name={name}\n phase={phase}\n outputLines={outputLines}\n errorMessage={errorMessage}\n localPath={localPath}\n onStop={stop}\n onBack={onBack}\n />\n );\n }\n\n return (\n <InterfaceSessionView\n item={item}\n onStart={start}\n onDelete={deleteLocalCopy}\n onBack={onBack}\n hasLocalCopy={hasLocalCopy}\n localPath={localPath}\n />\n );\n}\n\n// --- Main page ---\n\nexport function InterfacesPage({\n onBack,\n sessions,\n refreshStatus,\n refresh,\n}: InterfacesPageProps) {\n const [selectedAppId, setSelectedAppId] = useState<string | null>(null);\n const [selectedItem, setSelectedItem] = useState<\n InterfaceItem | ScriptItem | null\n >(null);\n\n if (selectedItem) {\n return (\n <LocalDevView item={selectedItem} onBack={() => setSelectedItem(null)} />\n );\n }\n\n if (selectedAppId) {\n const session = sessions.find((s) => s.appId === selectedAppId);\n if (session) {\n return (\n <AgentDetailView\n session={session}\n onBack={() => setSelectedAppId(null)}\n onSelect={(item) => {\n setSelectedItem(item);\n }}\n onRefresh={refresh}\n refreshStatus={refreshStatus}\n />\n );\n }\n }\n\n return (\n <AgentListView\n sessions={sessions}\n onBack={onBack}\n onSelectAgent={setSelectedAppId}\n onRefresh={refresh}\n refreshStatus={refreshStatus}\n />\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport {\n getLocalInterfacePath,\n setLocalInterfacePath,\n deleteLocalInterfacePath,\n getLocalInterfacesDir,\n getApiKey,\n getApiBaseUrl,\n getEnvironment,\n} from '../../../config';\nimport path from 'node:path';\n\nconst INTERFACE_SCAFFOLD_REPO =\n 'https://github.com/mindstudio-ai/spa-bundle-scaffold';\nconst SCRIPT_SCAFFOLD_REPO = 'https://github.com/mindstudio-ai/script-scaffold';\nconst MAX_OUTPUT_LINES = 500;\n\nexport type LocalInterfacePhase =\n | 'idle'\n | 'cloning'\n | 'installing'\n | 'running'\n | 'error'\n | 'deleting';\n\ninterface UseLocalInterfaceOptions {\n mode: 'interface' | 'script';\n appId: string;\n stepId: string;\n workflowId: string;\n /** For interfaces: the hot update domain subdomain (e.g. sb-xxx) */\n sessionId?: string;\n}\n\ninterface UseLocalInterfaceResult {\n phase: LocalInterfacePhase;\n hasLocalCopy: boolean;\n outputLines: string[];\n localPath: string | undefined;\n errorMessage: string | null;\n start: () => void;\n stop: () => void;\n deleteLocalCopy: () => void;\n}\n\nexport function useLocalInterface({\n mode,\n appId,\n stepId,\n workflowId,\n sessionId,\n}: UseLocalInterfaceOptions): UseLocalInterfaceResult {\n const key = `${appId}:${stepId}`;\n\n const [hasLocalCopy, setHasLocalCopy] = useState(() => {\n const existing = getLocalInterfacePath(key);\n if (!existing) return false;\n try {\n return fs.existsSync(existing);\n } catch {\n return false;\n }\n });\n\n const [phase, setPhase] = useState<LocalInterfacePhase>('idle');\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const processRef = useRef<ChildProcess | null>(null);\n const mountedRef = useRef(true);\n const stoppedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n processRef.current = null;\n }\n };\n }, []);\n\n const appendOutput = useCallback((line: string) => {\n if (!mountedRef.current) return;\n setOutputLines((prev) => {\n const next = [...prev, line];\n return next.length > MAX_OUTPUT_LINES\n ? next.slice(next.length - MAX_OUTPUT_LINES)\n : next;\n });\n }, []);\n\n const runCommand = useCallback(\n (\n command: string,\n args: string[],\n options: { cwd?: string; env?: Record<string, string> } = {},\n ): Promise<number> => {\n return new Promise((resolve, reject) => {\n const fullCommand = [command, ...args].join(' ');\n const proc = spawn(fullCommand, [], {\n cwd: options.cwd,\n shell: true,\n env: { ...process.env, FORCE_COLOR: '1', ...options.env },\n });\n\n processRef.current = proc;\n\n const handleData = (data: Buffer) => {\n const lines = data.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n appendOutput(line);\n }\n }\n };\n\n proc.stdout?.on('data', handleData);\n proc.stderr?.on('data', handleData);\n\n proc.on('close', (code) => {\n processRef.current = null;\n resolve(code ?? 0);\n });\n\n proc.on('error', (err) => {\n processRef.current = null;\n reject(err);\n });\n });\n },\n [appendOutput],\n );\n\n const getScaffoldRepo = () =>\n mode === 'script' ? SCRIPT_SCAFFOLD_REPO : INTERFACE_SCAFFOLD_REPO;\n\n const getDirPrefix = () => (mode === 'script' ? 'script' : 'interface');\n\n const getDevLocalArgs = (): {\n args: string[];\n env: Record<string, string>;\n } => {\n const env: Record<string, string> = {};\n\n if (getEnvironment() === 'local') {\n env.MINDSTUDIO_API_URL = getApiBaseUrl();\n env.MINDSTUDIO_WS_URL = 'ws://localhost:8888';\n }\n\n env.MINDSTUDIO_API_KEY = getApiKey() ?? '';\n return {\n args: [\n 'run',\n 'dev:local',\n '--',\n '--app',\n appId,\n '--workflow',\n workflowId,\n '--step',\n stepId,\n ],\n env,\n };\n };\n\n const start = useCallback(() => {\n setErrorMessage(null);\n setOutputLines([]);\n stoppedRef.current = false;\n\n const run = async () => {\n const localPath = getLocalInterfacePath(key);\n const dirExists = localPath && fs.existsSync(localPath);\n\n try {\n if (!dirExists) {\n // Clone\n setPhase('cloning');\n const interfacesDir = getLocalInterfacesDir();\n fs.mkdirSync(interfacesDir, { recursive: true });\n\n const shortId = crypto.randomBytes(4).toString('hex');\n const dirName = `${getDirPrefix()}-${shortId}`;\n const targetDir = path.join(interfacesDir, dirName);\n\n appendOutput(`Cloning scaffold into ${targetDir}...`);\n const cloneCode = await runCommand('git', [\n 'clone',\n '--depth',\n '1',\n getScaffoldRepo(),\n targetDir,\n ]);\n\n if (!mountedRef.current) return;\n if (cloneCode !== 0) {\n throw new Error(`git clone failed with exit code ${cloneCode}`);\n }\n\n // Install\n setPhase('installing');\n appendOutput('Installing dependencies...');\n const installCode = await runCommand('npm', ['install'], {\n cwd: targetDir,\n });\n\n if (!mountedRef.current) return;\n if (installCode !== 0) {\n throw new Error(`npm install failed with exit code ${installCode}`);\n }\n\n setLocalInterfacePath(key, targetDir);\n setHasLocalCopy(true);\n\n // Run\n setPhase('running');\n const { args, env } = getDevLocalArgs();\n appendOutput('Starting local dev server...');\n const devCode = await runCommand('npm', args, { cwd: targetDir, env });\n\n if (mountedRef.current) {\n if (devCode !== 0 && !stoppedRef.current) {\n throw new Error(`Dev server exited with code ${devCode}`);\n }\n setPhase('idle');\n setOutputLines([]);\n }\n } else {\n // Already cloned — just run\n setPhase('running');\n const { args, env } = getDevLocalArgs();\n appendOutput('Starting local dev server...');\n const devCode = await runCommand('npm', args, { cwd: localPath, env });\n\n if (mountedRef.current) {\n if (devCode !== 0 && !stoppedRef.current) {\n throw new Error(`Dev server exited with code ${devCode}`);\n }\n setPhase('idle');\n setOutputLines([]);\n }\n }\n } catch (err) {\n if (mountedRef.current) {\n setPhase('error');\n setErrorMessage(err instanceof Error ? err.message : 'Unknown error');\n }\n }\n };\n\n run();\n }, [\n key,\n mode,\n appId,\n stepId,\n workflowId,\n sessionId,\n appendOutput,\n runCommand,\n ]);\n\n const stop = useCallback(() => {\n stoppedRef.current = true;\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n const proc = processRef.current;\n setTimeout(() => {\n if (proc && !proc.killed) {\n proc.kill('SIGKILL');\n }\n }, 2000);\n processRef.current = null;\n }\n setPhase('idle');\n }, []);\n\n const deleteLocalCopy = useCallback(() => {\n const localPath = getLocalInterfacePath(key);\n if (!localPath) return;\n\n setPhase('deleting');\n setOutputLines([]);\n appendOutput(`Deleting ${localPath}...`);\n\n try {\n fs.rmSync(localPath, { recursive: true, force: true });\n deleteLocalInterfacePath(key);\n setHasLocalCopy(false);\n appendOutput('Deleted successfully.');\n } catch (err) {\n setErrorMessage(err instanceof Error ? err.message : 'Failed to delete');\n }\n setPhase('idle');\n }, [key, appendOutput]);\n\n return {\n phase,\n hasLocalCopy,\n localPath: getLocalInterfacePath(key),\n outputLines,\n errorMessage,\n start,\n stop,\n deleteLocalCopy,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport os from 'node:os';\nimport open from 'open';\nimport type { InterfaceItem, ScriptItem } from './InterfacesPage';\n\ninterface InterfaceSessionViewProps {\n item: InterfaceItem | ScriptItem;\n onStart: () => void;\n onDelete: () => void;\n onBack: () => void;\n hasLocalCopy: boolean;\n localPath: string | undefined;\n}\n\nexport function InterfaceSessionView({\n item,\n onStart,\n onDelete,\n onBack,\n hasLocalCopy,\n localPath,\n}: InterfaceSessionViewProps) {\n const menuItems: Array<{ id: string; label: string }> = [\n { id: 'start', label: 'Start Locally' },\n ];\n if (hasLocalCopy) {\n menuItems.push({ id: 'reveal', label: 'Open Folder' });\n menuItems.push({ id: 'delete', label: 'Delete Local Copy' });\n }\n menuItems.push({ id: 'back', label: 'Back' });\n\n const [cursorIndex, setCursorIndex] = useState(0);\n\n useEffect(() => {\n setCursorIndex(0);\n }, [hasLocalCopy]);\n\n useInput((input, key) => {\n if (input === 'q' || key.escape) {\n onBack();\n return;\n }\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const selected = menuItems[cursorIndex];\n if (!selected) return;\n switch (selected.id) {\n case 'start':\n onStart();\n break;\n case 'reveal':\n if (localPath) {\n open(localPath);\n }\n break;\n case 'delete':\n onDelete();\n break;\n case 'back':\n onBack();\n break;\n }\n }\n });\n\n const name = `${item.step.workflowName} - ${item.step.displayName}`;\n const displayPath = localPath?.replace(os.homedir(), '~');\n\n let sessionInfo: string | null = null;\n if (item.kind === 'interface') {\n const hotUpdateDomain = item.step.spaEditorSession?.hotUpdateDomain ?? '';\n sessionInfo =\n hotUpdateDomain.replace(/^https?:\\/\\//, '').split('.')[0] || null;\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {sessionInfo && <Text color=\"gray\">Session: {sessionInfo}</Text>}\n {hasLocalCopy && localPath ? (\n <>\n <Text color=\"green\">Local copy exists</Text>\n <Text color=\"gray\">Path: {displayPath}</Text>\n </>\n ) : (\n <Text color=\"yellow\">\n No local copy. &quot;Start Locally&quot; will clone the scaffold\n and install dependencies.\n </Text>\n )}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((menuItem, i) => {\n const isSelected = i === cursorIndex;\n return (\n <Text\n key={menuItem.id}\n color={isSelected ? 'cyan' : 'white'}\n bold={isSelected}\n >\n {isSelected ? '\\u276F' : ' '} {menuItem.label}\n </Text>\n );\n })}\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc Back\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useState, useMemo, useRef, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { execSync } from 'node:child_process';\nimport os from 'node:os';\nimport open from 'open';\nimport Spinner from 'ink-spinner';\nimport type { LocalInterfacePhase } from '../hooks/useLocalInterface';\n\nfunction copyToClipboard(text: string): boolean {\n try {\n if (process.platform === 'darwin') {\n execSync('pbcopy', { input: text });\n } else if (process.platform === 'win32') {\n execSync('clip', { input: text });\n } else {\n execSync('xclip -selection clipboard', { input: text });\n }\n return true;\n } catch {\n return false;\n }\n}\n\ninterface InterfaceRunningViewProps {\n name: string;\n phase: LocalInterfacePhase;\n outputLines: string[];\n errorMessage: string | null;\n localPath: string | undefined;\n onStop: () => void;\n onBack: () => void;\n}\n\nfunction getPhaseLabel(phase: LocalInterfacePhase): {\n text: string;\n color: string;\n showSpinner: boolean;\n} {\n switch (phase) {\n case 'cloning':\n return { text: 'Cloning scaffold...', color: 'cyan', showSpinner: true };\n case 'installing':\n return {\n text: 'Installing dependencies...',\n color: 'cyan',\n showSpinner: true,\n };\n case 'running':\n return { text: 'Dev server running', color: 'green', showSpinner: true };\n case 'error':\n return { text: 'Error', color: 'red', showSpinner: false };\n case 'deleting':\n return {\n text: 'Deleting local copy...',\n color: 'yellow',\n showSpinner: true,\n };\n default:\n return { text: 'Idle', color: 'gray', showSpinner: false };\n }\n}\n\nexport function InterfaceRunningView({\n name,\n phase,\n outputLines,\n errorMessage,\n localPath,\n onStop,\n onBack,\n}: InterfaceRunningViewProps) {\n const { stdout } = useStdout();\n const termHeight = (stdout?.rows ?? 24) - 4;\n\n const isActive =\n phase === 'cloning' ||\n phase === 'installing' ||\n phase === 'running' ||\n phase === 'deleting';\n\n const displayPath = localPath?.replace(os.homedir(), '~');\n\n // Build menu items\n const menuItems = useMemo(() => {\n const items: Array<{ id: string; label: string; copyValue?: string }> = [];\n if (isActive && displayPath) {\n items.push({\n id: 'claude',\n label: 'Copy Claude Code Command',\n copyValue: `cd ${displayPath}; claude`,\n });\n items.push({\n id: 'codex',\n label: 'Copy Codex Command',\n copyValue: `cd ${displayPath}; codex`,\n });\n items.push({ id: 'reveal', label: 'Open Folder' });\n }\n items.push({ id: 'action', label: isActive ? 'Stop' : 'Back' });\n return items;\n }, [isActive, displayPath]);\n\n const [cursorIndex, setCursorIndex] = useState(0);\n const [copiedId, setCopiedId] = useState<string | null>(null);\n const copiedTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n return () => clearTimeout(copiedTimerRef.current);\n }, []);\n\n // Layout\n const headerHeight = 14;\n const menuHeight = menuItems.length;\n const chromeLines = 7 + menuHeight;\n const logHeight = Math.max(3, termHeight - headerHeight - chromeLines);\n\n // Auto-follow log tail\n const maxScroll = Math.max(0, outputLines.length - logHeight);\n const effectiveOffset = maxScroll;\n\n const copyItem = (item: { id: string; copyValue?: string }) => {\n if (!item.copyValue) return;\n const success = copyToClipboard(item.copyValue);\n if (success) {\n setCopiedId(item.id);\n clearTimeout(copiedTimerRef.current);\n copiedTimerRef.current = setTimeout(() => setCopiedId(null), 2000);\n }\n };\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[cursorIndex];\n if (!item) return;\n if (item.copyValue) {\n copyItem(item);\n } else if (item.id === 'reveal' && localPath) {\n open(localPath);\n } else if (isActive) {\n onStop();\n } else {\n onBack();\n }\n } else if (input === 'q' || key.escape) {\n if (isActive) {\n onStop();\n } else {\n onBack();\n }\n }\n });\n\n const visibleLines = outputLines.slice(\n effectiveOffset,\n effectiveOffset + logHeight,\n );\n\n const phaseInfo = getPhaseLabel(phase);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n {name}\n </Text>\n\n <Box marginTop={1}>\n {phaseInfo.showSpinner && (\n <Text color={phaseInfo.color}>\n <Spinner type=\"dots\" />{' '}\n </Text>\n )}\n <Text color={phaseInfo.color}>{phaseInfo.text}</Text>\n </Box>\n\n {errorMessage && (\n <Box marginTop={1}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )}\n\n <Box marginTop={1} height={logHeight}>\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {visibleLines.map((line, i) => (\n <Text key={effectiveOffset + i} wrap=\"truncate-end\" color=\"gray\">\n {line}\n </Text>\n ))}\n </Box>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {menuItems.map((item, i) => {\n const isSelected = i === cursorIndex;\n const isCopied = copiedId === item.id;\n return (\n <Box key={item.id}>\n <Text color={isSelected ? 'cyan' : 'white'} bold={isSelected}>\n {isSelected ? '\\u276F' : ' '} {item.label}\n </Text>\n {isCopied && <Text color=\"green\"> {'\\u2713'} Copied!</Text>}\n </Box>\n );\n })}\n </Box>\n\n <Box marginTop={1} height={1}>\n <Text color=\"gray\" wrap=\"truncate-end\">\n Up/Down Navigate {'\\u2022'} Enter Select {'\\u2022'} q/Esc{' '}\n {isActive ? 'Stop' : 'Back'}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useCallback, useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport chalk from 'chalk';\nimport { useAuth } from '../hooks/useAuth';\nimport { LogoString } from '../components/Header';\n\ninterface OnboardingPageProps {\n onComplete: () => void;\n}\n\nconst SHIMMER_SPEED = 35;\n\nfunction useShimmerLogo(): string {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n // Full cycle: fade in + hold + fade out + pause\n const cycleLength = totalChars + 40;\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % cycleLength);\n }, SHIMMER_SPEED);\n return () => clearInterval(interval);\n }, [cycleLength]);\n\n return useMemo(() => {\n // Map frame to a wave that fades the whole logo in and out\n // Phase 0..totalChars: characters light up one by one (sweep in)\n // Phase totalChars..totalChars+20: hold bright\n // Phase totalChars+20..cycleLength: all fade out together\n const sweepPos = frame;\n const holdEnd = totalChars + 20;\n\n let charIdx = 0;\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n let brightness: number;\n if (sweepPos <= totalChars) {\n // Sweep phase: characters light up as the wave passes\n const lag = charIdx;\n const t = sweepPos - lag;\n brightness = t <= 0 ? 0.1 : Math.min(1, t / 8);\n } else if (sweepPos <= holdEnd) {\n // Hold phase: everything bright\n brightness = 1;\n } else {\n // Fade out phase\n const fadeProgress = (sweepPos - holdEnd) / (cycleLength - holdEnd);\n brightness = Math.max(0.1, 1 - fadeProgress);\n }\n\n if (brightness >= 0.9) {\n result += chalk.cyanBright.bold(ch);\n } else if (brightness >= 0.6) {\n result += chalk.cyan(ch);\n } else if (brightness >= 0.3) {\n result += chalk.rgb(0, 100, 120)(ch);\n } else {\n result += chalk.rgb(0, 50, 60)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [frame, lines, totalChars, cycleLength]);\n}\n\nexport function OnboardingPage({ onComplete }: OnboardingPageProps) {\n const {\n status: authStatus,\n authUrl,\n timeRemaining,\n startAuth,\n cancel: cancelAuth,\n } = useAuth();\n const shimmerLogo = useShimmerLogo();\n\n // Auto-navigate to dashboard on success\n useEffect(() => {\n if (authStatus === 'success') {\n const timer = setTimeout(() => onComplete(), 1500);\n return () => clearTimeout(timer);\n }\n }, [authStatus, onComplete]);\n\n // Clean up auth on unmount\n useEffect(() => {\n return () => cancelAuth();\n }, []);\n\n const handleAction = useCallback(() => {\n cancelAuth();\n startAuth();\n }, [cancelAuth, startAuth]);\n\n const canAct =\n authStatus === 'idle' ||\n authStatus === 'expired' ||\n authStatus === 'timeout';\n\n useInput((_input, key) => {\n if (canAct && !key.ctrl) {\n handleAction();\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <Box flexGrow={1} />\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>{shimmerLogo}</Text>\n\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n {authStatus === 'idle' && (\n <>\n <Text color=\"gray\">\n Connect your MindStudio account to get started.\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to Connect Account\n </Text>\n </Box>\n </>\n )}\n\n {(authStatus === 'expired' || authStatus === 'timeout') && (\n <>\n <Text color=\"red\">\n {authStatus === 'expired'\n ? 'Authorization expired.'\n : 'Authorization timed out.'}\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to Try Again\n </Text>\n </Box>\n </>\n )}\n\n {authStatus === 'waiting' && (\n <>\n <Box>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text>\n {' '}\n Waiting for browser authorization... ({timeRemaining}s\n remaining)\n </Text>\n </Box>\n {authUrl && (\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={1}>\n <Text color=\"gray\">If browser didn't open, visit:</Text>\n <Text color=\"cyan\">{authUrl}</Text>\n </Box>\n )}\n </>\n )}\n\n {authStatus === 'success' && (\n <Text color=\"green\">{'\\u2713'} Authenticated!</Text>\n )}\n </Box>\n </Box>\n\n <Box flexGrow={1} />\n </Box>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport open from 'open';\nimport { requestDeviceAuth, pollDeviceAuth } from '../../api';\nimport { setApiKey, setUserId } from '../../config';\n\ntype AuthStatus = 'idle' | 'waiting' | 'success' | 'expired' | 'timeout';\n\ninterface UseAuthResult {\n status: AuthStatus;\n authUrl: string | null;\n timeRemaining: number;\n startAuth: () => void;\n cancel: () => void;\n}\n\nconst POLL_INTERVAL = 2000;\nconst MAX_ATTEMPTS = 30;\n\nexport function useAuth(): UseAuthResult {\n const [status, setStatus] = useState<AuthStatus>('idle');\n const [authUrl, setAuthUrl] = useState<string | null>(null);\n const [timeRemaining, setTimeRemaining] = useState(0);\n const cancelledRef = useRef(false);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Clean up timer on unmount\n useEffect(() => {\n return () => {\n cancelledRef.current = true;\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, []);\n\n const cancel = useCallback(() => {\n cancelledRef.current = true;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n setStatus('idle');\n setAuthUrl(null);\n setTimeRemaining(0);\n }, []);\n\n const startAuth = useCallback(() => {\n cancelledRef.current = false;\n\n const run = async () => {\n try {\n const { url, token } = await requestDeviceAuth();\n if (cancelledRef.current) return;\n\n setAuthUrl(url);\n setStatus('waiting');\n\n const totalTime = (MAX_ATTEMPTS * POLL_INTERVAL) / 1000;\n setTimeRemaining(totalTime);\n\n // Countdown timer\n timerRef.current = setInterval(() => {\n setTimeRemaining((prev) => {\n const next = prev - 1;\n if (next <= 0 && timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return Math.max(0, next);\n });\n }, 1000);\n\n await open(url);\n\n // Poll loop\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL));\n if (cancelledRef.current) return;\n\n const result = await pollDeviceAuth(token);\n\n if (result.status === 'completed' && result.apiKey) {\n if (timerRef.current) clearInterval(timerRef.current);\n setApiKey(result.apiKey);\n if (result.userId) {\n setUserId(result.userId);\n }\n setStatus('success');\n return;\n }\n\n if (result.status === 'expired') {\n if (timerRef.current) clearInterval(timerRef.current);\n setStatus('expired');\n return;\n }\n }\n\n if (!cancelledRef.current) {\n setStatus('timeout');\n }\n } catch {\n if (!cancelledRef.current) {\n setStatus('expired');\n }\n }\n };\n\n run();\n }, []);\n\n return {\n status,\n authUrl,\n timeRemaining,\n startAuth,\n cancel,\n };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { NavigationMenu } from '../../components/NavigationMenu';\nimport type { MenuItem } from '../../components/NavigationMenu';\nimport { DevRequestLog } from '../components/DevRequestLog';\nimport { DevPortPrompt } from '../components/DevPortPrompt';\nimport { TabBar, type Tab } from '../components/TabBar';\nimport { useDevSession } from '../hooks/useDevSession';\nimport { useDevRequests } from '../hooks/useDevRequests';\nimport type { AppConfig } from '../../../dev/types';\n\nconst TABS: Tab[] = [\n { id: 'info', label: 'Info' },\n { id: 'requests', label: 'Requests' },\n { id: 'methods', label: 'Methods' },\n { id: 'server', label: 'Dev Server' },\n];\n\ninterface DevPageProps {\n appConfig: AppConfig;\n onNavigate: (id: string) => void;\n termHeight?: number;\n}\n\nexport function DevPage({ appConfig, onNavigate, termHeight }: DevPageProps) {\n const {\n phase,\n session,\n error,\n devPort,\n proxyPort,\n devServer,\n syncResult,\n scenarioResult,\n roleOverride,\n installStatus,\n start,\n stop,\n resync,\n runScenario,\n setImpersonation,\n clearImpersonation,\n submitPort,\n skipFrontend,\n } = useDevSession(appConfig);\n const { requests, activeCount } = useDevRequests();\n const [activeTab, setActiveTab] = useState('info');\n const [showScenarioPicker, setShowScenarioPicker] = useState(false);\n const [showRolePicker, setShowRolePicker] = useState(false);\n\n const hasScenarios = appConfig.scenarios.length > 0;\n const hasRoles = appConfig.roles.length > 0;\n\n const runningMenuItems: MenuItem[] = useMemo(\n () => [\n ...(hasScenarios\n ? [{ id: 'scenario', label: 'Run Scenario', description: 'Seed database with test data' }]\n : []),\n ...(hasRoles\n ? [{ id: 'impersonate', label: 'Impersonate', description: roleOverride ? `Active: ${roleOverride.join(', ')}` : 'Test as a different role' }]\n : []),\n { id: 'sync', label: 'Sync Schema', description: 'Re-sync table definitions from disk' },\n { id: 'stop', label: 'Stop Session', description: 'Stop the dev session and clean up' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ],\n [hasScenarios, hasRoles, roleOverride],\n );\n\n // Tab navigation with left/right arrows (only when running)\n useInput((_input, key) => {\n if (phase !== 'running') return;\n if (key.leftArrow) {\n const idx = TABS.findIndex((t) => t.id === activeTab);\n setActiveTab(TABS[(idx - 1 + TABS.length) % TABS.length].id);\n } else if (key.rightArrow) {\n const idx = TABS.findIndex((t) => t.id === activeTab);\n setActiveTab(TABS[(idx + 1) % TABS.length].id);\n }\n });\n\n // Auto-start when ready\n useEffect(() => {\n if (phase === 'ready') {\n start();\n }\n }, [phase, start]);\n\n // Detecting state\n if (phase === 'detecting') {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text>\n <Spinner type=\"dots\" /> Checking app configuration...\n </Text>\n </Box>\n );\n }\n\n // Needs port input\n if (phase === 'needs_port') {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <DevPortPrompt onSubmit={submitPort} onSkip={skipFrontend} />\n </Box>\n );\n }\n\n // Starting\n if (phase === 'starting') {\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box paddingX={1} marginTop={1} flexDirection=\"column\">\n <Text>\n <Spinner type=\"dots\" /> Starting dev session...\n </Text>\n {installStatus && (\n <Text color=\"gray\">\n <Spinner type=\"dots\" /> {installStatus}\n </Text>\n )}\n {devServer.phase === 'starting' && (\n <Text color=\"gray\">\n <Spinner type=\"dots\" /> Waiting for dev server on port {devPort}...\n </Text>\n )}\n {devServer.outputLines.slice(-6).map((line, i) => (\n <Text key={i} color=\"gray\" dimColor wrap=\"truncate\">{line}</Text>\n ))}\n </Box>\n </Box>\n );\n }\n\n // Error state\n if (phase === 'error') {\n const errorMenuItems: MenuItem[] = [\n { id: 'retry', label: 'Retry', description: 'Try starting the session again' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n {error && <Text color=\"red\">✖ {error}</Text>}\n {devServer.error && <Text color=\"red\">Dev server: {devServer.error}</Text>}\n {devServer.outputLines.slice(-5).map((line, i) => (\n <Text key={i} color=\"gray\" dimColor wrap=\"truncate\">{line}</Text>\n ))}\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={errorMenuItems}\n onSelect={(id) => {\n if (id === 'retry') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Stopped state\n if (phase === 'stopped') {\n const stoppedMenuItems: MenuItem[] = [\n { id: 'restart', label: 'Restart', description: 'Start a new dev session' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">Session stopped.</Text>\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={stoppedMenuItems}\n onSelect={(id) => {\n if (id === 'restart') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Expired state\n if (phase === 'expired') {\n const expiredMenuItems: MenuItem[] = [\n { id: 'restart', label: 'Restart', description: 'Start a new dev session' },\n { id: 'dashboard', label: 'Local Models', description: 'Switch to local models view' },\n { id: 'quit', label: 'Quit', description: 'Exit the application' },\n ];\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <AppInfoHeader appConfig={appConfig} />\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">\n ⚠ Dev session expired. The platform may have timed it out.\n </Text>\n </Box>\n <Box flexGrow={1} />\n <NavigationMenu\n items={expiredMenuItems}\n onSelect={(id) => {\n if (id === 'restart') start();\n else onNavigate(id);\n }}\n />\n </Box>\n );\n }\n\n // Running state — tabbed view\n const statusLines = 4; // status bar + tab bar\n const menuLines = 8;\n const contentHeight = Math.max(5, (termHeight ?? 30) - statusLines - menuLines);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n {/* Persistent status bar */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Box gap={2}>\n <Text bold color=\"white\">{appConfig.name}</Text>\n <Text color=\"green\">● {session?.branch ?? 'main'}</Text>\n <Text color=\"cyan\">{session?.previewUrl ?? session?.webInterfaceUrl ?? ''}</Text>\n </Box>\n </Box>\n\n {/* Tab content */}\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {activeTab === 'info' && (\n <InfoTab\n appConfig={appConfig}\n session={session}\n devPort={devPort}\n proxyPort={proxyPort}\n devServerPhase={devServer.phase}\n requests={requests}\n syncResult={syncResult}\n scenarioResult={scenarioResult}\n roleOverride={roleOverride}\n contentHeight={contentHeight}\n />\n )}\n {activeTab === 'requests' && (\n <DevRequestLog requests={requests} maxVisible={contentHeight} />\n )}\n {activeTab === 'methods' && (\n <MethodsTab appConfig={appConfig} contentHeight={contentHeight} />\n )}\n {activeTab === 'server' && (\n <DevServerTab\n devPort={devPort}\n phase={devServer.phase}\n outputLines={devServer.outputLines}\n error={devServer.error}\n contentHeight={contentHeight}\n />\n )}\n </Box>\n\n {/* Menu, scenario picker, or role picker */}\n {showScenarioPicker ? (\n <NavigationMenu\n title=\"Select Scenario\"\n items={[\n ...appConfig.scenarios.map((s) => ({\n id: `scenario:${s.id}`,\n label: s.name ?? s.id,\n description: s.description ?? `Roles: ${s.roles.length > 0 ? s.roles.join(', ') : 'none'}`,\n })),\n { id: 'back', label: 'Back', description: 'Return to actions' },\n ]}\n onSelect={(id) => {\n setShowScenarioPicker(false);\n if (id.startsWith('scenario:')) {\n runScenario(id.slice('scenario:'.length));\n }\n }}\n />\n ) : showRolePicker ? (\n <NavigationMenu\n title=\"Impersonate Role\"\n items={[\n ...appConfig.roles.map((r) => ({\n id: `role:${r.id}`,\n label: r.name ?? r.id,\n description: r.description ?? r.id,\n })),\n ...(roleOverride ? [{ id: 'clear', label: 'Clear Override', description: 'Revert to default session roles' }] : []),\n { id: 'back', label: 'Back', description: 'Return to actions' },\n ]}\n onSelect={(id) => {\n setShowRolePicker(false);\n if (id === 'clear') {\n clearImpersonation();\n } else if (id.startsWith('role:')) {\n setImpersonation([id.slice('role:'.length)]);\n }\n }}\n />\n ) : (\n <NavigationMenu\n items={runningMenuItems}\n onSelect={(id) => {\n if (id === 'scenario') setShowScenarioPicker(true);\n else if (id === 'impersonate') setShowRolePicker(true);\n else if (id === 'sync') resync();\n else if (id === 'stop') stop();\n else onNavigate(id);\n }}\n />\n )}\n\n {/* Tab bar */}\n <TabBar tabs={TABS} activeTab={activeTab} />\n </Box>\n );\n}\n\n/** Compact header showing app name for non-running states. */\nfunction AppInfoHeader({ appConfig }: { appConfig: AppConfig }) {\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n paddingY={1}\n borderStyle=\"round\"\n borderColor=\"gray\"\n >\n <Text bold color=\"white\">\n {appConfig.name}\n </Text>\n {appConfig.description && (\n <Text color=\"gray\">{appConfig.description}</Text>\n )}\n {!appConfig.appId && (\n <Text color=\"yellow\">\n ⚠ No &quot;appId&quot; field in mindstudio.json — add your app ID to start a dev session\n </Text>\n )}\n </Box>\n );\n}\n\n/** Info tab — session details, databases, summary stats. */\nfunction InfoTab({\n appConfig,\n session,\n devPort,\n proxyPort,\n devServerPhase,\n requests,\n syncResult,\n scenarioResult,\n roleOverride,\n contentHeight,\n}: {\n appConfig: AppConfig;\n session: ReturnType<typeof useDevSession>['session'];\n devPort: number | null;\n proxyPort: number | null;\n devServerPhase: string;\n requests: import('../../../dev/types').DevRequestLogEntry[];\n syncResult: import('../../../dev/types').SyncSchemaResponse | null;\n scenarioResult: { id: string; name?: string; success: boolean; roles: string[]; error?: string } | null;\n roleOverride: string[] | null;\n contentHeight: number;\n}) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>Session</Text>\n <Text>\n <Text color=\"gray\">Session ID: </Text>\n <Text>{session?.sessionId ?? '...'}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Release ID: </Text>\n <Text>{session?.releaseId ?? '...'}</Text>\n </Text>\n <Text>\n <Text color=\"gray\">Branch: </Text>\n <Text>{session?.branch ?? '...'}</Text>\n </Text>\n {session?.user && (\n <Text>\n <Text color=\"gray\">User: </Text>\n <Text>{session.user.name} ({session.user.email})</Text>\n </Text>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>App URL</Text></Box>\n <Text color=\"cyan\" bold>\n {session?.previewUrl ?? session?.webInterfaceUrl ?? '...'}\n </Text>\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Dev Server</Text></Box>\n {devPort !== null ? (\n <Text>\n <Text>localhost:{devPort}</Text>\n {devServerPhase === 'running' ? (\n <Text color=\"green\"> ● running</Text>\n ) : devServerPhase === 'starting' ? (\n <Text color=\"yellow\"> ○ starting</Text>\n ) : (\n <Text color=\"gray\"> ○ {devServerPhase}</Text>\n )}\n </Text>\n ) : (\n <Text color=\"gray\" dimColor>Backend-only mode (no frontend)</Text>\n )}\n\n {roleOverride && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Impersonation</Text>\n <Text color=\"yellow\"> ● Active: {roleOverride.join(', ')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Databases</Text></Box>\n {(session?.databases ?? []).length === 0 ? (\n <Text color=\"gray\" dimColor>No databases</Text>\n ) : (\n session?.databases.map((db) => (\n <Box key={db.id} flexDirection=\"column\">\n <Text> <Text color=\"cyan\">{db.name}</Text></Text>\n {db.tables.map((table) => (\n <Text key={table.name} color=\"gray\"> {table.name}</Text>\n ))}\n </Box>\n ))\n )}\n\n {syncResult && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Schema Sync</Text>\n {syncResult.created.length > 0 && (\n <Text color=\"green\"> ✓ Created: {syncResult.created.join(', ')}</Text>\n )}\n {syncResult.altered.length > 0 && (\n <Text color=\"yellow\"> ✓ Altered: {syncResult.altered.join(', ')}</Text>\n )}\n {syncResult.errors.map((err, i) => (\n <Text key={i} color=\"red\"> ✖ {err}</Text>\n ))}\n {syncResult.created.length === 0 && syncResult.altered.length === 0 && syncResult.errors.length === 0 && (\n <Text color=\"gray\" dimColor> No changes</Text>\n )}\n </Box>\n )}\n\n {scenarioResult && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold color=\"white\" underline>Last Scenario</Text>\n {scenarioResult.success ? (\n <Text color=\"green\"> ✓ &quot;{scenarioResult.name ?? scenarioResult.id}&quot; applied</Text>\n ) : (\n <Text color=\"red\"> ✖ &quot;{scenarioResult.name ?? scenarioResult.id}&quot; failed: {scenarioResult.error}</Text>\n )}\n {scenarioResult.roles.length > 0 && (\n <Text color=\"gray\" dimColor> Roles: {scenarioResult.roles.join(', ')}</Text>\n )}\n </Box>\n )}\n\n <Box marginTop={1}><Text bold color=\"white\" underline>Recent Requests</Text></Box>\n {requests.length === 0 ? (\n <Text color=\"gray\" dimColor>No requests yet</Text>\n ) : (\n requests.slice(-5).map((req) => (\n <Box key={req.id} gap={1}>\n {req.status === 'completed' && <Text color=\"green\">✓</Text>}\n {req.status === 'failed' && <Text color=\"red\">✖</Text>}\n {req.status === 'processing' && <Text color=\"cyan\">●</Text>}\n <Text>{req.method ?? 'unknown'}</Text>\n {req.duration != null && <Text color=\"gray\">{req.duration}ms</Text>}\n {req.status === 'failed' && req.error && (\n <Text color=\"red\" wrap=\"truncate\">{req.error.split('\\n')[0]}</Text>\n )}\n </Box>\n ))\n )}\n </Box>\n );\n}\n\n/** Methods tab — list all methods from mindstudio.json. */\nfunction MethodsTab({\n appConfig,\n contentHeight,\n}: {\n appConfig: AppConfig;\n contentHeight: number;\n}) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Methods ({appConfig.methods.length})\n </Text>\n {appConfig.methods.slice(0, contentHeight - 2).map((method) => (\n <Box key={method.id} gap={1}>\n <Text color=\"cyan\">{method.export}</Text>\n <Text color=\"gray\" dimColor>→ {method.id}</Text>\n <Text color=\"gray\" dimColor>({method.path})</Text>\n </Box>\n ))}\n {appConfig.methods.length === 0 && (\n <Text color=\"gray\" dimColor>No methods defined</Text>\n )}\n </Box>\n );\n}\n\n/** Dev Server tab — full-height output log. */\nfunction DevServerTab({\n devPort,\n phase,\n outputLines,\n error,\n contentHeight,\n}: {\n devPort: number | null;\n phase: string;\n outputLines: string[];\n error: string | null;\n contentHeight: number;\n}) {\n const visibleLines = contentHeight - 3; // header + port line + padding\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Dev Server\n {phase === 'running' ? (\n <Text color=\"green\"> ● running</Text>\n ) : phase === 'starting' ? (\n <Text color=\"yellow\"> ○ starting</Text>\n ) : phase === 'error' ? (\n <Text color=\"red\"> ✖ error</Text>\n ) : (\n <Text color=\"gray\"> ○ {phase}</Text>\n )}\n </Text>\n {devPort !== null && (\n <Text color=\"gray\" dimColor>localhost:{devPort}</Text>\n )}\n {devPort === null && (\n <Text color=\"gray\" dimColor>Backend-only mode (no frontend)</Text>\n )}\n {error && <Text color=\"red\">{error}</Text>}\n {outputLines.slice(-visibleLines).map((line, i) => (\n <Text key={i} color=\"gray\" wrap=\"truncate\">\n {line}\n </Text>\n ))}\n {outputLines.length === 0 && phase !== 'idle' && !error && (\n <Text color=\"gray\" dimColor>Waiting for output...</Text>\n )}\n {outputLines.length === 0 && phase === 'idle' && !error && (\n <Text color=\"gray\" dimColor>Dev server not started</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { DevRequestLogEntry } from '../../../dev/types';\n\ninterface DevRequestLogProps {\n requests: DevRequestLogEntry[];\n maxVisible?: number;\n}\n\nexport function DevRequestLog({\n requests,\n maxVisible = 10,\n}: DevRequestLogProps) {\n if (requests.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Request Log\n </Text>\n <Text color=\"gray\"> Waiting for requests...</Text>\n </Box>\n );\n }\n\n // Show most recent requests, prioritizing active ones\n const active = requests.filter((r) => r.status === 'processing');\n const completed = requests.filter((r) => r.status !== 'processing');\n const recent = completed.slice(-Math.max(0, maxVisible - active.length));\n const visible = [...recent, ...active].slice(-maxVisible);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text bold color=\"white\" underline>\n Request Log\n </Text>\n {visible.map((entry) => (\n <RequestEntry key={entry.id} entry={entry} />\n ))}\n </Box>\n );\n}\n\nfunction RequestEntry({ entry }: { entry: DevRequestLogEntry }) {\n const methodLabel = entry.method ?? 'unknown';\n\n if (entry.status === 'processing') {\n const elapsed = Math.round((Date.now() - entry.startTime) / 1000);\n return (\n <Box gap={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text>{methodLabel}</Text>\n <Text color=\"gray\">{elapsed}s</Text>\n </Box>\n );\n }\n\n if (entry.status === 'failed') {\n const errorLines = (entry.error ?? 'Unknown error').split('\\n').slice(0, 4);\n return (\n <Box flexDirection=\"column\">\n <Box gap={1}>\n <Text color=\"red\">✖</Text>\n <Text>{methodLabel}</Text>\n {entry.duration != null && <Text color=\"gray\">{entry.duration}ms</Text>}\n </Box>\n {errorLines.map((line, i) => (\n <Text key={i} color=\"red\" wrap=\"truncate\">{' '}{line}</Text>\n ))}\n </Box>\n );\n }\n\n // Completed\n const duration = entry.duration != null ? `${entry.duration}ms` : '';\n return (\n <Box gap={1}>\n <Text color=\"green\">✓</Text>\n <Text>{methodLabel}</Text>\n <Text color=\"gray\">{duration}</Text>\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface DevPortPromptProps {\n onSubmit: (port: number) => void;\n onSkip: () => void;\n}\n\nexport function DevPortPrompt({ onSubmit, onSkip }: DevPortPromptProps) {\n const [value, setValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = (input: string) => {\n const trimmed = input.trim();\n\n if (trimmed === '' || trimmed === 'skip') {\n onSkip();\n return;\n }\n\n const port = parseInt(trimmed, 10);\n if (isNaN(port) || port < 1 || port > 65535) {\n setError('Enter a valid port number (1-65535) or \"skip\"');\n return;\n }\n\n onSubmit(port);\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n <Text color=\"yellow\">\n No devPort found in your web interface config.\n </Text>\n <Text color=\"gray\">\n What port is your local dev server running on?\n </Text>\n <Text color=\"gray\" dimColor>\n Type &quot;skip&quot; for backend-only mode (no frontend proxying).\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\">Port: </Text>\n <TextInput\n value={value}\n onChange={(val) => {\n setValue(val);\n setError(null);\n }}\n onSubmit={handleSubmit}\n placeholder=\"5173\"\n />\n </Box>\n {error && (\n <Text color=\"red\">{error}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\n\nexport interface Tab {\n id: string;\n label: string;\n}\n\ninterface TabBarProps {\n tabs: Tab[];\n activeTab: string;\n}\n\nexport function TabBar({ tabs, activeTab }: TabBarProps) {\n const { stdout } = useStdout();\n const width = stdout?.columns ?? 80;\n\n const tabSegments = tabs.map((tab) => {\n const isActive = tab.id === activeTab;\n const padded = ` ${tab.label} `;\n return { tab, isActive, padded };\n });\n\n const labelText = 'Screen ';\n const hint = ' ←/→ ';\n const tabChars = tabSegments.reduce((sum, s) => sum + s.padded.length, 0);\n const remaining = Math.max(0, width - tabChars - hint.length - labelText.length);\n\n return (\n <Box>\n <Text color=\"gray\">{labelText}</Text>\n {tabSegments.map(({ tab, isActive, padded }) => (\n <Text\n key={tab.id}\n bold={isActive}\n color={isActive ? 'white' : '#aaaaaa'}\n backgroundColor={isActive ? 'blueBright' : '#333333'}\n >\n {padded}\n </Text>\n ))}\n <Text color=\"#666666\" backgroundColor=\"#333333\">\n {' '.repeat(remaining)}{hint}\n </Text>\n </Box>\n );\n}\n","// Orchestrates the full dev session lifecycle in TUI mode.\n//\n// Startup sequence (triggered by phase state machine):\n// detecting → detect web config from mindstudio.json\n// needs_port → prompt user for dev server port (if not in config)\n// ready → auto-triggers start()\n// starting → npm install (if needed) → start dev server → start platform\n// session → sync schema → start proxy\n// running → poll loop active, proxy serving, ready for requests\n//\n// On mindstudio.json change: fs.watch detects it, stops everything,\n// re-enters 'ready' phase which re-runs start() with fresh config.\n//\n// This hook is the TUI equivalent of src/headless.ts — same pieces\n// (DevRunner, DevProxy, schema sync) wired together with React state.\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { spawn } from 'node:child_process';\nimport { watchConfigFile } from '../../../dev/config-watcher';\nimport { DevRunner } from '../../../dev/runner';\nimport { DevProxy } from '../../../dev/proxy';\nimport { devRequestEvents } from '../../../dev/events';\nimport {\n detectAppConfig,\n getWebInterfaceConfig,\n getWebProjectDir,\n readTableSources,\n findDirsNeedingInstall,\n} from '../../../dev/app-config';\nimport { syncSchema } from '../../../dev/api';\nimport { initLoggerInteractive } from '../../../dev/logger';\nimport { stablePort, detectGitBranch } from '../../../dev/utils';\nimport { watchTableFiles } from '../../../dev/table-watcher';\nimport { useDevServer } from './useDevServer';\nimport type { AppConfig, DevSession, WebInterfaceConfig, SyncSchemaResponse } from '../../../dev/types';\n\nfunction runNpmInstall(cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn('npm', ['install'], {\n cwd,\n shell: true,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n let stderr = '';\n proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`npm install failed in ${cwd}: ${stderr.slice(-200)}`));\n });\n proc.on('error', reject);\n });\n}\n\nexport type DevPhase =\n | 'detecting'\n | 'needs_port'\n | 'ready'\n | 'starting'\n | 'running'\n | 'error'\n | 'stopped'\n | 'expired';\n\nexport function useDevSession(appConfig: AppConfig) {\n // Init logger once on first render (TUI mode → file-based)\n const logInitRef = useRef(false);\n if (!logInitRef.current) {\n initLoggerInteractive('error');\n logInitRef.current = true;\n }\n\n const [phase, setPhase] = useState<DevPhase>('detecting');\n const [session, setSession] = useState<DevSession | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [devPort, setDevPort] = useState<number | null>(null);\n const [proxyPort, setProxyPort] = useState<number | null>(null);\n const [webConfig, setWebConfig] = useState<WebInterfaceConfig | null>(null);\n const [syncResult, setSyncResult] = useState<SyncSchemaResponse | null>(null);\n const [scenarioResult, setScenarioResult] = useState<{ id: string; name?: string; success: boolean; duration: number; roles: string[]; error?: string } | null>(null);\n const [roleOverride, setRoleOverride] = useState<string[] | null>(null);\n const [installStatus, setInstallStatus] = useState<string | null>(null);\n const [authRefreshUrl, setAuthRefreshUrl] = useState<string | null>(null);\n const runnerRef = useRef<DevRunner | null>(null);\n const proxyRef = useRef<DevProxy | null>(null);\n const tableWatcherCleanupRef = useRef<() => void>(() => {});\n const mountedRef = useRef(true);\n\n const devServer = useDevServer();\n\n const cleanupTableWatchers = useCallback(() => {\n tableWatcherCleanupRef.current();\n tableWatcherCleanupRef.current = () => {};\n }, []);\n\n const setupTableWatchers = useCallback((config: AppConfig) => {\n cleanupTableWatchers();\n tableWatcherCleanupRef.current = watchTableFiles(\n config.tables,\n process.cwd(),\n () => { resyncRef.current?.(); },\n );\n }, [cleanupTableWatchers]);\n\n // Detect web interface config on mount\n useEffect(() => {\n const config = getWebInterfaceConfig(appConfig);\n setWebConfig(config);\n\n if (config?.devPort) {\n setDevPort(config.devPort);\n setPhase('ready');\n } else if (\n !appConfig.interfaces.some(\n (i) => i.type === 'web' && i.enabled !== false,\n )\n ) {\n // No web interface at all — backend-only mode\n setDevPort(null);\n setPhase('ready');\n } else {\n // Web interface exists but no devPort configured\n setPhase('needs_port');\n }\n }, [appConfig]);\n\n // Listen for session expiry and auth refresh\n useEffect(() => {\n const unsubExpired = devRequestEvents.onSessionExpired(() => {\n if (mountedRef.current) {\n setPhase('expired');\n setAuthRefreshUrl(null);\n runnerRef.current = null;\n }\n });\n const unsubAuthStart = devRequestEvents.onAuthRefreshStart((url) => {\n if (mountedRef.current) {\n setAuthRefreshUrl(url);\n }\n });\n const unsubAuthSuccess = devRequestEvents.onAuthRefreshSuccess(() => {\n if (mountedRef.current) {\n setAuthRefreshUrl(null);\n }\n });\n const unsubAuthFailed = devRequestEvents.onAuthRefreshFailed(() => {\n if (mountedRef.current) {\n setAuthRefreshUrl(null);\n }\n });\n return () => { unsubExpired(); unsubAuthStart(); unsubAuthSuccess(); unsubAuthFailed(); };\n }, []);\n\n // Watch mindstudio.json for changes — restart session on edit\n useEffect(() => {\n const cleanup = watchConfigFile(process.cwd(), async () => {\n if (!mountedRef.current || phase !== 'running') return;\n // Stop current session, re-enter ready phase (auto-starts)\n cleanupTableWatchers();\n proxyRef.current?.stop();\n proxyRef.current = null;\n devServer.stop();\n if (runnerRef.current) {\n await runnerRef.current.stop().catch(() => {});\n runnerRef.current = null;\n }\n if (mountedRef.current) {\n setSession(null);\n setProxyPort(null);\n setSyncResult(null);\n setPhase('ready');\n }\n });\n return cleanup;\n }, [phase, devServer]);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cleanupTableWatchers();\n runnerRef.current?.stop().catch(() => {});\n proxyRef.current?.stop();\n devServer.stop();\n };\n }, []);\n\n const start = useCallback(\n async (port?: number) => {\n // Re-read mindstudio.json in case it changed (e.g., restart after edit)\n const currentConfig = detectAppConfig() ?? appConfig;\n const actualPort = port ?? devPort;\n\n if (!currentConfig.appId) {\n setPhase('error');\n return;\n }\n\n if (actualPort !== undefined && actualPort !== null) {\n setDevPort(actualPort);\n }\n\n setPhase('starting');\n setError(null);\n\n try {\n // Install dependencies if needed\n const dirsToInstall = findDirsNeedingInstall(currentConfig);\n for (const dir of dirsToInstall) {\n const dirName = dir.split('/').slice(-2).join('/');\n if (mountedRef.current) {\n setInstallStatus(`Installing dependencies in ${dirName}...`);\n }\n await runNpmInstall(dir);\n }\n if (mountedRef.current) {\n setInstallStatus(null);\n }\n\n // Start local dev server if we have a web interface and a port\n if (actualPort != null) {\n const webProjectDir = getWebProjectDir(currentConfig);\n if (webProjectDir) {\n const devCommand = webConfig?.devCommand ?? 'npm run dev';\n await devServer.start({\n command: devCommand,\n cwd: webProjectDir,\n port: actualPort,\n });\n }\n }\n\n // Start the platform session\n const branch = detectGitBranch();\n const proxyUrl = actualPort != null\n ? `http://localhost:${stablePort(currentConfig.appId!)}`\n : undefined;\n const runner = new DevRunner(\n currentConfig.appId,\n process.cwd(),\n {\n branch,\n proxyUrl,\n methods: currentConfig.methods.map((m) => ({ id: m.id, export: m.export, path: m.path })),\n },\n );\n runnerRef.current = runner;\n const devSession = await runner.start();\n\n // Sync table schema if the app has tables\n if (currentConfig.tables.length > 0) {\n try {\n const tableSources = readTableSources(currentConfig);\n if (tableSources.length > 0) {\n const result = await syncSchema(\n currentConfig.appId,\n devSession.sessionId,\n tableSources,\n );\n devSession.databases = result.databases;\n if (mountedRef.current) {\n setSyncResult(result);\n }\n }\n } catch {\n // Schema sync failure is non-fatal — session still works\n }\n }\n\n // Start the local proxy if we have a frontend port and client context\n if (actualPort != null && devSession.clientContext) {\n const proxy = new DevProxy(actualPort, devSession.clientContext);\n const preferredProxyPort = stablePort(currentConfig.appId!);\n const pPort = await proxy.start(preferredProxyPort);\n proxyRef.current = proxy;\n runner.setProxyUrl(`http://localhost:${pPort}`);\n runner.setProxy(proxy);\n if (mountedRef.current) {\n setProxyPort(pPort);\n }\n }\n\n // Watch table source directories for changes — auto-sync schema\n setupTableWatchers(currentConfig);\n\n if (mountedRef.current) {\n setSession(devSession);\n setPhase('running');\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(\n err instanceof Error ? err.message : 'Failed to start dev session',\n );\n setPhase('error');\n }\n }\n },\n [appConfig, devPort, webConfig, devServer, setupTableWatchers],\n );\n\n const stop = useCallback(async () => {\n cleanupTableWatchers();\n proxyRef.current?.stop();\n proxyRef.current = null;\n devServer.stop();\n if (runnerRef.current) {\n await runnerRef.current.stop().catch(() => {});\n runnerRef.current = null;\n }\n if (mountedRef.current) {\n setSession(null);\n setProxyPort(null);\n setPhase('stopped');\n }\n }, [devServer, cleanupTableWatchers]);\n\n // Ref to latest resync so table watchers don't capture a stale closure\n const resyncRef = useRef<() => Promise<void>>();\n\n const resync = useCallback(async () => {\n if (!session) return;\n const freshConfig = detectAppConfig() ?? appConfig;\n if (!freshConfig.appId) return;\n try {\n const tableSources = readTableSources(freshConfig);\n if (tableSources.length === 0) return;\n const result = await syncSchema(\n freshConfig.appId,\n session.sessionId,\n tableSources,\n );\n if (mountedRef.current) {\n setSyncResult(result);\n setSession((prev) =>\n prev ? { ...prev, databases: result.databases } : prev,\n );\n }\n } catch (err) {\n if (mountedRef.current) {\n setSyncResult({\n created: [],\n altered: [],\n errors: [err instanceof Error ? err.message : 'Sync failed'],\n databases: session.databases,\n });\n }\n }\n }, [appConfig, session]);\n resyncRef.current = resync;\n\n const setImpersonation = useCallback(async (roles: string[]) => {\n if (!runnerRef.current) return;\n await runnerRef.current.setImpersonation(roles);\n setRoleOverride(roles);\n }, []);\n\n const clearImpersonation = useCallback(async () => {\n if (!runnerRef.current) return;\n await runnerRef.current.clearImpersonation();\n setRoleOverride(null);\n }, []);\n\n const runScenario = useCallback(async (scenarioId: string) => {\n if (!runnerRef.current) return;\n const freshConfig = detectAppConfig() ?? appConfig;\n const scenario = freshConfig.scenarios.find((s) => s.id === scenarioId);\n if (!scenario) return;\n\n const result = await runnerRef.current.runScenario(scenario);\n if (mountedRef.current) {\n setSession((prev) =>\n prev ? { ...prev, databases: result.databases } : prev,\n );\n setScenarioResult({\n id: scenario.id,\n name: scenario.name,\n success: result.success,\n duration: 0, // filled by event listener if needed\n roles: scenario.roles,\n error: result.error,\n });\n }\n }, [appConfig]);\n\n const submitPort = useCallback(\n (port: number) => {\n setDevPort(port);\n setPhase('ready');\n },\n [],\n );\n\n const skipFrontend = useCallback(() => {\n setDevPort(null);\n setPhase('ready');\n }, []);\n\n return {\n phase,\n session,\n error,\n devPort,\n proxyPort,\n webConfig,\n devServer,\n syncResult,\n scenarioResult,\n roleOverride,\n installStatus,\n authRefreshUrl,\n start,\n stop,\n resync,\n runScenario,\n setImpersonation,\n clearImpersonation,\n submitPort,\n skipFrontend,\n };\n}\n","// Hook that manages the local dev server subprocess.\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { spawn, type ChildProcess } from 'node:child_process';\n\nconst MAX_OUTPUT_LINES = 200;\nconst PORT_READY_TIMEOUT_MS = 30_000;\nconst PORT_CHECK_INTERVAL_MS = 500;\n\nexport type DevServerPhase =\n | 'idle'\n | 'starting'\n | 'running'\n | 'error';\n\nexport function useDevServer() {\n const [phase, setPhase] = useState<DevServerPhase>('idle');\n const [outputLines, setOutputLines] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n const processRef = useRef<ChildProcess | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n killProcess();\n };\n }, []);\n\n const appendOutput = useCallback((line: string) => {\n if (!mountedRef.current) return;\n setOutputLines((prev) => {\n const next = [...prev, line];\n return next.length > MAX_OUTPUT_LINES\n ? next.slice(next.length - MAX_OUTPUT_LINES)\n : next;\n });\n }, []);\n\n const killProcess = useCallback(() => {\n if (processRef.current) {\n processRef.current.kill('SIGTERM');\n const proc = processRef.current;\n setTimeout(() => {\n if (proc && !proc.killed) {\n proc.kill('SIGKILL');\n }\n }, 2000);\n processRef.current = null;\n }\n }, []);\n\n const start = useCallback(\n async (opts: {\n command: string;\n cwd: string;\n port: number;\n }): Promise<void> => {\n setPhase('starting');\n setError(null);\n setOutputLines([]);\n\n appendOutput(`$ ${opts.command}`);\n\n const proc = spawn(opts.command, [], {\n cwd: opts.cwd,\n shell: true,\n env: { ...process.env, FORCE_COLOR: '1' },\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n processRef.current = proc;\n\n const handleData = (data: Buffer) => {\n const lines = data.toString().split('\\n');\n for (const line of lines) {\n if (line.length > 0) {\n appendOutput(line);\n }\n }\n };\n\n proc.stdout?.on('data', handleData);\n proc.stderr?.on('data', handleData);\n\n proc.on('close', (code) => {\n processRef.current = null;\n if (mountedRef.current && phase !== 'idle') {\n if (code !== 0 && code !== null) {\n setError(`Dev server exited with code ${code}`);\n setPhase('error');\n } else {\n setPhase('idle');\n }\n }\n });\n\n proc.on('error', (err) => {\n processRef.current = null;\n if (mountedRef.current) {\n setError(err.message);\n setPhase('error');\n }\n });\n\n // Wait for port to become available\n await waitForPort(opts.port, PORT_READY_TIMEOUT_MS);\n\n if (mountedRef.current && processRef.current) {\n setPhase('running');\n }\n },\n [appendOutput],\n );\n\n const stop = useCallback(() => {\n killProcess();\n if (mountedRef.current) {\n setPhase('idle');\n }\n }, [killProcess]);\n\n return {\n phase,\n outputLines,\n error,\n start,\n stop,\n };\n}\n\nasync function waitForPort(port: number, timeoutMs: number): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const response = await fetch(`http://localhost:${port}/`, {\n signal: AbortSignal.timeout(1000),\n });\n // Any response means the server is up\n return;\n } catch {\n // Not ready yet\n }\n await new Promise((resolve) => setTimeout(resolve, PORT_CHECK_INTERVAL_MS));\n }\n // Timeout is not fatal — the server might still be starting but we\n // proceed anyway. The proxy will return errors until it's ready.\n}\n","// Hook for tracking dev request events in the TUI.\n// Follows the same pattern as src/tui/models/hooks/useRequests.ts.\n\nimport { useState, useEffect, useRef } from 'react';\nimport { devRequestEvents } from '../../../dev/events';\nimport type { DevRequestLogEntry } from '../../../dev/types';\n\nconst MAX_HISTORY = 50;\n\nexport function useDevRequests() {\n const requestsRef = useRef<Map<string, DevRequestLogEntry>>(new Map());\n const [requests, setRequests] = useState<DevRequestLogEntry[]>([]);\n\n useEffect(() => {\n const unsubStart = devRequestEvents.onStart((event) => {\n const entry: DevRequestLogEntry = {\n id: event.id,\n type: event.type,\n method: event.method,\n status: 'processing',\n startTime: event.timestamp,\n };\n\n requestsRef.current.set(event.id, entry);\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n });\n\n const unsubComplete = devRequestEvents.onComplete((event) => {\n const existing = requestsRef.current.get(event.id);\n if (existing) {\n existing.status = event.success ? 'completed' : 'failed';\n existing.endTime = existing.startTime + event.duration;\n existing.duration = event.duration;\n existing.error = event.error;\n\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n }\n });\n\n return () => {\n unsubStart();\n unsubComplete();\n };\n }, []);\n\n // Periodic re-render to update elapsed time for active requests\n useEffect(() => {\n const hasActive = requests.some((r) => r.status === 'processing');\n if (!hasActive) return;\n\n const interval = setInterval(() => {\n setRequests(\n Array.from(requestsRef.current.values()).slice(-MAX_HISTORY),\n );\n }, 1000);\n\n return () => clearInterval(interval);\n }, [requests]);\n\n const activeCount = requests.filter(\n (r) => r.status === 'processing',\n ).length;\n\n return { requests, activeCount };\n}\n","declare const __APP_VERSION__: string;\n\nconst CDN_BASE_URL = 'https://f.mscdn.ai/local-model-tunnel';\n\nexport type InstallMethod = 'binary' | 'npm';\n\nexport function getInstallMethod(): InstallMethod {\n // Bun-compiled binaries embed the runtime — there's no node_modules or global npm prefix\n // Check if we're running from a standalone binary (not inside a node_modules tree)\n const execPath = process.execPath;\n if (\n !execPath.includes('node_modules') &&\n !execPath.includes('node') &&\n !execPath.includes('bun')\n ) {\n return 'binary';\n }\n return 'npm';\n}\n\nexport function getCurrentVersion(): string {\n return __APP_VERSION__;\n}\n\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const res = await fetch(\n 'https://registry.npmjs.org/@mindstudio-ai/local-model-tunnel/latest',\n { signal: AbortSignal.timeout(5000) },\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewerVersion(current: string, latest: string): boolean {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const c = currentParts[i] ?? 0;\n const l = latestParts[i] ?? 0;\n if (l > c) return true;\n if (l < c) return false;\n }\n return false;\n}\n\nexport function getBinaryDownloadUrl(): string {\n const platformMap: Record<string, string> = {\n darwin: 'darwin',\n linux: 'linux',\n win32: 'windows',\n };\n const platform = platformMap[process.platform] ?? 'linux';\n const arch = process.arch === 'arm64' ? 'arm64' : 'x64';\n const ext = process.platform === 'win32' ? '.exe' : '';\n return `${CDN_BASE_URL}/latest/mindstudio-local-${platform}-${arch}${ext}`;\n}\n\nexport async function checkForUpdate(): Promise<{\n currentVersion: string;\n latestVersion: string;\n} | null> {\n const currentVersion = getCurrentVersion();\n const latestVersion = await fetchLatestVersion();\n if (!latestVersion) return null;\n if (!isNewerVersion(currentVersion, latestVersion)) return null;\n return { currentVersion, latestVersion };\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport chalk from 'chalk';\nimport { LogoString } from './Header';\n\nconst SHIMMER_SPEED = 35;\n\nfunction useShimmerLogo(): string {\n const [frame, setFrame] = useState(0);\n\n const lines = useMemo(() => LogoString.split('\\n'), []);\n const totalChars = useMemo(() => {\n let count = 0;\n for (const line of lines) {\n for (const ch of line) {\n if (ch !== ' ' && ch !== '\\t') count++;\n }\n }\n return count;\n }, [lines]);\n\n const cycleLength = totalChars + 40;\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % cycleLength);\n }, SHIMMER_SPEED);\n return () => clearInterval(interval);\n }, [cycleLength]);\n\n return useMemo(() => {\n const sweepPos = frame;\n const holdEnd = totalChars + 20;\n\n let charIdx = 0;\n return lines\n .map((line) => {\n let result = '';\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === ' ' || ch === '\\t') {\n result += ch;\n continue;\n }\n\n let brightness: number;\n if (sweepPos <= totalChars) {\n const lag = charIdx;\n const t = sweepPos - lag;\n brightness = t <= 0 ? 0.1 : Math.min(1, t / 8);\n } else if (sweepPos <= holdEnd) {\n brightness = 1;\n } else {\n const fadeProgress = (sweepPos - holdEnd) / (cycleLength - holdEnd);\n brightness = Math.max(0.1, 1 - fadeProgress);\n }\n\n if (brightness >= 0.9) {\n result += chalk.cyanBright.bold(ch);\n } else if (brightness >= 0.6) {\n result += chalk.cyan(ch);\n } else if (brightness >= 0.3) {\n result += chalk.rgb(0, 100, 120)(ch);\n } else {\n result += chalk.rgb(0, 50, 60)(ch);\n }\n\n charIdx++;\n }\n return result;\n })\n .join('\\n');\n }, [frame, lines, totalChars, cycleLength]);\n}\n\ninterface UpdatePromptProps {\n currentVersion: string;\n latestVersion: string;\n onChoice: (shouldUpdate: boolean) => void;\n}\n\nexport function UpdatePrompt({\n currentVersion,\n latestVersion,\n onChoice,\n}: UpdatePromptProps) {\n const { stdout } = useStdout();\n const shimmerLogo = useShimmerLogo();\n\n useInput(() => {\n onChoice(true);\n });\n\n const termHeight = (stdout?.rows ?? 24) - 4;\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box flexGrow={1} />\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text>{shimmerLogo}</Text>\n\n <Box flexDirection=\"column\" alignItems=\"center\" marginTop={2}>\n <Text bold color=\"white\">\n MindStudio Local Tunnel\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"gray\">\n Update required {'\\u2022'} v{currentVersion} {'\\u2192'} v\n {latestVersion}\n </Text>\n <Box marginTop={1}>\n <Text color=\"cyan\" bold>\n Press any key to update\n </Text>\n </Box>\n </Box>\n </Box>\n\n <Box flexGrow={1} />\n </Box>\n );\n}\n"],"mappings":"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","names":["execSync","useEffect","useCallback","useState","useRef","Box","useStdout","useState","useEffect","useState","useEffect","useState","useEffect","useCallback","useState","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useCallback","useRef","useState","useRef","useEffect","useCallback","useState","useEffect","useCallback","useState","useCallback","useEffect","useMemo","Box","Text","useStdout","Spinner","Box","Text","jsx","jsxs","useState","useEffect","Box","Text","useStdout","jsx","jsxs","jsx","jsxs","useStdout","useMemo","Box","Text","Spinner","useState","useMemo","useEffect","Box","Text","useInput","useStdout","Spinner","useMemo","Text","useStdout","chalk","jsx","Fragment","jsx","jsxs","useState","useStdout","useMemo","useInput","Box","Text","useEffect","Spinner","useState","useMemo","useEffect","useRef","Box","Text","useInput","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useState","useEffect","Box","Text","useInput","os","Fragment","jsx","jsxs","useState","useMemo","useRef","useEffect","Box","Text","useInput","useStdout","os","open","Spinner","jsx","jsxs","jsx","jsxs","useInput","Box","Text","useState","useEffect","useMemo","useRef","useEffect","useCallback","useState","useMemo","Box","Text","useInput","Spinner","chalk","useState","useCallback","useRef","useEffect","open","useState","useRef","useEffect","useCallback","open","Fragment","jsx","jsxs","useState","useMemo","useEffect","chalk","useCallback","useInput","Box","Text","Spinner","useState","useEffect","useMemo","Box","Text","useInput","Spinner","Box","Text","Spinner","jsx","jsxs","useState","Box","Text","jsx","jsxs","Box","Text","useStdout","jsx","jsxs","useState","useEffect","useRef","useCallback","spawn","useState","useCallback","useRef","useEffect","spawn","MAX_OUTPUT_LINES","spawn","useRef","useState","useCallback","useEffect","useState","useEffect","useRef","useRef","useState","useEffect","jsx","jsxs","useState","useMemo","useInput","useEffect","Box","Text","Spinner","Fragment","jsx","jsxs","useStdout","useState","useRef","useEffect","useCallback","Box","useState","useEffect","useMemo","Box","Text","useInput","useStdout","chalk","jsx","jsxs","SHIMMER_SPEED","useShimmerLogo","useState","useMemo","useEffect","chalk","useStdout","useInput","Box","Text","jsx","execSync"]}