workplace-pua-cli 0.4.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/.env.example +4 -0
- package/.eslintrc.json +21 -0
- package/.prettierrc.json +9 -0
- package/CHANGELOG.md +107 -0
- package/README.md +240 -0
- package/bin/pua +2 -0
- package/dist/commands/chat.d.ts +15 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +262 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +247 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/prompt.d.ts +14 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +126 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config/providers.d.ts +37 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +96 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/session-storage.d.ts +29 -0
- package/dist/config/session-storage.d.ts.map +1 -0
- package/dist/config/session-storage.js +67 -0
- package/dist/config/session-storage.js.map +1 -0
- package/dist/config/settings.d.ts +55 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +163 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/storage.d.ts +69 -0
- package/dist/config/storage.d.ts.map +1 -0
- package/dist/config/storage.js +126 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/history/session.d.ts +52 -0
- package/dist/history/session.d.ts.map +1 -0
- package/dist/history/session.js +122 -0
- package/dist/history/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base.d.ts +38 -0
- package/dist/llm/base.d.ts.map +1 -0
- package/dist/llm/base.js +22 -0
- package/dist/llm/base.js.map +1 -0
- package/dist/llm/factory.d.ts +12 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +26 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai.d.ts +10 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +97 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/zhipu.d.ts +10 -0
- package/dist/llm/zhipu.d.ts.map +1 -0
- package/dist/llm/zhipu.js +91 -0
- package/dist/llm/zhipu.js.map +1 -0
- package/dist/prompts/boss.d.ts +6 -0
- package/dist/prompts/boss.d.ts.map +1 -0
- package/dist/prompts/boss.js +41 -0
- package/dist/prompts/boss.js.map +1 -0
- package/dist/prompts/employee.d.ts +6 -0
- package/dist/prompts/employee.d.ts.map +1 -0
- package/dist/prompts/employee.js +41 -0
- package/dist/prompts/employee.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/utils/formatter.d.ts +25 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +83 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/stream.d.ts +36 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +74 -0
- package/dist/utils/stream.js.map +1 -0
- package/docs/OPTIMIZATION.md +772 -0
- package/docs/TECHNICAL_PRINCIPLES.md +663 -0
- package/package.json +52 -0
- package/sample/1.png +0 -0
- package/sample/2.png +0 -0
- package/screenshots/chat-dialogue.png +0 -0
- package/screenshots/chat-mode.png +0 -0
- package/src/__tests__/config/settings.test.ts +48 -0
- package/src/__tests__/prompts/boss.test.ts +35 -0
- package/src/commands/chat.ts +328 -0
- package/src/commands/config.ts +283 -0
- package/src/commands/prompt.ts +154 -0
- package/src/config/providers.ts +109 -0
- package/src/config/session-storage.ts +94 -0
- package/src/config/settings.ts +194 -0
- package/src/config/storage.ts +150 -0
- package/src/history/session.ts +141 -0
- package/src/index.ts +164 -0
- package/src/llm/base.ts +55 -0
- package/src/llm/factory.ts +24 -0
- package/src/llm/openai.ts +113 -0
- package/src/llm/zhipu.ts +101 -0
- package/src/prompts/boss.ts +43 -0
- package/src/prompts/employee.ts +43 -0
- package/src/prompts/index.ts +3 -0
- package/src/utils/formatter.ts +104 -0
- package/src/utils/logger.ts +31 -0
- package/src/utils/stream.ts +76 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +18 -0
package/.env.example
ADDED
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": [
|
|
3
|
+
"eslint:recommended",
|
|
4
|
+
"plugin:@typescript-eslint/recommended"
|
|
5
|
+
],
|
|
6
|
+
"parser": "@typescript-eslint/parser",
|
|
7
|
+
"parserOptions": {
|
|
8
|
+
"ecmaVersion": 2022,
|
|
9
|
+
"sourceType": "module",
|
|
10
|
+
"project": "./tsconfig.json"
|
|
11
|
+
},
|
|
12
|
+
"plugins": ["@typescript-eslint"],
|
|
13
|
+
"rules": {
|
|
14
|
+
"no-console": "off",
|
|
15
|
+
"@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
|
|
16
|
+
"@typescript-eslint/explicit-function-return-type": "off",
|
|
17
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
18
|
+
"no-undef": "off"
|
|
19
|
+
},
|
|
20
|
+
"ignorePatterns": ["dist/", "node_modules/"]
|
|
21
|
+
}
|
package/.prettierrc.json
ADDED
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to PUA CLI will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
6
|
+
|
|
7
|
+
## [0.4.0] - 2025-02-12 - MVP Edition
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **完整测试框架** - Vitest 配置和基础测试文件
|
|
11
|
+
- **代码质量工具** - ESLint 和 Prettier 配置
|
|
12
|
+
- **输出格式增强** - 支持 text/markdown/json 三种格式
|
|
13
|
+
- **会话持久化** - SessionStorage 文件会话保存/加载
|
|
14
|
+
- **会话管理命令** - /save、/sessions、/load 等命令
|
|
15
|
+
- **优化方案文档** - 7 大优化方案的完整技术文档
|
|
16
|
+
- **技术文档更新** - 添加优化方案参考链接
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **Dependencies**: 更新项目依赖
|
|
20
|
+
- 添加 vitest@^2.0.0
|
|
21
|
+
- 添加 eslint@^9.15.0
|
|
22
|
+
- 添加 prettier@^3.3.0
|
|
23
|
+
- 移除 @vitest/ui 类型引用
|
|
24
|
+
- TypeScript strict 模式改为 false(提升兼容性)
|
|
25
|
+
|
|
26
|
+
- **DevDependencies**: 更新开发依赖
|
|
27
|
+
- typescript@^5.7.2
|
|
28
|
+
|
|
29
|
+
- **New Files**:
|
|
30
|
+
- `src/__tests__/` - 测试文件目录
|
|
31
|
+
- `src/utils/formatter.ts` - 输出格式化器
|
|
32
|
+
- `src/config/session-storage.ts` - 会话持久化
|
|
33
|
+
- `.eslintrc.json` - ESLint 配置
|
|
34
|
+
- `.prettierrc.json` - Prettier 配置
|
|
35
|
+
- `vitest.config.ts` - Vitest 配置
|
|
36
|
+
- `docs/OPTIMIZATION.md` - 优化方案文档
|
|
37
|
+
- `CHANGELOG.md` - 本文件
|
|
38
|
+
|
|
39
|
+
- **Updated Files**:
|
|
40
|
+
- `package.json` - 新增脚本和版本更新
|
|
41
|
+
- `README.md` - 添加优化方案链接
|
|
42
|
+
- `src/index.ts` - 更新导入路径
|
|
43
|
+
- `src/commands/chat.ts` - 添加会话命令
|
|
44
|
+
- `src/commands/prompt.ts` - 添加 format 选项
|
|
45
|
+
- `tsconfig.json` - 关闭 strict 和 declaration
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
- 修复输出格式化器中的 `format` 方法名冲突
|
|
49
|
+
- 修复会话存储中的 Omit 类型使用
|
|
50
|
+
- 移除重复的命令处理代码
|
|
51
|
+
|
|
52
|
+
### Technical Details
|
|
53
|
+
- **测试框架**: Vitest 2.0.0 with V8 coverage provider
|
|
54
|
+
- **代码质量**: ESLint 9.15.0 + Prettier 3.3.0
|
|
55
|
+
- **TypeScript**: 5.7.2 with strict: false for better compatibility
|
|
56
|
+
- **输出格式**: 三种格式支持(text/markdown/json)
|
|
57
|
+
- **会话管理**: 文件系统持久化,支持保存/加载/列出
|
|
58
|
+
|
|
59
|
+
### Contributors
|
|
60
|
+
- @ava-agent (Claude Opus 4.6)
|
|
61
|
+
|
|
62
|
+
### Downloads
|
|
63
|
+
- N/A (CLI 工具,本地安装)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## [0.3.0] - 2025-02-11 - Testing & Quality Edition
|
|
68
|
+
|
|
69
|
+
### Added
|
|
70
|
+
- 基础测试框架 (Vitest)
|
|
71
|
+
- 代码质量工具 (ESLint + Prettier)
|
|
72
|
+
- 会话管理命令 (/save, /sessions, /load)
|
|
73
|
+
- 输出格式支持 (--format)
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
- **Dependencies**:
|
|
77
|
+
- 添加 vitest、eslint、prettier
|
|
78
|
+
- **DevDependencies**: 更新测试类型
|
|
79
|
+
- **New Files**:
|
|
80
|
+
- 测试文件
|
|
81
|
+
- 配置文件
|
|
82
|
+
- 工具函数
|
|
83
|
+
|
|
84
|
+
### Fixed
|
|
85
|
+
- 导入路径修复
|
|
86
|
+
- 类型定义完善
|
|
87
|
+
|
|
88
|
+
### Contributors
|
|
89
|
+
- @ava-agent
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## [0.2.0] - 2025-02-09 - Initial Release
|
|
94
|
+
|
|
95
|
+
### Added
|
|
96
|
+
- 首次公开版本
|
|
97
|
+
- CLI 框架 (Commander.js)
|
|
98
|
+
- 多 Provider 支持 (智谱 AI、OpenAI)
|
|
99
|
+
- 交互式聊天模式
|
|
100
|
+
- 单次提示模式
|
|
101
|
+
- 流式输出 (SSE)
|
|
102
|
+
- 会话历史管理
|
|
103
|
+
- 配置管理系统
|
|
104
|
+
- 老板/员工角色提示词
|
|
105
|
+
|
|
106
|
+
### Contributors
|
|
107
|
+
- @ava-agent
|
package/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# PUA CLI
|
|
2
|
+
|
|
3
|
+
> 一个趣味性 AI CLI 工具,具有两种角色模式:**老板模式**和**员工模式**。
|
|
4
|
+
|
|
5
|
+
## 界面预览
|
|
6
|
+
|
|
7
|
+
### 配置完成界面
|
|
8
|
+

