Files
claude-code/src/commands/session/session.tsx
claude-code-best 5b1a52b8e0 更新大量 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>
2026-04-04 23:24:27 +08:00

84 lines
2.3 KiB
TypeScript

import { toString as qrToString } from 'qrcode'
import * as React from 'react'
import { useEffect, useState } from 'react'
import { Pane } from '../../components/design-system/Pane.js'
import { Box, Text } from '../../ink.js'
import { useKeybinding } from '../../keybindings/useKeybinding.js'
import { useAppState } from '../../state/AppState.js'
import type { LocalJSXCommandCall } from '../../types/command.js'
import { logForDebugging } from '../../utils/debug.js'
type Props = {
onDone: () => void
}
function SessionInfo({ onDone }: Props): React.ReactNode {
const remoteSessionUrl = useAppState(s => s.remoteSessionUrl)
const [qrCode, setQrCode] = useState<string>('')
// Generate QR code when URL is available
useEffect(() => {
if (!remoteSessionUrl) return
const url = remoteSessionUrl
async function generateQRCode(): Promise<void> {
const qr = await qrToString(url, {
type: 'utf8',
errorCorrectionLevel: 'L',
})
setQrCode(qr)
}
// Intentionally silent fail - URL is still shown so QR is non-critical
generateQRCode().catch(e => {
logForDebugging('QR code generation failed', e)
})
}, [remoteSessionUrl])
// Handle ESC to dismiss
useKeybinding('confirm:no', onDone, { context: 'Confirmation' })
// Not in remote mode
if (!remoteSessionUrl) {
return (
<Pane>
<Text color="warning">
Not in remote mode. Start with `claude --remote` to use this command.
</Text>
<Text dimColor>(press esc to close)</Text>
</Pane>
)
}
const lines = qrCode.split('\n').filter(line => line.length > 0)
const isLoading = lines.length === 0
return (
<Pane>
<Box marginBottom={1}>
<Text bold>Remote session</Text>
</Box>
{/* QR Code - silently fails if generation errors, URL is still shown */}
{isLoading ? (
<Text dimColor>Generating QR code</Text>
) : (
lines.map((line, i) => <Text key={i}>{line}</Text>)
)}
{/* URL */}
<Box marginTop={1}>
<Text dimColor>Open in browser: </Text>
<Text color="ide">{remoteSessionUrl}</Text>
</Box>
<Box marginTop={1}>
<Text dimColor>(press esc to close)</Text>
</Box>
</Pane>
)
}
export const call: LocalJSXCommandCall = async onDone => {
return <SessionInfo onDone={onDone} />
}