artbot 0.1.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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../../../packages/shared-types/src/query.ts", "../../../packages/shared-types/src/record.ts", "../../../packages/shared-types/src/evidence.ts", "../../../packages/shared-types/src/run.ts"],
4
+ "sourcesContent": ["import { spawnSync } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport Table from \"cli-table3\";\nimport { Command, CommanderError } from \"commander\";\nimport ora from \"ora\";\nimport picocolors from \"picocolors\";\nimport { ZodError } from \"zod\";\nimport type { PriceRecord, RunEntity, RunStatus, RunSummary, SourceAttempt } from \"@artbot/shared-types\";\nimport { researchQuerySchema } from \"@artbot/shared-types\";\nimport {\n assessLocalSetup,\n buildAuthCaptureCommand,\n defaultSourceUrlForProfile,\n loadWorkspaceEnv,\n resolveAuthProfilesFromEnv,\n type SetupAssessment\n} from \"./setup/index.js\";\nimport { runSetupWizard } from \"./setup/workflow.js\";\n\nconst EXIT_CODES = {\n OK: 0,\n INPUT: 2,\n API: 3,\n TERMINAL: 4\n} as const;\n\nconst require = createRequire(import.meta.url);\n\ninterface CommonOptions {\n artist: string;\n turkeyFirst?: boolean;\n scope?: \"turkey_only\" | \"turkey_plus_international\";\n analysisMode?: \"comprehensive\" | \"balanced\" | \"fast\";\n priceNormalization?: \"legacy\" | \"usd_dual\" | \"usd_nominal\" | \"usd_2026\";\n year?: string;\n medium?: string;\n title?: string;\n dateFrom?: string;\n dateTo?: string;\n imagePath?: string;\n authProfile?: string;\n cookieFile?: string;\n manualLogin?: boolean;\n allowLicensed?: boolean;\n licensedIntegrations?: string;\n heightCm?: string;\n widthCm?: string;\n depthCm?: string;\n wait?: boolean;\n waitInterval?: string;\n}\n\ninterface RunsListOptions {\n status?: string;\n limit?: string;\n}\n\ninterface RunsShowOptions {\n runId: string;\n}\n\ninterface RunsWatchOptions extends RunsShowOptions {\n interval?: string;\n}\n\ninterface AuthCaptureOptions {\n profileId: string;\n}\n\ninterface GlobalOptions {\n json: boolean;\n apiBaseUrl: string;\n apiKey?: string;\n verbose: boolean;\n quiet: boolean;\n}\n\nexport interface RunDetailsResponse {\n run: RunEntity;\n summary: RunSummary;\n records: PriceRecord[];\n attempts: SourceAttempt[];\n valuation?: unknown;\n duplicates?: PriceRecord[];\n per_painting_stats?: unknown[];\n}\n\ninterface RunsListResponse {\n runs: RunEntity[];\n}\n\ninterface SpinnerLike {\n text: string;\n start: () => SpinnerLike;\n stop: () => SpinnerLike;\n succeed: (text?: string) => SpinnerLike;\n fail: (text?: string) => SpinnerLike;\n}\n\ninterface CliDeps {\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n spinnerFactory?: (text: string) => SpinnerLike;\n stdout?: (text: string) => void;\n stderr?: (text: string) => void;\n}\n\nclass ApiRequestError extends Error {\n constructor(\n readonly status: number,\n readonly body: unknown\n ) {\n super(`HTTP ${status}`);\n }\n}\n\nclass InputValidationError extends Error {}\nclass TerminalStateError extends Error {\n constructor(readonly details: RunDetailsResponse) {\n super(`Run ${details.run.id} ended in a failed or blocked terminal state.`);\n }\n}\n\ninterface CliContext {\n deps: Required<CliDeps>;\n exitCode: number;\n}\n\nfunction toNumber(value?: string): number | undefined {\n if (!value) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction toPositiveInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {\n throw new InputValidationError(`Expected a positive integer, received \"${value}\".`);\n }\n return parsed;\n}\n\nfunction parseRunStatus(value?: string): RunStatus | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n const allowed: RunStatus[] = [\"pending\", \"running\", \"completed\", \"failed\"];\n if (!allowed.includes(normalized as RunStatus)) {\n throw new InputValidationError(`Invalid status \"${value}\". Allowed values: ${allowed.join(\", \")}.`);\n }\n return normalized as RunStatus;\n}\n\nfunction isRunBlocked(details: RunDetailsResponse): boolean {\n const summary = details.summary;\n if (summary.accepted_records > 0) {\n return false;\n }\n return summary.total_records > 0 && (summary.source_status_breakdown.blocked ?? 0) > 0;\n}\n\nfunction isFailedOrBlocked(details: RunDetailsResponse): boolean {\n if (details.run.status === \"failed\") {\n return true;\n }\n return details.run.status === \"completed\" && isRunBlocked(details);\n}\n\nfunction writeLine(writer: (text: string) => void, text: string): void {\n writer(`${text}\\n`);\n}\n\nfunction safeJsonParse(text: string): unknown {\n if (!text) return {};\n return JSON.parse(text);\n}\n\nfunction resolveGlobals(command: Command): GlobalOptions {\n const raw = command.optsWithGlobals() as {\n json?: boolean;\n apiBaseUrl?: string;\n apiKey?: string;\n verbose?: boolean;\n quiet?: boolean;\n };\n\n const globals: GlobalOptions = {\n json: Boolean(raw.json),\n apiBaseUrl: raw.apiBaseUrl ?? process.env.API_BASE_URL ?? \"http://localhost:4000\",\n apiKey: raw.apiKey ?? process.env.ARTBOT_API_KEY,\n verbose: Boolean(raw.verbose),\n quiet: Boolean(raw.quiet)\n };\n\n if (globals.verbose && globals.quiet) {\n throw new InputValidationError(\"Choose either --verbose or --quiet, not both.\");\n }\n\n return globals;\n}\n\nfunction logInfo(globals: GlobalOptions, ctx: CliContext, text: string): void {\n if (globals.json || globals.quiet) return;\n writeLine(ctx.deps.stdout, text);\n}\n\nfunction logVerbose(globals: GlobalOptions, ctx: CliContext, text: string): void {\n if (globals.json || globals.quiet || !globals.verbose) return;\n writeLine(ctx.deps.stderr, picocolors.dim(text));\n}\n\nfunction logError(globals: GlobalOptions, ctx: CliContext, text: string): void {\n if (globals.json) {\n writeLine(ctx.deps.stderr, text);\n return;\n }\n writeLine(ctx.deps.stderr, picocolors.red(text));\n}\n\nfunction printJson(globals: GlobalOptions, ctx: CliContext, payload: unknown): void {\n if (!globals.json) return;\n writeLine(ctx.deps.stdout, JSON.stringify(payload, null, 2));\n}\n\nfunction buildQuery(options: CommonOptions, requireTitle: boolean) {\n if (requireTitle && !options.title) {\n throw new InputValidationError(\"Missing required --title for work research.\");\n }\n\n const query = {\n artist: options.artist,\n title: options.title,\n year: options.year,\n medium: options.medium,\n dimensions:\n options.heightCm || options.widthCm || options.depthCm\n ? {\n heightCm: toNumber(options.heightCm),\n widthCm: toNumber(options.widthCm),\n depthCm: toNumber(options.depthCm)\n }\n : undefined,\n imagePath: options.imagePath,\n dateRange:\n options.dateFrom || options.dateTo\n ? {\n from: options.dateFrom,\n to: options.dateTo\n }\n : undefined,\n scope: options.scope ?? \"turkey_plus_international\",\n turkeyFirst: options.turkeyFirst ?? true,\n analysisMode: options.analysisMode ?? \"comprehensive\",\n priceNormalization: options.priceNormalization ?? \"usd_dual\",\n authProfileId: options.authProfile,\n cookieFile: options.cookieFile,\n manualLoginCheckpoint: options.manualLogin ?? false,\n allowLicensed: options.allowLicensed ?? false,\n licensedIntegrations: options.licensedIntegrations\n ? options.licensedIntegrations\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n : []\n };\n\n return researchQuerySchema.parse(query);\n}\n\nasync function requestJson<T>(\n ctx: CliContext,\n globals: GlobalOptions,\n method: \"GET\" | \"POST\",\n path: string,\n payload?: unknown\n): Promise<T> {\n const response = await ctx.deps.fetchImpl(`${globals.apiBaseUrl}${path}`, {\n method,\n headers: {\n \"content-type\": \"application/json\",\n ...(globals.apiKey ? { \"x-api-key\": globals.apiKey } : {})\n },\n body: payload === undefined ? undefined : JSON.stringify(payload)\n });\n\n const text = await response.text();\n const body = safeJsonParse(text);\n\n if (!response.ok) {\n throw new ApiRequestError(response.status, body);\n }\n\n return body as T;\n}\n\nexport function renderRunsTable(runs: RunEntity[]): string {\n const table = new Table({\n head: [\"Run ID\", \"Type\", \"Status\", \"Artist\", \"Created\"],\n wordWrap: true\n });\n\n for (const run of runs) {\n table.push([\n run.id,\n run.runType,\n run.status,\n run.query.artist,\n new Date(run.createdAt).toLocaleString(\"en-US\")\n ]);\n }\n\n return table.toString();\n}\n\nexport function renderRecordsTable(records: PriceRecord[], limit = 8): string {\n const table = new Table({\n head: [\"Artist\", \"Work\", \"Source\", \"Price Type\", \"Amount\", \"Currency\"],\n wordWrap: true\n });\n\n for (const record of records.slice(0, limit)) {\n table.push([\n record.artist_name,\n record.work_title ?? \"-\",\n record.source_name,\n record.price_type,\n record.price_amount ?? \"-\",\n record.currency ?? \"-\"\n ]);\n }\n\n return table.toString();\n}\n\nexport function renderSummaryTable(summary: RunSummary): string {\n const table = new Table({\n head: [\"Metric\", \"Value\"]\n });\n\n const crawledCoverage =\n summary.priced_crawled_source_coverage_ratio ?? summary.priced_source_coverage_ratio;\n\n table.push(\n [\"Accepted\", summary.accepted_records],\n [\"Rejected\", summary.rejected_candidates],\n [\"Discovered Candidates\", summary.discovered_candidates],\n [\"Accepted from Discovery\", summary.accepted_from_discovery],\n [\n \"Priced Coverage (Crawled)\",\n crawledCoverage != null ? `${Math.round(crawledCoverage * 100)}%` : \"n/a\"\n ],\n [\"Valuation Generated\", summary.valuation_generated ? \"yes\" : \"no\"],\n [\"Valuation Reason\", summary.valuation_reason]\n );\n\n if (summary.priced_crawled_source_coverage_ratio != null && summary.priced_source_coverage_ratio != null) {\n table.push([\"Priced Coverage (Attempted)\", `${Math.round(summary.priced_source_coverage_ratio * 100)}%`]);\n }\n\n return table.toString();\n}\n\nexport function renderBreakdownTable(title: string, values: Record<string, number>): string {\n const table = new Table({\n head: [title, \"Count\"]\n });\n\n for (const [key, value] of Object.entries(values)) {\n table.push([key, value]);\n }\n\n return table.toString();\n}\n\nfunction renderSetupAssessment(assessment: SetupAssessment): string {\n const table = new Table({\n head: [\"Check\", \"Status\", \"Detail\"]\n });\n\n table.push(\n [\n \"LM Studio\",\n assessment.llmHealth.ok ? picocolors.green(\"healthy\") : picocolors.red(\"offline\"),\n assessment.llmHealth.modelId ?? assessment.llmHealth.reason ?? assessment.llmBaseUrl\n ],\n [\n \"ArtBot API\",\n assessment.apiHealth.ok ? picocolors.green(\"healthy\") : picocolors.yellow(\"offline\"),\n assessment.apiHealth.reason ?? assessment.apiBaseUrl\n ],\n [\n \"Local Backend\",\n assessment.localBackendAvailable ? picocolors.green(\"available\") : picocolors.yellow(\"external only\"),\n assessment.workspaceRoot ?? \"No ArtBot workspace detected\"\n ],\n [\n \"Auth Profiles\",\n assessment.authProfilesError ? picocolors.red(\"invalid\") : picocolors.green(String(assessment.profiles.length)),\n assessment.authProfilesError?.message ?? `${assessment.profiles.length} configured`\n ],\n [\n \"Sessions\",\n assessment.sessionStates.length === 0 ? picocolors.yellow(\"none\") : picocolors.green(String(assessment.sessionStates.length)),\n assessment.sessionStates\n .map((session) => `${session.profileId}:${session.exists ? (session.expired ? \"expired\" : \"ready\") : \"missing\"}`)\n .join(\", \") || \"No relevant sessions\"\n ]\n );\n\n return table.toString();\n}\n\nfunction renderSetupIssues(assessment: SetupAssessment): string {\n if (assessment.issues.length === 0) {\n return picocolors.green(\"No setup issues detected.\");\n }\n\n return assessment.issues\n .map((issue) => {\n const prefix = issue.severity === \"error\" ? picocolors.red(\"error\") : picocolors.yellow(\"warning\");\n return `${prefix} ${issue.message}${issue.detail ? ` (${issue.detail})` : \"\"}`;\n })\n .join(\"\\n\");\n}\n\nfunction renderAuthProfilesTable(assessment: SetupAssessment): string {\n const table = new Table({\n head: [\"Profile\", \"Mode\", \"Matched Sources\", \"Storage State\"]\n });\n\n const relevantById = new Map(assessment.relevantProfiles.map((entry) => [entry.profile.id, entry.matchedSources]));\n const sessionsById = new Map(assessment.sessionStates.map((session) => [session.profileId, session]));\n\n for (const profile of assessment.profiles) {\n const session = sessionsById.get(profile.id);\n table.push([\n profile.id,\n profile.mode,\n (relevantById.get(profile.id) ?? []).join(\", \") || \"\u2014\",\n session ? `${session.exists ? (session.expired ? \"expired\" : \"ready\") : \"missing\"} \u00B7 ${session.storageStatePath}` : \"\u2014\"\n ]);\n }\n\n return table.toString();\n}\n\nfunction printRunDetailsHuman(globals: GlobalOptions, ctx: CliContext, details: RunDetailsResponse): void {\n logInfo(globals, ctx, `Run ${details.run.id} (${details.run.runType})`);\n logInfo(globals, ctx, `Status: ${details.run.status}`);\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderSummaryTable(details.summary));\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderBreakdownTable(\"Source Status\", details.summary.source_status_breakdown));\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderBreakdownTable(\"Auth Mode\", details.summary.auth_mode_breakdown));\n if (details.records.length > 0) {\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, \"Top comparable records:\");\n logInfo(globals, ctx, renderRecordsTable(details.records));\n }\n}\n\nasync function waitForRunTerminal(\n ctx: CliContext,\n globals: GlobalOptions,\n runId: string,\n intervalSeconds: number\n): Promise<RunDetailsResponse> {\n const spinner = globals.json || globals.quiet ? null : ctx.deps.spinnerFactory(`Waiting for run ${runId}...`).start();\n let previousStatus: RunStatus | null = null;\n\n while (true) {\n const details = await requestJson<RunDetailsResponse>(ctx, globals, \"GET\", `/runs/${runId}`);\n const status = details.run.status;\n if (spinner) {\n spinner.text = `Run ${runId} status: ${status}`;\n }\n\n if (previousStatus !== status) {\n logVerbose(globals, ctx, `Run ${runId}: ${previousStatus ?? \"unknown\"} -> ${status}`);\n previousStatus = status;\n }\n\n if (status === \"completed\" || status === \"failed\") {\n if (spinner) {\n if (isFailedOrBlocked(details)) {\n spinner.fail(`Run ${runId} ended in failed/blocked state`);\n } else {\n spinner.succeed(`Run ${runId} completed`);\n }\n }\n return details;\n }\n\n await ctx.deps.sleep(intervalSeconds * 1000);\n }\n}\n\nasync function handleResearch(\n ctx: CliContext,\n options: CommonOptions,\n command: Command,\n runType: \"artist\" | \"work\"\n): Promise<void> {\n const globals = resolveGlobals(command);\n const query = buildQuery(options, runType === \"work\");\n const created = await requestJson<{ runId: string; status: RunStatus }>(\n ctx,\n globals,\n \"POST\",\n runType === \"artist\" ? \"/research/artist\" : \"/research/work\",\n { query }\n );\n\n if (!options.wait) {\n printJson(globals, ctx, created);\n if (!globals.json) {\n logInfo(globals, ctx, `Run created: ${created.runId} (${created.status})`);\n logInfo(globals, ctx, `Use \"artbot runs show --run-id ${created.runId}\" to inspect details.`);\n }\n return;\n }\n\n const waitIntervalSeconds = toPositiveInt(options.waitInterval, 2);\n const details = await waitForRunTerminal(ctx, globals, created.runId, waitIntervalSeconds);\n printJson(globals, ctx, details);\n if (!globals.json) {\n printRunDetailsHuman(globals, ctx, details);\n }\n\n if (isFailedOrBlocked(details)) {\n throw new TerminalStateError(details);\n }\n}\n\nasync function handleRunsList(ctx: CliContext, options: RunsListOptions, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const status = parseRunStatus(options.status);\n const limit = toPositiveInt(options.limit, 20);\n const query = new URLSearchParams();\n if (status) query.set(\"status\", status);\n query.set(\"limit\", String(limit));\n\n const payload = await requestJson<RunsListResponse>(ctx, globals, \"GET\", `/runs?${query.toString()}`);\n printJson(globals, ctx, payload);\n if (globals.json) {\n return;\n }\n\n if (payload.runs.length === 0) {\n logInfo(globals, ctx, \"No runs found for the selected filters.\");\n return;\n }\n\n logInfo(globals, ctx, renderRunsTable(payload.runs));\n}\n\nasync function handleRunsShow(ctx: CliContext, options: RunsShowOptions, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const details = await requestJson<RunDetailsResponse>(ctx, globals, \"GET\", `/runs/${options.runId}`);\n printJson(globals, ctx, details);\n if (globals.json) {\n return;\n }\n printRunDetailsHuman(globals, ctx, details);\n}\n\nasync function handleRunsWatch(ctx: CliContext, options: RunsWatchOptions, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const intervalSeconds = toPositiveInt(options.interval, 2);\n const details = await waitForRunTerminal(ctx, globals, options.runId, intervalSeconds);\n printJson(globals, ctx, details);\n if (!globals.json) {\n printRunDetailsHuman(globals, ctx, details);\n }\n\n if (isFailedOrBlocked(details)) {\n throw new TerminalStateError(details);\n }\n}\n\nasync function handleSetup(ctx: CliContext, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const result = await runSetupWizard();\n printJson(globals, ctx, result);\n if (!globals.json) {\n logInfo(globals, ctx, renderSetupAssessment(result.assessment));\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderSetupIssues(result.assessment));\n if (result.backendStart) {\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, `Started local backend. API log: ${result.backendStart.apiLogPath}`);\n logInfo(globals, ctx, `Started local backend. Worker log: ${result.backendStart.workerLogPath}`);\n }\n }\n}\n\nasync function handleDoctor(ctx: CliContext, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const assessment = await assessLocalSetup();\n printJson(globals, ctx, assessment);\n if (globals.json) {\n return;\n }\n logInfo(globals, ctx, renderSetupAssessment(assessment));\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderSetupIssues(assessment));\n}\n\nasync function handleAuthList(ctx: CliContext, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const assessment = await assessLocalSetup();\n printJson(globals, ctx, {\n profiles: assessment.profiles,\n relevant_profiles: assessment.relevantProfiles,\n session_states: assessment.sessionStates,\n auth_profiles_error: assessment.authProfilesError\n });\n if (globals.json) {\n return;\n }\n if (assessment.authProfilesError) {\n logError(globals, ctx, assessment.authProfilesError.message);\n return;\n }\n logInfo(globals, ctx, renderAuthProfilesTable(assessment));\n}\n\nasync function handleAuthStatus(ctx: CliContext, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const assessment = await assessLocalSetup();\n printJson(globals, ctx, assessment.sessionStates);\n if (globals.json) {\n return;\n }\n logInfo(globals, ctx, renderSetupAssessment(assessment));\n logInfo(globals, ctx, \"\");\n logInfo(globals, ctx, renderAuthProfilesTable(assessment));\n}\n\nasync function handleAuthCapture(ctx: CliContext, options: AuthCaptureOptions, command: Command): Promise<void> {\n const globals = resolveGlobals(command);\n const parsed = resolveAuthProfilesFromEnv();\n if (parsed.error) {\n throw new InputValidationError(parsed.error.message);\n }\n\n const profile = parsed.profiles.find((entry) => entry.id === options.profileId);\n if (!profile) {\n throw new InputValidationError(`Unknown auth profile \"${options.profileId}\".`);\n }\n\n const capture = buildAuthCaptureCommand(profile, defaultSourceUrlForProfile(profile.id));\n printJson(globals, ctx, capture);\n if (globals.json) {\n return;\n }\n\n logInfo(globals, ctx, `Launching Playwright auth capture for ${profile.id}...`);\n const playwrightCli = require.resolve(\"playwright/cli\");\n const result = spawnSync(\n process.execPath,\n [playwrightCli, \"codegen\", capture.sourceUrl, `--save-storage=${capture.storageStatePath}`],\n {\n cwd: process.cwd(),\n stdio: \"inherit\",\n shell: false\n }\n );\n\n if (result.status !== 0) {\n throw new Error(`Auth capture exited with status ${result.status ?? 1}.`);\n }\n}\n\nfunction addCommonResearchFlags(command: Command, withOptionalTitle: boolean): Command {\n const target = command\n .requiredOption(\"--artist <name>\", \"Artist name\")\n .option(\"--year <year>\", \"Year\")\n .option(\"--medium <medium>\", \"Medium\")\n .option(\"--height-cm <number>\", \"Height in cm\")\n .option(\"--width-cm <number>\", \"Width in cm\")\n .option(\"--depth-cm <number>\", \"Depth in cm\")\n .option(\"--scope <scope>\", \"turkey_only or turkey_plus_international\")\n .option(\"--analysis-mode <mode>\", \"comprehensive | balanced | fast\")\n .option(\"--price-normalization <mode>\", \"legacy | usd_dual | usd_nominal | usd_2026\")\n .option(\"--no-turkey-first\", \"Disable Turkey-first source routing\")\n .option(\"--date-from <date>\", \"YYYY-MM-DD\")\n .option(\"--date-to <date>\", \"YYYY-MM-DD\")\n .option(\"--image-path <path>\", \"Path to local image\")\n .option(\"--auth-profile <id>\", \"Auth profile id\")\n .option(\"--cookie-file <path>\", \"Cookie JSON file\")\n .option(\"--manual-login\", \"Enable manual login checkpoint\")\n .option(\"--allow-licensed\", \"Allow licensed integrations\")\n .option(\"--licensed-integrations <list>\", \"Comma-separated source names\")\n .option(\"--wait\", \"Wait until run reaches terminal state\")\n .option(\"--wait-interval <seconds>\", \"Polling interval when --wait is enabled\");\n\n if (withOptionalTitle) {\n target.option(\"--title <title>\", \"Work title\");\n }\n\n return target;\n}\n\nfunction registerResearchCommands(program: Command, ctx: CliContext): void {\n const researchGroup = program.command(\"research\").description(\"Research commands\");\n\n addCommonResearchFlags(researchGroup.command(\"artist\").description(\"Research artist prices\"), true).action(\n async (options: CommonOptions, command: Command) => {\n await handleResearch(ctx, options, command, \"artist\");\n }\n );\n\n addCommonResearchFlags(researchGroup.command(\"work\").description(\"Research specific work prices\"), false)\n .requiredOption(\"--title <title>\", \"Work title\")\n .action(async (options: CommonOptions, command: Command) => {\n await handleResearch(ctx, options, command, \"work\");\n });\n\n addCommonResearchFlags(program.command(\"research-artist\").description(\"Research artist prices (legacy)\"), true).action(\n async (options: CommonOptions, command: Command) => {\n await handleResearch(ctx, options, command, \"artist\");\n }\n );\n\n addCommonResearchFlags(program.command(\"research-work\").description(\"Research specific work prices (legacy)\"), false)\n .requiredOption(\"--title <title>\", \"Work title\")\n .action(async (options: CommonOptions, command: Command) => {\n await handleResearch(ctx, options, command, \"work\");\n });\n}\n\nfunction registerRunsCommands(program: Command, ctx: CliContext): void {\n const runsGroup = program.command(\"runs\").description(\"Run inspection commands\");\n\n runsGroup\n .command(\"list\")\n .description(\"List recent runs\")\n .option(\"--status <status>\", \"pending|running|completed|failed\")\n .option(\"--limit <number>\", \"Maximum number of runs\")\n .action(async (options: RunsListOptions, command: Command) => {\n await handleRunsList(ctx, options, command);\n });\n\n runsGroup\n .command(\"show\")\n .description(\"Show a run details summary\")\n .requiredOption(\"--run-id <id>\", \"Run identifier\")\n .action(async (options: RunsShowOptions, command: Command) => {\n await handleRunsShow(ctx, options, command);\n });\n\n runsGroup\n .command(\"watch\")\n .description(\"Watch a run until terminal state\")\n .requiredOption(\"--run-id <id>\", \"Run identifier\")\n .option(\"--interval <seconds>\", \"Polling interval in seconds\", \"2\")\n .action(async (options: RunsWatchOptions, command: Command) => {\n await handleRunsWatch(ctx, options, command);\n });\n\n program\n .command(\"run-status\")\n .description(\"Show run details summary (legacy alias)\")\n .requiredOption(\"--run-id <id>\", \"Run identifier\")\n .action(async (options: RunsShowOptions, command: Command) => {\n await handleRunsShow(ctx, options, command);\n });\n}\n\nfunction registerSetupCommands(program: Command, ctx: CliContext): void {\n program\n .command(\"setup\")\n .description(\"Guided local onboarding for LM Studio, backend services, and auth profiles\")\n .action(async (_options: Record<string, never>, command: Command) => {\n await handleSetup(ctx, command);\n });\n\n program\n .command(\"doctor\")\n .description(\"Inspect local setup and health status\")\n .action(async (_options: Record<string, never>, command: Command) => {\n await handleDoctor(ctx, command);\n });\n\n const authGroup = program.command(\"auth\").description(\"Auth profile and session-state commands\");\n\n authGroup\n .command(\"list\")\n .description(\"List configured auth profiles and matched sources\")\n .action(async (_options: Record<string, never>, command: Command) => {\n await handleAuthList(ctx, command);\n });\n\n authGroup\n .command(\"status\")\n .description(\"Inspect saved browser session state for auth profiles\")\n .action(async (_options: Record<string, never>, command: Command) => {\n await handleAuthStatus(ctx, command);\n });\n\n authGroup\n .command(\"capture\")\n .description(\"Capture browser auth state for a profile via Playwright\")\n .argument(\"<profileId>\", \"Profile identifier\")\n .action(async (profileId: string, _options: Record<string, never>, command: Command) => {\n await handleAuthCapture(ctx, { profileId }, command);\n });\n}\n\nfunction defaultDeps(partial: CliDeps = {}): Required<CliDeps> {\n return {\n fetchImpl: partial.fetchImpl ?? fetch,\n sleep: partial.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))),\n spinnerFactory: partial.spinnerFactory ?? ((text: string) => ora(text)),\n stdout: partial.stdout ?? ((text: string) => process.stdout.write(text)),\n stderr: partial.stderr ?? ((text: string) => process.stderr.write(text))\n };\n}\n\nfunction mapErrorToExitCode(error: unknown): number {\n if (error instanceof CommanderError && error.code === \"commander.helpDisplayed\") {\n return EXIT_CODES.OK;\n }\n if (error instanceof CommanderError) {\n return EXIT_CODES.INPUT;\n }\n if (error instanceof InputValidationError || error instanceof ZodError) {\n return EXIT_CODES.INPUT;\n }\n if (error instanceof TerminalStateError) {\n return EXIT_CODES.TERMINAL;\n }\n if (error instanceof ApiRequestError) {\n return EXIT_CODES.API;\n }\n return EXIT_CODES.API;\n}\n\nfunction formatError(error: unknown): string {\n const serializeBody = (value: unknown): string => {\n try {\n const text = JSON.stringify(value);\n return text.length > 320 ? `${text.slice(0, 317)}...` : text;\n } catch {\n return String(value);\n }\n };\n\n if (error instanceof ApiRequestError) {\n const body = serializeBody(error.body);\n if (error.status === 401) {\n return `API authentication failed (401). Next: pass --api-key or set ARTBOT_API_KEY.`;\n }\n if (error.status === 404) {\n return `Requested resource was not found (404). Next: verify identifiers (for example --run-id) and retry.`;\n }\n if (error.status >= 500) {\n return `API server error (${error.status}). Next: inspect API logs and retry.`;\n }\n return `API request failed (${error.status}). Next: rerun with --verbose and confirm request payload. Body: ${body}`;\n }\n if (error instanceof InputValidationError) {\n return `${error.message} Next: run command with --help to verify valid options.`;\n }\n if (error instanceof ZodError) {\n return `Invalid input: ${error.issues.map((issue) => issue.message).join(\"; \")} Next: run command with --help to verify required flags.`;\n }\n if (error instanceof TerminalStateError) {\n return `Run ${error.details.run.id} reached a failed or blocked terminal state. Next: run \"artbot runs show --run-id ${error.details.run.id}\" for diagnostics.`;\n }\n if (error instanceof TypeError && /fetch/i.test(error.message)) {\n return `Cannot reach API endpoint. Next: start the API service or set --api-base-url to the correct host.`;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport function createProgram(ctx: CliContext): Command {\n const program = new Command();\n program.name(\"artbot\").description(\"Turkish art price research agent CLI\").version(\"0.2.0\");\n\n program\n .showHelpAfterError()\n .exitOverride()\n .configureOutput({\n writeOut: (text) => ctx.deps.stdout(text),\n writeErr: (text) => ctx.deps.stderr(text)\n });\n\n program\n .option(\"--json\", \"Machine-readable JSON output\")\n .option(\"--api-base-url <url>\", \"API base URL\")\n .option(\"--api-key <key>\", \"API key override\")\n .option(\"--verbose\", \"Verbose diagnostics\")\n .option(\"--quiet\", \"Suppress non-error human output\");\n\n registerResearchCommands(program, ctx);\n registerRunsCommands(program, ctx);\n registerSetupCommands(program, ctx);\n\n return program;\n}\n\nexport async function runCli(argv = process.argv, deps: CliDeps = {}): Promise<number> {\n loadWorkspaceEnv();\n\n const ctx: CliContext = {\n deps: defaultDeps(deps),\n exitCode: EXIT_CODES.OK\n };\n\n // Launch interactive mode when no arguments provided and stdout is a TTY\n const userArgs = argv.slice(2);\n if (userArgs.length === 0 && process.stdout.isTTY) {\n const { startInteractive } = await import(\"./interactive.js\");\n return startInteractive();\n }\n\n const program = createProgram(ctx);\n\n try {\n await program.parseAsync(argv);\n return ctx.exitCode;\n } catch (error) {\n const exitCode = mapErrorToExitCode(error);\n if (!(error instanceof CommanderError && error.code === \"commander.helpDisplayed\")) {\n const globals = (() => {\n try {\n return resolveGlobals(program);\n } catch {\n return {\n json: false,\n apiBaseUrl: process.env.API_BASE_URL ?? \"http://localhost:4000\",\n apiKey: process.env.ARTBOT_API_KEY,\n verbose: false,\n quiet: false\n } satisfies GlobalOptions;\n }\n })();\n logError(globals, ctx, formatError(error));\n }\n return exitCode;\n }\n}\n\nfunction isMainModule(currentImportUrl: string): boolean {\n const scriptPath = process.argv[1];\n if (!scriptPath) return false;\n return pathToFileURL(scriptPath).href === currentImportUrl;\n}\n\nif (isMainModule(import.meta.url)) {\n runCli(process.argv)\n .then((code) => {\n process.exit(code);\n })\n .catch((error) => {\n const fallbackMessage = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${fallbackMessage}\\n`);\n process.exit(EXIT_CODES.API);\n });\n}\n", "import { z } from \"zod\";\n\nexport const researchQuerySchema = z.object({\n artist: z.string().min(1),\n title: z.string().optional(),\n year: z.string().optional(),\n medium: z.string().optional(),\n dimensions: z\n .object({\n heightCm: z.number().positive().optional(),\n widthCm: z.number().positive().optional(),\n depthCm: z.number().positive().optional(),\n dimensionsText: z.string().optional()\n })\n .optional(),\n imagePath: z.string().optional(),\n dateRange: z\n .object({\n from: z.string().optional(),\n to: z.string().optional()\n })\n .optional(),\n scope: z.enum([\"turkey_only\", \"turkey_plus_international\"]).default(\"turkey_plus_international\"),\n turkeyFirst: z.boolean().default(true),\n analysisMode: z.enum([\"comprehensive\", \"balanced\", \"fast\"]).default(\"balanced\"),\n priceNormalization: z.enum([\"legacy\", \"usd_dual\", \"usd_nominal\", \"usd_2026\"]).default(\"usd_dual\"),\n authProfileId: z.string().optional(),\n cookieFile: z.string().optional(),\n manualLoginCheckpoint: z.boolean().default(false),\n allowLicensed: z.boolean().default(false),\n licensedIntegrations: z.array(z.string()).default([])\n});\n\nexport type ResearchQuery = z.infer<typeof researchQuerySchema>;\n\nexport const researchArtistRequestSchema = z.object({\n query: researchQuerySchema\n});\n\nexport const researchWorkRequestSchema = z.object({\n query: researchQuerySchema.extend({\n title: z.string().min(1)\n })\n});\n", "import { z } from \"zod\";\nimport type {\n AcceptanceReason,\n PriceType,\n SourceAccessStatus,\n SourcePageType,\n ValuationLane,\n VenueType\n} from \"./enums.js\";\n\nexport const priceRecordSchema = z.object({\n artist_name: z.string(),\n work_title: z.string().nullable(),\n alternate_title: z.string().nullable(),\n year: z.string().nullable(),\n medium: z.string().nullable(),\n support: z.string().nullable(),\n dimensions_text: z.string().nullable(),\n height_cm: z.number().nullable(),\n width_cm: z.number().nullable(),\n depth_cm: z.number().nullable(),\n signed: z.boolean().nullable(),\n dated: z.boolean().nullable(),\n edition_info: z.string().nullable(),\n is_unique_work: z.boolean().nullable(),\n venue_name: z.string(),\n venue_type: z.enum([\"auction_house\", \"gallery\", \"dealer\", \"marketplace\", \"database\", \"other\"]),\n city: z.string().nullable(),\n country: z.string().nullable(),\n source_name: z.string(),\n source_url: z.string().url(),\n source_page_type: z.enum([\"lot\", \"artist_page\", \"price_db\", \"listing\", \"article\", \"other\"]),\n sale_or_listing_date: z.string().nullable(),\n lot_number: z.string().nullable(),\n price_type: z.enum([\n \"asking_price\",\n \"estimate\",\n \"hammer_price\",\n \"realized_price\",\n \"realized_with_buyers_premium\",\n \"inquiry_only\",\n \"unknown\"\n ]),\n estimate_low: z.number().nullable(),\n estimate_high: z.number().nullable(),\n price_amount: z.number().nullable(),\n currency: z.string().nullable(),\n normalized_price_try: z.number().nullable(),\n normalized_price_usd: z.number().nullable(),\n normalized_price_usd_nominal: z.number().nullable().optional(),\n normalized_price_usd_2026: z.number().nullable().optional(),\n fx_source: z.string().nullable().optional(),\n fx_date_used: z.string().nullable().optional(),\n inflation_source: z.string().nullable().optional(),\n inflation_base_year: z.number().int().nullable().optional(),\n buyers_premium_included: z.boolean().nullable(),\n image_url: z.string().url().nullable(),\n screenshot_path: z.string().nullable(),\n raw_snapshot_path: z.string().nullable(),\n visual_match_score: z.number().nullable(),\n metadata_match_score: z.number().nullable(),\n extraction_confidence: z.number().min(0).max(1),\n entity_match_confidence: z.number().min(0).max(1),\n source_reliability_confidence: z.number().min(0).max(1),\n valuation_confidence: z.number().min(0).max(1),\n overall_confidence: z.number().min(0).max(1),\n accepted_for_evidence: z.boolean(),\n accepted_for_valuation: z.boolean(),\n valuation_lane: z.enum([\"realized\", \"estimate\", \"asking\", \"none\"]),\n acceptance_reason: z.enum([\n \"valuation_ready\",\n \"estimate_range_ready\",\n \"asking_price_ready\",\n \"inquiry_only_evidence\",\n \"price_hidden_evidence\",\n \"generic_shell_page\",\n \"missing_numeric_price\",\n \"missing_currency\",\n \"missing_estimate_range\",\n \"unknown_price_type\",\n \"blocked_access\"\n ]),\n rejection_reason: z.string().nullable(),\n valuation_eligibility_reason: z.string().nullable(),\n price_hidden: z.boolean(),\n source_access_status: z\n .enum([\"public_access\", \"auth_required\", \"licensed_access\", \"blocked\", \"price_hidden\"])\n .default(\"public_access\"),\n notes: z.array(z.string())\n});\n\nexport type PriceRecord = z.infer<typeof priceRecordSchema>;\n\nexport interface PriceRecordInput\n extends Omit<PriceRecord, \"venue_type\" | \"source_page_type\" | \"price_type\" | \"source_access_status\" | \"valuation_lane\" | \"acceptance_reason\"> {\n venue_type: VenueType;\n source_page_type: SourcePageType;\n price_type: PriceType;\n source_access_status: SourceAccessStatus;\n valuation_lane: ValuationLane;\n acceptance_reason: AcceptanceReason;\n}\n", "import { z } from \"zod\";\nimport type { AccessMode, AcceptanceReason, SourceAccessStatus, ValuationLane } from \"./enums.js\";\n\nexport const sourceAttemptSchema = z.object({\n run_id: z.string(),\n source_name: z.string(),\n source_url: z.string().url(),\n canonical_url: z.string().url().nullable(),\n access_mode: z.enum([\"anonymous\", \"authorized\", \"licensed\"]),\n source_access_status: z.enum([\n \"public_access\",\n \"auth_required\",\n \"licensed_access\",\n \"blocked\",\n \"price_hidden\"\n ]),\n access_reason: z.string().nullable(),\n blocker_reason: z.string().nullable(),\n extracted_fields: z.record(z.unknown()).default({}),\n discovery_provenance: z\n .enum([\"seed\", \"query_variant\", \"listing_expansion\", \"signature_expansion\", \"direct_lot\", \"web_discovery\"])\n .optional(),\n discovery_score: z.number().min(0).max(1).nullable().optional(),\n discovered_from_url: z.string().url().nullable().optional(),\n screenshot_path: z.string().nullable(),\n pre_auth_screenshot_path: z.string().nullable().optional(),\n post_auth_screenshot_path: z.string().nullable().optional(),\n raw_snapshot_path: z.string().nullable(),\n trace_path: z.string().nullable().optional(),\n har_path: z.string().nullable().optional(),\n fetched_at: z.string(),\n parser_used: z.string(),\n model_used: z.string().nullable(),\n extraction_confidence: z.number().min(0).max(1).nullable().optional(),\n entity_match_confidence: z.number().min(0).max(1).nullable().optional(),\n source_reliability_confidence: z.number().min(0).max(1).nullable().optional(),\n confidence_score: z.number().min(0).max(1),\n accepted: z.boolean(),\n accepted_for_evidence: z.boolean().optional(),\n accepted_for_valuation: z.boolean().optional(),\n valuation_lane: z.enum([\"realized\", \"estimate\", \"asking\", \"none\"]).optional(),\n acceptance_reason: z.enum([\n \"valuation_ready\",\n \"estimate_range_ready\",\n \"asking_price_ready\",\n \"inquiry_only_evidence\",\n \"price_hidden_evidence\",\n \"generic_shell_page\",\n \"missing_numeric_price\",\n \"missing_currency\",\n \"missing_estimate_range\",\n \"unknown_price_type\",\n \"blocked_access\"\n ]),\n rejection_reason: z.string().nullable().optional(),\n valuation_eligibility_reason: z.string().nullable().optional()\n});\n\nexport type SourceAttempt = z.infer<typeof sourceAttemptSchema>;\n\nexport interface AccessContext {\n mode: AccessMode;\n profileId?: string;\n cookieFile?: string;\n manualLoginCheckpoint?: boolean;\n allowLicensed?: boolean;\n licensedIntegrations: string[];\n sourceAccessStatus: SourceAccessStatus;\n accessReason?: string;\n blockerReason?: string;\n}\n\nexport interface AttemptAcceptanceDetails {\n acceptedForEvidence: boolean;\n acceptedForValuation: boolean;\n valuationLane: ValuationLane;\n acceptanceReason: AcceptanceReason;\n rejectionReason: string | null;\n valuationEligibilityReason: string | null;\n}\n", "import { z } from \"zod\";\nimport type { AcceptanceReason, RunStatus, SourceAccessStatus } from \"./enums.js\";\nimport type { ResearchQuery } from \"./query.js\";\n\nexport interface RunEntity {\n id: string;\n runType: \"artist\" | \"work\";\n query: ResearchQuery;\n status: RunStatus;\n createdAt: string;\n updatedAt: string;\n error?: string;\n reportPath?: string;\n resultsPath?: string;\n}\n\nexport const runSummarySchema = z.object({\n run_id: z.string(),\n total_records: z.number().int().nonnegative(),\n total_attempts: z.number().int().nonnegative().optional(),\n evidence_records: z.number().int().nonnegative().optional(),\n valuation_eligible_records: z.number().int().nonnegative().optional(),\n accepted_records: z.number().int().nonnegative(),\n rejected_candidates: z.number().int().nonnegative(),\n discovered_candidates: z.number().int().nonnegative(),\n accepted_from_discovery: z.number().int().nonnegative(),\n priced_source_coverage_ratio: z.number().min(0).max(1).optional(),\n priced_crawled_source_coverage_ratio: z.number().min(0).max(1).optional(),\n source_candidate_breakdown: z.record(z.string(), z.number().int().nonnegative()),\n source_status_breakdown: z.record(\n z.enum([\"public_access\", \"auth_required\", \"licensed_access\", \"blocked\", \"price_hidden\"]),\n z.number().int().nonnegative()\n ),\n auth_mode_breakdown: z.record(z.enum([\"anonymous\", \"authorized\", \"licensed\"]), z.number().int().nonnegative()),\n acceptance_reason_breakdown: z\n .record(\n z.enum([\n \"valuation_ready\",\n \"estimate_range_ready\",\n \"asking_price_ready\",\n \"inquiry_only_evidence\",\n \"price_hidden_evidence\",\n \"generic_shell_page\",\n \"missing_numeric_price\",\n \"missing_currency\",\n \"missing_estimate_range\",\n \"unknown_price_type\",\n \"blocked_access\"\n ]),\n z.number().int().nonnegative()\n )\n .optional(),\n valuation_generated: z.boolean(),\n valuation_reason: z.string()\n});\n\nexport type RunSummary = z.infer<typeof runSummarySchema>;\n\nexport const sourceStatusList: SourceAccessStatus[] = [\n \"public_access\",\n \"auth_required\",\n \"licensed_access\",\n \"blocked\",\n \"price_hidden\"\n];\n\nexport const acceptanceReasonList: AcceptanceReason[] = [\n \"valuation_ready\",\n \"estimate_range_ready\",\n \"asking_price_ready\",\n \"inquiry_only_evidence\",\n \"price_hidden_evidence\",\n \"generic_shell_page\",\n \"missing_numeric_price\",\n \"missing_currency\",\n \"missing_estimate_range\",\n \"unknown_price_type\",\n \"blocked_access\"\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["z", "z", "z", "require"]
7
+ }
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "artbot",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "CLI client for ArtBot market research runs.",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "bin": {
9
+ "artbot": "bin/artbot.cjs"
10
+ },
11
+ "files": [
12
+ "bin",
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/KhazP/CCGAgent.git"
22
+ },
23
+ "homepage": "https://github.com/KhazP/CCGAgent#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/KhazP/CCGAgent/issues"
26
+ },
27
+ "scripts": {
28
+ "dev": "tsx src/index.ts",
29
+ "build": "node ./scripts/build.mjs",
30
+ "prepack": "pnpm build",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit",
32
+ "test": "vitest run --passWithNoTests"
33
+ },
34
+ "dependencies": {
35
+ "@clack/prompts": "^0.9.1",
36
+ "boxen": "^8.0.1",
37
+ "cli-table3": "^0.6.5",
38
+ "commander": "^13.1.0",
39
+ "dotenv": "^16.4.7",
40
+ "figlet": "^1.8.0",
41
+ "gradient-string": "^3.0.0",
42
+ "ink": "^5.2.1",
43
+ "ink-text-input": "^6.0.0",
44
+ "ora": "^8.2.0",
45
+ "picocolors": "^1.1.1",
46
+ "playwright": "^1.59.1",
47
+ "react": "^18.3.1",
48
+ "zod": "^3.24.2"
49
+ },
50
+ "devDependencies": {
51
+ "@artbot/shared-types": "workspace:*",
52
+ "@types/figlet": "^1.7.0",
53
+ "@types/gradient-string": "^1.1.6",
54
+ "@types/react": "^18.3.12",
55
+ "esbuild": "^0.25.11"
56
+ }
57
+ }