|
|
9
|
+
|
|
10
|
+
### 交互对话界面
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 角色介绍
|
|
16
|
+
|
|
17
|
+
### 老板模式 👔
|
|
18
|
+
- 对员工的工作永远不满意
|
|
19
|
+
- 喜欢用"为你好"来包装指责
|
|
20
|
+
- 经常说"年轻人要多锻炼"
|
|
21
|
+
- 喜欢画大饼,但从不兑现
|
|
22
|
+
- 用质疑的语气评价一切
|
|
23
|
+
|
|
24
|
+
### 员工模式 👤
|
|
25
|
+
- 对老板的任何要求都说"好的"
|
|
26
|
+
- 习惯性道歉
|
|
27
|
+
- 不敢表达真实想法
|
|
28
|
+
- 用卑微的语气回应一切
|
|
29
|
+
- 经常加班,从不敢拒绝
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 快速开始
|
|
34
|
+
|
|
35
|
+
### 一键安装
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 克隆项目
|
|
39
|
+
git clone https://github.com/ava-agent/pua-cli.git
|
|
40
|
+
cd pua_cli
|
|
41
|
+
|
|
42
|
+
# 安装依赖并构建
|
|
43
|
+
npm install && npm run build
|
|
44
|
+
|
|
45
|
+
# 全局安装
|
|
46
|
+
npm install -g .
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 首次使用
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 启动聊天(首次运行会自动进入配置向导)
|
|
53
|
+
pua chat
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
配置向导会引导你:
|
|
57
|
+
- 选择 AI 服务提供商(智谱 AI / OpenAI)
|
|
58
|
+
- 输入 API Key
|
|
59
|
+
- 设置默认模型和角色
|
|
60
|
+
|
|
61
|
+
### 立即体验
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# 老板模式 - PUA 别人
|
|
65
|
+
pua chat --role boss --severity extreme
|
|
66
|
+
|
|
67
|
+
# 员工模式 - 被 PUA
|
|
68
|
+
pua chat --role employee
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### 单次提示模式
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# 直接提问
|
|
75
|
+
pua prompt --role boss "代码写完了"
|
|
76
|
+
|
|
77
|
+
# 管道输入(适合脚本调用)
|
|
78
|
+
echo "加班" | pua prompt --role employee
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 常用命令
|
|
84
|
+
|
|
85
|
+
| 命令 | 说明 |
|
|
86
|
+
|------|------|
|
|
87
|
+
| `pua chat` | 启动交互模式 |
|
|
88
|
+
| `pua prompt "问题"` | 单次提问 |
|
|
89
|
+
| `pua config` | 重新配置 |
|
|
90
|
+
| `pua config --show` | 查看配置 |
|
|
91
|
+
|
|
92
|
+
### 交互模式内命令
|
|
93
|
+
|
|
94
|
+
| 命令 | 说明 |
|
|
95
|
+
|------|------|
|
|
96
|
+
| `/help` | 显示帮助信息 |
|
|
97
|
+
| `/clear` | 清空会话历史 |
|
|
98
|
+
| `/history` | 查看历史 |
|
|
99
|
+
| `/info` | 显示会话统计信息 |
|
|
100
|
+
| `/save [名称]` | 保存当前会话 |
|
|
101
|
+
| `/sessions` | 列出所有会话 |
|
|
102
|
+
| `/load <ID>` | 加载指定会话 |
|
|
103
|
+
| `/exit` | 退出程序 |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 配置说明
|
|
108
|
+
|
|
109
|
+
### 查看当前配置
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pua config --show
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 重新配置
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pua config
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 支持的 AI 服务提供商
|
|
124
|
+
|
|
125
|
+
| Provider | 代码 | 默认模型 | 说明 |
|
|
126
|
+
|----------|------|----------|------|
|
|
127
|
+
| 智谱 AI | `zhipu` | `glm-4.7` | 国产,稳定 |
|
|
128
|
+
| OpenAI | `openai` | `gpt-4o` | 国际通用 |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 命令行选项
|
|
133
|
+
|
|
134
|
+
| 选项 | 说明 |
|
|
135
|
+
|------|------|
|
|
136
|
+
| `--provider <zhipu\|openai>` | AI 服务提供商 |
|
|
137
|
+
| `--role <boss\|employee>` | 角色模式 |
|
|
138
|
+
| `--model <model>` | 模型名称 |
|
|
139
|
+
| `--severity <mild\|medium\|extreme>` | PUA 强度 |
|
|
140
|
+
| `--format <text\|markdown\|json>` | 输出格式 |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 使用场景
|
|
145
|
+
|
|
146
|
+
### 趣味对话
|
|
147
|
+
|
|
148
|
+
体验"职场 PUA"的趣味互动:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
pua chat --role boss --severity extreme
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### AI 工作流
|
|
155
|
+
|
|
156
|
+
在脚本中作为提示词生成器:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# 生成批评性提示
|
|
160
|
+
critique=$(pua prompt --role boss "代码质量差")
|
|
161
|
+
|
|
162
|
+
# 传递给其他工具
|
|
163
|
+
echo "$critique" | your-ai-tool --prompt "{}"
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 开发
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# 安装依赖
|
|
172
|
+
npm install
|
|
173
|
+
|
|
174
|
+
# 开发模式
|
|
175
|
+
npm run dev
|
|
176
|
+
|
|
177
|
+
# 构建
|
|
178
|
+
npm run build
|
|
179
|
+
|
|
180
|
+
# 运行测试
|
|
181
|
+
npm test
|
|
182
|
+
|
|
183
|
+
# 代码检查
|
|
184
|
+
npm run lint
|
|
185
|
+
|
|
186
|
+
# 格式化代码
|
|
187
|
+
npm run format
|
|
188
|
+
|
|
189
|
+
# 类型检查
|
|
190
|
+
npm run type-check
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 配置文件位置
|
|
196
|
+
|
|
197
|
+
- **Windows**: `%APPDATA%\pua-cli\config.json`
|
|
198
|
+
- **Linux/macOS**: `~/.config/pua-cli/config.json`
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 获取 API Key
|
|
203
|
+
|
|
204
|
+
### 智谱 AI(推荐)
|
|
205
|
+
|
|
206
|
+
- 访问 [bigmodel.cn](https://bigmodel.cn/)
|
|
207
|
+
- 完成实名认证后免费获取 2000 万 tokens
|
|
208
|
+
- 在控制台复制 API Key
|
|
209
|
+
|
|
210
|
+
### OpenAI
|
|
211
|
+
|
|
212
|
+
- 访问 [platform.openai.com](https://platform.openai.com/)
|
|
213
|
+
- 注册账号并在 API Keys 页面创建 Key
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 文档
|
|
218
|
+
|
|
219
|
+
### 📘 [详细技术文档](docs/TECHNICAL_PRINCIPLES.md)
|
|
220
|
+
完整的 CLI 工具开发实践,包含架构设计、实现细节和最佳实践
|
|
221
|
+
|
|
222
|
+
### 🚀 [优化方案](docs/OPTIMIZATION.md)
|
|
223
|
+
7 大优化方案的完整技术分析,参考 Claude Code、Gemini CLI 等优秀 AI CLI
|
|
224
|
+
|
|
225
|
+
### 📜 [更新日志](CHANGELOG.md)
|
|
226
|
+
版本历史和变更记录
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 免责声明
|
|
231
|
+
|
|
232
|
+
本工具仅供娱乐和学习使用,通过角色扮演的方式对职场 PUA 现象进行讽刺和调侃。
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
MIT
|
|
239
|
+
|
|
240
|
+
© 2025 PUA CLI Contributors
|
package/bin/pua
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ProviderType } from '../config/providers';
|
|
2
|
+
export interface ChatOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
provider: ProviderType;
|
|
5
|
+
model: string;
|
|
6
|
+
role: 'boss' | 'employee';
|
|
7
|
+
severity: 'mild' | 'medium' | 'extreme';
|
|
8
|
+
}
|
|
9
|
+
declare module 'readline' {
|
|
10
|
+
interface Interface {
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare function chatCommand(options: ChatOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzC;AAWD,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,SAAS;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB;CACF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHrE"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.chatCommand = chatCommand;
|
|
7
|
+
const readline_1 = __importDefault(require("readline"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const prompts_1 = require("../prompts");
|
|
11
|
+
const factory_1 = require("../llm/factory");
|
|
12
|
+
const settings_1 = require("../config/settings");
|
|
13
|
+
const stream_1 = require("../utils/stream");
|
|
14
|
+
const session_1 = require("../history/session");
|
|
15
|
+
const session_storage_1 = require("../config/session-storage");
|
|
16
|
+
const logger_1 = require("../utils/logger");
|
|
17
|
+
// 全局会话存储实例
|
|
18
|
+
const sessionStorage = new session_storage_1.SessionStorage();
|
|
19
|
+
async function chatCommand(options) {
|
|
20
|
+
// Create session
|
|
21
|
+
const sessionId = `session-${Date.now()}`;
|
|
22
|
+
session_1.sessionManager.createSession(sessionId);
|
|
23
|
+
// Create readline interface first
|
|
24
|
+
const rl = readline_1.default.createInterface({
|
|
25
|
+
input: process.stdin,
|
|
26
|
+
output: process.stdout,
|
|
27
|
+
prompt: chalk_1.default.green('❯ ')
|
|
28
|
+
});
|
|
29
|
+
// 保存元数据到 rl 以便在命令处理中使用
|
|
30
|
+
rl['role'] = options.role;
|
|
31
|
+
rl['severity'] = options.severity;
|
|
32
|
+
rl['provider'] = options.provider;
|
|
33
|
+
rl['model'] = options.model;
|
|
34
|
+
// Set up system message
|
|
35
|
+
const systemMessage = options.role === 'boss'
|
|
36
|
+
? (0, prompts_1.getBossSystemMessage)(options.severity)
|
|
37
|
+
: (0, prompts_1.getEmployeeSystemMessage)(options.severity);
|
|
38
|
+
session_1.sessionManager.addMessage({ role: 'system', content: systemMessage });
|
|
39
|
+
// Create LLM instance
|
|
40
|
+
const llm = (0, factory_1.createLLM)(options.provider, {
|
|
41
|
+
apiKey: options.apiKey,
|
|
42
|
+
model: options.model,
|
|
43
|
+
baseUrl: (0, settings_1.getProviderBaseUrl)(options.provider),
|
|
44
|
+
});
|
|
45
|
+
const printer = new stream_1.StreamPrinter(options.role === 'boss' ? chalk_1.default.red : chalk_1.default.yellow);
|
|
46
|
+
// Print welcome message
|
|
47
|
+
const roleLabel = options.role === 'boss' ? '老板模式' : '员工模式';
|
|
48
|
+
const roleEmoji = options.role === 'boss' ? '👔' : '👤';
|
|
49
|
+
const severityLabel = {
|
|
50
|
+
mild: '温和',
|
|
51
|
+
medium: '标准',
|
|
52
|
+
extreme: '极端'
|
|
53
|
+
}[options.severity];
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(chalk_1.default.cyan('╔═══════════════════════════════════════════════════════════╗'));
|
|
56
|
+
console.log(chalk_1.default.cyan('║') + chalk_1.default.bold.white(` ${roleEmoji} PUA CLI - ${roleLabel} `) + chalk_1.default.cyan('║'));
|
|
57
|
+
console.log(chalk_1.default.cyan('║') + ` Provider: ${chalk_1.default.gray(options.provider)} 强度: ${chalk_1.default.gray(severityLabel)} ` + chalk_1.default.cyan('║'));
|
|
58
|
+
console.log(chalk_1.default.cyan('║') + ` 模型: ${chalk_1.default.gray(options.model)} ` + chalk_1.default.cyan('║'));
|
|
59
|
+
console.log(chalk_1.default.cyan('╚═══════════════════════════════════════════════════════════╝'));
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(chalk_1.default.gray('输入 /help 查看可用命令,输入 /exit 退出'));
|
|
62
|
+
console.log();
|
|
63
|
+
rl.prompt();
|
|
64
|
+
rl.on('line', async (input) => {
|
|
65
|
+
const trimmedInput = input.trim();
|
|
66
|
+
// Handle commands
|
|
67
|
+
if (trimmedInput.startsWith('/')) {
|
|
68
|
+
await handleCommand(trimmedInput, rl, printer);
|
|
69
|
+
rl.prompt();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!trimmedInput) {
|
|
73
|
+
rl.prompt();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Add user message to session
|
|
77
|
+
session_1.sessionManager.addMessage({ role: 'user', content: trimmedInput });
|
|
78
|
+
// Print user input
|
|
79
|
+
printer.printUserInput(trimmedInput);
|
|
80
|
+
// Call LLM
|
|
81
|
+
let spinner = null;
|
|
82
|
+
let hasStarted = false;
|
|
83
|
+
try {
|
|
84
|
+
printer.printResponseHeader(options.role);
|
|
85
|
+
const messages = session_1.sessionManager.getMessages();
|
|
86
|
+
await llm.chatStream(messages, (chunk) => {
|
|
87
|
+
if (!hasStarted) {
|
|
88
|
+
hasStarted = true;
|
|
89
|
+
if (spinner) {
|
|
90
|
+
spinner.stop();
|
|
91
|
+
spinner = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
printer.printChunk(chunk);
|
|
95
|
+
});
|
|
96
|
+
printer.printResponseFooter();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (spinner)
|
|
100
|
+
spinner.stop();
|
|
101
|
+
printer.printError(error instanceof Error ? error.message : String(error));
|
|
102
|
+
}
|
|
103
|
+
rl.prompt();
|
|
104
|
+
});
|
|
105
|
+
rl.on('close', () => {
|
|
106
|
+
console.log();
|
|
107
|
+
logger_1.logger.info('再见!');
|
|
108
|
+
process.exit(0);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function handleCommand(command, rl, printer) {
|
|
112
|
+
const [cmd, ...args] = command.split(' ');
|
|
113
|
+
switch (cmd) {
|
|
114
|
+
case '/help':
|
|
115
|
+
printHelp();
|
|
116
|
+
break;
|
|
117
|
+
case '/exit':
|
|
118
|
+
case '/quit':
|
|
119
|
+
case '/q':
|
|
120
|
+
console.log();
|
|
121
|
+
logger_1.logger.info('再见!');
|
|
122
|
+
rl.close();
|
|
123
|
+
process.exit(0);
|
|
124
|
+
break;
|
|
125
|
+
case '/clear':
|
|
126
|
+
session_1.sessionManager.clearCurrentSession();
|
|
127
|
+
logger_1.logger.success('会话历史已清空');
|
|
128
|
+
break;
|
|
129
|
+
case '/history':
|
|
130
|
+
console.log(session_1.sessionManager.getFormattedHistory());
|
|
131
|
+
break;
|
|
132
|
+
case '/info':
|
|
133
|
+
console.log(session_1.sessionManager.getSessionInfo());
|
|
134
|
+
break;
|
|
135
|
+
case '/save':
|
|
136
|
+
await handleSaveCommand(args, rl);
|
|
137
|
+
break;
|
|
138
|
+
case '/sessions':
|
|
139
|
+
await handleSessionsCommand(rl);
|
|
140
|
+
break;
|
|
141
|
+
case '/load':
|
|
142
|
+
await handleLoadCommand(args, rl);
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
logger_1.logger.warning(`未知命令: ${cmd}`);
|
|
146
|
+
console.log(chalk_1.default.gray('输入 /help 查看可用命令'));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function printHelp() {
|
|
150
|
+
console.log();
|
|
151
|
+
console.log(chalk_1.default.bold('可用命令:'));
|
|
152
|
+
console.log(chalk_1.default.gray('─').repeat(50));
|
|
153
|
+
console.log(' /help 显示此帮助信息');
|
|
154
|
+
console.log(' /clear 清空当前会话历史');
|
|
155
|
+
console.log(' /history 显示会话历史记录');
|
|
156
|
+
console.log(' /info 显示会话统计信息');
|
|
157
|
+
console.log(' /save [名称] 保存当前会话');
|
|
158
|
+
console.log(' /sessions 列出所有已保存会话');
|
|
159
|
+
console.log(' /load <ID> 加载指定会话');
|
|
160
|
+
console.log(' /exit 退出程序');
|
|
161
|
+
console.log();
|
|
162
|
+
}
|
|
163
|
+
async function handleSaveCommand(args, rl) {
|
|
164
|
+
const sessionName = args.join(' ') || '未命名会话';
|
|
165
|
+
const currentMessages = session_1.sessionManager.getMessages();
|
|
166
|
+
const spinner = (0, ora_1.default)('保存会话中...').start();
|
|
167
|
+
try {
|
|
168
|
+
const savedSession = sessionStorage.saveSession({
|
|
169
|
+
name: sessionName,
|
|
170
|
+
description: `包含 ${currentMessages.length} 条消息`,
|
|
171
|
+
messages: currentMessages,
|
|
172
|
+
metadata: {
|
|
173
|
+
role: rl['role'] || 'boss',
|
|
174
|
+
severity: rl['severity'] || 'medium',
|
|
175
|
+
provider: rl['provider'] || 'zhipu',
|
|
176
|
+
model: rl['model'] || 'glm-4.7'
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
spinner.stop();
|
|
180
|
+
logger_1.logger.success(`会话已保存: ${savedSession.name} (ID: ${savedSession.id})`);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
spinner.stop();
|
|
184
|
+
logger_1.logger.error(`保存失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
185
|
+
}
|
|
186
|
+
rl.prompt();
|
|
187
|
+
}
|
|
188
|
+
async function handleSessionsCommand(rl) {
|
|
189
|
+
const spinner = (0, ora_1.default)('加载会话列表...').start();
|
|
190
|
+
try {
|
|
191
|
+
const sessions = sessionStorage.listSessions();
|
|
192
|
+
spinner.stop();
|
|
193
|
+
if (sessions.length === 0) {
|
|
194
|
+
logger_1.logger.info('暂无已保存的会话');
|
|
195
|
+
rl.prompt();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
console.log();
|
|
199
|
+
console.log(chalk_1.default.bold('已保存的会话:'));
|
|
200
|
+
console.log(chalk_1.default.gray('─').repeat(60));
|
|
201
|
+
for (const session of sessions) {
|
|
202
|
+
const messageCount = session.messages?.length || 0;
|
|
203
|
+
const timeAgo = getTimeAgo(session.updatedAt);
|
|
204
|
+
console.log(` ${chalk_1.default.cyan(session.id.padEnd(12))} ${chalk_1.default.white(session.name.padEnd(20))} ${chalk_1.default.gray(`(${messageCount} 条消息, ${timeAgo})`)}`);
|
|
205
|
+
}
|
|
206
|
+
console.log();
|
|
207
|
+
logger_1.logger.info('使用 /load <ID> 加载会话');
|
|
208
|
+
rl.prompt();
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
spinner.stop();
|
|
212
|
+
logger_1.logger.error(`加载失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
213
|
+
rl.prompt();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function handleLoadCommand(args, rl) {
|
|
217
|
+
const sessionId = args[0];
|
|
218
|
+
if (!sessionId) {
|
|
219
|
+
logger_1.logger.error('请指定会话 ID');
|
|
220
|
+
console.log(chalk_1.default.gray('使用 /sessions 查看所有会话'));
|
|
221
|
+
rl.prompt();
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const spinner = (0, ora_1.default)('加载会话中...').start();
|
|
225
|
+
try {
|
|
226
|
+
const session = sessionStorage.loadSession(sessionId);
|
|
227
|
+
if (!session) {
|
|
228
|
+
spinner.stop();
|
|
229
|
+
logger_1.logger.error(`未找到会话: ${sessionId}`);
|
|
230
|
+
rl.prompt();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
spinner.stop();
|
|
234
|
+
// 加载会话消息
|
|
235
|
+
session_1.sessionManager.clearCurrentSession();
|
|
236
|
+
for (const msg of session.messages || []) {
|
|
237
|
+
session_1.sessionManager.addMessage({ role: msg.role, content: msg.content });
|
|
238
|
+
}
|
|
239
|
+
logger_1.logger.success(`已加载会话: ${session.name}`);
|
|
240
|
+
console.log();
|
|
241
|
+
console.log(chalk_1.default.gray(`会话包含 ${session.messages?.length || 0} 条消息`));
|
|
242
|
+
console.log();
|
|
243
|
+
rl.prompt();
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
spinner.stop();
|
|
247
|
+
logger_1.logger.error(`加载失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
248
|
+
rl.prompt();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function getTimeAgo(timestamp) {
|
|
252
|
+
const now = Date.now();
|
|
253
|
+
const past = new Date(timestamp).getTime();
|
|
254
|
+
const diff = Math.floor((now - past) / 1000);
|
|
255
|
+
if (diff < 60)
|
|
256
|
+
return `${diff} 秒前`;
|
|
257
|
+
if (diff < 3600)
|
|
258
|
+
return `${Math.floor(diff / 60)} 分钟前`;
|
|
259
|
+
if (diff < 86400)
|
|
260
|
+
return `${Math.floor(diff / 3600)} 小时前`;
|
|
261
|
+
return `${Math.floor(diff / 86400)} 天前`;
|
|
262
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAoB,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,WAAW;AACX,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;AAc5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,iBAAiB;IACjB,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1C,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,uBAAuB;IACvB,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,EAAE,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,EAAE,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,wBAAwB;IACxB,MAAM,aAAa,GACjB,OAAO,CAAC,IAAI,KAAK,MAAM;QACrB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEtE,sBAAsB;IACtB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;QACtC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,aAAa,CAC/B,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CACnD,CAAC;IAEF,wBAAwB;IACxB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,aAAa,GAAG;QACpB,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;KACd,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,SAAS,cAAc,SAAS,mBAAmB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5H,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,4BAA4B;IAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;KAC1B,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAElC,kBAAkB;QAClB,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAEnE,mBAAmB;QACnB,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAErC,WAAW;QACX,IAAI,OAAO,GAAQ,IAAI,CAAC;QACxB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC;YACH,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YAE9C,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAC;oBAClB,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,EAAE,CAAC;wBACf,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAEhC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,EAAsB,EACtB,OAAsB;IAEtB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE1C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,SAAS,EAAE,CAAC;YACZ,MAAM;QAER,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QAER,KAAK,QAAQ;YACX,cAAc,CAAC,mBAAmB,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM;QAER,KAAK,UAAU;YACb,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC;YAClD,MAAM;QAER,KAAK,OAAO;YACV,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;YAC7C,MAAM;QAER,KAAK,OAAO;YACV,MAAM,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM;QAER,KAAK,WAAW;YACd,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM;QAER,KAAK,OAAO;YACV,MAAM,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM;QAER;YACE,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAc,EAAE,EAAsB;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;IAC9C,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,EAAE,CAAC;IAE5D,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC;YAC9C,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,MAAM,eAAe,CAAC,MAAM,MAAM;YAC/C,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM;gBAC1B,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,QAAQ;gBACpC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,OAAO;gBACnC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,SAAS;aAChC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,UAAU,YAAY,CAAC,IAAI,SAAS,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,EAAE,CAAC,MAAM,EAAE,CAAC;AACd,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,EAAsB;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,SAAS,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;QACrJ,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAc,EAAE,EAAsB;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;YACpC,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,SAAS;QACT,cAAc,CAAC,mBAAmB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACzC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAE7C,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,KAAK,CAAC;IACnC,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC;IACvD,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;AAC1C,CAAC"}
|