diff --git a/src/components/LogoV2/AnimatedAsterisk.tsx b/src/components/LogoV2/AnimatedAsterisk.tsx index 116f9083..7fb9c8c0 100644 --- a/src/components/LogoV2/AnimatedAsterisk.tsx +++ b/src/components/LogoV2/AnimatedAsterisk.tsx @@ -20,7 +20,9 @@ export function AnimatedAsterisk({ // Read prefersReducedMotion once at mount — no useSettings() subscription, // since that would re-render whenever settings change. const [reducedMotion] = useState(() => getInitialSettings().prefersReducedMotion ?? false); - const [done, setDone] = useState(reducedMotion); + // Skip animation on Windows — 60 re-renders in 3s competes with stdin processing + // and causes keyboard freeze on CMD/PowerShell (issues #228, #205). + const [done, setDone] = useState(reducedMotion || process.platform === 'win32'); // useAnimationFrame's clock is shared — capture our start offset so the // sweep always begins at hue 0 regardless of when we mount. const startTimeRef = useRef(null); diff --git a/src/entrypoints/cli.tsx b/src/entrypoints/cli.tsx index c82a0bb2..39614f19 100644 --- a/src/entrypoints/cli.tsx +++ b/src/entrypoints/cli.tsx @@ -416,7 +416,7 @@ async function main(): Promise { } // No special flags detected, load and run the full CLI - if (process.env.OPENCLAUDE_ENABLE_EARLY_INPUT === '1') { + if (process.env.OPENCLAUDE_DISABLE_EARLY_INPUT !== '1') { const { startCapturingEarlyInput } = await import('../utils/earlyInput.js'); diff --git a/src/ink/components/App.tsx b/src/ink/components/App.tsx index 7651423a..c75dec7e 100644 --- a/src/ink/components/App.tsx +++ b/src/ink/components/App.tsx @@ -229,12 +229,12 @@ export default class App extends PureComponent { stopCapturingEarlyInput(); stdin.ref(); stdin.setRawMode(true); - stdin.resume(); if (this.stdinMode === 'data') { stdin.addListener('data', this.handleDataChunk); } else { stdin.addListener('readable', this.handleReadable); } + stdin.resume(); // Enable bracketed paste mode this.props.stdout.write(EBP); // Enable terminal focus reporting (DECSET 1004)