@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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 oFlow Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # oFlow CLI
2
+
3
+ AI-powered CLI assistant for developers. Supports multiple AI providers including OpenAI and Chinese open-source models.
4
+
5
+ ## Installation
6
+
7
+ ### Mac/Linux/Ubuntu
8
+
9
+ ```bash
10
+ npm i -g @oflow-ai/oflow-cli
11
+ ```
12
+
13
+ ### Windows
14
+
15
+ 1. Restart your terminal (CMD or PowerShell)
16
+ 2. Run:
17
+ ```bash
18
+ npm install -g @oflow-ai/oflow-cli
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```bash
24
+ # Start oFlow CLI
25
+ oflow
26
+
27
+ # Configure authentication
28
+ oflow auth
29
+
30
+ # List available models
31
+ oflow models
32
+ ```
33
+
34
+ ## Supported AI Providers
35
+
36
+ ### OpenAI
37
+ - gpt-4o
38
+ - gpt-4o-mini
39
+ - gpt-4-turbo
40
+ - o1-preview
41
+ - o1-mini
42
+
43
+ ### Chinese Open-Source Models
44
+
45
+ | Provider | Models | Features |
46
+ |----------|--------|----------|
47
+ | DeepSeek | deepseek-chat, deepseek-reasoner | Reasoning with thinking process |
48
+ | Qwen (通义千问) | qwen-turbo/plus/max/long | Chinese optimized |
49
+ | GLM (智谱) | glm-4/plus/flash/long | Free tier available |
50
+ | Baichuan (百川) | Baichuan4, Baichuan3-Turbo | Chinese optimized |
51
+ | Yi (零一万物) | yi-lightning/large/medium | Cost-effective |
52
+ | Moonshot (月之暗面) | moonshot-v1-8k/32k/128k | Long context |
53
+ | SiliconFlow | Multiple open-source models | One-stop API |
54
+
55
+ ## CLI Options
56
+
57
+ ```bash
58
+ oflow [options] [command] [prompt]
59
+
60
+ Options:
61
+ -V, --version output the version number
62
+ -m, --model <model> Specify the AI model to use
63
+ -d, --directory <dir> Working directory
64
+ --yolo Run in yolo mode (auto-approve all operations)
65
+ --thinking Show AI thinking/reasoning process
66
+ --no-thinking Hide AI thinking/reasoning process
67
+ -h, --help display help for command
68
+
69
+ Commands:
70
+ auth [options] Configure authentication
71
+ config [options] View or edit configuration
72
+ models List available AI models
73
+ ```
74
+
75
+ ## Slash Commands
76
+
77
+ Inside the interactive CLI:
78
+
79
+ | Command | Description |
80
+ |---------|-------------|
81
+ | `/help` | Show help message |
82
+ | `/exit` | Exit CLI |
83
+ | `/clear` | Clear conversation history |
84
+ | `/init` | Analyze current project |
85
+ | `/model [name]` | Show or set current model |
86
+ | `/config` | Show configuration |
87
+ | `/thinking` | Toggle thinking process display |
88
+ | `/tools` | List available tools |
89
+ | `/agents` | List available sub-agents |
90
+ | `/history` | Show conversation history |
91
+ | `/commit` | Generate commit message |
92
+ | `/review` | Review recent code changes |
93
+
94
+ ## Features
95
+
96
+ - **Multi-provider support**: OpenAI, DeepSeek, Qwen, GLM, and more
97
+ - **Tool calling**: File operations, shell commands, web search
98
+ - **Thinking process**: View AI reasoning for supported models (DeepSeek Reasoner)
99
+ - **Sub-agents**: Specialized agents for different tasks
100
+ - **MCP integration**: Extend with Model Context Protocol servers
101
+ - **Skill system**: Installable skill packages
102
+ - **Sandbox mode**: Isolated execution with Docker/Podman
103
+
104
+ ## Configuration
105
+
106
+ Configuration is stored in:
107
+ - macOS/Linux: `~/.config/oflow-nodejs/config.json`
108
+ - Windows: `%APPDATA%\oflow-nodejs\config.json`
109
+
110
+ ## Requirements
111
+
112
+ - Node.js 18.0.0 or higher
113
+ - npm 9.0.0 or higher
114
+
115
+ ## License
116
+
117
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export interface CLIOptions {
2
+ model?: string;
3
+ yolo?: boolean;
4
+ sandbox?: boolean;
5
+ showThinking?: boolean;
6
+ }
7
+ export declare function startInteractiveMode(options: CLIOptions): Promise<void>;
8
+ export declare function runSingleCommand(prompt: string, options: CLIOptions): Promise<void>;
package/dist/cli.js ADDED
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.startInteractiveMode = startInteractiveMode;
40
+ exports.runSingleCommand = runSingleCommand;
41
+ const readline = __importStar(require("readline"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const ora_1 = __importDefault(require("ora"));
44
+ const core_1 = require("@oflow-ai/core");
45
+ const commands_1 = require("./commands");
46
+ let sandboxExecutor = null;
47
+ let showThinking = false;
48
+ async function startInteractiveMode(options) {
49
+ const configManager = (0, core_1.getConfigManager)();
50
+ const auth = configManager.getAuth();
51
+ if (!auth) {
52
+ console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
53
+ return;
54
+ }
55
+ // 初始化沙箱执行器
56
+ if (options.sandbox || configManager.get('sandbox')) {
57
+ sandboxExecutor = await (0, core_1.createSandboxExecutor)();
58
+ console.log(chalk_1.default.gray(`Sandbox mode: ${sandboxExecutor ? 'enabled' : 'unavailable'}`));
59
+ }
60
+ // 获取思考过程显示设置
61
+ showThinking = options.showThinking ?? configManager.getShowThinking();
62
+ const model = options.model || configManager.getDefaultModel() || 'gpt-4o';
63
+ const provider = (0, core_1.createAIProvider)(auth, model);
64
+ const agentFactory = new core_1.AgentFactory(provider, process.cwd());
65
+ const conversation = new core_1.Conversation({
66
+ provider,
67
+ workingDirectory: process.cwd(),
68
+ maxTokens: configManager.get('maxTokens'),
69
+ temperature: configManager.get('temperature'),
70
+ showThinking: showThinking,
71
+ onContent: (content) => {
72
+ process.stdout.write(chalk_1.default.white(content));
73
+ },
74
+ onThinking: (thinking) => {
75
+ // 显示思考过程,使用不同的颜色
76
+ process.stdout.write(chalk_1.default.magenta(thinking));
77
+ },
78
+ onToolCall: (toolCall) => {
79
+ console.log(chalk_1.default.cyan(`\n🔧 Using tool: ${toolCall.function.name}`));
80
+ },
81
+ onToolResult: (result) => {
82
+ // Tool result is handled silently
83
+ }
84
+ });
85
+ // Set system prompt
86
+ conversation.setSystemPrompt(getSystemPrompt());
87
+ console.log(chalk_1.default.bold.blue('\n╔═══════════════════════════════════════╗'));
88
+ console.log(chalk_1.default.bold.blue('║ Welcome to oflow CLI ║'));
89
+ console.log(chalk_1.default.bold.blue('╚═══════════════════════════════════════╝'));
90
+ console.log('');
91
+ console.log(chalk_1.default.gray(`Model: ${model}`));
92
+ console.log(chalk_1.default.gray(`Working directory: ${process.cwd()}`));
93
+ if (sandboxExecutor) {
94
+ console.log(chalk_1.default.gray(`Sandbox: enabled`));
95
+ }
96
+ console.log(chalk_1.default.gray(`Thinking: ${showThinking ? 'ON' : 'OFF'} (use /thinking to toggle)`));
97
+ console.log('');
98
+ console.log(chalk_1.default.gray('Type your message and press Enter to chat.'));
99
+ console.log(chalk_1.default.gray('Type /help for available commands.'));
100
+ console.log(chalk_1.default.gray('Type $agent-name to call a sub-agent.'));
101
+ console.log(chalk_1.default.gray('Type /exit or press Ctrl+C to exit.'));
102
+ console.log('');
103
+ const rl = readline.createInterface({
104
+ input: process.stdin,
105
+ output: process.stdout,
106
+ prompt: chalk_1.default.green('> ')
107
+ });
108
+ rl.prompt();
109
+ rl.on('line', async (line) => {
110
+ const input = line.trim();
111
+ if (!input) {
112
+ rl.prompt();
113
+ return;
114
+ }
115
+ // Check for slash commands
116
+ if ((0, commands_1.isSlashCommand)(input)) {
117
+ const shouldContinue = await (0, commands_1.executeSlashCommand)(input, {
118
+ conversation,
119
+ rl,
120
+ configManager
121
+ });
122
+ if (!shouldContinue) {
123
+ rl.close();
124
+ return;
125
+ }
126
+ rl.prompt();
127
+ return;
128
+ }
129
+ // Check for agent calls (starting with $)
130
+ if (input.startsWith('$')) {
131
+ await handleAgentCall(input, agentFactory, options);
132
+ rl.prompt();
133
+ return;
134
+ }
135
+ // Check for shell commands (starting with !)
136
+ if (input.startsWith('!')) {
137
+ await executeShellCommand(input.slice(1), sandboxExecutor);
138
+ rl.prompt();
139
+ return;
140
+ }
141
+ // Check for file reference (starting with @)
142
+ const processedInput = await processFileReferences(input);
143
+ // Send to AI
144
+ const spinner = (0, ora_1.default)('Thinking...').start();
145
+ try {
146
+ const response = await conversation.sendMessage(processedInput);
147
+ spinner.stop();
148
+ console.log(''); // New line after response
149
+ rl.prompt();
150
+ }
151
+ catch (error) {
152
+ spinner.fail('Error');
153
+ console.log(chalk_1.default.red(error instanceof Error ? error.message : String(error)));
154
+ rl.prompt();
155
+ }
156
+ });
157
+ rl.on('close', () => {
158
+ console.log(chalk_1.default.bold('\nGoodbye! 👋\n'));
159
+ process.exit(0);
160
+ });
161
+ // Handle Ctrl+C
162
+ process.on('SIGINT', () => {
163
+ console.log(chalk_1.default.bold('\nGoodbye! 👋\n'));
164
+ process.exit(0);
165
+ });
166
+ }
167
+ async function handleAgentCall(input, agentFactory, options) {
168
+ // Parse agent call: $agent-type "task description"
169
+ const match = input.match(/^\$(\w+(?:-\w+)*)\s*(.*)$/);
170
+ if (!match) {
171
+ console.log(chalk_1.default.yellow('Invalid agent call format. Use: $agent-type "task"'));
172
+ console.log(chalk_1.default.gray('Available agents: general-purpose, plan-agent, explore-agent, code-reviewer, frontend-tester'));
173
+ return;
174
+ }
175
+ const agentType = match[1];
176
+ const task = match[2].replace(/^["']|["']$/g, '');
177
+ if (!task) {
178
+ console.log(chalk_1.default.yellow('Please provide a task for the agent.'));
179
+ return;
180
+ }
181
+ try {
182
+ const agent = agentFactory.createAgent(agentType);
183
+ console.log(chalk_1.default.cyan(`\n🤖 Starting ${agentType} agent...`));
184
+ console.log(chalk_1.default.gray(`Task: ${task}\n`));
185
+ const spinner = (0, ora_1.default)('Agent working...').start();
186
+ const result = await agent.execute(task, (update) => {
187
+ spinner.stop();
188
+ process.stdout.write(update);
189
+ spinner.start();
190
+ });
191
+ spinner.stop();
192
+ if (result.success) {
193
+ console.log(chalk_1.default.green('\n\n✓ Agent completed successfully'));
194
+ if (result.filesModified && result.filesModified.length > 0) {
195
+ console.log(chalk_1.default.gray('Files modified:'));
196
+ result.filesModified.forEach(f => console.log(chalk_1.default.gray(` - ${f}`)));
197
+ }
198
+ }
199
+ else {
200
+ console.log(chalk_1.default.red('\n\n✗ Agent encountered errors:'));
201
+ result.errors?.forEach(e => console.log(chalk_1.default.red(` - ${e}`)));
202
+ }
203
+ if (result.output) {
204
+ console.log(chalk_1.default.gray('\nOutput:'));
205
+ console.log(result.output);
206
+ }
207
+ }
208
+ catch (error) {
209
+ console.log(chalk_1.default.red(error instanceof Error ? error.message : String(error)));
210
+ }
211
+ }
212
+ async function runSingleCommand(prompt, options) {
213
+ const configManager = (0, core_1.getConfigManager)();
214
+ const auth = configManager.getAuth();
215
+ if (!auth) {
216
+ console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
217
+ return;
218
+ }
219
+ // 初始化沙箱执行器
220
+ if (options.sandbox || configManager.get('sandbox')) {
221
+ sandboxExecutor = await (0, core_1.createSandboxExecutor)();
222
+ }
223
+ const model = options.model || configManager.getDefaultModel() || 'gpt-4o';
224
+ const provider = (0, core_1.createAIProvider)(auth, model);
225
+ const conversation = new core_1.Conversation({
226
+ provider,
227
+ workingDirectory: process.cwd(),
228
+ maxTokens: configManager.get('maxTokens'),
229
+ temperature: configManager.get('temperature'),
230
+ onContent: (content) => {
231
+ process.stdout.write(chalk_1.default.white(content));
232
+ }
233
+ });
234
+ conversation.setSystemPrompt(getSystemPrompt());
235
+ const processedInput = await processFileReferences(prompt);
236
+ const spinner = (0, ora_1.default)('Processing...').start();
237
+ try {
238
+ await conversation.sendMessage(processedInput);
239
+ spinner.stop();
240
+ console.log('');
241
+ }
242
+ catch (error) {
243
+ spinner.fail('Error');
244
+ console.log(chalk_1.default.red(error instanceof Error ? error.message : String(error)));
245
+ }
246
+ }
247
+ async function executeShellCommand(command, sandbox) {
248
+ const { spawn } = require('child_modules');
249
+ if (sandbox && sandbox['config']?.backend !== 'none') {
250
+ // Use sandbox execution
251
+ const result = await sandbox.execute(command, process.cwd());
252
+ if (result.stdout)
253
+ console.log(result.stdout);
254
+ if (result.stderr)
255
+ console.error(result.stderr);
256
+ if (result.timedOut)
257
+ console.log(chalk_1.default.yellow('Command timed out'));
258
+ return;
259
+ }
260
+ return new Promise((resolve) => {
261
+ const isWindows = process.platform === 'win32';
262
+ const shell = isWindows ? 'powershell.exe' : '/bin/bash';
263
+ const args = isWindows ? ['-NoProfile', '-Command', command] : ['-c', command];
264
+ const proc = spawn(shell, args, {
265
+ stdio: 'inherit',
266
+ cwd: process.cwd()
267
+ });
268
+ proc.on('close', () => {
269
+ resolve();
270
+ });
271
+ });
272
+ }
273
+ async function processFileReferences(input) {
274
+ const fileRefRegex = /@([^\s]+)/g;
275
+ const matches = input.matchAll(fileRefRegex);
276
+ let result = input;
277
+ const fs = require('fs');
278
+ const path = require('path');
279
+ for (const match of matches) {
280
+ const filePath = match[1];
281
+ try {
282
+ const content = fs.readFileSync(filePath, 'utf-8');
283
+ result = result.replace(match[0], `\n[File: ${filePath}]\n${content}\n[End of file]\n`);
284
+ }
285
+ catch {
286
+ // File not found, keep original reference
287
+ }
288
+ }
289
+ return result;
290
+ }
291
+ function getSystemPrompt() {
292
+ return `You are oflow CLI, an interactive CLI agent specializing in software engineering tasks.
293
+
294
+ Your primary goal is to help users safely and efficiently complete programming tasks.
295
+
296
+ # Core Capabilities
297
+ - Read, write, and edit files
298
+ - Execute shell commands
299
+ - Search and analyze code
300
+ - Web search and fetch content
301
+ - Manage project structure
302
+ - Launch specialized sub-agents
303
+
304
+ # Tools Available
305
+ - read_file: Read file contents
306
+ - write_file: Write to files
307
+ - list_directory: List directory contents
308
+ - glob: Find files by pattern
309
+ - search_file_content: Search within files
310
+ - run_shell_command: Execute shell commands
311
+ - web_search: Search the web
312
+ - web_fetch: Fetch web content
313
+ - replace: Replace text in files
314
+ - image_read: Analyze images
315
+ - pdf_extract: Extract content from PDFs
316
+ - ask_user_question: Ask user for input
317
+ - task: Launch sub-agents
318
+ - save_memory: Save information for future sessions
319
+
320
+ # Sub-Agents (use $agent-name to call)
321
+ - general-purpose: Complex multi-step tasks
322
+ - plan-agent: Planning and analysis
323
+ - explore-agent: Codebase exploration
324
+ - code-reviewer: Code review
325
+ - frontend-tester: UI testing
326
+
327
+ # Guidelines
328
+ 1. Be concise and helpful
329
+ 2. Always explain what you're doing before using tools
330
+ 3. Ask for clarification when needed
331
+ 4. Prefer editing existing files over creating new ones
332
+ 5. Use appropriate tools for each task
333
+ 6. Verify changes after making them
334
+ 7. Provide actionable suggestions
335
+
336
+ Current working directory: ${process.cwd()}
337
+ `;
338
+ }
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQSxvREEySUM7QUE0REQsNENBdUNDO0FBelFELG1EQUFxQztBQUNyQyxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLHlDQVV3QjtBQUN4Qix5Q0FBaUU7QUFVakUsSUFBSSxlQUFlLEdBQTJCLElBQUksQ0FBQztBQUNuRCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7QUFFbEIsS0FBSyxVQUFVLG9CQUFvQixDQUFDLE9BQW1CO0lBQzVELE1BQU0sYUFBYSxHQUFHLElBQUEsdUJBQWdCLEdBQUUsQ0FBQztJQUN6QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQztRQUNyRSxPQUFPO0lBQ1QsQ0FBQztJQUVELFdBQVc7SUFDWCxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3BELGVBQWUsR0FBRyxNQUFNLElBQUEsNEJBQXFCLEdBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELGFBQWE7SUFDYixZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFFdkUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxhQUFhLENB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Q0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGVBQWU7SUFDdEIsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBNENvQixPQUFPLENBQUMsR0FBRyxFQUFFO0NBQ3pDLENBQUM7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7XG4gIGdldENvbmZpZ01hbmFnZXIsXG4gIGNyZWF0ZUFJUHJvdmlkZXIsXG4gIENvbnZlcnNhdGlvbixcbiAgTWVzc2FnZSxcbiAgQWdlbnRGYWN0b3J5LFxuICBBZ2VudCxcbiAgQWdlbnRUeXBlLFxuICBjcmVhdGVTYW5kYm94RXhlY3V0b3IsXG4gIFNhbmRib3hFeGVjdXRvclxufSBmcm9tICdAb2Zsb3ctYWkvY29yZSc7XG5pbXBvcnQgeyBpc1NsYXNoQ29tbWFuZCwgZXhlY3V0ZVNsYXNoQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgcmVuZGVyTWFya2Rvd24gfSBmcm9tICcuL3V0aWxzL21hcmtkb3duJztcblxuZXhwb3J0IGludGVyZmFjZSBDTElPcHRpb25zIHtcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHlvbG8/OiBib29sZWFuO1xuICBzYW5kYm94PzogYm9vbGVhbjtcbiAgc2hvd1RoaW5raW5nPzogYm9vbGVhbjtcbn1cblxubGV0IHNhbmRib3hFeGVjdXRvcjogU2FuZGJveEV4ZWN1dG9yIHwgbnVsbCA9IG51bGw7XG5sZXQgc2hvd1RoaW5raW5nID0gZmFsc2U7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydEludGVyYWN0aXZlTW9kZShvcHRpb25zOiBDTElPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBnZXRDb25maWdNYW5hZ2VyKCk7XG4gIGNvbnN0IGF1dGggPSBjb25maWdNYW5hZ2VyLmdldEF1dGgoKTtcblxuICBpZiAoIWF1dGgpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ05vdCBhdXRoZW50aWNhdGVkLiBSdW4gYG9mbG93IGF1dGhgIGZpcnN0LicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDliJ3lp4vljJbmspnnrrHmiafooYzlmahcbiAgaWYgKG9wdGlvbnMuc2FuZGJveCB8fCBjb25maWdNYW5hZ2VyLmdldCgnc2FuZGJveCcpKSB7XG4gICAgc2FuZGJveEV4ZWN1dG9yID0gYXdhaXQgY3JlYXRlU2FuZGJveEV4ZWN1dG9yKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgU2FuZGJveCBtb2RlOiAke3NhbmRib3hFeGVjdXRvciA/ICdlbmFibGVkJyA6ICd1bmF2YWlsYWJsZSd9YCkpO1xuICB9XG5cbiAgLy8g6I635Y+W5oCd6ICD6L+H56iL5pi+56S66K6+572uXG4gIHNob3dUaGlua2luZyA9IG9wdGlvbnMuc2hvd1RoaW5raW5nID8/IGNvbmZpZ01hbmFnZXIuZ2V0U2hvd1RoaW5raW5nKCk7XG5cbiAgY29uc3QgbW9kZWwgPSBvcHRpb25zLm1vZGVsIHx8IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkgfHwgJ2dwdC00byc7XG4gIGNvbnN0IHByb3ZpZGVyID0gY3JlYXRlQUlQcm92aWRlcihhdXRoLCBtb2RlbCk7XG4gIGNvbnN0IGFnZW50RmFjdG9yeSA9IG5ldyBBZ2VudEZhY3RvcnkocHJvdmlkZXIsIHByb2Nlc3MuY3dkKCkpO1xuXG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IG5ldyBDb252ZXJzYXRpb24oe1xuICAgIHByb3ZpZGVyLFxuICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHByb2Nlc3MuY3dkKCksXG4gICAgbWF4VG9rZW5zOiBjb25maWdNYW5hZ2VyLmdldCgnbWF4VG9rZW5zJyksXG4gICAgdGVtcGVyYXR1cmU6IGNvbmZpZ01hbmFnZXIuZ2V0KCd0ZW1wZXJhdHVyZScpLFxuICAgIHNob3dUaGlua2luZzogc2hvd1RoaW5raW5nLFxuICAgIG9uQ29udGVudDogKGNvbnRlbnQpID0+IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNoYWxrLndoaXRlKGNvbnRlbnQpKTtcbiAgICB9LFxuICAgIG9uVGhpbmtpbmc6ICh0aGlua2luZykgPT4ge1xuICAgICAgLy8g5pi+56S65oCd6ICD6L+H56iL77yM5L2/55So5LiN5ZCM55qE6aKc6ImyXG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaGFsay5tYWdlbnRhKHRoaW5raW5nKSk7XG4gICAgfSxcbiAgICBvblRvb2xDYWxsOiAodG9vbENhbGwpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbvCflKcgVXNpbmcgdG9vbDogJHt0b29sQ2FsbC5mdW5jdGlvbi5uYW1lfWApKTtcbiAgICB9LFxuICAgIG9uVG9vbFJlc3VsdDogKHJlc3VsdCkgPT4ge1xuICAgICAgLy8gVG9vbCByZXN1bHQgaXMgaGFuZGxlZCBzaWxlbnRseVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2V0IHN5c3RlbSBwcm9tcHRcbiAgY29udmVyc2F0aW9uLnNldFN5c3RlbVByb21wdChnZXRTeXN0ZW1Qcm9tcHQoKSk7XG5cbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZC5ibHVlKCdcXG7ilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZcnKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQuYmx1ZSgn4pWRICAgICAgICAgV2VsY29tZSB0byBvZmxvdyBDTEkgICAgICAgICAg4pWRJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmJsdWUoJ+KVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnScpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBNb2RlbDogJHttb2RlbH1gKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFdvcmtpbmcgZGlyZWN0b3J5OiAke3Byb2Nlc3MuY3dkKCl9YCkpO1xuICBpZiAoc2FuZGJveEV4ZWN1dG9yKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgU2FuZGJveDogZW5hYmxlZGApKTtcbiAgfVxuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBUaGlua2luZzogJHtzaG93VGhpbmtpbmcgPyAnT04nIDogJ09GRid9ICh1c2UgL3RoaW5raW5nIHRvIHRvZ2dsZSlgKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVHlwZSB5b3VyIG1lc3NhZ2UgYW5kIHByZXNzIEVudGVyIHRvIGNoYXQuJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUeXBlIC9oZWxwIGZvciBhdmFpbGFibGUgY29tbWFuZHMuJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUeXBlICRhZ2VudC1uYW1lIHRvIGNhbGwgYSBzdWItYWdlbnQuJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUeXBlIC9leGl0IG9yIHByZXNzIEN0cmwrQyB0byBleGl0LicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgIHByb21wdDogY2hhbGsuZ3JlZW4oJz4gJylcbiAgfSk7XG5cbiAgcmwucHJvbXB0KCk7XG5cbiAgcmwub24oJ2xpbmUnLCBhc3luYyAobGluZSkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbGluZS50cmltKCk7XG4gICAgXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmwucHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNsYXNoIGNvbW1hbmRzXG4gICAgaWYgKGlzU2xhc2hDb21tYW5kKGlucHV0KSkge1xuICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSBhd2FpdCBleGVjdXRlU2xhc2hDb21tYW5kKGlucHV0LCB7XG4gICAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgICAgcmwsXG4gICAgICAgIGNvbmZpZ01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXNob3VsZENvbnRpbnVlKSB7XG4gICAgICAgIHJsLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmwucHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGFnZW50IGNhbGxzIChzdGFydGluZyB3aXRoICQpXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgICAgYXdhaXQgaGFuZGxlQWdlbnRDYWxsKGlucHV0LCBhZ2VudEZhY3RvcnksIG9wdGlvbnMpO1xuICAgICAgcmwucHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNoZWxsIGNvbW1hbmRzIChzdGFydGluZyB3aXRoICEpXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgYXdhaXQgZXhlY3V0ZVNoZWxsQ29tbWFuZChpbnB1dC5zbGljZSgxKSwgc2FuZGJveEV4ZWN1dG9yKTtcbiAgICAgIHJsLnByb21wdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBmaWxlIHJlZmVyZW5jZSAoc3RhcnRpbmcgd2l0aCBAKVxuICAgIGNvbnN0IHByb2Nlc3NlZElucHV0ID0gYXdhaXQgcHJvY2Vzc0ZpbGVSZWZlcmVuY2VzKGlucHV0KTtcblxuICAgIC8vIFNlbmQgdG8gQUlcbiAgICBjb25zdCBzcGlubmVyID0gb3JhKCdUaGlua2luZy4uLicpLnN0YXJ0KCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udmVyc2F0aW9uLnNlbmRNZXNzYWdlKHByb2Nlc3NlZElucHV0KTtcbiAgICAgIHNwaW5uZXIuc3RvcCgpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnJyk7IC8vIE5ldyBsaW5lIGFmdGVyIHJlc3BvbnNlXG4gICAgICBybC5wcm9tcHQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdFcnJvcicpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcmwucHJvbXB0KCk7XG4gICAgfVxuICB9KTtcblxuICBybC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuR29vZGJ5ZSEg8J+Ri1xcbicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBDdHJsK0NcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkdvb2RieWUhIPCfkYtcXG4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQWdlbnRDYWxsKFxuICBpbnB1dDogc3RyaW5nLCBcbiAgYWdlbnRGYWN0b3J5OiBBZ2VudEZhY3RvcnksXG4gIG9wdGlvbnM6IENMSU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBQYXJzZSBhZ2VudCBjYWxsOiAkYWdlbnQtdHlwZSBcInRhc2sgZGVzY3JpcHRpb25cIlxuICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eXFwkKFxcdysoPzotXFx3KykqKVxccyooLiopJC8pO1xuICBcbiAgaWYgKCFtYXRjaCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnSW52YWxpZCBhZ2VudCBjYWxsIGZvcm1hdC4gVXNlOiAkYWdlbnQtdHlwZSBcInRhc2tcIicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdBdmFpbGFibGUgYWdlbnRzOiBnZW5lcmFsLXB1cnBvc2UsIHBsYW4tYWdlbnQsIGV4cGxvcmUtYWdlbnQsIGNvZGUtcmV2aWV3ZXIsIGZyb250ZW5kLXRlc3RlcicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhZ2VudFR5cGUgPSBtYXRjaFsxXSBhcyBBZ2VudFR5cGU7XG4gIGNvbnN0IHRhc2sgPSBtYXRjaFsyXS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKTtcblxuICBpZiAoIXRhc2spIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1BsZWFzZSBwcm92aWRlIGEgdGFzayBmb3IgdGhlIGFnZW50LicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGFnZW50ID0gYWdlbnRGYWN0b3J5LmNyZWF0ZUFnZW50KGFnZW50VHlwZSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxu8J+kliBTdGFydGluZyAke2FnZW50VHlwZX0gYWdlbnQuLi5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgVGFzazogJHt0YXNrfVxcbmApKTtcblxuICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoJ0FnZW50IHdvcmtpbmcuLi4nKS5zdGFydCgpO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFnZW50LmV4ZWN1dGUodGFzaywgKHVwZGF0ZSkgPT4ge1xuICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh1cGRhdGUpO1xuICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgIH0pO1xuXG4gICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbignXFxuXFxu4pyTIEFnZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKSk7XG4gICAgICBpZiAocmVzdWx0LmZpbGVzTW9kaWZpZWQgJiYgcmVzdWx0LmZpbGVzTW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdGaWxlcyBtb2RpZmllZDonKSk7XG4gICAgICAgIHJlc3VsdC5maWxlc01vZGlmaWVkLmZvckVhY2goZiA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIC0gJHtmfWApKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnXFxuXFxu4pyXIEFnZW50IGVuY291bnRlcmVkIGVycm9yczonKSk7XG4gICAgICByZXN1bHQuZXJyb3JzPy5mb3JFYWNoKGUgPT4gY29uc29sZS5sb2coY2hhbGsucmVkKGAgIC0gJHtlfWApKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5vdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1xcbk91dHB1dDonKSk7XG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQub3V0cHV0KTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNpbmdsZUNvbW1hbmQocHJvbXB0OiBzdHJpbmcsIG9wdGlvbnM6IENMSU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOWIneWni+WMluaymeeuseaJp+ihjOWZqFxuICBpZiAob3B0aW9ucy5zYW5kYm94IHx8IGNvbmZpZ01hbmFnZXIuZ2V0KCdzYW5kYm94JykpIHtcbiAgICBzYW5kYm94RXhlY3V0b3IgPSBhd2FpdCBjcmVhdGVTYW5kYm94RXhlY3V0b3IoKTtcbiAgfVxuXG4gIGNvbnN0IG1vZGVsID0gb3B0aW9ucy5tb2RlbCB8fCBjb25maWdNYW5hZ2VyLmdldERlZmF1bHRNb2RlbCgpIHx8ICdncHQtNG8nO1xuICBjb25zdCBwcm92aWRlciA9IGNyZWF0ZUFJUHJvdmlkZXIoYXV0aCwgbW9kZWwpO1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBuZXcgQ29udmVyc2F0aW9uKHtcbiAgICBwcm92aWRlcixcbiAgICB3b3JraW5nRGlyZWN0b3J5OiBwcm9jZXNzLmN3ZCgpLFxuICAgIG1heFRva2VuczogY29uZmlnTWFuYWdlci5nZXQoJ21heFRva2VucycpLFxuICAgIHRlbXBlcmF0dXJlOiBjb25maWdNYW5hZ2VyLmdldCgndGVtcGVyYXR1cmUnKSxcbiAgICBvbkNvbnRlbnQ6IChjb250ZW50KSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaGFsay53aGl0ZShjb250ZW50KSk7XG4gICAgfVxuICB9KTtcblxuICBjb252ZXJzYXRpb24uc2V0U3lzdGVtUHJvbXB0KGdldFN5c3RlbVByb21wdCgpKTtcblxuICBjb25zdCBwcm9jZXNzZWRJbnB1dCA9IGF3YWl0IHByb2Nlc3NGaWxlUmVmZXJlbmNlcyhwcm9tcHQpO1xuICBjb25zdCBzcGlubmVyID0gb3JhKCdQcm9jZXNzaW5nLi4uJykuc3RhcnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGNvbnZlcnNhdGlvbi5zZW5kTWVzc2FnZShwcm9jZXNzZWRJbnB1dCk7XG4gICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRXJyb3InKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIHNhbmRib3g/OiBTYW5kYm94RXhlY3V0b3IgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3Bhd24gfSA9IHJlcXVpcmUoJ2NoaWxkX21vZHVsZXMnKTtcbiAgXG4gIGlmIChzYW5kYm94ICYmIHNhbmRib3hbJ2NvbmZpZyddPy5iYWNrZW5kICE9PSAnbm9uZScpIHtcbiAgICAvLyBVc2Ugc2FuZGJveCBleGVjdXRpb25cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWN1dGUoY29tbWFuZCwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgaWYgKHJlc3VsdC5zdGRvdXQpIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICAgIGlmIChyZXN1bHQuc3RkZXJyKSBjb25zb2xlLmVycm9yKHJlc3VsdC5zdGRlcnIpO1xuICAgIGlmIChyZXN1bHQudGltZWRPdXQpIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnQ29tbWFuZCB0aW1lZCBvdXQnKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuICAgIGNvbnN0IHNoZWxsID0gaXNXaW5kb3dzID8gJ3Bvd2Vyc2hlbGwuZXhlJyA6ICcvYmluL2Jhc2gnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1dpbmRvd3MgPyBbJy1Ob1Byb2ZpbGUnLCAnLUNvbW1hbmQnLCBjb21tYW5kXSA6IFsnLWMnLCBjb21tYW5kXTtcblxuICAgIGNvbnN0IHByb2MgPSBzcGF3bihzaGVsbCwgYXJncywge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKVxuICAgIH0pO1xuXG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRmlsZVJlZmVyZW5jZXMoaW5wdXQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVSZWZSZWdleCA9IC9AKFteXFxzXSspL2c7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaEFsbChmaWxlUmVmUmVnZXgpO1xuICBcbiAgbGV0IHJlc3VsdCA9IGlucHV0O1xuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBtYXRjaFsxXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShtYXRjaFswXSwgYFxcbltGaWxlOiAke2ZpbGVQYXRofV1cXG4ke2NvbnRlbnR9XFxuW0VuZCBvZiBmaWxlXVxcbmApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBub3QgZm91bmQsIGtlZXAgb3JpZ2luYWwgcmVmZXJlbmNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0U3lzdGVtUHJvbXB0KCk6IHN0cmluZyB7XG4gIHJldHVybiBgWW91IGFyZSBvZmxvdyBDTEksIGFuIGludGVyYWN0aXZlIENMSSBhZ2VudCBzcGVjaWFsaXppbmcgaW4gc29mdHdhcmUgZW5naW5lZXJpbmcgdGFza3MuXG5cbllvdXIgcHJpbWFyeSBnb2FsIGlzIHRvIGhlbHAgdXNlcnMgc2FmZWx5IGFuZCBlZmZpY2llbnRseSBjb21wbGV0ZSBwcm9ncmFtbWluZyB0YXNrcy5cblxuIyBDb3JlIENhcGFiaWxpdGllc1xuLSBSZWFkLCB3cml0ZSwgYW5kIGVkaXQgZmlsZXNcbi0gRXhlY3V0ZSBzaGVsbCBjb21tYW5kc1xuLSBTZWFyY2ggYW5kIGFuYWx5emUgY29kZVxuLSBXZWIgc2VhcmNoIGFuZCBmZXRjaCBjb250ZW50XG4tIE1hbmFnZSBwcm9qZWN0IHN0cnVjdHVyZVxuLSBMYXVuY2ggc3BlY2lhbGl6ZWQgc3ViLWFnZW50c1xuXG4jIFRvb2xzIEF2YWlsYWJsZVxuLSByZWFkX2ZpbGU6IFJlYWQgZmlsZSBjb250ZW50c1xuLSB3cml0ZV9maWxlOiBXcml0ZSB0byBmaWxlc1xuLSBsaXN0X2RpcmVjdG9yeTogTGlzdCBkaXJlY3RvcnkgY29udGVudHNcbi0gZ2xvYjogRmluZCBmaWxlcyBieSBwYXR0ZXJuXG4tIHNlYXJjaF9maWxlX2NvbnRlbnQ6IFNlYXJjaCB3aXRoaW4gZmlsZXNcbi0gcnVuX3NoZWxsX2NvbW1hbmQ6IEV4ZWN1dGUgc2hlbGwgY29tbWFuZHNcbi0gd2ViX3NlYXJjaDogU2VhcmNoIHRoZSB3ZWJcbi0gd2ViX2ZldGNoOiBGZXRjaCB3ZWIgY29udGVudFxuLSByZXBsYWNlOiBSZXBsYWNlIHRleHQgaW4gZmlsZXNcbi0gaW1hZ2VfcmVhZDogQW5hbHl6ZSBpbWFnZXNcbi0gcGRmX2V4dHJhY3Q6IEV4dHJhY3QgY29udGVudCBmcm9tIFBERnNcbi0gYXNrX3VzZXJfcXVlc3Rpb246IEFzayB1c2VyIGZvciBpbnB1dFxuLSB0YXNrOiBMYXVuY2ggc3ViLWFnZW50c1xuLSBzYXZlX21lbW9yeTogU2F2ZSBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIHNlc3Npb25zXG5cbiMgU3ViLUFnZW50cyAodXNlICRhZ2VudC1uYW1lIHRvIGNhbGwpXG4tIGdlbmVyYWwtcHVycG9zZTogQ29tcGxleCBtdWx0aS1zdGVwIHRhc2tzXG4tIHBsYW4tYWdlbnQ6IFBsYW5uaW5nIGFuZCBhbmFseXNpc1xuLSBleHBsb3JlLWFnZW50OiBDb2RlYmFzZSBleHBsb3JhdGlvblxuLSBjb2RlLXJldmlld2VyOiBDb2RlIHJldmlld1xuLSBmcm9udGVuZC10ZXN0ZXI6IFVJIHRlc3RpbmdcblxuIyBHdWlkZWxpbmVzXG4xLiBCZSBjb25jaXNlIGFuZCBoZWxwZnVsXG4yLiBBbHdheXMgZXhwbGFpbiB3aGF0IHlvdSdyZSBkb2luZyBiZWZvcmUgdXNpbmcgdG9vbHNcbjMuIEFzayBmb3IgY2xhcmlmaWNhdGlvbiB3aGVuIG5lZWRlZFxuNC4gUHJlZmVyIGVkaXRpbmcgZXhpc3RpbmcgZmlsZXMgb3ZlciBjcmVhdGluZyBuZXcgb25lc1xuNS4gVXNlIGFwcHJvcHJpYXRlIHRvb2xzIGZvciBlYWNoIHRhc2tcbjYuIFZlcmlmeSBjaGFuZ2VzIGFmdGVyIG1ha2luZyB0aGVtXG43LiBQcm92aWRlIGFjdGlvbmFibGUgc3VnZ2VzdGlvbnNcblxuQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogJHtwcm9jZXNzLmN3ZCgpfVxuYDtcbn0iXX0=
@@ -0,0 +1,9 @@
1
+ import { Conversation, ConfigManager } from '@oflow-ai/core';
2
+ import * as readline from 'readline';
3
+ export interface CommandContext {
4
+ conversation: Conversation;
5
+ rl: readline.Interface;
6
+ configManager: ConfigManager;
7
+ }
8
+ export declare function isSlashCommand(input: string): boolean;
9
+ export declare function executeSlashCommand(input: string, context: CommandContext): Promise<boolean>;