openhorse 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,487 @@
1
+ # OpenHorse
2
+
3
+ > **OpenHorse — 通用 Agent 驾驭框架**
4
+ > 一个 CLI 驱动的编码 Agent,具备安全边界、工具编排、记忆系统和上下文管理。
5
+
6
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18.0-green.svg)](https://nodejs.org)
8
+ [![TypeScript](https://img.shields.io/badge/typescript-5.0-blue.svg)](https://www.typescriptlang.org)
9
+ [![npm](https://img.shields.io/npm/v/openhorse.svg)](https://www.npmjs.com/package/openhorse)
10
+
11
+ ---
12
+
13
+ **🌍 语言**: [English](README.md) | 简体中文
14
+
15
+ ---
16
+
17
+ ## 概览
18
+
19
+ **OpenHorse** 是一个终端编码 Agent,它将 LLM API 封装在安全检查、工具编排、会话管理和上下文感知的驾驭层中。
20
+
21
+ ### 核心理念
22
+
23
+ | 维度 | 说明 |
24
+ |------|------|
25
+ | **AI 如马** | 强大的模型需要引导和约束 |
26
+ | **OpenHorse 如缰** | 精准控制方向,防止跑偏失控 |
27
+ | **Harness 系统** | 安全边界、任务约束、结果验证 |
28
+ | **工具调用** | LLM 自动调用工具完成任务 |
29
+ | **记忆系统** | 分层记忆:工作 / 短期 / 长期 / 语义搜索 |
30
+ | **MCP 协议** | 支持连接外部 MCP Server |
31
+
32
+ ---
33
+
34
+ ## 核心特性
35
+
36
+ | 特性 | 说明 |
37
+ |------|------|
38
+ | **工具编排** | 20+ 内置工具:文件读写、搜索、Shell、网页、记忆、任务、计划 |
39
+ | **多模型支持** | OpenAI、Claude、DashScope(GLM/Qwen/Kimi)、自定义端点 |
40
+ | **上下文感知** | 每个模型独立的上下文窗口,95% 自动压缩 |
41
+ | **动态发现** | 启动时自动通过 `/models` 端点发现模型信息 |
42
+ | **MCP 协议** | 完整 MCP 支持,心跳检测 + 指数退避重连 |
43
+ | **记忆系统** | 用户 / 项目 / 会话记忆,支持语义搜索 |
44
+ | **会话管理** | 会话持久化、历史恢复、摘要生成 |
45
+ | **安全边界** | Bash 安全检查、审计日志、权限模式 |
46
+ | **流式输出** | 实时 LLM 响应,Markdown 渲染 |
47
+ | **状态栏** | 实时显示 Token 用量、成本、模型、上下文百分比 |
48
+ | **精简配置** | 仅 4 个用户字段,其余由 Agent 内部管理 |
49
+
50
+ ---
51
+
52
+ ## 快速开始
53
+
54
+ ### 环境要求
55
+
56
+ - Node.js >= 18.0
57
+ - npm >= 9.0
58
+
59
+ ### 安装运行
60
+
61
+ ```bash
62
+ # 克隆
63
+ git clone https://github.com/Linux2010/openhorse.git
64
+ cd openhorse
65
+
66
+ # 安装依赖
67
+ npm install
68
+
69
+ # 构建
70
+ npm run build
71
+
72
+ # 配置 API Key(任选一种)
73
+ # 方式 1: 环境变量
74
+ export OPENHORSE_API_KEY=your-api-key
75
+
76
+ # 方式 2: .env 文件
77
+ cp .env.example .env
78
+
79
+ # 方式 3: ~/.openhorse/openhorse.json(推荐)
80
+ # 首次运行时自动创建
81
+
82
+ # 启动交互式 CLI
83
+ npm start
84
+ ```
85
+
86
+ ### 全局安装
87
+
88
+ ```bash
89
+ npm link
90
+ # 任意目录运行
91
+ openhorse
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 配置
97
+
98
+ ### 用户配置 (`~/.openhorse/openhorse.json`)
99
+
100
+ 仅 **4 个字段** 对用户开放,其余由 Agent 内部管理:
101
+
102
+ ```json
103
+ {
104
+ "apiKey": "sk-xxx",
105
+ "apiBaseUrl": "https://coding.dashscope.aliyuncs.com/v1",
106
+ "defaultModel": "glm-5",
107
+ "fallbackModel": "qwen-plus"
108
+ }
109
+ ```
110
+
111
+ | 字段 | 必填 | 说明 |
112
+ |------|------|------|
113
+ | `apiKey` | 是 | LLM API 密钥 |
114
+ | `apiBaseUrl` | 否 | API 端点 URL |
115
+ | `defaultModel` | 否 | 默认模型(`glm-5`) |
116
+ | `fallbackModel` | 否 | 失败时的降级模型 |
117
+
118
+ ### Agent 内部参数
119
+
120
+ | 参数 | 默认值 | 说明 |
121
+ |------|--------|------|
122
+ | `maxTokens` | 8192 | 最大输出 Token 数 |
123
+ | `temperature` | 0.1 | 采样温度 |
124
+ | `maxRetries` | 3 | 失败重试次数 |
125
+ | `retryBaseDelay` | 1000ms | 重试基础延迟 |
126
+
127
+ ### 配置优先级
128
+
129
+ ```
130
+ CLI 参数 > ~/.openhorse/openhorse.json > 环境变量 > 内部默认
131
+ ```
132
+
133
+ ### 环境变量
134
+
135
+ | 变量 | 默认值 | 说明 |
136
+ |------|--------|------|
137
+ | `OPENHORSE_API_KEY` | - | LLM API 密钥 |
138
+ | `OPENHORSE_API_BASE_URL` | - | API 基础 URL |
139
+ | `OPENHORSE_MODEL` | `glm-5` | 默认模型 |
140
+ | `OPENHORSE_MODE` | `development` | 运行模式 |
141
+ | `OPENHORSE_LOG_LEVEL` | `info` | 日志级别 |
142
+ | `OPENHORSE_EMBEDDING_PROVIDER` | - | Embedding 服务(ollama/openai) |
143
+
144
+ 详见 [docs/config.md](docs/config.md)。
145
+
146
+ ---
147
+
148
+ ## 支持的模型
149
+
150
+ ### 模型家族
151
+
152
+ | 服务商 | 模型 | 端点 |
153
+ |--------|------|------|
154
+ | **GLM(智谱)** | `glm-5`, `glm-4` | DashScope coding |
155
+ | **Qwen(通义)** | `qwen-turbo`, `qwen-plus`, `qwen-max`, `qwen-long` | DashScope coding |
156
+ | **OpenAI** | `gpt-4o`, `gpt-4o-mini`, `gpt-4` | OpenAI API |
157
+ | **Claude** | `claude-sonnet-4-6`, `claude-opus-4-8` | Anthropic API |
158
+ | **DeepSeek** | `deepseek-chat`, `deepseek-reasoner` | DeepSeek API |
159
+
160
+ ### 上下文窗口
161
+
162
+ OpenHorse 跟踪每个模型的上下文窗口,在 **95% 用量时自动压缩**:
163
+
164
+ | 模型 | 上下文 | 最大输出 |
165
+ |------|--------|----------|
166
+ | `glm-5` | 202,752 | 8,192 |
167
+ | `qwen-long` | 1,000,000 | 8,192 |
168
+ | `qwen-plus` | 131,072 | 8,192 |
169
+ | `gpt-4o` | 128,000 | 16,384 |
170
+ | `claude-sonnet-4-6` | 200,000 | 16,000 |
171
+ | `claude-opus-4-8` | 200,000 | 32,000 |
172
+
173
+ 未知模型默认使用 **128,000** 上下文。
174
+
175
+ ### 动态发现
176
+
177
+ 启动时 OpenHorse 会查询 `/models` 端点获取上下文数据。若端点不支持(如 DashScope coding 返回 404),则静默回退到内置数据库。
178
+
179
+ ### 模型命令
180
+
181
+ ```bash
182
+ /model # 显示当前模型
183
+ /model list # 列出所有可用模型
184
+ /model glm-5 # 切换到 GLM-5
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 工具列表
190
+
191
+ ### 文件操作
192
+
193
+ | 工具 | 说明 |
194
+ |------|------|
195
+ | `read_file` | 读取文件内容 |
196
+ | `write_file` | 写入文件 |
197
+ | `edit_file` | 编辑文件(行替换) |
198
+ | `list_files` | 列出目录内容 |
199
+ | `glob` | Glob 模式搜索文件 |
200
+ | `grep` | 正则搜索文件内容 |
201
+
202
+ ### Shell 执行
203
+
204
+ | 工具 | 说明 |
205
+ |------|------|
206
+ | `exec_command` | 执行 Shell 命令(带安全检查) |
207
+
208
+ ### 网络工具
209
+
210
+ | 工具 | 说明 |
211
+ |------|------|
212
+ | `web_fetch` | 抓取网页内容 |
213
+ | `web_search` | 网络搜索 |
214
+
215
+ ### 记忆系统
216
+
217
+ | 工具 | 说明 |
218
+ |------|------|
219
+ | `memory_save` | 保存记忆 |
220
+ | `memory_recall` | 搜索记忆 |
221
+ | `memory_forget` | 删除记忆 |
222
+
223
+ ### 任务管理
224
+
225
+ | 工具 | 说明 |
226
+ |------|------|
227
+ | `todo_write` | 创建/更新任务列表 |
228
+ | `enter_plan_mode` | 进入计划模式 |
229
+ | `exit_plan_mode` | 退出计划模式 |
230
+
231
+ ---
232
+
233
+ ## 上下文管理
234
+
235
+ ### 自动压缩 (Auto-Compact)
236
+
237
+ 当上下文使用量达到 **95%** 时,OpenHorse 自动压缩对话历史:
238
+
239
+ 1. **生成摘要** — 通过 LLM 对早期消息生成摘要
240
+ 2. **替换旧消息** — 用 `[Context Summary]` 块替代
241
+ 3. **保留关键信息** — 保留系统消息和最近消息
242
+ 4. **状态栏通知** — 显示压缩信息
243
+
244
+ ```
245
+ Compact: 30 → 8 messages | Context: 45% → 12%
246
+ ```
247
+
248
+ ### 基于 Token 的阈值
249
+
250
+ 与基于消息数量的方案不同,OpenHorse 使用 API 返回的 **实际 Token 数** 进行精确的上下文感知:
251
+
252
+ ```
253
+ ctxPercent = (promptTokens / 模型上下文窗口) × 100
254
+ ```
255
+
256
+ 仅当 `ctxPercent >= 95%` 时触发压缩,不基于消息数量。
257
+
258
+ ### 30 秒间隔
259
+
260
+ 为避免过度压缩,自动压缩最多每 30 秒执行一次。手动 `/compact` 命令可绕过此限制。
261
+
262
+ ---
263
+
264
+ ## MCP 协议
265
+
266
+ 完整支持 MCP (Model Context Protocol) 服务器:
267
+
268
+ ### 配置 MCP Server
269
+
270
+ 创建 `~/.openhorse/mcp.json`:
271
+
272
+ ```json
273
+ {
274
+ "servers": {
275
+ "telegram": {
276
+ "command": "node",
277
+ "args": ["path/to/plugin-telegram/dist/index.js"],
278
+ "env": {}
279
+ },
280
+ "filesystem": {
281
+ "command": "npx",
282
+ "args": ["-y", "@anthropic/mcp-server-filesystem", "/allowed/dir"]
283
+ }
284
+ }
285
+ }
286
+ ```
287
+
288
+ ### MCP 命令
289
+
290
+ ```bash
291
+ /mcp # 显示 MCP Server 连接状态
292
+ ```
293
+
294
+ 启动时自动连接,支持心跳检测和指数退避重连。
295
+
296
+ ---
297
+
298
+ ## 交互命令
299
+
300
+ | 命令 | 别名 | 说明 |
301
+ |------|------|------|
302
+ | `/help` | `/h` | 显示帮助信息 |
303
+ | `/status` | `/s` | 系统状态总览 |
304
+ | `/model` | - | 查看或切换模型 |
305
+ | `/config` | - | 显示当前配置 |
306
+ | `/cost` | - | 显示 Token 用量和成本 |
307
+ | `/compact` | - | 手动触发上下文压缩 |
308
+ | `/sessions` | - | 列出最近会话 |
309
+ | `/resume` | - | 恢复上次会话 |
310
+ | `/memory` | - | 记忆系统状态 |
311
+ | `/memory reindex` | - | 重建语义搜索索引 |
312
+ | `/skills` | - | 列出已加载技能 |
313
+ | `/mcp` | - | MCP Server 状态 |
314
+ | `/agents` | - | Agent 列表 |
315
+ | `/safety` | - | 安全检查配置 |
316
+ | `/task` | - | 任务管理 |
317
+ | `/run` | - | 通过 Agent 执行任务 |
318
+ | `/clear` | - | 清屏 |
319
+ | `/clear-history` | `/reset` | 清除对话历史 |
320
+ | `/exit` | `/q` | 退出 |
321
+
322
+ ---
323
+
324
+ ## 项目结构
325
+
326
+ ```
327
+ openhorse/
328
+ ├── bin/
329
+ │ └── openhorse # CLI 入口
330
+ ├── src/
331
+ │ ├── cli.ts # CLI 交互入口
332
+ │ ├── commands/ # 斜杠命令
333
+ │ │ ├── index.ts # 命令注册表
334
+ │ │ ├── parser.ts # 输入解析器
335
+ │ │ └── types.ts # 命令类型
336
+ │ ├── core/ # 核心逻辑
337
+ │ │ ├── agent.ts # Agent 基类
338
+ │ │ ├── brain.ts # 决策引擎
339
+ │ │ └── strategy-tracker.ts # 策略追踪
340
+ │ ├── agents/ # Agent 实现
341
+ │ │ ├── leader.ts # 协调者 Agent
342
+ │ │ ├── coder.ts # 编码 Agent
343
+ │ │ └── router.ts # Agent 路由
344
+ │ ├── framework/
345
+ │ │ ├── store.ts # 状态管理
346
+ │ │ ├── query.ts # 查询引擎(异步生成器)
347
+ │ │ └── tool-state.ts # 工具状态
348
+ │ ├── harness/ # 安全与约束
349
+ │ │ ├── safety.ts # 安全检查
350
+ │ │ └── bash-safety.ts # Bash 命令安全
351
+ │ ├── memory/ # 记忆系统
352
+ │ │ ├── storage.ts # 记忆存储
353
+ │ │ ├── semantic-search.ts # 语义搜索
354
+ │ │ ├── embeddings.ts # Embedding 生成
355
+ │ │ └── vector-store.ts # 向量存储(SQLite vec0)
356
+ │ ├── skills/ # 技能系统
357
+ │ │ ├── loader.ts # 技能加载器
358
+ │ │ └── registry.ts # 技能注册表
359
+ │ ├── services/
360
+ │ │ ├── llm.ts # LLM 服务(重试/降级)
361
+ │ │ ├── config.ts # 配置加载
362
+ │ │ ├── global-config.ts # 全局配置
363
+ │ │ ├── model-context.ts # 模型上下文数据库 + 发现
364
+ │ │ ├── session-storage.ts # 会话持久化
365
+ │ │ ├── atomic-write.ts # 原子写入
366
+ │ │ ├── agent-runner.ts # Agent 执行器
367
+ │ │ ├── task-manager.ts # 任务管理器
368
+ │ │ └── file-glob.ts # 文件匹配
369
+ │ ├── services/compact/ # 上下文压缩
370
+ │ │ ├── auto-compact.ts # 基于 Token 的自动压缩
371
+ │ │ ├── compact.ts # 压缩实现
372
+ │ │ └── summary-generator.ts # 摘要生成
373
+ │ ├── tools/ # 工具实现
374
+ │ │ ├── index.ts # 工具注册表
375
+ │ │ ├── mcp.ts # MCP 客户端
376
+ │ │ ├── todo.ts # 任务工具
377
+ │ │ ├── plan.ts # 计划工具
378
+ │ │ ├── web.ts # 网页工具
379
+ │ │ └── memory.ts # 记忆工具
380
+ │ └── ui/ # UI 组件
381
+ │ ├── box.ts # UI 框
382
+ │ ├── markdown.ts # Markdown 渲染
383
+ │ ├── status-bar.ts # 状态栏
384
+ │ ├── stream-markdown.ts # 流式 Markdown
385
+ │ ├── tool-preview.ts # 工具预览卡片
386
+ │ └── suggestions.ts # 命令建议
387
+ ├── tests/ # 测试套件
388
+ ├── docs/ # 文档
389
+ │ ├── version/ # 版本发布说明
390
+ │ ├── roadmap/ # 版本路线图
391
+ │ └── config.md # 配置指南
392
+ ├── .env.example # 环境变量模板
393
+ ├── package.json
394
+ └── tsconfig.json
395
+ ```
396
+
397
+ ---
398
+
399
+ ## 版本历史
400
+
401
+ ### v0.1.16(当前开发中)
402
+
403
+ - **基于 Token 的自动压缩** — 95% 上下文使用量触发(替代消息数量阈值)
404
+ - **模型上下文感知** — 每个模型独立的上下文窗口(15+ 已知模型)
405
+ - **动态模型发现** — 启动时查询 `/models` 端点
406
+ - **精简用户配置** — 仅 4 个字段:`apiKey`、`apiBaseUrl`、`defaultModel`、`fallbackModel`
407
+ - **Agent 内部管理** — `maxTokens`、`temperature`、`retries` 由 Agent 内部控制
408
+ - **用户可配置 Fallback 模型**
409
+ - **命令面板渲染优化**
410
+ - **上下文编排工作流** — 多 Agent 上下文管理
411
+
412
+ ### v0.1.15
413
+
414
+ - **完整 Markdown 流式渲染** — 语法高亮
415
+ - **CJK 文本宽度计算修复** — 终端显示
416
+ - **命令面板输入清除优化**
417
+ - 表格渲染移除(改为原始透传)
418
+
419
+ ### v0.1.14
420
+
421
+ - LSP 崩溃修复、紧凑 UI、精简 Agent 输出
422
+
423
+ ### v0.1.10 — v0.1.13
424
+
425
+ - MCP 客户端(心跳/重连)、语义搜索、技能系统、原子写入、模型别名、存储修复
426
+
427
+ ### v0.1.1 — v0.1.9
428
+
429
+ - CLI 框架、Harness 系统、记忆系统、会话管理、工具编排
430
+
431
+ 详见 `docs/version/` 目录。
432
+
433
+ ---
434
+
435
+ ## 开发
436
+
437
+ ```bash
438
+ # 安装依赖
439
+ npm install
440
+
441
+ # 开发模式(热重载)
442
+ npm run dev
443
+
444
+ # 构建
445
+ npm run build
446
+
447
+ # 运行测试
448
+ npm test
449
+
450
+ # 代码检查
451
+ npm run lint
452
+
453
+ # 格式化
454
+ npm run format
455
+ ```
456
+
457
+ ---
458
+
459
+ ## Roadmap
460
+
461
+ | 版本 | 目标 |
462
+ |------|------|
463
+ | v0.1.16 | 上下文感知、自动压缩、配置精简 |
464
+ | v0.1.17 | Agent 生命周期增强、工具编排优化 |
465
+ | v0.1.18 | 插件/Hook 系统 |
466
+ | v0.1.19 | VS Code 扩展 |
467
+ | v0.1.20 | Web UI 面板 |
468
+
469
+ 详见 `docs/roadmap/` 目录。
470
+
471
+ ---
472
+
473
+ ## 贡献
474
+
475
+ 欢迎提交 Issue 和 Pull Request!
476
+
477
+ ---
478
+
479
+ ## 许可
480
+
481
+ MIT License — 详见 [LICENSE](LICENSE)
482
+
483
+ ---
484
+
485
+ **OpenHorse — Universal Agent Harness Framework.**
486
+
487
+ *"AI 如马,OpenHorse 如缰。"*
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAogB3E,iBAAe,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmRpF;AAqjBD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAE5C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAwgB3E,iBAAe,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0PpF;AAysBD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAE5C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC"}