更新大量 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:
claude-code-best
2026-04-04 23:24:27 +08:00
committed by GitHub
parent 02694918b5
commit 5b1a52b8e0
559 changed files with 103807 additions and 101817 deletions

View File

@@ -1,397 +1,247 @@
import { c as _c } from "react/compiler-runtime";
import React, { useEffect, useMemo } from 'react';
import type { CommandResultDisplay } from '../../commands.js';
import { ClaudeAuthProvider } from '../../services/mcp/auth.js';
import type { McpClaudeAIProxyServerConfig, McpHTTPServerConfig, McpSSEServerConfig, McpStdioServerConfig } from '../../services/mcp/types.js';
import { extractAgentMcpServers, filterToolsByServer } from '../../services/mcp/utils.js';
import { useAppState } from '../../state/AppState.js';
import { getSessionIngressAuthToken } from '../../utils/sessionIngressAuth.js';
import { MCPAgentServerMenu } from './MCPAgentServerMenu.js';
import { MCPListPanel } from './MCPListPanel.js';
import { MCPRemoteServerMenu } from './MCPRemoteServerMenu.js';
import { MCPStdioServerMenu } from './MCPStdioServerMenu.js';
import { MCPToolDetailView } from './MCPToolDetailView.js';
import { MCPToolListView } from './MCPToolListView.js';
import type { AgentMcpServerInfo, MCPViewState, ServerInfo } from './types.js';
import React, { useEffect, useMemo } from 'react'
import type { CommandResultDisplay } from '../../commands.js'
import { ClaudeAuthProvider } from '../../services/mcp/auth.js'
import type {
McpClaudeAIProxyServerConfig,
McpHTTPServerConfig,
McpSSEServerConfig,
McpStdioServerConfig,
} from '../../services/mcp/types.js'
import {
extractAgentMcpServers,
filterToolsByServer,
} from '../../services/mcp/utils.js'
import { useAppState } from '../../state/AppState.js'
import { getSessionIngressAuthToken } from '../../utils/sessionIngressAuth.js'
import { MCPAgentServerMenu } from './MCPAgentServerMenu.js'
import { MCPListPanel } from './MCPListPanel.js'
import { MCPRemoteServerMenu } from './MCPRemoteServerMenu.js'
import { MCPStdioServerMenu } from './MCPStdioServerMenu.js'
import { MCPToolDetailView } from './MCPToolDetailView.js'
import { MCPToolListView } from './MCPToolListView.js'
import type { AgentMcpServerInfo, MCPViewState, ServerInfo } from './types.js'
type Props = {
onComplete: (result?: string, options?: {
display?: CommandResultDisplay;
}) => void;
};
export function MCPSettings(t0) {
const $ = _c(66);
const {
onComplete
} = t0;
const mcp = useAppState(_temp);
const agentDefinitions = useAppState(_temp2);
const mcpClients = mcp.clients;
let t1;
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
t1 = {
type: "list"
};
$[0] = t1;
} else {
t1 = $[0];
}
const [viewState, setViewState] = React.useState(t1);
let t2;
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
t2 = [];
$[1] = t2;
} else {
t2 = $[1];
}
const [servers, setServers] = React.useState(t2);
let t3;
if ($[2] !== agentDefinitions.allAgents) {
t3 = extractAgentMcpServers(agentDefinitions.allAgents);
$[2] = agentDefinitions.allAgents;
$[3] = t3;
} else {
t3 = $[3];
}
const agentMcpServers = t3;
let t4;
if ($[4] !== mcpClients) {
t4 = mcpClients.filter(_temp3).sort(_temp4);
$[4] = mcpClients;
$[5] = t4;
} else {
t4 = $[5];
}
const filteredClients = t4;
let t5;
let t6;
if ($[6] !== filteredClients || $[7] !== mcp.tools) {
t5 = () => {
let cancelled = false;
const prepareServers = async function prepareServers() {
const serverInfos = await Promise.all(filteredClients.map(async client_0 => {
const scope = client_0.config.scope;
const isSSE = client_0.config.type === "sse";
const isHTTP = client_0.config.type === "http";
const isClaudeAIProxy = client_0.config.type === "claudeai-proxy";
let isAuthenticated = undefined;
onComplete: (
result?: string,
options?: { display?: CommandResultDisplay },
) => void
}
export function MCPSettings({ onComplete }: Props): React.ReactNode {
const mcp = useAppState(s => s.mcp)
const agentDefinitions = useAppState(s => s.agentDefinitions)
const mcpClients = mcp.clients
const [viewState, setViewState] = React.useState<MCPViewState>({
type: 'list',
})
const [servers, setServers] = React.useState<ServerInfo[]>([])
// Extract agent-specific MCP servers from agent definitions
const agentMcpServers = useMemo(
() => extractAgentMcpServers(agentDefinitions.allAgents),
[agentDefinitions.allAgents],
)
const filteredClients = React.useMemo(
() =>
mcpClients
.filter(client => client.name !== 'ide')
.sort((a, b) => a.name.localeCompare(b.name)),
[mcpClients],
)
React.useEffect(() => {
let cancelled = false
async function prepareServers() {
const serverInfos = await Promise.all(
filteredClients.map(async client => {
const scope = client.config.scope
const isSSE = client.config.type === 'sse'
const isHTTP = client.config.type === 'http'
const isClaudeAIProxy = client.config.type === 'claudeai-proxy'
let isAuthenticated: boolean | undefined = undefined
if (isSSE || isHTTP) {
const authProvider = new ClaudeAuthProvider(client_0.name, client_0.config as McpSSEServerConfig | McpHTTPServerConfig);
const tokens = await authProvider.tokens();
const hasSessionAuth = getSessionIngressAuthToken() !== null && client_0.type === "connected";
const hasToolsAndConnected = client_0.type === "connected" && filterToolsByServer(mcp.tools, client_0.name).length > 0;
isAuthenticated = Boolean(tokens) || hasSessionAuth || hasToolsAndConnected;
const authProvider = new ClaudeAuthProvider(
client.name,
client.config as McpSSEServerConfig | McpHTTPServerConfig,
)
const tokens = await authProvider.tokens()
// Server is authenticated if:
// 1. It has OAuth tokens, OR
// 2. It's connected via session auth (has session token and is connected), OR
// 3. It's connected and has tools (meaning it's working, regardless of auth method)
const hasSessionAuth =
getSessionIngressAuthToken() !== null &&
client.type === 'connected'
const hasToolsAndConnected =
client.type === 'connected' &&
filterToolsByServer(mcp.tools, client.name).length > 0
isAuthenticated =
Boolean(tokens) || hasSessionAuth || hasToolsAndConnected
}
const baseInfo = {
name: client_0.name,
client: client_0,
scope
};
name: client.name,
client,
scope,
}
if (isClaudeAIProxy) {
return {
...baseInfo,
transport: "claudeai-proxy" as const,
transport: 'claudeai-proxy' as const,
isAuthenticated: false,
config: client_0.config as McpClaudeAIProxyServerConfig
};
config: client.config as McpClaudeAIProxyServerConfig,
}
} else if (isSSE) {
return {
...baseInfo,
transport: 'sse' as const,
isAuthenticated,
config: client.config as McpSSEServerConfig,
}
} else if (isHTTP) {
return {
...baseInfo,
transport: 'http' as const,
isAuthenticated,
config: client.config as McpHTTPServerConfig,
}
} else {
if (isSSE) {
return {
...baseInfo,
transport: "sse" as const,
isAuthenticated,
config: client_0.config as McpSSEServerConfig
};
} else {
if (isHTTP) {
return {
...baseInfo,
transport: "http" as const,
isAuthenticated,
config: client_0.config as McpHTTPServerConfig
};
} else {
return {
...baseInfo,
transport: "stdio" as const,
config: client_0.config as McpStdioServerConfig
};
}
return {
...baseInfo,
transport: 'stdio' as const,
config: client.config as McpStdioServerConfig,
}
}
}));
if (cancelled) {
return;
}
setServers(serverInfos);
};
prepareServers();
return () => {
cancelled = true;
};
};
t6 = [filteredClients, mcp.tools];
$[6] = filteredClients;
$[7] = mcp.tools;
$[8] = t5;
$[9] = t6;
} else {
t5 = $[8];
t6 = $[9];
}
React.useEffect(t5, t6);
let t7;
let t8;
if ($[10] !== agentMcpServers.length || $[11] !== filteredClients.length || $[12] !== onComplete || $[13] !== servers.length) {
t7 = () => {
if (servers.length === 0 && filteredClients.length > 0) {
return;
}
if (servers.length === 0 && agentMcpServers.length === 0) {
onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `claude mcp --help` or visit https://code.claude.com/docs/en/mcp to learn more.");
}
};
t8 = [servers.length, filteredClients.length, agentMcpServers.length, onComplete];
$[10] = agentMcpServers.length;
$[11] = filteredClients.length;
$[12] = onComplete;
$[13] = servers.length;
$[14] = t7;
$[15] = t8;
} else {
t7 = $[14];
t8 = $[15];
}
useEffect(t7, t8);
}),
)
if (cancelled) return
setServers(serverInfos)
}
void prepareServers()
return () => {
cancelled = true
}
}, [filteredClients, mcp.tools])
useEffect(() => {
if (servers.length === 0 && filteredClients.length > 0) {
// Still loading
return
}
// Only show "no servers" message if no regular servers AND no agent servers
if (servers.length === 0 && agentMcpServers.length === 0) {
onComplete(
'No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `claude mcp --help` or visit https://code.claude.com/docs/en/mcp to learn more.',
)
}
}, [
servers.length,
filteredClients.length,
agentMcpServers.length,
onComplete,
])
switch (viewState.type) {
case "list":
{
let t10;
let t9;
if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
t9 = server => setViewState({
type: "server-menu",
server
});
t10 = agentServer => setViewState({
type: "agent-server-menu",
agentServer
});
$[16] = t10;
$[17] = t9;
} else {
t10 = $[16];
t9 = $[17];
}
let t11;
if ($[18] !== agentMcpServers || $[19] !== onComplete || $[20] !== servers || $[21] !== viewState.defaultTab) {
t11 = <MCPListPanel servers={servers} agentServers={agentMcpServers} onSelectServer={t9} onSelectAgentServer={t10} onComplete={onComplete} defaultTab={viewState.defaultTab} />;
$[18] = agentMcpServers;
$[19] = onComplete;
$[20] = servers;
$[21] = viewState.defaultTab;
$[22] = t11;
} else {
t11 = $[22];
}
return t11;
case 'list':
return (
<MCPListPanel
servers={servers}
agentServers={agentMcpServers}
onSelectServer={server =>
setViewState({ type: 'server-menu', server })
}
onSelectAgentServer={(agentServer: AgentMcpServerInfo) =>
setViewState({ type: 'agent-server-menu', agentServer })
}
onComplete={onComplete}
defaultTab={viewState.defaultTab}
/>
)
case 'server-menu': {
const serverTools = filterToolsByServer(mcp.tools, viewState.server.name)
const defaultTab =
viewState.server.transport === 'claudeai-proxy'
? 'claude.ai'
: 'Claude Code'
if (viewState.server.transport === 'stdio') {
return (
<MCPStdioServerMenu
server={viewState.server}
serverToolsCount={serverTools.length}
onViewTools={() =>
setViewState({ type: 'server-tools', server: viewState.server })
}
onCancel={() => setViewState({ type: 'list', defaultTab })}
onComplete={onComplete}
/>
)
} else {
return (
<MCPRemoteServerMenu
server={viewState.server}
serverToolsCount={serverTools.length}
onViewTools={() =>
setViewState({ type: 'server-tools', server: viewState.server })
}
onCancel={() => setViewState({ type: 'list', defaultTab })}
onComplete={onComplete}
/>
)
}
case "server-menu":
{
let t9;
if ($[23] !== mcp.tools || $[24] !== viewState.server.name) {
t9 = filterToolsByServer(mcp.tools, viewState.server.name);
$[23] = mcp.tools;
$[24] = viewState.server.name;
$[25] = t9;
} else {
t9 = $[25];
}
const serverTools_0 = t9;
const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "Claude Code";
if (viewState.server.transport === "stdio") {
let t10;
if ($[26] !== viewState.server) {
t10 = () => setViewState({
type: "server-tools",
server: viewState.server
});
$[26] = viewState.server;
$[27] = t10;
} else {
t10 = $[27];
}
case 'server-tools':
return (
<MCPToolListView
server={viewState.server}
onSelectTool={(_, index) =>
setViewState({
type: 'server-tool-detail',
server: viewState.server,
toolIndex: index,
})
}
let t11;
if ($[28] !== defaultTab) {
t11 = () => setViewState({
type: "list",
defaultTab
});
$[28] = defaultTab;
$[29] = t11;
} else {
t11 = $[29];
onBack={() =>
setViewState({ type: 'server-menu', server: viewState.server })
}
let t12;
if ($[30] !== onComplete || $[31] !== serverTools_0.length || $[32] !== t10 || $[33] !== t11 || $[34] !== viewState.server) {
t12 = <MCPStdioServerMenu server={viewState.server} serverToolsCount={serverTools_0.length} onViewTools={t10} onCancel={t11} onComplete={onComplete} />;
$[30] = onComplete;
$[31] = serverTools_0.length;
$[32] = t10;
$[33] = t11;
$[34] = viewState.server;
$[35] = t12;
} else {
t12 = $[35];
}
return t12;
} else {
let t10;
if ($[36] !== viewState.server) {
t10 = () => setViewState({
type: "server-tools",
server: viewState.server
});
$[36] = viewState.server;
$[37] = t10;
} else {
t10 = $[37];
}
let t11;
if ($[38] !== defaultTab) {
t11 = () => setViewState({
type: "list",
defaultTab
});
$[38] = defaultTab;
$[39] = t11;
} else {
t11 = $[39];
}
let t12;
if ($[40] !== onComplete || $[41] !== serverTools_0.length || $[42] !== t10 || $[43] !== t11 || $[44] !== viewState.server) {
t12 = <MCPRemoteServerMenu server={viewState.server} serverToolsCount={serverTools_0.length} onViewTools={t10} onCancel={t11} onComplete={onComplete} />;
$[40] = onComplete;
$[41] = serverTools_0.length;
$[42] = t10;
$[43] = t11;
$[44] = viewState.server;
$[45] = t12;
} else {
t12 = $[45];
}
return t12;
}
}
case "server-tools":
{
let t10;
let t9;
if ($[46] !== viewState.server) {
t9 = (_, index) => setViewState({
type: "server-tool-detail",
server: viewState.server,
toolIndex: index
});
t10 = () => setViewState({
type: "server-menu",
server: viewState.server
});
$[46] = viewState.server;
$[47] = t10;
$[48] = t9;
} else {
t10 = $[47];
t9 = $[48];
}
let t11;
if ($[49] !== t10 || $[50] !== t9 || $[51] !== viewState.server) {
t11 = <MCPToolListView server={viewState.server} onSelectTool={t9} onBack={t10} />;
$[49] = t10;
$[50] = t9;
$[51] = viewState.server;
$[52] = t11;
} else {
t11 = $[52];
}
return t11;
}
case "server-tool-detail":
{
let t9;
if ($[53] !== mcp.tools || $[54] !== viewState.server.name) {
t9 = filterToolsByServer(mcp.tools, viewState.server.name);
$[53] = mcp.tools;
$[54] = viewState.server.name;
$[55] = t9;
} else {
t9 = $[55];
}
const serverTools = t9;
const tool = serverTools[viewState.toolIndex];
if (!tool) {
setViewState({
type: "server-tools",
server: viewState.server
});
return null;
}
let t10;
if ($[56] !== viewState.server) {
t10 = () => setViewState({
type: "server-tools",
server: viewState.server
});
$[56] = viewState.server;
$[57] = t10;
} else {
t10 = $[57];
}
let t11;
if ($[58] !== t10 || $[59] !== tool || $[60] !== viewState.server) {
t11 = <MCPToolDetailView tool={tool} server={viewState.server} onBack={t10} />;
$[58] = t10;
$[59] = tool;
$[60] = viewState.server;
$[61] = t11;
} else {
t11 = $[61];
}
return t11;
}
case "agent-server-menu":
{
let t9;
if ($[62] === Symbol.for("react.memo_cache_sentinel")) {
t9 = () => setViewState({
type: "list",
defaultTab: "Agents"
});
$[62] = t9;
} else {
t9 = $[62];
}
let t10;
if ($[63] !== onComplete || $[64] !== viewState.agentServer) {
t10 = <MCPAgentServerMenu agentServer={viewState.agentServer} onCancel={t9} onComplete={onComplete} />;
$[63] = onComplete;
$[64] = viewState.agentServer;
$[65] = t10;
} else {
t10 = $[65];
}
return t10;
/>
)
case 'server-tool-detail': {
const serverTools = filterToolsByServer(mcp.tools, viewState.server.name)
const tool = serverTools[viewState.toolIndex]
if (!tool) {
setViewState({ type: 'server-tools', server: viewState.server })
return null
}
return (
<MCPToolDetailView
tool={tool}
server={viewState.server}
onBack={() =>
setViewState({ type: 'server-tools', server: viewState.server })
}
/>
)
}
case 'agent-server-menu':
return (
<MCPAgentServerMenu
agentServer={viewState.agentServer}
onCancel={() => setViewState({ type: 'list', defaultTab: 'Agents' })}
onComplete={onComplete}
/>
)
}
}
function _temp4(a, b) {
return a.name.localeCompare(b.name);
}
function _temp3(client) {
return client.name !== "ide";
}
function _temp2(s_0) {
return s_0.agentDefinitions;
}
function _temp(s) {
return s.mcp;
}