Skip to content

Commit 176cefb

Browse files
authored
Merge pull request #589 from pionxe/chore/commit-worktree-20260509
docs: add architecture context diagrams
2 parents f1b5288 + 00ed9b4 commit 176cefb

11 files changed

Lines changed: 3792 additions & 0 deletions
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
# NeoCode 构架设计分析(聚焦核心决策版 - By fanfeilong)
2+
3+
**版本:** 核心决策草案
4+
**来源参考:** `architecture-v3.remote.md`
5+
**定位:** 解释 NeoCode 为什么必须长成这样,而不是罗列当前实现模块。
6+
7+
---
8+
9+
## 1. 系统驱动
10+
11+
NeoCode 的比较对象不是单次 LLM 会话,而是 Claude Code、Codex 这类已经具备 Agent Loop、工具调用和代码修改能力的 AI Coding 工具。
12+
因此本文不把“能多轮调用工具”当成差异化理由;那是入场券,不是架构说服力。
13+
14+
NeoCode 真正要回答的是:在已有 AI Coding 工具存在的情况下,为什么还需要一个本地优先、多端对等、模型中立、可审计可恢复的 Agent 架构。
15+
16+
| 场景压力 | 系统必须 | 否则 |
17+
|----------|----------|------|
18+
| 用户需要掌握代码、会话、密钥和恢复点 | 把核心状态留在用户控制环境内 | Agent 变成云端或厂商控制面的一部分 |
19+
| 同一个 Agent 能力要被 TUI、Web、Desktop、IM、脚本共享 | 提供统一控制入口 | 每个入口形成不同状态、权限、事件和审批语义 |
20+
| 工具、MCP、远程执行都会产生真实副作用 | 建立统一副作用安全边界 | 安全策略随工具和客户端分裂,审计无法闭合 |
21+
| 模型市场和厂商能力变化很快 | 隔离模型协议、流式格式和错误语义 | 系统核心被某个模型 API 绑定 |
22+
| 用户希望远程触发工作区执行,但不暴露机器 | 使用受限能力的反向远程执行 | 远程能力退化成开放端口或通用 Shell |
23+
| 长任务需要跨轮次恢复和解释 | 持久化任务过程、审批、工具结果和恢复点 | 出错后无法追踪、无法回滚、无法解释 |
24+
25+
---
26+
27+
## 2. 系统构架(Overview)
28+
29+
以下 overview 图保留自 v3 架构文档,用来说明当前系统形态。
30+
核心决策版不按图中的组件逐个展开,而是解释这些组件背后的构架必然性。
31+
32+
```mermaid
33+
graph TD
34+
subgraph Client["客户端"]
35+
direction LR
36+
TUI["TUI"] ~~~ Web["Web"] ~~~ DT["Desktop"] ~~~ FS["飞书"]
37+
end
38+
39+
GW["Gateway<br/>RPC 路由 · 流中继 · 认证"]
40+
RT["Runtime<br/>ReAct 循环编排"]
41+
PR["Provider<br/>模型适配"]
42+
TL["Tools<br/>工具执行 + 安全"]
43+
CTX["Context<br/>Prompt 构建"]
44+
SESS["Session<br/>SQLite"]
45+
RN["Runner<br/>远程执行"]
46+
47+
DB[("SQLite")]
48+
49+
Client -->|"JSON-RPC"| GW
50+
GW --> RT
51+
RT --> PR & TL & CTX & SESS
52+
GW -.->|"SSE/WS 事件"| Client
53+
GW -.->|"WS 反向连接"| RN
54+
RT -.->|"HTTPS"| LLM["模型 API"]
55+
56+
style GW fill:#fb923c,stroke:#fb923c,color:#0f172a
57+
style RT fill:#34d399,stroke:#34d399,color:#0f172a
58+
style PR fill:#a78bfa,stroke:#a78bfa,color:#0f172a
59+
style TL fill:#fbbf24,stroke:#fbbf24,color:#0f172a
60+
style CTX fill:#60a5fa,stroke:#60a5fa,color:#0f172a
61+
style SESS fill:#60a5fa,stroke:#60a5fa,color:#0f172a
62+
style RN fill:#fb7185,stroke:#fb7185,color:#0f172a
63+
```
64+
65+
这张图的关键不是组件数量,而是控制方向:
66+
67+
- 客户端只进入统一控制入口。
68+
- 任务循环统一推进模型、工具、上下文和状态。
69+
- 模型只产生推理事件和行动意图。
70+
- 工具边界负责把行动意图变成受控副作用。
71+
- 状态边界记录会话、审计和恢复事实。
72+
- 远程执行端是受限能力,不是通用 Shell。
73+
74+
---
75+
76+
## 3. 核心构架决策
77+
78+
| 优先级 | 核心决策 | Why | 如果不这样 | 代价 |
79+
|--------|----------|-----|------------|------|
80+
| P0 | 本地控制权 | NeoCode 的前提是用户掌握代码、会话、密钥、审批和恢复点 | 系统会退化成依赖厂商或云端控制面的 Agent | 需要承担本地状态、一致性和数据生命周期 |
81+
| P0 | 统一副作用安全边界 | 文件、Shell、MCP、远程执行的风险必须用同一套裁决和审计覆盖 | 工具越多,安全语义越分裂,审批和恢复点无法闭合 | 所有工具接入都必须声明能力、校验参数、接受裁决 |
82+
| P1 | 统一控制入口 | 多端是同一 Agent 能力的不同入口,不应产生多套任务事实 | TUI、Web、IM、脚本各自形成状态、取消、审批和事件语义 | 控制入口成为关键路径,必须轻量少状态 |
83+
| P1 | 模型中立边界 | NeoCode 不能被某个模型厂商的协议和能力形态绑定 | 切换模型会影响任务循环、工具语义和客户端行为 | 厂商高级能力需要先抽象后进入核心 |
84+
| P1 | 可恢复任务事实 | 长任务必须能解释读了什么、改了什么、谁批准了什么、为什么结束 | 会话中断不可恢复,AI 修改不可回滚,事故无法追踪 | 需要持久化过程、审批、工具结果和恢复点 |
85+
| P2 | 受限反向远程执行 | 远程触发工作区执行不能要求用户暴露机器,也不能变成通用 Shell | 需要开放入站端口,或形成过宽远程执行能力 | 需要管理连接、心跳、能力范围和过期 |
86+
| 基础能力 | 任务循环 | Agent Loop 是 AI Coding 工具的基本内核,用于承载推理、行动、观察和验收 | 没有它就不是完整 Coding Agent | 它不是 NeoCode 的差异化重点,但必须稳定、可暂停、可验收 |
87+
88+
---
89+
90+
## 4. 构架(中文伪代码)
91+
92+
下面不是实现方案,而是 NeoCode 的构架语义。
93+
94+
```text
95+
当客户端发来请求:
96+
确认身份
97+
判断是否有权执行这个控制动作
98+
99+
如果请求不合法:
100+
拒绝,并记录原因
101+
102+
如果请求合法:
103+
创建或恢复任务
104+
发布“任务开始”
105+
交给任务循环推进
106+
```
107+
108+
```text
109+
任务循环持续推进,直到出现明确终态:
110+
构建模型上下文
111+
调用模型继续推理
112+
113+
如果模型输出文本:
114+
发布为进度事件
115+
116+
如果模型提出行动意图:
117+
交给工具副作用边界
118+
把执行结果或拒绝原因写回任务
119+
进入下一轮
120+
121+
如果模型给出候选最终答案:
122+
做完成度检查和必要验证
123+
124+
如果验收通过:
125+
保存最终答案,发布“任务完成”
126+
127+
如果还有可修复缺口:
128+
把缺口证据写回任务,进入下一轮
129+
130+
如果失败、无法继续、被取消或超过限制:
131+
保存终止原因,发布“任务停止”
132+
```
133+
134+
```text
135+
处理模型提出的行动意图:
136+
检查行动格式
137+
判断副作用类型和目标范围
138+
根据主体、会话、工具、目标、风险和权限指纹做安全裁决
139+
140+
如果拒绝:
141+
不执行,把拒绝原因返回任务循环
142+
143+
如果需要审批:
144+
暂停任务,向客户端发出权限请求
145+
等待人类允许或拒绝
146+
147+
如果允许执行:
148+
对高风险修改先创建恢复点
149+
执行工具行动
150+
记录输入、输出、审批和审计事实
151+
把工具结果返回任务循环
152+
```
153+
154+
关键点:
155+
156+
- 多端请求进入同一控制面。
157+
- 任务循环承载 Agent 的基础执行语义。
158+
- 模型意图必须经过副作用边界。
159+
- 最终答案必须经过系统验收。
160+
161+
---
162+
163+
## 5. 运行机制
164+
165+
用户输入任务
166+
→ 统一控制入口认证和授权
167+
→ 任务循环构建上下文
168+
→ 模型产生文本或行动意图
169+
→ 行动意图进入工具副作用边界
170+
→ 安全裁决决定允许、拒绝或请求审批
171+
→ 工具结果或拒绝证据回灌任务循环
172+
→ 系统验收候选答案
173+
→ 完成、继续、失败或无法完成
174+
175+
运行机制的重点不是证明 Agent Loop 存在,而是保证同一条循环同时受统一控制入口、副作用安全边界、本地状态和模型中立边界约束。
176+
177+
---
178+
179+
## 6. 失败路径
180+
181+
| 缺失或错误设计 | 结果 |
182+
|----------------|------|
183+
| 没有本地控制权 | 状态、密钥、审批和恢复点落入外部控制面,NeoCode 失去本地优先前提 |
184+
| 没有统一副作用安全边界 | 工具、MCP、远程执行各自定义风险语义,审批和审计无法闭合 |
185+
| 没有统一控制入口 | 多端状态、审批、取消、事件和鉴权语义分裂 |
186+
| 没有模型中立边界 | 模型厂商差异进入核心逻辑,切换模型影响全系统 |
187+
| 没有可恢复任务事实 | 会话不可恢复,AI 修改不可回滚,审计链断裂 |
188+
| 远程执行设计成通用 Shell | 能力过宽,攻击面扩大,用户机器暴露不必要风险 |
189+
| 任务循环不可暂停或不可验收 | 审批、取消、失败回灌和系统验收只能散落在临时逻辑中 |
190+
191+
---
192+
193+
## 7. 构架核心总结
194+
195+
NeoCode 的关键不在于“比单次 LLM 会话多一层工具调用”。成熟 AI Coding 工具都已经具备 Agent Loop。
196+
NeoCode 的核心在于把 Agent Loop 放进一组更强的控制约束里:
197+
198+
| 抽象 | 作用 |
199+
|------|------|
200+
| 本地控制权 | 用户掌握代码、状态、密钥、审批和恢复点 |
201+
| 统一副作用安全边界 | 工具、MCP、远程执行共享同一裁决和审计语义 |
202+
| 统一控制入口 | 多端共享同一任务事实和控制语义 |
203+
| 模型中立边界 | 模型变化不能污染核心任务语义 |
204+
| 可恢复任务事实 | 执行过程可追踪、可解释、可回滚 |
205+
| 受限远程执行 | 跨机器执行不退化为开放机器或通用 Shell |

0 commit comments

Comments
 (0)