@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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/agent-config.js +104 -0
- package/dist/agent-config.js.map +1 -0
- package/dist/args.js +145 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agents.js +38 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/billing.js +41 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/catalog.js +169 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/describe.js +52 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/doctor.js +53 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.js +58 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/images.js +168 -0
- package/dist/commands/images.js.map +1 -0
- package/dist/commands/index.js +44 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/login.js +64 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/maintenance.js +156 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/onboard.js +42 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/whoami.js +41 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/describe.js +226 -0
- package/dist/describe.js.map +1 -0
- package/dist/device-login.js +42 -0
- package/dist/device-login.js.map +1 -0
- package/dist/doctor.js +280 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -0
- package/dist/main.js +170 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.js +149 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/output.js +90 -0
- package/dist/output.js.map +1 -0
- package/dist/prompts.js +29 -0
- package/dist/prompts.js.map +1 -0
- package/dist/telemetry.js +50 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/update.js +142 -0
- package/dist/update.js.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { flagString } from "../args.js";
|
|
2
|
+
import { openBrowser } from "../browser.js";
|
|
3
|
+
import { maskKey, updateConfig } from "../config.js";
|
|
4
|
+
import { runDeviceLogin } from "../device-login.js";
|
|
5
|
+
import { keyValues, ok, paint, printJson } from "../output.js";
|
|
6
|
+
import { simpleEvent } from "../telemetry.js";
|
|
7
|
+
export const loginCommand = {
|
|
8
|
+
name: "login",
|
|
9
|
+
summary: "Sign in through the browser (device flow) and store a key with mode 0600",
|
|
10
|
+
usage: "car-image login [--no-browser] [--client-name <name>]",
|
|
11
|
+
async run(ctx) {
|
|
12
|
+
const { io, clientContext } = ctx;
|
|
13
|
+
const openInBrowser = ctx.args.flags.browser !== false;
|
|
14
|
+
const clientName = flagString(ctx.args.flags, "client-name") ?? `car-image CLI (${process.platform})`;
|
|
15
|
+
const result = await runDeviceLogin({
|
|
16
|
+
start: () => clientContext.client.startDeviceLogin({ clientName }),
|
|
17
|
+
poll: (deviceCode) => clientContext.client.pollDeviceLogin(deviceCode),
|
|
18
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
19
|
+
now: () => Date.now(),
|
|
20
|
+
onCode(info) {
|
|
21
|
+
io.stderr(`\nApprove this CLI in your browser:\n ${paint(io, "underline", info.verification_uri_complete)}\n\nCode: ${paint(io, "bold", info.user_code)}\n`);
|
|
22
|
+
if (openInBrowser) {
|
|
23
|
+
const opened = openBrowser(info.verification_uri_complete);
|
|
24
|
+
io.stderr(opened ? "Opening your browser… (use --no-browser to skip)\n" : "Open the link above in a browser.\n");
|
|
25
|
+
}
|
|
26
|
+
io.stderr(`Waiting for approval (expires in ${Math.round(info.expires_in / 60)} min)…\n`);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
await updateConfig({ apiKey: result.accessToken, baseUrl: clientContext.baseUrl }, ctx.configPath);
|
|
30
|
+
if (ctx.telemetry.enabled && ctx.telemetry.anonymousId) {
|
|
31
|
+
ctx.emit(simpleEvent(ctx.telemetry.anonymousId, "cli_login"));
|
|
32
|
+
}
|
|
33
|
+
const scopes = result.scope ? result.scope.split(/[\s,]+/).filter(Boolean) : [];
|
|
34
|
+
if (io.json) {
|
|
35
|
+
printJson(io, { ok: true, api_key: result.accessToken, key_prefix: maskKey(result.accessToken), scopes, config_path: ctx.configPath, base_url: clientContext.baseUrl });
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
io.stdout(`\n${ok(io, "Signed in.")}\n`);
|
|
39
|
+
io.stdout(`${keyValues(io, [
|
|
40
|
+
["API key", `${result.accessToken} ${paint(io, "dim", "(shown once; stored below)")}`],
|
|
41
|
+
["Saved to", `${ctx.configPath} (mode 0600)`],
|
|
42
|
+
["Scopes", scopes.join(", ") || "images:read account:read billing:write"],
|
|
43
|
+
["Base URL", clientContext.baseUrl],
|
|
44
|
+
])}\n`);
|
|
45
|
+
io.stdout(`\nFor agents: export CAR_IMAGE_API_KEY=${maskKey(result.accessToken)} (full key above) or run \`car-image agent-config\`.\nNext: car-image whoami · car-image get --make Porsche --model 911 --year 2024 · car-image doctor\n`);
|
|
46
|
+
return 0;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
export const logoutCommand = {
|
|
50
|
+
name: "logout",
|
|
51
|
+
summary: "Remove the stored key from the config file",
|
|
52
|
+
usage: "car-image logout",
|
|
53
|
+
async run(ctx) {
|
|
54
|
+
const hadKey = Boolean(ctx.config.apiKey);
|
|
55
|
+
await updateConfig({ apiKey: undefined }, ctx.configPath);
|
|
56
|
+
if (ctx.io.json) {
|
|
57
|
+
printJson(ctx.io, { ok: true, removed: hadKey, config_path: ctx.configPath });
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
ctx.io.stdout(hadKey ? `${ok(ctx.io, `Signed out; key removed from ${ctx.configPath}.`)}\nIf the key may have leaked, revoke it in the dashboard: ${ctx.clientContext.baseUrl}/dashboard/keys\n` : `No stored key in ${ctx.configPath}.\n`);
|
|
61
|
+
return 0;
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { AUTO_UPDATE_MODES, CONFIG_KEYS, readConfig, updateCachePath, updateConfig } from "../config.js";
|
|
2
|
+
import { CliError } from "../errors.js";
|
|
3
|
+
import { keyValues, ok, printJson, warn } from "../output.js";
|
|
4
|
+
import { TELEMETRY_DISCLOSURE, telemetryEnabled } from "../telemetry.js";
|
|
5
|
+
import { checkForUpdate, detectPackageManager, installCommand, isNewer, isNpxInvocation, performUpdate } from "../update.js";
|
|
6
|
+
import { CLI_VERSION, PACKAGE_NAME } from "../version.js";
|
|
7
|
+
export const updateCommand = {
|
|
8
|
+
name: "update",
|
|
9
|
+
summary: "Update the CLI to the latest npm version (or just check with --check)",
|
|
10
|
+
usage: "car-image update [--check] [--json]",
|
|
11
|
+
async run(ctx) {
|
|
12
|
+
const { io } = ctx;
|
|
13
|
+
const { latest } = await checkForUpdate({ cachePath: updateCachePath(ctx.env), force: true });
|
|
14
|
+
const newer = isNewer(latest, CLI_VERSION);
|
|
15
|
+
const viaNpx = isNpxInvocation(ctx.env);
|
|
16
|
+
const manager = detectPackageManager(ctx.env);
|
|
17
|
+
const install = installCommand(manager);
|
|
18
|
+
if (ctx.args.flags.check === true || !newer) {
|
|
19
|
+
if (io.json) {
|
|
20
|
+
printJson(io, { current: CLI_VERSION, latest, update_available: newer, via_npx: viaNpx, install: `${install.command} ${install.args.join(" ")}` });
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
if (latest === null)
|
|
24
|
+
io.stdout(`${warn(io, `Could not reach the npm registry; running ${CLI_VERSION}.`)}\n`);
|
|
25
|
+
else if (newer)
|
|
26
|
+
io.stdout(`Update available: ${CLI_VERSION} → ${latest}. Run: ${viaNpx ? `npx ${PACKAGE_NAME}@latest` : `car-image update`}\n`);
|
|
27
|
+
else
|
|
28
|
+
io.stdout(`${ok(io, `car-image ${CLI_VERSION} is up to date.`)}\n`);
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
if (viaNpx) {
|
|
32
|
+
io.stdout(`You are running through npx; the next \`npx ${PACKAGE_NAME}@latest\` call uses ${latest} automatically.\n`);
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
io.stderr(`Updating ${CLI_VERSION} → ${latest} with ${manager}…\n`);
|
|
36
|
+
const code = await performUpdate(manager, (line) => io.stderr(line));
|
|
37
|
+
if (code !== 0) {
|
|
38
|
+
throw new CliError(`Update failed (exit ${code}).`, 1, `Run manually: ${install.command} ${install.args.join(" ")} (add sudo only if your global prefix requires it, or switch to a user-writable prefix).`);
|
|
39
|
+
}
|
|
40
|
+
io.stdout(`${ok(io, `Updated to ${latest}.`)}\n`);
|
|
41
|
+
return 0;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
function parseConfigValue(key, raw) {
|
|
45
|
+
switch (key) {
|
|
46
|
+
case "autoUpdate": {
|
|
47
|
+
const value = raw.trim().toLowerCase();
|
|
48
|
+
if (!AUTO_UPDATE_MODES.includes(value))
|
|
49
|
+
throw new CliError(`autoUpdate must be one of: ${AUTO_UPDATE_MODES.join(", ")}`, 2);
|
|
50
|
+
return { autoUpdate: value };
|
|
51
|
+
}
|
|
52
|
+
case "telemetry": {
|
|
53
|
+
const value = raw.trim().toLowerCase();
|
|
54
|
+
if (["on", "true", "1", "yes"].includes(value))
|
|
55
|
+
return { telemetry: true };
|
|
56
|
+
if (["off", "false", "0", "no"].includes(value))
|
|
57
|
+
return { telemetry: false };
|
|
58
|
+
throw new CliError("telemetry must be on or off", 2);
|
|
59
|
+
}
|
|
60
|
+
case "baseUrl": {
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(raw.trim());
|
|
63
|
+
if (!/^https?:$/.test(url.protocol))
|
|
64
|
+
throw new Error("protocol");
|
|
65
|
+
return { baseUrl: url.origin + url.pathname.replace(/\/+$/, "") };
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new CliError("baseUrl must be an http(s) URL", 2);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
throw new CliError(`Unknown config key ${String(key)}`, 2);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const configCommand = {
|
|
76
|
+
name: "config",
|
|
77
|
+
summary: "Read or change settings: autoUpdate (ask|always|never), telemetry (on|off), baseUrl; `config path`",
|
|
78
|
+
usage: "car-image config path\ncar-image config get <autoUpdate|telemetry|baseUrl>\ncar-image config set <autoUpdate|telemetry|baseUrl> <value>\ncar-image config list",
|
|
79
|
+
async run(ctx) {
|
|
80
|
+
const [action, rawKey, value] = ctx.args.positionals;
|
|
81
|
+
const { io } = ctx;
|
|
82
|
+
if (!action || action === "list") {
|
|
83
|
+
const config = await readConfig(ctx.configPath);
|
|
84
|
+
const view = {
|
|
85
|
+
path: ctx.configPath,
|
|
86
|
+
autoUpdate: config.autoUpdate ?? "ask",
|
|
87
|
+
telemetry: telemetryEnabled(config, ctx.env) ? "on" : "off",
|
|
88
|
+
baseUrl: config.baseUrl ?? "(default)",
|
|
89
|
+
apiKey: config.apiKey ? "(stored)" : "(none)",
|
|
90
|
+
};
|
|
91
|
+
if (io.json)
|
|
92
|
+
printJson(io, view);
|
|
93
|
+
else
|
|
94
|
+
io.stdout(`${keyValues(io, Object.entries(view))}\n`);
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
if (action === "path") {
|
|
98
|
+
io.stdout(`${ctx.configPath}\n`);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
if (!rawKey || !CONFIG_KEYS.includes(rawKey)) {
|
|
102
|
+
throw new CliError(`Usage: car-image config ${action} <${CONFIG_KEYS.join("|")}>`, 2);
|
|
103
|
+
}
|
|
104
|
+
const key = rawKey;
|
|
105
|
+
if (action === "get") {
|
|
106
|
+
const config = await readConfig(ctx.configPath);
|
|
107
|
+
const current = key === "telemetry" ? (telemetryEnabled(config, ctx.env) ? "on" : "off") : key === "autoUpdate" ? (config.autoUpdate ?? "ask") : (config.baseUrl ?? "");
|
|
108
|
+
if (io.json)
|
|
109
|
+
printJson(io, { [key]: current });
|
|
110
|
+
else
|
|
111
|
+
io.stdout(`${current}\n`);
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
if (action === "set") {
|
|
115
|
+
if (value === undefined)
|
|
116
|
+
throw new CliError(`Usage: car-image config set ${key} <value>`, 2);
|
|
117
|
+
const patch = parseConfigValue(key, value);
|
|
118
|
+
await updateConfig(patch, ctx.configPath);
|
|
119
|
+
if (io.json)
|
|
120
|
+
printJson(io, { ok: true, ...patch });
|
|
121
|
+
else
|
|
122
|
+
io.stdout(`${ok(io, `${key} = ${String(Object.values(patch)[0])}`)}\n`);
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
throw new CliError(`Unknown config action "${action}"`, 2, "Use: path, get, set, list");
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
export const telemetryCommand = {
|
|
129
|
+
name: "telemetry",
|
|
130
|
+
summary: "Turn anonymous usage events on or off, or show the current state",
|
|
131
|
+
usage: "car-image telemetry on|off|status",
|
|
132
|
+
async run(ctx) {
|
|
133
|
+
const action = (ctx.args.positionals[0] ?? "status").toLowerCase();
|
|
134
|
+
const { io } = ctx;
|
|
135
|
+
if (action === "on" || action === "off") {
|
|
136
|
+
const config = await updateConfig({ telemetry: action === "on" }, ctx.configPath);
|
|
137
|
+
const effective = telemetryEnabled(config, ctx.env);
|
|
138
|
+
if (io.json)
|
|
139
|
+
printJson(io, { telemetry: action === "on", effective });
|
|
140
|
+
else
|
|
141
|
+
io.stdout(`${ok(io, `Telemetry ${action}.`)}${action === "on" && !effective ? " (CAR_IMAGE_TELEMETRY in the environment still disables it)" : ""}\n`);
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
if (action !== "status")
|
|
145
|
+
throw new CliError("Usage: car-image telemetry on|off|status", 2);
|
|
146
|
+
const config = await readConfig(ctx.configPath);
|
|
147
|
+
const enabled = telemetryEnabled(config, ctx.env);
|
|
148
|
+
if (io.json) {
|
|
149
|
+
printJson(io, { enabled, anonymous_id: config.anonymousId ?? null, env_override: ctx.env.CAR_IMAGE_TELEMETRY ?? null });
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
io.stdout(`Telemetry is ${enabled ? "on" : "off"}${ctx.env.CAR_IMAGE_TELEMETRY !== undefined ? ` (CAR_IMAGE_TELEMETRY=${ctx.env.CAR_IMAGE_TELEMETRY})` : ""}.\n${TELEMETRY_DISCLOSURE}\n`);
|
|
153
|
+
return 0;
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/commands/maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { paint } from "../output.js";
|
|
2
|
+
import { runDoctorCommand } from "./doctor.js";
|
|
3
|
+
/**
|
|
4
|
+
* `car-image` with no arguments on a TTY: login if needed, show the account,
|
|
5
|
+
* run a quick (free) health check and print the next steps.
|
|
6
|
+
*/
|
|
7
|
+
export const onboardCommand = {
|
|
8
|
+
name: "onboard",
|
|
9
|
+
summary: "Interactive setup: login → account → quick check → next steps (default with no arguments)",
|
|
10
|
+
usage: "car-image [onboard]",
|
|
11
|
+
async run(ctx) {
|
|
12
|
+
const { io } = ctx;
|
|
13
|
+
io.stdout(`${paint(io, "bold", "Car Image API")} — studio-quality vehicle renders for agents, apps and browsers.\n1 credit per image · $1 = 1,000 credits · 100 free credits · no subscription\n\n`);
|
|
14
|
+
if (!ctx.clientContext.apiKey) {
|
|
15
|
+
io.stdout(`${paint(io, "bold", "Step 1/3")} Sign in\n`);
|
|
16
|
+
const code = await ctx.runCommand("login", []);
|
|
17
|
+
if (code !== 0)
|
|
18
|
+
return code;
|
|
19
|
+
io.stdout("\n");
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
io.stdout(`${paint(io, "bold", "Step 1/3")} Signed in (${ctx.clientContext.keySource} key).\n\n`);
|
|
23
|
+
}
|
|
24
|
+
io.stdout(`${paint(io, "bold", "Step 2/3")} Account\n`);
|
|
25
|
+
const whoami = await ctx.runCommand("whoami", []);
|
|
26
|
+
if (whoami !== 0)
|
|
27
|
+
return whoami;
|
|
28
|
+
io.stdout(`\n${paint(io, "bold", "Step 3/3")} Quick check (free)\n`);
|
|
29
|
+
const doctor = await runDoctorCommand({ ...ctx, args: { ...ctx.args, flags: { ...ctx.args.flags, image: false } } }, { quick: true });
|
|
30
|
+
io.stdout(`\n${paint(io, "bold", "Next steps")}\n`);
|
|
31
|
+
io.stdout([
|
|
32
|
+
" car-image get --make Porsche --model 911 --year 2024 --view side --color red --out porsche.png",
|
|
33
|
+
" car-image url --make BMW --model M3 --year 2022 --ttl 86400 # signed URL for a web page",
|
|
34
|
+
" car-image resolve red 2024 porsche 911 side view # free text → parameters",
|
|
35
|
+
" car-image agent-config --host claude-code # MCP setup for agents",
|
|
36
|
+
" car-image describe # the REST API, explained",
|
|
37
|
+
" Docs: https://car-imgs.vercel.app/docs · Agents: https://car-imgs.vercel.app/agents.md",
|
|
38
|
+
].join("\n") + "\n");
|
|
39
|
+
return doctor;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,2FAA2F;IACpG,KAAK,EAAE,qBAAqB;IAC5B,KAAK,CAAC,GAAG,CAAC,GAAmB;QAC3B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,oJAAoJ,CAAC,CAAC;QAErM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC9B,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,eAAe,GAAG,CAAC,aAAa,CAAC,SAAS,YAAY,CAAC,CAAC;QACpG,CAAC;QAED,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEhC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QACpD,EAAE,CAAC,MAAM,CACP;YACE,kGAAkG;YAClG,kGAAkG;YAClG,gGAAgG;YAChG,8FAA8F;YAC9F,iGAAiG;YACjG,0FAA0F;SAC3F,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACpB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { maskKey } from "../config.js";
|
|
2
|
+
import { CliError } from "../errors.js";
|
|
3
|
+
import { creditsToUsd, formatInteger, keyValues, printJson } from "../output.js";
|
|
4
|
+
export const whoamiCommand = {
|
|
5
|
+
name: "whoami",
|
|
6
|
+
aliases: ["status"],
|
|
7
|
+
summary: "Show credits, usage, key and base URL for the current account",
|
|
8
|
+
usage: "car-image whoami [--json]",
|
|
9
|
+
async run(ctx) {
|
|
10
|
+
const { io, clientContext } = ctx;
|
|
11
|
+
if (!clientContext.apiKey) {
|
|
12
|
+
throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
|
|
13
|
+
}
|
|
14
|
+
const account = await clientContext.client.account();
|
|
15
|
+
if (io.json) {
|
|
16
|
+
printJson(io, { ...account, key_source: clientContext.keySource, base_url: clientContext.baseUrl });
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
const data = account.data;
|
|
20
|
+
const perDollar = data.pricing?.credits_per_dollar ?? 1000;
|
|
21
|
+
const usage = data.usage_30d;
|
|
22
|
+
const rows = [
|
|
23
|
+
["Credits", `${formatInteger(data.credits)} (≈ ${creditsToUsd(data.credits, perDollar)}; ${formatInteger(data.pricing?.credits_per_image ?? 1)} credit per image)`],
|
|
24
|
+
["Auto-reload", data.auto_reload ? "on" : "off"],
|
|
25
|
+
["Payment method", data.has_payment_method ? "on file" : "none"],
|
|
26
|
+
];
|
|
27
|
+
if (usage) {
|
|
28
|
+
const hitRate = Number.isFinite(usage.cache_hit_rate) ? `${Math.round(usage.cache_hit_rate * (usage.cache_hit_rate <= 1 ? 100 : 1))}% cache hits` : "";
|
|
29
|
+
rows.push(["Usage (30d)", `${formatInteger(usage.requests)} requests, ${formatInteger(usage.images)} images${hitRate ? `, ${hitRate}` : ""}`]);
|
|
30
|
+
}
|
|
31
|
+
rows.push(["Key", `${data.key?.prefix ? `${data.key.prefix}…` : maskKey(clientContext.apiKey)} (${clientContext.keySource ?? "unknown"} · scopes: ${(data.key?.scopes ?? []).join(", ") || "—"})`]);
|
|
32
|
+
rows.push(["Base URL", clientContext.baseUrl]);
|
|
33
|
+
rows.push(["Config", ctx.configPath]);
|
|
34
|
+
io.stdout(`${keyValues(io, rows)}\n`);
|
|
35
|
+
if (data.credits < 10) {
|
|
36
|
+
io.stdout(`\nLow balance. Buy credits: car-image billing --credits 5000 (${account.links?.billing ?? `${clientContext.baseUrl}/billing`})\n`);
|
|
37
|
+
}
|
|
38
|
+
return 0;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
export const AUTO_UPDATE_MODES = ["ask", "always", "never"];
|
|
5
|
+
export const CONFIG_KEYS = ["autoUpdate", "telemetry", "baseUrl"];
|
|
6
|
+
/** `$CAR_IMAGE_CONFIG`, else `$XDG_CONFIG_HOME/car-image-api/config.json`, else `~/.config/...`. */
|
|
7
|
+
export function configPath(env = process.env) {
|
|
8
|
+
const explicit = env.CAR_IMAGE_CONFIG?.trim();
|
|
9
|
+
if (explicit)
|
|
10
|
+
return explicit;
|
|
11
|
+
const root = env.XDG_CONFIG_HOME?.trim() || join(env.HOME?.trim() || homedir(), ".config");
|
|
12
|
+
return join(root, "car-image-api", "config.json");
|
|
13
|
+
}
|
|
14
|
+
/** 24-hour update-check cache, next to the config file. */
|
|
15
|
+
export function updateCachePath(env = process.env) {
|
|
16
|
+
return join(dirname(configPath(env)), "update-check.json");
|
|
17
|
+
}
|
|
18
|
+
export async function readJsonFile(path) {
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readFile(path, "utf8");
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Atomic write (temp file + rename) with a private mode; parent directory is 0700. */
|
|
29
|
+
export async function writeJsonFile(path, value, mode = 0o600) {
|
|
30
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
31
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
32
|
+
await writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, { mode });
|
|
33
|
+
await chmod(temp, mode);
|
|
34
|
+
await rename(temp, path);
|
|
35
|
+
await chmod(path, mode);
|
|
36
|
+
}
|
|
37
|
+
export async function readConfig(path = configPath()) {
|
|
38
|
+
const raw = await readJsonFile(path);
|
|
39
|
+
if (!raw)
|
|
40
|
+
return {};
|
|
41
|
+
const config = {};
|
|
42
|
+
if (typeof raw.apiKey === "string" && raw.apiKey)
|
|
43
|
+
config.apiKey = raw.apiKey;
|
|
44
|
+
if (typeof raw.baseUrl === "string" && raw.baseUrl)
|
|
45
|
+
config.baseUrl = raw.baseUrl;
|
|
46
|
+
if (raw.autoUpdate === "ask" || raw.autoUpdate === "always" || raw.autoUpdate === "never")
|
|
47
|
+
config.autoUpdate = raw.autoUpdate;
|
|
48
|
+
if (typeof raw.telemetry === "boolean")
|
|
49
|
+
config.telemetry = raw.telemetry;
|
|
50
|
+
if (typeof raw.anonymousId === "string" && raw.anonymousId)
|
|
51
|
+
config.anonymousId = raw.anonymousId;
|
|
52
|
+
if (typeof raw.telemetryDisclosed === "boolean")
|
|
53
|
+
config.telemetryDisclosed = raw.telemetryDisclosed;
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
export async function writeConfig(config, path = configPath()) {
|
|
57
|
+
const clean = {};
|
|
58
|
+
for (const [key, value] of Object.entries(config)) {
|
|
59
|
+
if (value !== undefined && value !== null && value !== "")
|
|
60
|
+
clean[key] = value;
|
|
61
|
+
}
|
|
62
|
+
await writeJsonFile(path, clean, 0o600);
|
|
63
|
+
}
|
|
64
|
+
export async function updateConfig(patch, path = configPath()) {
|
|
65
|
+
const current = await readConfig(path);
|
|
66
|
+
const next = { ...current };
|
|
67
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
delete next[key];
|
|
70
|
+
else
|
|
71
|
+
next[key] = value;
|
|
72
|
+
}
|
|
73
|
+
await writeConfig(next, path);
|
|
74
|
+
return next;
|
|
75
|
+
}
|
|
76
|
+
/** Display form such as `cimg_A1b2…9zY`; the full key is never printed after login. */
|
|
77
|
+
export function maskKey(key) {
|
|
78
|
+
if (!key)
|
|
79
|
+
return "(none)";
|
|
80
|
+
if (key.length <= 12)
|
|
81
|
+
return `${key.slice(0, 4)}…`;
|
|
82
|
+
return `${key.slice(0, 9)}…${key.slice(-3)}`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
|