@oflow-ai/oflow-cli 0.1.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/dist/index.js ADDED
@@ -0,0 +1,320 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const cli_1 = require("./cli");
42
+ const core_1 = require("@oflow-ai/core");
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ // Read package.json for version
47
+ const packageJsonPath = path.join(__dirname, '..', 'package.json');
48
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
49
+ // Simple update check (without update-notifier due to type issues)
50
+ try {
51
+ const updateNotifier = require('update-notifier');
52
+ const notifier = updateNotifier({ pkg: packageJson });
53
+ if (notifier.notify) {
54
+ notifier.notify();
55
+ }
56
+ }
57
+ catch {
58
+ // Ignore update check errors
59
+ }
60
+ const program = new commander_1.Command();
61
+ program
62
+ .name('oflow')
63
+ .description('AI-powered CLI assistant for terminal')
64
+ .version(packageJson.version)
65
+ .option('-m, --model <model>', 'Specify the AI model to use')
66
+ .option('-d, --directory <dir>', 'Working directory')
67
+ .option('--yolo', 'Run in yolo mode (auto-approve all operations)')
68
+ .option('--thinking', 'Show AI thinking/reasoning process')
69
+ .option('--no-thinking', 'Hide AI thinking/reasoning process')
70
+ .argument('[prompt]', 'Prompt to send to AI (starts interactive mode if not provided)')
71
+ .action(async (prompt, options) => {
72
+ const configManager = (0, core_1.getConfigManager)();
73
+ // Check authentication
74
+ if (!configManager.isAuthenticated()) {
75
+ console.log(chalk_1.default.yellow('Welcome to oflow! Let\'s get you set up.'));
76
+ console.log('');
77
+ await runAuthFlow();
78
+ return;
79
+ }
80
+ // Set model if specified
81
+ if (options.model) {
82
+ configManager.setDefaultModel(options.model);
83
+ }
84
+ // Set thinking mode if specified
85
+ if (options.thinking === true) {
86
+ configManager.setShowThinking(true);
87
+ }
88
+ else if (options.thinking === false) {
89
+ configManager.setShowThinking(false);
90
+ }
91
+ // Set working directory
92
+ const workingDir = options.directory || process.cwd();
93
+ process.chdir(workingDir);
94
+ if (prompt) {
95
+ // Single command mode
96
+ await (0, cli_1.runSingleCommand)(prompt, {
97
+ model: options.model,
98
+ yolo: options.yolo
99
+ });
100
+ }
101
+ else {
102
+ // Interactive mode
103
+ await (0, cli_1.startInteractiveMode)({
104
+ model: options.model,
105
+ yolo: options.yolo
106
+ });
107
+ }
108
+ });
109
+ // Auth command
110
+ program
111
+ .command('auth')
112
+ .description('Configure authentication')
113
+ .option('--provider <provider>', 'Provider (openai, deepseek, qwen, etc.)')
114
+ .action(async (options) => {
115
+ await runAuthFlow(options.provider);
116
+ });
117
+ // Config command
118
+ program
119
+ .command('config')
120
+ .description('View or edit configuration')
121
+ .option('--list', 'List current configuration')
122
+ .option('--set <key=value>', 'Set a configuration value')
123
+ .option('--thinking', 'Toggle thinking process display')
124
+ .action(async (options) => {
125
+ const configManager = (0, core_1.getConfigManager)();
126
+ if (options.list) {
127
+ console.log(chalk_1.default.bold('Current Configuration:'));
128
+ console.log(JSON.stringify(configManager.getAll(), null, 2));
129
+ console.log('');
130
+ console.log(chalk_1.default.gray(`Config file: ${configManager.getConfigPath()}`));
131
+ }
132
+ else if (options.thinking) {
133
+ const newValue = configManager.toggleShowThinking();
134
+ console.log(chalk_1.default.green(`✓ Thinking process display: ${newValue ? 'ON' : 'OFF'}`));
135
+ }
136
+ else if (options.set) {
137
+ const [key, value] = options.set.split('=');
138
+ configManager.set(key, value);
139
+ console.log(chalk_1.default.green(`Set ${key} = ${value}`));
140
+ }
141
+ else {
142
+ console.log(`Config file: ${configManager.getConfigPath()}`);
143
+ console.log(`Thinking display: ${configManager.getShowThinking() ? 'ON' : 'OFF'}`);
144
+ }
145
+ });
146
+ // Models command
147
+ program
148
+ .command('models')
149
+ .description('List available AI models')
150
+ .action(async () => {
151
+ await listModels();
152
+ });
153
+ async function runAuthFlow(provider) {
154
+ const inquirer = require('inquirer');
155
+ const configManager = (0, core_1.getConfigManager)();
156
+ if (!provider) {
157
+ const answers = await inquirer.prompt([
158
+ {
159
+ type: 'list',
160
+ name: 'provider',
161
+ message: 'Select AI provider:',
162
+ choices: [
163
+ { name: '🌐 OpenAI (Official API)', value: 'openai' },
164
+ { name: '🔧 Custom (OpenAI-compatible)', value: 'custom' },
165
+ { name: '────────── 国内模型 ──────────', value: 'separator', disabled: true },
166
+ { name: '🇨🇳 DeepSeek (深度求索) - 推荐推理模型', value: 'deepseek' },
167
+ { name: '🇨🇳 Qwen (通义千问)', value: 'qwen' },
168
+ { name: '🇨🇳 GLM (智谱)', value: 'zhipu' },
169
+ { name: '🇨🇳 Baichuan (百川)', value: 'baichuan' },
170
+ { name: '🇨🇳 Yi (零一万物)', value: 'yi' },
171
+ { name: '🇨🇳 Moonshot (月之暗面/Kimi)', value: 'moonshot' },
172
+ { name: '🇨🇳 SiliconFlow (硅基流动)', value: 'siliconflow' }
173
+ ]
174
+ }
175
+ ]);
176
+ provider = answers.provider;
177
+ }
178
+ // OpenAI
179
+ if (provider === 'openai') {
180
+ const answers = await inquirer.prompt([
181
+ {
182
+ type: 'password',
183
+ name: 'apiKey',
184
+ message: 'Enter your OpenAI API key:',
185
+ mask: '*'
186
+ },
187
+ {
188
+ type: 'list',
189
+ name: 'model',
190
+ message: 'Select default model:',
191
+ choices: [
192
+ 'gpt-4o',
193
+ 'gpt-4o-mini',
194
+ 'gpt-4-turbo',
195
+ 'gpt-3.5-turbo',
196
+ 'o1-preview',
197
+ 'o1-mini'
198
+ ],
199
+ default: 'gpt-4o'
200
+ }
201
+ ]);
202
+ configManager.setAuth({
203
+ provider: 'openai',
204
+ apiKey: answers.apiKey,
205
+ model: answers.model
206
+ });
207
+ configManager.setDefaultModel(answers.model);
208
+ console.log(chalk_1.default.green('\n✓ Authentication configured successfully!'));
209
+ }
210
+ // Custom
211
+ else if (provider === 'custom') {
212
+ const answers = await inquirer.prompt([
213
+ {
214
+ type: 'input',
215
+ name: 'baseUrl',
216
+ message: 'Enter API base URL:',
217
+ default: 'https://api.openai.com/v1'
218
+ },
219
+ {
220
+ type: 'password',
221
+ name: 'apiKey',
222
+ message: 'Enter your API key:',
223
+ mask: '*'
224
+ },
225
+ {
226
+ type: 'input',
227
+ name: 'model',
228
+ message: 'Enter default model name:',
229
+ default: 'gpt-4o'
230
+ }
231
+ ]);
232
+ configManager.setAuth({
233
+ provider: 'custom',
234
+ apiKey: answers.apiKey,
235
+ baseUrl: answers.baseUrl,
236
+ model: answers.model
237
+ });
238
+ configManager.setDefaultModel(answers.model);
239
+ console.log(chalk_1.default.green('\n✓ Authentication configured successfully!'));
240
+ }
241
+ // 国内模型
242
+ else if (core_1.CHINESE_MODELS[provider]) {
243
+ const modelConfig = core_1.CHINESE_MODELS[provider];
244
+ console.log(chalk_1.default.cyan(`\n配置 ${modelConfig.name}`));
245
+ const answers = await inquirer.prompt([
246
+ {
247
+ type: 'password',
248
+ name: 'apiKey',
249
+ message: `Enter your ${modelConfig.name} API key:`,
250
+ mask: '*'
251
+ },
252
+ {
253
+ type: 'list',
254
+ name: 'model',
255
+ message: 'Select default model:',
256
+ choices: modelConfig.models,
257
+ default: modelConfig.models[0]
258
+ }
259
+ ]);
260
+ configManager.setAuth({
261
+ provider: provider,
262
+ apiKey: answers.apiKey,
263
+ baseUrl: modelConfig.baseUrl,
264
+ model: answers.model
265
+ });
266
+ configManager.setDefaultModel(answers.model);
267
+ console.log(chalk_1.default.green(`\n✓ ${modelConfig.name} 配置成功!`));
268
+ // DeepSeek特殊提示
269
+ if (provider === 'deepseek' && answers.model === 'deepseek-reasoner') {
270
+ console.log(chalk_1.default.yellow('💡 提示: deepseek-reasoner 支持显示思考过程,使用 --thinking 开启'));
271
+ }
272
+ }
273
+ }
274
+ async function listModels() {
275
+ const configManager = (0, core_1.getConfigManager)();
276
+ const auth = configManager.getAuth();
277
+ if (!auth) {
278
+ console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
279
+ return;
280
+ }
281
+ console.log(chalk_1.default.bold('\n═══════════════════════════════════════════════════════════'));
282
+ console.log(chalk_1.default.bold(' Available Models '));
283
+ console.log(chalk_1.default.bold('═══════════════════════════════════════════════════════════\n'));
284
+ // OpenAI Models
285
+ console.log(chalk_1.default.cyan('🌐 OpenAI Models:'));
286
+ const openaiModels = [
287
+ { id: 'gpt-4o', desc: 'Most capable GPT-4 model' },
288
+ { id: 'gpt-4o-mini', desc: 'Fast and affordable' },
289
+ { id: 'gpt-4-turbo', desc: 'Previous GPT-4 version' },
290
+ { id: 'gpt-3.5-turbo', desc: 'Fast and cheap' },
291
+ { id: 'o1-preview', desc: 'Advanced reasoning' },
292
+ { id: 'o1-mini', desc: 'Efficient reasoning' }
293
+ ];
294
+ openaiModels.forEach(m => {
295
+ const current = m.id === configManager.getDefaultModel() ? chalk_1.default.green('* ') : ' ';
296
+ console.log(`${current}${m.id} - ${chalk_1.default.gray(m.desc)}`);
297
+ });
298
+ // 国内模型
299
+ console.log('');
300
+ console.log(chalk_1.default.cyan('🇨🇳 国内开源模型:\n'));
301
+ for (const [key, config] of Object.entries(core_1.CHINESE_MODELS)) {
302
+ console.log(chalk_1.default.bold(` ${config.name}`));
303
+ console.log(chalk_1.default.gray(` API: ${config.baseUrl}`));
304
+ for (const m of config.models) {
305
+ const modelId = typeof m === 'string' ? m : m.id;
306
+ const modelName = typeof m === 'string' ? m : m.name;
307
+ const modelDesc = typeof m === 'string' ? '' : m.desc;
308
+ const current = modelId === configManager.getDefaultModel() ? chalk_1.default.green('* ') : ' ';
309
+ console.log(`${current}${modelId} - ${chalk_1.default.gray(modelName)}${modelDesc ? chalk_1.default.gray(` (${modelDesc})`) : ''}`);
310
+ }
311
+ console.log('');
312
+ }
313
+ // 显示当前配置
314
+ console.log(chalk_1.default.bold('───────────────────────────────────────────────────────────'));
315
+ console.log(`Current model: ${chalk_1.default.green(configManager.getDefaultModel())}`);
316
+ console.log(`Thinking display: ${configManager.getShowThinking() ? chalk_1.default.green('ON') : chalk_1.default.gray('OFF')}`);
317
+ console.log('');
318
+ }
319
+ program.parse();
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEseUNBQW9DO0FBQ3BDLCtCQUErRDtBQUMvRCx5Q0FBa0U7QUFDbEUsa0RBQTBCO0FBQzFCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsZ0NBQWdDO0FBQ2hDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFMUUsbUVBQW1FO0FBQ25FLElBQUksQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUFDLE1BQU0sQ0FBQztJQUNQLDZCQUE2QjtBQUMvQixDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDYixXQUFXLENBQUMsdUNBQXVDLENBQUM7S0FDcEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7S0FDNUIsTUFBTSxDQUFDLHFCQUFxQixFQUFFLDZCQUE2QixDQUFDO0tBQzVELE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxtQkFBbUIsQ0FBQztLQUNwRCxNQUFNLENBQUMs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Q0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsT0FBTyxNQUFNLGVBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsU0FBUztJQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLENBQUM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsZUFBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgc3RhcnRJbnRlcmFjdGl2ZU1vZGUsIHJ1blNpbmdsZUNvbW1hbmQgfSBmcm9tICcuL2NsaSc7XG5pbXBvcnQgeyBnZXRDb25maWdNYW5hZ2VyLCBDSElORVNFX01PREVMUyB9IGZyb20gJ0BvZmxvdy1haS9jb3JlJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vLyBSZWFkIHBhY2thZ2UuanNvbiBmb3IgdmVyc2lvblxuY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3BhY2thZ2UuanNvbicpO1xuY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcblxuLy8gU2ltcGxlIHVwZGF0ZSBjaGVjayAod2l0aG91dCB1cGRhdGUtbm90aWZpZXIgZHVlIHRvIHR5cGUgaXNzdWVzKVxudHJ5IHtcbiAgY29uc3QgdXBkYXRlTm90aWZpZXIgPSByZXF1aXJlKCd1cGRhdGUtbm90aWZpZXInKTtcbiAgY29uc3Qgbm90aWZpZXIgPSB1cGRhdGVOb3RpZmllcih7IHBrZzogcGFja2FnZUpzb24gfSk7XG4gIGlmIChub3RpZmllci5ub3RpZnkpIHtcbiAgICBub3RpZmllci5ub3RpZnkoKTtcbiAgfVxufSBjYXRjaCB7XG4gIC8vIElnbm9yZSB1cGRhdGUgY2hlY2sgZXJyb3JzXG59XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdvZmxvdycpXG4gIC5kZXNjcmlwdGlvbignQUktcG93ZXJlZCBDTEkgYXNzaXN0YW50IGZvciB0ZXJtaW5hbCcpXG4gIC52ZXJzaW9uKHBhY2thZ2VKc29uLnZlcnNpb24pXG4gIC5vcHRpb24oJy1tLCAtLW1vZGVsIDxtb2RlbD4nLCAnU3BlY2lmeSB0aGUgQUkgbW9kZWwgdG8gdXNlJylcbiAgLm9wdGlvbignLWQsIC0tZGlyZWN0b3J5IDxkaXI+JywgJ1dvcmtpbmcgZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS15b2xvJywgJ1J1biBpbiB5b2xvIG1vZGUgKGF1dG8tYXBwcm92ZSBhbGwgb3BlcmF0aW9ucyknKVxuICAub3B0aW9uKCctLXRoaW5raW5nJywgJ1Nob3cgQUkgdGhpbmtpbmcvcmVhc29uaW5nIHByb2Nlc3MnKVxuICAub3B0aW9uKCctLW5vLXRoaW5raW5nJywgJ0hpZGUgQUkgdGhpbmtpbmcvcmVhc29uaW5nIHByb2Nlc3MnKVxuICAuYXJndW1lbnQoJ1twcm9tcHRdJywgJ1Byb21wdCB0byBzZW5kIHRvIEFJIChzdGFydHMgaW50ZXJhY3RpdmUgbW9kZSBpZiBub3QgcHJvdmlkZWQpJylcbiAgLmFjdGlvbihhc3luYyAocHJvbXB0LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICBcbiAgICAvLyBDaGVjayBhdXRoZW50aWNhdGlvblxuICAgIGlmICghY29uZmlnTWFuYWdlci5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdXZWxjb21lIHRvIG9mbG93ISBMZXRcXCdzIGdldCB5b3Ugc2V0IHVwLicpKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGF3YWl0IHJ1bkF1dGhGbG93KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IG1vZGVsIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRpb25zLm1vZGVsKSB7XG4gICAgICBjb25maWdNYW5hZ2VyLnNldERlZmF1bHRNb2RlbChvcHRpb25zLm1vZGVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhpbmtpbmcgbW9kZSBpZiBzcGVjaWZpZWRcbiAgICBpZiAob3B0aW9ucy50aGlua2luZyA9PT0gdHJ1ZSkge1xuICAgICAgY29uZmlnTWFuYWdlci5zZXRTaG93VGhpbmtpbmcodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnRoaW5raW5nID09PSBmYWxzZSkge1xuICAgICAgY29uZmlnTWFuYWdlci5zZXRTaG93VGhpbmtpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB3b3JraW5nIGRpcmVjdG9yeVxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zLmRpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIHByb2Nlc3MuY2hkaXIod29ya2luZ0Rpcik7XG5cbiAgICBpZiAocHJvbXB0KSB7XG4gICAgICAvLyBTaW5nbGUgY29tbWFuZCBtb2RlXG4gICAgICBhd2FpdCBydW5TaW5nbGVDb21tYW5kKHByb21wdCwge1xuICAgICAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAgICAgeW9sbzogb3B0aW9ucy55b2xvXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJhY3RpdmUgbW9kZVxuICAgICAgYXdhaXQgc3RhcnRJbnRlcmFjdGl2ZU1vZGUoe1xuICAgICAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAgICAgeW9sbzogb3B0aW9ucy55b2xvXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4vLyBBdXRoIGNvbW1hbmRcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2F1dGgnKVxuICAuZGVzY3JpcHRpb24oJ0NvbmZpZ3VyZSBhdXRoZW50aWNhdGlvbicpXG4gIC5vcHRpb24oJy0tcHJvdmlkZXIgPHByb3ZpZGVyPicsICdQcm92aWRlciAob3BlbmFpLCBkZWVwc2VlaywgcXdlbiwgZXRjLiknKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgYXdhaXQgcnVuQXV0aEZsb3cob3B0aW9ucy5wcm92aWRlcik7XG4gIH0pO1xuXG4vLyBDb25maWcgY29tbWFuZFxucHJvZ3JhbVxuICAuY29tbWFuZCgnY29uZmlnJylcbiAgLmRlc2NyaXB0aW9uKCdWaWV3IG9yIGVkaXQgY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy0tbGlzdCcsICdMaXN0IGN1cnJlbnQgY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy0tc2V0IDxrZXk9dmFsdWU+JywgJ1NldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWUnKVxuICAub3B0aW9uKCctLXRoaW5raW5nJywgJ1RvZ2dsZSB0aGlua2luZyBwcm9jZXNzIGRpc3BsYXknKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICBcbiAgICBpZiAob3B0aW9ucy5saXN0KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdDdXJyZW50IENvbmZpZ3VyYXRpb246JykpO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY29uZmlnTWFuYWdlci5nZXRBbGwoKSwgbnVsbCwgMikpO1xuICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgQ29uZmlnIGZpbGU6ICR7Y29uZmlnTWFuYWdlci5nZXRDb25maWdQYXRoKCl9YCkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy50aGlua2luZykge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb25maWdNYW5hZ2VyLnRvZ2dsZVNob3dUaGlua2luZygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBUaGlua2luZyBwcm9jZXNzIGRpc3BsYXk6ICR7bmV3VmFsdWUgPyAnT04nIDogJ09GRid9YCkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zZXQpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IG9wdGlvbnMuc2V0LnNwbGl0KCc9Jyk7XG4gICAgICBjb25maWdNYW5hZ2VyLnNldChrZXkgYXMgYW55LCB2YWx1ZSk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgU2V0ICR7a2V5fSA9ICR7dmFsdWV9YCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7Y29uZmlnTWFuYWdlci5nZXRDb25maWdQYXRoKCl9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVGhpbmtpbmcgZGlzcGxheTogJHtjb25maWdNYW5hZ2VyLmdldFNob3dUaGlua2luZygpID8gJ09OJyA6ICdPRkYnfWApO1xuICAgIH1cbiAgfSk7XG5cbi8vIE1vZGVscyBjb21tYW5kXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdtb2RlbHMnKVxuICAuZGVzY3JpcHRpb24oJ0xpc3QgYXZhaWxhYmxlIEFJIG1vZGVscycpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGxpc3RNb2RlbHMoKTtcbiAgfSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkF1dGhGbG93KHByb3ZpZGVyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGlucXVpcmVyID0gcmVxdWlyZSgnaW5xdWlyZXInKTtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcblxuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgY29uc3QgYW5zd2VycyA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgbmFtZTogJ3Byb3ZpZGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1NlbGVjdCBBSSBwcm92aWRlcjonLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyBuYW1lOiAn8J+MkCBPcGVuQUkgKE9mZmljaWFsIEFQSSknLCB2YWx1ZTogJ29wZW5haScgfSxcbiAgICAgICAgICB7IG5hbWU6ICfwn5SnIEN1c3RvbSAoT3BlbkFJLWNvbXBhdGlibGUpJywgdmFsdWU6ICdjdXN0b20nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIOWbveWGheaooeWeiyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAnLCB2YWx1ZTogJ3NlcGFyYXRvcicsIGRpc2FibGVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgRGVlcFNlZWsgKOa3seW6puaxgue0oikgLSDmjqjojZDmjqjnkIbmqKHlnosnLCB2YWx1ZTogJ2RlZXBzZWVrJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIFF3ZW4gKOmAmuS5ieWNg+mXriknLCB2YWx1ZTogJ3F3ZW4nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgR0xNICjmmbrosLEpJywgdmFsdWU6ICd6aGlwdScgfSxcbiAgICAgICAgICB7IG5hbWU6ICfwn4eo8J+HsyBCYWljaHVhbiAo55m+5bedKScsIHZhbHVlOiAnYmFpY2h1YW4nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgWWkgKOmbtuS4gOS4h+eJqSknLCB2YWx1ZTogJ3lpJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIE1vb25zaG90ICjmnIjkuYvmmpfpnaIvS2ltaSknLCB2YWx1ZTogJ21vb25zaG90JyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIFNpbGljb25GbG93ICjnoYXln7rmtYHliqgpJywgdmFsdWU6ICdzaWxpY29uZmxvdycgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSk7XG4gICAgcHJvdmlkZXIgPSBhbnN3ZXJzLnByb3ZpZGVyO1xuICB9XG5cbiAgLy8gT3BlbkFJXG4gIGlmIChwcm92aWRlciA9PT0gJ29wZW5haScpIHtcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6ICdFbnRlciB5b3VyIE9wZW5BSSBBUEkga2V5OicsXG4gICAgICAgIG1hc2s6ICcqJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICBuYW1lOiAnbW9kZWwnLFxuICAgICAgICBtZXNzYWdlOiAnU2VsZWN0IGRlZmF1bHQgbW9kZWw6JyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICdncHQtNG8nLFxuICAgICAgICAgICdncHQtNG8tbWluaScsXG4gICAgICAgICAgJ2dwdC00LXR1cmJvJyxcbiAgICAgICAgICAnZ3B0LTMuNS10dXJibycsXG4gICAgICAgICAgJ28xLXByZXZpZXcnLFxuICAgICAgICAgICdvMS1taW5pJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0OiAnZ3B0LTRvJ1xuICAgICAgfVxuICAgIF0pO1xuXG4gICAgY29uZmlnTWFuYWdlci5zZXRBdXRoKHtcbiAgICAgIHByb3ZpZGVyOiAnb3BlbmFpJyxcbiAgICAgIGFwaUtleTogYW5zd2Vycy5hcGlLZXksXG4gICAgICBtb2RlbDogYW5zd2Vycy5tb2RlbFxuICAgIH0pO1xuICAgIGNvbmZpZ01hbmFnZXIuc2V0RGVmYXVsdE1vZGVsKGFuc3dlcnMubW9kZWwpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbuKckyBBdXRoZW50aWNhdGlvbiBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseSEnKSk7XG4gIH0gXG4gIC8vIEN1c3RvbVxuICBlbHNlIGlmIChwcm92aWRlciA9PT0gJ2N1c3RvbScpIHtcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2Jhc2VVcmwnLFxuICAgICAgICBtZXNzYWdlOiAnRW50ZXIgQVBJIGJhc2UgVVJMOicsXG4gICAgICAgIGRlZmF1bHQ6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6ICdFbnRlciB5b3VyIEFQSSBrZXk6JyxcbiAgICAgICAgbWFzazogJyonXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnbW9kZWwnLFxuICAgICAgICBtZXNzYWdlOiAnRW50ZXIgZGVmYXVsdCBtb2RlbCBuYW1lOicsXG4gICAgICAgIGRlZmF1bHQ6ICdncHQtNG8nXG4gICAgICB9XG4gICAgXSk7XG5cbiAgICBjb25maWdNYW5hZ2VyLnNldEF1dGgoe1xuICAgICAgcHJvdmlkZXI6ICdjdXN0b20nLFxuICAgICAgYXBpS2V5OiBhbnN3ZXJzLmFwaUtleSxcbiAgICAgIGJhc2VVcmw6IGFuc3dlcnMuYmFzZVVybCxcbiAgICAgIG1vZGVsOiBhbnN3ZXJzLm1vZGVsXG4gICAgfSk7XG4gICAgY29uZmlnTWFuYWdlci5zZXREZWZhdWx0TW9kZWwoYW5zd2Vycy5tb2RlbCk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbignXFxu4pyTIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5IScpKTtcbiAgfVxuICAvLyDlm73lhoXmqKHlnotcbiAgZWxzZSBpZiAoQ0hJTkVTRV9NT0RFTFNbcHJvdmlkZXIgYXMga2V5b2YgdHlwZW9mIENISU5FU0VfTU9ERUxTXSkge1xuICAgIGNvbnN0IG1vZGVsQ29uZmlnID0gQ0hJTkVTRV9NT0RFTFNbcHJvdmlkZXIgYXMga2V5b2YgdHlwZW9mIENISU5FU0VfTU9ERUxTXTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG7phY3nva4gJHttb2RlbENvbmZpZy5uYW1lfWApKTtcbiAgICBcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6IGBFbnRlciB5b3VyICR7bW9kZWxDb25maWcubmFtZX0gQVBJIGtleTpgLFxuICAgICAgICBtYXNrOiAnKidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgbmFtZTogJ21vZGVsJyxcbiAgICAgICAgbWVzc2FnZTogJ1NlbGVjdCBkZWZhdWx0IG1vZGVsOicsXG4gICAgICAgIGNob2ljZXM6IG1vZGVsQ29uZmlnLm1vZGVscyxcbiAgICAgICAgZGVmYXVsdDogbW9kZWxDb25maWcubW9kZWxzWzBdXG4gICAgICB9XG4gICAgXSk7XG5cbiAgICBjb25maWdNYW5hZ2VyLnNldEF1dGgoe1xuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyIGFzIGFueSxcbiAgICAgIGFwaUtleTogYW5zd2Vycy5hcGlLZXksXG4gICAgICBiYXNlVXJsOiBtb2RlbENvbmZpZy5iYXNlVXJsLFxuICAgICAgbW9kZWw6IGFuc3dlcnMubW9kZWxcbiAgICB9KTtcbiAgICBjb25maWdNYW5hZ2VyLnNldERlZmF1bHRNb2RlbChhbnN3ZXJzLm1vZGVsKTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG7inJMgJHttb2RlbENvbmZpZy5uYW1lfSDphY3nva7miJDlip8hYCkpO1xuICAgIFxuICAgIC8vIERlZXBTZWVr54m55q6K5o+Q56S6XG4gICAgaWYgKHByb3ZpZGVyID09PSAnZGVlcHNlZWsnICYmIGFuc3dlcnMubW9kZWwgPT09ICdkZWVwc2Vlay1yZWFzb25lcicpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygn8J+SoSDmj5DnpLo6IGRlZXBzZWVrLXJlYXNvbmVyIOaUr+aMgeaYvuekuuaAneiAg+i/h+eoi++8jOS9v+eUqCAtLXRoaW5raW5nIOW8gOWQrycpKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdE1vZGVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUgTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcXG4nKSk7XG5cbiAgLy8gT3BlbkFJIE1vZGVsc1xuICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCfwn4yQIE9wZW5BSSBNb2RlbHM6JykpO1xuICBjb25zdCBvcGVuYWlNb2RlbHMgPSBbXG4gICAgeyBpZDogJ2dwdC00bycsIGRlc2M6ICdNb3N0IGNhcGFibGUgR1BULTQgbW9kZWwnIH0sXG4gICAgeyBpZDogJ2dwdC00by1taW5pJywgZGVzYzogJ0Zhc3QgYW5kIGFmZm9yZGFibGUnIH0sXG4gICAgeyBpZDogJ2dwdC00LXR1cmJvJywgZGVzYzogJ1ByZXZpb3VzIEdQVC00IHZlcnNpb24nIH0sXG4gICAgeyBpZDogJ2dwdC0zLjUtdHVyYm8nLCBkZXNjOiAnRmFzdCBhbmQgY2hlYXAnIH0sXG4gICAgeyBpZDogJ28xLXByZXZpZXcnLCBkZXNjOiAnQWR2YW5jZWQgcmVhc29uaW5nJyB9LFxuICAgIHsgaWQ6ICdvMS1taW5pJywgZGVzYzogJ0VmZmljaWVudCByZWFzb25pbmcnIH1cbiAgXTtcbiAgb3BlbmFpTW9kZWxzLmZvckVhY2gobSA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IG0uaWQgPT09IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkgPyBjaGFsay5ncmVlbignKiAnKSA6ICcgICc7XG4gICAgY29uc29sZS5sb2coYCR7Y3VycmVudH0ke20uaWR9IC0gJHtjaGFsay5ncmF5KG0uZGVzYyl9YCk7XG4gIH0pO1xuXG4gIC8vIOWbveWGheaooeWei1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ/Cfh6jwn4ezIOWbveWGheW8gOa6kOaooeWeizpcXG4nKSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKENISU5FU0VfTU9ERUxTKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYCAgJHtjb25maWcubmFtZX1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAgIEFQSTogJHtjb25maWcuYmFzZVVybH1gKSk7XG4gICAgZm9yIChjb25zdCBtIG9mIGNvbmZpZy5tb2RlbHMpIHtcbiAgICAgIGNvbnN0IG1vZGVsSWQgPSB0eXBlb2YgbSA9PT0gJ3N0cmluZycgPyBtIDogbS5pZDtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHR5cGVvZiBtID09PSAnc3RyaW5nJyA/IG0gOiBtLm5hbWU7XG4gICAgICBjb25zdCBtb2RlbERlc2MgPSB0eXBlb2YgbSA9PT0gJ3N0cmluZycgPyAnJyA6IChtIGFzIGFueSkuZGVzYztcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBtb2RlbElkID09PSBjb25maWdNYW5hZ2VyLmdldERlZmF1bHRNb2RlbCgpID8gY2hhbGsuZ3JlZW4oJyogJykgOiAnICAgICc7XG4gICAgICBjb25zb2xlLmxvZyhgJHtjdXJyZW50fSR7bW9kZWxJZH0gLSAke2NoYWxrLmdyYXkobW9kZWxOYW1lKX0ke21vZGVsRGVzYyA/IGNoYWxrLmdyYXkoYCAoJHttb2RlbERlc2N9KWApIDogJyd9YCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuXG4gIC8vIOaYvuekuuW9k+WJjemFjee9rlxuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCfilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAnKSk7XG4gIGNvbnNvbGUubG9nKGBDdXJyZW50IG1vZGVsOiAke2NoYWxrLmdyZWVuKGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkpfWApO1xuICBjb25zb2xlLmxvZyhgVGhpbmtpbmcgZGlzcGxheTogJHtjb25maWdNYW5hZ2VyLmdldFNob3dUaGlua2luZygpID8gY2hhbGsuZ3JlZW4oJ09OJykgOiBjaGFsay5ncmF5KCdPRkYnKX1gKTtcbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5wcm9ncmFtLnBhcnNlKCk7Il19
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Post-install script for @oflow-ai/oflow-cli
4
+ * Runs after npm install to display welcome message and instructions
5
+ */
6
+ declare const chalk: any;
7
+ declare const fs: any;
8
+ declare const path: any;
9
+ declare const nodeVersion: string;
10
+ declare const majorVersion: number;
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Post-install script for @oflow-ai/oflow-cli
5
+ * Runs after npm install to display welcome message and instructions
6
+ */
7
+ const chalk = require('chalk');
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ // Check if running in CI or npm install --ignore-scripts
11
+ if (process.env.CI || process.env.npm_config_ignore_scripts) {
12
+ process.exit(0);
13
+ }
14
+ // Display welcome message
15
+ console.log('');
16
+ console.log(chalk.bold.blue('╔════════════════════════════════════════════════════════════╗'));
17
+ console.log(chalk.bold.blue('║ Welcome to oFlow CLI ║'));
18
+ console.log(chalk.bold.blue('╚════════════════════════════════════════════════════════════╝'));
19
+ console.log('');
20
+ console.log(chalk.green('✓ oFlow CLI installed successfully!'));
21
+ console.log('');
22
+ console.log(chalk.bold('Quick Start:'));
23
+ console.log('');
24
+ console.log(chalk.cyan(' 1. Run the CLI:'));
25
+ console.log(chalk.white(' oflow'));
26
+ console.log('');
27
+ console.log(chalk.cyan(' 2. Configure authentication:'));
28
+ console.log(chalk.white(' oflow auth'));
29
+ console.log('');
30
+ console.log(chalk.cyan(' 3. Available AI Providers:'));
31
+ console.log(chalk.gray(' • OpenAI (GPT-4o, GPT-4-turbo, etc.)'));
32
+ console.log(chalk.gray(' • DeepSeek (深度求索) - Recommended'));
33
+ console.log(chalk.gray(' • Qwen (通义千问)'));
34
+ console.log(chalk.gray(' • GLM (智谱)'));
35
+ console.log(chalk.gray(' • Baichuan (百川)'));
36
+ console.log(chalk.gray(' • Yi (零一万物)'));
37
+ console.log(chalk.gray(' • Moonshot (月之暗面/Kimi)'));
38
+ console.log(chalk.gray(' • SiliconFlow (硅基流动)'));
39
+ console.log('');
40
+ console.log(chalk.bold('Options:'));
41
+ console.log(chalk.gray(' oflow --help Show help'));
42
+ console.log(chalk.gray(' oflow --thinking Show AI reasoning process'));
43
+ console.log(chalk.gray(' oflow models List available models'));
44
+ console.log(chalk.gray(' oflow config View configuration'));
45
+ console.log('');
46
+ console.log(chalk.bold('Documentation:'));
47
+ console.log(chalk.blue(' https://github.com/oflow-ai/oflow-cli'));
48
+ console.log('');
49
+ // Check Node.js version
50
+ const nodeVersion = process.version;
51
+ const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
52
+ if (majorVersion < 18) {
53
+ console.log(chalk.yellow('⚠ Warning: Node.js 18 or higher is recommended.'));
54
+ console.log(chalk.yellow(` Current version: ${nodeVersion}`));
55
+ console.log('');
56
+ }
57
+ process.exit(0);
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGluc3RhbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcG9zdGluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7O0dBR0c7QUFFSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3Qix5REFBeUQ7QUFDekQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsMEJBQTBCO0FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxD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WSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQixXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyoqXG4gKiBQb3N0LWluc3RhbGwgc2NyaXB0IGZvciBAb2Zsb3ctYWkvb2Zsb3ctY2xpXG4gKiBSdW5zIGFmdGVyIG5wbSBpbnN0YWxsIHRvIGRpc3BsYXkgd2VsY29tZSBtZXNzYWdlIGFuZCBpbnN0cnVjdGlvbnNcbiAqL1xuXG5jb25zdCBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vLyBDaGVjayBpZiBydW5uaW5nIGluIENJIG9yIG5wbSBpbnN0YWxsIC0taWdub3JlLXNjcmlwdHNcbmlmIChwcm9jZXNzLmVudi5DSSB8fCBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2lnbm9yZV9zY3JpcHRzKSB7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLy8gRGlzcGxheSB3ZWxjb21lIG1lc3NhZ2VcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQuYmx1ZSgn4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJykpO1xuY29uc29sZS5sb2coY2hhbGsuYm9sZC5ibHVlKCfilZEgICAgICAgICAgICAgICAgICAgIFdlbGNvbWUgdG8gb0Zsb3cgQ0xJICAgICAgICAgICAgICAgICAgICDilZEnKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ib2xkLmJsdWUoJ+KVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnScpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgb0Zsb3cgQ0xJIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkhJykpO1xuY29uc29sZS5sb2coJycpO1xuY29uc29sZS5sb2coY2hhbGsuYm9sZCgnUXVpY2sgU3RhcnQ6JykpO1xuY29uc29sZS5sb2coJycpO1xuY29uc29sZS5sb2coY2hhbGsuY3lhbignICAxLiBSdW4gdGhlIENMSTonKSk7XG5jb25zb2xlLmxvZyhjaGFsay53aGl0ZSgnICAgICBvZmxvdycpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgMi4gQ29uZmlndXJlIGF1dGhlbnRpY2F0aW9uOicpKTtcbmNvbnNvbGUubG9nKGNoYWxrLndoaXRlKCcgICAgIG9mbG93IGF1dGgnKSk7XG5jb25zb2xlLmxvZygnJyk7XG5jb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIDMuIEF2YWlsYWJsZSBBSSBQcm92aWRlcnM6JykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgT3BlbkFJIChHUFQtNG8sIEdQVC00LXR1cmJvLCBldGMuKScpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgICAg4oCiIERlZXBTZWVrICjmt7HluqbmsYLntKIpIC0gUmVjb21tZW5kZWQnKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBRd2VuICjpgJrkuYnljYPpl64pJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgR0xNICjmmbrosLEpJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgQmFpY2h1YW4gKOeZvuW3nSknKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBZaSAo6Zu25LiA5LiH54mpKScpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgICAg4oCiIE1vb25zaG90ICjmnIjkuYvmmpfpnaIvS2ltaSknKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBTaWxpY29uRmxvdyAo56GF5Z+65rWB5YqoKScpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbnM6JykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBvZmxvdyAtLWhlbHAgICAgICAgICAgU2hvdyBoZWxwJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBvZmxvdyAtLXRoaW5raW5nICAgICAgU2hvdyBBSSByZWFzb25pbmcgcHJvY2VzcycpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgb2Zsb3cgbW9kZWxzICAgICAgICAgIExpc3QgYXZhaWxhYmxlIG1vZGVscycpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgb2Zsb3cgY29uZmlnICAgICAgICAgIFZpZXcgY29uZmlndXJhdGlvbicpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0RvY3VtZW50YXRpb246JykpO1xuY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnICBodHRwczovL2dpdGh1Yi5jb20vb2Zsb3ctYWkvb2Zsb3ctY2xpJykpO1xuY29uc29sZS5sb2coJycpO1xuXG4vLyBDaGVjayBOb2RlLmpzIHZlcnNpb25cbmNvbnN0IG5vZGVWZXJzaW9uID0gcHJvY2Vzcy52ZXJzaW9uO1xuY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQobm9kZVZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5pZiAobWFqb3JWZXJzaW9uIDwgMTgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCfimqAgV2FybmluZzogTm9kZS5qcyAxOCBvciBoaWdoZXIgaXMgcmVjb21tZW5kZWQuJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgQ3VycmVudCB2ZXJzaW9uOiAke25vZGVWZXJzaW9ufWApKTtcbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5wcm9jZXNzLmV4aXQoMCk7XG4iXX0=
@@ -0,0 +1,10 @@
1
+ export declare function renderMarkdown(content: string): string;
2
+ export declare function formatCodeBlock(code: string, language?: string): string;
3
+ export declare function formatInlineCode(code: string): string;
4
+ export declare function formatLink(text: string, url: string): string;
5
+ export declare function formatBullet(text: string, level?: number): string;
6
+ export declare function formatNumberedList(items: string[]): string;
7
+ export declare function formatError(message: string): string;
8
+ export declare function formatSuccess(message: string): string;
9
+ export declare function formatWarning(message: string): string;
10
+ export declare function formatInfo(message: string): string;
@@ -0,0 +1,69 @@
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.renderMarkdown = renderMarkdown;
7
+ exports.formatCodeBlock = formatCodeBlock;
8
+ exports.formatInlineCode = formatInlineCode;
9
+ exports.formatLink = formatLink;
10
+ exports.formatBullet = formatBullet;
11
+ exports.formatNumberedList = formatNumberedList;
12
+ exports.formatError = formatError;
13
+ exports.formatSuccess = formatSuccess;
14
+ exports.formatWarning = formatWarning;
15
+ exports.formatInfo = formatInfo;
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ function renderMarkdown(content) {
18
+ // Simple markdown rendering
19
+ let result = content;
20
+ // Bold
21
+ result = result.replace(/\*\*(.*?)\*\*/g, (_, text) => chalk_1.default.bold(text));
22
+ // Italic
23
+ result = result.replace(/\*(.*?)\*/g, (_, text) => chalk_1.default.italic(text));
24
+ // Code blocks
25
+ result = result.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
26
+ return chalk_1.default.cyan(code);
27
+ });
28
+ // Inline code
29
+ result = result.replace(/`([^`]+)`/g, (_, code) => chalk_1.default.cyan(code));
30
+ // Headers
31
+ result = result.replace(/^### (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
32
+ result = result.replace(/^## (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
33
+ result = result.replace(/^# (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
34
+ // Links
35
+ result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, text, url) => `${chalk_1.default.blue.underline(text)} ${chalk_1.default.gray(`(${url})`)}`);
36
+ return result;
37
+ }
38
+ function formatCodeBlock(code, language) {
39
+ const header = language ? chalk_1.default.gray(`\`\`\`${language}\n`) : chalk_1.default.gray('```\n');
40
+ const footer = chalk_1.default.gray('\n```');
41
+ return header + chalk_1.default.cyan(code) + footer;
42
+ }
43
+ function formatInlineCode(code) {
44
+ return chalk_1.default.cyan(`\`${code}\``);
45
+ }
46
+ function formatLink(text, url) {
47
+ return `${chalk_1.default.blue.underline(text)} ${chalk_1.default.gray(`(${url})`)}`;
48
+ }
49
+ function formatBullet(text, level = 0) {
50
+ const indent = ' '.repeat(level);
51
+ const bullet = level === 0 ? '•' : '◦';
52
+ return `${indent}${chalk_1.default.cyan(bullet)} ${text}`;
53
+ }
54
+ function formatNumberedList(items) {
55
+ return items.map((item, index) => `${chalk_1.default.cyan(`${index + 1}.`)} ${item}`).join('\n');
56
+ }
57
+ function formatError(message) {
58
+ return chalk_1.default.red(`✗ Error: ${message}`);
59
+ }
60
+ function formatSuccess(message) {
61
+ return chalk_1.default.green(`✓ ${message}`);
62
+ }
63
+ function formatWarning(message) {
64
+ return chalk_1.default.yellow(`⚠ ${message}`);
65
+ }
66
+ function formatInfo(message) {
67
+ return chalk_1.default.blue(`ℹ ${message}`);
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvbWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSx3Q0E2QkM7QUFFRCwwQ0FJQztBQUVELDRDQUVDO0FBRUQsZ0NBRUM7QUFFRCxvQ0FJQztBQUVELGdEQUlDO0FBRUQsa0NBRUM7QUFFRCxzQ0FFQztBQUVELHNDQUVDO0FBRUQsZ0NBRUM7QUF6RUQsa0RBQTBCO0FBRTFCLFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLDRCQUE0QjtJQUM1QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFFckIsT0FBTztJQUNQLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXpFLFNBQVM7SUFDVCxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFdkUsY0FBYztJQUNkLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNwRSxPQUFPLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxjQUFjO0lBQ2QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXJFLFVBQVU7SUFDVixNQUFNLEdBQUcs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QUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxPQUFlO0lBQzNDLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sZUFBSyxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYXJrZG93bihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTaW1wbGUgbWFya2Rvd24gcmVuZGVyaW5nXG4gIGxldCByZXN1bHQgPSBjb250ZW50O1xuICBcbiAgLy8gQm9sZFxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgKF8sIHRleHQpID0+IGNoYWxrLmJvbGQodGV4dCkpO1xuICBcbiAgLy8gSXRhbGljXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXCooLio/KVxcKi9nLCAoXywgdGV4dCkgPT4gY2hhbGsuaXRhbGljKHRleHQpKTtcbiAgXG4gIC8vIENvZGUgYmxvY2tzXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9gYGAoXFx3KilcXG4oW1xcc1xcU10qPylgYGAvZywgKF8sIGxhbmcsIGNvZGUpID0+IHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihjb2RlKTtcbiAgfSk7XG4gIFxuICAvLyBJbmxpbmUgY29kZVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvYChbXmBdKylgL2csIChfLCBjb2RlKSA9PiBjaGFsay5jeWFuKGNvZGUpKTtcbiAgXG4gIC8vIEhlYWRlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL14jIyMgKC4rKSQvZ20sIChfLCB0ZXh0KSA9PiBjaGFsay5ib2xkLmdyZWVuKHRleHQpKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL14jIyAoLispJC9nbSwgKF8sIHRleHQpID0+IGNoYWxrLmJvbGQuZ3JlZW4odGV4dCkpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXiMgKC4rKSQvZ20sIChfLCB0ZXh0KSA9PiBjaGFsay5ib2xkLmdyZWVuKHRleHQpKTtcbiAgXG4gIC8vIExpbmtzXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF1cXCgoW14pXSspXFwpL2csIChfLCB0ZXh0LCB1cmwpID0+IFxuICAgIGAke2NoYWxrLmJsdWUudW5kZXJsaW5lKHRleHQpfSAke2NoYWxrLmdyYXkoYCgke3VybH0pYCl9YFxuICApO1xuICBcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENvZGVCbG9jayhjb2RlOiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGVyID0gbGFuZ3VhZ2UgPyBjaGFsay5ncmF5KGBcXGBcXGBcXGAke2xhbmd1YWdlfVxcbmApIDogY2hhbGsuZ3JheSgnYGBgXFxuJyk7XG4gIGNvbnN0IGZvb3RlciA9IGNoYWxrLmdyYXkoJ1xcbmBgYCcpO1xuICByZXR1cm4gaGVhZGVyICsgY2hhbGsuY3lhbihjb2RlKSArIGZvb3Rlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdElubGluZUNvZGUoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLmN5YW4oYFxcYCR7Y29kZX1cXGBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdExpbmsodGV4dDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjaGFsay5ibHVlLnVuZGVybGluZSh0ZXh0KX0gJHtjaGFsay5ncmF5KGAoJHt1cmx9KWApfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWxsZXQodGV4dDogc3RyaW5nLCBsZXZlbDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgY29uc3QgYnVsbGV0ID0gbGV2ZWwgPT09IDAgPyAn4oCiJyA6ICfil6YnO1xuICByZXR1cm4gYCR7aW5kZW50fSR7Y2hhbGsuY3lhbihidWxsZXQpfSAke3RleHR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcmVkTGlzdChpdGVtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gXG4gICAgYCR7Y2hhbGsuY3lhbihgJHtpbmRleCArIDF9LmApfSAke2l0ZW19YFxuICApLmpvaW4oJ1xcbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLnJlZChg4pyXIEVycm9yOiAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdWNjZXNzKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjaGFsay5ncmVlbihg4pyTICR7bWVzc2FnZX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFdhcm5pbmcobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLnllbGxvdyhg4pqgICR7bWVzc2FnZX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEluZm8obWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLmJsdWUoYOKEuSAke21lc3NhZ2V9YCk7XG59Il19
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@oflow-ai/oflow-cli",
3
+ "version": "0.1.0",
4
+ "description": "oFlow CLI - AI-powered terminal assistant for developers",
5
+ "keywords": [
6
+ "ai",
7
+ "cli",
8
+ "assistant",
9
+ "terminal",
10
+ "code-assistant",
11
+ "gpt",
12
+ "openai",
13
+ "deepseek",
14
+ "qwen",
15
+ "developer-tools"
16
+ ],
17
+ "homepage": "https://github.com/oflow-ai/oflow-cli#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/oflow-ai/oflow-cli/issues"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/oflow-ai/oflow-cli.git"
24
+ },
25
+ "main": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "bin": {
28
+ "oflow": "dist/index.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "scripts",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc -b",
38
+ "dev": "tsc -b --watch",
39
+ "test": "echo \"No tests yet\"",
40
+ "prepublishOnly": "npm run build",
41
+ "postinstall": "node scripts/postinstall.js"
42
+ },
43
+ "dependencies": {
44
+ "@oflow-ai/core": "^0.1.0",
45
+ "commander": "^11.1.0",
46
+ "chalk": "^4.1.2",
47
+ "ora": "^5.4.1",
48
+ "inquirer": "^8.2.6",
49
+ "conf": "^10.2.0",
50
+ "marked": "^11.1.0",
51
+ "marked-terminal": "^6.0.0",
52
+ "update-notifier": "^6.0.2",
53
+ "open": "^8.4.2"
54
+ },
55
+ "devDependencies": {
56
+ "@types/inquirer": "^8.2.10",
57
+ "@types/node": "^20.10.0",
58
+ "@types/update-notifier": "^6.0.5",
59
+ "typescript": "^5.3.2"
60
+ },
61
+ "engines": {
62
+ "node": ">=18.0.0"
63
+ },
64
+ "author": "oFlow Team",
65
+ "license": "MIT",
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }