@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
package/dist/describe.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
const METHODS = ["get", "post", "put", "patch", "delete", "head", "options"];
|
|
2
|
+
function isObject(value) {
|
|
3
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
/** Follows `#/components/...` references (repeatedly) inside the same document. */
|
|
6
|
+
export function resolveRef(doc, node, depth = 0) {
|
|
7
|
+
if (!isObject(node))
|
|
8
|
+
return {};
|
|
9
|
+
const ref = node.$ref;
|
|
10
|
+
if (typeof ref !== "string" || depth > 8)
|
|
11
|
+
return node;
|
|
12
|
+
if (!ref.startsWith("#/"))
|
|
13
|
+
return node;
|
|
14
|
+
let current = doc;
|
|
15
|
+
for (const segment of ref.slice(2).split("/")) {
|
|
16
|
+
if (!isObject(current))
|
|
17
|
+
return node;
|
|
18
|
+
current = current[segment.replace(/~1/g, "/").replace(/~0/g, "~")];
|
|
19
|
+
}
|
|
20
|
+
return isObject(current) ? resolveRef(doc, current, depth + 1) : node;
|
|
21
|
+
}
|
|
22
|
+
export function listEndpoints(doc) {
|
|
23
|
+
const endpoints = [];
|
|
24
|
+
for (const [path, item] of Object.entries(doc.paths ?? {})) {
|
|
25
|
+
if (!isObject(item))
|
|
26
|
+
continue;
|
|
27
|
+
for (const method of METHODS) {
|
|
28
|
+
const operation = item[method];
|
|
29
|
+
if (!isObject(operation))
|
|
30
|
+
continue;
|
|
31
|
+
endpoints.push({
|
|
32
|
+
method: method.toUpperCase(),
|
|
33
|
+
path,
|
|
34
|
+
operationId: typeof operation.operationId === "string" ? operation.operationId : null,
|
|
35
|
+
summary: typeof operation.summary === "string" ? operation.summary : "",
|
|
36
|
+
operation,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return endpoints;
|
|
41
|
+
}
|
|
42
|
+
/** Matches by operationId, `METHOD /path`, path fragment or summary words (case-insensitive). */
|
|
43
|
+
export function findEndpoints(doc, query) {
|
|
44
|
+
const needle = query.trim().toLowerCase();
|
|
45
|
+
if (!needle || needle === "all")
|
|
46
|
+
return listEndpoints(doc);
|
|
47
|
+
const endpoints = listEndpoints(doc);
|
|
48
|
+
const exact = endpoints.filter((endpoint) => endpoint.operationId?.toLowerCase() === needle || `${endpoint.method} ${endpoint.path}`.toLowerCase() === needle || endpoint.path.toLowerCase() === needle);
|
|
49
|
+
if (exact.length)
|
|
50
|
+
return exact;
|
|
51
|
+
return endpoints.filter((endpoint) => endpoint.path.toLowerCase().includes(needle) ||
|
|
52
|
+
(endpoint.operationId ?? "").toLowerCase().includes(needle) ||
|
|
53
|
+
endpoint.summary.toLowerCase().includes(needle));
|
|
54
|
+
}
|
|
55
|
+
export function wrap(text, width = 88, indent = "") {
|
|
56
|
+
const words = text.replace(/\s+/g, " ").trim().split(" ");
|
|
57
|
+
const lines = [];
|
|
58
|
+
let line = "";
|
|
59
|
+
for (const word of words) {
|
|
60
|
+
if (line && (line.length + 1 + word.length) > width - indent.length) {
|
|
61
|
+
lines.push(indent + line);
|
|
62
|
+
line = word;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
line = line ? `${line} ${word}` : word;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (line)
|
|
69
|
+
lines.push(indent + line);
|
|
70
|
+
return lines.join("\n");
|
|
71
|
+
}
|
|
72
|
+
/** One-line human summary of a JSON Schema fragment. */
|
|
73
|
+
export function schemaSummary(doc, raw, depth = 0) {
|
|
74
|
+
const schema = resolveRef(doc, raw);
|
|
75
|
+
if (Object.keys(schema).length === 0)
|
|
76
|
+
return "any";
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (Array.isArray(schema.enum)) {
|
|
79
|
+
parts.push(`enum: ${schema.enum.map(String).join("|")}`);
|
|
80
|
+
}
|
|
81
|
+
else if (schema.const !== undefined) {
|
|
82
|
+
parts.push(typeof schema.type === "string" ? `${schema.type} const ${JSON.stringify(schema.const)}` : `const ${JSON.stringify(schema.const)}`);
|
|
83
|
+
}
|
|
84
|
+
else if (Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf)) {
|
|
85
|
+
const options = (schema.oneOf ?? schema.anyOf);
|
|
86
|
+
parts.push(options.map((option) => schemaSummary(doc, option, depth + 1)).join(" | "));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const type = Array.isArray(schema.type) ? schema.type.join("|") : typeof schema.type === "string" ? schema.type : schema.properties ? "object" : schema.items ? "array" : "any";
|
|
90
|
+
if (type === "array") {
|
|
91
|
+
parts.push(`array<${depth > 2 ? "…" : schemaSummary(doc, schema.items, depth + 1)}>`);
|
|
92
|
+
}
|
|
93
|
+
else if (type === "object" && isObject(schema.properties)) {
|
|
94
|
+
const required = new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);
|
|
95
|
+
const fields = Object.keys(schema.properties).map((key) => (required.has(key) ? `${key}*` : key));
|
|
96
|
+
parts.push(depth > 2 ? "object" : `object {${fields.join(", ")}}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
parts.push(type);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const bounds = [];
|
|
103
|
+
if (typeof schema.minimum === "number" || typeof schema.maximum === "number") {
|
|
104
|
+
bounds.push(`${schema.minimum ?? "…"}–${schema.maximum ?? "…"}`);
|
|
105
|
+
}
|
|
106
|
+
if (typeof schema.minLength === "number" || typeof schema.maxLength === "number") {
|
|
107
|
+
bounds.push(`len ${schema.minLength ?? 0}–${schema.maxLength ?? "…"}`);
|
|
108
|
+
}
|
|
109
|
+
if (typeof schema.minItems === "number" || typeof schema.maxItems === "number") {
|
|
110
|
+
bounds.push(`items ${schema.minItems ?? 0}–${schema.maxItems ?? "…"}`);
|
|
111
|
+
}
|
|
112
|
+
if (typeof schema.format === "string")
|
|
113
|
+
bounds.push(schema.format);
|
|
114
|
+
if (bounds.length)
|
|
115
|
+
parts.push(`(${bounds.join(", ")})`);
|
|
116
|
+
if (schema.default !== undefined)
|
|
117
|
+
parts.push(`default ${JSON.stringify(schema.default)}`);
|
|
118
|
+
return parts.join(" ");
|
|
119
|
+
}
|
|
120
|
+
function parameterRows(doc, operation) {
|
|
121
|
+
const raw = Array.isArray(operation.parameters) ? operation.parameters : [];
|
|
122
|
+
return raw.map((entry) => {
|
|
123
|
+
const parameter = resolveRef(doc, entry);
|
|
124
|
+
return {
|
|
125
|
+
name: String(parameter.name ?? "?"),
|
|
126
|
+
location: String(parameter.in ?? "query"),
|
|
127
|
+
required: parameter.required === true,
|
|
128
|
+
schema: schemaSummary(doc, parameter.schema),
|
|
129
|
+
description: typeof parameter.description === "string" ? parameter.description : "",
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function pad(text, width) {
|
|
134
|
+
return text.length >= width ? text : text + " ".repeat(width - text.length);
|
|
135
|
+
}
|
|
136
|
+
function securityLabel(doc, operation) {
|
|
137
|
+
const security = Array.isArray(operation.security) ? operation.security : Array.isArray(doc.security) ? doc.security : [];
|
|
138
|
+
if (security.length === 0)
|
|
139
|
+
return "public";
|
|
140
|
+
const schemes = security.flatMap((entry) => (isObject(entry) ? Object.keys(entry) : []));
|
|
141
|
+
if (schemes.length === 0 || security.some((entry) => isObject(entry) && Object.keys(entry).length === 0))
|
|
142
|
+
return "public";
|
|
143
|
+
return `Bearer API key (${schemes.join(", ")})`;
|
|
144
|
+
}
|
|
145
|
+
/** Full human description of one operation. */
|
|
146
|
+
export function formatEndpoint(doc, endpoint) {
|
|
147
|
+
const { operation } = endpoint;
|
|
148
|
+
const lines = [];
|
|
149
|
+
lines.push(`${endpoint.method} ${endpoint.path}${endpoint.operationId ? ` (${endpoint.operationId})` : ""}`);
|
|
150
|
+
if (endpoint.summary)
|
|
151
|
+
lines.push(` ${endpoint.summary}`);
|
|
152
|
+
if (typeof operation.description === "string" && operation.description.trim()) {
|
|
153
|
+
lines.push(wrap(operation.description, 88, " "));
|
|
154
|
+
}
|
|
155
|
+
lines.push(` Auth: ${securityLabel(doc, operation)}`);
|
|
156
|
+
const parameters = parameterRows(doc, operation);
|
|
157
|
+
if (parameters.length) {
|
|
158
|
+
lines.push(" Parameters:");
|
|
159
|
+
const nameWidth = Math.max(...parameters.map((row) => row.name.length));
|
|
160
|
+
const schemaWidth = Math.min(48, Math.max(...parameters.map((row) => row.schema.length)));
|
|
161
|
+
for (const row of parameters) {
|
|
162
|
+
const head = ` ${pad(row.name, nameWidth)} ${pad(row.location, 6)} ${row.required ? "required" : "optional"} ${pad(row.schema, schemaWidth)}`;
|
|
163
|
+
lines.push(row.description ? `${head} ${row.description}` : head.trimEnd());
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const requestBody = resolveRef(doc, operation.requestBody);
|
|
167
|
+
if (isObject(requestBody.content)) {
|
|
168
|
+
for (const [mediaType, media] of Object.entries(requestBody.content)) {
|
|
169
|
+
if (!isObject(media))
|
|
170
|
+
continue;
|
|
171
|
+
lines.push(` Request body (${mediaType}${requestBody.required === true ? ", required" : ""}): ${schemaSummary(doc, media.schema)}`);
|
|
172
|
+
const schema = resolveRef(doc, media.schema);
|
|
173
|
+
if (isObject(schema.properties)) {
|
|
174
|
+
const required = new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);
|
|
175
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
176
|
+
const property = resolveRef(doc, value);
|
|
177
|
+
const description = typeof property.description === "string" ? ` ${property.description}` : "";
|
|
178
|
+
lines.push(` ${key}${required.has(key) ? "*" : ""}: ${schemaSummary(doc, value, 1)}${description}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (isObject(operation.responses)) {
|
|
184
|
+
lines.push(" Responses:");
|
|
185
|
+
for (const [status, value] of Object.entries(operation.responses)) {
|
|
186
|
+
const response = resolveRef(doc, value);
|
|
187
|
+
const description = typeof response.description === "string" ? response.description : "";
|
|
188
|
+
lines.push(` ${pad(status, 4)} ${description}`.trimEnd());
|
|
189
|
+
if (isObject(response.headers)) {
|
|
190
|
+
const headers = Object.entries(response.headers).map(([name, header]) => `${name} (${schemaSummary(doc, resolveRef(doc, header).schema)})`);
|
|
191
|
+
if (headers.length)
|
|
192
|
+
lines.push(` headers: ${headers.join(", ")}`);
|
|
193
|
+
}
|
|
194
|
+
if (isObject(response.content)) {
|
|
195
|
+
const types = Object.keys(response.content);
|
|
196
|
+
if (types.length)
|
|
197
|
+
lines.push(` content: ${types.join(", ")}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (const [key, value] of Object.entries(operation)) {
|
|
202
|
+
if (key.startsWith("x-") && typeof value === "string") {
|
|
203
|
+
lines.push(wrap(`${key.replace(/^x-/, "").replace(/-/g, " ")}: ${value}`, 88, " "));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return lines.join("\n");
|
|
207
|
+
}
|
|
208
|
+
/** `METHOD path — summary` per line, aligned. */
|
|
209
|
+
export function formatEndpointList(doc) {
|
|
210
|
+
const endpoints = listEndpoints(doc);
|
|
211
|
+
if (endpoints.length === 0)
|
|
212
|
+
return "No endpoints found in the OpenAPI document.";
|
|
213
|
+
const methodWidth = Math.max(...endpoints.map((endpoint) => endpoint.method.length));
|
|
214
|
+
const pathWidth = Math.max(...endpoints.map((endpoint) => endpoint.path.length));
|
|
215
|
+
const title = `${doc.info?.title ?? "API"} ${doc.info?.version ?? ""}`.trim();
|
|
216
|
+
const server = doc.servers?.[0]?.url;
|
|
217
|
+
const header = [title, server ? `Base URL: ${server}` : null, ""].filter((line) => line !== null);
|
|
218
|
+
const rows = endpoints.map((endpoint) => `${pad(endpoint.method, methodWidth)} ${pad(endpoint.path, pathWidth)} ${endpoint.summary}`.trimEnd());
|
|
219
|
+
return [...header, ...rows, "", "Run `car-image describe <operationId|path>` for parameters, headers and error codes, or `car-image describe all`."].join("\n");
|
|
220
|
+
}
|
|
221
|
+
export function formatAll(doc) {
|
|
222
|
+
return listEndpoints(doc)
|
|
223
|
+
.map((endpoint) => formatEndpoint(doc, endpoint))
|
|
224
|
+
.join("\n\n");
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isCarImageError } from "@meterapp/car-image-sdk";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
export const MAX_POLL_INTERVAL_MS = 15_000;
|
|
4
|
+
/**
|
|
5
|
+
* OAuth-style device flow: start, show the code, poll until approved. Transient
|
|
6
|
+
* failures (network, 5xx, 429) back off and keep polling; the flow gives up
|
|
7
|
+
* when the server says the code expired or the deadline passes.
|
|
8
|
+
*/
|
|
9
|
+
export async function runDeviceLogin(deps) {
|
|
10
|
+
const info = await deps.start();
|
|
11
|
+
await deps.onCode(info);
|
|
12
|
+
const startedAt = deps.now();
|
|
13
|
+
const deadline = startedAt + Math.max(30, info.expires_in || 600) * 1000;
|
|
14
|
+
let intervalMs = Math.max(1, info.interval || 3) * 1000;
|
|
15
|
+
let polls = 0;
|
|
16
|
+
while (deps.now() < deadline) {
|
|
17
|
+
await deps.sleep(intervalMs);
|
|
18
|
+
polls += 1;
|
|
19
|
+
let result;
|
|
20
|
+
try {
|
|
21
|
+
result = await deps.poll(info.device_code);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const transient = isCarImageError(error) && (error.status === 0 || error.status === 429 || error.status >= 500);
|
|
25
|
+
if (!transient)
|
|
26
|
+
throw error;
|
|
27
|
+
intervalMs = Math.min(intervalMs * 2, MAX_POLL_INTERVAL_MS);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (result.status === "approved") {
|
|
31
|
+
if (!result.accessToken)
|
|
32
|
+
throw new CliError("The server approved the login but returned no key.", 1, "Try `car-image login` again.");
|
|
33
|
+
return { accessToken: result.accessToken, scope: result.scope, polls };
|
|
34
|
+
}
|
|
35
|
+
if (result.status === "expired") {
|
|
36
|
+
throw new CliError("The login code expired before it was approved.", 1, "Run `car-image login` again and approve the code within 10 minutes.");
|
|
37
|
+
}
|
|
38
|
+
deps.onPending?.(deps.now() - startedAt);
|
|
39
|
+
}
|
|
40
|
+
throw new CliError("Timed out waiting for browser approval.", 1, "Run `car-image login` again.");
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=device-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-login.js","sourceRoot":"","sources":["../src/device-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmD,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmBvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IACzE,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,MAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YAChH,IAAI,CAAC,SAAS;gBAAE,MAAM,KAAK,CAAC;YAC5B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,QAAQ,CAAC,oDAAoD,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACrI,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,CAAC,gDAAgD,EAAE,CAAC,EAAE,qEAAqE,CAAC,CAAC;QACjJ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,yCAAyC,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;AACnG,CAAC"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { fixHintFor } from "./errors.js";
|
|
2
|
+
import { paint, table } from "./output.js";
|
|
3
|
+
const PAID_CHECKS = ["image-urls", "delivery:head", "delivery:get", "image", "feedback"];
|
|
4
|
+
async function readBody(response) {
|
|
5
|
+
const type = response.headers.get("content-type") ?? "";
|
|
6
|
+
if (type.includes("json")) {
|
|
7
|
+
try {
|
|
8
|
+
return { json: await response.json() };
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return { text: "" };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (type.startsWith("image/")) {
|
|
15
|
+
return { bytes: (await response.arrayBuffer()).byteLength };
|
|
16
|
+
}
|
|
17
|
+
return { text: await response.text().catch(() => "") };
|
|
18
|
+
}
|
|
19
|
+
function problemDetail(body) {
|
|
20
|
+
if ("json" in body && body.json && typeof body.json === "object") {
|
|
21
|
+
const record = body.json;
|
|
22
|
+
if (typeof record.detail === "string")
|
|
23
|
+
return record.detail;
|
|
24
|
+
if (typeof record.title === "string")
|
|
25
|
+
return record.title;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function get(value, path) {
|
|
30
|
+
let current = value;
|
|
31
|
+
for (const segment of path.split(".")) {
|
|
32
|
+
if (!current || typeof current !== "object")
|
|
33
|
+
return undefined;
|
|
34
|
+
current = current[segment];
|
|
35
|
+
}
|
|
36
|
+
return current;
|
|
37
|
+
}
|
|
38
|
+
function retryAfter(response) {
|
|
39
|
+
const raw = response.headers.get("retry-after");
|
|
40
|
+
return raw && /^\d+$/.test(raw) ? Number(raw) : null;
|
|
41
|
+
}
|
|
42
|
+
/** Runs one probe, timing it and converting any failure into a `fail` row. */
|
|
43
|
+
async function probe(deps, name, request, evaluate) {
|
|
44
|
+
const started = deps.now();
|
|
45
|
+
let check;
|
|
46
|
+
let response = null;
|
|
47
|
+
let body = null;
|
|
48
|
+
try {
|
|
49
|
+
response = await request();
|
|
50
|
+
body = await readBody(response);
|
|
51
|
+
const latencyMs = deps.now() - started;
|
|
52
|
+
const requestId = response.headers.get("x-request-id");
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const detail = problemDetail(body);
|
|
55
|
+
check = {
|
|
56
|
+
name,
|
|
57
|
+
status: "fail",
|
|
58
|
+
latencyMs,
|
|
59
|
+
cache: null,
|
|
60
|
+
credits: null,
|
|
61
|
+
notes: `HTTP ${response.status}${detail ? `: ${detail}` : ""}`,
|
|
62
|
+
httpStatus: response.status,
|
|
63
|
+
requestId,
|
|
64
|
+
hint: fixHintFor(response.status, retryAfter(response)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const result = evaluate(response, body);
|
|
69
|
+
check = {
|
|
70
|
+
name,
|
|
71
|
+
status: result.ok ? "pass" : "fail",
|
|
72
|
+
latencyMs,
|
|
73
|
+
cache: result.cache ?? response.headers.get("x-image-source"),
|
|
74
|
+
credits: result.credits ?? numberHeader(response, "x-credits-charged"),
|
|
75
|
+
notes: result.notes,
|
|
76
|
+
httpStatus: response.status,
|
|
77
|
+
requestId: result.requestId ?? requestId,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
check = {
|
|
83
|
+
name,
|
|
84
|
+
status: "fail",
|
|
85
|
+
latencyMs: deps.now() - started,
|
|
86
|
+
cache: null,
|
|
87
|
+
credits: null,
|
|
88
|
+
notes: error instanceof Error ? error.message : String(error),
|
|
89
|
+
httpStatus: null,
|
|
90
|
+
requestId: null,
|
|
91
|
+
hint: fixHintFor(0),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
deps.onCheck?.(check);
|
|
95
|
+
return { check, response, body };
|
|
96
|
+
}
|
|
97
|
+
function numberHeader(response, name) {
|
|
98
|
+
const raw = response.headers.get(name);
|
|
99
|
+
if (raw === null)
|
|
100
|
+
return null;
|
|
101
|
+
const value = Number(raw);
|
|
102
|
+
return Number.isFinite(value) ? value : null;
|
|
103
|
+
}
|
|
104
|
+
function skip(deps, name, notes, hint) {
|
|
105
|
+
const check = { name, status: "skip", latencyMs: null, cache: null, credits: null, notes, httpStatus: null, requestId: null, hint };
|
|
106
|
+
deps.onCheck?.(check);
|
|
107
|
+
return check;
|
|
108
|
+
}
|
|
109
|
+
const JSON_HEADERS = { Accept: "application/json" };
|
|
110
|
+
/**
|
|
111
|
+
* Full smoke test of every public and keyed endpoint. Spends at most 2 credits:
|
|
112
|
+
* one for the signed URL and one for the optional keyed image GET.
|
|
113
|
+
*/
|
|
114
|
+
export async function runDoctor(deps) {
|
|
115
|
+
const checks = [];
|
|
116
|
+
const noKeyHint = "Run `car-image login` or set CAR_IMAGE_API_KEY.";
|
|
117
|
+
// Public surface -------------------------------------------------------
|
|
118
|
+
const health = await probe(deps, "health", () => deps.client.fetch("/api/health", { headers: JSON_HEADERS }), (_response, body) => {
|
|
119
|
+
const status = get("json" in body ? body.json : null, "status");
|
|
120
|
+
return { ok: status === "ok" || status === "degraded", notes: `status=${String(status ?? "unknown")}` };
|
|
121
|
+
});
|
|
122
|
+
checks.push(health.check);
|
|
123
|
+
checks.push((await probe(deps, "options", () => deps.client.fetch("/api/v1/images/options", { headers: JSON_HEADERS }), (_response, body) => {
|
|
124
|
+
const views = get("json" in body ? body.json : null, "data.views");
|
|
125
|
+
const colors = get("json" in body ? body.json : null, "data.colors");
|
|
126
|
+
const ok = Array.isArray(views) && views.length === 6 && Array.isArray(colors) && colors.length === 15;
|
|
127
|
+
return { ok, notes: `${Array.isArray(views) ? views.length : 0} views, ${Array.isArray(colors) ? colors.length : 0} colors` };
|
|
128
|
+
})).check);
|
|
129
|
+
let year = 2024;
|
|
130
|
+
const years = await probe(deps, "vehicles:years", () => deps.client.fetch("/api/v1/vehicles", { headers: JSON_HEADERS }), (_response, body) => {
|
|
131
|
+
const list = get("json" in body ? body.json : null, "data.years");
|
|
132
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
133
|
+
return { ok: false, notes: "no years returned" };
|
|
134
|
+
const numbers = list.map(Number).filter(Number.isFinite);
|
|
135
|
+
year = numbers.includes(2024) ? 2024 : Math.max(...numbers);
|
|
136
|
+
return { ok: true, notes: `${numbers.length} years (${Math.min(...numbers)}–${Math.max(...numbers)})` };
|
|
137
|
+
});
|
|
138
|
+
checks.push(years.check);
|
|
139
|
+
let makeId = null;
|
|
140
|
+
const makes = await probe(deps, "vehicles:makes", () => deps.client.fetch(`/api/v1/vehicles?year=${year}`, { headers: JSON_HEADERS }), (_response, body) => {
|
|
141
|
+
const list = get("json" in body ? body.json : null, "data.makes");
|
|
142
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
143
|
+
return { ok: false, notes: `no makes for ${year}` };
|
|
144
|
+
const porsche = list.find((make) => typeof make === "object" && make && /porsche/i.test(String(make.name)));
|
|
145
|
+
const first = (porsche ?? list[0]);
|
|
146
|
+
makeId = Number(first.id);
|
|
147
|
+
return { ok: Number.isFinite(makeId), notes: `${list.length} makes for ${year}; using ${String(first.name)} (#${String(first.id)})` };
|
|
148
|
+
});
|
|
149
|
+
checks.push(makes.check);
|
|
150
|
+
if (makeId !== null) {
|
|
151
|
+
checks.push((await probe(deps, "vehicles:models", () => deps.client.fetch(`/api/v1/vehicles?year=${year}&makeId=${makeId}`, { headers: JSON_HEADERS }), (_response, body) => {
|
|
152
|
+
const list = get("json" in body ? body.json : null, "data.models");
|
|
153
|
+
return { ok: Array.isArray(list) && list.length > 0, notes: `${Array.isArray(list) ? list.length : 0} models` };
|
|
154
|
+
})).check);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
checks.push(skip(deps, "vehicles:models", "skipped: no make id"));
|
|
158
|
+
}
|
|
159
|
+
checks.push((await probe(deps, "search", () => deps.client.fetch("/api/v1/vehicles?q=porsche%20911&limit=5", { headers: JSON_HEADERS }), (_response, body) => {
|
|
160
|
+
const results = get("json" in body ? body.json : null, "data.results");
|
|
161
|
+
return { ok: Array.isArray(results) && results.length > 0, notes: `${Array.isArray(results) ? results.length : 0} results for "porsche 911"` };
|
|
162
|
+
})).check);
|
|
163
|
+
// Keyed surface --------------------------------------------------------
|
|
164
|
+
if (!deps.hasKey) {
|
|
165
|
+
checks.push({ name: "auth", status: "fail", latencyMs: null, cache: null, credits: null, notes: "no API key configured", httpStatus: 401, requestId: null, hint: noKeyHint });
|
|
166
|
+
for (const name of ["resolve", "account", ...PAID_CHECKS]) {
|
|
167
|
+
checks.push(skip(deps, name, "skipped: no API key"));
|
|
168
|
+
}
|
|
169
|
+
return checks;
|
|
170
|
+
}
|
|
171
|
+
checks.push((await probe(deps, "resolve", () => deps.client.fetch("/api/v1/images/resolve", {
|
|
172
|
+
method: "POST",
|
|
173
|
+
headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
|
|
174
|
+
body: JSON.stringify({ query: "red 2024 porsche 911 side view" }),
|
|
175
|
+
}), (_response, body) => {
|
|
176
|
+
const params = get("json" in body ? body.json : null, "data.params");
|
|
177
|
+
const ok = Boolean(params && /porsche/i.test(String(params.make)) && String(params.view) === "side" && String(params.color) === "red");
|
|
178
|
+
return { ok, notes: params ? `${String(params.make)} ${String(params.model)} ${String(params.year)} ${String(params.view)} ${String(params.color)}` : "no params" };
|
|
179
|
+
})).check);
|
|
180
|
+
checks.push((await probe(deps, "account", () => deps.client.fetch("/api/v1/account", { headers: JSON_HEADERS }), (_response, body) => {
|
|
181
|
+
const credits = get("json" in body ? body.json : null, "data.credits");
|
|
182
|
+
return { ok: typeof credits === "number", notes: typeof credits === "number" ? `credits=${credits.toLocaleString("en-US")}` : "no credits field" };
|
|
183
|
+
})).check);
|
|
184
|
+
if (deps.quick) {
|
|
185
|
+
for (const name of PAID_CHECKS)
|
|
186
|
+
checks.push(skip(deps, name, "skipped in quick mode (costs credits); run `car-image doctor`"));
|
|
187
|
+
return checks;
|
|
188
|
+
}
|
|
189
|
+
let deliveryUrl = null;
|
|
190
|
+
let urlRequestId = null;
|
|
191
|
+
const mint = await probe(deps, "image-urls", () => deps.client.fetch("/api/v1/image-urls", {
|
|
192
|
+
method: "POST",
|
|
193
|
+
headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
|
|
194
|
+
body: JSON.stringify({ images: [{ make: "Porsche", model: "911", year: 2024, view: "front-3-4", width: 256 }], ttl_seconds: 600 }),
|
|
195
|
+
}), (_response, body) => {
|
|
196
|
+
const json = "json" in body ? body.json : null;
|
|
197
|
+
const url = get(json, "data.0.url");
|
|
198
|
+
const charged = get(json, "billing.credits_charged");
|
|
199
|
+
const remaining = get(json, "billing.credits_remaining");
|
|
200
|
+
urlRequestId = typeof get(json, "request_id") === "string" ? get(json, "request_id") : null;
|
|
201
|
+
if (typeof url !== "string")
|
|
202
|
+
return { ok: false, notes: "no url in response" };
|
|
203
|
+
deliveryUrl = url;
|
|
204
|
+
return {
|
|
205
|
+
ok: true,
|
|
206
|
+
notes: `minted 1 URL; ${typeof remaining === "number" ? `${remaining.toLocaleString("en-US")} credits left` : "ok"}`,
|
|
207
|
+
credits: typeof charged === "number" ? charged : 1,
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
checks.push(mint.check);
|
|
211
|
+
if (deliveryUrl) {
|
|
212
|
+
const url = deliveryUrl;
|
|
213
|
+
const head = await probe(deps, "delivery:head", () => deps.publicFetch(url, { method: "HEAD" }), (response) => {
|
|
214
|
+
const type = response.headers.get("content-type") ?? "";
|
|
215
|
+
return { ok: type.startsWith("image/"), notes: type ? `content-type ${type}` : "no content-type" };
|
|
216
|
+
});
|
|
217
|
+
if (head.check.status === "fail" && head.check.httpStatus === 405) {
|
|
218
|
+
head.check.status = "skip";
|
|
219
|
+
head.check.notes = "HEAD not supported (405)";
|
|
220
|
+
head.check.hint = undefined;
|
|
221
|
+
}
|
|
222
|
+
checks.push(head.check);
|
|
223
|
+
checks.push((await probe(deps, "delivery:get", () => deps.publicFetch(url), (response, body) => {
|
|
224
|
+
const type = response.headers.get("content-type") ?? "";
|
|
225
|
+
const bytes = "bytes" in body ? body.bytes : 0;
|
|
226
|
+
return { ok: type.startsWith("image/") && bytes > 0, notes: `${type || "unknown type"}, ${(bytes / 1024).toFixed(1)} KB` };
|
|
227
|
+
})).check);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
checks.push(skip(deps, "delivery:head", "skipped: no URL minted"));
|
|
231
|
+
checks.push(skip(deps, "delivery:get", "skipped: no URL minted"));
|
|
232
|
+
}
|
|
233
|
+
let imageRequestId = null;
|
|
234
|
+
if (deps.includeImage) {
|
|
235
|
+
const image = await probe(deps, "image", () => deps.client.fetch("/api/v1/images/car?make=Porsche&model=911&year=2024&view=front-3-4&w=256", { headers: { Accept: "image/*" } }), (response, body) => {
|
|
236
|
+
const type = response.headers.get("content-type") ?? "";
|
|
237
|
+
const bytes = "bytes" in body ? body.bytes : 0;
|
|
238
|
+
imageRequestId = response.headers.get("x-request-id");
|
|
239
|
+
const remaining = response.headers.get("x-credits-remaining");
|
|
240
|
+
return { ok: type.startsWith("image/") && bytes > 0, notes: `${type}, ${(bytes / 1024).toFixed(1)} KB${remaining ? `, ${remaining} credits left` : ""}` };
|
|
241
|
+
});
|
|
242
|
+
checks.push(image.check);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
checks.push(skip(deps, "image", "skipped (--no-image or declined); costs 1 credit"));
|
|
246
|
+
}
|
|
247
|
+
const feedbackBody = imageRequestId
|
|
248
|
+
? { request_id: imageRequestId, verdict: "good", reason: "car-image doctor" }
|
|
249
|
+
: urlRequestId
|
|
250
|
+
? { request_id: urlRequestId, verdict: "good", reason: "car-image doctor" }
|
|
251
|
+
: { make: "Porsche", model: "911", year: 2024, view: "front-3-4", verdict: "good", reason: "car-image doctor" };
|
|
252
|
+
checks.push((await probe(deps, "feedback", () => deps.client.fetch("/api/v1/feedback", {
|
|
253
|
+
method: "POST",
|
|
254
|
+
headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
|
|
255
|
+
body: JSON.stringify(feedbackBody),
|
|
256
|
+
}), (response) => ({ ok: response.status === 201 || response.status === 200, notes: `verdict good recorded (${"request_id" in feedbackBody ? "by request id" : "by vehicle"})` }))).check);
|
|
257
|
+
return checks;
|
|
258
|
+
}
|
|
259
|
+
export function doctorSummary(checks) {
|
|
260
|
+
const passed = checks.filter((check) => check.status === "pass").length;
|
|
261
|
+
const failed = checks.filter((check) => check.status === "fail").length;
|
|
262
|
+
const skipped = checks.filter((check) => check.status === "skip").length;
|
|
263
|
+
return { passed, failed, skipped, ok: failed === 0 };
|
|
264
|
+
}
|
|
265
|
+
export function renderDoctorTable(checks, io) {
|
|
266
|
+
const rows = checks.map((check) => [
|
|
267
|
+
check.name,
|
|
268
|
+
check.status === "pass" ? paint(io, "green", "pass") : check.status === "fail" ? paint(io, "red", "FAIL") : paint(io, "dim", "skip"),
|
|
269
|
+
check.latencyMs === null ? "—" : `${check.latencyMs} ms`,
|
|
270
|
+
check.cache ?? "—",
|
|
271
|
+
check.credits === null || check.credits === 0 ? "—" : String(check.credits),
|
|
272
|
+
check.notes,
|
|
273
|
+
]);
|
|
274
|
+
const body = table(rows, ["check", "status", "latency", "cache", "credits", "notes"]);
|
|
275
|
+
const hints = checks
|
|
276
|
+
.filter((check) => check.status === "fail" && check.hint)
|
|
277
|
+
.map((check) => ` ${paint(io, "yellow", "→")} ${check.name}: ${check.hint}${check.requestId ? ` (request ${check.requestId})` : ""}`);
|
|
278
|
+
return hints.length ? `${body}\n\nFixes:\n${hints.join("\n")}` : body;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|