claude-code-source-recovery
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseClaude Code 2.1.88 Source Recovery
Claude Code 2.1.88 源代码恢复
What This Project Is
项目介绍
This repository contains the recovered TypeScript source code of version 2.1.88. On 2026-03-31, Anthropic accidentally published a (57MB) source map to npm that contained the full of the bundled CLI. After extraction and reconstruction, the result is ~700,000 lines of TypeScript source code organized into a readable directory structure.
@anthropic-ai/claude-codecli.js.mapsourcesContentThe project is useful for:
- Studying production CLI architecture patterns (Ink/React in terminal)
- Understanding how MCP (Model Context Protocol) is implemented in a real CLI
- Learning how Claude Code manages sessions, commands, authentication, and tool execution
本仓库包含恢复后的 2.1.88版本的TypeScript源代码。2026年3月31日,Anthropic意外将包含完整打包CLI的的57MB大小的源映射文件发布到了npm。经过提取和重构后,得到了约70万行TypeScript源代码,整理为易读的目录结构。
@anthropic-ai/claude-codesourcesContentcli.js.map该项目适用于:
- 学习生产级CLI架构模式(终端中使用Ink/React)
- 理解MCP(模型上下文协议)在真实CLI中的实现方式
- 了解Claude Code如何管理会话、命令、身份验证和工具执行
Repository Structure
仓库结构
src/
├── entrypoints/ # CLI bootstrap and initialization
├── commands/ # Command definitions (login, mcp, review, tasks, etc.)
├── components/ # Ink/React terminal UI components
├── services/ # Core business logic (sync, remote capabilities, policies)
├── hooks/ # Terminal state management hooks
├── utils/ # Auth, file ops, process management helpers
└── ink/ # Custom terminal rendering infrastructuresrc/
├── entrypoints/ # CLI引导与初始化
├── commands/ # 命令定义(login、mcp、review、tasks等)
├── components/ # Ink/React终端UI组件
├── services/ # 核心业务逻辑(同步、远程能力、策略)
├── hooks/ # 终端状态管理hooks
├── utils/ # 身份验证、文件操作、进程管理工具
└── ink/ # 自定义终端渲染基础设施Installing the Original 2.1.88 Package (Tencent Mirror Cache)
安装原始2.1.88版本包(腾讯镜像缓存)
The official npm version was pulled. Use the Tencent mirror cache while available:
bash
npm install -g https://mirrors.cloud.tencent.com/npm/@anthropic-ai/claude-code/-/claude-code-2.1.88.tgz官方npm版本已被下架,可在缓存有效期内使用腾讯镜像:
bash
npm install -g https://mirrors.cloud.tencent.com/npm/@anthropic-ai/claude-code/-/claude-code-2.1.88.tgzExtracting Source from the Source Map
从源映射文件提取源代码
If you have the original , you can recover sources programmatically:
cli.js.maptypescript
import fs from "fs";
import path from "path";
import zlib from "zlib";
interface SourceMap {
version: number;
sources: string[];
sourcesContent: (string | null)[];
mappings: string;
}
async function extractSourceMap(mapPath: string, outDir: string) {
const raw = fs.readFileSync(mapPath, "utf-8");
const sourceMap: SourceMap = JSON.parse(raw);
for (let i = 0; i < sourceMap.sources.length; i++) {
const sourcePath = sourceMap.sources[i];
const content = sourceMap.sourcesContent[i];
if (!content) continue;
// Normalize path: strip webpack/bundle prefixes
const normalized = sourcePath
.replace(/^webpack:\/\/\//, "")
.replace(/^\.\//, "");
const outPath = path.join(outDir, normalized);
fs.mkdirSync(path.dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, content, "utf-8");
}
console.log(`Extracted ${sourceMap.sources.length} source files to ${outDir}`);
}
extractSourceMap("cli.js.map", "./recovered-src");如果你持有原始的文件,可以通过代码自动恢复源码:
cli.js.maptypescript
import fs from "fs";
import path from "path";
import zlib from "zlib";
interface SourceMap {
version: number;
sources: string[];
sourcesContent: (string | null)[];
mappings: string;
}
async function extractSourceMap(mapPath: string, outDir: string) {
const raw = fs.readFileSync(mapPath, "utf-8");
const sourceMap: SourceMap = JSON.parse(raw);
for (let i = 0; i < sourceMap.sources.length; i++) {
const sourcePath = sourceMap.sources[i];
const content = sourceMap.sourcesContent[i];
if (!content) continue;
// 标准化路径:移除webpack/打包前缀
const normalized = sourcePath
.replace(/^webpack:\/\/\//, "")
.replace(/^\.\//, "");
const outPath = path.join(outDir, normalized);
fs.mkdirSync(path.dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, content, "utf-8");
}
console.log(`已提取${sourceMap.sources.length}个源文件到${outDir}`);
}
extractSourceMap("cli.js.map", "./recovered-src");Key Architectural Patterns
核心架构模式
1. CLI Entrypoint Bootstrap
1. CLI入口引导
typescript
// src/entrypoints/cli.ts (representative pattern)
import { render } from "ink";
import React from "react";
import { App } from "../components/App";
import { parseArgs } from "../utils/args";
async function main() {
const args = parseArgs(process.argv.slice(2));
if (args.command) {
// Dispatch to named command handler
const handler = await loadCommand(args.command);
await handler.run(args);
} else {
// Default: launch interactive REPL via Ink
render(React.createElement(App, { initialArgs: args }));
}
}
main().catch((err) => {
console.error(err);
process.exit(1);
});typescript
// src/entrypoints/cli.ts (典型模式)
import { render } from "ink";
import React from "react";
import { App } from "../components/App";
import { parseArgs } from "../utils/args";
async function main() {
const args = parseArgs(process.argv.slice(2));
if (args.command) {
// 分发到对应命令处理器
const handler = await loadCommand(args.command);
await handler.run(args);
} else {
// 默认:通过Ink启动交互式REPL
render(React.createElement(App, { initialArgs: args }));
}
}
main().catch((err) => {
console.error(err);
process.exit(1);
});2. Command Loading System
2. 命令加载系统
Commands support built-in, dynamic skills, plugins, and MCP sources:
typescript
// src/commands/loader.ts (representative pattern)
type CommandSource = "builtin" | "skill" | "plugin" | "mcp";
interface Command {
name: string;
source: CommandSource;
description: string;
run(args: ParsedArgs): Promise<void>;
}
async function loadCommand(name: string): Promise<Command> {
// 1. Check built-in commands first
const builtin = builtinCommands.get(name);
if (builtin) return builtin;
// 2. Check MCP-registered commands
const mcpCmd = await mcpRegistry.resolve(name);
if (mcpCmd) return mcpCmd;
// 3. Dynamic skill loading
const skill = await loadSkillCommand(name);
if (skill) return skill;
throw new Error(`Unknown command: ${name}`);
}命令支持内置、动态Skill、插件和MCP源:
typescript
// src/commands/loader.ts (典型模式)
type CommandSource = "builtin" | "skill" | "plugin" | "mcp";
interface Command {
name: string;
source: CommandSource;
description: string;
run(args: ParsedArgs): Promise<void>;
}
async function loadCommand(name: string): Promise<Command> {
// 1. 优先检查内置命令
const builtin = builtinCommands.get(name);
if (builtin) return builtin;
// 2. 检查MCP注册的命令
const mcpCmd = await mcpRegistry.resolve(name);
if (mcpCmd) return mcpCmd;
// 3. 动态加载Skill
const skill = await loadSkillCommand(name);
if (skill) return skill;
throw new Error(`未知命令:${name}`);
}3. Ink/React Terminal UI Component Pattern
3. Ink/React终端UI组件模式
typescript
// src/components/ChatView.tsx (representative pattern)
import React, { useState, useEffect } from "react";
import { Box, Text, useInput } from "ink";
import { useConversation } from "../hooks/useConversation";
interface ChatViewProps {
sessionId: string;
}
export function ChatView({ sessionId }: ChatViewProps) {
const { messages, sendMessage, isStreaming } = useConversation(sessionId);
const [input, setInput] = useState("");
useInput((char, key) => {
if (key.return) {
sendMessage(input);
setInput("");
} else if (key.backspace) {
setInput((prev) => prev.slice(0, -1));
} else {
setInput((prev) => prev + char);
}
});
return (
<Box flexDirection="column" height="100%">
<Box flexDirection="column" flexGrow={1} overflowY="hidden">
{messages.map((msg, i) => (
<Box key={i} marginBottom={1}>
<Text color={msg.role === "assistant" ? "cyan" : "white"}>
{msg.role === "assistant" ? "Claude: " : "You: "}
</Text>
<Text>{msg.content}</Text>
</Box>
))}
{isStreaming && <Text color="gray">▋</Text>}
</Box>
<Box borderStyle="single" paddingX={1}>
<Text>{">"} </Text>
<Text>{input}</Text>
</Box>
</Box>
);
}typescript
// src/components/ChatView.tsx (典型模式)
import React, { useState, useEffect } from "react";
import { Box, Text, useInput } from "ink";
import { useConversation } from "../hooks/useConversation";
interface ChatViewProps {
sessionId: string;
}
export function ChatView({ sessionId }: ChatViewProps) {
const { messages, sendMessage, isStreaming } = useConversation(sessionId);
const [input, setInput] = useState("");
useInput((char, key) => {
if (key.return) {
sendMessage(input);
setInput("");
} else if (key.backspace) {
setInput((prev) => prev.slice(0, -1));
} else {
setInput((prev) => prev + char);
}
});
return (
<Box flexDirection="column" height="100%">
<Box flexDirection="column" flexGrow={1} overflowY="hidden">
{messages.map((msg, i) => (
<Box key={i} marginBottom={1}>
<Text color={msg.role === "assistant" ? "cyan" : "white"}>
{msg.role === "assistant" ? "Claude: " : "You: "}
</Text>
<Text>{msg.content}</Text>
</Box>
))}
{isStreaming && <Text color="gray">▋</Text>}
</Box>
<Box borderStyle="single" paddingX={1}>
<Text>{">"} </Text>
<Text>{input}</Text>
</Box>
</Box>
);
}4. MCP (Model Context Protocol) Integration
4. MCP(模型上下文协议)集成
typescript
// src/services/mcpClient.ts (representative pattern)
import { McpClient, Transport } from "@anthropic-ai/mcp";
interface McpServerConfig {
name: string;
command: string;
args: string[];
env?: Record<string, string>;
}
class McpRegistry {
private clients = new Map<string, McpClient>();
async connect(config: McpServerConfig): Promise<void> {
const transport = new StdioTransport({
command: config.command,
args: config.args,
env: { ...process.env, ...config.env },
});
const client = new McpClient({ name: "claude-code", version: "2.1.88" });
await client.connect(transport);
// Discover tools exposed by this MCP server
const { tools } = await client.listTools();
for (const tool of tools) {
this.registerTool(config.name, tool);
}
this.clients.set(config.name, client);
}
async callTool(serverName: string, toolName: string, args: unknown) {
const client = this.clients.get(serverName);
if (!client) throw new Error(`MCP server not connected: ${serverName}`);
return client.callTool({ name: toolName, arguments: args as Record<string, unknown> });
}
async resolve(commandName: string): Promise<Command | null> {
// Map MCP tool names to CLI commands
for (const [server, tools] of this.toolRegistry) {
const tool = tools.find((t) => t.name === commandName);
if (tool) {
return {
name: commandName,
source: "mcp",
description: tool.description ?? "",
run: async (args) => {
const result = await this.callTool(server, commandName, args);
console.log(result.content);
},
};
}
}
return null;
}
private toolRegistry = new Map<string, Array<{ name: string; description?: string }>>();
private registerTool(server: string, tool: { name: string; description?: string }) {
const existing = this.toolRegistry.get(server) ?? [];
this.toolRegistry.set(server, [...existing, tool]);
}
}
export const mcpRegistry = new McpRegistry();typescript
// src/services/mcpClient.ts (典型模式)
import { McpClient, Transport } from "@anthropic-ai/mcp";
interface McpServerConfig {
name: string;
command: string;
args: string[];
env?: Record<string, string>;
}
class McpRegistry {
private clients = new Map<string, McpClient>();
async connect(config: McpServerConfig): Promise<void> {
const transport = new StdioTransport({
command: config.command,
args: config.args,
env: { ...process.env, ...config.env },
});
const client = new McpClient({ name: "claude-code", version: "2.1.88" });
await client.connect(transport);
// 发现该MCP服务器暴露的工具
const { tools } = await client.listTools();
for (const tool of tools) {
this.registerTool(config.name, tool);
}
this.clients.set(config.name, client);
}
async callTool(serverName: string, toolName: string, args: unknown) {
const client = this.clients.get(serverName);
if (!client) throw new Error(`MCP服务器未连接:${serverName}`);
return client.callTool({ name: toolName, arguments: args as Record<string, unknown> });
}
async resolve(commandName: string): Promise<Command | null> {
// 将MCP工具名映射为CLI命令
for (const [server, tools] of this.toolRegistry) {
const tool = tools.find((t) => t.name === commandName);
if (tool) {
return {
name: commandName,
source: "mcp",
description: tool.description ?? "",
run: async (args) => {
const result = await this.callTool(server, commandName, args);
console.log(result.content);
},
};
}
}
return null;
}
private toolRegistry = new Map<string, Array<{ name: string; description?: string }>>();
private registerTool(server: string, tool: { name: string; description?: string }) {
const existing = this.toolRegistry.get(server) ?? [];
this.toolRegistry.set(server, [...existing, tool]);
}
}
export const mcpRegistry = new McpRegistry();5. Authentication Utilities
5. 身份验证工具
typescript
// src/utils/auth.ts (representative pattern)
import fs from "fs";
import path from "path";
import os from "os";
const CONFIG_DIR = path.join(os.homedir(), ".claude");
const CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");
interface Credentials {
apiKey?: string;
sessionToken?: string;
expiresAt?: string;
}
export function loadCredentials(): Credentials {
if (!fs.existsSync(CREDENTIALS_FILE)) return {};
return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
}
export function saveCredentials(creds: Credentials): void {
fs.mkdirSync(CONFIG_DIR, { recursive: true });
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
mode: 0o600, // owner read/write only
});
}
export function getApiKey(): string {
// Priority: env var > credentials file
if (process.env.ANTHROPIC_API_KEY) {
return process.env.ANTHROPIC_API_KEY;
}
const creds = loadCredentials();
if (creds.apiKey) return creds.apiKey;
throw new Error("No API key found. Run `claude login` or set ANTHROPIC_API_KEY.");
}typescript
// src/utils/auth.ts (典型模式)
import fs from "fs";
import path from "path";
import os from "os";
const CONFIG_DIR = path.join(os.homedir(), ".claude");
const CREDENTIALS_FILE = path.join(CONFIG_DIR, "credentials.json");
interface Credentials {
apiKey?: string;
sessionToken?: string;
expiresAt?: string;
}
export function loadCredentials(): Credentials {
if (!fs.existsSync(CREDENTIALS_FILE)) return {};
return JSON.parse(fs.readFileSync(CREDENTIALS_FILE, "utf-8"));
}
export function saveCredentials(creds: Credentials): void {
fs.mkdirSync(CONFIG_DIR, { recursive: true });
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
mode: 0o600, // 仅所有者可读写
});
}
export function getApiKey(): string {
// 优先级:环境变量 > 凭证文件
if (process.env.ANTHROPIC_API_KEY) {
return process.env.ANTHROPIC_API_KEY;
}
const creds = loadCredentials();
if (creds.apiKey) return creds.apiKey;
throw new Error("未找到API密钥,请执行`claude login`或设置ANTHROPIC_API_KEY环境变量。");
}6. Feature Flags Pattern
6. 功能开关模式
typescript
// src/utils/featureFlags.ts (representative pattern)
// Feature flags are resolved at build time via bun:bundle macros
// and at runtime via environment variables
type FeatureFlag =
| "ENABLE_MCP_STREAMING"
| "ENABLE_TASKS_COMMAND"
| "ENABLE_REVIEW_COMMAND"
| "ENABLE_REMOTE_CAPABILITIES";
const RUNTIME_FLAGS: Record<FeatureFlag, boolean> = {
ENABLE_MCP_STREAMING: process.env.CLAUDE_FF_MCP_STREAMING === "1",
ENABLE_TASKS_COMMAND: process.env.CLAUDE_FF_TASKS === "1",
ENABLE_REVIEW_COMMAND: process.env.CLAUDE_FF_REVIEW === "1",
ENABLE_REMOTE_CAPABILITIES: process.env.CLAUDE_FF_REMOTE === "1",
};
export function isEnabled(flag: FeatureFlag): boolean {
return RUNTIME_FLAGS[flag] ?? false;
}
// Usage in command loader:
// if (isEnabled("ENABLE_TASKS_COMMAND")) {
// registerCommand(tasksCommand);
// }typescript
// src/utils/featureFlags.ts (典型模式)
// 功能开关在构建时通过bun:bundle宏解析,运行时通过环境变量解析
type FeatureFlag =
| "ENABLE_MCP_STREAMING"
| "ENABLE_TASKS_COMMAND"
| "ENABLE_REVIEW_COMMAND"
| "ENABLE_REMOTE_CAPABILITIES";
const RUNTIME_FLAGS: Record<FeatureFlag, boolean> = {
ENABLE_MCP_STREAMING: process.env.CLAUDE_FF_MCP_STREAMING === "1",
ENABLE_TASKS_COMMAND: process.env.CLAUDE_FF_TASKS === "1",
ENABLE_REVIEW_COMMAND: process.env.CLAUDE_FF_REVIEW === "1",
ENABLE_REMOTE_CAPABILITIES: process.env.CLAUDE_FF_REMOTE === "1",
};
export function isEnabled(flag: FeatureFlag): boolean {
return RUNTIME_FLAGS[flag] ?? false;
}
// 在命令加载器中的用法:
// if (isEnabled("ENABLE_TASKS_COMMAND")) {
// registerCommand(tasksCommand);
// }Commands Documented in Source
源码中记录的命令
| Command | Description |
|---|---|
| OAuth/API key authentication flow |
| Manage MCP server connections |
| Code review workflow |
| Task/todo management |
| View and edit configuration |
| 命令 | 描述 |
|---|---|
| OAuth/API密钥身份验证流程 |
| 管理MCP服务器连接 |
| 代码审查工作流 |
| 任务/待办事项管理 |
| 查看和编辑配置 |
Hooks: Terminal State Management
Hooks:终端状态管理
typescript
// src/hooks/useConversation.ts (representative pattern)
import { useState, useCallback, useRef } from "react";
import Anthropic from "@anthropic-ai/sdk";
export function useConversation(sessionId: string) {
const [messages, setMessages] = useState<Message[]>([]);
const [isStreaming, setIsStreaming] = useState(false);
const clientRef = useRef(new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }));
const sendMessage = useCallback(async (content: string) => {
const userMessage: Message = { role: "user", content };
setMessages((prev) => [...prev, userMessage]);
setIsStreaming(true);
let assistantContent = "";
try {
const stream = await clientRef.current.messages.stream({
model: "claude-opus-4-5",
max_tokens: 8096,
messages: [...messages, userMessage].map((m) => ({
role: m.role,
content: m.content,
})),
});
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
assistantContent += chunk.delta.text;
setMessages((prev) => {
const next = [...prev];
const last = next[next.length - 1];
if (last?.role === "assistant") {
next[next.length - 1] = { ...last, content: assistantContent };
} else {
next.push({ role: "assistant", content: assistantContent });
}
return next;
});
}
}
} finally {
setIsStreaming(false);
}
}, [messages]);
return { messages, sendMessage, isStreaming };
}typescript
// src/hooks/useConversation.ts (典型模式)
import { useState, useCallback, useRef } from "react";
import Anthropic from "@anthropic-ai/sdk";
export function useConversation(sessionId: string) {
const [messages, setMessages] = useState<Message[]>([]);
const [isStreaming, setIsStreaming] = useState(false);
const clientRef = useRef(new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }));
const sendMessage = useCallback(async (content: string) => {
const userMessage: Message = { role: "user", content };
setMessages((prev) => [...prev, userMessage]);
setIsStreaming(true);
let assistantContent = "";
try {
const stream = await clientRef.current.messages.stream({
model: "claude-opus-4-5",
max_tokens: 8096,
messages: [...messages, userMessage].map((m) => ({
role: m.role,
content: m.content,
})),
});
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
assistantContent += chunk.delta.text;
setMessages((prev) => {
const next = [...prev];
const last = next[next.length - 1];
if (last?.role === "assistant") {
next[next.length - 1] = { ...last, content: assistantContent };
} else {
next.push({ role: "assistant", content: assistantContent });
}
return next;
});
}
}
} finally {
setIsStreaming(false);
}
}, [messages]);
return { messages, sendMessage, isStreaming };
}Environment Variables
环境变量
| Variable | Purpose |
|---|---|
| Primary API key for Claude API calls |
| Enable MCP streaming feature flag ( |
| Enable tasks command feature flag |
| Enable review command feature flag |
| Enable remote capabilities feature flag |
| Override default |
| 变量 | 用途 |
|---|---|
| 调用Claude API的主密钥 |
| 启用MCP流式传输功能开关( |
| 启用tasks命令功能开关 |
| 启用review命令功能开关 |
| 启用远程能力功能开关 |
| 覆盖默认的 |
Attempting to Run the Recovered Source
尝试运行恢复后的源代码
bash
undefinedbash
undefined1. Clone the repo
1. 克隆仓库
git clone https://github.com/ponponon/claude_code_src
cd claude_code_src
git clone https://github.com/ponponon/claude_code_src
cd claude_code_src
2. Add a package.json (not included — must be reconstructed)
2. 新增package.json(仓库未提供,需自行重构)
cat > package.json << 'EOF'
{
"name": "claude-code-recovered",
"version": "2.1.88",
"type": "module",
"dependencies": {
"@anthropic-ai/sdk": "^0.51.0",
"ink": "^5.0.0",
"react": "^18.0.0",
"commander": "^12.0.0"
},
"devDependencies": {
"typescript": "^5.0.0",
"@types/react": "^18.0.0",
"@types/node": "^22.0.0"
}
}
EOF
cat > package.json << 'EOF'
{
"name": "claude-code-recovered",
"version": "2.1.88",
"type": "module",
"dependencies": {
"@anthropic-ai/sdk": "^0.51.0",
"ink": "^5.0.0",
"react": "^18.0.0",
"commander": "^12.0.0"
},
"devDependencies": {
"typescript": "^5.0.0",
"@types/react": "^18.0.0",
"@types/node": "^22.0.0"
}
}
EOF
3. Install deps
3. 安装依赖
npm install
npm install
4. Set your API key
4. 设置你的API密钥
export ANTHROPIC_API_KEY=your_key_here
export ANTHROPIC_API_KEY=your_key_here
5. Compile (bun:bundle macros will need stubs)
5. 编译(bun:bundle宏需要存根实现)
npx tsc --noEmit # type-check only
> **Note**: The source uses `bun:bundle` macros for feature flag tree-shaking. You'll need to stub these or use Bun to build.
---npx tsc --noEmit # 仅执行类型检查
> **注意**:源码使用`bun:bundle`宏实现功能开关的tree-shaking,你需要为这些宏编写存根或者使用Bun进行构建。
---Troubleshooting
问题排查
| Problem | Solution |
|---|---|
| Replace with runtime flag checks or use Bun as the build tool |
Missing | Reconstruct from |
| Stream-parse with |
| Tencent mirror link broken | Check archive.org or other npm mirror caches |
| TypeScript path aliases unresolved | Add |
| 问题 | 解决方案 |
|---|---|
| 替换为运行时开关检查,或使用Bun作为构建工具 |
缺失 | 根据源码导入中的 |
| 使用 |
| 腾讯镜像链接失效 | 查看archive.org或其他npm镜像缓存 |
| TypeScript路径别名未解析 | 在 |
Legal Notes
法律说明
- This repository is not affiliated with Anthropic.
- Original code copyright belongs to Anthropic.
- This project is for archival and research purposes only.
- Do not use recovered code in production or commercial products without proper licensing.
- 本仓库与Anthropic无任何关联。
- 原始代码版权归Anthropic所有。
- 本项目仅用于存档和研究目的。
- 未经官方许可,请勿将恢复的代码用于生产或商业产品。