@runflow-ai/cli 0.2.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/CLI-DOCS.md +428 -0
- package/README.md +127 -0
- package/dist/commands/agents/agents.command.d.ts +13 -0
- package/dist/commands/agents/agents.command.js +508 -0
- package/dist/commands/agents/agents.command.js.map +1 -0
- package/dist/commands/connectors/connectors.command.d.ts +11 -0
- package/dist/commands/connectors/connectors.command.js +72 -0
- package/dist/commands/connectors/connectors.command.js.map +1 -0
- package/dist/commands/credentials/credentials.command.d.ts +11 -0
- package/dist/commands/credentials/credentials.command.js +118 -0
- package/dist/commands/credentials/credentials.command.js.map +1 -0
- package/dist/commands/datasources/datasources.command.d.ts +11 -0
- package/dist/commands/datasources/datasources.command.js +72 -0
- package/dist/commands/datasources/datasources.command.js.map +1 -0
- package/dist/commands/executions/executions.command.d.ts +11 -0
- package/dist/commands/executions/executions.command.js +72 -0
- package/dist/commands/executions/executions.command.js.map +1 -0
- package/dist/commands/health/health.command.d.ts +11 -0
- package/dist/commands/health/health.command.js +66 -0
- package/dist/commands/health/health.command.js.map +1 -0
- package/dist/commands/login/login.command.d.ts +12 -0
- package/dist/commands/login/login.command.js +127 -0
- package/dist/commands/login/login.command.js.map +1 -0
- package/dist/commands/prompts/prompts.command.d.ts +11 -0
- package/dist/commands/prompts/prompts.command.js +102 -0
- package/dist/commands/prompts/prompts.command.js.map +1 -0
- package/dist/commands/search-tools/search-tools.command.d.ts +11 -0
- package/dist/commands/search-tools/search-tools.command.js +89 -0
- package/dist/commands/search-tools/search-tools.command.js.map +1 -0
- package/dist/commands/secret/secret.command.d.ts +4 -0
- package/dist/commands/secret/secret.command.js +22 -0
- package/dist/commands/secret/secret.command.js.map +1 -0
- package/dist/commands/sessions/sessions.command.d.ts +11 -0
- package/dist/commands/sessions/sessions.command.js +97 -0
- package/dist/commands/sessions/sessions.command.js.map +1 -0
- package/dist/commands/traces/traces.command.d.ts +11 -0
- package/dist/commands/traces/traces.command.js +73 -0
- package/dist/commands/traces/traces.command.js.map +1 -0
- package/dist/commands/triggers/triggers.command.d.ts +11 -0
- package/dist/commands/triggers/triggers.command.js +72 -0
- package/dist/commands/triggers/triggers.command.js.map +1 -0
- package/dist/commands/users/users.command.d.ts +12 -0
- package/dist/commands/users/users.command.js +138 -0
- package/dist/commands/users/users.command.js.map +1 -0
- package/dist/common/api-client.d.ts +25 -0
- package/dist/common/api-client.js +97 -0
- package/dist/common/api-client.js.map +1 -0
- package/dist/common/banner.d.ts +1 -0
- package/dist/common/banner.js +9 -0
- package/dist/common/banner.js.map +1 -0
- package/dist/common/config.d.ts +27 -0
- package/dist/common/config.js +63 -0
- package/dist/common/config.js.map +1 -0
- package/dist/common/help.d.ts +2 -0
- package/dist/common/help.js +34 -0
- package/dist/common/help.js.map +1 -0
- package/dist/common/logger.d.ts +9 -0
- package/dist/common/logger.js +84 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/ui.d.ts +7 -0
- package/dist/common/ui.js +20 -0
- package/dist/common/ui.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AgentsCommand = void 0;
|
|
13
|
+
const nest_commander_1 = require("nest-commander");
|
|
14
|
+
const fs = require("fs");
|
|
15
|
+
const path = require("path");
|
|
16
|
+
const child_process_1 = require("child_process");
|
|
17
|
+
const config_1 = require("../../common/config");
|
|
18
|
+
const ui_1 = require("../../common/ui");
|
|
19
|
+
const inquirer = require("inquirer");
|
|
20
|
+
const logger_1 = require("../../common/logger");
|
|
21
|
+
const api_client_1 = require("../../common/api-client");
|
|
22
|
+
const SENSITIVE_FILES = ['.env'];
|
|
23
|
+
const IGNORE_DIRS = ['node_modules', 'dist', '.git'];
|
|
24
|
+
const IGNORE_FILES = ['.DS_Store', '*.log', '*.lock', 'package-lock.json', '.runflow'];
|
|
25
|
+
async function showAgentActionMenu(agent) {
|
|
26
|
+
const actions = [
|
|
27
|
+
{ name: '📥 Clone repository (download)', value: 'clone' },
|
|
28
|
+
{ name: '🚀 Duplicate agent on server', value: 'duplicate' },
|
|
29
|
+
{ name: '🚢 Deploy agent', value: 'deploy' },
|
|
30
|
+
{ name: '🗑️ Delete agent', value: 'delete' },
|
|
31
|
+
{ name: '❌ Cancel', value: 'cancel' }
|
|
32
|
+
];
|
|
33
|
+
const { action } = await inquirer.prompt([
|
|
34
|
+
{
|
|
35
|
+
type: 'list',
|
|
36
|
+
name: 'action',
|
|
37
|
+
message: `What would you like to do with "${agent.name}"?`,
|
|
38
|
+
choices: actions
|
|
39
|
+
}
|
|
40
|
+
]);
|
|
41
|
+
return action === 'cancel' ? null : action;
|
|
42
|
+
}
|
|
43
|
+
function sanitizeFileName(name) {
|
|
44
|
+
return name.replace(/[<>:"/\\|?*]/g, '-').replace(/\s+/g, '-').toLowerCase();
|
|
45
|
+
}
|
|
46
|
+
async function detectAgentFromCurrentDirectory() {
|
|
47
|
+
try {
|
|
48
|
+
const currentDir = process.cwd();
|
|
49
|
+
(0, logger_1.logVerbose)(`Checking for .runflow file in: ${currentDir}`);
|
|
50
|
+
const runflowFile = path.join(currentDir, '.runflow');
|
|
51
|
+
if (fs.existsSync(runflowFile)) {
|
|
52
|
+
(0, logger_1.logVerbose)(`Found .runflow file at: ${runflowFile}`);
|
|
53
|
+
const content = fs.readFileSync(runflowFile, 'utf8');
|
|
54
|
+
(0, logger_1.logVerbose)(`Raw .runflow content: ${content}`);
|
|
55
|
+
const config = JSON.parse(content);
|
|
56
|
+
(0, logger_1.logVerbose)(`Parsed .runflow config: ${JSON.stringify(config)}`);
|
|
57
|
+
const agentId = config.agentId || null;
|
|
58
|
+
if (agentId) {
|
|
59
|
+
(0, logger_1.logVerbose)(`Detected agent ${agentId} from .runflow file`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
(0, logger_1.logVerbose)(`No agentId found in .runflow file`);
|
|
63
|
+
}
|
|
64
|
+
return agentId;
|
|
65
|
+
}
|
|
66
|
+
(0, logger_1.logVerbose)(`No .runflow file found in current directory: ${currentDir}`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
(0, logger_1.logVerbose)(`Error reading .runflow file: ${error}`);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function dirToTree(dir, base = dir) {
|
|
75
|
+
(0, logger_1.logVerbose)(`📁 Scanning directory: ${dir}`);
|
|
76
|
+
const result = fs.readdirSync(dir, { withFileTypes: true }).reduce((acc, entry) => {
|
|
77
|
+
if (IGNORE_DIRS.includes(entry.name) ||
|
|
78
|
+
SENSITIVE_FILES.includes(entry.name) ||
|
|
79
|
+
IGNORE_FILES.some((pattern) => entry.name.includes(pattern.replace('*', '')))) {
|
|
80
|
+
(0, logger_1.logVerbose)(`⏭️ Ignoring: ${entry.name} (matches ignore rules)`);
|
|
81
|
+
return acc;
|
|
82
|
+
}
|
|
83
|
+
const fullPath = path.join(dir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
(0, logger_1.logVerbose)(`📂 Processing directory: ${entry.name}`);
|
|
86
|
+
acc.push(...dirToTree(fullPath, base));
|
|
87
|
+
}
|
|
88
|
+
else if (entry.isFile()) {
|
|
89
|
+
const relPath = path.relative(base, fullPath).replace(/\\/g, '/');
|
|
90
|
+
try {
|
|
91
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
92
|
+
(0, logger_1.logVerbose)(`📄 Adding file: ${relPath} (${content.length} chars)`);
|
|
93
|
+
acc.push({ path: relPath, mode: '100644', type: 'blob', content });
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
(0, logger_1.logVerbose)(`❌ Error reading file ${relPath}: ${error}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return acc;
|
|
100
|
+
}, []);
|
|
101
|
+
(0, logger_1.logVerbose)(`📊 Directory ${dir} contributed ${result.length} items`);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
let AgentsCommand = class AgentsCommand extends nest_commander_1.CommandRunner {
|
|
105
|
+
async performDeploy(targetAgentId, apiClient, data) {
|
|
106
|
+
(0, logger_1.logVerbose)(`Deploying agent ${targetAgentId} with local changes...`);
|
|
107
|
+
(0, logger_1.logVerbose)(`Current directory: ${process.cwd()}`);
|
|
108
|
+
const baseRepo = path.basename(process.cwd());
|
|
109
|
+
const { config } = (0, config_1.getValidatedConfig)();
|
|
110
|
+
const repo = `${config.tenantId}-${baseRepo}`;
|
|
111
|
+
const tree = dirToTree(process.cwd()).filter((item) => Boolean(item.path));
|
|
112
|
+
const defaultPayload = {
|
|
113
|
+
repo,
|
|
114
|
+
message: 'deploy with local changes',
|
|
115
|
+
tree,
|
|
116
|
+
branch: 'main',
|
|
117
|
+
};
|
|
118
|
+
const payload = data
|
|
119
|
+
? JSON.parse(data)
|
|
120
|
+
: defaultPayload;
|
|
121
|
+
(0, logger_1.logVerbose)(`📦 Deploy Summary:`);
|
|
122
|
+
(0, logger_1.logVerbose)(` Files to send: ${payload.tree.length}`);
|
|
123
|
+
(0, logger_1.logVerbose)(` Payload size: ${JSON.stringify(payload).length} bytes`);
|
|
124
|
+
(0, logger_1.logVerbose)(` Repository: ${payload.repo}`);
|
|
125
|
+
(0, logger_1.logVerbose)(` Branch: ${payload.branch}`);
|
|
126
|
+
if (payload.tree.length > 0) {
|
|
127
|
+
(0, logger_1.logVerbose)(`📋 Files being deployed:`);
|
|
128
|
+
payload.tree.forEach((item, index) => {
|
|
129
|
+
(0, logger_1.logVerbose)(` ${index + 1}. ${item.path} (${item.content?.length || 0} chars)`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
(0, logger_1.logVerbose)(`⚠️ WARNING: No files to deploy!`);
|
|
134
|
+
}
|
|
135
|
+
const res = await apiClient.patch(`/agents/${targetAgentId}/deploy`, payload);
|
|
136
|
+
(0, logger_1.logSuccess)(`Deployed agent with local changes`);
|
|
137
|
+
try {
|
|
138
|
+
(0, logger_1.logVerbose)(`Creating commit for deployed changes...`);
|
|
139
|
+
const currentDir = process.cwd();
|
|
140
|
+
(0, child_process_1.execSync)('git add .', { cwd: currentDir, stdio: 'pipe' });
|
|
141
|
+
const timestamp = new Date().toISOString().replace('T', ' ').split('.')[0];
|
|
142
|
+
const commitMessage = `Deploy: ${timestamp}`;
|
|
143
|
+
(0, child_process_1.execSync)(`git commit -m "${commitMessage}"`, { cwd: currentDir, stdio: 'pipe' });
|
|
144
|
+
(0, logger_1.logVerbose)(`✅ Auto-commit created: ${commitMessage}`);
|
|
145
|
+
}
|
|
146
|
+
catch (commitError) {
|
|
147
|
+
(0, logger_1.logVerbose)(`⚠️ Could not create auto-commit: ${commitError}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async executeAction(action, agent, apiClient) {
|
|
151
|
+
const agentId = agent.id;
|
|
152
|
+
const agentName = sanitizeFileName(agent.name || agent.id);
|
|
153
|
+
switch (action) {
|
|
154
|
+
case 'clone': {
|
|
155
|
+
(0, logger_1.logVerbose)(`Cloning agent ${agentId} repository...`);
|
|
156
|
+
const res = await apiClient.get(`/agents/${agentId}/clone`);
|
|
157
|
+
const tree = res.data;
|
|
158
|
+
(0, logger_1.logVerbose)(`Received ${tree.length} items from API`);
|
|
159
|
+
const gitFiles = tree.filter(item => item.path.startsWith('.git'));
|
|
160
|
+
(0, logger_1.logVerbose)(`Found ${gitFiles.length} .git files: ${gitFiles.map(f => f.path).join(', ')}`);
|
|
161
|
+
const dir = agentName;
|
|
162
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
163
|
+
const gitRefFiles = {};
|
|
164
|
+
const regularFiles = tree.filter(item => {
|
|
165
|
+
if (item.path === '.git/config' || item.path === '.git/HEAD') {
|
|
166
|
+
if (item.content) {
|
|
167
|
+
gitRefFiles[item.path] = item.content;
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
});
|
|
173
|
+
for (const item of regularFiles) {
|
|
174
|
+
if (SENSITIVE_FILES.includes(item.path)) {
|
|
175
|
+
(0, logger_1.logVerbose)(`Skipping sensitive file: ${item.path}`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
(0, logger_1.logVerbose)(`Processing: ${item.path} (type: ${item.type})`);
|
|
179
|
+
const filePath = path.join(dir, item.path);
|
|
180
|
+
if (item.type === 'blob') {
|
|
181
|
+
const dirPath = path.dirname(filePath);
|
|
182
|
+
(0, logger_1.logVerbose)(`Creating directory: ${dirPath}`);
|
|
183
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
184
|
+
(0, logger_1.logVerbose)(`Writing file: ${filePath}`);
|
|
185
|
+
fs.writeFileSync(filePath, item.content ?? '', 'utf8');
|
|
186
|
+
}
|
|
187
|
+
else if (item.type === 'tree') {
|
|
188
|
+
(0, logger_1.logVerbose)(`Creating tree directory: ${filePath}`);
|
|
189
|
+
fs.mkdirSync(filePath, { recursive: true });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
(0, logger_1.logVerbose)(`Initializing git repository in ${dir}/`);
|
|
193
|
+
try {
|
|
194
|
+
const resolvedDir = path.resolve(dir);
|
|
195
|
+
(0, child_process_1.execSync)('git init', { cwd: resolvedDir, stdio: 'pipe' });
|
|
196
|
+
(0, logger_1.logVerbose)(`✅ Git repository initialized`);
|
|
197
|
+
for (const [gitPath, content] of Object.entries(gitRefFiles)) {
|
|
198
|
+
const fullPath = path.join(dir, gitPath);
|
|
199
|
+
(0, logger_1.logVerbose)(`Applying git reference file: ${gitPath}`);
|
|
200
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
201
|
+
fs.writeFileSync(fullPath, content, 'utf8');
|
|
202
|
+
}
|
|
203
|
+
(0, logger_1.logVerbose)(`✅ Applied ${Object.keys(gitRefFiles).length} git reference files`);
|
|
204
|
+
(0, child_process_1.execSync)('git config user.name "Runflow CLI"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
205
|
+
(0, child_process_1.execSync)('git config user.email "noreply@runflow.ai"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
206
|
+
(0, child_process_1.execSync)('git add .', { cwd: resolvedDir, stdio: 'pipe' });
|
|
207
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
208
|
+
(0, child_process_1.execSync)('git commit -m "Initial commit"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
209
|
+
(0, logger_1.logVerbose)(`✅ Initial commit created`);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
(0, logger_1.logVerbose)(`❌ Error initializing git: ${error}`);
|
|
213
|
+
}
|
|
214
|
+
const runflowPath = path.join(dir, '.runflow');
|
|
215
|
+
if (fs.existsSync(runflowPath)) {
|
|
216
|
+
(0, logger_1.logVerbose)(`✅ .runflow file provided by API for deploy operations`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
(0, logger_1.logVerbose)(`⚠️ No .runflow file found - deploy may not work`);
|
|
220
|
+
}
|
|
221
|
+
(0, logger_1.logSuccess)(`Repository cloned to ${dir}/`);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case 'duplicate': {
|
|
225
|
+
(0, logger_1.logVerbose)(`Duplicating agent ${agentId} on server...`);
|
|
226
|
+
const res = await apiClient.post(`/agents/${agentId}/clone`, {});
|
|
227
|
+
(0, logger_1.logJson)([res.data]);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case 'deploy': {
|
|
231
|
+
const detectedAgentId = await detectAgentFromCurrentDirectory();
|
|
232
|
+
if (!detectedAgentId) {
|
|
233
|
+
(0, logger_1.logError)('❌ Deploy from menu requires being in a cloned agent directory with .runflow file.');
|
|
234
|
+
(0, logger_1.logError)('💡 Either:');
|
|
235
|
+
(0, logger_1.logError)(' 1. Navigate to a cloned agent directory and try again');
|
|
236
|
+
(0, logger_1.logError)(' 2. Use "Clone repository" first to download the agent');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (detectedAgentId !== agentId) {
|
|
240
|
+
(0, logger_1.logError)(`❌ Directory mismatch: Current directory has agent ${detectedAgentId}, but menu selected agent ${agentId}`);
|
|
241
|
+
(0, logger_1.logError)('💡 Navigate to the correct agent directory or select the matching agent in the menu.');
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
await this.performDeploy(detectedAgentId, apiClient, undefined);
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case 'delete': {
|
|
248
|
+
const { confirm } = await inquirer.prompt([
|
|
249
|
+
{
|
|
250
|
+
type: 'confirm',
|
|
251
|
+
name: 'confirm',
|
|
252
|
+
message: `Are you sure you want to delete "${agent.name}"?`,
|
|
253
|
+
default: false
|
|
254
|
+
}
|
|
255
|
+
]);
|
|
256
|
+
if (confirm) {
|
|
257
|
+
(0, logger_1.logVerbose)(`Removing agent ${agentId}...`);
|
|
258
|
+
await apiClient.delete(`/agents/${agentId}`);
|
|
259
|
+
(0, logger_1.logSuccess)('Agent removed');
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
(0, logger_1.logSuccess)('Delete cancelled');
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async run(inputs, options) {
|
|
269
|
+
const [action, data] = inputs;
|
|
270
|
+
const actions = [
|
|
271
|
+
'list',
|
|
272
|
+
'get',
|
|
273
|
+
'create',
|
|
274
|
+
'update',
|
|
275
|
+
'delete',
|
|
276
|
+
'clone',
|
|
277
|
+
'duplicate',
|
|
278
|
+
'deploy',
|
|
279
|
+
];
|
|
280
|
+
if (!action) {
|
|
281
|
+
(0, logger_1.log)('\nUsage: rf agents <action> [data]\n');
|
|
282
|
+
(0, logger_1.log)('Actions:');
|
|
283
|
+
(0, logger_1.log)(' list List agents and select active one');
|
|
284
|
+
(0, logger_1.log)(' get Display active agent');
|
|
285
|
+
(0, logger_1.log)(' create <json> Create agent');
|
|
286
|
+
(0, logger_1.log)(' update <json> Update active agent');
|
|
287
|
+
(0, logger_1.log)(' delete Remove active agent');
|
|
288
|
+
(0, logger_1.log)(' clone Clone agent repository (download)');
|
|
289
|
+
(0, logger_1.log)(' duplicate Duplicate agent on server');
|
|
290
|
+
(0, logger_1.log)(' deploy Deploy agent with local changes\n');
|
|
291
|
+
(0, logger_1.log)('Options:');
|
|
292
|
+
(0, logger_1.log)(' --api-key <key> API key override');
|
|
293
|
+
(0, logger_1.log)(' --api <url> API URL override');
|
|
294
|
+
(0, logger_1.log)(' --help, -h Show this help\n');
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (!actions.includes(action)) {
|
|
298
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.INVALID_ACTION(action, actions));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
const apiClient = (0, api_client_1.createApiClient)(options.api);
|
|
303
|
+
const { config } = (0, config_1.getValidatedConfig)();
|
|
304
|
+
const agentId = config.agentId;
|
|
305
|
+
switch (action) {
|
|
306
|
+
case 'list': {
|
|
307
|
+
(0, logger_1.logVerbose)('Fetching agents...');
|
|
308
|
+
const res = await apiClient.get('/agents');
|
|
309
|
+
const agents = res.data.data ?? res.data;
|
|
310
|
+
const selected = await (0, ui_1.selectItem)(agents, 'Select an agent:');
|
|
311
|
+
(0, config_1.saveConfig)({ agentId: selected.id });
|
|
312
|
+
const selectedAction = await showAgentActionMenu(selected);
|
|
313
|
+
if (!selectedAction) {
|
|
314
|
+
(0, logger_1.logSuccess)('Operation cancelled');
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
await this.executeAction(selectedAction, selected, apiClient);
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case 'get': {
|
|
321
|
+
if (!agentId) {
|
|
322
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_SELECTED);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
(0, logger_1.logVerbose)(`Fetching agent ${agentId}...`);
|
|
326
|
+
const res = await apiClient.get(`/agents/${agentId}`);
|
|
327
|
+
(0, logger_1.logJson)([res.data]);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case 'create': {
|
|
331
|
+
if (!data) {
|
|
332
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.DATA_REQUIRED);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
(0, logger_1.logVerbose)('Creating agent...');
|
|
336
|
+
const res = await apiClient.post('/agents', JSON.parse(data));
|
|
337
|
+
(0, logger_1.logJson)([res.data]);
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
case 'update': {
|
|
341
|
+
if (!agentId) {
|
|
342
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_SELECTED);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (!data) {
|
|
346
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.DATA_REQUIRED);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
(0, logger_1.logVerbose)(`Updating agent ${agentId}...`);
|
|
350
|
+
const res = await apiClient.put(`/agents/${agentId}`, JSON.parse(data));
|
|
351
|
+
(0, logger_1.logJson)([res.data]);
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
case 'delete': {
|
|
355
|
+
if (!agentId) {
|
|
356
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_SELECTED);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
(0, logger_1.logVerbose)(`Removing agent ${agentId}...`);
|
|
360
|
+
await apiClient.delete(`/agents/${agentId}`);
|
|
361
|
+
(0, logger_1.logSuccess)('Agent removed');
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
case 'clone': {
|
|
365
|
+
if (!agentId) {
|
|
366
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_SELECTED);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
(0, logger_1.logVerbose)(`Cloning agent ${agentId} repository...`);
|
|
370
|
+
const agentRes = await apiClient.get(`/agents/${agentId}`);
|
|
371
|
+
const agentName = sanitizeFileName(agentRes.data.name || agentId);
|
|
372
|
+
const res = await apiClient.get(`/agents/${agentId}/clone`);
|
|
373
|
+
const tree = res.data;
|
|
374
|
+
(0, logger_1.logVerbose)(`Received ${tree.length} items from API`);
|
|
375
|
+
const gitFiles = tree.filter(item => item.path.startsWith('.git'));
|
|
376
|
+
(0, logger_1.logVerbose)(`Found ${gitFiles.length} .git files: ${gitFiles.map(f => f.path).join(', ')}`);
|
|
377
|
+
const dir = agentName;
|
|
378
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
379
|
+
const gitRefFiles = {};
|
|
380
|
+
const regularFiles = tree.filter(item => {
|
|
381
|
+
if (item.path === '.git/config' || item.path === '.git/HEAD') {
|
|
382
|
+
if (item.content) {
|
|
383
|
+
gitRefFiles[item.path] = item.content;
|
|
384
|
+
}
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
return true;
|
|
388
|
+
});
|
|
389
|
+
for (const item of regularFiles) {
|
|
390
|
+
if (SENSITIVE_FILES.includes(item.path)) {
|
|
391
|
+
(0, logger_1.logVerbose)(`Skipping sensitive file: ${item.path}`);
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
(0, logger_1.logVerbose)(`Processing: ${item.path} (type: ${item.type})`);
|
|
395
|
+
const filePath = path.join(dir, item.path);
|
|
396
|
+
if (item.type === 'blob') {
|
|
397
|
+
const dirPath = path.dirname(filePath);
|
|
398
|
+
(0, logger_1.logVerbose)(`Creating directory: ${dirPath}`);
|
|
399
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
400
|
+
(0, logger_1.logVerbose)(`Writing file: ${filePath}`);
|
|
401
|
+
fs.writeFileSync(filePath, item.content ?? '', 'utf8');
|
|
402
|
+
}
|
|
403
|
+
else if (item.type === 'tree') {
|
|
404
|
+
(0, logger_1.logVerbose)(`Creating tree directory: ${filePath}`);
|
|
405
|
+
fs.mkdirSync(filePath, { recursive: true });
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
(0, logger_1.logVerbose)(`Initializing git repository in ${dir}/`);
|
|
409
|
+
try {
|
|
410
|
+
const resolvedDir = path.resolve(dir);
|
|
411
|
+
(0, child_process_1.execSync)('git init', { cwd: resolvedDir, stdio: 'pipe' });
|
|
412
|
+
(0, logger_1.logVerbose)(`✅ Git repository initialized`);
|
|
413
|
+
for (const [gitPath, content] of Object.entries(gitRefFiles)) {
|
|
414
|
+
const fullPath = path.join(dir, gitPath);
|
|
415
|
+
(0, logger_1.logVerbose)(`Applying git reference file: ${gitPath}`);
|
|
416
|
+
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
417
|
+
fs.writeFileSync(fullPath, content, 'utf8');
|
|
418
|
+
}
|
|
419
|
+
(0, logger_1.logVerbose)(`✅ Applied ${Object.keys(gitRefFiles).length} git reference files`);
|
|
420
|
+
(0, child_process_1.execSync)('git config user.name "Runflow CLI"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
421
|
+
(0, child_process_1.execSync)('git config user.email "noreply@runflow.ai"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
422
|
+
(0, child_process_1.execSync)('git add .', { cwd: resolvedDir, stdio: 'pipe' });
|
|
423
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
424
|
+
(0, child_process_1.execSync)('git commit -m "Initial commit"', { cwd: resolvedDir, stdio: 'pipe' });
|
|
425
|
+
(0, logger_1.logVerbose)(`✅ Initial commit created`);
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
(0, logger_1.logVerbose)(`❌ Error initializing git: ${error}`);
|
|
429
|
+
}
|
|
430
|
+
const runflowPath = path.join(dir, '.runflow');
|
|
431
|
+
if (fs.existsSync(runflowPath)) {
|
|
432
|
+
(0, logger_1.logVerbose)(`✅ .runflow file provided by API for deploy operations`);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
(0, logger_1.logVerbose)(`⚠️ No .runflow file found - deploy may not work`);
|
|
436
|
+
}
|
|
437
|
+
(0, logger_1.logSuccess)(`Repository cloned to ${dir}/`);
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
case 'duplicate': {
|
|
441
|
+
if (!agentId) {
|
|
442
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_SELECTED);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
(0, logger_1.logVerbose)(`Duplicating agent ${agentId} on server...`);
|
|
446
|
+
const res = await apiClient.post(`/agents/${agentId}/clone`, {});
|
|
447
|
+
(0, logger_1.logJson)([res.data]);
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
case 'deploy': {
|
|
451
|
+
const detectedAgentId = await detectAgentFromCurrentDirectory();
|
|
452
|
+
if (!detectedAgentId) {
|
|
453
|
+
(0, logger_1.logError)(config_1.ERROR_MESSAGES.AGENT_NOT_DETECTED);
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
await this.performDeploy(detectedAgentId, apiClient, data);
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (error) {
|
|
462
|
+
(0, logger_1.logError)(error.message || config_1.ERROR_MESSAGES.REQUEST_FAILED(error.toString()));
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
parseApiKey(val) {
|
|
466
|
+
return val;
|
|
467
|
+
}
|
|
468
|
+
parseApi(val) {
|
|
469
|
+
return val;
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
exports.AgentsCommand = AgentsCommand;
|
|
473
|
+
__decorate([
|
|
474
|
+
(0, nest_commander_1.Option)({
|
|
475
|
+
flags: '--api-key <key>',
|
|
476
|
+
description: 'API key override (uses saved config if not provided)',
|
|
477
|
+
}),
|
|
478
|
+
__metadata("design:type", Function),
|
|
479
|
+
__metadata("design:paramtypes", [String]),
|
|
480
|
+
__metadata("design:returntype", String)
|
|
481
|
+
], AgentsCommand.prototype, "parseApiKey", null);
|
|
482
|
+
__decorate([
|
|
483
|
+
(0, nest_commander_1.Option)({
|
|
484
|
+
flags: '--api <url>',
|
|
485
|
+
description: `API URL override (default: ${config_1.DEFAULT_API_URL})`,
|
|
486
|
+
}),
|
|
487
|
+
__metadata("design:type", Function),
|
|
488
|
+
__metadata("design:paramtypes", [String]),
|
|
489
|
+
__metadata("design:returntype", String)
|
|
490
|
+
], AgentsCommand.prototype, "parseApi", null);
|
|
491
|
+
exports.AgentsCommand = AgentsCommand = __decorate([
|
|
492
|
+
(0, nest_commander_1.Command)({
|
|
493
|
+
name: 'agents',
|
|
494
|
+
aliases: ['agent'],
|
|
495
|
+
arguments: '<action> [data]',
|
|
496
|
+
description: 'Manage AI agents.\n' +
|
|
497
|
+
'Actions:\n' +
|
|
498
|
+
' list List agents and select active one\n' +
|
|
499
|
+
' get Display active agent\n' +
|
|
500
|
+
' create <json> Create agent\n' +
|
|
501
|
+
' update <json> Update active agent\n' +
|
|
502
|
+
' delete Remove active agent\n' +
|
|
503
|
+
' clone Clone agent repository (download)\n' +
|
|
504
|
+
' duplicate Duplicate agent on server\n' +
|
|
505
|
+
' deploy Deploy agent with local changes',
|
|
506
|
+
})
|
|
507
|
+
], AgentsCommand);
|
|
508
|
+
//# sourceMappingURL=agents.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.command.js","sourceRoot":"","sources":["../../../src/commands/agents/agents.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
interface ConnectorsOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
api?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ConnectorsCommand extends CommandRunner {
|
|
7
|
+
run(inputs: string[], options: ConnectorsOptions): Promise<void>;
|
|
8
|
+
parseApiKey(val: string): string;
|
|
9
|
+
parseApi(val: string): string;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ConnectorsCommand = void 0;
|
|
13
|
+
const nest_commander_1 = require("nest-commander");
|
|
14
|
+
const config_1 = require("../../common/config");
|
|
15
|
+
const ui_1 = require("../../common/ui");
|
|
16
|
+
const logger_1 = require("../../common/logger");
|
|
17
|
+
const api_client_1 = require("../../common/api-client");
|
|
18
|
+
let ConnectorsCommand = class ConnectorsCommand extends nest_commander_1.CommandRunner {
|
|
19
|
+
async run(inputs, options) {
|
|
20
|
+
const [action] = inputs;
|
|
21
|
+
if (action !== 'list') {
|
|
22
|
+
(0, logger_1.logError)('Action required: list');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const apiClient = (0, api_client_1.createApiClient)(options.api);
|
|
27
|
+
(0, logger_1.logVerbose)('Fetching connectors...');
|
|
28
|
+
const res = await apiClient.get('/connectors');
|
|
29
|
+
const connectors = res.data.data ?? res.data;
|
|
30
|
+
const selected = await (0, ui_1.selectItem)(connectors, 'Select a connector:');
|
|
31
|
+
(0, logger_1.logJson)([selected]);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
(0, logger_1.logError)(error.message || config_1.ERROR_MESSAGES.REQUEST_FAILED(error.toString()));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
parseApiKey(val) {
|
|
38
|
+
return val;
|
|
39
|
+
}
|
|
40
|
+
parseApi(val) {
|
|
41
|
+
return val;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.ConnectorsCommand = ConnectorsCommand;
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, nest_commander_1.Option)({
|
|
47
|
+
flags: '--api-key <key>',
|
|
48
|
+
description: 'API key override (uses saved config if not provided)',
|
|
49
|
+
}),
|
|
50
|
+
__metadata("design:type", Function),
|
|
51
|
+
__metadata("design:paramtypes", [String]),
|
|
52
|
+
__metadata("design:returntype", String)
|
|
53
|
+
], ConnectorsCommand.prototype, "parseApiKey", null);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, nest_commander_1.Option)({
|
|
56
|
+
flags: '--api <url>',
|
|
57
|
+
description: `API URL override (default: ${config_1.DEFAULT_API_URL})`,
|
|
58
|
+
}),
|
|
59
|
+
__metadata("design:type", Function),
|
|
60
|
+
__metadata("design:paramtypes", [String]),
|
|
61
|
+
__metadata("design:returntype", String)
|
|
62
|
+
], ConnectorsCommand.prototype, "parseApi", null);
|
|
63
|
+
exports.ConnectorsCommand = ConnectorsCommand = __decorate([
|
|
64
|
+
(0, nest_commander_1.Command)({
|
|
65
|
+
name: 'connectors',
|
|
66
|
+
arguments: '<action>',
|
|
67
|
+
description: 'Manage external connectors.\n' +
|
|
68
|
+
'Actions:\n' +
|
|
69
|
+
' list List external connectors',
|
|
70
|
+
})
|
|
71
|
+
], ConnectorsCommand);
|
|
72
|
+
//# sourceMappingURL=connectors.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectors.command.js","sourceRoot":"","sources":["../../../src/commands/connectors/connectors.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mDAAgE;AAChE,gDAAsE;AACtE,wCAA6C;AAC7C,gDAAyE;AACzE,wDAA0D;AAenD,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,8BAAa;IAClD,KAAK,CAAC,GAAG,CAAC,MAAgB,EAAE,OAA0B;QACpD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAExB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAA,iBAAQ,EAAC,uBAAuB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,4BAAe,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAE/C,IAAA,mBAAU,EAAC,wBAAwB,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAU,EAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;YACrE,IAAA,gBAAO,EAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAA,iBAAQ,EAAC,KAAK,CAAC,OAAO,IAAI,uBAAc,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAMD,WAAW,CAAC,GAAW;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAMD,QAAQ,CAAC,GAAW;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAA;AArCY,8CAAiB;AA0B5B;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,sDAAsD;KACpE,CAAC;;;;oDAGD;AAMD;IAJC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,8BAA8B,wBAAe,GAAG;KAC9D,CAAC;;;;iDAGD;4BApCU,iBAAiB;IAR7B,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,UAAU;QACrB,WAAW,EACT,+BAA+B;YAC/B,YAAY;YACZ,iDAAiD;KACpD,CAAC;GACW,iBAAiB,CAqC7B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CommandRunner } from 'nest-commander';
|
|
2
|
+
interface CredentialsOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
api?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CredentialsCommand extends CommandRunner {
|
|
7
|
+
run(inputs: string[], options: CredentialsOptions): Promise<void>;
|
|
8
|
+
parseApiKey(val: string): string;
|
|
9
|
+
parseApi(val: string): string;
|
|
10
|
+
}
|
|
11
|
+
export {};
|