/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import { Box, Text, useInput } from 'ink'; import type { LlxprtExtension } from '@vybestack/llxprt-code-core'; import { performWorkspaceExtensionMigration } from '../../config/extension.js'; import { RadioButtonSelect } from './shared/RadioButtonSelect.js'; import { Colors } from '../colors.js'; import { useState, useCallback } from 'react'; import { getBorderStyle } from '../contexts/UnicodeRenderingContext.js'; interface MigrationCompleteContentProps { failedExtensions: string[]; } function MigrationCompleteContent({ failedExtensions, }: MigrationCompleteContentProps) { if (failedExtensions.length > 0) { return ( <> The following extensions failed to migrate. Please try installing them manually. To see other changes, LLxprt Code must be restarted. Press {"'q'"} to quit. {failedExtensions.map((failed) => ( - {failed} ))} ); } return ( Migration complete. To see changes, LLxprt Code must be restarted. Press {"'q'"} to quit. ); } interface ExtensionListProps { workspaceExtensions: LlxprtExtension[]; } function ExtensionList({ workspaceExtensions }: ExtensionListProps) { return ( {workspaceExtensions.map((extension) => ( - {extension.name} ))} ); } interface MigrationPromptProps { workspaceExtensions: LlxprtExtension[]; onSelect: (value: string) => void; } function MigrationPrompt({ workspaceExtensions, onSelect, }: MigrationPromptProps) { return ( Workspace-level extensions are deprecated{'\n'} Would you like to install them at the user level? The extension definition will remain in your workspace directory. If you opt to skip, you can install them manually using the extensions install command. ); } export function WorkspaceMigrationDialog(props: { workspaceExtensions: LlxprtExtension[]; onOpen: () => void; onClose: () => void; }) { const { workspaceExtensions, onOpen, onClose } = props; const [migrationComplete, setMigrationComplete] = useState(false); const [failedExtensions, setFailedExtensions] = useState([]); onOpen(); const onMigrate = useCallback(async () => { const failed = await performWorkspaceExtensionMigration( workspaceExtensions, async (_) => true, ); setFailedExtensions(failed); setMigrationComplete(true); }, [workspaceExtensions]); const handleSelect = useCallback( (value: string) => { if (value === 'migrate') { void onMigrate(); } else { onClose(); } }, [onMigrate, onClose], ); useInput((input) => { if (migrationComplete && input === 'q') { process.exit(0); } }); if (migrationComplete) { return ( ); } return ( ); }