mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-18 22:35:51 +00:00
更新大量 tsx 原始文件; 已经迁移 login panel; 部分 (#121)
* style(B1-1): 格式化 ink/buddy/cli/context/screens/tasks/services/keybindings/state (43 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 修复了 Box.tsx 和 ScrollBox.tsx 中无效的 global.d.ts import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-2): 格式化 commands (79 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-3): 格式化 components/messages,permissions,mcp,sandbox,shell (104 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-4): 格式化 components/PromptInput,FeedbackSurvey,tasks,agents,skills,design-system,wizard (73 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-5): 格式化 components其余 + hooks + tools (232 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(B1-6): 格式化 main/entrypoints/utils/moreright (21 files) 纯格式化:移除分号、React Compiler import、import 多行展开。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 更新 README,新增 Run.ps1/TODO.md,删除 V6.md - README.md: 大幅重写,更详细版本历史和配置示例 - Run.ps1: 新增 Windows 启动脚本 - TODO.md: 新增包完成清单 - V6.md: 删除(架构重构规划已不适用) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复以前的问题 * fix: 修复 login 面板的问题 --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,139 +1,122 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import figures from 'figures';
|
||||
import * as React from 'react';
|
||||
import { useState } from 'react';
|
||||
import type { Root } from '../ink.js';
|
||||
import { Box, Text, useAnimationFrame } from '../ink.js';
|
||||
import { AppStateProvider } from '../state/AppState.js';
|
||||
import { checkOutTeleportedSessionBranch, processMessagesForTeleportResume, type TeleportProgressStep, type TeleportResult, teleportResumeCodeSession } from '../utils/teleport.js';
|
||||
import figures from 'figures'
|
||||
import * as React from 'react'
|
||||
import { useState } from 'react'
|
||||
import type { Root } from '../ink.js'
|
||||
import { Box, Text, useAnimationFrame } from '../ink.js'
|
||||
import { AppStateProvider } from '../state/AppState.js'
|
||||
import {
|
||||
checkOutTeleportedSessionBranch,
|
||||
processMessagesForTeleportResume,
|
||||
type TeleportProgressStep,
|
||||
type TeleportResult,
|
||||
teleportResumeCodeSession,
|
||||
} from '../utils/teleport.js'
|
||||
|
||||
type Props = {
|
||||
currentStep: TeleportProgressStep;
|
||||
sessionId?: string;
|
||||
};
|
||||
const SPINNER_FRAMES = ['◐', '◓', '◑', '◒'];
|
||||
const STEPS: {
|
||||
key: TeleportProgressStep;
|
||||
label: string;
|
||||
}[] = [{
|
||||
key: 'validating',
|
||||
label: 'Validating session'
|
||||
}, {
|
||||
key: 'fetching_logs',
|
||||
label: 'Fetching session logs'
|
||||
}, {
|
||||
key: 'fetching_branch',
|
||||
label: 'Getting branch info'
|
||||
}, {
|
||||
key: 'checking_out',
|
||||
label: 'Checking out branch'
|
||||
}];
|
||||
export function TeleportProgress(t0) {
|
||||
const $ = _c(16);
|
||||
const {
|
||||
currentStep,
|
||||
sessionId
|
||||
} = t0;
|
||||
const [ref, time] = useAnimationFrame(100);
|
||||
const frame = Math.floor(time / 100) % SPINNER_FRAMES.length;
|
||||
let t1;
|
||||
if ($[0] !== currentStep) {
|
||||
t1 = s => s.key === currentStep;
|
||||
$[0] = currentStep;
|
||||
$[1] = t1;
|
||||
} else {
|
||||
t1 = $[1];
|
||||
}
|
||||
const currentStepIndex = STEPS.findIndex(t1);
|
||||
const t2 = SPINNER_FRAMES[frame];
|
||||
let t3;
|
||||
if ($[2] !== t2) {
|
||||
t3 = <Box marginBottom={1}><Text bold={true} color="claude">{t2} Teleporting session…</Text></Box>;
|
||||
$[2] = t2;
|
||||
$[3] = t3;
|
||||
} else {
|
||||
t3 = $[3];
|
||||
}
|
||||
let t4;
|
||||
if ($[4] !== sessionId) {
|
||||
t4 = sessionId && <Box marginBottom={1}><Text dimColor={true}>{sessionId}</Text></Box>;
|
||||
$[4] = sessionId;
|
||||
$[5] = t4;
|
||||
} else {
|
||||
t4 = $[5];
|
||||
}
|
||||
let t5;
|
||||
if ($[6] !== currentStepIndex || $[7] !== frame) {
|
||||
t5 = STEPS.map((step, index) => {
|
||||
const isComplete = index < currentStepIndex;
|
||||
const isCurrent = index === currentStepIndex;
|
||||
const isPending = index > currentStepIndex;
|
||||
let icon;
|
||||
let color;
|
||||
if (isComplete) {
|
||||
icon = figures.tick;
|
||||
color = "green";
|
||||
} else {
|
||||
if (isCurrent) {
|
||||
icon = SPINNER_FRAMES[frame];
|
||||
color = "claude";
|
||||
} else {
|
||||
icon = figures.circle;
|
||||
color = undefined;
|
||||
}
|
||||
}
|
||||
return <Box key={step.key} flexDirection="row"><Box width={2}><Text color={color as never} dimColor={isPending}>{icon}</Text></Box><Text dimColor={isPending} bold={isCurrent}>{step.label}</Text></Box>;
|
||||
});
|
||||
$[6] = currentStepIndex;
|
||||
$[7] = frame;
|
||||
$[8] = t5;
|
||||
} else {
|
||||
t5 = $[8];
|
||||
}
|
||||
let t6;
|
||||
if ($[9] !== t5) {
|
||||
t6 = <Box flexDirection="column" marginLeft={2}>{t5}</Box>;
|
||||
$[9] = t5;
|
||||
$[10] = t6;
|
||||
} else {
|
||||
t6 = $[10];
|
||||
}
|
||||
let t7;
|
||||
if ($[11] !== ref || $[12] !== t3 || $[13] !== t4 || $[14] !== t6) {
|
||||
t7 = <Box ref={ref} flexDirection="column" paddingX={1} paddingY={1}>{t3}{t4}{t6}</Box>;
|
||||
$[11] = ref;
|
||||
$[12] = t3;
|
||||
$[13] = t4;
|
||||
$[14] = t6;
|
||||
$[15] = t7;
|
||||
} else {
|
||||
t7 = $[15];
|
||||
}
|
||||
return t7;
|
||||
currentStep: TeleportProgressStep
|
||||
sessionId?: string
|
||||
}
|
||||
|
||||
const SPINNER_FRAMES = ['◐', '◓', '◑', '◒']
|
||||
|
||||
const STEPS: { key: TeleportProgressStep; label: string }[] = [
|
||||
{ key: 'validating', label: 'Validating session' },
|
||||
{ key: 'fetching_logs', label: 'Fetching session logs' },
|
||||
{ key: 'fetching_branch', label: 'Getting branch info' },
|
||||
{ key: 'checking_out', label: 'Checking out branch' },
|
||||
]
|
||||
|
||||
export function TeleportProgress({
|
||||
currentStep,
|
||||
sessionId,
|
||||
}: Props): React.ReactNode {
|
||||
const [ref, time] = useAnimationFrame(100)
|
||||
const frame = Math.floor(time / 100) % SPINNER_FRAMES.length
|
||||
|
||||
const currentStepIndex = STEPS.findIndex(s => s.key === currentStep)
|
||||
|
||||
return (
|
||||
<Box ref={ref} flexDirection="column" paddingX={1} paddingY={1}>
|
||||
<Box marginBottom={1}>
|
||||
<Text bold color="claude">
|
||||
{SPINNER_FRAMES[frame]} Teleporting session…
|
||||
</Text>
|
||||
</Box>
|
||||
|
||||
{sessionId && (
|
||||
<Box marginBottom={1}>
|
||||
<Text dimColor>{sessionId}</Text>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
<Box flexDirection="column" marginLeft={2}>
|
||||
{STEPS.map((step, index) => {
|
||||
const isComplete = index < currentStepIndex
|
||||
const isCurrent = index === currentStepIndex
|
||||
const isPending = index > currentStepIndex
|
||||
|
||||
let icon: string
|
||||
let color: string | undefined
|
||||
|
||||
if (isComplete) {
|
||||
icon = figures.tick
|
||||
color = 'green'
|
||||
} else if (isCurrent) {
|
||||
icon = SPINNER_FRAMES[frame]!
|
||||
color = 'claude'
|
||||
} else {
|
||||
icon = figures.circle
|
||||
color = undefined
|
||||
}
|
||||
|
||||
return (
|
||||
<Box key={step.key} flexDirection="row">
|
||||
<Box width={2}>
|
||||
<Text color={color as never} dimColor={isPending}>
|
||||
{icon}
|
||||
</Text>
|
||||
</Box>
|
||||
<Text dimColor={isPending} bold={isCurrent}>
|
||||
{step.label}
|
||||
</Text>
|
||||
</Box>
|
||||
)
|
||||
})}
|
||||
</Box>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Teleports to a remote session with progress UI rendered into the existing root.
|
||||
* Fetches the session, checks out the branch, and returns the result.
|
||||
*/
|
||||
export async function teleportWithProgress(root: Root, sessionId: string): Promise<TeleportResult> {
|
||||
export async function teleportWithProgress(
|
||||
root: Root,
|
||||
sessionId: string,
|
||||
): Promise<TeleportResult> {
|
||||
// Capture the setState function from the rendered component
|
||||
let setStep: (step: TeleportProgressStep) => void = () => {};
|
||||
let setStep: (step: TeleportProgressStep) => void = () => {}
|
||||
|
||||
function TeleportProgressWrapper(): React.ReactNode {
|
||||
const [step, _setStep] = useState<TeleportProgressStep>('validating');
|
||||
setStep = _setStep;
|
||||
return <TeleportProgress currentStep={step} sessionId={sessionId} />;
|
||||
const [step, _setStep] = useState<TeleportProgressStep>('validating')
|
||||
setStep = _setStep
|
||||
return <TeleportProgress currentStep={step} sessionId={sessionId} />
|
||||
}
|
||||
root.render(<AppStateProvider>
|
||||
|
||||
root.render(
|
||||
<AppStateProvider>
|
||||
<TeleportProgressWrapper />
|
||||
</AppStateProvider>);
|
||||
const result = await teleportResumeCodeSession(sessionId, setStep);
|
||||
setStep('checking_out');
|
||||
const {
|
||||
branchName,
|
||||
branchError
|
||||
} = await checkOutTeleportedSessionBranch(result.branch);
|
||||
</AppStateProvider>,
|
||||
)
|
||||
|
||||
const result = await teleportResumeCodeSession(sessionId, setStep)
|
||||
setStep('checking_out')
|
||||
const { branchName, branchError } = await checkOutTeleportedSessionBranch(
|
||||
result.branch,
|
||||
)
|
||||
return {
|
||||
messages: processMessagesForTeleportResume(result.log, branchError),
|
||||
branchName
|
||||
};
|
||||
branchName,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user