yterm-code
v1.0.0
Published
AI Terminal Assistant - LangGraph-based CLI with multi-provider support
Downloads
119
Maintainers
Readme
YTerm
中文 | English
YTerm 是一个基于 LangGraph 的 AI 终端助手,提供 React/Ink 终端 UI,支持多种 LLM 提供商的工具调用功能。
功能特性
- LangGraph 状态机:使用 LangGraph 构建对话流程,支持条件分支、状态持久化和中断恢复
- React/Ink 终端 UI:现代化的终端用户界面,支持彩色输出、Markdown 渲染和交互式组件
- 多模型提供商支持:支持 Ollama、OpenRouter、OpenAI、Anthropic 四大模型提供商
- 本地 + 云端模型:支持本地部署和云端 API,动态模型发现和缓存
- 工具调用 (Tool Calling):内置 10 个实用工具,支持文件操作、命令执行、内容搜索、任务管理等
- 智能内存管理:自动 Token 计数、消息裁剪和 LLM 驱动的历史总结,支持超长对话
- 事件驱动架构:Agent 与 UI 层通过 EventEmitter 解耦通信
- 工具确认机制:敏感工具(Bash/Write/Edit)执行前需用户确认,使用 LangGraph interrupt 实现
- 完善的日志系统:使用 Winston 记录详细的执行日志,按会话组织
- 持久化设置:用户设置持久化存储在
~/.yterm/settings.json - 任务管理集成:内置 TodoWrite 工具,支持任务列表管理和进度跟踪
- 上下文注入:自动读取并注入 CLAUDE.md 文件内容,提供项目级指令
- 请求中断支持:支持通过 AbortController 中断正在执行的请求
- 网页搜索与抓取:内置 WebSearch 和 WebFetch 工具,支持实时网络信息检索
- IP 地理定位:Location 工具支持多 API 回退的 IP 定位,针对中国和国际用户优化
- 持久化 Shell:PersistentShell 维持会话状态,支持 macOS/Linux/Windows(Git Bash/WSL)
- 智能权限系统:智能权限管理,支持命令前缀匹配和会话级权限
- 系统提醒服务:上下文感知的提醒系统,包含任务、安全和性能提示
- 剪贴板图片粘贴:支持从剪贴板粘贴图片(macOS)
- 大输出处理:自动将超大输出写入临时文件,避免内存溢出
内置工具
| 工具名 | 描述 | 类型 |
|--------|------|------|
| Bash | 执行 shell 命令(支持后台执行) | 敏感 |
| BashOutput | 获取后台 shell 的输出 | 只读 |
| KillShell | 终止运行中的后台 shell | - |
| Read | 读取文件内容(带行号) | 只读 |
| Write | 写入文件内容 | 敏感 |
| Edit | 编辑文件(字符串替换) | 敏感 |
| Glob | 文件模式匹配搜索(如 **/*.ts) | 只读 |
| Grep | 在文件内容中搜索文本(基于 ripgrep) | 只读 |
| LS | 列出目录内容 | 只读 |
| TodoWrite | 任务列表管理,支持进度跟踪和状态更新 | - |
| WebSearch | 使用 DuckDuckGo 搜索网页 | 只读 |
| WebFetch | 获取并分析网页内容 | 只读 |
| Location | 基于 IP 地址获取当前位置 | 只读 |
工具类型说明:
- 只读:安全的只读操作,支持并发执行
- 敏感:需要用户确认才能执行
- -:普通工具,不需要确认
支持的模型
模型提供商
Ollama (本地 + 云端)
- 本地模型:通过 Ollama API 动态发现已安装的模型
- 云端模型:通过 Ollama Cloud API 访问云端模型
- 特性:模型缓存、智能发现、支持工具调用检测
OpenRouter
- 特性:动态获取 OpenRouter 可用模型列表
- 优势:一个 API 访问多个模型提供商
OpenAI
- 配置:使用单一模型配置(根据环境变量)
- 默认模型:gpt-4o
- 特性:完整的工具调用支持
Anthropic
- 配置:使用单一模型配置(根据环境变量)
- 默认模型:claude-sonnet-4-20250514
- 特性:完整的工具调用支持
查看可用模型
# 列出所有可用模型(需要网络连接获取最新列表)
yterm --list
# 交互式模式下使用命令
/list模型选择优先级
- CLI 参数:
-m, --model <name> - 设置文件:
~/.yterm/settings.json - 环境变量:
.env.local或.env - 默认值:根据当前提供商设置
快速开始
环境要求
安装
# 克隆项目
git clone [email protected]:HeiSir2014/hello-langchain.git
cd hello-langchain
# 安装依赖(使用 Bun)
bun install
# 或使用 npm
npm install配置
方式 1:环境变量文件(.env 或 .env.local)
# 选择模型提供商
USE_PROVIDER=OLLAMA
# Ollama 配置
OLLAMA_MODEL_NAME=qwen3:4b
OLLAMA_HOST=http://localhost:11434
OLLAMA_CLOUD_HOST=https://ollama.com
OLLAMA_CLOUD_API_KEY=your_ollama_cloud_key
# OpenRouter 配置
OPENROUTER_API_KEY=your_openrouter_key
OPENROUTER_MODEL_NAME=x-ai/grok-2-1212
OPENROUTER_MODEL_CONTEXT_LENGTH=131072
# OpenAI 配置
OPENAI_API_KEY=your_openai_key
OPENAI_MODEL_NAME=gpt-4o
OPENAI_MODEL_CONTEXT_LENGTH=128000
OPENAI_BASE_URL=https://api.openai.com/v1
# Anthropic 配置
ANTHROPIC_API_KEY=your_anthropic_key
ANTHROPIC_MODEL_NAME=claude-sonnet-4-20250514
ANTHROPIC_MODEL_CONTEXT_LENGTH=200000
ANTHROPIC_BASE_URL=https://api.anthropic.com
# 日志级别
LOG_LEVEL=info方式 2:交互式设置(推荐)
首次运行时,系统会提示您进行设置。设置会保存在 ~/.yterm/settings.json 中。
构建和运行
方式 1:全局安装(推荐)
# 构建项目
bun run build
# 全局安装
bun install -g .
# 使用 YTerm 命令
yterm
# 查看所有可用模型
yterm --list
# 查看帮助
yterm --help
# 使用指定模型运行单次对话
yterm -m claude-3-5-sonnet "解释什么是 LangGraph"方式 2:本地运行
# 开发模式(推荐)- 直接运行 TypeScript,无需编译
bun start
# 或者使用构建后的代码
bun run build
node dist/cli.js首次运行
# 启动 YTerm(会提示配置设置)
yterm
# 或查看可用模型
yterm --list使用说明
交互式命令
| 命令 | 描述 |
|------|------|
| /help, /h | 显示帮助信息 |
| /clear, /c | 清除对话历史 |
| /compact | 压缩对话历史(保留重要信息) |
| /model, /m | 显示/切换模型 |
| /exit, /quit | 退出程序 |
基础使用
- 启动 YTerm:
yterm - 输入消息:直接在终端输入您的问题或指令
- 使用工具:模型会自动调用需要的工具(如文件读取、命令执行等)
- 确认敏感操作:对于 Bash、Write、Edit 等敏感工具,系统会请求确认
工具调用流程
用户输入 → 模型分析 → 工具调用 → 执行结果 → 模型响应当模型需要使用工具时,会显示:
- ● 正在思考... (模型处理中)
- ● 工具名称 (工具调用中)
- ● 最终响应 (工具执行完成)
使用示例
基础文件操作
> 列出当前目录的文件
● 正在思考...
● LS(path=.)
当前目录包含以下文件和文件夹:
- src/ # 源代码目录
- logs/ # 日志文件目录
- node_modules/ # 依赖包目录
- package.json # 项目配置
- tsconfig.json # TypeScript 配置
- README.md # 项目文档
- .env.example # 环境变量示例工具调用示例
> 查看 package.json 文件内容
● 正在思考...
● Read(file_path=package.json)
● package.json 内容:
{
"name": "yterm",
"version": "1.0.0",
"description": "AI Terminal Assistant...",
"scripts": {
"start": "bun run src/cli.tsx",
"build": "tsc"
}
}任务管理示例
> 我需要完成一个项目,包括需求分析、设计、开发、测试四个阶段
● 正在思考...
● TodoWrite
任务列表已创建:
1. ○ 需求分析 [pending]
2. ○ 系统设计 [pending]
3. ○ 功能开发 [pending]
4. ○ 测试验收 [pending]多模型切换示例
> /model gpt-4o
已切换到 GPT-4o 模型
> 解释什么是 LangGraph
● 正在思考...
LangGraph 是 LangChain生态系统中的一个框架,用于构建多Agent应用程序...Bash 命令示例
> 运行 `ls -la` 命令
● 正在思考...
● Bash(command="ls -la", run_in_background=false)
total 24
drwxr-xr-x 5 user staff 160 Dec 6 10:00 .
drwxr-xr-x 3 user staff 96 Dec 6 09:30 ..
-rw-r--r-- 1 user staff 1024 Dec 6 10:00 README.md
-rw-r--r-- 1 user staff 512 Dec 6 09:45 package.json项目结构
hello-langchain/
├── src/
│ ├── cli.tsx # 入口点 - Commander CLI + Ink 渲染
│ ├── logger.ts # Winston 日志系统
│ ├── core/
│ │ ├── config.ts # 模型定义、提供商配置、环境变量加载
│ │ ├── settings.ts # 持久化设置 (~/.yterm/settings.json)
│ │ ├── agent/
│ │ │ ├── index.ts # LangGraph StateGraph (agent, tools, confirm, summarize 节点)
│ │ │ ├── models.ts # 所有提供商的统一聊天模型工厂
│ │ │ ├── memory.ts # Token 计数、消息裁剪、总结
│ │ │ └── events.ts # AgentEventEmitter 用于 UI 通信
│ │ ├── context/
│ │ │ └── index.ts # 上下文注入 (CLAUDE.md, todo 列表)
│ │ ├── services/
│ │ │ ├── ollama.ts # Ollama API 客户端与模型缓存
│ │ │ ├── openai.ts # OpenAI API 服务
│ │ │ ├── anthropic.ts # Anthropic API 服务
│ │ │ ├── openrouter.ts # OpenRouter API 服务
│ │ │ └── reminder.ts # 系统提醒服务(任务/安全/性能提示)
│ │ ├── utils/
│ │ │ ├── PersistentShell.ts # 持久化 Shell 会话管理
│ │ │ └── output.ts # 输出工具(大输出处理)
│ │ ├── permissions.ts # 权限系统
│ │ └── tools/
│ │ ├── index.ts # 工具导出和描述
│ │ ├── types.ts # 工具元数据和类型定义
│ │ ├── bash.ts # Bash, BashOutput, KillShell 工具
│ │ ├── file.ts # Read, Write, Edit, Glob, Grep, LS 工具
│ │ ├── todo.ts # TodoWrite 任务管理工具
│ │ ├── web.ts # WebSearch, WebFetch 网页工具
│ │ └── location.ts # Location IP 地理定位工具
│ └── ui/
│ ├── app.tsx # 根组件,ThemeProvider
│ ├── screens/
│ │ └── REPL.tsx # 主要 REPL 屏幕,消息处理
│ ├── components/
│ │ ├── Message.tsx # 消息包装组件
│ │ ├── Spinner.tsx # 加载动画
│ │ ├── PromptInput.tsx # 用户输入组件
│ │ ├── Logo.tsx # YTerm Logo 显示
│ │ ├── Help.tsx # 帮助信息显示
│ │ ├── ModelConfig.tsx # 模型配置 UI
│ │ ├── messages/ # 消息类型组件
│ │ └── permissions/ # 权限请求组件
│ ├── commands/ # 斜杠命令 (/clear, /help, /model, /compact)
│ ├── hooks/ # React hooks (useAgentEvents, useTerminalSize 等)
│ ├── utils/
│ │ ├── theme.ts # 颜色主题定义
│ │ ├── markdown.ts # Markdown 渲染
│ │ ├── terminal.ts # 终端工具
│ │ ├── bash.ts # Bash 输出格式化
│ │ ├── externalEditor.ts # 外部编辑器支持
│ │ └── imagePaste.ts # 剪贴板图片粘贴(macOS)
│ └── types/ # TypeScript 类型定义
├── logs/ # 会话日志文件
├── ~/.yterm/ # 用户设置目录
│ └── settings.json # 持久化设置
├── package.json
├── tsconfig.json
├── CLAUDE.md # Claude Code 开发指南
└── README.md技术栈
核心框架
- TypeScript - 类型安全的开发体验
- React 19 + Ink 6 - 终端 UI 框架
- LangGraph - 对话状态机和流程控制
- @langchain/core - LangChain 核心库
模型提供商集成
- @langchain/anthropic - Anthropic Claude 模型支持
- @langchain/openai - OpenAI 兼容接口
- @langchain/ollama - Ollama 本地/云端 LLM 服务
- ollama - Ollama Node.js 客户端
- @openrouter/sdk - OpenRouter API 支持
工具和实用程序
- Winston - 结构化日志系统
- Zod - 运行时类型校验
- Zod-to-JSON-Schema - JSON Schema 生成
- @vscode/ripgrep - 高性能文本搜索
- glob - 文件模式匹配
- iconv-lite - 字符编码转换
- commander - CLI 命令解析
- dotenv - 环境变量管理
开发工具
- Bun - 快速的 JavaScript 运行时和包管理器
- tsx - TypeScript 直接执行
- chalk - 终端彩色输出
- marked + highlight.js - Markdown 渲染和代码高亮
- marked-terminal - 终端中的 Markdown 渲染
架构说明
LangGraph 状态机
┌─────────────────────────────────────────────────────────────────┐
│ User Input │
└───────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ LangGraph StateGraph │
│ │
│ ┌─────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ START │───────▶│ Agent │───────▶│ Should │ │
│ └─────────┘ │ (LLM) │ │ Continue? │ │
│ └──────────────┘ └───────┬───────┘ │
│ ▲ │ │
│ │ ┌─────────────┼──────┐ │
│ │ │ │ │ │
│ │ ▼ ▼ ▼ │
│ ┌────────────────────┐ ┌──────────┐ ┌───┐ │
│ │ Tool Execution │ │ Confirm │ │END│ │
│ │ (Bash/Read/etc.) │ │ Tools │ └───┘ │
│ └────────┬───────────┘ └────┬─────┘ │
│ │ │ interrupt │
│ │ │ (y/n) │
│ ▼ │ │
│ ┌────────────────────┐ │ │
│ │ Check Messages │◀────────┘ │
│ │ (Token Limit?) │ │
│ └────────┬───────────┘ │
│ │ │
│ ┌─────────────┴─────────────┐ │
│ ▼ ▼ │
│ ┌────────────────┐ ┌─────────┐ │
│ │ Summarize │ │ Agent │ │
│ │ (LLM 总结) │─────────────▶│ │ │
│ └────────────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘事件驱动通信
Agent 通过 AgentEventEmitter 发射事件,UI 层通过 useAgentEvents hook 订阅:
| 事件类型 | 描述 |
|----------|------|
| thinking | LLM 正在处理 |
| streaming | 流式响应内容 |
| tool_use | 工具调用开始 |
| tool_result | 工具执行完成 |
| response | 最终响应就绪 |
| confirm_required | 敏感工具需要确认 |
| error | 发生错误 |
| done | 请求完成 |
智能内存管理
项目实现了智能的消息历史管理机制,解决了长对话中上下文窗口溢出的问题:
- Token 计数:使用启发式算法估算中英文混合文本的 token 数量
- 自动裁剪:当消息历史达到上下文窗口的 70% 时,自动裁剪早期消息
- 智能总结:使用 LLM 对被裁剪的历史消息生成摘要,保留关键信息
- 按模型适配:根据不同模型的上下文窗口大小(8K~200K)动态调整策略
// Token 估算规则
// - 中文:约 1.5 字符/token
// - 英文:约 4 字符/token
// - 工具调用:额外计入参数和格式开销上下文注入系统
项目实现了智能的上下文注入机制,自动读取并注入相关指令:
- CLAUDE.md 支持:自动读取项目级或用户级 CLAUDE.md 文件
- 任务列表同步:实时同步 TodoWrite 工具生成的任务列表
- 系统提醒:根据工具调用结果自动生成相应的系统提醒
- 优先级管理:不同类型上下文按优先级排序注入
任务管理集成
内置 TodoWrite 工具,提供完整的任务管理功能:
- 状态跟踪:pending、in_progress、completed 三种状态
- 实时更新:任务状态变更时自动同步到对话上下文
- 进度管理:支持任务分解和进度展示
- 智能提示:在适当时机提供任务管理建议
网页搜索与抓取
内置 WebSearch 和 WebFetch 工具,支持实时网络信息检索:
> 搜索最新的 React 19 新特性
● WebSearch(query="React 19 new features 2024")
找到 10 条搜索结果:
1. React 19 - Official Documentation
2. What's New in React 19...
...
> 获取这篇文章的详细内容
● WebFetch(url="https://react.dev/blog/...", prompt="总结 React 19 的主要新特性")
React 19 的主要新特性包括:
1. Actions - 简化表单提交和数据变更...特性:
- 使用 DuckDuckGo 搜索,无需 API 密钥
- 自动将网页内容转换为 Markdown
- 使用当前模型分析网页内容
- 内置速率限制(20 请求/分钟)
IP 地理定位
Location 工具支持基于 IP 的地理定位,针对中国和国际用户优化:
> 今天天气怎么样?
● Location()
当前位置(基于 IP):
- 城市:北京
- 区域:北京市
- 国家:中国 (CN)
- 时区:Asia/Shanghai
● WebSearch(query="北京今天天气")
北京今天天气:晴,温度 15-25°C...特性:
- 6 个 API 提供商自动回退(pconline、ip-api.com、ip.sb、ipwhois.app、ipapi.co、ipinfo.io)
- 结果缓存 30 分钟
- 针对中国网络环境优化
持久化 Shell
PersistentShell 提供跨命令的持久化 Shell 会话:
- 状态保持:环境变量、工作目录在命令间保持
- 跨平台支持:macOS、Linux、Windows(Git Bash/WSL)
- 中断支持:通过 AbortSignal 中断运行中的命令
- 实时输出:支持流式输出回调
智能权限系统
智能权限管理系统:
// 安全命令无需确认
const SAFE_COMMANDS = ["git status", "git diff", "pwd", "ls", ...];
// 命令前缀匹配
// "npm install ..." → 只需确认一次 "npm:*" 权限
const prefixTools = ["npm", "yarn", "bun", "git", "docker", ...];权限模式:
default:敏感工具需要确认acceptEdits:自动允许 Edit/Write 操作bypassPermissions:跳过所有权限检查(谨慎使用)
会话权限:
- 目录级别的写入/编辑权限
- 会话结束后自动清除
系统提醒服务
上下文感知的提醒系统,在适当时机注入提示:
| 提醒类型 | 触发条件 | 优先级 | |----------|----------|--------| | 任务提醒 | Todo 列表为空或更新 | 中 | | 安全提醒 | 首次文件访问 | 高 | | 性能提醒 | 会话超过 30 分钟 | 低 |
剪贴板图片支持
在 macOS 上支持从剪贴板粘贴图片:
> [粘贴截图]
已检测到剪贴板中的图片 (256 KB)
正在分析图片内容...
这是一张代码截图,显示的是一个 React 组件...使用方法:
- 使用
Cmd + Ctrl + Shift + 4截图到剪贴板 - 在 YTerm 中粘贴
开发
开发环境设置
# 安装依赖
bun install
# 类型检查
bun run typecheck
# 运行测试
bun test构建和运行
# 开发模式(推荐)- 直接运行 TypeScript,无需编译
bun start
# 构建 TypeScript 到 dist/ 目录
bun run build
# 运行构建后的代码(需要先构建)
node dist/cli.js
# 交互式模式示例
yterm -m qwen3:4b "你好"
# 单次对话模式
yterm --prompt "列出当前目录"项目配置
优先级顺序
- CLI 参数 (
-m,--list等) - 用户设置 (
~/.yterm/settings.json) - 最高优先级 - 环境变量 (
.env.local,.env) - 默认配置
配置文件位置
- 用户设置:
~/.yterm/settings.json - 环境变量:
.env.local>.env> 项目根目录.env
调试和日志
日志系统
- 日志级别:
error,warn,info,debug - 日志文件:
logs/目录,按会话组织 - 实时日志:控制台输出和文件同时记录
启用详细日志
# 运行时指定日志级别
LOG_LEVEL=debug yterm
# 或在 .env 文件中设置
LOG_LEVEL=debug扩展开发
添加新工具
- 在
src/core/tools/目录下创建工具文件 - 使用 Zod 定义参数模式
- 使用
@langchain/core/tools的tool函数创建工具 - 在
src/core/tools/index.ts中导出
示例工具结构:
import { z } from "zod";
import { tool } from "@langchain/core/tools";
export const MyTool = tool({
name: "my_tool",
description: "描述工具功能",
schema: z.object({
// 参数定义
}),
handler: async (input) => {
// 工具逻辑
return result;
},
});添加新模型提供商
- 配置:
src/core/settings.ts添加提供商设置 - 服务:
src/core/services/目录创建 API 客户端 - 模型工厂:
src/core/agent/models.ts添加模型创建逻辑 - 配置管理:
src/core/config.ts集成新提供商
自定义上下文注入
- 修改
src/core/context/index.ts - 在
collectContextItems函数中添加新的上下文类型 - 设置合适的优先级和生成逻辑
代码规范
- 模块系统:使用 ESM 模块 (
.js扩展名在导入中) - 类型安全:完整的 TypeScript 类型覆盖
- 错误处理:统一的错误处理和日志记录
- 事件驱动:Agent 和 UI 层通过事件通信
常见问题
Q: 如何切换模型?
A: 有三种方式:
# 1. 命令行参数
yterm -m claude-3-5-sonnet
# 2. 交互式命令
/model claude-3-5-sonnet
# 3. 修改设置文件
# 编辑 ~/.yterm/settings.jsonQ: 如何切换模型提供商?
A: 通过设置文件或环境变量:
# 交互式重新配置
# 首次运行时会提示配置
# 或编辑设置文件
~/.yterm/settings.json
# 或使用环境变量
USE_PROVIDER=ANTHROPICQ: 本地模型和云端模型有什么区别?
A:
- 本地模型(Ollama):
- 通过 Ollama 在本地运行
- 无需网络连接,响应快
- 隐私性好,数据不离开本地
- 需要本地存储空间
- 云端模型(OpenAI/Anthropic/OpenRouter):
- 需要网络连接
- 模型能力更强,通常支持更大上下文
- 无需本地存储
- 需要 API 密钥和可能的费用
Q: 模型列表显示为空或不完整?
A:
# 刷新模型列表
yterm --list
# 检查网络连接(用于云端模型)
# 检查 Ollama 服务状态(用于本地模型)
ollama listQ: 如何查看详细的执行日志?
A:
# 启用 debug 日志
LOG_LEVEL=debug yterm
# 日志文件位置
logs/ # 按会话组织的日志文件Q: 支持哪些文件操作?
A: 支持完整的文件系统操作:
- 文件读写:Read/Write 工具
- 文件编辑:Edit 工具(字符串替换)
- 目录操作:LS 工具
- 文件搜索:Glob/Grep 工具
- 命令执行:Bash 工具
Q: 工具执行需要确认吗?
A: 默认情况下,敏感工具(Bash、Write、Edit)会请求确认。您可以:
- 在提示时输入
y确认或n取消 - 设置信任模式(未来版本功能)
Q: 如何管理长期对话?
A: 系统自动管理:
- Token 计数:实时监控对话长度
- 自动裁剪:当接近上下文限制时自动压缩历史
- 智能总结:使用 AI 总结历史,保留关键信息
- 手动压缩:使用
/compact命令主动压缩
Q: 如何备份和恢复设置?
A:
# 设置文件位置
~/.yterm/settings.json
# 备份设置
cp ~/.yterm/settings.json settings-backup.json
# 恢复设置
cp settings-backup.json ~/.yterm/settings.jsonQ: 支持哪些编程语言的文件?
A: 通过 Grep 和工具集成,支持所有语言的语法高亮和搜索。
License
ISC
作者
HeiSir [email protected]
- GitHub: @HeiSir2014
- 项目地址: hello-langchain
贡献
欢迎提交 Issue 和 Pull Request!
开发指南
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 创建 Pull Request
代码规范
- 使用 TypeScript 进行类型安全开发
- 遵循 ESLint 和 Prettier 配置
- 添加适当的测试用例
- 更新相关文档
更新日志
v1.1.0
- 新增 3 个工具:WebSearch、WebFetch、Location
- 网页搜索:使用 DuckDuckGo 搜索,无需 API 密钥
- 网页抓取:获取网页内容并使用 AI 分析
- IP 地理定位:6 个 API 提供商自动回退,针对中国优化
- 持久化 Shell:PersistentShell 跨命令保持状态
- 智能权限系统:命令前缀匹配,会话级权限
- 系统提醒服务:任务/安全/性能提醒
- 剪贴板图片粘贴:macOS 支持
- 大输出处理:超过 30KB 自动写入临时文件
- 工具元数据系统:支持并发执行只读工具
- 重构项目架构,扩展多模型支持
v1.0.0
- 初始版本发布
- 基于 LangGraph 的状态机架构,支持 StateGraph、MemorySaver 和 interrupt
- React 19 + Ink 6 终端 UI,支持 Markdown 渲染和代码高亮
- 多模型提供商支持(Ollama、OpenRouter、OpenAI、Anthropic)
- 内置 10 个实用工具(Bash、BashOutput、KillShell、Read、Write、Edit、Glob、Grep、LS、TodoWrite)
- 智能内存管理:Token 计数、自动裁剪、LLM 驱动的历史总结
- 事件驱动的 Agent-UI 通信架构
- 持久化用户设置(~/.yterm/settings.json)
- Winston 日志系统,按会话组织
- 动态模型发现和缓存
- 敏感工具确认机制(使用 LangGraph interrupt)
- 请求中断支持(AbortController)
- 上下文注入系统(CLAUDE.md、TodoWrite)
- 斜杠命令系统(/help、/clear、/model、/compact)
架构亮点
- 事件驱动通信:Agent 和 UI 层通过 EventEmitter 解耦
- 智能模型管理:支持动态模型发现、缓存和自动配置
- 内存优化:智能 Token 计数、自动裁剪和 LLM 驱动的历史总结
- 模块化设计:清晰的 core/ui 层分离,易于扩展
- 类型安全:TypeScript + Zod 运行时验证
- 智能权限系统:安全命令白名单、前缀匹配、会话权限
- 多 API 回退:Location 工具展示的弹性设计模式
