yuangs 2.10.0 → 2.12.0
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.
- package/README.md +130 -231
- package/dist/agent/AgentPipeline.js +22 -3
- package/dist/agent/AgentPipeline.js.map +1 -1
- package/dist/agent/skills.js +38 -0
- package/dist/agent/skills.js.map +1 -1
- package/dist/cli.js +83 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/handleAIChat.js +114 -167
- package/dist/commands/handleAIChat.js.map +1 -1
- package/dist/commands/shellCompletions.d.ts +33 -0
- package/dist/commands/shellCompletions.js +432 -0
- package/dist/commands/shellCompletions.js.map +1 -0
- package/dist/utils/renderer.d.ts +21 -0
- package/dist/utils/renderer.js +138 -0
- package/dist/utils/renderer.js.map +1 -0
- package/dist/utils/syntaxHandler.d.ts +7 -0
- package/dist/utils/syntaxHandler.js +243 -0
- package/dist/utils/syntaxHandler.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,339 +1,238 @@
|
|
|
1
|
-
# yuangs CLI
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
一个 **集工具启动器 + AI 助手 + 命令增强器** 于一体的 CLI。
|
|
2
|
+
# 🚀 yuangs CLI
|
|
5
3
|
|
|
6
|
-
|
|
4
|
+
**以人类意图为中心的 AI‑Augmented Shell**
|
|
5
|
+
|
|
6
|
+
一个集 **AI 助手 · 智能 Shell 内核 · 插件化运行时** 于一体的现代终端工具。
|
|
7
|
+
|
|
8
|
+
> **核心理念**
|
|
7
9
|
> **AI 提供思路,人类掌控执行。**
|
|
8
|
-
>
|
|
10
|
+
> yuangs 致力于在不破坏传统 Shell 心智模型的前提下,引入 AI 的逻辑能力。
|
|
11
|
+
> 它不是黑盒执行器,而是你的 **增强型命令行外脑**。
|
|
9
12
|
|
|
10
13
|
---
|
|
11
14
|
|
|
12
|
-
##
|
|
15
|
+
## 🏗️ 执行语义规范(Execution Semantics)
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- 🧠 让 AI **帮你写命令**,而不是直接替你乱跑命令
|
|
17
|
-
- 🧩 把常用的复杂操作保存为快捷指令(Macros)
|
|
18
|
-
- 🔗 用管道把真实命令输出交给 AI 解释
|
|
17
|
+
yuangs 通过一套**显式的符号语法**,清晰界定“副作用”的来源,
|
|
18
|
+
确保每一条命令 **可理解、可确认、可审计**。
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
| 语法 | 行为逻辑 | 决策来源 | 适用场景 |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| `ls -la` | 直接运行命令(fish-style) | 用户 | 传统 Shell 操作 |
|
|
23
|
+
| `@path[:line]` | 引用文件 / 行号上下文 | 用户 | 代码审计、报错分析 |
|
|
24
|
+
| `#dir` | 批量引入目录上下文 | 用户 | 项目结构理解 |
|
|
25
|
+
| `ai "msg"` | 纯自然语言对话 | AI | 方案讨论、知识查询 |
|
|
26
|
+
| `ai -e` | 生成**建议**命令 | AI → 用户 | 复杂命令辅助 |
|
|
27
|
+
| `:exec` | 绕过 AI 的原子执行 | 用户 | 确定性脚本 |
|
|
21
28
|
|
|
22
29
|
---
|
|
23
30
|
|
|
24
|
-
##
|
|
31
|
+
## 🌟 核心功能
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
npm install -g yuangs
|
|
28
|
-
```
|
|
33
|
+
### 1. 智能 Shell 内核(v2.10.0+)
|
|
29
34
|
|
|
30
|
-
|
|
35
|
+
进入交互式 AI‑Augmented Shell:
|
|
31
36
|
|
|
32
37
|
```bash
|
|
33
|
-
yuangs
|
|
38
|
+
yuangs ai
|
|
34
39
|
```
|
|
35
40
|
|
|
36
|
-
|
|
41
|
+
特性包括:
|
|
37
42
|
|
|
38
|
-
|
|
43
|
+
- **模式自动路由**
|
|
44
|
+
无需切换模式:
|
|
45
|
+
- 输入 `git status` → 直接执行
|
|
46
|
+
- 输入「解释这段代码」→ 进入对话
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
- **👻 Ghost Text(幽灵建议)**
|
|
49
|
+
根据历史记录与插件预测输入
|
|
50
|
+
例如输入 `npm r`,灰色显示 `un dev`,按 `Tab` 采纳
|
|
51
|
+
|
|
52
|
+
- **⚡ 补全增强**
|
|
53
|
+
- **PATH 扫描**:自动补全 40+ 常用系统命令
|
|
54
|
+
- **精准行号**:支持 `@src/index.ts:10-50`
|
|
55
|
+
- **项目感知**:提升 `src/`、`packages/` 等目录权重
|
|
48
56
|
|
|
49
57
|
---
|
|
50
58
|
|
|
51
|
-
|
|
59
|
+
### 2. 精准上下文管理(ContextBuffer)
|
|
52
60
|
|
|
53
|
-
|
|
61
|
+
#### 管道模式(Pipe Mode)
|
|
54
62
|
|
|
55
63
|
```bash
|
|
56
|
-
yuangs
|
|
64
|
+
cat error.log | yuangs "解释这个报错"
|
|
65
|
+
git diff | yuangs -w "Review 变更逻辑"
|
|
57
66
|
```
|
|
58
67
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
68
|
+
#### `-w` 智能读取
|
|
69
|
+
|
|
70
|
+
- 自动解析管道中的文件路径
|
|
71
|
+
- 只读取**被显式引用**的文件内容
|
|
72
|
+
- 不进行隐式文件系统扫描
|
|
62
73
|
|
|
63
74
|
---
|
|
64
75
|
|
|
65
|
-
###
|
|
76
|
+
### 3. 插件系统(Plugins)
|
|
66
77
|
|
|
67
|
-
|
|
78
|
+
在 `.shell/plugins/` 下放置自定义脚本,
|
|
79
|
+
扩展特定工具的补全与推理能力(如 `docker`、`kubectl`)。
|
|
68
80
|
|
|
69
|
-
|
|
70
|
-
|----|----|
|
|
71
|
-
| `-p` | `gemini-pro-latest` |
|
|
72
|
-
| `-f` | `gemini-flash-latest` |
|
|
73
|
-
| `-l` | `gemini-flash-lite-latest` |
|
|
74
|
-
| `-w` | 智能读取文件内容(管道模式) |
|
|
81
|
+
示例:
|
|
75
82
|
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
```ts
|
|
84
|
+
// .shell/plugins/docker.ts
|
|
85
|
+
module.exports = {
|
|
86
|
+
command: 'docker',
|
|
87
|
+
complete(args) {
|
|
88
|
+
return ['ps', 'run', 'build', 'exec'];
|
|
89
|
+
}
|
|
90
|
+
};
|
|
80
91
|
```
|
|
81
92
|
|
|
82
93
|
---
|
|
83
94
|
|
|
84
|
-
|
|
95
|
+
## 📜 设计宣言(Design Philosophy / Manifesto)
|
|
85
96
|
|
|
86
|
-
|
|
87
|
-
yuangs ai
|
|
88
|
-
```
|
|
97
|
+
### 工程理性 vs. AI 狂热
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
yuangs 并不是一个试图“替你完成任务”的工具。
|
|
100
|
+
它诞生于一个更克制的问题:
|
|
91
101
|
|
|
92
|
-
|
|
93
|
-
- `/clear`:清空当前对话上下文
|
|
94
|
-
- `/history`:查看本次会话历史
|
|
95
|
-
- `exit` / `quit`:退出
|
|
96
|
-
- `@`:显示当前目录文件列表并选择
|
|
97
|
-
- `# 目录路径`:读取指定目录下所有文件内容
|
|
102
|
+
> **在 AI 能力爆炸的时代,命令行该如何进化,而不背叛工程理性?**
|
|
98
103
|
|
|
99
|
-
|
|
104
|
+
---
|
|
100
105
|
|
|
101
|
-
|
|
106
|
+
### 为什么 yuangs 不是 Autonomous Agent?
|
|
102
107
|
|
|
103
|
-
|
|
108
|
+
Autonomous Agent 承诺:
|
|
109
|
+
给 AI 一个目标,让它自行规划、执行、修正。
|
|
104
110
|
|
|
105
|
-
|
|
106
|
-
你:@
|
|
107
|
-
📁 当前目录文件列表:
|
|
108
|
-
[ 1] 📁 src
|
|
109
|
-
[ 2] 📄 package.json
|
|
110
|
-
[ 3] 📄 README.md
|
|
111
|
-
[ 4] 📁 test
|
|
112
|
-
[ 5] 📄 tsconfig.json
|
|
113
|
-
|
|
114
|
-
请选择文件 (输入序号,或按 Enter 返回): 3
|
|
115
|
-
✓ 已选择: README.md
|
|
116
|
-
|
|
117
|
-
你:README.md 解释一下这个项目的功能
|
|
118
|
-
```
|
|
111
|
+
但在真实工程环境中,这种模式存在根本缺陷:
|
|
119
112
|
|
|
120
|
-
|
|
113
|
+
> **执行权与责任归属是模糊的。**
|
|
121
114
|
|
|
122
|
-
|
|
123
|
-
你:# src/commands 分析这些命令的功能
|
|
124
|
-
✓ 已读取 3 个文件
|
|
125
|
-
|
|
126
|
-
# AI 会看到 src/commands 下所有文件的内容并进行分析
|
|
127
|
-
```
|
|
115
|
+
因此,在 yuangs 中,我们**明确拒绝**让 AI 拥有:
|
|
128
116
|
|
|
129
|
-
|
|
117
|
+
- 自动执行系统命令的权力
|
|
118
|
+
- 隐式修改文件或运行环境的权力
|
|
119
|
+
- 在未确认的情况下产生任何副作用的权力
|
|
130
120
|
|
|
131
121
|
---
|
|
132
122
|
|
|
133
|
-
|
|
123
|
+
## 🔒 行为边界(Agent Boundaries)
|
|
134
124
|
|
|
135
|
-
|
|
125
|
+
yuangs 严格遵循以下边界,以确保长期工程可靠性:
|
|
136
126
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```
|
|
127
|
+
- **非自治性(Human‑in‑the‑loop)**
|
|
128
|
+
AI 负责推理与建议,人类始终是最终决策者与执行者。
|
|
140
129
|
|
|
141
|
-
|
|
130
|
+
- **副作用隔离(Side‑effect Isolation)**
|
|
131
|
+
AI 不具备系统写权限。
|
|
132
|
+
所有建议必须转化为**用户可见的 Action**并经确认后执行。
|
|
142
133
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
2. 自动复制到剪贴板
|
|
146
|
-
3. 预填到输入行
|
|
147
|
-
4. **你确认后才会执行**
|
|
134
|
+
- **显式上下文(Explicit Context)**
|
|
135
|
+
除显式输入外,yuangs 不会在后台扫描文件系统。
|
|
148
136
|
|
|
149
|
-
|
|
137
|
+
- **可回溯性(Auditable Records)**
|
|
138
|
+
所有 AI 建议、命令生成与执行结果均被记录,
|
|
139
|
+
确保完整决策链条可追溯、可审计。
|
|
150
140
|
|
|
151
141
|
---
|
|
152
142
|
|
|
153
|
-
|
|
143
|
+
## 💡 使用场景示例
|
|
154
144
|
|
|
155
|
-
|
|
145
|
+
### 场景 A:智能调试
|
|
156
146
|
|
|
157
147
|
```bash
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
**省略 'ai' 关键字**(v1.3.66+):
|
|
148
|
+
@!build.sh
|
|
149
|
+
# 系统返回报错…
|
|
163
150
|
|
|
164
|
-
|
|
165
|
-
cat file.txt | yuangs "解释这个文件"
|
|
166
|
-
git diff | yuangs "review这个代码变更"
|
|
151
|
+
上面的错误是什么意思?
|
|
167
152
|
```
|
|
168
153
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
ls | yuangs -w "分析这个目录"
|
|
173
|
-
ls *.ts | yuangs -w "解释这些文件的功能"
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
非常适合:
|
|
177
|
-
- 看不懂的日志
|
|
178
|
-
- 太长的输出
|
|
179
|
-
- CI / build 报错分析
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
### ✅ 6️⃣ 流式输出 + Markdown 渲染
|
|
184
|
-
|
|
185
|
-
- 默认流式输出(打字机效果)
|
|
186
|
-
- 自动渲染 Markdown
|
|
187
|
-
- 代码高亮 / 表格格式化
|
|
188
|
-
|
|
189
|
-
终端体验尽量对齐 ChatGPT 网页版。
|
|
154
|
+
AI 将结合 **build.sh 内容 + 实际输出** 进行分析。
|
|
190
155
|
|
|
191
156
|
---
|
|
192
157
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
把常用但冗长的命令保存为一个名字。
|
|
196
|
-
|
|
197
|
-
### 创建快捷指令
|
|
158
|
+
### 场景 B:命令生成
|
|
198
159
|
|
|
199
160
|
```bash
|
|
200
|
-
|
|
201
|
-
# 输入:
|
|
202
|
-
# npm run build && git add . && git commit -m "deploy" && git push
|
|
161
|
+
ai -e "查找当前目录下大于 100M 的文件"
|
|
203
162
|
```
|
|
204
163
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
```bash
|
|
208
|
-
yuangs run deploy
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### 查看所有指令
|
|
212
|
-
|
|
213
|
-
```bash
|
|
214
|
-
yuangs macros
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
✅ 非常适合:
|
|
218
|
-
- 发布流程
|
|
219
|
-
- 项目初始化
|
|
220
|
-
- 重复性高但不想记的命令
|
|
164
|
+
AI 生成建议命令(如 `find . -type f -size +100M`),
|
|
165
|
+
**存入剪贴板,等待你确认执行。**
|
|
221
166
|
|
|
222
167
|
---
|
|
223
168
|
|
|
224
|
-
|
|
169
|
+
### 场景 C:项目审计
|
|
225
170
|
|
|
226
171
|
```bash
|
|
227
|
-
|
|
228
|
-
|
|
172
|
+
#src/
|
|
173
|
+
分析这些模块的功能
|
|
229
174
|
```
|
|
230
175
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
- `defaultModel`:默认 AI 模型
|
|
234
|
-
- `aiProxyUrl`:自定义 AI 接口
|
|
235
|
-
- `accountType`:`free` / `pro`
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## 内置应用列表
|
|
240
|
-
|
|
241
|
-
```text
|
|
242
|
-
shici → https://wealth.want.biz/shici/index.html
|
|
243
|
-
dict → https://wealth.want.biz/pages/dict.html
|
|
244
|
-
pong → https://wealth.want.biz/pages/pong.html
|
|
245
|
-
```
|
|
176
|
+
AI 在**显式授权**下读取目录内容并生成结构分析。
|
|
246
177
|
|
|
247
178
|
---
|
|
248
179
|
|
|
249
|
-
##
|
|
250
|
-
|
|
251
|
-
无需改代码,只需配置文件。
|
|
252
|
-
|
|
253
|
-
### 示例 `.yuangs.json`
|
|
180
|
+
## 📦 安装与配置
|
|
254
181
|
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
"github": "https://github.com",
|
|
258
|
-
"calendar": "https://calendar.google.com",
|
|
259
|
-
"mail": "https://mail.google.com"
|
|
260
|
-
}
|
|
182
|
+
```bash
|
|
183
|
+
npm install -g yuangs
|
|
261
184
|
```
|
|
262
185
|
|
|
263
|
-
|
|
186
|
+
常用配置:
|
|
264
187
|
|
|
265
188
|
```bash
|
|
266
|
-
yuangs
|
|
267
|
-
yuangs
|
|
268
|
-
yuangs mail
|
|
189
|
+
yuangs config defaultModel Assistant
|
|
190
|
+
yuangs config accountType pro
|
|
269
191
|
```
|
|
270
192
|
|
|
271
|
-
支持 JSON / YAML,多级优先级(项目级 / 用户级)。
|
|
272
|
-
|
|
273
193
|
---
|
|
274
194
|
|
|
275
|
-
##
|
|
276
|
-
|
|
277
|
-
### v1.3.67 (2026-01-17)
|
|
195
|
+
## 🗓️ 近期更新(Changelog)
|
|
278
196
|
|
|
279
|
-
-
|
|
280
|
-
|
|
281
|
-
- ✅ 交互模式增强:支持文件和目录引用
|
|
197
|
+
- **v2.11.0** (2026‑01‑18)
|
|
198
|
+
新增 40+ Shell 内置命令支持(cd, pwd, ls, git 等)
|
|
282
199
|
|
|
283
|
-
|
|
200
|
+
- **v2.10.0** (2026‑01‑18)
|
|
201
|
+
引入 Shell 交互内核、Ghost Text 与插件系统
|
|
284
202
|
|
|
285
|
-
-
|
|
286
|
-
|
|
287
|
-
- ✅ 完整的管道模式选项支持:`-p`, `-f`, `-l`, `-e`, `-w`
|
|
203
|
+
- **v1.3.67** (2026‑01‑17)
|
|
204
|
+
新增 `@` 文件选择与 `#` 目录读取功能
|
|
288
205
|
|
|
289
|
-
### v1.3.38 (2026-01-16)
|
|
290
|
-
|
|
291
|
-
- ✅ 快捷指令系统(save / run / macros)
|
|
292
|
-
- ✅ 管道模式(Pipe)
|
|
293
|
-
- ✅ AI 流式输出 + Markdown 渲染
|
|
294
|
-
- ✅ `config` 命令
|
|
295
|
-
- ✅ 命令生成模式增强(剪贴板 + 预填)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
### v1.3.22 (2025-11-30)
|
|
299
|
-
- **新增** AI 命令支持 `-p` `-f` `-l` 简写,快速选择gemini默认模型
|
|
300
|
-
|
|
301
|
-
### v1.3.6 (2025-11-29)
|
|
302
|
-
|
|
303
|
-
- **新增** AI 命令交互模式:直接输入 `yuangs ai` 即可进入一问一答模式,无需每次输入问题,quit 或 exit 可退出。
|
|
304
|
-
- **新增** AI 命令模型参数 `-m` 简写:支持 `-m <模型名称>` 代替 `--model <模型名称>`。
|
|
305
|
-
- **新增** `help` 命令显示仓库地址:方便用户直接访问项目仓库。
|
|
306
|
-
- **优化** AI 请求错误提示:在处理 AI 请求出错时,提供更清晰的错误信息。
|
|
307
|
-
|
|
308
|
-
### v1.1.x (之前版本,主要更新点)
|
|
309
|
-
|
|
310
|
-
- **新增** `ai` 命令:集成 AI 问答功能 (`yuangs ai "你的问题"`)。
|
|
311
|
-
- **新增** `help` 命令显示当前版本号:方便用户了解工具版本。
|
|
312
|
-
- **优化** AI 请求加载动画:在请求过程中显示加载动画和已耗时秒数,并在请求结束后显示总耗时。
|
|
313
206
|
---
|
|
314
207
|
|
|
315
|
-
##
|
|
208
|
+
## ⚖️ 维护者
|
|
316
209
|
|
|
317
|
-
|
|
318
|
-
- 自动 bump patch 版本
|
|
319
|
-
- 自动打 tag
|
|
320
|
-
- 自动 `npm publish --provenance`
|
|
210
|
+
**@yuanguangshan**
|
|
321
211
|
|
|
322
|
-
|
|
212
|
+
> **AI 提供思路,人类掌控执行。**
|
|
213
|
+
> 这不是妥协,而是对工程理性的尊重。
|
|
323
214
|
|
|
324
215
|
---
|
|
325
216
|
|
|
326
|
-
##
|
|
217
|
+
## 📚 更多信息
|
|
327
218
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
219
|
+
- **设计原理**: [docs/implementation_principles.md](docs/implementation_principles.md)
|
|
220
|
+
- **场景示例**: [docs/scenarios.md](docs/scenarios.md)
|
|
221
|
+
- **执行语义**: [docs/semantics.md](docs/semantics.md)
|
|
222
|
+
- **非目标**: [docs/non-goals.md](docs/non-goals.md)
|
|
223
|
+
- **威胁模型**: [docs/threat_model.md](docs/threat_model.md)
|
|
224
|
+
- **实现差距分析**: [docs/implementation_gap.md](docs/implementation_gap.md)
|
|
225
|
+
- **变更日志**: [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
|
226
|
+
- **Shell 补全**: [docs/tab_completion_guide.md](docs/tab_completion_guide.md)
|
|
227
|
+
- **上下文优化**: [docs/context_optimization_analysis.md](docs/context_optimization_analysis.md)
|
|
228
|
+
- **代理管道**: [docs/AGENT_PIPELINE.md](docs/AGENT_PIPELINE.md)
|
|
229
|
+
- **上下文管理**: [docs/context_management.md](docs/context_management.md)
|
|
332
230
|
```
|
|
333
231
|
|
|
334
232
|
---
|
|
335
233
|
|
|
336
|
-
|
|
234
|
+
### 一句工程师之间的实话
|
|
337
235
|
|
|
236
|
+
这份 README **已经不是“产品介绍”**了,
|
|
237
|
+
它是一个 **Runtime 的宪法文本**。
|
|
338
238
|
|
|
339
|
-
@yuanguangshan
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.AgentPipeline = void 0;
|
|
4
7
|
const intent_1 = require("./intent");
|
|
@@ -11,6 +14,9 @@ const planExecutor_1 = require("./planExecutor");
|
|
|
11
14
|
const record_1 = require("./record");
|
|
12
15
|
const skills_1 = require("./skills");
|
|
13
16
|
const crypto_1 = require("crypto");
|
|
17
|
+
const renderer_1 = require("../utils/renderer"); // Import renderer
|
|
18
|
+
const ora_1 = __importDefault(require("ora"));
|
|
19
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
20
|
class AgentPipeline {
|
|
15
21
|
async run(input, mode) {
|
|
16
22
|
const id = (0, crypto_1.randomUUID)();
|
|
@@ -22,15 +28,26 @@ class AgentPipeline {
|
|
|
22
28
|
const prompt = (0, prompt_1.buildPrompt)(intent, context, mode, input.rawInput);
|
|
23
29
|
// 4. Model Selection
|
|
24
30
|
const model = (0, selectModel_1.selectModel)(intent, input.options?.model);
|
|
31
|
+
// Setup Renderer if in Chat Mode
|
|
32
|
+
let renderer;
|
|
33
|
+
let spinner;
|
|
34
|
+
if (mode === 'chat') {
|
|
35
|
+
spinner = (0, ora_1.default)(chalk_1.default.cyan('Thinking...')).start();
|
|
36
|
+
renderer = new renderer_1.StreamMarkdownRenderer(chalk_1.default.bold.blue('🤖 AI: '), spinner);
|
|
37
|
+
}
|
|
25
38
|
// 5. LLM Execution
|
|
26
39
|
const result = await (0, llm_1.runLLM)({
|
|
27
40
|
prompt,
|
|
28
41
|
model,
|
|
29
42
|
stream: mode === 'chat',
|
|
30
|
-
onChunk: mode === 'chat'
|
|
31
|
-
? (s) =>
|
|
43
|
+
onChunk: mode === 'chat' && renderer
|
|
44
|
+
? (s) => renderer.onChunk(s)
|
|
32
45
|
: undefined,
|
|
33
46
|
});
|
|
47
|
+
// Finish rendering if chat mode
|
|
48
|
+
if (mode === 'chat' && renderer) {
|
|
49
|
+
renderer.finish();
|
|
50
|
+
}
|
|
34
51
|
// 6. Result Interpretation -> Plan
|
|
35
52
|
const isStreaming = mode === 'chat';
|
|
36
53
|
const plan = (0, interpret_1.interpretResultToPlan)(result, intent, mode, isStreaming);
|
|
@@ -48,9 +65,11 @@ class AgentPipeline {
|
|
|
48
65
|
type: 'execute',
|
|
49
66
|
command: plan.tasks[0].payload.command,
|
|
50
67
|
risk: plan.tasks[0].payload.risk
|
|
51
|
-
} : { type: 'print', content: result.rawText },
|
|
68
|
+
} : { type: 'print', content: result.rawText },
|
|
52
69
|
});
|
|
53
70
|
// 8. Plan Execution
|
|
71
|
+
// Note: For chat, execution usually is just "printing", which happened via stream.
|
|
72
|
+
// interpretResultToPlan handles ignoring tasks if streamed.
|
|
54
73
|
const summary = await (0, planExecutor_1.executePlan)(plan, input.options);
|
|
55
74
|
// 9. Post-execution: Learn Skill if successful
|
|
56
75
|
(0, skills_1.learnSkillFromRecord)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPipeline.js","sourceRoot":"","sources":["../../src/agent/AgentPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentPipeline.js","sourceRoot":"","sources":["../../src/agent/AgentPipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/skills.js
CHANGED
|
@@ -1,11 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.updateSkillStatus = updateSkillStatus;
|
|
4
7
|
exports.learnSkillFromRecord = learnSkillFromRecord;
|
|
5
8
|
exports.getRelevantSkills = getRelevantSkills;
|
|
6
9
|
exports.reapColdSkills = reapColdSkills;
|
|
7
10
|
exports.getAllSkills = getAllSkills;
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
const SKILLS_FILE = path_1.default.join(os_1.default.homedir(), '.yuangs_skills.json');
|
|
8
16
|
let skillLibrary = [];
|
|
17
|
+
// === Persistence Logic ===
|
|
18
|
+
function loadSkills() {
|
|
19
|
+
if (fs_1.default.existsSync(SKILLS_FILE)) {
|
|
20
|
+
try {
|
|
21
|
+
const data = fs_1.default.readFileSync(SKILLS_FILE, 'utf-8');
|
|
22
|
+
skillLibrary = JSON.parse(data);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
console.error(chalk_1.default.yellow(`Failed to load skills from ${SKILLS_FILE}, starting empty.`));
|
|
26
|
+
skillLibrary = [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function saveSkills() {
|
|
31
|
+
try {
|
|
32
|
+
fs_1.default.writeFileSync(SKILLS_FILE, JSON.stringify(skillLibrary, null, 2));
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
console.error(chalk_1.default.red(`Failed to save skills to ${SKILLS_FILE}`));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Initialize on load
|
|
39
|
+
loadSkills();
|
|
40
|
+
// === Existing Logic with Save Hooks ===
|
|
9
41
|
/**
|
|
10
42
|
* 计算技能分 (0 ~ 1)
|
|
11
43
|
*/
|
|
@@ -36,6 +68,7 @@ function updateSkillStatus(skillId, success) {
|
|
|
36
68
|
// 失败惩罚: 惩罚力度大于奖励,防止系统“自嗨”
|
|
37
69
|
skill.confidence = Math.max(0, skill.confidence - 0.1);
|
|
38
70
|
}
|
|
71
|
+
saveSkills(); // Persist changes
|
|
39
72
|
}
|
|
40
73
|
/**
|
|
41
74
|
* 自动学习新技能
|
|
@@ -66,6 +99,7 @@ function learnSkillFromRecord(record, success = true) {
|
|
|
66
99
|
});
|
|
67
100
|
// 每学习一次,尝试清理一次“冷”技能
|
|
68
101
|
reapColdSkills();
|
|
102
|
+
saveSkills(); // Persist changes
|
|
69
103
|
}
|
|
70
104
|
/**
|
|
71
105
|
* 筛选并排序技能 (用于注入 Prompt)
|
|
@@ -85,6 +119,7 @@ function getRelevantSkills(input, limit = 3) {
|
|
|
85
119
|
*/
|
|
86
120
|
function reapColdSkills() {
|
|
87
121
|
const now = Date.now();
|
|
122
|
+
const initialCount = skillLibrary.length;
|
|
88
123
|
skillLibrary = skillLibrary.filter(skill => {
|
|
89
124
|
const score = computeSkillScore(skill, now);
|
|
90
125
|
const idleDays = (now - skill.lastUsed) / (1000 * 60 * 60 * 24);
|
|
@@ -103,6 +138,9 @@ function reapColdSkills() {
|
|
|
103
138
|
skillLibrary.sort((a, b) => computeSkillScore(a, now) - computeSkillScore(b, now));
|
|
104
139
|
skillLibrary.shift();
|
|
105
140
|
}
|
|
141
|
+
if (skillLibrary.length !== initialCount) {
|
|
142
|
+
saveSkills(); // Persist if changes happened
|
|
143
|
+
}
|
|
106
144
|
}
|
|
107
145
|
function getAllSkills() {
|
|
108
146
|
return [...skillLibrary];
|
package/dist/agent/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
|