UNPKG

@vigilbase/cli

Version:

Vigilbase CLI — security scanners, agent tools, and Vigilbase One from the terminal.

76 lines (75 loc) • 3.31 kB
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]'); };