@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 +21 -0
- package/README.md +117 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +339 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.js +467 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -0
- package/dist/postinstall.d.ts +10 -0
- package/dist/postinstall.js +58 -0
- package/dist/utils/markdown.d.ts +10 -0
- package/dist/utils/markdown.js +69 -0
- package/package.json +69 -0
- package/scripts/postinstall.js +61 -0
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>;
|