import ora from 'ora' import { getCliClient } from '../cli-client.js' import { agentAndWait } from '../agent.js' import { loadReferenceImages } from './reference-images.js' import { assetVersionRef } from '../output.js' import type { AgentResult } from '../schemas.js' export interface AgentCommandOptions { /** `--reference-image` values: file paths or http(s) URLs. */ referenceImages?: string[] json?: boolean baseUrl?: string } export async function agentCommand(goal: string, opts: AgentCommandOptions): Promise { const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true }) const referenceImages = await loadReferenceImages(opts.referenceImages ?? []) const spinner = ora({ text: `Working on "${goal}"`, isEnabled: Boolean(process.stderr.isTTY), isSilent: !process.stderr.isTTY, }).start() const result = await agentAndWait(client, { goal, referenceImages: referenceImages.length ? referenceImages : undefined, }).finally(() => spinner.stop()) printResult(result, opts.json ?? false) } function printResult(result: AgentResult, asJson: boolean): void { if (asJson) { console.log(JSON.stringify(result)) return } const { assets, notes } = result if (assets.length === 0) { console.log('No fitting assets found.') } else { console.log(`Assembled ${assets.length} asset${assets.length === 1 ? '' : 's'}:`) for (const asset of assets) { const note = asset.notes ? ` — ${asset.notes}` : '' console.log(`- ${assetVersionRef(asset.name, asset.version)}${note}`) } console.log(`Install: market install ${assets.map((asset) => asset.name).join(' ')}`) } if (notes) { console.log(`Notes: ${notes}`) } }