@openplait/adapter-tempo 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,458 @@
1
+ import { AdapterError, isAbortError, isCompiledQuery, } from "@openplait/adapter-sdk";
2
+ import { compileTempoQuery, tempoFieldRegistry } from "./compiler.js";
3
+ import { TEMPO_TRACE_FIELDS, tempoSemanticSchema } from "./datasets.js";
4
+ import { compileNativeTempoQuery } from "./native.js";
5
+ import { normalizeTempoSearchResponse, normalizeTempoMetricsResponse, normalizeTempoTraceResponse, } from "./normalization.js";
6
+ const ADAPTER_VERSION = "0.1.0-alpha.0";
7
+ const DEFAULT_TIMEOUT_MS = 30_000;
8
+ const DEFAULT_MAX_RESULT_ROWS = 1_000;
9
+ const SAFE_HEADER = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
10
+ const SAFE_REQUEST_ID = /^[A-Za-z0-9_.:-]{1,128}$/;
11
+ const SAFE_CANONICAL_FIELD = /^[A-Za-z_][A-Za-z0-9_.-]*$/;
12
+ function parsedVersion(version) {
13
+ const match = version?.trim().replace(/^v/i, "").match(/^(\d+)\.(\d+)/);
14
+ return match ? { major: Number(match[1]), minor: Number(match[2]) } : undefined;
15
+ }
16
+ function versionAtLeast(version, major, minor) {
17
+ const parsed = parsedVersion(version);
18
+ if (!parsed)
19
+ return null;
20
+ return parsed.major > major || (parsed.major === major && parsed.minor >= minor);
21
+ }
22
+ export function tempoCapabilitiesForConfig(config) {
23
+ const version = config.tempoVersion?.trim() || undefined;
24
+ return {
25
+ ...(version ? { version } : {}),
26
+ features: {
27
+ traceql: versionAtLeast(version, 2, 0),
28
+ mostRecent: config.enableMostRecent ?? versionAtLeast(version, 2, 8),
29
+ // Metrics existed experimentally in Tempo 2.x and are GA in Tempo 3.0.
30
+ // Unknown is more honest than promising an endpoint that may be disabled.
31
+ traceqlMetrics: config.enableTraceqlMetrics ?? (versionAtLeast(version, 3, 0) === true ? true : null),
32
+ tagSearchV2: config.enableTagSearchV2 ?? versionAtLeast(version, 2, 3),
33
+ },
34
+ limits: {
35
+ ...(config.maxResultRows === undefined ? {} : { maxResultRows: config.maxResultRows }),
36
+ ...(config.maxTimeRangeMs === undefined ? {} : { maxTimeRangeMs: config.maxTimeRangeMs }),
37
+ ...(config.maxSpansPerSpanSet === undefined ? {} : { maxSpansPerSpanSet: config.maxSpansPerSpanSet }),
38
+ },
39
+ };
40
+ }
41
+ export const TEMPO_ADAPTER_MANIFEST = {
42
+ name: "tempo",
43
+ displayName: "Grafana Tempo",
44
+ version: ADAPTER_VERSION,
45
+ queryLanguages: ["openplait-semantic", "traceql"],
46
+ signals: ["traces"],
47
+ };
48
+ export const TEMPO_CAPABILITIES = {
49
+ signals: ["traces"],
50
+ operations: ["select", "filter", "order", "limit"],
51
+ joins: { local: false, crossDatasource: false },
52
+ nativeQueryLanguages: ["traceql"],
53
+ explain: true,
54
+ schemaDiscovery: true,
55
+ };
56
+ function positiveIntegerIssue(value, path) {
57
+ if (value === undefined || (Number.isInteger(value) && value > 0))
58
+ return undefined;
59
+ return { code: "CONFIG_INVALID", path, message: "Value must be a positive integer." };
60
+ }
61
+ export function validateTempoConfig(config) {
62
+ const errors = [];
63
+ try {
64
+ const url = new URL(config.url);
65
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
66
+ errors.push({ code: "CONFIG_INVALID", path: "/url", message: "Tempo URL must use http or https." });
67
+ }
68
+ if (url.search || url.hash) {
69
+ errors.push({ code: "CONFIG_INVALID", path: "/url", message: "Tempo URL cannot contain a query string or fragment." });
70
+ }
71
+ }
72
+ catch {
73
+ errors.push({ code: "CONFIG_INVALID", path: "/url", message: "Tempo URL is invalid." });
74
+ }
75
+ for (const issue of [
76
+ positiveIntegerIssue(config.requestTimeoutMs, "/requestTimeoutMs"),
77
+ positiveIntegerIssue(config.queryTimeoutMs, "/queryTimeoutMs"),
78
+ positiveIntegerIssue(config.maxResultRows, "/maxResultRows"),
79
+ positiveIntegerIssue(config.maxSpansPerSpanSet, "/maxSpansPerSpanSet"),
80
+ positiveIntegerIssue(config.maxTimeRangeMs, "/maxTimeRangeMs"),
81
+ ]) {
82
+ if (issue)
83
+ errors.push(issue);
84
+ }
85
+ if (config.tempoVersion !== undefined && !/^v?\d+\.\d+(?:\.\d+)?(?:[-+].*)?$/.test(config.tempoVersion.trim())) {
86
+ errors.push({ code: "CONFIG_INVALID", path: "/tempoVersion", message: "Tempo version must be a semantic version such as 2.8.0." });
87
+ }
88
+ if ((config.username === undefined) !== (config.password === undefined)) {
89
+ errors.push({ code: "CONFIG_INVALID", path: "/username", message: "Tempo basic auth requires both username and password." });
90
+ }
91
+ if (config.bearerToken !== undefined && config.username !== undefined) {
92
+ errors.push({ code: "CONFIG_INVALID", path: "/bearerToken", message: "Bearer and basic authentication cannot be configured together." });
93
+ }
94
+ for (const [name, value] of Object.entries(config.httpHeaders ?? {})) {
95
+ if (!SAFE_HEADER.test(name) || /[\r\n]/.test(value)) {
96
+ errors.push({ code: "CONFIG_INVALID", path: `/httpHeaders/${name}`, message: "Tempo header names and values must be valid HTTP headers." });
97
+ }
98
+ }
99
+ for (const [name, mapping] of Object.entries(config.attributeFields ?? {})) {
100
+ if (!SAFE_CANONICAL_FIELD.test(name)) {
101
+ errors.push({ code: "CONFIG_INVALID", path: `/attributeFields/${name}`, message: "Canonical field names must be safe dot-separated identifiers." });
102
+ }
103
+ if (name in TEMPO_TRACE_FIELDS) {
104
+ errors.push({ code: "CONFIG_INVALID", path: `/attributeFields/${name}`, message: "Configured attribute fields cannot replace built-in Tempo fields." });
105
+ }
106
+ if (!/^[A-Za-z_][A-Za-z0-9_.\/-]*$/.test(mapping.attribute)) {
107
+ errors.push({ code: "CONFIG_INVALID", path: `/attributeFields/${name}/attribute`, message: "Tempo attribute names contain invalid characters." });
108
+ }
109
+ if (!["resource", "span", "event", "link"].includes(mapping.scope)) {
110
+ errors.push({ code: "CONFIG_INVALID", path: `/attributeFields/${name}/scope`, message: "Tempo attribute scope is invalid." });
111
+ }
112
+ if (mapping.type !== undefined && !["string", "number", "boolean"].includes(mapping.type)) {
113
+ errors.push({ code: "CONFIG_INVALID", path: `/attributeFields/${name}/type`, message: "Tempo attribute fields support string, number, or boolean values." });
114
+ }
115
+ }
116
+ return errors.length ? { valid: false, errors } : { valid: true, value: config, errors: [] };
117
+ }
118
+ function abortScope(external, timeoutMs) {
119
+ const controller = new AbortController();
120
+ let didTimeOut = false;
121
+ const onAbort = () => controller.abort(external?.reason);
122
+ if (external?.aborted)
123
+ onAbort();
124
+ else
125
+ external?.addEventListener("abort", onAbort, { once: true });
126
+ const timeout = setTimeout(() => {
127
+ didTimeOut = true;
128
+ controller.abort(new DOMException("Tempo request timed out.", "TimeoutError"));
129
+ }, timeoutMs);
130
+ return {
131
+ signal: controller.signal,
132
+ timedOut: () => didTimeOut,
133
+ dispose: () => {
134
+ clearTimeout(timeout);
135
+ external?.removeEventListener("abort", onAbort);
136
+ },
137
+ };
138
+ }
139
+ function deepFreeze(value) {
140
+ if (typeof value !== "object" || value === null || Object.isFrozen(value))
141
+ return value;
142
+ for (const child of Object.values(value))
143
+ deepFreeze(child);
144
+ return Object.freeze(value);
145
+ }
146
+ function rangeSeconds(range) {
147
+ const parse = (value) => typeof value === "number" ? value : Date.parse(value);
148
+ const from = parse(range.from);
149
+ const to = parse(range.to);
150
+ if (!Number.isFinite(from) || !Number.isFinite(to) || to < from) {
151
+ throw new AdapterError("INVALID_PARAMETER", "Tempo trace range is invalid.", { path: "/range" });
152
+ }
153
+ return { start: Math.floor(from / 1_000), end: Math.ceil(to / 1_000) };
154
+ }
155
+ export class TempoAdapter {
156
+ manifest = TEMPO_ADAPTER_MANIFEST;
157
+ config;
158
+ fetchImplementation;
159
+ now;
160
+ compiledQueries = new WeakSet();
161
+ constructor(config, options = {}) {
162
+ const validation = validateTempoConfig(config);
163
+ if (!validation.valid) {
164
+ throw new AdapterError("CONFIG_INVALID", "Tempo adapter config is invalid.", {
165
+ details: { errors: validation.errors },
166
+ });
167
+ }
168
+ this.config = structuredClone(config);
169
+ this.fetchImplementation = options.fetch ?? globalThis.fetch;
170
+ this.now = options.now ?? Date.now;
171
+ }
172
+ validateConfig(config) {
173
+ return validateTempoConfig(config);
174
+ }
175
+ async getCapabilities(config) {
176
+ const validation = validateTempoConfig(config);
177
+ if (!validation.valid) {
178
+ throw new AdapterError("CONFIG_INVALID", "Tempo adapter config is invalid.", { details: { errors: validation.errors } });
179
+ }
180
+ const tempo = tempoCapabilitiesForConfig(config);
181
+ return {
182
+ ...TEMPO_CAPABILITIES,
183
+ nativeQueryLanguages: config.allowNativeQueries ? ["traceql"] : [],
184
+ limits: {
185
+ ...(config.maxResultRows === undefined ? {} : { maxResultRows: config.maxResultRows }),
186
+ ...(config.maxTimeRangeMs === undefined ? {} : { maxTimeRangeMs: config.maxTimeRangeMs }),
187
+ },
188
+ extensions: { "io.openplait.tempo": tempo },
189
+ };
190
+ }
191
+ /** Resolve version-sensitive Tempo features without running a trace search. */
192
+ async inspectServer(context = {}) {
193
+ const response = await this.requestJson(this.url("api/status/buildinfo"), {
194
+ signal: context.abortSignal,
195
+ timeoutMs: context.timeoutMs ?? this.config.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS,
196
+ });
197
+ const version = typeof response.version === "string" ? response.version : undefined;
198
+ return tempoCapabilitiesForConfig({ ...this.config, ...(version ? { tempoVersion: version } : {}) });
199
+ }
200
+ async compile(query, context) {
201
+ const compiled = deepFreeze(compileTempoQuery(query, this.config, context));
202
+ this.compiledQueries.add(compiled);
203
+ return compiled;
204
+ }
205
+ url(path, parameters = {}) {
206
+ const base = this.config.url.endsWith("/") ? this.config.url : `${this.config.url}/`;
207
+ const url = new URL(path.replace(/^\//, ""), base);
208
+ for (const [name, value] of Object.entries(parameters)) {
209
+ if (value !== undefined)
210
+ url.searchParams.set(name, String(value));
211
+ }
212
+ return url;
213
+ }
214
+ headers(requestId) {
215
+ const headers = new Headers(this.config.httpHeaders);
216
+ headers.set("Accept", "application/json");
217
+ if (this.config.tenantId)
218
+ headers.set("X-Scope-OrgID", this.config.tenantId);
219
+ if (this.config.bearerToken)
220
+ headers.set("Authorization", `Bearer ${this.config.bearerToken}`);
221
+ if (this.config.username !== undefined && this.config.password !== undefined) {
222
+ headers.set("Authorization", `Basic ${Buffer.from(`${this.config.username}:${this.config.password}`).toString("base64")}`);
223
+ }
224
+ if (requestId)
225
+ headers.set("X-Request-ID", requestId);
226
+ return headers;
227
+ }
228
+ async requestJson(url, options) {
229
+ const scope = abortScope(options.signal, options.timeoutMs);
230
+ try {
231
+ const response = await this.fetchImplementation(url, {
232
+ method: "GET",
233
+ headers: this.headers(options.requestId),
234
+ signal: scope.signal,
235
+ });
236
+ if (!response.ok) {
237
+ const body = (await response.text()).slice(0, 2_000);
238
+ throw new AdapterError("EXECUTION_FAILED", `Tempo returned HTTP ${response.status}.`, {
239
+ details: {
240
+ status: response.status,
241
+ statusText: response.statusText,
242
+ body,
243
+ endpoint: url.pathname,
244
+ queryParameterNames: Array.from(url.searchParams.keys()).sort(),
245
+ queryLength: url.searchParams.get("q")?.length ?? 0,
246
+ ...(options.requestId ? { requestId: options.requestId } : {}),
247
+ ...(response.headers.get("x-request-id") ? { upstreamRequestId: response.headers.get("x-request-id") } : {}),
248
+ },
249
+ });
250
+ }
251
+ return await response.json();
252
+ }
253
+ catch (error) {
254
+ if (scope.timedOut()) {
255
+ throw new AdapterError("TIMEOUT", `Tempo request exceeded ${options.timeoutMs}ms.`, {
256
+ cause: error,
257
+ details: { timeoutMs: options.timeoutMs },
258
+ });
259
+ }
260
+ if (options.signal?.aborted || isAbortError(error)) {
261
+ throw new AdapterError("ABORTED", "Tempo request was cancelled.", { cause: error });
262
+ }
263
+ if (error instanceof AdapterError)
264
+ throw error;
265
+ throw new AdapterError("EXECUTION_FAILED", "Tempo request failed.", { cause: error });
266
+ }
267
+ finally {
268
+ scope.dispose();
269
+ }
270
+ }
271
+ executionRequestId(context) {
272
+ const requestId = context.queryId ?? context.audit?.requestId;
273
+ if (!requestId || !SAFE_REQUEST_ID.test(requestId)) {
274
+ throw new AdapterError("QUERY_VALIDATION_FAILED", "Execution requires a safe audit request ID or query ID.", {
275
+ path: "/execution/audit/requestId",
276
+ });
277
+ }
278
+ return requestId;
279
+ }
280
+ async execute(query, context) {
281
+ let request;
282
+ let fields;
283
+ let frameName;
284
+ if (isCompiledQuery(query)) {
285
+ if (!this.compiledQueries.has(query)) {
286
+ throw new AdapterError("QUERY_VALIDATION_FAILED", "Compiled query was not produced by this adapter instance.");
287
+ }
288
+ request = query.compiled;
289
+ fields = query.fields;
290
+ frameName = query.source.resourceName;
291
+ }
292
+ else {
293
+ if (!this.config.allowNativeQueries) {
294
+ throw new AdapterError("NATIVE_QUERY_REJECTED", "Native TraceQL is disabled for this Tempo datasource.", { path: "/spec/native" });
295
+ }
296
+ request = compileNativeTempoQuery(query, this.config, context.variables);
297
+ frameName = query.metadata.name;
298
+ }
299
+ const timeoutMs = Math.min(context.timeoutMs ?? this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS, this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS);
300
+ const started = this.now();
301
+ const response = await this.requestJson(this.url("api/search", {
302
+ q: request.traceql,
303
+ start: request.start,
304
+ end: request.end,
305
+ limit: request.limit,
306
+ spss: request.spansPerSpanSet,
307
+ }), { signal: context.abortSignal, timeoutMs, requestId: this.executionRequestId(context) });
308
+ return normalizeTempoSearchResponse(response, {
309
+ frameName,
310
+ adapterVersion: ADAPTER_VERSION,
311
+ executionTimeMs: Math.max(0, this.now() - started),
312
+ ...(fields === undefined ? {} : { fields }),
313
+ });
314
+ }
315
+ async explain(query, context) {
316
+ const compiledQuery = await this.compile(query, context);
317
+ return {
318
+ summary: `Compile '${query.metadata.name}' to a bounded Tempo TraceQL search.`,
319
+ steps: [
320
+ `Resolve logical dataset '${query.spec.input.entity}'.`,
321
+ "Map canonical fields to allowlisted TraceQL intrinsics and attributes.",
322
+ "Encode filter values as type-aware TraceQL literals.",
323
+ "Apply bounded time, result, and spans-per-span-set limits.",
324
+ ],
325
+ compiledQuery,
326
+ warnings: compiledQuery.warnings,
327
+ };
328
+ }
329
+ async discoverSchema(_context) {
330
+ const schema = tempoSemanticSchema();
331
+ const dataset = schema.datasets[0];
332
+ const extension = dataset?.extensions?.["io.openplait.tempo"];
333
+ if (dataset && typeof extension === "object" && extension !== null) {
334
+ dataset.extensions = {
335
+ ...dataset.extensions,
336
+ "io.openplait.tempo": {
337
+ ...extension,
338
+ configuredAttributeFields: Object.keys(this.config.attributeFields ?? {}),
339
+ },
340
+ };
341
+ }
342
+ return schema;
343
+ }
344
+ /** Fetch and normalize a complete OTLP trace into one dataframe row per span. */
345
+ async getTrace(traceId, context, range) {
346
+ if (!/^[A-Fa-f0-9]{16,32}$/.test(traceId)) {
347
+ throw new AdapterError("INVALID_PARAMETER", "Trace IDs must contain 16 to 32 hexadecimal characters.", { path: "/traceId" });
348
+ }
349
+ const timeoutMs = Math.min(context.timeoutMs ?? this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS, this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS);
350
+ const started = this.now();
351
+ const seconds = range ? rangeSeconds(range) : undefined;
352
+ const response = await this.requestJson(this.url(`api/traces/${encodeURIComponent(traceId)}`, seconds), { signal: context.abortSignal, timeoutMs, requestId: this.executionRequestId(context) });
353
+ return normalizeTempoTraceResponse(response, {
354
+ frameName: traceId,
355
+ adapterVersion: ADAPTER_VERSION,
356
+ executionTimeMs: Math.max(0, this.now() - started),
357
+ });
358
+ }
359
+ /** Execute a bounded TraceQL metrics range query and normalize its samples. */
360
+ async queryMetrics(range, context) {
361
+ if (!range.query.trim() || range.query.length > 32_768 || /\0/.test(range.query)) {
362
+ throw new AdapterError("INVALID_PARAMETER", "Tempo metrics query is invalid.", { path: "/query" });
363
+ }
364
+ if (!/^\d+(?:\.\d+)?(?:ms|s|m|h)$/.test(range.step)) {
365
+ throw new AdapterError("INVALID_PARAMETER", "Tempo metrics step must be a positive Go duration.", { path: "/step" });
366
+ }
367
+ if (range.exemplars !== undefined && (!Number.isInteger(range.exemplars) || range.exemplars < 0)) {
368
+ throw new AdapterError("INVALID_PARAMETER", "Tempo metrics exemplars must be a non-negative integer.", { path: "/exemplars" });
369
+ }
370
+ const seconds = rangeSeconds(range);
371
+ const timeoutMs = Math.min(context.timeoutMs ?? this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS, this.config.queryTimeoutMs ?? DEFAULT_TIMEOUT_MS);
372
+ const started = this.now();
373
+ const response = await this.requestJson(this.url("api/metrics/query_range", {
374
+ q: range.query,
375
+ start: seconds.start,
376
+ end: seconds.end,
377
+ step: range.step,
378
+ exemplars: range.exemplars,
379
+ }), { signal: context.abortSignal, timeoutMs, requestId: this.executionRequestId(context) });
380
+ return normalizeTempoMetricsResponse(response, {
381
+ frameName: "tempo-metrics",
382
+ adapterVersion: ADAPTER_VERSION,
383
+ executionTimeMs: Math.max(0, this.now() - started),
384
+ });
385
+ }
386
+ /** Discover Tempo tag names using the v2 search API. */
387
+ async discoverTags(scope, context) {
388
+ const request = (path, parameters) => this.requestJson(this.url(path, parameters), { signal: context.abortSignal, timeoutMs: context.timeoutMs ?? this.config.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS });
389
+ let response;
390
+ if (this.config.enableTagSearchV2 === false) {
391
+ response = await request("api/search/tags", {});
392
+ }
393
+ else {
394
+ try {
395
+ response = await request("api/v2/search/tags", { scope });
396
+ }
397
+ catch (error) {
398
+ const status = error instanceof AdapterError ? error.details?.status : undefined;
399
+ if (this.config.enableTagSearchV2 === true || (status !== 400 && status !== 404))
400
+ throw error;
401
+ response = await request("api/search/tags", {});
402
+ }
403
+ }
404
+ const values = response.tagNames ?? response.tags;
405
+ if (Array.isArray(values)) {
406
+ return values.filter((value) => typeof value === "string");
407
+ }
408
+ if (!Array.isArray(response.scopes))
409
+ return [];
410
+ return response.scopes.flatMap((item) => {
411
+ if (typeof item !== "object" || item === null)
412
+ return [];
413
+ const tags = item.tags;
414
+ return Array.isArray(tags)
415
+ ? tags.filter((value) => typeof value === "string")
416
+ : [];
417
+ });
418
+ }
419
+ /** Discover values for a TraceQL intrinsic or attribute. */
420
+ async discoverTagValues(tag, context, options = {}) {
421
+ if (!tag || /[\r\n\0]/.test(tag)) {
422
+ throw new AdapterError("INVALID_PARAMETER", "Tempo tag name is invalid.", { path: "/tag" });
423
+ }
424
+ const seconds = options.range ? rangeSeconds(options.range) : undefined;
425
+ const parameters = { q: options.query, start: seconds?.start, end: seconds?.end };
426
+ const request = (path) => this.requestJson(this.url(path, parameters), { signal: context.abortSignal, timeoutMs: context.timeoutMs ?? this.config.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS });
427
+ let response;
428
+ if (this.config.enableTagSearchV2 === false) {
429
+ response = await request(`api/search/tag/${encodeURIComponent(tag)}/values`);
430
+ }
431
+ else {
432
+ try {
433
+ response = await request(`api/v2/search/tag/${encodeURIComponent(tag)}/values`);
434
+ }
435
+ catch (error) {
436
+ const status = error instanceof AdapterError ? error.details?.status : undefined;
437
+ if (this.config.enableTagSearchV2 === true || (status !== 400 && status !== 404))
438
+ throw error;
439
+ response = await request(`api/search/tag/${encodeURIComponent(tag)}/values`);
440
+ }
441
+ }
442
+ const values = response.tagValues ?? response.values;
443
+ if (!Array.isArray(values))
444
+ return [];
445
+ return values.flatMap((value) => {
446
+ if (typeof value === "string")
447
+ return [value];
448
+ if (typeof value === "object" && value !== null && typeof value.value === "string")
449
+ return [value.value];
450
+ return [];
451
+ });
452
+ }
453
+ /** Exposes all built-in and configured semantic filter mappings. */
454
+ getFieldMappings() {
455
+ return tempoFieldRegistry(this.config);
456
+ }
457
+ }
458
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SemanticQuery } from "@openplait/core";
2
+ import { type CompileContext, type CompiledQuery } from "@openplait/adapter-sdk";
3
+ import { type TempoFieldMapping } from "./datasets.js";
4
+ import type { TempoAdapterConfig, TempoCompiledRequest } from "./types.js";
5
+ export declare function supportsTempoMostRecent(config: TempoAdapterConfig): boolean;
6
+ export declare function compileTempoQuery(query: SemanticQuery, config: TempoAdapterConfig, context?: CompileContext): CompiledQuery<TempoCompiledRequest>;
7
+ export declare function tempoFieldRegistry(config: TempoAdapterConfig): Readonly<Record<string, TempoFieldMapping>>;
8
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAA0C,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA4B3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAE3E;AA2MD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAAC,oBAAoB,CAAC,CAwDrC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAE1G"}