@tachu/extensions 1.0.0-beta.1 → 1.0.0-rc.1

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.
Files changed (243) hide show
  1. package/CHANGELOG.md +48 -65
  2. package/README.md +83 -708
  3. package/README_ZH.md +82 -696
  4. package/dist/backends/file.d.ts +6 -6
  5. package/dist/backends/file.d.ts.map +1 -1
  6. package/dist/backends/file.js +27 -11
  7. package/dist/backends/file.js.map +1 -1
  8. package/dist/backends/terminal.d.ts +6 -6
  9. package/dist/backends/terminal.d.ts.map +1 -1
  10. package/dist/backends/terminal.js +31 -7
  11. package/dist/backends/terminal.js.map +1 -1
  12. package/dist/backends/web.d.ts +6 -6
  13. package/dist/backends/web.d.ts.map +1 -1
  14. package/dist/backends/web.js +10 -8
  15. package/dist/backends/web.js.map +1 -1
  16. package/dist/common/net.d.ts +8 -0
  17. package/dist/common/net.d.ts.map +1 -1
  18. package/dist/common/net.js +39 -24
  19. package/dist/common/net.js.map +1 -1
  20. package/dist/common/path.d.ts +38 -5
  21. package/dist/common/path.d.ts.map +1 -1
  22. package/dist/common/path.js +55 -13
  23. package/dist/common/path.js.map +1 -1
  24. package/dist/common/process.js.map +1 -1
  25. package/dist/index.d.ts +7 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +7 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp/sse-adapter.d.ts +45 -33
  30. package/dist/mcp/sse-adapter.d.ts.map +1 -1
  31. package/dist/mcp/sse-adapter.js +59 -34
  32. package/dist/mcp/sse-adapter.js.map +1 -1
  33. package/dist/mcp/stdio-adapter.d.ts +45 -33
  34. package/dist/mcp/stdio-adapter.d.ts.map +1 -1
  35. package/dist/mcp/stdio-adapter.js +59 -34
  36. package/dist/mcp/stdio-adapter.js.map +1 -1
  37. package/dist/memory/fs-memory-system.d.ts +288 -0
  38. package/dist/memory/fs-memory-system.d.ts.map +1 -0
  39. package/dist/memory/fs-memory-system.js +482 -0
  40. package/dist/memory/fs-memory-system.js.map +1 -0
  41. package/dist/memory/index.d.ts +5 -0
  42. package/dist/memory/index.d.ts.map +1 -0
  43. package/dist/memory/index.js +5 -0
  44. package/dist/memory/index.js.map +1 -0
  45. package/dist/memory/projection-outbox.d.ts +69 -0
  46. package/dist/memory/projection-outbox.d.ts.map +1 -0
  47. package/dist/memory/projection-outbox.js +187 -0
  48. package/dist/memory/projection-outbox.js.map +1 -0
  49. package/dist/memory/projection-projector.d.ts +16 -0
  50. package/dist/memory/projection-projector.d.ts.map +1 -0
  51. package/dist/memory/projection-projector.js +56 -0
  52. package/dist/memory/projection-projector.js.map +1 -0
  53. package/dist/memory/projection-worker.d.ts +28 -0
  54. package/dist/memory/projection-worker.d.ts.map +1 -0
  55. package/dist/memory/projection-worker.js +84 -0
  56. package/dist/memory/projection-worker.js.map +1 -0
  57. package/dist/observability/jsonl-emitter.d.ts +25 -25
  58. package/dist/observability/jsonl-emitter.d.ts.map +1 -1
  59. package/dist/observability/jsonl-emitter.js +25 -25
  60. package/dist/observability/jsonl-emitter.js.map +1 -1
  61. package/dist/observability/otel-emitter.d.ts +23 -23
  62. package/dist/observability/otel-emitter.d.ts.map +1 -1
  63. package/dist/observability/otel-emitter.js +39 -30
  64. package/dist/observability/otel-emitter.js.map +1 -1
  65. package/dist/providers/anthropic.d.ts +51 -32
  66. package/dist/providers/anthropic.d.ts.map +1 -1
  67. package/dist/providers/anthropic.js +293 -58
  68. package/dist/providers/anthropic.js.map +1 -1
  69. package/dist/providers/gemini.d.ts +115 -0
  70. package/dist/providers/gemini.d.ts.map +1 -0
  71. package/dist/providers/gemini.js +901 -0
  72. package/dist/providers/gemini.js.map +1 -0
  73. package/dist/providers/index.d.ts +2 -0
  74. package/dist/providers/index.d.ts.map +1 -1
  75. package/dist/providers/index.js +2 -0
  76. package/dist/providers/index.js.map +1 -1
  77. package/dist/providers/mock.d.ts +67 -24
  78. package/dist/providers/mock.d.ts.map +1 -1
  79. package/dist/providers/mock.js +122 -41
  80. package/dist/providers/mock.js.map +1 -1
  81. package/dist/providers/openai.d.ts +70 -35
  82. package/dist/providers/openai.d.ts.map +1 -1
  83. package/dist/providers/openai.js +330 -50
  84. package/dist/providers/openai.js.map +1 -1
  85. package/dist/providers/qwen.d.ts +146 -0
  86. package/dist/providers/qwen.d.ts.map +1 -0
  87. package/dist/providers/qwen.js +672 -0
  88. package/dist/providers/qwen.js.map +1 -0
  89. package/dist/safety/default-gate.d.ts +112 -0
  90. package/dist/safety/default-gate.d.ts.map +1 -0
  91. package/dist/safety/default-gate.js +188 -0
  92. package/dist/safety/default-gate.js.map +1 -0
  93. package/dist/safety/index.d.ts +2 -0
  94. package/dist/safety/index.d.ts.map +1 -0
  95. package/dist/safety/index.js +2 -0
  96. package/dist/safety/index.js.map +1 -0
  97. package/dist/tools/_shared/web-client.d.ts +18 -0
  98. package/dist/tools/_shared/web-client.d.ts.map +1 -0
  99. package/dist/tools/_shared/web-client.js +46 -0
  100. package/dist/tools/_shared/web-client.js.map +1 -0
  101. package/dist/tools/apply-patch/executor.d.ts.map +1 -1
  102. package/dist/tools/apply-patch/executor.js +54 -4
  103. package/dist/tools/apply-patch/executor.js.map +1 -1
  104. package/dist/tools/edit-file/executor.d.ts +32 -0
  105. package/dist/tools/edit-file/executor.d.ts.map +1 -0
  106. package/dist/tools/edit-file/executor.js +84 -0
  107. package/dist/tools/edit-file/executor.js.map +1 -0
  108. package/dist/tools/fetch-url/descriptor.md +6 -0
  109. package/dist/tools/fetch-url/executor.d.ts +8 -0
  110. package/dist/tools/fetch-url/executor.d.ts.map +1 -1
  111. package/dist/tools/fetch-url/executor.js +83 -2
  112. package/dist/tools/fetch-url/executor.js.map +1 -1
  113. package/dist/tools/git-blame/executor.d.ts +24 -0
  114. package/dist/tools/git-blame/executor.d.ts.map +1 -0
  115. package/dist/tools/git-blame/executor.js +76 -0
  116. package/dist/tools/git-blame/executor.js.map +1 -0
  117. package/dist/tools/git-branch/executor.d.ts +22 -0
  118. package/dist/tools/git-branch/executor.d.ts.map +1 -0
  119. package/dist/tools/git-branch/executor.js +81 -0
  120. package/dist/tools/git-branch/executor.js.map +1 -0
  121. package/dist/tools/git-diff/executor.d.ts +37 -0
  122. package/dist/tools/git-diff/executor.d.ts.map +1 -0
  123. package/dist/tools/git-diff/executor.js +156 -0
  124. package/dist/tools/git-diff/executor.js.map +1 -0
  125. package/dist/tools/git-log/executor.d.ts +31 -0
  126. package/dist/tools/git-log/executor.d.ts.map +1 -0
  127. package/dist/tools/git-log/executor.js +65 -0
  128. package/dist/tools/git-log/executor.js.map +1 -0
  129. package/dist/tools/git-show/executor.d.ts +22 -0
  130. package/dist/tools/git-show/executor.d.ts.map +1 -0
  131. package/dist/tools/git-show/executor.js +74 -0
  132. package/dist/tools/git-show/executor.js.map +1 -0
  133. package/dist/tools/git-status/executor.d.ts +25 -0
  134. package/dist/tools/git-status/executor.d.ts.map +1 -0
  135. package/dist/tools/git-status/executor.js +120 -0
  136. package/dist/tools/git-status/executor.js.map +1 -0
  137. package/dist/tools/glob/executor.d.ts +18 -0
  138. package/dist/tools/glob/executor.d.ts.map +1 -0
  139. package/dist/tools/glob/executor.js +47 -0
  140. package/dist/tools/glob/executor.js.map +1 -0
  141. package/dist/tools/index.d.ts +1 -1
  142. package/dist/tools/index.d.ts.map +1 -1
  143. package/dist/tools/index.js +459 -4
  144. package/dist/tools/index.js.map +1 -1
  145. package/dist/tools/list-dir/executor.d.ts.map +1 -1
  146. package/dist/tools/list-dir/executor.js +5 -3
  147. package/dist/tools/list-dir/executor.js.map +1 -1
  148. package/dist/tools/multi-edit/executor.d.ts +29 -0
  149. package/dist/tools/multi-edit/executor.d.ts.map +1 -0
  150. package/dist/tools/multi-edit/executor.js +37 -0
  151. package/dist/tools/multi-edit/executor.js.map +1 -0
  152. package/dist/tools/read-file/executor.d.ts +5 -0
  153. package/dist/tools/read-file/executor.d.ts.map +1 -1
  154. package/dist/tools/read-file/executor.js +49 -5
  155. package/dist/tools/read-file/executor.js.map +1 -1
  156. package/dist/tools/run-shell/executor.d.ts +12 -1
  157. package/dist/tools/run-shell/executor.d.ts.map +1 -1
  158. package/dist/tools/run-shell/executor.js +105 -9
  159. package/dist/tools/run-shell/executor.js.map +1 -1
  160. package/dist/tools/run-tests/executor.d.ts +28 -0
  161. package/dist/tools/run-tests/executor.d.ts.map +1 -0
  162. package/dist/tools/run-tests/executor.js +161 -0
  163. package/dist/tools/run-tests/executor.js.map +1 -0
  164. package/dist/tools/run-typecheck/executor.d.ts +25 -0
  165. package/dist/tools/run-typecheck/executor.d.ts.map +1 -0
  166. package/dist/tools/run-typecheck/executor.js +83 -0
  167. package/dist/tools/run-typecheck/executor.js.map +1 -0
  168. package/dist/tools/search-code/executor.d.ts.map +1 -1
  169. package/dist/tools/search-code/executor.js +60 -30
  170. package/dist/tools/search-code/executor.js.map +1 -1
  171. package/dist/tools/shared.d.ts +26 -0
  172. package/dist/tools/shared.d.ts.map +1 -1
  173. package/dist/tools/shared.js +15 -0
  174. package/dist/tools/shared.js.map +1 -1
  175. package/dist/tools/todo-read/executor.d.ts +20 -0
  176. package/dist/tools/todo-read/executor.d.ts.map +1 -0
  177. package/dist/tools/todo-read/executor.js +26 -0
  178. package/dist/tools/todo-read/executor.js.map +1 -0
  179. package/dist/tools/todo-write/executor.d.ts +21 -0
  180. package/dist/tools/todo-write/executor.d.ts.map +1 -0
  181. package/dist/tools/todo-write/executor.js +38 -0
  182. package/dist/tools/todo-write/executor.js.map +1 -0
  183. package/dist/tools/web-fetch/descriptor.md +198 -0
  184. package/dist/tools/web-fetch/errors.d.ts +32 -0
  185. package/dist/tools/web-fetch/errors.d.ts.map +1 -0
  186. package/dist/tools/web-fetch/errors.js +91 -0
  187. package/dist/tools/web-fetch/errors.js.map +1 -0
  188. package/dist/tools/web-fetch/executor.d.ts +10 -0
  189. package/dist/tools/web-fetch/executor.d.ts.map +1 -0
  190. package/dist/tools/web-fetch/executor.js +191 -0
  191. package/dist/tools/web-fetch/executor.js.map +1 -0
  192. package/dist/tools/web-fetch/index.d.ts +4 -0
  193. package/dist/tools/web-fetch/index.d.ts.map +1 -0
  194. package/dist/tools/web-fetch/index.js +3 -0
  195. package/dist/tools/web-fetch/index.js.map +1 -0
  196. package/dist/tools/web-fetch/types.d.ts +157 -0
  197. package/dist/tools/web-fetch/types.d.ts.map +1 -0
  198. package/dist/tools/web-fetch/types.js +7 -0
  199. package/dist/tools/web-fetch/types.js.map +1 -0
  200. package/dist/tools/web-search/descriptor.md +89 -0
  201. package/dist/tools/web-search/errors.d.ts +33 -0
  202. package/dist/tools/web-search/errors.d.ts.map +1 -0
  203. package/dist/tools/web-search/errors.js +45 -0
  204. package/dist/tools/web-search/errors.js.map +1 -0
  205. package/dist/tools/web-search/executor.d.ts +10 -0
  206. package/dist/tools/web-search/executor.d.ts.map +1 -0
  207. package/dist/tools/web-search/executor.js +185 -0
  208. package/dist/tools/web-search/executor.js.map +1 -0
  209. package/dist/tools/web-search/index.d.ts +4 -0
  210. package/dist/tools/web-search/index.d.ts.map +1 -0
  211. package/dist/tools/web-search/index.js +3 -0
  212. package/dist/tools/web-search/index.js.map +1 -0
  213. package/dist/tools/web-search/types.d.ts +86 -0
  214. package/dist/tools/web-search/types.d.ts.map +1 -0
  215. package/dist/tools/web-search/types.js +7 -0
  216. package/dist/tools/web-search/types.js.map +1 -0
  217. package/dist/tools/write-file/executor.js +3 -3
  218. package/dist/tools/write-file/executor.js.map +1 -1
  219. package/dist/transformers/document-to-text.d.ts +11 -11
  220. package/dist/transformers/document-to-text.d.ts.map +1 -1
  221. package/dist/transformers/document-to-text.js +11 -11
  222. package/dist/transformers/document-to-text.js.map +1 -1
  223. package/dist/transformers/image-to-text.d.ts +15 -15
  224. package/dist/transformers/image-to-text.d.ts.map +1 -1
  225. package/dist/transformers/image-to-text.js +22 -21
  226. package/dist/transformers/image-to-text.js.map +1 -1
  227. package/dist/vector/index.d.ts +4 -2
  228. package/dist/vector/index.d.ts.map +1 -1
  229. package/dist/vector/index.js +2 -2
  230. package/dist/vector/index.js.map +1 -1
  231. package/dist/vector/local-fs-index.d.ts +59 -0
  232. package/dist/vector/local-fs-index.d.ts.map +1 -0
  233. package/dist/vector/local-fs-index.js +216 -0
  234. package/dist/vector/local-fs-index.js.map +1 -0
  235. package/dist/vector/qdrant.d.ts +11 -52
  236. package/dist/vector/qdrant.d.ts.map +1 -1
  237. package/dist/vector/qdrant.js +39 -105
  238. package/dist/vector/qdrant.js.map +1 -1
  239. package/package.json +27 -6
  240. package/dist/vector/local-fs.d.ts +0 -76
  241. package/dist/vector/local-fs.d.ts.map +0 -1
  242. package/dist/vector/local-fs.js +0 -153
  243. package/dist/vector/local-fs.js.map +0 -1
