@genspark/cli 1.0.1
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/README.md +474 -0
- package/dist/client.d.ts +35 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +202 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +116 -0
- package/dist/config.js.map +1 -0
- package/dist/formatter.d.ts +13 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +68 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +613 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +31 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +63 -0
- package/dist/logger.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +15 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +130 -0
- package/dist/updater.js.map +1 -0
- package/package.json +46 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Genspark Tool CLI
|
|
4
|
+
*
|
|
5
|
+
* A command-line interface for Genspark Tool API.
|
|
6
|
+
* Designed for integration with AI agents (e.g., Claude Code).
|
|
7
|
+
*
|
|
8
|
+
* Output conventions:
|
|
9
|
+
* - stderr: Debug info, progress, errors (for human reading)
|
|
10
|
+
* - stdout: API response JSON (for AI agent context)
|
|
11
|
+
*
|
|
12
|
+
* Command Naming Convention:
|
|
13
|
+
* - CLI commands are dynamically generated from server tool schemas
|
|
14
|
+
* - Tool name is always the canonical command name
|
|
15
|
+
* - Aliases provide human-friendly shortcuts (e.g., `search` for `web_search`)
|
|
16
|
+
*
|
|
17
|
+
* Example:
|
|
18
|
+
* Tool name: "web_search" -> Command: `gsk web_search`, Alias: `gsk search`
|
|
19
|
+
* Tool name: "crawler" -> Command: `gsk crawler`, Alias: `gsk crawl`
|
|
20
|
+
*/
|
|
21
|
+
import { Command } from "commander";
|
|
22
|
+
import * as fs from "fs";
|
|
23
|
+
import * as pathModule from "path";
|
|
24
|
+
import { spawn } from "child_process";
|
|
25
|
+
import { ApiClient, unauthenticatedRequest } from "./client.js";
|
|
26
|
+
import { setDebugEnabled, setOutputFormat, debug, info, error as logError, output, } from "./logger.js";
|
|
27
|
+
import { loadConfigFile, saveConfigFile, getConfigPath, loadToolsCache, saveToolsCache, } from "./config.js";
|
|
28
|
+
import { checkForUpdates } from "./updater.js";
|
|
29
|
+
const VERSION = "1.1.0";
|
|
30
|
+
const DEFAULT_BASE_URL = "http://localhost:8582";
|
|
31
|
+
const DEFAULT_TIMEOUT = 300000; // 5 minutes (video generation can be slow)
|
|
32
|
+
// Load config file (lowest priority)
|
|
33
|
+
const fileConfig = loadConfigFile();
|
|
34
|
+
// Create main program
|
|
35
|
+
const program = new Command();
|
|
36
|
+
program
|
|
37
|
+
.name("gsk")
|
|
38
|
+
.description("Genspark Tool CLI - Search, crawl, analyze, and generate media")
|
|
39
|
+
.version(VERSION)
|
|
40
|
+
.option("--api-key <key>", "API key (or set GSK_API_KEY env var)")
|
|
41
|
+
.option("--base-url <url>", `Base URL for API (default: ${DEFAULT_BASE_URL})`, DEFAULT_BASE_URL)
|
|
42
|
+
.option("--project-id <id>", "Project ID for access control (or set GSK_PROJECT_ID env var)")
|
|
43
|
+
.option("--debug", "Enable debug output and request more details from server", false)
|
|
44
|
+
.option("--timeout <ms>", "Request timeout in milliseconds", String(DEFAULT_TIMEOUT))
|
|
45
|
+
.option("--output <format>", "Output format: json or text", "json")
|
|
46
|
+
.option("--refresh", "Force refresh of cached tool schemas from server");
|
|
47
|
+
/**
|
|
48
|
+
* Get global options with priority:
|
|
49
|
+
* 1. Command-line options (highest)
|
|
50
|
+
* 2. Environment variables
|
|
51
|
+
* 3. Config file (~/.genspark-tool-cli/config.json) (lowest)
|
|
52
|
+
*/
|
|
53
|
+
function getGlobalOptions() {
|
|
54
|
+
const opts = program.opts();
|
|
55
|
+
// API key priority: CLI > env > config file
|
|
56
|
+
const apiKey = opts.apiKey || process.env.GSK_API_KEY || fileConfig.api_key;
|
|
57
|
+
// Base URL priority: CLI > env > config file > default
|
|
58
|
+
const baseUrl = opts.baseUrl !== DEFAULT_BASE_URL
|
|
59
|
+
? opts.baseUrl
|
|
60
|
+
: process.env.GSK_BASE_URL || fileConfig.base_url || DEFAULT_BASE_URL;
|
|
61
|
+
// Timeout priority: CLI > config file > default
|
|
62
|
+
const timeout = opts.timeout !== String(DEFAULT_TIMEOUT)
|
|
63
|
+
? parseInt(opts.timeout, 10)
|
|
64
|
+
: fileConfig.timeout || DEFAULT_TIMEOUT;
|
|
65
|
+
// Debug priority: CLI > config file > default
|
|
66
|
+
const debugMode = opts.debug || fileConfig.debug || false;
|
|
67
|
+
// Project ID priority: CLI > env > config file
|
|
68
|
+
const projectId = opts.projectId || process.env.GSK_PROJECT_ID || fileConfig.project_id;
|
|
69
|
+
return {
|
|
70
|
+
apiKey,
|
|
71
|
+
baseUrl,
|
|
72
|
+
debug: debugMode,
|
|
73
|
+
timeout,
|
|
74
|
+
output: opts.output,
|
|
75
|
+
projectId,
|
|
76
|
+
refresh: opts.refresh || false,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function createClient() {
|
|
80
|
+
const options = getGlobalOptions();
|
|
81
|
+
setDebugEnabled(options.debug);
|
|
82
|
+
setOutputFormat(options.output);
|
|
83
|
+
if (!options.apiKey) {
|
|
84
|
+
logError("API key is required. Provide it via:");
|
|
85
|
+
logError(" 1. --api-key option");
|
|
86
|
+
logError(" 2. GSK_API_KEY environment variable");
|
|
87
|
+
logError(` 3. Config file: ${getConfigPath()}`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
debug(`Base URL: ${options.baseUrl}`);
|
|
91
|
+
debug(`Timeout: ${options.timeout}ms`);
|
|
92
|
+
debug(`Debug mode: ${options.debug}`);
|
|
93
|
+
debug(`Project ID: ${options.projectId || "(not set)"}`);
|
|
94
|
+
return new ApiClient(options);
|
|
95
|
+
}
|
|
96
|
+
// ============================================
|
|
97
|
+
// Shared helpers for local file handling
|
|
98
|
+
// ============================================
|
|
99
|
+
const CONTENT_TYPE_MAP = {
|
|
100
|
+
".jpg": "image/jpeg",
|
|
101
|
+
".jpeg": "image/jpeg",
|
|
102
|
+
".png": "image/png",
|
|
103
|
+
".gif": "image/gif",
|
|
104
|
+
".webp": "image/webp",
|
|
105
|
+
".pdf": "application/pdf",
|
|
106
|
+
".txt": "text/plain",
|
|
107
|
+
".json": "application/json",
|
|
108
|
+
".html": "text/html",
|
|
109
|
+
".css": "text/css",
|
|
110
|
+
".js": "application/javascript",
|
|
111
|
+
".ts": "application/typescript",
|
|
112
|
+
".md": "text/markdown",
|
|
113
|
+
".xml": "application/xml",
|
|
114
|
+
".csv": "text/csv",
|
|
115
|
+
".zip": "application/zip",
|
|
116
|
+
".mp3": "audio/mpeg",
|
|
117
|
+
".mp4": "video/mp4",
|
|
118
|
+
".wav": "audio/wav",
|
|
119
|
+
".webm": "video/webm",
|
|
120
|
+
};
|
|
121
|
+
async function uploadLocalFile(filePath, client) {
|
|
122
|
+
const fileName = pathModule.basename(filePath);
|
|
123
|
+
const ext = pathModule.extname(filePath).toLowerCase();
|
|
124
|
+
const contentType = CONTENT_TYPE_MAP[ext] || "application/octet-stream";
|
|
125
|
+
const stats = fs.statSync(filePath);
|
|
126
|
+
info(`Uploading ${fileName} (${(stats.size / 1024).toFixed(1)} KB, ${contentType})...`);
|
|
127
|
+
const globalOpts = getGlobalOptions();
|
|
128
|
+
const uploadUrlResult = await client.getUploadUrl({
|
|
129
|
+
content_type: contentType,
|
|
130
|
+
name: fileName,
|
|
131
|
+
project_id: globalOpts.projectId,
|
|
132
|
+
});
|
|
133
|
+
if (uploadUrlResult.status !== "ok" || !uploadUrlResult.data) {
|
|
134
|
+
throw new Error(`Failed to get upload URL: ${uploadUrlResult.message}`);
|
|
135
|
+
}
|
|
136
|
+
const { upload_url, file_wrapper_url } = uploadUrlResult.data;
|
|
137
|
+
debug(`Upload URL: ${upload_url.substring(0, 80)}...`);
|
|
138
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
139
|
+
const uploadResponse = await fetch(upload_url, {
|
|
140
|
+
method: "PUT",
|
|
141
|
+
headers: { "Content-Type": contentType, "x-ms-blob-type": "BlockBlob" },
|
|
142
|
+
body: fileBuffer,
|
|
143
|
+
});
|
|
144
|
+
if (!uploadResponse.ok)
|
|
145
|
+
throw new Error(`Upload failed: HTTP ${uploadResponse.status}`);
|
|
146
|
+
info(`Uploaded → ${file_wrapper_url}`);
|
|
147
|
+
return file_wrapper_url;
|
|
148
|
+
}
|
|
149
|
+
async function downloadToFile(wrapperUrl, savePath, client) {
|
|
150
|
+
info(`Downloading to ${savePath}...`);
|
|
151
|
+
const result = await client.getDownloadUrl({ file_wrapper_url: wrapperUrl });
|
|
152
|
+
if (result.status !== "ok" || !result.data)
|
|
153
|
+
throw new Error(`Failed to get download URL: ${result.message}`);
|
|
154
|
+
const resp = await fetch(result.data.download_url);
|
|
155
|
+
if (!resp.ok)
|
|
156
|
+
throw new Error(`Download failed: HTTP ${resp.status}`);
|
|
157
|
+
const buffer = Buffer.from(await resp.arrayBuffer());
|
|
158
|
+
fs.writeFileSync(savePath, buffer);
|
|
159
|
+
info(`Downloaded ${(buffer.length / 1024).toFixed(1)} KB → ${savePath}`);
|
|
160
|
+
return pathModule.resolve(savePath);
|
|
161
|
+
}
|
|
162
|
+
function isLocalFilePath(value) {
|
|
163
|
+
return (!value.startsWith("http://") &&
|
|
164
|
+
!value.startsWith("https://") &&
|
|
165
|
+
!value.startsWith("/api/") &&
|
|
166
|
+
fs.existsSync(value));
|
|
167
|
+
}
|
|
168
|
+
async function resolveFileArg(value, client) {
|
|
169
|
+
if (!isLocalFilePath(value))
|
|
170
|
+
return value;
|
|
171
|
+
return await uploadLocalFile(value, client);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Resolve local file paths to uploaded URLs in tool arguments.
|
|
175
|
+
* Convention: parameter names ending with '_urls' (arrays) or '_url'/'url' (strings)
|
|
176
|
+
* are checked for local file paths and auto-uploaded.
|
|
177
|
+
*/
|
|
178
|
+
async function resolveLocalFiles(args, client) {
|
|
179
|
+
const resolved = { ...args };
|
|
180
|
+
for (const [key, value] of Object.entries(resolved)) {
|
|
181
|
+
// Handle array of URLs (e.g., image_urls)
|
|
182
|
+
if (key.endsWith("_urls") && Array.isArray(value)) {
|
|
183
|
+
const resolvedUrls = [];
|
|
184
|
+
for (const item of value) {
|
|
185
|
+
if (typeof item === "string") {
|
|
186
|
+
resolvedUrls.push(await resolveFileArg(item, client));
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
resolvedUrls.push(item);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
resolved[key] = resolvedUrls;
|
|
193
|
+
}
|
|
194
|
+
// Handle single URL (e.g., url, audio_url)
|
|
195
|
+
else if ((key === "url" || key.endsWith("_url")) &&
|
|
196
|
+
typeof value === "string") {
|
|
197
|
+
resolved[key] = await resolveFileArg(value, client);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return resolved;
|
|
201
|
+
}
|
|
202
|
+
// ============================================
|
|
203
|
+
// Dynamic tool command registration
|
|
204
|
+
// ============================================
|
|
205
|
+
/**
|
|
206
|
+
* Extract a file URL from nested result data using dot-separated path keys.
|
|
207
|
+
* Tries each key in order, returns the first non-empty string found.
|
|
208
|
+
*/
|
|
209
|
+
function extractFileUrl(data, keys) {
|
|
210
|
+
for (const key of keys) {
|
|
211
|
+
let current = data;
|
|
212
|
+
for (const part of key.split(".")) {
|
|
213
|
+
if (current == null || typeof current !== "object") {
|
|
214
|
+
current = undefined;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
current = current[part];
|
|
218
|
+
}
|
|
219
|
+
if (typeof current === "string" && current.length > 0)
|
|
220
|
+
return current;
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Register a dynamic tool command from a server-provided schema
|
|
226
|
+
*/
|
|
227
|
+
function registerToolCommand(parentProgram, tool, clientFactory) {
|
|
228
|
+
const cmd = parentProgram.command(tool.name).description(tool.description);
|
|
229
|
+
// Register aliases
|
|
230
|
+
for (const alias of tool.cli.aliases) {
|
|
231
|
+
cmd.alias(alias);
|
|
232
|
+
}
|
|
233
|
+
const props = tool.parameters?.properties || {};
|
|
234
|
+
const required = tool.parameters?.required || [];
|
|
235
|
+
// If primary_arg is set, make it a positional argument
|
|
236
|
+
if (tool.cli.primary_arg && props[tool.cli.primary_arg]) {
|
|
237
|
+
const param = props[tool.cli.primary_arg];
|
|
238
|
+
const isRequired = required.includes(tool.cli.primary_arg);
|
|
239
|
+
const bracket = isRequired ? "<value>" : "[value]";
|
|
240
|
+
cmd.argument(bracket, param.description || tool.cli.primary_arg);
|
|
241
|
+
}
|
|
242
|
+
// Add remaining params as --options
|
|
243
|
+
const aliases = tool.cli.parameter_aliases || {};
|
|
244
|
+
for (const [name, param] of Object.entries(props)) {
|
|
245
|
+
if (name === tool.cli.primary_arg)
|
|
246
|
+
continue;
|
|
247
|
+
const isRequired = required.includes(name);
|
|
248
|
+
const paramType = Array.isArray(param.type) ? param.type[0] : param.type;
|
|
249
|
+
const shortAlias = aliases[name];
|
|
250
|
+
const shortPrefix = shortAlias ? `-${shortAlias}, ` : "";
|
|
251
|
+
if (paramType === "array") {
|
|
252
|
+
const flag = `${shortPrefix}--${name} <values...>`;
|
|
253
|
+
if (isRequired) {
|
|
254
|
+
cmd.requiredOption(flag, param.description || name);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
cmd.option(flag, param.description || name);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (paramType === "boolean") {
|
|
261
|
+
cmd.option(`${shortPrefix}--${name}`, param.description || name);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const flag = `${shortPrefix}--${name} <value>`;
|
|
265
|
+
if (isRequired) {
|
|
266
|
+
cmd.requiredOption(flag, param.description || name);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
cmd.option(flag, param.description || name);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Add -o/--output-file option for tools that produce downloadable files
|
|
274
|
+
const outputFileKeys = tool.cli.output_file_keys || [];
|
|
275
|
+
if (outputFileKeys.length > 0) {
|
|
276
|
+
cmd.option("-o, --output-file <path>", "Download the generated file to a local path");
|
|
277
|
+
}
|
|
278
|
+
// Generic action handler
|
|
279
|
+
cmd.action(async (primaryArgValue, opts) => {
|
|
280
|
+
// Commander passes opts as second arg when there's an argument,
|
|
281
|
+
// or as first arg when there's no argument
|
|
282
|
+
if (typeof primaryArgValue === "object" && primaryArgValue !== null) {
|
|
283
|
+
opts = primaryArgValue;
|
|
284
|
+
primaryArgValue = undefined;
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
const client = clientFactory();
|
|
288
|
+
// Extract and remove client-side-only options before sending to API
|
|
289
|
+
const outputFilePath = opts.outputFile;
|
|
290
|
+
delete opts.outputFile;
|
|
291
|
+
const args = { ...opts };
|
|
292
|
+
// Set primary arg
|
|
293
|
+
if (tool.cli.primary_arg && primaryArgValue !== undefined) {
|
|
294
|
+
args[tool.cli.primary_arg] = primaryArgValue;
|
|
295
|
+
}
|
|
296
|
+
// Coerce numeric strings to numbers based on schema
|
|
297
|
+
for (const [name, param] of Object.entries(props)) {
|
|
298
|
+
if (args[name] !== undefined) {
|
|
299
|
+
const paramType = Array.isArray(param.type)
|
|
300
|
+
? param.type[0]
|
|
301
|
+
: param.type;
|
|
302
|
+
if (paramType === "integer" || paramType === "number") {
|
|
303
|
+
const num = Number(args[name]);
|
|
304
|
+
if (!isNaN(num)) {
|
|
305
|
+
args[name] = paramType === "integer" ? Math.floor(num) : num;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Resolve local file paths to uploaded URLs
|
|
311
|
+
const resolvedArgs = await resolveLocalFiles(args, client);
|
|
312
|
+
const result = await client.executeTool(tool.name, resolvedArgs);
|
|
313
|
+
// If -o was specified and tool succeeded, download the output file
|
|
314
|
+
if (outputFilePath &&
|
|
315
|
+
outputFileKeys.length > 0 &&
|
|
316
|
+
result.status === "ok" &&
|
|
317
|
+
result.data &&
|
|
318
|
+
typeof result.data === "object") {
|
|
319
|
+
const fileUrl = extractFileUrl(result.data, outputFileKeys);
|
|
320
|
+
if (fileUrl) {
|
|
321
|
+
const localPath = await downloadToFile(fileUrl, outputFilePath, client);
|
|
322
|
+
result.data.local_path = localPath;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
info("Warning: Could not find a file URL in the result to download");
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
output(result);
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
logError(err.message);
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
// ============================================
|
|
337
|
+
// Built-in Commands
|
|
338
|
+
// ============================================
|
|
339
|
+
// List tools
|
|
340
|
+
program
|
|
341
|
+
.command("list-tools")
|
|
342
|
+
.alias("ls")
|
|
343
|
+
.description("List all available tools")
|
|
344
|
+
.action(async () => {
|
|
345
|
+
try {
|
|
346
|
+
const client = createClient();
|
|
347
|
+
const result = await client.listTools();
|
|
348
|
+
output(result);
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
logError(err.message);
|
|
352
|
+
process.exit(1);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
// Upload file - get upload URL, upload file, return file wrapper URL
|
|
356
|
+
program
|
|
357
|
+
.command("upload")
|
|
358
|
+
.description("Upload a local file and get a file wrapper URL")
|
|
359
|
+
.argument("<file>", "Local file path to upload")
|
|
360
|
+
.action(async (filePath) => {
|
|
361
|
+
try {
|
|
362
|
+
if (!fs.existsSync(filePath)) {
|
|
363
|
+
logError(`File not found: ${filePath}`);
|
|
364
|
+
process.exit(1);
|
|
365
|
+
}
|
|
366
|
+
const client = createClient();
|
|
367
|
+
const file_wrapper_url = await uploadLocalFile(filePath, client);
|
|
368
|
+
const fileName = pathModule.basename(filePath);
|
|
369
|
+
const ext = pathModule.extname(filePath).toLowerCase();
|
|
370
|
+
const contentType = CONTENT_TYPE_MAP[ext] || "application/octet-stream";
|
|
371
|
+
const stats = fs.statSync(filePath);
|
|
372
|
+
output({
|
|
373
|
+
status: "ok",
|
|
374
|
+
message: "File uploaded successfully",
|
|
375
|
+
data: {
|
|
376
|
+
file_wrapper_url,
|
|
377
|
+
file_name: fileName,
|
|
378
|
+
content_type: contentType,
|
|
379
|
+
size_bytes: stats.size,
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
logError(err.message);
|
|
385
|
+
process.exit(1);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
// Download file - get download URL from file wrapper URL
|
|
389
|
+
program
|
|
390
|
+
.command("download")
|
|
391
|
+
.description("Get a download URL for a file wrapper URL")
|
|
392
|
+
.argument("<file_wrapper_url>", "File wrapper URL (e.g., /api/files/s/xxxxx)")
|
|
393
|
+
.option("-s, --save <path>", "Download and save to local file path")
|
|
394
|
+
.action(async (fileWrapperUrl, opts) => {
|
|
395
|
+
try {
|
|
396
|
+
const client = createClient();
|
|
397
|
+
const result = await client.getDownloadUrl({
|
|
398
|
+
file_wrapper_url: fileWrapperUrl,
|
|
399
|
+
});
|
|
400
|
+
if (result.status !== "ok" || !result.data) {
|
|
401
|
+
logError(`Failed to get download URL: ${result.message}`);
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
// If save path specified, download using the already-fetched URL
|
|
405
|
+
if (opts.save) {
|
|
406
|
+
info(`Downloading to ${opts.save}...`);
|
|
407
|
+
const resp = await fetch(result.data.download_url);
|
|
408
|
+
if (!resp.ok)
|
|
409
|
+
throw new Error(`Download failed: HTTP ${resp.status}`);
|
|
410
|
+
const buffer = Buffer.from(await resp.arrayBuffer());
|
|
411
|
+
fs.writeFileSync(opts.save, buffer);
|
|
412
|
+
const localPath = pathModule.resolve(opts.save);
|
|
413
|
+
info(`Downloaded ${(buffer.length / 1024).toFixed(1)} KB → ${localPath}`);
|
|
414
|
+
output({
|
|
415
|
+
status: "ok",
|
|
416
|
+
message: "File downloaded successfully",
|
|
417
|
+
data: {
|
|
418
|
+
...result.data,
|
|
419
|
+
local_path: localPath,
|
|
420
|
+
size_bytes: buffer.length,
|
|
421
|
+
},
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
// Just output the download URL
|
|
426
|
+
output(result);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
logError(err.message);
|
|
431
|
+
process.exit(1);
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
// Login - browser-based device flow authentication
|
|
435
|
+
program
|
|
436
|
+
.command("login")
|
|
437
|
+
.description("Log in to Genspark via browser to obtain an API key")
|
|
438
|
+
.action(async () => {
|
|
439
|
+
const globalOpts = getGlobalOptions();
|
|
440
|
+
setDebugEnabled(globalOpts.debug);
|
|
441
|
+
setOutputFormat(globalOpts.output);
|
|
442
|
+
const baseUrl = globalOpts.baseUrl;
|
|
443
|
+
try {
|
|
444
|
+
// Step 1: Request device code
|
|
445
|
+
info("Requesting device code...");
|
|
446
|
+
const deviceResp = await unauthenticatedRequest(baseUrl, "/api/cli_auth/device_code", "POST");
|
|
447
|
+
const { device_code, auth_url, poll_interval, expires_in } = deviceResp;
|
|
448
|
+
// Step 2: Open browser (use spawn to avoid shell command injection)
|
|
449
|
+
info("Opening browser for login...");
|
|
450
|
+
info(`Login URL: ${auth_url}`);
|
|
451
|
+
// Validate auth_url is a same-origin HTTP(S) URL before passing to spawn
|
|
452
|
+
try {
|
|
453
|
+
const parsed = new URL(auth_url);
|
|
454
|
+
const base = new URL(baseUrl);
|
|
455
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
456
|
+
throw new Error("auth_url is not http(s)");
|
|
457
|
+
}
|
|
458
|
+
if (parsed.host !== base.host) {
|
|
459
|
+
throw new Error("auth_url host does not match baseUrl host");
|
|
460
|
+
}
|
|
461
|
+
let cmd;
|
|
462
|
+
let args;
|
|
463
|
+
if (process.platform === "win32") {
|
|
464
|
+
// Avoid cmd.exe which interprets & in URLs as command separators
|
|
465
|
+
cmd = "rundll32";
|
|
466
|
+
args = ["url.dll,FileProtocolHandler", auth_url];
|
|
467
|
+
}
|
|
468
|
+
else if (process.platform === "darwin") {
|
|
469
|
+
cmd = "open";
|
|
470
|
+
args = [auth_url];
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
cmd = "xdg-open";
|
|
474
|
+
args = [auth_url];
|
|
475
|
+
}
|
|
476
|
+
const child = spawn(cmd, args, { stdio: "ignore", detached: true });
|
|
477
|
+
child.on("error", () => {
|
|
478
|
+
info("Could not open browser automatically.");
|
|
479
|
+
info("Please open the URL above manually.");
|
|
480
|
+
});
|
|
481
|
+
child.unref();
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
info("Could not open browser automatically.");
|
|
485
|
+
info("Please open the URL above manually.");
|
|
486
|
+
}
|
|
487
|
+
info(`Waiting for authorization (expires in ${expires_in}s, press Ctrl+C to cancel)...`);
|
|
488
|
+
// Step 3: Poll for token
|
|
489
|
+
const startTime = Date.now();
|
|
490
|
+
const timeoutMs = expires_in * 1000;
|
|
491
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
492
|
+
await new Promise((resolve) => setTimeout(resolve, poll_interval * 1000));
|
|
493
|
+
const elapsedSec = Math.round((Date.now() - startTime) / 1000);
|
|
494
|
+
const remainingSec = expires_in - elapsedSec;
|
|
495
|
+
const tokenResp = await unauthenticatedRequest(baseUrl, `/api/cli_auth/token?code=${encodeURIComponent(device_code)}`, "GET");
|
|
496
|
+
if (tokenResp.status === "approved" && tokenResp.api_key) {
|
|
497
|
+
// Save to config
|
|
498
|
+
const config = loadConfigFile();
|
|
499
|
+
config.api_key = tokenResp.api_key;
|
|
500
|
+
saveConfigFile(config);
|
|
501
|
+
info("Login successful! API key saved.");
|
|
502
|
+
output({
|
|
503
|
+
status: "ok",
|
|
504
|
+
message: "Login successful",
|
|
505
|
+
data: { config_path: getConfigPath() },
|
|
506
|
+
});
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (tokenResp.status === "expired") {
|
|
510
|
+
logError("Authorization expired. Please try again.");
|
|
511
|
+
process.exit(1);
|
|
512
|
+
}
|
|
513
|
+
// status === "pending" — keep polling with countdown
|
|
514
|
+
info(`Still waiting for authorization... (${remainingSec}s remaining)`);
|
|
515
|
+
}
|
|
516
|
+
logError("Authorization timed out. Please try again.");
|
|
517
|
+
process.exit(1);
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
logError(err.message);
|
|
521
|
+
process.exit(1);
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
// Logout - remove API key from config
|
|
525
|
+
program
|
|
526
|
+
.command("logout")
|
|
527
|
+
.description("Log out by removing the saved API key")
|
|
528
|
+
.action(() => {
|
|
529
|
+
const globalOpts = getGlobalOptions();
|
|
530
|
+
setDebugEnabled(globalOpts.debug);
|
|
531
|
+
setOutputFormat(globalOpts.output);
|
|
532
|
+
try {
|
|
533
|
+
const config = loadConfigFile();
|
|
534
|
+
if (!config.api_key) {
|
|
535
|
+
info("Already logged out (no API key in config).");
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
delete config.api_key;
|
|
539
|
+
saveConfigFile(config);
|
|
540
|
+
info("Logged out. API key removed.");
|
|
541
|
+
output({
|
|
542
|
+
status: "ok",
|
|
543
|
+
message: "Logged out",
|
|
544
|
+
data: { config_path: getConfigPath() },
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
catch (err) {
|
|
548
|
+
logError(err.message);
|
|
549
|
+
process.exit(1);
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
// ============================================
|
|
553
|
+
// Dynamic Tool Registration & Startup
|
|
554
|
+
// ============================================
|
|
555
|
+
async function main() {
|
|
556
|
+
// Check for updates (non-blocking — failures are silently ignored)
|
|
557
|
+
try {
|
|
558
|
+
await checkForUpdates(VERSION);
|
|
559
|
+
}
|
|
560
|
+
catch {
|
|
561
|
+
// Never block CLI execution due to update check failures
|
|
562
|
+
}
|
|
563
|
+
// Pre-parse global options before program.parse() so --refresh, --debug etc. work
|
|
564
|
+
program.parseOptions(process.argv);
|
|
565
|
+
const globalOpts = getGlobalOptions();
|
|
566
|
+
setDebugEnabled(globalOpts.debug);
|
|
567
|
+
setOutputFormat(globalOpts.output);
|
|
568
|
+
const baseUrl = globalOpts.baseUrl;
|
|
569
|
+
const forceRefresh = globalOpts.refresh || false;
|
|
570
|
+
// Try to load tools from cache
|
|
571
|
+
let tools = forceRefresh
|
|
572
|
+
? null
|
|
573
|
+
: loadToolsCache(baseUrl);
|
|
574
|
+
if (tools) {
|
|
575
|
+
debug(`Loaded ${tools.length} tools from cache`);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
// Need to fetch from server
|
|
579
|
+
debug(forceRefresh
|
|
580
|
+
? "Force refreshing tools from server..."
|
|
581
|
+
: "No cached tools found, fetching from server...");
|
|
582
|
+
// Only fetch if we have an API key
|
|
583
|
+
if (globalOpts.apiKey) {
|
|
584
|
+
try {
|
|
585
|
+
const client = new ApiClient(globalOpts);
|
|
586
|
+
const result = await client.listTools();
|
|
587
|
+
tools = result.tools;
|
|
588
|
+
saveToolsCache(baseUrl, tools);
|
|
589
|
+
debug(`Fetched and cached ${tools.length} tools from server`);
|
|
590
|
+
}
|
|
591
|
+
catch (err) {
|
|
592
|
+
debug(`Failed to fetch tools: ${err.message}`);
|
|
593
|
+
// Continue without dynamic commands - built-in commands still work
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
debug("No API key available, skipping tool fetch");
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
// Register dynamic tool commands
|
|
601
|
+
if (tools) {
|
|
602
|
+
for (const tool of tools) {
|
|
603
|
+
registerToolCommand(program, tool, createClient);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
// Parse and run
|
|
607
|
+
program.parse();
|
|
608
|
+
}
|
|
609
|
+
main().catch((err) => {
|
|
610
|
+
logError(err.message);
|
|
611
|
+
process.exit(1);
|
|
612
|
+
});
|
|
613
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger utility - outputs debug/info to stderr, results to stdout
|
|
3
|
+
*/
|
|
4
|
+
export declare function setDebugEnabled(enabled: boolean): void;
|
|
5
|
+
export declare function isDebugEnabled(): boolean;
|
|
6
|
+
export declare function setOutputFormat(format: "json" | "text"): void;
|
|
7
|
+
/**
|
|
8
|
+
* Log debug message to stderr (only when debug is enabled)
|
|
9
|
+
*/
|
|
10
|
+
export declare function debug(message: string, ...args: unknown[]): void;
|
|
11
|
+
/**
|
|
12
|
+
* Log info message to stderr
|
|
13
|
+
*/
|
|
14
|
+
export declare function info(message: string, ...args: unknown[]): void;
|
|
15
|
+
/**
|
|
16
|
+
* Log warning message to stderr
|
|
17
|
+
*/
|
|
18
|
+
export declare function warn(message: string, ...args: unknown[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* Log error message to stderr
|
|
21
|
+
*/
|
|
22
|
+
export declare function error(message: string, ...args: unknown[]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Output final result to stdout (this goes to AI agent context)
|
|
25
|
+
*/
|
|
26
|
+
export declare function output(data: unknown): void;
|
|
27
|
+
/**
|
|
28
|
+
* Output raw JSON to stdout (compact, for machine consumption)
|
|
29
|
+
*/
|
|
30
|
+
export declare function outputJson(data: unknown): void;
|
|
31
|
+
//# sourceMappingURL=logger.d.ts.map
|