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
@@ -0,0 +1,15 @@
1
+ import { type GlobalConfig } from '../config/storage';
2
+ import { type ProviderType } from '../config/providers';
3
+ export interface ConfigWizardOptions {
4
+ autoMode?: boolean;
5
+ initialProvider?: ProviderType;
6
+ }
7
+ /**
8
+ * Run the configuration wizard
9
+ */
10
+ export declare function configWizard(options?: ConfigWizardOptions): Promise<GlobalConfig>;
11
+ /**
12
+ * Show current configuration
13
+ */
14
+ export declare function showConfig(): Promise<void>;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuD,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAA2D,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGjH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,YAAY,CAAC;CAChC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoM3F;AAeD;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA0ChD"}
@@ -0,0 +1,247 @@
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.configWizard = configWizard;
7
+ exports.showConfig = showConfig;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const input_1 = __importDefault(require("@inquirer/input"));
10
+ const select_1 = __importDefault(require("@inquirer/select"));
11
+ const confirm_1 = __importDefault(require("@inquirer/confirm"));
12
+ const storage_1 = require("../config/storage");
13
+ const providers_1 = require("../config/providers");
14
+ const logger_1 = require("../utils/logger");
15
+ /**
16
+ * Run the configuration wizard
17
+ */
18
+ async function configWizard(options = {}) {
19
+ const { autoMode = false, initialProvider } = options;
20
+ // Show welcome message
21
+ if (!autoMode) {
22
+ console.log();
23
+ console.log(chalk_1.default.cyan.bold('╔═══════════════════════════════════════════════════════════╗'));
24
+ console.log(chalk_1.default.cyan.bold('║') + ' ' + chalk_1.default.white.bold('PUA CLI 配置向导') + ' ' + chalk_1.default.cyan.bold('║'));
25
+ console.log(chalk_1.default.cyan.bold('╚═══════════════════════════════════════════════════════════╝'));
26
+ console.log();
27
+ console.log(chalk_1.default.gray('欢迎使用 PUA CLI!让我们先配置一些基本信息。'));
28
+ console.log();
29
+ }
30
+ // Load existing config if available
31
+ let existingConfig = (0, storage_1.loadGlobalConfig)();
32
+ // Step 1: Select Provider
33
+ const providerAnswer = await (0, select_1.default)({
34
+ message: '选择 AI 服务提供商:',
35
+ choices: [
36
+ {
37
+ name: `${chalk_1.default.green('1.')} 智谱 AI ${chalk_1.default.gray('(国产,推荐)')}`,
38
+ value: 'zhipu',
39
+ description: '国产大模型,稳定可靠,响应快速',
40
+ },
41
+ {
42
+ name: `${chalk_1.default.blue('2.')} OpenAI ${chalk_1.default.gray('(GPT-4o)')}`,
43
+ value: 'openai',
44
+ description: '国际通用,支持 GPT-4o、GPT-4o-mini 等模型',
45
+ },
46
+ ],
47
+ default: existingConfig?.currentProvider || initialProvider || 'zhipu',
48
+ });
49
+ const provider = providerAnswer;
50
+ const providerDef = (0, providers_1.getProvider)(provider);
51
+ console.log();
52
+ console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white.bold(providerDef.name)}`));
53
+ console.log();
54
+ // Step 2: Input API Key
55
+ let apiKey = '';
56
+ let apiKeyValid = false;
57
+ while (!apiKeyValid) {
58
+ apiKey = await (0, input_1.default)({
59
+ message: `请输入 ${providerDef.name} API Key:`,
60
+ default: existingConfig?.providers[provider]?.apiKey || '',
61
+ validate: (value) => {
62
+ if (!value || value.trim().length === 0) {
63
+ return 'API Key 不能为空';
64
+ }
65
+ const validation = (0, providers_1.validateApiKey)(provider, value);
66
+ if (!validation.valid) {
67
+ return validation.error || 'API Key 无效';
68
+ }
69
+ return true;
70
+ },
71
+ });
72
+ const validation = (0, providers_1.validateApiKey)(provider, apiKey);
73
+ apiKeyValid = validation.valid;
74
+ if (!apiKeyValid) {
75
+ console.log(chalk_1.default.red(validation.error || 'API Key 无效,请重新输入'));
76
+ }
77
+ }
78
+ console.log();
79
+ console.log(chalk_1.default.green('✓ API Key 已设置'));
80
+ console.log();
81
+ // Step 3: Input Base URL (optional)
82
+ const useCustomUrl = await (0, confirm_1.default)({
83
+ message: '是否使用自定义 Base URL(用于代理)?',
84
+ default: false,
85
+ });
86
+ let baseUrl = providerDef.defaultBaseUrl;
87
+ if (useCustomUrl) {
88
+ baseUrl = await (0, input_1.default)({
89
+ message: '请输入 Base URL:',
90
+ default: existingConfig?.providers[provider]?.baseUrl || providerDef.defaultBaseUrl,
91
+ validate: (value) => {
92
+ const validation = (0, providers_1.validateBaseUrl)(value);
93
+ if (!validation.valid) {
94
+ return validation.error || 'Base URL 无效';
95
+ }
96
+ return true;
97
+ },
98
+ });
99
+ }
100
+ console.log();
101
+ // Step 4: Select Default Model
102
+ const model = await (0, select_1.default)({
103
+ message: '选择默认模型:',
104
+ choices: providerDef.defaultModels.map((m) => ({
105
+ name: m,
106
+ value: m,
107
+ })),
108
+ default: existingConfig?.defaults.model || providerDef.defaultModels[0],
109
+ });
110
+ console.log();
111
+ console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white(model)}`));
112
+ console.log();
113
+ // Step 5: Select Default Role
114
+ const role = await (0, select_1.default)({
115
+ message: '选择默认角色:',
116
+ choices: [
117
+ { name: '老板模式 (PUA 别人)', value: 'boss' },
118
+ { name: '员工模式 (被 PUA)', value: 'employee' },
119
+ ],
120
+ default: existingConfig?.defaults.role || 'boss',
121
+ });
122
+ console.log();
123
+ console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white(role === 'boss' ? '老板模式' : '员工模式')}`));
124
+ console.log();
125
+ // Step 6: Select Default Severity
126
+ const severity = await (0, select_1.default)({
127
+ message: '选择 PUA 强度:',
128
+ choices: [
129
+ { name: '温和 (mild)', value: 'mild' },
130
+ { name: '标准 (medium)', value: 'medium' },
131
+ { name: '极端 (extreme)', value: 'extreme' },
132
+ ],
133
+ default: existingConfig?.defaults.severity || 'medium',
134
+ });
135
+ console.log();
136
+ console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white(severity)}`));
137
+ console.log();
138
+ // Step 7: Confirm and Save
139
+ const shouldSave = await (0, confirm_1.default)({
140
+ message: '确认保存配置?',
141
+ default: true,
142
+ });
143
+ if (!shouldSave) {
144
+ console.log();
145
+ logger_1.logger.warning('配置已取消');
146
+ throw new Error('配置已取消');
147
+ }
148
+ // Build config object
149
+ const newConfig = {
150
+ currentProvider: provider,
151
+ providers: {
152
+ ...existingConfig?.providers,
153
+ [provider]: {
154
+ apiKey,
155
+ baseUrl,
156
+ models: providerDef.defaultModels,
157
+ },
158
+ },
159
+ defaults: {
160
+ provider,
161
+ model,
162
+ role: role,
163
+ severity: severity,
164
+ },
165
+ onboardingCompleted: true,
166
+ };
167
+ // Save config
168
+ (0, storage_1.ensureConfigDir)();
169
+ (0, storage_1.saveGlobalConfig)(newConfig);
170
+ console.log();
171
+ console.log(chalk_1.default.green('✓ 配置已保存'));
172
+ console.log();
173
+ console.log(chalk_1.default.gray('配置文件位置:'), chalk_1.default.white(getConfigPath()));
174
+ console.log();
175
+ if (!autoMode) {
176
+ console.log(chalk_1.default.cyan('─────────────────────────────────────────────────────────────'));
177
+ console.log();
178
+ console.log(chalk_1.default.white.bold('配置完成!现在你可以开始使用 PUA CLI 了:'));
179
+ console.log();
180
+ console.log(' ' + chalk_1.default.white('pua chat --role boss') + chalk_1.default.gray(' # 启动老板模式'));
181
+ console.log(' ' + chalk_1.default.white('pua prompt --role boss "你好"') + chalk_1.default.gray(' # 单次提示'));
182
+ console.log();
183
+ console.log(chalk_1.default.gray('更多选项请运行: pua --help'));
184
+ console.log();
185
+ }
186
+ return newConfig;
187
+ }
188
+ /**
189
+ * Get the config file path for display
190
+ */
191
+ function getConfigPath() {
192
+ const platform = process.platform;
193
+ if (platform === 'win32') {
194
+ return '%APPDATA%\\pua-cli\\config.json';
195
+ }
196
+ else {
197
+ return '~/.config/pua-cli/config.json';
198
+ }
199
+ }
200
+ /**
201
+ * Show current configuration
202
+ */
203
+ async function showConfig() {
204
+ const config = (0, storage_1.loadGlobalConfig)();
205
+ if (!config) {
206
+ console.log();
207
+ logger_1.logger.warning('未找到配置文件');
208
+ console.log(chalk_1.default.gray('运行 ') + chalk_1.default.white('pua config') + chalk_1.default.gray(' 来配置 PUA CLI'));
209
+ console.log();
210
+ return;
211
+ }
212
+ console.log();
213
+ console.log(chalk_1.default.cyan.bold('当前配置:'));
214
+ console.log(chalk_1.default.gray('─').repeat(50));
215
+ console.log();
216
+ const providerDef = (0, providers_1.getProvider)(config.currentProvider);
217
+ console.log(chalk_1.default.bold('当前 Provider:'), chalk_1.default.white(providerDef?.name || config.currentProvider));
218
+ console.log();
219
+ console.log(chalk_1.default.bold('已配置的 Providers:'));
220
+ for (const [id, providerConfig] of Object.entries(config.providers)) {
221
+ const p = (0, providers_1.getProvider)(id);
222
+ const isCurrent = id === config.currentProvider;
223
+ const prefix = isCurrent ? chalk_1.default.green('→') : ' ';
224
+ console.log(` ${prefix} ${chalk_1.default.white(p?.name || id)}`);
225
+ console.log(` API Key: ${chalk_1.default.gray(maskApiKey(providerConfig.apiKey))}`);
226
+ if (providerConfig.baseUrl) {
227
+ console.log(` Base URL: ${chalk_1.default.gray(providerConfig.baseUrl)}`);
228
+ }
229
+ console.log();
230
+ }
231
+ console.log(chalk_1.default.bold('默认设置:'));
232
+ console.log(` 模型: ${chalk_1.default.white(config.defaults.model)}`);
233
+ console.log(` 角色: ${chalk_1.default.white(config.defaults.role)}`);
234
+ console.log(` 强度: ${chalk_1.default.white(config.defaults.severity)}`);
235
+ console.log();
236
+ console.log(chalk_1.default.gray('配置文件:'), chalk_1.default.white(getConfigPath()));
237
+ console.log();
238
+ }
239
+ /**
240
+ * Mask API key for display
241
+ */
242
+ function maskApiKey(apiKey) {
243
+ if (apiKey.length <= 8) {
244
+ return '*'.repeat(apiKey.length);
245
+ }
246
+ return apiKey.slice(0, 4) + '*'.repeat(apiKey.length - 8) + apiKey.slice(-4);
247
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type OutputFormat } from '../utils/formatter';
2
+ import { type ProviderType } from '../config/providers';
3
+ export interface PromptOptions {
4
+ apiKey: string;
5
+ provider: ProviderType;
6
+ model: string;
7
+ role: 'boss' | 'employee';
8
+ severity: 'mild' | 'medium' | 'extreme';
9
+ input?: string;
10
+ format?: OutputFormat;
11
+ }
12
+ export declare function promptCommand(options: PromptOptions): Promise<void>;
13
+ export declare function promptBatchCommand(inputs: string[], options: PromptOptions): Promise<void>;
14
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,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;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFzE;AAqBD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhG"}
@@ -0,0 +1,126 @@
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.promptCommand = promptCommand;
7
+ exports.promptBatchCommand = promptBatchCommand;
8
+ const readline_1 = __importDefault(require("readline"));
9
+ const chalk_1 = __importDefault(require("chalk"));
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 formatter_1 = require("../utils/formatter");
15
+ const logger_1 = require("../utils/logger");
16
+ async function promptCommand(options) {
17
+ // Get input from argument or stdin
18
+ let userInput = options.input;
19
+ if (!userInput) {
20
+ // Read from stdin if available (pipe mode)
21
+ if (!process.stdin.isTTY) {
22
+ userInput = await readFromStdin();
23
+ }
24
+ }
25
+ if (!userInput) {
26
+ logger_1.logger.error('请提供输入内容');
27
+ console.log(chalk_1.default.gray('用法: pua prompt --role boss "你的问题"'));
28
+ console.log(chalk_1.default.gray('或者: echo "你的问题" | pua prompt --role boss'));
29
+ process.exit(1);
30
+ }
31
+ // Set up system message
32
+ const systemMessage = options.role === 'boss'
33
+ ? (0, prompts_1.getBossSystemMessage)(options.severity)
34
+ : (0, prompts_1.getEmployeeSystemMessage)(options.severity);
35
+ const messages = [
36
+ { role: 'system', content: systemMessage },
37
+ { role: 'user', content: userInput }
38
+ ];
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
+ const formatter = new formatter_1.OutputFormatter(options.format);
47
+ try {
48
+ const roleLabel = options.role === 'boss' ? '老板' : '员工';
49
+ console.log();
50
+ console.log(chalk_1.default.gray(`┌─ ${roleLabel} ─────────────────────────────`));
51
+ let fullResponse = '';
52
+ await llm.chatStream(messages, (chunk) => {
53
+ if (chunk.content) {
54
+ fullResponse += chunk.content;
55
+ // 只有在文本格式时才流式输出
56
+ if (!options.format || options.format === 'text') {
57
+ process.stdout.write(chunk.content);
58
+ }
59
+ }
60
+ });
61
+ console.log();
62
+ console.log(chalk_1.default.gray('└─────────────────────────────────────'));
63
+ console.log();
64
+ // 使用格式化器输出
65
+ if (options.format && options.format !== 'text') {
66
+ formatter.print({
67
+ format: options.format,
68
+ content: fullResponse,
69
+ metadata: {
70
+ role: options.role,
71
+ severity: options.severity,
72
+ provider: options.provider,
73
+ model: options.model
74
+ }
75
+ });
76
+ }
77
+ else {
78
+ // Print just the response for piping purposes
79
+ console.log(fullResponse);
80
+ }
81
+ }
82
+ catch (error) {
83
+ printer.printError(error instanceof Error ? error.message : String(error));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ function readFromStdin() {
88
+ return new Promise((resolve) => {
89
+ let data = '';
90
+ const rl = readline_1.default.createInterface({
91
+ input: process.stdin,
92
+ crlfDelay: Infinity
93
+ });
94
+ rl.on('line', (line) => {
95
+ data += line + '\n';
96
+ });
97
+ rl.on('close', () => {
98
+ resolve(data.trim());
99
+ });
100
+ });
101
+ }
102
+ async function promptBatchCommand(inputs, options) {
103
+ // Set up system message
104
+ const systemMessage = options.role === 'boss'
105
+ ? (0, prompts_1.getBossSystemMessage)(options.severity)
106
+ : (0, prompts_1.getEmployeeSystemMessage)(options.severity);
107
+ // Create LLM instance
108
+ const llm = (0, factory_1.createLLM)(options.provider, {
109
+ apiKey: options.apiKey,
110
+ model: options.model,
111
+ baseUrl: (0, settings_1.getProviderBaseUrl)(options.provider),
112
+ });
113
+ for (const input of inputs) {
114
+ const messages = [
115
+ { role: 'system', content: systemMessage },
116
+ { role: 'user', content: input }
117
+ ];
118
+ try {
119
+ const response = await llm.chat(messages);
120
+ console.log(response);
121
+ }
122
+ catch (error) {
123
+ logger_1.logger.error(error instanceof Error ? error.message : String(error));
124
+ }
125
+ }
126
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type ProviderType = 'zhipu' | 'openai';
2
+ export interface ProviderDefinition {
3
+ id: ProviderType;
4
+ name: string;
5
+ description: string;
6
+ defaultBaseUrl: string;
7
+ defaultModels: string[];
8
+ envKeyNames: string[];
9
+ }
10
+ export declare const PROVIDERS: Record<ProviderType, ProviderDefinition>;
11
+ /**
12
+ * Get provider definition by ID
13
+ */
14
+ export declare function getProvider(id: string): ProviderDefinition | null;
15
+ /**
16
+ * Get all provider IDs
17
+ */
18
+ export declare function getProviderIds(): ProviderType[];
19
+ /**
20
+ * Validate API key format (basic validation)
21
+ */
22
+ export declare function validateApiKey(provider: ProviderType, apiKey: string): {
23
+ valid: boolean;
24
+ error?: string;
25
+ };
26
+ /**
27
+ * Validate base URL format
28
+ */
29
+ export declare function validateBaseUrl(baseUrl: string): {
30
+ valid: boolean;
31
+ error?: string;
32
+ };
33
+ /**
34
+ * Get API key from environment variables
35
+ */
36
+ export declare function getApiKeyFromEnv(provider: ProviderType): string | null;
37
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAiB9D,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BzG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcnF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAWtE"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROVIDERS = void 0;
4
+ exports.getProvider = getProvider;
5
+ exports.getProviderIds = getProviderIds;
6
+ exports.validateApiKey = validateApiKey;
7
+ exports.validateBaseUrl = validateBaseUrl;
8
+ exports.getApiKeyFromEnv = getApiKeyFromEnv;
9
+ exports.PROVIDERS = {
10
+ zhipu: {
11
+ id: 'zhipu',
12
+ name: '智谱 AI',
13
+ description: '国产大模型,稳定可靠,响应快速',
14
+ defaultBaseUrl: '',
15
+ defaultModels: ['glm-4.7', 'glm-4.7-flash'],
16
+ envKeyNames: ['ZHIPUAI_API_KEY'],
17
+ },
18
+ openai: {
19
+ id: 'openai',
20
+ name: 'OpenAI',
21
+ description: '国际通用,支持 GPT-4o、GPT-4o-mini 等模型',
22
+ defaultBaseUrl: 'https://api.openai.com/v1',
23
+ defaultModels: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'gpt-3.5-turbo'],
24
+ envKeyNames: ['OPENAI_API_KEY'],
25
+ },
26
+ };
27
+ /**
28
+ * Get provider definition by ID
29
+ */
30
+ function getProvider(id) {
31
+ return exports.PROVIDERS[id] ?? null;
32
+ }
33
+ /**
34
+ * Get all provider IDs
35
+ */
36
+ function getProviderIds() {
37
+ return Object.keys(exports.PROVIDERS);
38
+ }
39
+ /**
40
+ * Validate API key format (basic validation)
41
+ */
42
+ function validateApiKey(provider, apiKey) {
43
+ if (!apiKey || apiKey.trim().length === 0) {
44
+ return { valid: false, error: 'API Key 不能为空' };
45
+ }
46
+ // Provider-specific validation
47
+ switch (provider) {
48
+ case 'zhipu':
49
+ // 智谱 API key 通常以特定格式开头
50
+ if (apiKey.length < 10) {
51
+ return { valid: false, error: '智谱 API Key 格式不正确(太短)' };
52
+ }
53
+ break;
54
+ case 'openai':
55
+ // OpenAI API key 通常以 sk- 开头
56
+ if (!apiKey.startsWith('sk-')) {
57
+ return { valid: false, error: 'OpenAI API Key 通常以 sk- 开头' };
58
+ }
59
+ if (apiKey.length < 20) {
60
+ return { valid: false, error: 'OpenAI API Key 格式不正确(太短)' };
61
+ }
62
+ break;
63
+ }
64
+ return { valid: true };
65
+ }
66
+ /**
67
+ * Validate base URL format
68
+ */
69
+ function validateBaseUrl(baseUrl) {
70
+ if (!baseUrl || baseUrl.trim().length === 0) {
71
+ return { valid: true }; // Empty is OK (will use default)
72
+ }
73
+ try {
74
+ const url = new URL(baseUrl);
75
+ if (url.protocol !== 'https:' && url.protocol !== 'http:') {
76
+ return { valid: false, error: 'Base URL 必须以 http:// 或 https:// 开头' };
77
+ }
78
+ return { valid: true };
79
+ }
80
+ catch {
81
+ return { valid: false, error: 'Base URL 格式不正确' };
82
+ }
83
+ }
84
+ /**
85
+ * Get API key from environment variables
86
+ */
87
+ function getApiKeyFromEnv(provider) {
88
+ const providerDef = exports.PROVIDERS[provider];
89
+ for (const envKey of providerDef.envKeyNames) {
90
+ const value = process.env[envKey];
91
+ if (value) {
92
+ return value;
93
+ }
94
+ }
95
+ return null;
96
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface SessionData {
2
+ id: string;
3
+ name: string;
4
+ description?: string;
5
+ createdAt: string;
6
+ updatedAt: string;
7
+ messages: Array<{
8
+ role: string;
9
+ content: string;
10
+ }>;
11
+ metadata?: {
12
+ role?: string;
13
+ severity?: string;
14
+ provider?: string;
15
+ model?: string;
16
+ };
17
+ }
18
+ export declare class SessionStorage {
19
+ private sessionsDir;
20
+ constructor();
21
+ private ensureDirectory;
22
+ listSessions(): SessionData[];
23
+ loadSession(sessionId: string): SessionData | null;
24
+ saveSession(sessionData: SessionData): SessionData;
25
+ deleteSession(sessionId: string): boolean;
26
+ private generateId;
27
+ getSessionsDir(): string;
28
+ }
29
+ //# sourceMappingURL=session-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../src/config/session-storage.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;;IAO5B,OAAO,CAAC,eAAe;IAMvB,YAAY,IAAI,WAAW,EAAE;IAc7B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWlD,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW;IAiBlD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAWzC,OAAO,CAAC,UAAU;IAIlB,cAAc,IAAI,MAAM;CAGzB"}