package/README_ZH.md CHANGED
@@ -1,39 +1,81 @@
1
1
  # Tachu
2
2
 
3
- **生产级 Agentic 引擎——将任何 LLM 变为可靠、可观测、生产就绪 Agent 的 Harness。**
3
+ **正在积极开发中的 Agentic 引擎——目标是成为将任何 LLM 变为可靠、可观测 Agent 的 *Harness*。**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@tachu/core?label=%40tachu%2Fcore)](https://www.npmjs.com/package/@tachu/core)
6
+ [![status: rc](https://img.shields.io/badge/status-rc-blue)](#项目状态project-status)
6
7
  [![license: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue)](#许可证license)
7
8
  [![bun](https://img.shields.io/badge/runtime-bun-orange)](https://bun.sh)
8
9
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)
9
10
 
11
+ > **项目状态 —— Release Candidate。** 9 阶段主干、Registry、Prompt 组装、CLI、OpenAI / Anthropic / Qwen / Gemini Adapter、MCP Adapter、向量存储与可观测性 Emitter 已完成接线并有测试覆盖。Phase 3(意图分析)是真实 LLM 调用,Phase 5 会把复杂且具备可见工具的请求路由到内置 `tool-use` loop,Phase 8 运行 deterministic 验证规则并支持可选 semantic judge。Runtime provider fallback 与 semantic judge 生产级策略属于 rc 后续加固。请使用 `@rc` dist-tag 安装。
12
+
10
13
  ---
11
14
 
12
15
  ## 什么是 Tachu?
13
16
 
14
17
  **太初有道,万物之始。以声明式描述符创造 Agent 万物。**
15
18
 
16
- Tachu 是一个**生产级 Agentic 引擎**——不是 Demo 玩具,不是 API 薄封装。它是等式 **Agent = Model + Harness** 中的 *Harness*:提供结构骨架(协议、生命周期、安全、记忆、编排),让任何 LLM 都能成为可靠、可观测、可生产部署的 Agent。
19
+ Tachu 的目标是成为一个**你可以基于它做真实产品的 Agentic 引擎**——不是 Demo 玩具,不是 API 薄封装。它是等式 **Agent = Model + Harness** 中的 *Harness*:提供结构骨架(协议、生命周期、安全、记忆、编排),让任何 LLM 都能成为可靠、可观测的 Agent。
17
20
 
18
- 引擎本身刻意**不感知业务领域**——它不知道你的业务逻辑、用户身份或领域词汇。取而代之的是,它定义了一套极简的核心抽象(Rules、Skills、Tools、Agents),业务通过这些抽象注入所有智能。Tachu 处理那些真正困难的部分:9 阶段执行主干、双平面语义匹配、上下文窗口管理、精确 Token 计数的 Prompt 组装、结构化重试/降级、取消传播,以及端到端可观测性。
21
+ 引擎本身刻意**不感知业务领域**——它不知道你的业务逻辑、用户身份或领域词汇。取而代之的是,它定义了一套极简的核心抽象(Rules、Skills、Tools、Agents),业务通过这些抽象注入所有智能。Tachu 被设计来处理那些真正困难的部分:9 阶段执行主干、双平面语义匹配、上下文窗口管理、精确 Token 计数的 Prompt 组装、结构化重试/降级、取消传播,以及端到端可观测性。
19
22
 
20
- Tachu 以 Bun 原生 TypeScript Monorepo 形式发布,包含三个包:零依赖引擎核心(`@tachu/core`)、生产级官方扩展库(`@tachu/extensions`),以及完整功能的 CLI 程序(`@tachu/cli`)——后者同时也是参考实现。
23
+ Tachu 以 Bun 原生 TypeScript Monorepo 形式发布,包含三个已发布包:零依赖引擎核心(`@tachu/core`)、官方扩展库(`@tachu/extensions`),以及完整功能的 CLI 程序(`@tachu/cli`,同时也是参考实现);另外有 `@tachu/host-defaults` 供 CLI 与嵌入式 host 共享默认装配,以及一个可选的私有 sidecar 包(`@tachu/web-fetch-server`),用于远端浏览器抓取类工具。
24
+
25
+ ---
26
+
27
+ ## 项目状态(Project Status)
28
+
29
+ **当前发布版本:** `1.0.0-rc.0`(`rc` dist-tag)
30
+
31
+ **版本术语:** 当前产品线为 **Tachu v1**。Release candidate 是 `1.0.0` 的稳定化构建,不是新的框架代际;`/v1/extract` 等仅为 HTTP API 版本。详见 [详细设计 · 版本与发布术语](docs/detailed-design.md#版本与发布术语必读)。
32
+
33
+ 这是一次**架构骨架**发布——核心基础设施基本就绪,但 Result Validation 与若干生产化闭环仍未完成。下表仅为**可读性索引**;运行时行为、默认值与边界情况以所引用的源码与测试为准,不在此重复展开。
34
+
35
+ | 能力 | 状态 | 说明 |
36
+ |-----|------|-----|
37
+ | 9 阶段主干骨架(类型、编排器、状态机、Hook 链路) | ✅ 已实现 | `packages/core/src/engine` |
38
+ | Descriptor Registry(Rules / Skills / Tools / Agents) | ✅ 已实现 | Markdown + YAML frontmatter 加载、语义索引、启动校验 |
39
+ | Prompt 组装器(tiktoken、KV Cache 友好顺序) | ✅ 已实现 | `packages/core/src/prompt` |
40
+ | 任务调度器、DAG 校验、turn/task 重试簿记 | ✅ 已实现 | `packages/core/src/engine/scheduler.ts`;**LLM 失败时的 runtime provider fallback 未接线**(见 [LLM Provider](./docs/guides/providers-and-integrations.md)) |
41
+ | Session / Memory / Runtime-state / Safety / Model-router / Provider / Observability / Hooks 八大模块 | ✅ 已实现 | `packages/core/src/modules` |
42
+ | OpenAI / Anthropic / Qwen / Mock Provider Adapter | ✅ 已实现 | CLI 经 `@tachu/host-defaults` 自动装配;流式、函数调用、工具 Schema |
43
+ | Gemini Provider Adapter | ✅ 已实现(需手动接线) | `@tachu/extensions` 提供 `GeminiProviderAdapter` 与单测;**不会**被 CLI 默认 `buildProviderAdapter` 注册 —— 需 `createEngine(..., { providers: [new GeminiProviderAdapter(...)] })` 显式注入(见 [LLM Provider](./docs/guides/providers-and-integrations.md)) |
44
+ | `apiKey` / `baseURL` / `organization` / `timeoutMs` 配置(env var / `tachu.config.ts` / CLI flags) | ✅ 已实现 | 支持 Azure OpenAI / LiteLLM / OpenRouter / 自建网关 |
45
+ | 22 个内置 Tools + Terminal / File / Web Backend | ✅ 已实现 | `packages/extensions/src/tools/index.ts` |
46
+ | MCP stdio + SSE Adapter | ✅ 已实现 | `packages/extensions/src/mcp` |
47
+ | `LocalFsVectorIndexAdapter`(文件持久化)+ `QdrantVectorIndexAdapter`(REST) | ✅ 已实现 | |
48
+ | OTel / JSONL Emitter | ✅ 已实现 | |
49
+ | `tachu init` / `tachu run` / `tachu chat` CLI、流式渲染、Session 持久化、Ctrl+C 语义 | ✅ 已实现 | |
50
+ | **CLI 终端 Markdown 渲染** | ✅ **已实现** | 基于 `marked` + `marked-terminal` + `cli-highlight` 栈。作用于 `tachu chat` / `tachu run --output text` 的最终回复:TTY 环境自动开启,`NO_COLOR` / 非 TTY / `--no-color` 下自动关闭;`tachu run` 支持通过 `--markdown` / `--no-markdown` 显式开关。专用封装 `renderMarkdownToAnsi`(`packages/cli/src/renderer/markdown.ts`),附 12 个单测(`markdown.test.ts`)。 |
51
+ | **Phase 3 意图分析(LLM 调用,纯分类)** | ✅ **已实现** | 仅做分类(`IntentResult`);面向用户的最终答复由 Phase 7 `direct-answer` 负责。**实现:** `packages/core/src/engine/phases/intent.ts`(`INTENT_SYSTEM_PROMPT_BASE`、快速路径、JSON 解析、启发式兜底);测试:`intent.test.ts`。宿主可 **`config.intent.systemPromptBase`** 完整替换 base;可选追加 few-shot:`config.intent.fewShotExamples`(Agent Context / explicit selections 仍由 core 追加)。 |
52
+ | **Phase 5 任务规划(planning router)** | ✅ **已实现** | 强制 `plans[0].tasks.length >= 1`。规则:(1) `simple` 意图 → 单步 `direct-answer` 子流程任务;(2) `complex` + 有可见工具 → 单步 `tool-use` 子流程任务;(3) `complex` + 无可见工具 → 单步 `direct-answer` 子流程任务(携带 `warn: true`);(4) 后置守护:上游回归导致 `tasks` 为空时自动兜底。多步行为由 `tool-use` 内部承担;未来可以继续演进 Plan Preview / Human Review,但主路径不存在单独的默认 LLM 预规划器。 |
53
+ | **`direct-answer` 内置子流程(Phase 7)** | ✅ **已实现** | `packages/core/src/engine/subflows/direct-answer.ts`。解析 `capabilityMapping.intent`(未命中时回退到 `fast-cheap`),组合 system + ≤10 条历史 + 用户 prompt,以合并后的 AbortSignal 调用 `ProviderAdapter.chat()`,单次超时 60s。System Prompt 强制**自然语言 + Markdown**、禁止 JSON 壳 / `"已识别请求:…"` 模板 / 4 空格缩进式代码块;`warn: true` 时子流程会坦诚说明"当前无匹配工具"。observability 事件统一以 `phase: "direct-answer"` 发出(`llm_call_start` / `llm_call_end`)。保留名机制:`DescriptorRegistry` 会把 `direct-answer` 列入保留名,业务侧注册 / 注销同名描述符将抛 `RegistryError.reservedName`。 |
54
+ | **Phase 8 结果验证 Outcome** | 🟡 **部分接线** | `ValidationOutcome` 联合类型 + `ValidationRuleRegistry`(**5 条 deterministic rules**,见 `buildDefaultValidationRuleRegistry()`,`packages/core/src/engine/phases/validation/index.ts`)。可选 `ProviderSemanticJudgeAdapter` / `BudgetedSemanticJudgeAdapter`。Engine 消费 `retry`(turn 循环,`decideTurnRetry`)、`degrade` / `handoff`(退出到 Output)。缺口:无独立 `ExecutionPolicy` 类型;runtime provider fallback 未实现,semantic judge 尚非 production-complete。 |
55
+ | **Phase 9 输出装配** | ✅ **已实现** | 内容选择顺序:`taskResults['task-direct-answer']` → 结构化 `{intent, taskResults}` JSON(工具链成功路径;语义层面的润色仍依赖真实 Phase 8)→ 中文诚实回退文案(validation 未通过)。内部 state JSON 不会再外泄到用户侧。专项测试见 `output.test.ts`。 |
56
+ | 真实环境端到端烟测(OpenAI / Anthropic / Azure 等) | 🟡 **已手工验证;可选脚本化** | CI 内 Adapter 以 Mock 单测为主;维护者已 **手工跑通** 真实 LLM 路径(含自建网关)。仓库提供 **可选** 脚本化 e2e —— 预先配置 `TACHU_REAL_E2E=1` 与 `TACHU_E2E_API_KEY` / `TACHU_E2E_API_BASE` / `TACHU_E2E_PROVIDER`(见[贡献指南](./CONTRIBUTING.md))—— 但默认 CI 不发布签署记录。 |
57
+ | 生产加固(SLO、错误预算、故障注入、签名 provenance) | 🔴 未开展 | `1.0.0`(Tachu v1)目标。 |
58
+
59
+ 图例:✅ 已实现并有测试 · 🟡 骨架存在、真实实现进行中 · 🔴 未开工。
21
60
 
22
61
  ---
23
62
 
24
63
  ## 核心亮点(Key Features)
25
64
 
26
- - **9 阶段执行主干** — 会话管理 → 安全准入 → 意图分析 前置校验 → 任务规划 → DAG 校验 → 子任务执行 → 结果验证 → 输出规范;每个阶段类型安全、可挂钩
65
+ - **9 阶段执行主干** — 会话管理 → 安全准入 → 意图分析(纯分类)→ 前置校验 → planning router → DAG 校验 → 子任务执行 → 结果验证 outcome 输出规范;每个阶段类型安全、可挂钩,且每个请求(simple 或 complex)都会完整穿过 9 个阶段,Rules / Hooks / Observability / 预算熔断统一生效
66
+ - **任务计划 + 工具循环(Task Planning + Tool-use Loop)** — Phase 5 不预先生成完整的排序多步计划,而是把 `simple` 请求路由到 `direct-answer`,把 `complex + 可见工具` 路由进内置 `tool-use` Agentic Loop,由循环内部完成 LLM 工具选择 → 受控工具执行 → 工具结果回灌 → 最终答复。
67
+ - **`direct-answer` 内置子流程** — 对 simple 请求(以及 complex 但无匹配工具的请求),最终答复由一个引擎内置的一等公民子流程在 Phase 7 产出,不再由意图分析阶段捎带。
27
68
  - **双平面匹配(Dual-Plane Matching)** — 语义发现(向量相似度)+ 确定性执行闸门(Scopes、白名单、审批),作用于所有 Rules、Skills、Tools 和 Agents
28
69
  - **四大核心抽象** — 以 Markdown + YAML frontmatter 描述符声明 Rules、Skills、Tools、Agents;引擎自动解析、激活并编排
29
- - **双 Provider 支持**生产级 OpenAI Anthropic Adapter;可配置 Provider 降级顺序,实现零停机 Provider 切换
70
+ - **OpenAI Anthropic Adapter** 流式、函数调用、`baseURL` / `organization` / `timeoutMs` 可配置;可对接 Azure OpenAI / LiteLLM / OpenRouter / 任意自建网关
30
71
  - **MCP 集成** — 通过 `McpToolAdapter` 接入任意 MCP 服务端(stdio 或 SSE);MCP Tools 成为引擎一等公民
31
72
  - **精确 Token 计数** — 基于 tiktoken 的精确 Token 统计;KV Cache 友好的 Prompt 布局;自动上下文压缩(Head-Middle-Tail 策略)
32
73
  - **结构化记忆(Memory System)** — 会话上下文窗口(含可配置上限);压缩前强制归档;长期向量记忆召回
33
74
  - **OpenTelemetry 可观测性** — 每个阶段进入/退出、LLM 调用、Tool 调用、重试和降级都产出结构化 `EngineEvent`;内置 OTel 与 JSONL Emitter
34
- - **生产级 CLI** — `tachu chat` / `tachu run` / `tachu init`,完整参数体系、流式渲染、Session 持久化、Ctrl+C 取消传播
75
+ - **交互式 CLI** — `tachu chat` / `tachu run` / `tachu init`,完整参数体系、流式渲染、Session 持久化、Ctrl+C 取消传播
76
+ - **终端 Markdown 渲染** —— 最终回复由 `marked` + `marked-terminal` + `cli-highlight` 渲染;支持标题、粗体 / 斜体、列表、块引用、链接、表格、带代码高亮的 fenced code block。`NO_COLOR` / 非 TTY / `--no-color` 下自动关闭;`tachu run` 可通过 `--markdown` / `--no-markdown` 显式控制。
35
77
  - **Fail-Closed 安全基线** — 循环防护、预算熔断、基础输入校验硬编码于引擎核心,不可关闭
36
- - **Qdrant 与 LocalFs 向量存储** — 生产环境接入 Qdrant,开发阶段使用内置内存实现
78
+ - **Qdrant 与 LocalFs 向量存储** — 多进程部署使用 Qdrant,本地/单进程使用文件持久化
37
79
 
38
80
  ---
39
81
 
@@ -53,117 +95,17 @@ Tachu 基于三个核心信念:
53
95
 
54
96
  ## 核心抽象(Core Abstractions)
55
97
 
56
- Tachu 的四大核心抽象**平级独立、相互正交**——各自独立注册、独立激活,可在所有引擎阶段组合使用。
57
-
58
- | 抽象 | 本质 | 激活闸门 | 作用 |
59
- |------|------|----------|------|
60
- | **Rules** | 约束与指导 | 语义发现 → 直接激活 | 注入各阶段 LLM System Prompt |
61
- | **Skills** | 知识与指令 | 语义发现 → 直接激活 | 激活后注入 LLM 上下文 |
62
- | **Tools** | 原子可执行操作 | 语义发现 → **必须过闸**(Scopes → 白名单 → 审批) | 带完整副作用追踪的执行 |
63
- | **Agents** | 自然语言驱动的执行单元 | 语义发现 → 可激活 | 递归使用引擎能力;所有 Tool 调用仍走 Tool 闸门 |
64
-
65
- 所有四类抽象共享统一的**描述符格式**(Markdown + YAML frontmatter):
98
+ Rule、Skill、Tool、Agent 以 Markdown + YAML 描述符声明。语义发现给出候选,确定性闸门(尤其 Tool)决定是否执行。
66
99
 
67
- ```yaml
68
- name: unique-name # 必填,同类型内唯一
69
- description: ... # 自然语言描述(用于语义发现)
70
- tags: [tag1, tag2] # 标签,用于过滤和分类
71
- trigger: { type: always } # 激活条件
72
- requires:
73
- - { kind: tool, name: read-file } # 显式依赖引用
74
- ```
75
-
76
- ### 双平面匹配模型(Dual-Plane Matching)
77
-
78
- 每个核心抽象的激活都经历两个阶段:
79
-
80
- ```mermaid
81
- graph LR
82
- Input[上下文输入] --> Discovery[语义发现面]
83
- Discovery --> Index[(向量索引)]
84
- Index --> Candidates[候选集]
85
- Candidates --> Gate[确定性执行闸门]
86
- Gate -- Scopes / 白名单 / 审批 --> Execution[执行面]
87
- ```
88
-
89
- - **语义发现面**:描述符的 `description` 在注册时向量化写入索引;运行时以当前上下文匹配索引,产出候选集
90
- - **确定性执行闸门**:最终激活需通过确定性校验(显式引用、白名单/黑名单、权限 Scopes、审批检查)
91
-
92
- Rules 和 Skills 无闸门直接激活(无副作用)。Tools 必须经过完整闸门。Agents 自由激活,但其内部调用的 Tools 仍需过 Tool 闸门。
100
+ 详见 [概要设计 · 四大核心抽象](./docs/overview-design.md#三四大核心抽象) · [双平面匹配](./docs/overview-design.md#共享特性)。
93
101
 
94
102
  ---
95
103
 
96
- ## 架构总览(Architecture Overview)
97
-
98
- ### 三层发布结构
99
-
100
- ```mermaid
101
- graph TD
102
- subgraph "业务层(Business Layer)"
103
- A[业务 Rules / 领域 Tools / 自定义 Adapter / 领域 Skills / Agents / Plan 模板]
104
- end
105
- subgraph "引擎扩展库 — @tachu/extensions"
106
- B[OpenAI & Anthropic Adapter / 7 个常用 Tools / Terminal+File+Web Backend / Qdrant+LocalFs VectorStore / MCP Adapter / OTel+JSONL Emitter / 4 个通用 Rules]
107
- end
108
- subgraph "引擎核心 — @tachu/core"
109
- C[协议定义 / 9 阶段主干 / 生命周期钩子 / Session / 记忆 / 安全 / 模型路由 / 运行状态]
110
- end
111
- A --> B
112
- B --> C
113
- ```
104
+ ## 架构概览(摘要)
114
105
 
115
- | 层级 | | 职责 |
116
- |------|----|----|
117
- | 引擎核心 | `@tachu/core` | 协议接口、9 阶段主干骨架、8 个核心模块、Registry、Prompt 组装器、VectorStore 接口 + 内置轻量实现 |
118
- | 扩展库 | `@tachu/extensions` | 官方具体实现:Provider Adapter、Tools、Backend、VectorStore Adapter、OTel/JSONL Emitter、通用 Rules |
119
- | 业务/CLI | `@tachu/cli` 或业务代码 | 组装 core + extensions 为可工作的 Agent;提供领域 Rules/Skills/Tools/Agents |
120
-
121
- ### 9 阶段执行主干
122
-
123
- 每个请求都经历完整的 9 个阶段:
124
-
125
- ```mermaid
126
- graph TD
127
- Start([业务请求]) --> S1[阶段 1:会话管理]
128
- S1 --> S2[阶段 2:最小安全准入]
129
- S2 --> S3[阶段 3:意图分析 — LLM]
130
- S3 -- 简单 --> S9[阶段 9:输出规范]
131
- S3 -- 复杂 --> S4[阶段 4:前置校验]
132
- S4 --> S5[阶段 5:任务拆分]
133
- S5 -- Plan 模式 --> PlanLoop{规划审阅循环}
134
- S5 -- 模板匹配 --> S6
135
- S5 -- 动态拆分 --> S6[阶段 6:依赖图校验]
136
- PlanLoop -- 确认 --> S6
137
- S6 --> S7[阶段 7:子任务执行]
138
- S7 --> S8[阶段 8:结果验证 — LLM]
139
- S8 -- 通过 --> S9
140
- S8 -- 不通过 --> Retry{重试 / 重规划}
141
- Retry -- 未达上限 --> S5
142
- Retry -- 耗尽 --> S9
143
- S9 --> End([输出])
144
-
145
- style S2 fill:#ffeaa7,stroke:#fdcb6e
146
- style S7 fill:#dfe6e9,stroke:#b2bec3
147
- ```
106
+ 请求经 **9 阶段主干**;复杂工具任务在 Phase 7 进入内置 `tool-use` Agentic Loop。
148
107
 
149
- | # | 阶段 | LLM 调用 | 关键输出 |
150
- |---|------|----------|---------|
151
- | 1 | 会话管理(Session Management) | 否 | 会话上下文加载 |
152
- | 2 | 最小安全准入(Minimum Safety Check) | 否 | 通过 / 拒绝 |
153
- | 3 | 意图分析(Intent Analysis) | **是** | `IntentResult`(简单/复杂,上下文相关性) |
154
- | 4 | 前置校验(Pre-Check) | 否 | 资源可用性、深度安全校验 |
155
- | 5 | 任务拆分(Task Planning) | **是** | `PlanningResult`(带排名的方案 + DAG) |
156
- | 6 | 依赖图校验(DAG Validation) | 否 | 环检测、节点完整性(确定性) |
157
- | 7 | 子任务执行(Sub-task Execution) | 视子任务 | `TaskResult[]`(可并行) |
158
- | 8 | 结果验证(Result Validation) | **是** | `ValidationResult`(通过 / 执行问题 / 拆分问题) |
159
- | 9 | 输出规范(Output Normalization) | 否 | `EngineOutput`(含步骤状态、元信息、附件) |
160
-
161
- **主干关键特性:**
162
-
163
- - **全路径安全准入** — 阶段 2 对所有请求路径执行,包括简单问题的快速通道
164
- - **上下文门卫** — 阶段 3 判断会话历史是否与本轮相关;无关历史不向下传递
165
- - **事不过三** — 任务级重试最多 3 次(可配置);系统级重试最多 2 次
166
- - **取消传播(Last-message-wins)** — 同一 Session 收到新消息时,通过 `AbortController` 取消当前执行
108
+ 详见 [Pipeline 阶段详解](./docs/architecture/pipeline-phases.md) · [概要设计](./docs/overview-design.md)。
167
109
 
168
110
  ---
169
111
 
@@ -171,21 +113,23 @@ graph TD
171
113
 
172
114
  Tachu 需要 [Bun](https://bun.sh) 作为运行时。
173
115
 
116
+ > **请使用 `@rc` dist-tag 安装**(或固定到具体版本),直至 Tachu 进入稳定版。
117
+
174
118
  ```bash
175
119
  # 安装引擎核心
176
- bun add @tachu/core
120
+ bun add @tachu/core@rc
177
121
 
178
122
  # 安装扩展库(Provider、Tools、Backend、向量存储)
179
- bun add @tachu/extensions
123
+ bun add @tachu/extensions@rc
180
124
 
181
125
  # 全局安装 CLI
182
- bun add -g @tachu/cli
126
+ bun add -g @tachu/cli@rc
183
127
  ```
184
128
 
185
129
  安装完成后验证:
186
130
 
187
131
  ```bash
188
- tachu --version
132
+ tachu --version # 预期输出 1.0.0-rc.0 或更新
189
133
  ```
190
134
 
191
135
  ---
@@ -211,599 +155,41 @@ tachu chat
211
155
  tachu chat --resume
212
156
  ```
213
157
 
214
- ### 编程式(Programmatic — TypeScript)
215
-
216
- ```typescript
217
- import { Engine } from '@tachu/core';
218
- import { OpenAIProviderAdapter } from '@tachu/extensions/providers';
219
- import type { EngineConfig, InputEnvelope, ExecutionContext } from '@tachu/core';
220
-
221
- const config: EngineConfig = {
222
- retry: { taskMaxRetries: 3, systemMaxRetries: 2 },
223
- planning: { planCount: 1, enableValidation: true },
224
- agent: { maxNestingDepth: 1 },
225
- context: { maxTokens: 8000, compressionThreshold: 0.8 },
226
- execution: { defaultTimeout: 120_000 },
227
- models: {
228
- capabilityMapping: {
229
- 'high-reasoning': 'gpt-4o',
230
- 'fast-cheap': 'gpt-4o-mini',
231
- },
232
- providerFallbackOrder: ['openai'],
233
- },
234
- safety: { maxInputSize: 1_000_000, maxRecursionDepth: 10 },
235
- hooks: { writeHookTimeout: 5000, failureBehavior: 'continue' },
236
- storage: {},
237
- };
238
-
239
- const engine = new Engine(config);
240
- engine.useProvider(new OpenAIProviderAdapter({ apiKey: process.env.OPENAI_API_KEY! }));
241
-
242
- const input: InputEnvelope = {
243
- content: '写一个 TypeScript 函数,对异步操作做防抖处理',
244
- metadata: { modality: 'text' },
245
- };
246
-
247
- const context: ExecutionContext = {
248
- requestId: crypto.randomUUID(),
249
- sessionId: 'session-001',
250
- traceId: crypto.randomUUID(),
251
- principal: { userId: 'user-001' },
252
- budget: { maxTokens: 20_000, maxDurationMs: 60_000 },
253
- scopes: ['read', 'write'],
254
- };
255
-
256
- for await (const chunk of engine.runStream(input, context)) {
257
- if (chunk.type === 'delta') process.stdout.write(chunk.content);
258
- if (chunk.type === 'done') console.log('\n\n完成,状态:', chunk.output.status);
259
- }
260
- ```
261
-
262
- ---
263
-
264
- ## 包结构(Package Layout)
265
-
266
- ### 三包说明
267
-
268
- | 包 | 说明 | 主要导出 |
269
- |----|------|---------|
270
- | `@tachu/core` | 零依赖引擎核心 | `Engine`、`Registry`、`PromptAssembler`、所有接口与类型 |
271
- | `@tachu/extensions` | 官方具体实现 | `OpenAIProviderAdapter`、`AnthropicProviderAdapter`、`McpToolAdapter`、`QdrantVectorStore`、`OtelEmitter`、Backend、Tools、Rules |
272
- | `@tachu/cli` | 生产级 CLI 程序 | `tachu chat`、`tachu run`、`tachu init` |
273
-
274
- ### 依赖关系(Dependency Relationship)
275
-
276
- ```mermaid
277
- graph LR
278
- cli["@tachu/cli"]
279
- extensions["@tachu/extensions"]
280
- core["@tachu/core"]
281
-
282
- cli --> extensions
283
- cli --> core
284
- extensions --> core
285
-
286
- style core fill:#74b9ff,stroke:#0984e3
287
- style extensions fill:#a29bfe,stroke:#6c5ce7
288
- style cli fill:#fd79a8,stroke:#e84393
289
- ```
290
-
291
- ### core 包内部结构
292
-
293
- ```
294
- @tachu/core / src/
295
- ├── types/ # 所有 TypeScript 接口:描述符、上下文、I/O、配置
296
- ├── engine/ # Engine 入口类、各阶段处理器、编排控制面、依赖调度器
297
- ├── registry/ # Registry:注册/查询/启动校验(四类抽象统一管理)
298
- ├── modules/ # 8 个核心模块(会话、记忆、运行状态、模型路由、
299
- │ # Provider、安全、可观测性、Hooks)
300
- ├── prompt/ # PromptAssembler:Token 预算分配、KV Cache 友好排列
301
- └── vector/ # VectorStore 接口 + 内置轻量实现
302
- ```
303
-
304
- ---
305
-
306
- ## Provider 与集成(Providers & Integrations)
307
-
308
- ### LLM Provider
309
-
310
- | Provider | 包 | 流式输出 | Function Calling | 备注 |
311
- |----------|----|----|------|------|
312
- | OpenAI | `@tachu/extensions/providers` | ✅ | ✅ | GPT-4o、GPT-4o-mini 及所有可枚举模型 |
313
- | Anthropic | `@tachu/extensions/providers` | ✅ | ✅ | Claude 3.5 Sonnet 及所有可枚举模型 |
314
- | Mock | `@tachu/extensions/providers` | ✅ | ✅ | 测试专用;可配置响应内容 |
315
-
316
- 通过 `models.providerFallbackOrder` 配置降级顺序。系统级错误(超时、API 报错)时,引擎自动按顺序切换 Provider,无需重新规划。
317
-
318
- ### MCP(Model Context Protocol)
319
-
320
- ```typescript
321
- import { McpToolAdapter } from '@tachu/extensions/mcp';
322
-
323
- const adapter = new McpToolAdapter();
324
-
325
- // 通过 stdio 连接本地进程
326
- await adapter.connect('stdio://path/to/mcp-server');
327
-
328
- // 通过 SSE 连接远程服务
329
- await adapter.connect('http://localhost:3000/sse');
330
-
331
- // MCP Tools 自动注册到引擎 Registry
332
- const tools = await adapter.listTools(); // 返回 ToolDescriptor[]
333
- engine.registry.registerAll(tools);
334
- ```
335
-
336
- `McpToolAdapter` 负责 MCP Session 生命周期管理、能力协商,并将引擎取消信号传播到 MCP 服务端。
337
-
338
- ### 向量存储(Vector Stores)
339
-
340
- | Adapter | 包 | 适用场景 |
341
- |---------|----|----|
342
- | `InMemoryVectorStore` | `@tachu/core` | 开发/测试;零依赖内置实现 |
343
- | `LocalFsVectorStore` | `@tachu/extensions/vector` | 单进程生产;文件持久化 |
344
- | `QdrantVectorStore` | `@tachu/extensions/vector` | 多进程生产;完整 Qdrant REST API |
345
-
346
- ```typescript
347
- import { QdrantVectorStore } from '@tachu/extensions/vector';
348
-
349
- const vectorStore = new QdrantVectorStore({
350
- url: 'http://localhost:6333',
351
- collectionName: 'tachu-descriptors',
352
- });
353
- engine.useVectorStore(vectorStore);
354
- ```
355
-
356
- ### 可观测性 Emitter
357
-
358
- | Emitter | 包 | 输出目标 |
359
- |---------|----|----|
360
- | `OtelEmitter` | `@tachu/extensions/emitters` | OpenTelemetry Span(via `@opentelemetry/api`) |
361
- | `JsonlEmitter` | `@tachu/extensions/emitters` | 追加写入 JSONL 文件 |
362
- | `ConsoleEmitter` | `@tachu/extensions/emitters` | 结构化控制台输出(开发用) |
363
-
364
- ### 执行 Backend
365
-
366
- | Backend | 包 | 说明 |
367
- |---------|----|----|
368
- | `TerminalBackend` | `@tachu/extensions/backends` | 沙箱终端内的 Shell 命令执行 |
369
- | `FileBackend` | `@tachu/extensions/backends` | 文件系统读写 |
370
- | `WebBackend` | `@tachu/extensions/backends` | HTTP 请求至外部 API / Web 资源 |
371
-
372
- ---
373
-
374
- ## 设计原则(Design Principles)
375
-
376
- Tachu 基于七条核心工程原则:
377
-
378
- 1. **双平面匹配** — 所有四类核心抽象通过语义方式发现(向量相似度),但通过确定性方式激活(Scopes、白名单、审批)。语义发现是参考;执行闸门是权威。
379
-
380
- 2. **全路径安全准入** — 最小安全检查(阶段 2)对*所有*请求路径执行,包括简单问题的快速通道。安全性绝不为性能让步。
381
-
382
- 3. **事不过三** — 任务级重试循环和系统级重试循环都有严格上限。不允许无限重试。耗尽上限后,引擎输出步骤级完成状态而非笼统失败。
383
-
384
- 4. **KV Cache 友好的 Prompt 组装** — System Prompt 按稳定顺序组装(硬约束 Rules → 软偏好 Rules → Skills → Tool 定义),使跨轮次的前缀保持不变,最大化 KV Cache 复用,降低 LLM 成本。
385
-
386
- 5. **取消传播(Last-message-wins)** — 同一 Session 收到新消息时,通过 `AbortController` 取消当前执行,在已有上下文基础上处理新输入。保证上下文连贯,避免无效工作。
387
-
388
- 6. **引擎不感知业务权限** — 引擎只在 Tool 执行闸门处校验执行上下文中的粗粒度 `scopes`。细粒度业务授权由 Tool 实现本身或专用的授权 Tool 负责。
389
-
390
- 7. **Fail-Closed 安全基线** — 循环防护、预算熔断、基础输入校验硬编码于引擎核心,*不可*通过配置禁用。即使业务配置完全为空,引擎也不会失控运行。
391
-
392
- ---
393
-
394
- ## 配置(Configuration)
395
-
396
- 引擎通过项目根目录的 `tachu.config.ts` 文件配置(由 `tachu init` 自动生成):
397
-
398
- ```typescript
399
- import type { EngineConfig } from '@tachu/core';
400
-
401
- const config: EngineConfig = {
402
- // 描述符注册中心
403
- registry: {
404
- descriptorRoot: '.tachu', // Rules/Skills/Tools/Agents 根目录
405
- },
406
-
407
- // 运行时行为
408
- runtime: {
409
- planMode: false, // 是否默认开启 Plan 模式
410
- maxConcurrency: 4, // 最大并行子任务数
411
- },
412
-
413
- // 上下文窗口与记忆
414
- memory: {
415
- maxTokens: 8000, // 上下文窗口 Token 上限
416
- compressionThreshold: 0.8, // 达到 80% 容量时触发压缩
417
- archivePath: '.tachu/archive.jsonl',
418
- vectorIndexLimit: 10000, // 内置向量索引最大条目数
419
- },
420
-
421
- // 预算约束
422
- budget: {
423
- maxTokens: 50000, // 单次执行总 Token 预算
424
- maxToolCalls: 50, // 单次执行最大 Tool 调用次数
425
- maxWallTimeMs: 300000, // 5 分钟墙钟时间上限
426
- },
427
-
428
- // 安全基线(硬编码最小集;业务策略通过 Hooks 追加)
429
- safety: {
430
- maxInputSize: 1_000_000, // 字节
431
- maxRecursionDepth: 10,
432
- enablePromptInjectionCheck: true,
433
- },
434
-
435
- // 模型路由
436
- models: {
437
- capabilityMapping: {
438
- 'high-reasoning': { provider: 'openai', model: 'gpt-4o' },
439
- 'fast-cheap': { provider: 'openai', model: 'gpt-4o-mini' },
440
- 'vision': { provider: 'openai', model: 'gpt-4o' },
441
- },
442
- providerFallbackOrder: ['openai', 'anthropic'],
443
- },
444
-
445
- // 可观测性
446
- observability: {
447
- emitter: 'jsonl',
448
- jsonlPath: '.tachu/events.jsonl',
449
- },
450
- };
451
-
452
- export default config;
453
- ```
454
-
455
- 所有字段均有合理默认值。`tachu init` 会根据你选择的 Provider 预填生成此文件。
456
-
457
- ---
458
-
459
- ## CLI 参考(CLI Reference)
460
-
461
- ### `tachu init`
462
-
463
- 初始化 Tachu 项目工作空间。
464
-
465
- ```
466
- tachu init [options]
467
-
468
- 选项:
469
- --template <name> 脚手架模板:minimal | full (默认:minimal)
470
- --force 已存在时强制覆盖(不询问)
471
- --path <dir> 目标目录 (默认:当前目录)
472
- --provider <name> 写入 config 的默认 Provider:openai | anthropic | mock (默认:mock)
473
- --no-examples 跳过生成示例 Rule / Tool 描述符
474
- -h, --help 显示帮助
475
- ```
476
-
477
- 生成 `.tachu/` 目录骨架 + `tachu.config.ts` + `.gitignore` 追加条目。
478
-
479
- ---
480
-
481
- ### `tachu run <prompt>`
482
158
 
483
- 单次执行 Prompt,将结果流式输出到 stdout。
484
-
485
- ```
486
- tachu run <prompt> [options]
487
-
488
- 参数:
489
- <prompt> Prompt 文本(或通过 stdin 管道传入)
490
-
491
- 选项:
492
- --session <id> 指定 Session ID
493
- --resume 恢复最近一次 Session
494
- --model <name> 覆盖 high-reasoning 模型
495
- --provider <name> 覆盖默认 Provider
496
- --input <file> 从文件读取 Prompt
497
- --json 将 Prompt 解析为 JSON(结构化输入)
498
- --output <fmt> 输出格式:text | json | markdown (默认:text)
499
- --no-validation 跳过阶段 8 结果验证
500
- --plan-mode 启用 Plan 模式(阶段 5 后暂停等待审批)
501
- --verbose, -v 详细日志(阶段切换、LLM 调用详情)
502
- --no-color 禁用 ANSI 彩色输出(同 NO_COLOR 环境变量)
503
- --timeout <ms> 墙钟时间上限(覆盖 budget.maxWallTimeMs)
504
- -h, --help 显示帮助
505
- ```
159
+ 编程式接入见 [配置](./docs/guides/configuration.md) 与 `@tachu/host-defaults`。
506
160
 
507
161
  ---
508
162
 
509
- ### `tachu chat`
510
-
511
- 进入多轮交互式对话 Session。
512
-
513
- ```
514
- tachu chat [options]
515
-
516
- 选项:
517
- --session <id> 指定 Session ID
518
- --resume 恢复最近一次 Session
519
- --history 列出所有 Session 后退出(不进入交互)
520
- --export <file> 将指定 Session 导出为 Markdown 后退出
521
- --model <name> 覆盖 high-reasoning 模型
522
- --provider <name> 覆盖默认 Provider
523
- --plan-mode 启用 Plan 模式
524
- --verbose, -v 详细日志
525
- --no-color 禁用彩色输出
526
- -h, --help 显示帮助
527
- ```
528
-
529
- **交互内置命令**(输入时以 `/` 开头):
163
+ ## 文档(Documentation)
530
164
 
531
- | 命令 | 说明 |
165
+ | 文档 | 说明 |
532
166
  |------|------|
533
- | `/exit` | 保存 Session 并退出 |
534
- | `/reset` | 清空当前 Session 的 Memory |
535
- | `/new` | 开启新 Session |
536
- | `/list` | 列出所有已保存的 Session |
537
- | `/load <id>` | 切换到指定 Session |
538
- | `/save` | 手动持久化当前 Session |
539
- | `/export <path>` | 将当前 Session 导出为 Markdown 文件 |
540
- | `/history` | 显示本 Session 的消息历史 |
541
- | `/stats` | 显示 Token 用量、Tool 调用次数、剩余预算 |
542
- | `/help` | 显示所有命令 |
543
-
544
- **Ctrl+C 行为:**
545
- - 第一次:取消当前 LLM/Tool 调用(回到提示符,Session 不丢失)
546
- - 1 秒内第二次:保存 Session 并正常退出
547
- - 第三次:强制退出
548
-
549
- ---
550
-
551
- ## 扩展指南(Extension Guide)
552
-
553
- Tachu 通过在 `.tachu/` 目录下创建 Markdown 描述符文件来扩展。Rules、Skills 和 Tools 无需任何代码变更——只有 Agent 的执行函数需要在代码中单独注册。
554
-
555
- ### 自定义 Rule
556
-
557
- ```markdown
558
- <!-- .tachu/rules/no-external-calls.md -->
559
- ---
560
- name: no-external-calls
561
- description: 禁止 Agent 在未获明确审批前发起外部网络调用
562
- type: rule
563
- scope: [execution]
564
- tags: [security, network]
565
- ---
566
-
567
- 除非被调用 Tool 的 requiresApproval 为 true 且用户已确认,
568
- 否则不得发起 HTTP 请求、DNS 查询或任何其他外部网络调用。
569
- ```
570
-
571
- ### 自定义 Skill
572
-
573
- ```markdown
574
- <!-- .tachu/skills/git-workflow/SKILL.md -->
575
- ---
576
- name: git-workflow
577
- description: 本仓库 Git 分支策略、Commit 规范与 PR 工作流知识
578
- tags: [development, git]
579
- requires:
580
- - { kind: tool, name: run-command }
581
- ---
582
-
583
- ## Git 工作流
584
-
585
- 本仓库采用基于主干的开发模式(trunk-based development),配合短生命周期特性分支。
586
-
587
- ### 分支命名
588
- - 功能分支:`feat/<ticket>-<short-desc>`
589
- - 修复分支:`fix/<ticket>-<short-desc>`
590
-
591
- ### Commit 规范
592
- 使用 Conventional Commits:`type(scope): subject`
593
- ...
594
- ```
595
-
596
- ### 自定义 Tool
597
-
598
- ```markdown
599
- <!-- .tachu/tools/query-db.md -->
600
- ---
601
- name: query-db
602
- description: 对应用数据库执行只读 SQL 查询
603
- sideEffect: readonly
604
- idempotent: true
605
- requiresApproval: false
606
- timeout: 10000
607
- inputSchema:
608
- type: object
609
- properties:
610
- sql: { type: string, description: "SQL SELECT 语句" }
611
- limit: { type: number, description: "最大返回行数", default: 100 }
612
- required: [sql]
613
- execute: queryDatabase
614
- ---
615
-
616
- 执行参数化只读 SQL 查询,结果以 JSON 数组形式返回。
617
- ```
618
-
619
- 在 `engine-factory.ts` 中注册执行函数:
620
-
621
- ```typescript
622
- engine.registry.registerExecutor('queryDatabase', async (input, ctx) => {
623
- const { sql, limit = 100 } = input as { sql: string; limit?: number };
624
- return db.query(sql).limit(limit).execute();
625
- });
626
- ```
627
-
628
- ### 自定义 Agent
629
-
630
- ```markdown
631
- <!-- .tachu/agents/code-reviewer.md -->
632
- ---
633
- name: code-reviewer
634
- description: 审查 Pull Request diff,产出结构化代码审查意见
635
- sideEffect: readonly
636
- idempotent: true
637
- requiresApproval: false
638
- timeout: 180000
639
- maxDepth: 1
640
- availableTools: [read-file, search-code, run-command]
641
- ---
642
-
643
- 你是一名严谨的代码审查者。接到 diff 或文件集后:
644
- 1. 理解变更意图
645
- 2. 从正确性、清晰度、安全性和性能角度逐项审查
646
- 3. 输出带有严重程度分级的结构化审查意见:critical / major / minor / nit
647
- ```
167
+ | [概要设计](./docs/overview-design.md) | 愿景、分层、抽象、主干流程 |
168
+ | [详细设计](./docs/detailed-design.md) | 类型、模块、配置 Schema |
169
+ | [技术设计](./docs/technical-design.md) | 工程结构与实现指南 |
170
+ | [Pipeline 阶段详解](./docs/architecture/pipeline-phases.md) | 9 阶段与 tool-use 循环 |
171
+ | [包结构](./docs/architecture/package-layout.md) | Monorepo 包与依赖 |
172
+ | [设计原则](./docs/architecture/design-principles.md) | 核心工程原则 |
173
+ | [CLI 参考](./docs/guides/cli.md) | 命令与参数 |
174
+ | [配置](./docs/guides/configuration.md) | `tachu.config.ts` |
175
+ | [Provider 与集成](./docs/guides/providers-and-integrations.md) | LLM、MCP、向量库 |
176
+ | [扩展指南](./docs/guides/extension-guide.md) | Rule / Skill / Tool / Agent |
177
+ | [可观测性与安全](./docs/guides/observability-and-safety.md) | 事件、OTel、安全 |
178
+ | [CONTEXT.md](./CONTEXT.md) | 产品术语 |
179
+ | [CONTRIBUTING.md](./CONTRIBUTING.md) | 开发流程 |
180
+ | [Web Fetch Server](./packages/web-fetch-server/README.md) | 可选 sidecar |
648
181
 
649
182
  ---
650
183
 
651
- ## 可观测性与安全(Observability & Safety)
184
+ ## Web Fetch Server(可选)
652
185
 
653
- ### OpenTelemetry 集成
654
-
655
- 每个引擎事件映射为一条 OTel Span,实现完整的分布式追踪:
656
-
657
- ```typescript
658
- import { OtelEmitter } from '@tachu/extensions/emitters';
659
- import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
660
- import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
661
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
662
-
663
- const provider = new NodeTracerProvider();
664
- provider.addSpanProcessor(
665
- new SimpleSpanProcessor(new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces' }))
666
- );
667
- provider.register();
668
-
669
- engine.useEmitter(new OtelEmitter());
670
- ```
671
-
672
- **每次请求产出的事件类型:**
673
-
674
- | 事件类型 | 时机 |
675
- |---------|------|
676
- | `phase_enter` / `phase_exit` | 每个流程阶段进入/退出 |
677
- | `llm_call_start` / `llm_call_end` | 每次 LLM 调用 |
678
- | `tool_call_start` / `tool_call_end` | 每次 Tool 执行 |
679
- | `retry` | 任务级或系统级重试触发 |
680
- | `provider_fallback` | Provider 降级启动 |
681
- | `budget_warning` | 预算已用到上限的 80% |
682
- | `budget_exhausted` | 预算熔断激活 |
683
- | `error` | 任何 `EngineError` 子类 |
684
-
685
- ### 安全模块(Safety Module)
686
-
687
- 安全模块分两层独立运行:
688
-
689
- **引擎固有基线(不可禁用):**
690
- - 输入大小上限(`maxInputSize` 字节)
691
- - 递归深度限制(`maxRecursionDepth`)
692
- - 预算熔断(Token/时间预算耗尽时立即终止)
693
-
694
- **业务可注入策略**(通过 Hooks 或配置):
695
- - Prompt 注入检测(`enablePromptInjectionCheck: true`)
696
- - 敏感操作拦截(通过 `engine.registerSafetyPolicy()` 注册)
697
- - 输出内容合规检查
698
-
699
- ```typescript
700
- // 注册自定义安全策略
701
- engine.registerSafetyPolicy(async (input, ctx) => {
702
- if (containsPersonalData(input.content)) {
703
- return { passed: false, violations: [{ type: 'pii', message: '输入中检测到个人隐私数据' }] };
704
- }
705
- return { passed: true, violations: [] };
706
- });
707
- ```
708
-
709
- ---
710
-
711
- ## 发展路线(Roadmap)
712
-
713
- ### v1.0.0 — 已交付
714
-
715
- - [x] `@tachu/core`:Engine、9 阶段主干、8 个核心模块、Registry、PromptAssembler、InMemoryVectorStore、完整错误分类体系
716
- - [x] `@tachu/extensions`:OpenAI + Anthropic Provider、7 个 Tools、Terminal/File/Web Backend、LocalFs + Qdrant VectorStore、MCP stdio+SSE Adapter、OTel+JSONL Emitter、4 个通用 Rules
717
- - [x] `@tachu/cli`:`tachu init` / `tachu run` / `tachu chat`,完整参数体系、Session 持久化、流式渲染
718
- - [x] 测试套件(行覆盖率 ≥80%)和性能基准
719
- - [x] 中英文 README
720
-
721
- ### v1.x — 规划中
722
-
723
- - 更多 VectorStore Adapter(Pinecone、pgvector)
724
- - 更多 Provider Adapter(Google Gemini、Mistral)
725
- - 更多 MCP Tool 集成
726
- - 更多内置压缩策略
727
- - 结构化 Plan 模板库
728
-
729
- ### v2 — 愿景
730
-
731
- - 多 Agent 协作(Agent 间通信协议)
732
- - 跨部署重启的长期记忆持久化
733
- - 子任务粒度的精细预算分配
734
-
735
- ---
736
-
737
- ## 贡献指南(Contributing)
738
-
739
- ### 环境要求
740
-
741
- - [Bun](https://bun.sh) >= 1.1.0
742
- - TypeScript 5.x(通过 devDependencies 提供)
743
-
744
- ### 开发工作流
186
+ 浏览器渲染的 `web-fetch` / `web-search` 需可选 sidecar,见 [packages/web-fetch-server/README.md](./packages/web-fetch-server/README.md)。
745
187
 
746
188
  ```bash
747
- # 克隆并安装
748
- git clone https://github.com/dangaogit/tachu
749
- cd tachu
750
- bun install
751
-
752
- # 运行所有测试
753
- bun test
754
-
755
- # 类型检查
756
- bun run typecheck
757
-
758
- # 构建所有包
759
- bun run build
760
-
761
- # 运行指定包的测试
762
- bun test --filter packages/core
189
+ bun run dev:server:install-browser
190
+ bun run dev:server
763
191
  ```
764
192
 
765
- ### 项目规范
766
-
767
- - 文件名:`kebab-case`
768
- - 类名/类型名:`PascalCase`
769
- - 函数/变量名:`camelCase`
770
- - 常量名:`SCREAMING_SNAKE_CASE`
771
- - 所有公开 API 必须有 TSDoc 注释(`@param`、`@returns`、`@throws`、`@example`)
772
- - 测试文件与源码同目录,命名 `*.test.ts`
773
- - 集成测试放 `__tests__/`
774
-
775
- Pull Request 要求:
776
- - 所有测试通过(`bun test`)
777
- - TypeScript 零错误(`bun run typecheck`)
778
- - 覆盖率达标(行 ≥80%,分支 ≥70%)
779
- - 新增公开 API 有完整 TSDoc
780
-
781
- 详见 `CONTRIBUTING.md`。
782
-
783
- ---
784
-
785
- ## 基准测试(Benchmarks)
786
-
787
- 性能基准位于 `packages/core/benchmarks/`,通过 `bun test` 执行:
788
-
789
- | 基准 | 度量指标 | 基线数据 |
790
- |------|---------|---------|
791
- | `scheduler.bench.ts` — 100 个并行任务 | 调度吞吐量 | *由 verifier 阶段填充* |
792
- | `vector-store.bench.ts` — 10,000 条索引,topK=10 | 搜索 QPS | *由 verifier 阶段填充* |
793
- | `prompt-assembler.bench.ts` — 4K Token 窗口组装 | 组装延迟(p99) | *由 verifier 阶段填充* |
794
-
795
- 基准测试提供回归检测基线;v1 不设定最低性能指标要求。
796
-
797
- ---
798
-
799
- ## 文档(Documentation)
800
-
801
- | 文档 | 说明 |
802
- |------|------|
803
- | [架构设计(Architecture Design)](./docs/adr/architecture-design.md) | 愿景、三层结构、四大核心抽象、9 阶段主干设计 |
804
- | [详细设计(Detailed Design)](./docs/adr/detailed-design.md) | TypeScript 接口、模块规格、配置 Schema |
805
- | [技术设计(Technical Design)](./docs/adr/technical-design.md) | 技术选型、工程结构、实现指南 |
806
-
807
193
  ---
808
194
 
809
195
  ## 许可证(License)