import {z} from 'zod' export type GetApiArtifactsArgs = {'Antimetal-Version'?: string | undefined, id: Array}; export type GetApiArtifactsOptions = {baseUrl?: string | undefined, bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const metricArtifactDtoSchema1: z.ZodType = z.object({stringValue: z.string().optional(), boolValue: z.boolean().optional(), intValue: z.string().optional(), doubleValue: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), arrayValue: z.object({values: z.array(z.lazy(() => metricArtifactDtoSchema1)).optional()}).optional(), kvlistValue: z.object({values: z.array(z.lazy(() => metricArtifactDtoSchema0)).optional()}).optional(), bytesValue: z.string().optional()}); export const metricArtifactDtoSchema0: z.ZodType = z.object({key: z.string().optional(), value: metricArtifactDtoSchema1.optional()}); export const metricArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("metric"), data: z.union([z.object({metricType: z.literal("gauge"), name: z.string(), description: z.string(), unit: z.string(), dataPoints: z.array(z.object({attributes: z.array(metricArtifactDtoSchema0).optional(), startTimeUnixNano: z.string().optional(), timeUnixNano: z.string().optional(), asDouble: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), asInt: z.string().optional(), exemplars: z.array(z.object({filteredAttributes: z.array(metricArtifactDtoSchema0).optional(), timeUnixNano: z.string().optional(), asDouble: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), asInt: z.string().optional(), spanId: z.string().optional(), traceId: z.string().optional()})).optional(), flags: z.number().optional()}))}), z.object({metricType: z.literal("sum"), name: z.string(), description: z.string(), unit: z.string(), dataPoints: z.array(z.object({attributes: z.array(metricArtifactDtoSchema0).optional(), startTimeUnixNano: z.string().optional(), timeUnixNano: z.string().optional(), asDouble: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), asInt: z.string().optional(), exemplars: z.array(z.object({filteredAttributes: z.array(metricArtifactDtoSchema0).optional(), timeUnixNano: z.string().optional(), asDouble: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), asInt: z.string().optional(), spanId: z.string().optional(), traceId: z.string().optional()})).optional(), flags: z.number().optional()}))}), z.object({metricType: z.literal("histogram"), name: z.string(), description: z.string(), unit: z.string(), dataPoints: z.array(z.object({attributes: z.array(metricArtifactDtoSchema0).optional(), startTimeUnixNano: z.string().optional(), timeUnixNano: z.string().optional(), count: z.string().optional(), sum: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), bucketCounts: z.array(z.string()).optional(), explicitBounds: z.array(z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")])).optional(), exemplars: z.array(z.object({filteredAttributes: z.array(metricArtifactDtoSchema0).optional(), timeUnixNano: z.string().optional(), asDouble: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), asInt: z.string().optional(), spanId: z.string().optional(), traceId: z.string().optional()})).optional(), flags: z.number().optional(), min: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional(), max: z.union([z.number(), z.literal("NaN"), z.literal("Infinity"), z.literal("-Infinity")]).optional()}))})])}); export const traceArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("trace"), data: z.object({traces: z.array(z.object({traceId: z.string(), spans: z.array(z.object({traceId: z.string().optional(), spanId: z.string().optional(), parentSpanId: z.string().optional(), name: z.string().optional(), timestampStartUnixNano: z.number(), timestampEndUnixNano: z.number()}))}))})}); export const logArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("log"), data: z.object({logs: z.array(z.object({timestamp: z.string(), body: z.string(), severity: z.string(), attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.string())])).optional()}))})}); export const fileArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("file"), data: z.object({content: z.string(), metadata: z.object({fileName: z.string(), filePath: z.string(), language: z.string(), lineStart: z.number().int().gt(0).lte(9007199254740991).optional(), lineEnd: z.number().int().gt(0).lte(9007199254740991).optional()})})}); export const eventArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("event"), data: z.object({events: z.array(z.object({eventId: z.string(), timestampUnixNano: z.number(), title: z.string(), message: z.string().optional(), service: z.string().optional()}))})}); export const topologyArtifactDto = z.object({id: z.string(), provider: z.enum(["datadog", "github", "slack", "antimetal", "sentry", "kubernetes", "incident-io", "prometheus", "grafana-tempo", "loki", "gcp", "cloudwatch", "user"]), providerUrl: z.string().nullable(), summary: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), type: z.literal("topology"), data: z.record(z.string(), z.object({calls: z.array(z.string()).optional()})).optional()}); export const getApiArtifactsResponse = z.array(z.discriminatedUnion("type", [metricArtifactDto, traceArtifactDto, logArtifactDto, fileArtifactDto, eventArtifactDto, topologyArtifactDto])); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Retrieve artifacts by IDs * * GET /artifacts */ export const getApiArtifacts = async (args: GetApiArtifactsArgs, options?: GetApiArtifactsOptions) => { const {baseUrl = "https://bff.antimetal.com/api/v2", fetch: fetchFn = fetch, bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['Antimetal-Version'] != null) headers.set("Antimetal-Version", String(args['Antimetal-Version'])) for (const item of args.id ?? []) query.append("id", String(item)) if (bearer !== undefined) headers.set('authorization', `Bearer ${bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/artifacts${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiArtifactsResponse, await res.json()) };