@dataworks-technology/cli 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +16 -0
  3. package/README.md +85 -2
  4. package/bin/mcp.js +9 -0
  5. package/bin/postinstall.js +23 -0
  6. package/dist/commands/agents/install.d.ts +17 -0
  7. package/dist/commands/agents/install.d.ts.map +1 -0
  8. package/dist/commands/agents/install.js +57 -0
  9. package/dist/commands/agents/install.js.map +1 -0
  10. package/dist/commands/agents/reminder.d.ts +16 -0
  11. package/dist/commands/agents/reminder.d.ts.map +1 -0
  12. package/dist/commands/agents/reminder.js +45 -0
  13. package/dist/commands/agents/reminder.js.map +1 -0
  14. package/dist/commands/commands.d.ts.map +1 -1
  15. package/dist/commands/commands.js +2 -0
  16. package/dist/commands/commands.js.map +1 -1
  17. package/dist/generated/metrics.d.ts +15 -0
  18. package/dist/generated/metrics.d.ts.map +1 -0
  19. package/dist/generated/metrics.js +131 -0
  20. package/dist/generated/metrics.js.map +1 -0
  21. package/dist/lib/agent-install.d.ts +24 -0
  22. package/dist/lib/agent-install.d.ts.map +1 -0
  23. package/dist/lib/agent-install.js +196 -0
  24. package/dist/lib/agent-install.js.map +1 -0
  25. package/dist/lib/agent-reminder.d.ts +17 -0
  26. package/dist/lib/agent-reminder.d.ts.map +1 -0
  27. package/dist/lib/agent-reminder.js +81 -0
  28. package/dist/lib/agent-reminder.js.map +1 -0
  29. package/dist/lib/command.d.ts +1 -0
  30. package/dist/lib/command.d.ts.map +1 -1
  31. package/dist/lib/command.js +5 -0
  32. package/dist/lib/command.js.map +1 -1
  33. package/dist/lib/metric-names.d.ts +29 -0
  34. package/dist/lib/metric-names.d.ts.map +1 -0
  35. package/dist/lib/metric-names.js +171 -0
  36. package/dist/lib/metric-names.js.map +1 -0
  37. package/dist/lib/query-metrics.d.ts +73 -0
  38. package/dist/lib/query-metrics.d.ts.map +1 -0
  39. package/dist/lib/query-metrics.js +374 -0
  40. package/dist/lib/query-metrics.js.map +1 -0
  41. package/dist/mcp/main.d.ts +2 -0
  42. package/dist/mcp/main.d.ts.map +1 -0
  43. package/dist/mcp/main.js +7 -0
  44. package/dist/mcp/main.js.map +1 -0
  45. package/dist/mcp/server.d.ts +85 -0
  46. package/dist/mcp/server.d.ts.map +1 -0
  47. package/dist/mcp/server.js +248 -0
  48. package/dist/mcp/server.js.map +1 -0
  49. package/oclif.manifest.json +872 -759
  50. package/package.json +22 -8
  51. package/plugins/dataworks/.claude-plugin/plugin.json +10 -0
  52. package/plugins/dataworks/.codex-plugin/plugin.json +27 -0
  53. package/plugins/dataworks/.mcp.json +8 -0
  54. package/plugins/dataworks/skills/query-dataworks-metrics/SKILL.md +70 -0
  55. package/plugins/dataworks/skills/query-dataworks-metrics/agents/openai.yaml +13 -0
  56. package/skills/dataworks-cli/SKILL.md +18 -2
