@vigilbase/cli
Version:
Vigilbase CLI — security scanners, agent tools, and Vigilbase One from the terminal.
76 lines (75 loc) • 3.31 kB
JavaScript
import { z } from 'zod';
import { limitValue, toolNameSchema, validateArguments } from './legacy-validation.js';
import { asArray, asRecord, ok, outputJson, requireOneClient, withSpinner, } from './helpers.js';
export const handleRuns = async (ctx) => {
const subcommand = (ctx.rest[0] ?? 'list').toLowerCase();
let limit, toolName;
if (subcommand === 'list' || subcommand === 'ls') {
validateArguments(ctx, ctx.rest[0] === undefined ? 0 : 1, ['tool', 'limit']);
limit = limitValue(ctx.values.limit, 50, 200);
toolName = toolNameSchema.optional().parse(ctx.values.tool);
}
else if (subcommand === 'get' || subcommand === 'show') {
validateArguments(ctx, 2, [], `vigilbase runs ${subcommand} <UUID>`);
z.string().uuid().parse(ctx.rest[1]);
}
else if (z.string().uuid().safeParse(subcommand).success)
validateArguments(ctx, 1);
else
throw new Error('Usage: vigilbase runs [list|get <UUID>]');
const one = await requireOneClient(ctx);
if (subcommand === 'list' || subcommand === 'ls') {
const payload = await withSpinner(ctx, 'Loading tool runs', () => one.listToolRuns({
toolName,
limit,
}));
if (ctx.mode === 'json') {
outputJson(ctx, payload);
return ok();
}
const runs = asArray(payload.data);
if (!runs.length) {
ctx.writer.stdout('No tool runs.');
return ok();
}
for (const raw of runs) {
const run = asRecord(raw);
if (!run)
continue;
ctx.writer.stdout(`${String(run.id).slice(0, 8)} ${String(run.tool_name).padEnd(18)} ${String(run.status).padEnd(10)} ${String(run.grade ?? '-')} ${String(run.target)}`);
}
return ok();
}
if (subcommand === 'get' || subcommand === 'show') {
const id = ctx.rest[1];
if (!id)
throw new Error('Usage: vigilbase runs get <id>');
const payload = await withSpinner(ctx, `Loading run ${id}`, () => one.getToolRun(id));
if (ctx.mode === 'json') {
outputJson(ctx, payload);
return ok();
}
const run = asRecord(payload.data) || payload;
ctx.writer.stdout(`id ${String(run.id)}`);
ctx.writer.stdout(`tool ${String(run.tool_name)}`);
ctx.writer.stdout(`target ${String(run.target)}`);
ctx.writer.stdout(`status ${String(run.status)}`);
if (run.grade)
ctx.writer.stdout(`grade ${String(run.grade)}`);
return ok();
}
// Allow `vigilbase runs <uuid>` as shortcut for get
if (/^[0-9a-f-]{36}$/i.test(subcommand)) {
const payload = await withSpinner(ctx, `Loading run ${subcommand}`, () => one.getToolRun(subcommand));
if (ctx.mode === 'json') {
outputJson(ctx, payload);
return ok();
}
const run = asRecord(payload.data) || payload;
ctx.writer.stdout(`id ${String(run.id)}`);
ctx.writer.stdout(`tool ${String(run.tool_name)}`);
ctx.writer.stdout(`status ${String(run.status)}`);
return ok();
}
throw new Error('Usage: vigilbase runs [list|get <id>] [--tool …] [--limit …] [--json]');
};