mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 13:55:50 +00:00
* feat: 适配 zed acp 协议 * docs: 完善 acp 文档 * feat: integrate feature branches + daemon/job 命令层级化 + 跨平台后台引擎 Cherry-picked from origin/lint/preview (637c908), excluding lint-only changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: correct detectMimeFromBase64 to decode raw bytes from base64 Cherry-picked from origin/lint/preview (ee36954). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: daemon 子进程 spawn 跨平台修复 + CliLaunchSpec 集中化重构 Cherry-picked from origin/lint/preview (c5f52cd), excluding lint-only formatting changes. - 新建 src/utils/cliLaunch.ts: 集中化 CLI 子进程启动层 - 修复 --daemon-worker=kind 等号格式解析 - 修复 daemon/bg fast path 缺少 setShellIfWindows() - 修复 checkPathExists 用 existsSync 替代 execSync('dir') - 7 个 spawn 站点迁移到 CliLaunchSpec Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
55 lines
1.9 KiB
TypeScript
55 lines
1.9 KiB
TypeScript
import * as React from 'react';
|
|
import { useState } from 'react';
|
|
import { Box, Text } from '@anthropic/ink';
|
|
import { Dialog } from '../components/design-system/Dialog.js';
|
|
import { ListItem } from '../components/design-system/ListItem.js';
|
|
import { useRegisterOverlay } from '../context/overlayContext.js';
|
|
import { useKeybindings } from '../keybindings/useKeybinding.js';
|
|
import type { AssistantSession } from './sessionDiscovery.js';
|
|
|
|
interface Props {
|
|
sessions: AssistantSession[];
|
|
onSelect: (id: string) => void;
|
|
onCancel: () => void;
|
|
}
|
|
|
|
/**
|
|
* Interactive session chooser for `claude assistant` when multiple
|
|
* CCR sessions are discovered. Renders a Dialog with up/down navigation.
|
|
*
|
|
* Session IDs are in `session_*` compat format — passed directly to
|
|
* createRemoteSessionConfig() for viewer attach.
|
|
*/
|
|
export function AssistantSessionChooser({ sessions, onSelect, onCancel }: Props): React.ReactNode {
|
|
useRegisterOverlay('assistant-session-chooser');
|
|
const [focusIndex, setFocusIndex] = useState(0);
|
|
|
|
useKeybindings(
|
|
{
|
|
'select:next': () => setFocusIndex(i => (i + 1) % sessions.length),
|
|
'select:previous': () => setFocusIndex(i => (i - 1 + sessions.length) % sessions.length),
|
|
'select:accept': () => onSelect(sessions[focusIndex]!.id),
|
|
},
|
|
{ context: 'Select' },
|
|
);
|
|
|
|
return (
|
|
<Dialog title="Select Assistant Session" onCancel={onCancel} hideInputGuide>
|
|
<Box flexDirection="column" gap={1}>
|
|
<Text>Multiple sessions found. Select one to attach:</Text>
|
|
<Box flexDirection="column">
|
|
{sessions.map((s, i) => (
|
|
<ListItem key={s.id} isFocused={focusIndex === i}>
|
|
<Box>
|
|
<Text>{s.title || s.id.slice(0, 20)}</Text>
|
|
<Text dimColor> [{s.status}]</Text>
|
|
</Box>
|
|
</ListItem>
|
|
))}
|
|
</Box>
|
|
<Text dimColor>↑↓ navigate · Enter select · Esc cancel</Text>
|
|
</Box>
|
|
</Dialog>
|
|
);
|
|
}
|