@@ -0,0 +1,374 @@
1
+ import { executeGraphql } from "./graphql-transport.js";
2
+ import { CliError, toCliError } from "./errors.js";
3
+ import { metricCategories, resolveMetricName, suggestMetricNames, } from "./metric-names.js";
4
+ import { requireSession } from "./session.js";
5
+ const listAthletesDocument = `query listAthletes($limit: Int, $nextToken: String, $tenant: String!) {
6
+ listAthletes(limit: $limit, nextToken: $nextToken, tenant: $tenant) {
7
+ items { publicId externalId forename surname name nameShort }
8
+ nextToken
9
+ }
10
+ }`;
11
+ const getAthleteDocument = `query getAthlete($publicId: ID!, $tenant: String!) {
12
+ getAthlete(publicId: $publicId, tenant: $tenant) {
13
+ publicId externalId forename surname name nameShort
14
+ }
15
+ }`;
16
+ const executeDataExplorerDocument = `query executeDataExplorerQuery($input: DataExplorerQueryInput!, $tenant: String!) {
17
+ executeDataExplorerQuery(input: $input, tenant: $tenant) {
18
+ columns queryExecutionId queryTimeMs rowCount rows status
19
+ }
20
+ }`;
21
+ const defaultDependencies = {
22
+ graphql: executeGraphql,
23
+ session: requireSession,
24
+ sleep: (milliseconds, signal) => new Promise((resolve, reject) => {
25
+ if (signal?.aborted) {
26
+ reject(new CliError("Metric query cancelled", "QUERY_CANCELLED", 4));
27
+ return;
28
+ }
29
+ const timeout = setTimeout(resolve, milliseconds);
30
+ signal?.addEventListener("abort", () => {
31
+ clearTimeout(timeout);
32
+ reject(new CliError("Metric query cancelled", "QUERY_CANCELLED", 4));
33
+ }, { once: true });
34
+ }),
35
+ now: Date.now,
36
+ };
37
+ function compact(value) {
38
+ return value
39
+ .trim()
40
+ .toLocaleLowerCase()
41
+ .replaceAll(/[^a-z0-9]/g, "");
42
+ }
43
+ function displayName(athlete) {
44
+ const full = [athlete.forename, athlete.surname]
45
+ .filter((part) => Boolean(part?.trim()))
46
+ .join(" ");
47
+ return athlete.name?.trim() || full || athlete.nameShort?.trim() || null;
48
+ }
49
+ function candidate(athlete) {
50
+ return { publicId: athlete.publicId, name: displayName(athlete) };
51
+ }
52
+ function searchableNames(athlete) {
53
+ return [
54
+ athlete.name,
55
+ [athlete.forename, athlete.surname].filter(Boolean).join(" "),
56
+ athlete.nameShort,
57
+ athlete.externalId,
58
+ ]
59
+ .filter((value) => Boolean(value?.trim()))
60
+ .map(compact);
61
+ }
62
+ async function listAllAthletes(tenantId, dependencies) {
63
+ const athletes = [];
64
+ let nextToken;
65
+ let pages = 0;
66
+ do {
67
+ const result = await dependencies.graphql(listAthletesDocument, {
68
+ limit: 100,
69
+ nextToken,
70
+ tenant: tenantId,
71
+ });
72
+ const connection = result?.listAthletes;
73
+ athletes.push(...(connection?.items ?? []));
74
+ nextToken = connection?.nextToken;
75
+ pages += 1;
76
+ if (pages >= 100 && nextToken) {
77
+ throw new CliError("Athlete lookup exceeded 10,000 records; use athlete_id instead", "ATHLETE_LOOKUP_LIMIT");
78
+ }
79
+ } while (nextToken);
80
+ return athletes;
81
+ }
82
+ async function resolveAthlete(input, tenantId, dependencies) {
83
+ if (input.athleteId) {
84
+ const result = await dependencies.graphql(getAthleteDocument, {
85
+ publicId: input.athleteId,
86
+ tenant: tenantId,
87
+ });
88
+ if (!result?.getAthlete) {
89
+ throw new CliError(`No athlete found with public ID ${input.athleteId}`, "ATHLETE_NOT_FOUND", 1, { athleteId: input.athleteId });
90
+ }
91
+ return { athlete: result.getAthlete, matchedBy: "public_id" };
92
+ }
93
+ const requested = input.athleteName?.trim();
94
+ if (!requested) {
95
+ throw new CliError("Provide exactly one of athlete_id or athlete_name", "ATHLETE_REQUIRED", 2);
96
+ }
97
+ const normalized = compact(requested);
98
+ const athletes = await listAllAthletes(tenantId, dependencies);
99
+ const exact = athletes.filter((athlete) => searchableNames(athlete).includes(normalized));
100
+ const matches = exact.length > 0
101
+ ? exact
102
+ : athletes.filter((athlete) => searchableNames(athlete).some((name) => name.includes(normalized)));
103
+ if (matches.length === 0) {
104
+ throw new CliError(`No athlete matched “${requested}”`, "ATHLETE_NOT_FOUND", 1, {
105
+ athleteName: requested,
106
+ });
107
+ }
108
+ if (matches.length > 1) {
109
+ throw new CliError(`Athlete name “${requested}” is ambiguous; retry with athlete_id`, "ATHLETE_AMBIGUOUS", 2, { candidates: matches.slice(0, 20).map(candidate) });
110
+ }
111
+ return {
112
+ athlete: matches[0],
113
+ matchedBy: exact.length === 1 ? "name" : "partial_name",
114
+ };
115
+ }
116
+ function resolveMetric(input) {
117
+ const requested = input.metric.trim();
118
+ if (!requested)
119
+ throw new CliError("Metric cannot be empty", "METRIC_REQUIRED", 2);
120
+ const known = resolveMetricName(requested);
121
+ if (known) {
122
+ if (input.metricCategory && input.metricCategory !== known.category) {
123
+ throw new CliError(`${requested} belongs to ${known.category}, not ${input.metricCategory}`, "METRIC_CATEGORY_CONFLICT", 2, { canonical: known.canonical, expectedCategory: known.category });
124
+ }
125
+ return { requested, ...known };
126
+ }
127
+ if (!input.metricCategory) {
128
+ const suggestions = suggestMetricNames(requested);
129
+ throw new CliError(suggestions.length
130
+ ? `Metric “${requested}” is not a known metric; did you mean ${suggestions.join(", ")}?`
131
+ : `Metric “${requested}” is not a known metric; provide metric_category explicitly to query it as a custom metric`, "METRIC_CATEGORY_REQUIRED", 2, {
132
+ suggestions,
133
+ knownMetrics: metricCategories,
134
+ categories: Object.keys(metricCategories),
135
+ });
136
+ }
137
+ return {
138
+ requested,
139
+ canonical: requested,
140
+ category: input.metricCategory,
141
+ unit: null,
142
+ };
143
+ }
144
+ function isoFilter(value, field) {
145
+ const milliseconds = Date.parse(value);
146
+ if (!Number.isFinite(milliseconds)) {
147
+ throw new CliError(`${field} must be an ISO 8601 date-time`, "TIME_INVALID", 2, {
148
+ field,
149
+ value,
150
+ });
151
+ }
152
+ return {
153
+ iso: new Date(milliseconds).toISOString(),
154
+ timestamp: Math.floor(milliseconds / 1000),
155
+ };
156
+ }
157
+ function decodeJson(value) {
158
+ let decoded = value;
159
+ for (let depth = 0; depth < 5 && typeof decoded === "string"; depth += 1) {
160
+ const trimmed = decoded.trim();
161
+ if (!/^[\[{\"]/.test(trimmed))
162
+ break;
163
+ try {
164
+ decoded = JSON.parse(trimmed);
165
+ }
166
+ catch {
167
+ break;
168
+ }
169
+ }
170
+ return decoded;
171
+ }
172
+ function rowsFrom(result) {
173
+ const decoded = decodeJson(result.rows);
174
+ if (!Array.isArray(decoded)) {
175
+ throw new CliError("Data Explorer rows were not a JSON array", "QUERY_RESPONSE_INVALID", 1);
176
+ }
177
+ return decoded.map((row) => {
178
+ if (Array.isArray(row)) {
179
+ return Object.fromEntries(result.columns.map((column, index) => [column, row[index] ?? null]));
180
+ }
181
+ if (row && typeof row === "object")
182
+ return row;
183
+ throw new CliError("Data Explorer returned a row that was not an object or array", "QUERY_RESPONSE_INVALID", 1);
184
+ });
185
+ }
186
+ function optionalString(value) {
187
+ if (typeof value === "string")
188
+ return value;
189
+ if (typeof value === "number")
190
+ return String(value);
191
+ return null;
192
+ }
193
+ function timestampIso(value) {
194
+ const numeric = typeof value === "number" ? value : Number(value);
195
+ if (!Number.isFinite(numeric))
196
+ return null;
197
+ const milliseconds = numeric > 10_000_000_000 ? numeric : numeric * 1000;
198
+ const date = new Date(milliseconds);
199
+ return Number.isNaN(date.valueOf()) ? null : date.toISOString();
200
+ }
201
+ function positionFrom(value) {
202
+ if (typeof value !== "string")
203
+ return null;
204
+ const [latitudeText, longitudeText, ...rest] = value.split(":");
205
+ if (rest.length > 0 || !latitudeText || !longitudeText)
206
+ return null;
207
+ const latitude = Number(latitudeText);
208
+ const longitude = Number(longitudeText);
209
+ if (!Number.isFinite(latitude) ||
210
+ !Number.isFinite(longitude) ||
211
+ latitude < -90 ||
212
+ latitude > 90 ||
213
+ longitude < -180 ||
214
+ longitude > 180)
215
+ return null;
216
+ return { latitude, longitude };
217
+ }
218
+ function parsedValue(value, canonicalMetric) {
219
+ const decoded = decodeJson(value);
220
+ if (typeof decoded === "undefined")
221
+ return null;
222
+ if (canonicalMetric === "latlong")
223
+ return decoded;
224
+ if (typeof decoded === "string" && decoded.trim() !== "") {
225
+ const numeric = Number(decoded);
226
+ if (Number.isFinite(numeric))
227
+ return numeric;
228
+ }
229
+ return decoded;
230
+ }
231
+ function normalizedRow(row, metric) {
232
+ const timestamp = row.timestamp;
233
+ const rawValue = row.current;
234
+ return {
235
+ timestamp: typeof timestamp === "string" || typeof timestamp === "number" ? timestamp : null,
236
+ timestampIso: timestampIso(timestamp),
237
+ athleteId: optionalString(row.athletepublicid),
238
+ metric: optionalString(row.metric) ?? metric.canonical,
239
+ value: parsedValue(rawValue, metric.canonical),
240
+ unit: metric.unit,
241
+ position: metric.canonical === "latlong" ? positionFrom(rawValue) : null,
242
+ eventId: optionalString(row.eventpublicid),
243
+ datasetDatasourceId: optionalString(row.datasetdatasourcepublicid),
244
+ };
245
+ }
246
+ function ensureSingleAthleteSelector(input) {
247
+ const count = Number(Boolean(input.athleteId?.trim())) +
248
+ Number(Boolean(input.athleteName?.trim()));
249
+ if (count !== 1) {
250
+ throw new CliError("Provide exactly one of athlete_id or athlete_name", "ATHLETE_SELECTOR_INVALID", 2);
251
+ }
252
+ }
253
+ async function executeAndPoll(queryInput, tenantId, timeoutMs, dependencies, signal) {
254
+ const deadline = dependencies.now() + timeoutMs;
255
+ let delay = 300;
256
+ let input = queryInput;
257
+ while (true) {
258
+ if (signal?.aborted)
259
+ throw new CliError("Metric query cancelled", "QUERY_CANCELLED", 4);
260
+ const response = await dependencies.graphql(executeDataExplorerDocument, { input, tenant: tenantId });
261
+ const result = response?.executeDataExplorerQuery;
262
+ if (!result) {
263
+ throw new CliError("Data Explorer returned no query result", "QUERY_RESPONSE_INVALID");
264
+ }
265
+ const status = result.status?.toUpperCase() ?? "COMPLETED";
266
+ if (status !== "RUNNING") {
267
+ if (["FAILED", "ERROR", "CANCELLED"].includes(status)) {
268
+ throw new CliError(`Data Explorer query ended with status ${status}`, "QUERY_FAILED", 1, { queryExecutionId: result.queryExecutionId ?? null, status });
269
+ }
270
+ return result;
271
+ }
272
+ if (!result.queryExecutionId) {
273
+ throw new CliError("Data Explorer returned RUNNING without a query execution ID", "QUERY_RESPONSE_INVALID");
274
+ }
275
+ if (dependencies.now() >= deadline) {
276
+ throw new CliError(`Metric query did not finish within ${timeoutMs}ms`, "QUERY_TIMEOUT", 1, { queryExecutionId: result.queryExecutionId, timeoutMs });
277
+ }
278
+ await dependencies.sleep(delay, signal);
279
+ delay = Math.min(Math.round(delay * 1.5), 2_000);
280
+ input = { ...queryInput, queryExecutionId: result.queryExecutionId };
281
+ }
282
+ }
283
+ export async function queryMetrics(input, options = {}) {
284
+ const dependencies = { ...defaultDependencies, ...options.dependencies };
285
+ try {
286
+ ensureSingleAthleteSelector(input);
287
+ const session = await dependencies.session();
288
+ const tenantId = input.tenantId?.trim() || session.tenant;
289
+ if (!tenantId) {
290
+ throw new CliError("No tenant selected; run `dw tenant select` or provide tenant_id", "TENANT_REQUIRED", 2);
291
+ }
292
+ const limit = input.limit ?? 30;
293
+ if (!Number.isInteger(limit) || limit < 1 || limit > 500) {
294
+ throw new CliError("limit must be an integer from 1 to 500", "LIMIT_INVALID", 2);
295
+ }
296
+ const timeoutMs = input.timeoutMs ?? 30_000;
297
+ if (!Number.isInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs > 120_000) {
298
+ throw new CliError("timeout_ms must be an integer from 1000 to 120000", "TIMEOUT_INVALID", 2);
299
+ }
300
+ const metric = resolveMetric(input);
301
+ const athlete = await resolveAthlete(input, tenantId, dependencies);
302
+ const from = input.from ? isoFilter(input.from, "from") : null;
303
+ const to = input.to ? isoFilter(input.to, "to") : null;
304
+ if (from && to && from.timestamp > to.timestamp) {
305
+ throw new CliError("from must not be later than to", "TIME_RANGE_INVALID", 2);
306
+ }
307
+ const rules = [
308
+ { field: "metric", operator: "in", value: metric.canonical },
309
+ {
310
+ field: "athletepublicid",
311
+ operator: "in",
312
+ value: athlete.athlete.publicId,
313
+ },
314
+ ];
315
+ if (input.eventId)
316
+ rules.push({ field: "eventpublicid", operator: "in", value: input.eventId });
317
+ if (input.datasetDatasourceId)
318
+ rules.push({
319
+ field: "datasetdatasourcepublicid",
320
+ operator: "in",
321
+ value: input.datasetDatasourceId,
322
+ });
323
+ if (from)
324
+ rules.push({ field: "timestamp", operator: ">=", value: String(from.timestamp) });
325
+ if (to)
326
+ rules.push({ field: "timestamp", operator: "<=", value: String(to.timestamp) });
327
+ const order = input.order ?? "newest";
328
+ const queryInput = {
329
+ columns: [
330
+ "timestamp",
331
+ "datasetdatasourcepublicid",
332
+ "eventpublicid",
333
+ "athletepublicid",
334
+ "metric",
335
+ "current",
336
+ ],
337
+ metricCategory: metric.category,
338
+ filterRules: JSON.stringify({ combinator: "and", rules }),
339
+ limit,
340
+ orderBy: "timestamp",
341
+ orderDirection: order === "newest" ? "DESC" : "ASC",
342
+ };
343
+ const result = await executeAndPoll(queryInput, tenantId, timeoutMs, dependencies, options.signal);
344
+ const rows = rowsFrom(result).map((row) => normalizedRow(row, metric));
345
+ return {
346
+ environment: session.environment,
347
+ tenantId,
348
+ athlete: {
349
+ publicId: athlete.athlete.publicId,
350
+ name: displayName(athlete.athlete),
351
+ matchedBy: athlete.matchedBy,
352
+ },
353
+ metric,
354
+ filters: {
355
+ eventId: input.eventId ?? null,
356
+ datasetDatasourceId: input.datasetDatasourceId ?? null,
357
+ from: from?.iso ?? null,
358
+ to: to?.iso ?? null,
359
+ },
360
+ order,
361
+ limit,
362
+ count: rows.length,
363
+ rowCount: result.rowCount,
364
+ status: result.status ?? "COMPLETED",
365
+ queryExecutionId: result.queryExecutionId ?? null,
366
+ queryTimeMs: result.queryTimeMs ?? null,
367
+ rows,
368
+ };
369
+ }
370
+ catch (error) {
371
+ throw toCliError(error);
372
+ }
373
+ }
374
+ //# sourceMappingURL=query-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-metrics.js","sourceRoot":"","sources":["../../src/lib/query-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDataworksMcpServer(): Promise<void>;
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/mcp/main.ts"],"names":[],"mappings":"AAGA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3D"}
@@ -0,0 +1,7 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createDataworksMcpServer } from "./server.js";
3
+ export async function runDataworksMcpServer() {
4
+ const server = createDataworksMcpServer();
5
+ await server.connect(new StdioServerTransport());
6
+ }
7
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/mcp/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import * as z from "zod/v4";
3
+ import { type QueryMetricsInput, type QueryMetricsOutput } from "../lib/query-metrics.js";
4
+ export type QueryMetricsHandler = (input: QueryMetricsInput, options?: {
5
+ signal?: AbortSignal;
6
+ }) => Promise<QueryMetricsOutput>;
7
+ export declare const queryMetricsInputSchema: z.ZodObject<{
8
+ athlete_id: z.ZodOptional<z.ZodString>;
9
+ athlete_name: z.ZodOptional<z.ZodString>;
10
+ metric: z.ZodString;
11
+ metric_category: z.ZodOptional<z.ZodEnum<{
12
+ METRICS_TYPE_A: "METRICS_TYPE_A";
13
+ METRICS_TYPE_B: "METRICS_TYPE_B";
14
+ METRICS_TYPE_C: "METRICS_TYPE_C";
15
+ }>>;
16
+ limit: z.ZodDefault<z.ZodNumber>;
17
+ order: z.ZodDefault<z.ZodEnum<{
18
+ newest: "newest";
19
+ oldest: "oldest";
20
+ }>>;
21
+ from: z.ZodOptional<z.ZodString>;
22
+ to: z.ZodOptional<z.ZodString>;
23
+ event_id: z.ZodOptional<z.ZodString>;
24
+ dataset_datasource_id: z.ZodOptional<z.ZodString>;
25
+ tenant_id: z.ZodOptional<z.ZodString>;
26
+ timeout_ms: z.ZodDefault<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export declare const queryMetricsOutputSchema: z.ZodObject<{
29
+ environment: z.ZodEnum<{
30
+ uat: "uat";
31
+ live: "live";
32
+ }>;
33
+ tenant_id: z.ZodString;
34
+ athlete: z.ZodObject<{
35
+ public_id: z.ZodString;
36
+ name: z.ZodNullable<z.ZodString>;
37
+ matched_by: z.ZodEnum<{
38
+ name: "name";
39
+ public_id: "public_id";
40
+ partial_name: "partial_name";
41
+ }>;
42
+ }, z.core.$strip>;
43
+ metric: z.ZodObject<{
44
+ requested: z.ZodString;
45
+ canonical: z.ZodString;
46
+ category: z.ZodEnum<{
47
+ METRICS_TYPE_A: "METRICS_TYPE_A";
48
+ METRICS_TYPE_B: "METRICS_TYPE_B";
49
+ METRICS_TYPE_C: "METRICS_TYPE_C";
50
+ }>;
51
+ unit: z.ZodNullable<z.ZodString>;
52
+ }, z.core.$strip>;
53
+ filters: z.ZodObject<{
54
+ event_id: z.ZodNullable<z.ZodString>;
55
+ dataset_datasource_id: z.ZodNullable<z.ZodString>;
56
+ from: z.ZodNullable<z.ZodString>;
57
+ to: z.ZodNullable<z.ZodString>;
58
+ }, z.core.$strip>;
59
+ order: z.ZodEnum<{
60
+ newest: "newest";
61
+ oldest: "oldest";
62
+ }>;
63
+ limit: z.ZodNumber;
64
+ count: z.ZodNumber;
65
+ row_count: z.ZodNumber;
66
+ status: z.ZodString;
67
+ query_execution_id: z.ZodNullable<z.ZodString>;
68
+ query_time_ms: z.ZodNullable<z.ZodNumber>;
69
+ rows: z.ZodArray<z.ZodObject<{
70
+ timestamp: z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
71
+ timestamp_iso: z.ZodNullable<z.ZodString>;
72
+ athlete_id: z.ZodNullable<z.ZodString>;
73
+ metric: z.ZodNullable<z.ZodString>;
74
+ value: z.ZodUnknown;
75
+ unit: z.ZodNullable<z.ZodString>;
76
+ position: z.ZodNullable<z.ZodObject<{
77
+ latitude: z.ZodNumber;
78
+ longitude: z.ZodNumber;
79
+ }, z.core.$strip>>;
80
+ event_id: z.ZodNullable<z.ZodString>;
81
+ dataset_datasource_id: z.ZodNullable<z.ZodString>;
82
+ }, z.core.$strip>>;
83
+ }, z.core.$strip>;
84
+ export declare function createDataworksMcpServer(handler?: QueryMetricsHandler): McpServer;
85
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAS5B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAcjC,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;iBA0FhC,CAAC;AAIL,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwCnC,CAAC;AAmDH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,mBAAsE,GAC9E,SAAS,CAsFX"}