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.
Files changed (112) hide show
  1. package/.env.example +4 -0
  2. package/.eslintrc.json +21 -0
  3. package/.prettierrc.json +9 -0
  4. package/CHANGELOG.md +107 -0
  5. package/README.md +240 -0
  6. package/bin/pua +2 -0
  7. package/dist/commands/chat.d.ts +15 -0
  8. package/dist/commands/chat.d.ts.map +1 -0
  9. package/dist/commands/chat.js +262 -0
  10. package/dist/commands/chat.js.map +1 -0
  11. package/dist/commands/config.d.ts +15 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +247 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/prompt.d.ts +14 -0
  16. package/dist/commands/prompt.d.ts.map +1 -0
  17. package/dist/commands/prompt.js +126 -0
  18. package/dist/commands/prompt.js.map +1 -0
  19. package/dist/config/providers.d.ts +37 -0
  20. package/dist/config/providers.d.ts.map +1 -0
  21. package/dist/config/providers.js +96 -0
  22. package/dist/config/providers.js.map +1 -0
  23. package/dist/config/session-storage.d.ts +29 -0
  24. package/dist/config/session-storage.d.ts.map +1 -0
  25. package/dist/config/session-storage.js +67 -0
  26. package/dist/config/session-storage.js.map +1 -0
  27. package/dist/config/settings.d.ts +55 -0
  28. package/dist/config/settings.d.ts.map +1 -0
  29. package/dist/config/settings.js +163 -0
  30. package/dist/config/settings.js.map +1 -0
  31. package/dist/config/storage.d.ts +69 -0
  32. package/dist/config/storage.d.ts.map +1 -0
  33. package/dist/config/storage.js +126 -0
  34. package/dist/config/storage.js.map +1 -0
  35. package/dist/history/session.d.ts +52 -0
  36. package/dist/history/session.d.ts.map +1 -0
  37. package/dist/history/session.js +122 -0
  38. package/dist/history/session.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +157 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/base.d.ts +38 -0
  44. package/dist/llm/base.d.ts.map +1 -0
  45. package/dist/llm/base.js +22 -0
  46. package/dist/llm/base.js.map +1 -0
  47. package/dist/llm/factory.d.ts +12 -0
  48. package/dist/llm/factory.d.ts.map +1 -0
  49. package/dist/llm/factory.js +26 -0
  50. package/dist/llm/factory.js.map +1 -0
  51. package/dist/llm/openai.d.ts +10 -0
  52. package/dist/llm/openai.d.ts.map +1 -0
  53. package/dist/llm/openai.js +97 -0
  54. package/dist/llm/openai.js.map +1 -0
  55. package/dist/llm/zhipu.d.ts +10 -0
  56. package/dist/llm/zhipu.d.ts.map +1 -0
  57. package/dist/llm/zhipu.js +91 -0
  58. package/dist/llm/zhipu.js.map +1 -0
  59. package/dist/prompts/boss.d.ts +6 -0
  60. package/dist/prompts/boss.d.ts.map +1 -0
  61. package/dist/prompts/boss.js +41 -0
  62. package/dist/prompts/boss.js.map +1 -0
  63. package/dist/prompts/employee.d.ts +6 -0
  64. package/dist/prompts/employee.d.ts.map +1 -0
  65. package/dist/prompts/employee.js +41 -0
  66. package/dist/prompts/employee.js.map +1 -0
  67. package/dist/prompts/index.d.ts +4 -0
  68. package/dist/prompts/index.d.ts.map +1 -0
  69. package/dist/prompts/index.js +9 -0
  70. package/dist/prompts/index.js.map +1 -0
  71. package/dist/utils/formatter.d.ts +25 -0
  72. package/dist/utils/formatter.d.ts.map +1 -0
  73. package/dist/utils/formatter.js +83 -0
  74. package/dist/utils/formatter.js.map +1 -0
  75. package/dist/utils/logger.d.ts +10 -0
  76. package/dist/utils/logger.d.ts.map +1 -0
  77. package/dist/utils/logger.js +31 -0
  78. package/dist/utils/logger.js.map +1 -0
  79. package/dist/utils/stream.d.ts +36 -0
  80. package/dist/utils/stream.d.ts.map +1 -0
  81. package/dist/utils/stream.js +74 -0
  82. package/dist/utils/stream.js.map +1 -0
  83. package/docs/OPTIMIZATION.md +772 -0
  84. package/docs/TECHNICAL_PRINCIPLES.md +663 -0
  85. package/package.json +52 -0
  86. package/sample/1.png +0 -0
  87. package/sample/2.png +0 -0
  88. package/screenshots/chat-dialogue.png +0 -0
  89. package/screenshots/chat-mode.png +0 -0
  90. package/src/__tests__/config/settings.test.ts +48 -0
  91. package/src/__tests__/prompts/boss.test.ts +35 -0
  92. package/src/commands/chat.ts +328 -0
  93. package/src/commands/config.ts +283 -0
  94. package/src/commands/prompt.ts +154 -0
  95. package/src/config/providers.ts +109 -0
  96. package/src/config/session-storage.ts +94 -0
  97. package/src/config/settings.ts +194 -0
  98. package/src/config/storage.ts +150 -0
  99. package/src/history/session.ts +141 -0
  100. package/src/index.ts +164 -0
  101. package/src/llm/base.ts +55 -0
  102. package/src/llm/factory.ts +24 -0
  103. package/src/llm/openai.ts +113 -0
  104. package/src/llm/zhipu.ts +101 -0
  105. package/src/prompts/boss.ts +43 -0
  106. package/src/prompts/employee.ts +43 -0
  107. package/src/prompts/index.ts +3 -0
  108. package/src/utils/formatter.ts +104 -0
  109. package/src/utils/logger.ts +31 -0
  110. package/src/utils/stream.ts +76 -0
  111. package/tsconfig.json +20 -0
  112. package/vitest.config.ts +18 -0
package/.env.example ADDED
@@ -0,0 +1,4 @@
1
+ # 智谱 AI API Key
2
+ # 获取方式:访问 https://bigmodel.cn/ 注册并获取 API Key
3
+ # 新用户可获得 2000 万免费 tokens
4
+ ZHIPUAI_API_KEY=your-api-key-here
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
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "all",
4
+ "singleQuote": true,
5
+ "printWidth": 100,
6
+ "tabWidth": 2,
7
+ "arrowParens": "always",
8
+ "endOfLine": "lf"
9
+ }
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
+ ![Chat Mode](screenshots/chat-mode.png)
9
+
10
+ ### 交互对话界面
11
+ ![Chat Dialogue](screenshots/chat-dialogue.png)
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,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js');
@@ -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":"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"}