@meterapp/car-image 1.0.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/agent-config.js +104 -0
  4. package/dist/agent-config.js.map +1 -0
  5. package/dist/args.js +145 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/bin.js +9 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/browser.js +20 -0
  10. package/dist/browser.js.map +1 -0
  11. package/dist/client.js +38 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/commands/agents.js +38 -0
  14. package/dist/commands/agents.js.map +1 -0
  15. package/dist/commands/billing.js +41 -0
  16. package/dist/commands/billing.js.map +1 -0
  17. package/dist/commands/catalog.js +169 -0
  18. package/dist/commands/catalog.js.map +1 -0
  19. package/dist/commands/describe.js +52 -0
  20. package/dist/commands/describe.js.map +1 -0
  21. package/dist/commands/doctor.js +53 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/help.js +58 -0
  24. package/dist/commands/help.js.map +1 -0
  25. package/dist/commands/images.js +168 -0
  26. package/dist/commands/images.js.map +1 -0
  27. package/dist/commands/index.js +44 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/login.js +64 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/maintenance.js +156 -0
  32. package/dist/commands/maintenance.js.map +1 -0
  33. package/dist/commands/onboard.js +42 -0
  34. package/dist/commands/onboard.js.map +1 -0
  35. package/dist/commands/whoami.js +41 -0
  36. package/dist/commands/whoami.js.map +1 -0
  37. package/dist/config.js +84 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/context.js +2 -0
  40. package/dist/context.js.map +1 -0
  41. package/dist/describe.js +226 -0
  42. package/dist/describe.js.map +1 -0
  43. package/dist/device-login.js +42 -0
  44. package/dist/device-login.js.map +1 -0
  45. package/dist/doctor.js +280 -0
  46. package/dist/doctor.js.map +1 -0
  47. package/dist/errors.js +54 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/main.js +170 -0
  50. package/dist/main.js.map +1 -0
  51. package/dist/mcp/server.js +149 -0
  52. package/dist/mcp/server.js.map +1 -0
  53. package/dist/output.js +90 -0
  54. package/dist/output.js.map +1 -0
  55. package/dist/prompts.js +29 -0
  56. package/dist/prompts.js.map +1 -0
  57. package/dist/telemetry.js +50 -0
  58. package/dist/telemetry.js.map +1 -0
  59. package/dist/update.js +142 -0
  60. package/dist/update.js.map +1 -0
  61. package/dist/version.js +5 -0
  62. package/dist/version.js.map +1 -0
  63. package/package.json +56 -0
@@ -0,0 +1,169 @@
1
+ import { COLORS, VIEWS } from "@meterapp/car-image-sdk";
2
+ import { flagChoice, flagInteger, flagString } from "../args.js";
3
+ import { CliError } from "../errors.js";
4
+ import { cliCommandFor } from "../mcp/server.js";
5
+ import { keyValues, paint, printJson, table } from "../output.js";
6
+ function yearsLabel(years) {
7
+ if (!years || years.length === 0)
8
+ return "—";
9
+ const min = Math.min(...years);
10
+ const max = Math.max(...years);
11
+ return min === max ? String(min) : `${min}–${max}`;
12
+ }
13
+ export const searchCommand = {
14
+ name: "search",
15
+ summary: "Fuzzy-search the vehicle catalog (free, no key needed)",
16
+ usage: "car-image search <query…> [--limit 10] [--year <year>] [--json]",
17
+ async run(ctx) {
18
+ const query = ctx.args.positionals.join(" ").trim();
19
+ if (!query)
20
+ throw new CliError("Missing search query", 2, "Example: car-image search porsche 911");
21
+ const limit = flagInteger(ctx.args.flags, "limit", { min: 1, max: 100 });
22
+ const year = flagInteger(ctx.args.flags, "year", { min: 1900, max: 2100 });
23
+ const result = await ctx.clientContext.client.searchVehicles(query, { limit, year });
24
+ if (ctx.io.json) {
25
+ printJson(ctx.io, result);
26
+ return 0;
27
+ }
28
+ const results = result.data.results;
29
+ if (results.length === 0) {
30
+ ctx.io.stdout(`No catalog matches for "${query}". Try fewer words or a different spelling.\n`);
31
+ return 1;
32
+ }
33
+ const rows = results.map((hit) => {
34
+ const view = searchHitView(hit);
35
+ return [view.kind, view.make, view.model ?? paint(ctx.io, "dim", "(make)"), yearsLabel(view.years), view.match, view.type];
36
+ });
37
+ ctx.io.stdout(`${table(rows, ["kind", "make", "model", "years", "match", "type"])}\n`);
38
+ const first = results.map(searchHitView).find((hit) => hit.kind === "model" && hit.model);
39
+ if (first?.model) {
40
+ const year = first.years?.length ? Math.max(...first.years) : new Date().getFullYear();
41
+ ctx.io.stdout(`\n${paint(ctx.io, "dim", `Try: ${cliCommandFor({ make: first.make, model: first.model, year })}`)}\n`);
42
+ }
43
+ return 0;
44
+ },
45
+ };
46
+ export const resolveCommand = {
47
+ name: "resolve",
48
+ summary: "Turn free text into exact image parameters and a ready-to-run command",
49
+ usage: "car-image resolve <free text…> [--json]\n e.g. car-image resolve red 2024 porsche 911 side view",
50
+ async run(ctx) {
51
+ const query = ctx.args.positionals.join(" ").trim();
52
+ if (!query)
53
+ throw new CliError("Missing text to resolve", 2, "Example: car-image resolve red 2024 porsche 911 side view");
54
+ if (!ctx.clientContext.apiKey)
55
+ throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
56
+ const result = await ctx.clientContext.client.resolve(query);
57
+ const params = result.data.params;
58
+ const command = cliCommandFor(params);
59
+ if (ctx.io.json) {
60
+ printJson(ctx.io, { ...result, cli: command });
61
+ return 0;
62
+ }
63
+ const rows = [
64
+ ["make", params.make],
65
+ ["model", params.model],
66
+ ["year", String(params.year)],
67
+ ["view", params.view],
68
+ ["color", params.color],
69
+ ];
70
+ if (params.size)
71
+ rows.push(["size", params.size]);
72
+ if (params.width)
73
+ rows.push(["width", String(params.width)]);
74
+ if (params.format)
75
+ rows.push(["format", params.format]);
76
+ rows.push(["confidence", String(result.data.confidence)]);
77
+ ctx.io.stdout(`${keyValues(ctx.io, rows)}\n\nRun:\n ${command}\n`);
78
+ const candidates = result.data.candidates ?? [];
79
+ if (candidates.length > 1) {
80
+ const alternatives = candidates.slice(0, 6).map((candidate) => [
81
+ String(candidate.make_name ?? candidate.make_slug ?? ""),
82
+ String(candidate.model_name ?? candidate.model_slug ?? ""),
83
+ yearsLabel(Array.isArray(candidate.years) ? candidate.years.map(Number) : undefined),
84
+ String(candidate.match_kind ?? ""),
85
+ ]);
86
+ ctx.io.stdout(`\nOther candidates:\n${table(alternatives, ["make", "model", "years", "match"])}\n`);
87
+ }
88
+ return 0;
89
+ },
90
+ };
91
+ export const optionsCommand = {
92
+ name: "options",
93
+ summary: "List views, colors, sizes, formats, pricing and catalog coverage",
94
+ usage: "car-image options [--json]",
95
+ async run(ctx) {
96
+ const result = await ctx.clientContext.client.options();
97
+ if (ctx.io.json) {
98
+ printJson(ctx.io, result);
99
+ return 0;
100
+ }
101
+ const { data } = result;
102
+ const io = ctx.io;
103
+ io.stdout(`${paint(io, "bold", "Views")}\n${table(data.views.map((view) => [view.id, `${view.yaw_degrees}°`, view.label, view.description, view.aliases.length ? `aliases: ${view.aliases.join(", ")}` : ""]), ["id", "yaw", "label", "description", ""])}\n\n`);
104
+ io.stdout(`${paint(io, "bold", "Colors")}\n${table(data.colors.map((color) => [color.name, color.hex]), ["name", "hex"])}\n\n`);
105
+ io.stdout(`${paint(io, "bold", "Sizes")}\n${table(Object.entries(data.sizes.presets).map(([name, px]) => [name, `${px} px`]).concat([["max", `${data.sizes.max} px (use --width/--height for exact sizes)`]]), ["preset", "size"])}\n\n`);
106
+ io.stdout(`${paint(io, "bold", "Formats")} ${data.formats.join(", ")} (png keeps transparency)\n\n`);
107
+ io.stdout(`${paint(io, "bold", "Pricing")} ${data.pricing.credits_per_image} credit per image · $1 = ${data.pricing.credits_per_dollar.toLocaleString("en-US")} credits · ${data.pricing.free_credits} free credits · no subscription\n`);
108
+ io.stdout(`${paint(io, "bold", "Catalog")} ${data.catalog.makes.toLocaleString("en-US")} makes, ${data.catalog.models.toLocaleString("en-US")} models, ${data.catalog.years[0]}–${data.catalog.years[1]}${data.catalog.sources?.length ? ` · sources: ${data.catalog.sources.join(", ")}` : ""}\n`);
109
+ return 0;
110
+ },
111
+ };
112
+ export const feedbackCommand = {
113
+ name: "feedback",
114
+ summary: "Rate a delivered image (by request id or by vehicle) to improve renders",
115
+ usage: "car-image feedback (--request-id <id> | --make <make> --model <model> --year <year> [--view] [--color])\n (--rating 1-5 | --good | --bad) [--reason <text>] [--json]",
116
+ async run(ctx) {
117
+ const { flags } = ctx.args;
118
+ if (!ctx.clientContext.apiKey)
119
+ throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
120
+ const rating = flagInteger(flags, "rating", { min: 1, max: 5 });
121
+ const verdict = flags.good === true ? "good" : flags.bad === true ? "bad" : undefined;
122
+ if (flags.good === true && flags.bad === true)
123
+ throw new CliError("Choose either --good or --bad", 2);
124
+ if (rating === undefined && verdict === undefined)
125
+ throw new CliError("Provide --rating 1-5, --good or --bad", 2);
126
+ const reason = flagString(flags, "reason");
127
+ const requestId = flagString(flags, "request-id");
128
+ const base = { rating, verdict, reason };
129
+ const result = requestId
130
+ ? await ctx.clientContext.client.feedback({ requestId, ...base })
131
+ : await (async () => {
132
+ const make = flagString(flags, "make");
133
+ const model = flagString(flags, "model");
134
+ const year = flagString(flags, "year");
135
+ if (!make || !model || !year)
136
+ throw new CliError("Identify the image with --request-id or with --make, --model and --year", 2);
137
+ const view = flagChoice(flags, "view", VIEWS);
138
+ const color = flagChoice(flags, "color", COLORS);
139
+ return ctx.clientContext.client.feedback({ make, model, year, view, color, ...base });
140
+ })();
141
+ if (ctx.io.json) {
142
+ printJson(ctx.io, result);
143
+ return 0;
144
+ }
145
+ ctx.io.stdout(`Thanks — feedback recorded (${verdict ?? `rating ${rating}`}${reason ? `: ${reason}` : ""}). request ${result.request_id}\n`);
146
+ return 0;
147
+ },
148
+ };
149
+ /** Search hits may arrive camelCase (catalog lib) or snake_case (REST); normalize for display. */
150
+ export function searchHitView(hit) {
151
+ const pick = (...keys) => {
152
+ for (const key of keys) {
153
+ const value = hit[key];
154
+ if (typeof value === "string" && value)
155
+ return value;
156
+ }
157
+ return undefined;
158
+ };
159
+ const years = Array.isArray(hit.years) ? hit.years.map(Number).filter(Number.isFinite) : undefined;
160
+ return {
161
+ kind: pick("kind") ?? "model",
162
+ make: pick("makeName", "make_name", "make") ?? "",
163
+ model: pick("modelName", "model_name", "model"),
164
+ years,
165
+ match: pick("matchKind", "match_kind", "match") ?? "",
166
+ type: pick("vehicleType", "vehicle_type", "type") ?? "",
167
+ };
168
+ }
169
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { formatApiReference } from "@meterapp/car-image-sdk/mcp";
2
+ import { findEndpoints, formatAll, formatEndpoint, formatEndpointList } from "../describe.js";
3
+ import { printJson, warn } from "../output.js";
4
+ export const describeCommand = {
5
+ name: "describe",
6
+ summary: "Explain the REST API from /openapi.json (endpoints, params, headers, errors, agent notes)",
7
+ usage: "car-image describe [<operationId>|<path>|all] [--json]\n e.g. car-image describe getCarImage · car-image describe /api/v1/image-urls · car-image describe all",
8
+ async run(ctx) {
9
+ const { io, clientContext } = ctx;
10
+ const target = ctx.args.positionals.join(" ").trim();
11
+ let doc;
12
+ try {
13
+ doc = await clientContext.client.openapi();
14
+ }
15
+ catch (error) {
16
+ if (io.json)
17
+ throw error;
18
+ io.stderr(`${warn(io, `Could not fetch ${clientContext.baseUrl}/openapi.json (${error instanceof Error ? error.message : String(error)}); showing the built-in reference.`)}\n\n`);
19
+ io.stdout(`${formatApiReference(target && target !== "all" ? target : undefined)}\n`);
20
+ return 0;
21
+ }
22
+ if (!target) {
23
+ if (io.json) {
24
+ printJson(io, findEndpoints(doc, "all").map(({ method, path, operationId, summary }) => ({ method, path, operationId, summary })));
25
+ }
26
+ else {
27
+ io.stdout(`${formatEndpointList(doc)}\n`);
28
+ }
29
+ return 0;
30
+ }
31
+ if (target === "all") {
32
+ if (io.json)
33
+ printJson(io, doc);
34
+ else
35
+ io.stdout(`${formatAll(doc)}\n`);
36
+ return 0;
37
+ }
38
+ const matches = findEndpoints(doc, target);
39
+ if (matches.length === 0) {
40
+ io.stderr(`No endpoint matches "${target}".\n\n`);
41
+ io.stdout(`${formatEndpointList(doc)}\n`);
42
+ return 1;
43
+ }
44
+ if (io.json) {
45
+ printJson(io, matches.map(({ method, path, operationId, operation }) => ({ method, path, operationId, operation })));
46
+ return 0;
47
+ }
48
+ io.stdout(`${matches.map((endpoint) => formatEndpoint(doc, endpoint)).join("\n\n")}\n`);
49
+ return 0;
50
+ },
51
+ };
52
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { doctorSummary, renderDoctorTable, runDoctor } from "../doctor.js";
2
+ import { fail, ok, paint, printJson } from "../output.js";
3
+ import { confirm } from "../prompts.js";
4
+ import { simpleEvent } from "../telemetry.js";
5
+ /** Shared by `doctor` and onboarding. Returns the exit code. */
6
+ export async function runDoctorCommand(ctx, options = {}) {
7
+ const { io, clientContext } = ctx;
8
+ const yes = ctx.args.flags.yes === true;
9
+ const noImage = ctx.args.flags.image === false || options.quick === true;
10
+ let includeImage = false;
11
+ if (!noImage && clientContext.apiKey) {
12
+ includeImage = yes ? true : await confirm(io, "Also fetch one keyed image to test GET /api/v1/images/car? Costs 1 credit.", false);
13
+ }
14
+ if (!io.json && !io.quiet) {
15
+ io.stderr(`Checking ${clientContext.baseUrl}${options.quick ? " (quick: no paid checks)" : ""}…\n`);
16
+ }
17
+ const checks = await runDoctor({
18
+ client: clientContext.client,
19
+ publicFetch: (url, init) => fetch(url, { ...init, headers: { ...init?.headers, "User-Agent": clientContext.userAgent } }),
20
+ hasKey: Boolean(clientContext.apiKey),
21
+ now: () => Date.now(),
22
+ includeImage,
23
+ quick: options.quick === true,
24
+ onCheck: (check) => {
25
+ if (io.json || io.quiet || !io.isTTY)
26
+ return;
27
+ const mark = check.status === "pass" ? paint(io, "green", "✓") : check.status === "fail" ? paint(io, "red", "✗") : paint(io, "dim", "·");
28
+ io.stderr(`${mark} ${check.name}${check.latencyMs !== null ? paint(io, "dim", ` ${check.latencyMs} ms`) : ""}\n`);
29
+ },
30
+ });
31
+ const summary = doctorSummary(checks);
32
+ if (ctx.telemetry.enabled && ctx.telemetry.anonymousId) {
33
+ ctx.emit(simpleEvent(ctx.telemetry.anonymousId, "cli_doctor", { passed: summary.passed, failed: summary.failed, skipped: summary.skipped, quick: options.quick === true }));
34
+ }
35
+ if (io.json) {
36
+ printJson(io, { ok: summary.ok, base_url: clientContext.baseUrl, summary, checks });
37
+ return summary.ok ? 0 : 1;
38
+ }
39
+ if (io.isTTY && !io.quiet)
40
+ io.stderr("\n");
41
+ io.stdout(`${renderDoctorTable(checks, io)}\n\n`);
42
+ const spent = checks.reduce((total, check) => total + (check.credits ?? 0), 0);
43
+ const line = `${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped · ${spent} credit${spent === 1 ? "" : "s"} spent`;
44
+ io.stdout(summary.ok ? `${ok(io, line)}\n` : `${fail(io, line)}\n`);
45
+ return summary.ok ? 0 : 1;
46
+ }
47
+ export const doctorCommand = {
48
+ name: "doctor",
49
+ summary: "Smoke-test every endpoint with your key (spends up to 2 credits; exit 1 on failure)",
50
+ usage: "car-image doctor [--json] [--yes] [--no-image]\n --yes fetch one keyed image without asking (1 credit)\n --no-image skip the keyed image fetch",
51
+ run: (ctx) => runDoctorCommand(ctx),
52
+ };
53
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { BIN_NAME, CLI_VERSION, PACKAGE_NAME } from "../version.js";
2
+ export function helpText(entries, command) {
3
+ if (command) {
4
+ const entry = entries.find((candidate) => candidate.name === command);
5
+ if (entry) {
6
+ return `${BIN_NAME} ${entry.name} — ${entry.summary}\n\nUsage:\n ${entry.usage.split("\n").join("\n ")}\n\nGlobal options: --json --quiet --base-url <url> --api-key <key> --no-color -h/--help -v/--version\n`;
7
+ }
8
+ }
9
+ const width = Math.max(...entries.map((entry) => entry.name.length));
10
+ const commands = entries.map((entry) => ` ${entry.name.padEnd(width)} ${entry.summary}`).join("\n");
11
+ return `${BIN_NAME} ${CLI_VERSION} — Car Image API by Meter (${PACKAGE_NAME})
12
+ Studio-quality, transparent-background renders of any vehicle. 1 credit per image, $1 = 1,000 credits, 100 free.
13
+
14
+ Usage:
15
+ ${BIN_NAME} interactive onboarding (login, account, quick check)
16
+ ${BIN_NAME} <command> [options]
17
+
18
+ Commands:
19
+ ${commands}
20
+
21
+ Global options:
22
+ --json machine-readable output on stdout
23
+ --quiet, -q only errors and essential output
24
+ --base-url <url> API origin (default https://car-imgs.vercel.app; env CAR_IMAGE_API_URL)
25
+ --api-key <key> override the stored key for this run (env CAR_IMAGE_API_KEY)
26
+ --no-color disable colors (env NO_COLOR)
27
+ -h, --help show help (also \`${BIN_NAME} <command> --help\`)
28
+ -v, --version print the version
29
+
30
+ Environment:
31
+ CAR_IMAGE_API_KEY API key (takes priority over the saved credential)
32
+ CAR_IMAGE_API_URL API origin
33
+ CAR_IMAGE_CONFIG path to config.json (default $XDG_CONFIG_HOME/car-image-api/config.json)
34
+ CAR_IMAGE_TELEMETRY set to 0 to disable anonymous usage events
35
+
36
+ Examples:
37
+ ${BIN_NAME} login
38
+ ${BIN_NAME} get --make Porsche --model 911 --year 2024 --view side --color red --out porsche.png
39
+ ${BIN_NAME} url --make BMW --model M3 --year 2022 --ttl 86400
40
+ ${BIN_NAME} resolve red 2024 porsche 911 side view
41
+ ${BIN_NAME} agent-config --host claude-code
42
+ ${BIN_NAME} doctor --yes
43
+
44
+ Exit codes: 0 ok, 1 failure, 2 usage error. Docs: https://car-imgs.vercel.app/docs
45
+ `;
46
+ }
47
+ export function helpCommand(entries) {
48
+ return {
49
+ name: "help",
50
+ summary: "Show help for all commands or one command",
51
+ usage: "car-image help [command]",
52
+ async run(ctx) {
53
+ ctx.io.stdout(helpText(entries(), ctx.args.positionals[0] ?? null));
54
+ return 0;
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQpE,MAAM,UAAU,QAAQ,CAAC,OAAoB,EAAE,OAAuB;IACpE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACtE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,iBAAiB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yGAAyG,CAAC;QACpN,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,OAAO,GAAG,QAAQ,IAAI,WAAW,8BAA8B,YAAY;;;;IAIzE,QAAQ;IACR,QAAQ;;;EAGV,QAAQ;;;;;;;;2CAQiC,QAAQ;;;;;;;;;;IAU/C,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;;;CAGX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA0B;IACpD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,2CAA2C;QACpD,KAAK,EAAE,0BAA0B;QACjC,KAAK,CAAC,GAAG,CAAC,GAAmB;YAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { COLORS, FORMATS, SIZES, VIEWS, suggestedFileName } from "@meterapp/car-image-sdk";
3
+ import { flagBoolean, flagChoice, flagInteger, flagString, requireString } from "../args.js";
4
+ import { CliError } from "../errors.js";
5
+ import { ok, paint, printJson } from "../output.js";
6
+ const SIZE_NAMES = Object.keys(SIZES);
7
+ /** Builds ImageParams from --make/--model/--year/--view/--color/--size/--width/--height/--format. */
8
+ export function imageParamsFromFlags(flags, options = {}) {
9
+ const require = options.requireVehicle !== false;
10
+ const make = require ? requireString(flags, "make", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "make");
11
+ const model = require ? requireString(flags, "model", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "model");
12
+ const year = require ? requireString(flags, "year", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "year");
13
+ const params = { make: make ?? "", model: model ?? "", year: year ?? "" };
14
+ const view = flagChoice(flags, "view", VIEWS);
15
+ if (view)
16
+ params.view = view;
17
+ const color = flagChoice(flags, "color", COLORS);
18
+ if (color)
19
+ params.color = color;
20
+ const size = flagChoice(flags, "size", SIZE_NAMES);
21
+ if (size)
22
+ params.size = size;
23
+ const width = flagInteger(flags, "width", { min: 1, max: 1024 });
24
+ if (width !== undefined)
25
+ params.width = width;
26
+ const height = flagInteger(flags, "height", { min: 1, max: 1024 });
27
+ if (height !== undefined)
28
+ params.height = height;
29
+ const rawFormat = flagString(flags, "format");
30
+ if (rawFormat) {
31
+ const normalized = rawFormat.toLowerCase() === "jpeg" ? "jpg" : rawFormat.toLowerCase();
32
+ if (!FORMATS.includes(normalized))
33
+ throw new CliError(`Invalid --format "${rawFormat}". Choose one of: ${FORMATS.join(", ")}`, 2);
34
+ params.format = normalized;
35
+ }
36
+ return params;
37
+ }
38
+ export const getCommand = {
39
+ name: "get",
40
+ summary: "Download one image (1 credit) or print a signed URL with --url",
41
+ usage: "car-image get --make <make> --model <model> --year <year> [--view front-3-4] [--color silver]\n [--size thumb|small|medium|large | --width <px> --height <px>] [--format png|webp|jpg]\n [--out <file> | --out -] [--url] [--json]",
42
+ async run(ctx) {
43
+ const { io, clientContext } = ctx;
44
+ const params = imageParamsFromFlags(ctx.args.flags);
45
+ if (!clientContext.apiKey)
46
+ throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
47
+ if (flagBoolean(ctx.args.flags, "url")) {
48
+ const result = await clientContext.client.getImageUrl(params);
49
+ if (io.json) {
50
+ printJson(io, result);
51
+ }
52
+ else {
53
+ io.stdout(`${result.data.url}\n`);
54
+ if (!io.quiet) {
55
+ io.stderr(`Expires ${result.data.expires_at} · charged ${result.billing.credits_charged} credit, ${result.billing.credits_remaining.toLocaleString("en-US")} remaining · request ${result.request_id}\n`);
56
+ }
57
+ }
58
+ return 0;
59
+ }
60
+ const image = await clientContext.client.getImage(params);
61
+ const out = flagString(ctx.args.flags, "out") ?? suggestedFileName({ ...params, format: params.format ?? formatFromContentType(image.contentType) });
62
+ if (out === "-") {
63
+ process.stdout.write(Buffer.from(image.bytes));
64
+ }
65
+ else {
66
+ await writeFile(out, Buffer.from(image.bytes));
67
+ }
68
+ const meta = {
69
+ file: out === "-" ? null : out,
70
+ bytes: image.bytes.byteLength,
71
+ content_type: image.contentType,
72
+ width: image.width,
73
+ height: image.height,
74
+ source: image.source,
75
+ credits_charged: image.creditsCharged,
76
+ credits_remaining: image.creditsRemaining,
77
+ request_id: image.requestId,
78
+ };
79
+ if (io.json) {
80
+ if (out === "-")
81
+ io.stderr(`${JSON.stringify(meta)}\n`);
82
+ else
83
+ printJson(io, meta);
84
+ return 0;
85
+ }
86
+ const size = image.width && image.height ? `${image.width}×${image.height} ` : "";
87
+ const line = `${out === "-" ? "Wrote image to stdout" : `Saved ${out}`} (${size}${image.contentType.replace("image/", "")}, ${(image.bytes.byteLength / 1024).toFixed(1)} KB, ${image.source ?? "unknown"}) — charged ${image.creditsCharged ?? "?"} credit, ${image.creditsRemaining?.toLocaleString("en-US") ?? "?"} remaining${image.requestId ? ` · request ${image.requestId}` : ""}`;
88
+ (out === "-" ? io.stderr : io.stdout)(`${ok(io, line)}\n`);
89
+ if (!io.quiet && image.requestId && out !== "-") {
90
+ io.stdout(paint(io, "dim", `Rate it: car-image feedback --request-id ${image.requestId} --good|--bad\n`));
91
+ }
92
+ return 0;
93
+ },
94
+ };
95
+ function formatFromContentType(contentType) {
96
+ if (contentType.includes("webp"))
97
+ return "webp";
98
+ if (contentType.includes("jpeg") || contentType.includes("jpg"))
99
+ return "jpg";
100
+ return "png";
101
+ }
102
+ async function readBatch(path) {
103
+ let raw;
104
+ try {
105
+ raw = await readFile(path, "utf8");
106
+ }
107
+ catch (error) {
108
+ throw new CliError(`Cannot read batch file ${path}: ${error instanceof Error ? error.message : String(error)}`, 2);
109
+ }
110
+ let parsed;
111
+ try {
112
+ parsed = JSON.parse(raw);
113
+ }
114
+ catch {
115
+ throw new CliError(`Batch file ${path} is not valid JSON`, 2, 'Expected an array of {"make","model","year",...} objects or {"images":[...]}.');
116
+ }
117
+ const list = Array.isArray(parsed) ? parsed : parsed && typeof parsed === "object" && Array.isArray(parsed.images) ? parsed.images : null;
118
+ if (!list)
119
+ throw new CliError(`Batch file ${path} must contain an array or an {"images": [...]} object`, 2);
120
+ if (list.length < 1 || list.length > 50)
121
+ throw new CliError(`Batch file must contain 1 to 50 images (found ${list.length})`, 2);
122
+ return list.map((entry, index) => {
123
+ if (!entry || typeof entry !== "object")
124
+ throw new CliError(`Batch entry ${index} is not an object`, 2);
125
+ const record = entry;
126
+ const make = record.make ?? record.brand;
127
+ if (typeof make !== "string" || typeof record.model !== "string" || (typeof record.year !== "number" && typeof record.year !== "string")) {
128
+ throw new CliError(`Batch entry ${index} needs make, model and year`, 2);
129
+ }
130
+ const params = { make, model: record.model, year: record.year };
131
+ for (const key of ["view", "color", "size", "format"]) {
132
+ if (typeof record[key] === "string")
133
+ params[key] = record[key];
134
+ }
135
+ for (const key of ["width", "height"]) {
136
+ if (typeof record[key] === "number")
137
+ params[key] = record[key];
138
+ }
139
+ return params;
140
+ });
141
+ }
142
+ export const urlCommand = {
143
+ name: "url",
144
+ summary: "Create signed, key-free delivery URLs (1 credit each) for browsers and documents",
145
+ usage: "car-image url --make <make> --model <model> --year <year> [--view] [--color] [--size|--width|--height] [--format]\n [--ttl 3600] [--max-uses 0] [--json]\ncar-image url --batch images.json [--ttl 3600] [--max-uses 0] [--json]",
146
+ async run(ctx) {
147
+ const { io, clientContext } = ctx;
148
+ if (!clientContext.apiKey)
149
+ throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
150
+ const batchPath = flagString(ctx.args.flags, "batch");
151
+ const images = batchPath ? await readBatch(batchPath) : [imageParamsFromFlags(ctx.args.flags)];
152
+ const ttlSeconds = flagInteger(ctx.args.flags, "ttl", { min: 60, max: 604800 });
153
+ const maxUses = flagInteger(ctx.args.flags, "max-uses", { min: 0 });
154
+ const result = await clientContext.client.createImageUrls(images, { ttlSeconds, maxUses });
155
+ if (io.json) {
156
+ printJson(io, result);
157
+ return 0;
158
+ }
159
+ for (const entry of result.data)
160
+ io.stdout(`${entry.url}\n`);
161
+ if (!io.quiet) {
162
+ const first = result.data[0];
163
+ io.stderr(`${result.data.length} URL${result.data.length === 1 ? "" : "s"}${first ? `, expire ${first.expires_at}, max uses ${first.max_uses === 0 ? "unlimited" : first.max_uses}` : ""} · charged ${result.billing.credits_charged} credit${result.billing.credits_charged === 1 ? "" : "s"}, ${result.billing.credits_remaining.toLocaleString("en-US")} remaining · request ${result.request_id}\n`);
164
+ }
165
+ return 0;
166
+ },
167
+ };
168
+ //# sourceMappingURL=images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/commands/images.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { agentConfigCommand, mcpCommand } from "./agents.js";
2
+ import { billingCommand } from "./billing.js";
3
+ import { feedbackCommand, optionsCommand, resolveCommand, searchCommand } from "./catalog.js";
4
+ import { describeCommand } from "./describe.js";
5
+ import { doctorCommand } from "./doctor.js";
6
+ import { helpCommand } from "./help.js";
7
+ import { getCommand, urlCommand } from "./images.js";
8
+ import { loginCommand, logoutCommand } from "./login.js";
9
+ import { configCommand, telemetryCommand, updateCommand } from "./maintenance.js";
10
+ import { onboardCommand } from "./onboard.js";
11
+ import { whoamiCommand } from "./whoami.js";
12
+ export const COMMANDS = [
13
+ loginCommand,
14
+ logoutCommand,
15
+ whoamiCommand,
16
+ doctorCommand,
17
+ getCommand,
18
+ urlCommand,
19
+ searchCommand,
20
+ resolveCommand,
21
+ optionsCommand,
22
+ describeCommand,
23
+ feedbackCommand,
24
+ billingCommand,
25
+ mcpCommand,
26
+ agentConfigCommand,
27
+ updateCommand,
28
+ configCommand,
29
+ telemetryCommand,
30
+ onboardCommand,
31
+ helpCommand(() => helpEntries()),
32
+ ];
33
+ export function helpEntries() {
34
+ return COMMANDS.filter((command) => command.name !== "onboard").map(({ name, summary, usage, aliases }) => ({
35
+ name: aliases?.length ? `${name} (${aliases.join(", ")})` : name,
36
+ summary,
37
+ usage,
38
+ }));
39
+ }
40
+ export function findCommand(name) {
41
+ const needle = name.toLowerCase();
42
+ return COMMANDS.find((command) => command.name === needle || command.aliases?.includes(needle));
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,UAAU;IACV,UAAU;IACV,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1G,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QAChE,OAAO;QACP,KAAK;KACN,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClG,CAAC"}