@dataworks-technology/cli 1.4.1 → 1.6.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/README.md +13 -2
- package/dist/generated/metrics.d.ts +10 -0
- package/dist/generated/metrics.d.ts.map +1 -1
- package/dist/generated/metrics.js +51 -0
- package/dist/generated/metrics.js.map +1 -1
- package/dist/lib/discover.d.ts +60 -0
- package/dist/lib/discover.d.ts.map +1 -0
- package/dist/lib/discover.js +166 -0
- package/dist/lib/discover.js.map +1 -0
- package/dist/lib/graphql-transport.d.ts +24 -0
- package/dist/lib/graphql-transport.d.ts.map +1 -1
- package/dist/lib/graphql-transport.js +36 -3
- package/dist/lib/graphql-transport.js.map +1 -1
- package/dist/lib/metric-names.d.ts +2 -2
- package/dist/lib/metric-names.d.ts.map +1 -1
- package/dist/lib/metric-names.js +2 -2
- package/dist/lib/metric-names.js.map +1 -1
- package/dist/lib/query-metrics.d.ts +42 -1
- package/dist/lib/query-metrics.d.ts.map +1 -1
- package/dist/lib/query-metrics.js +169 -27
- package/dist/lib/query-metrics.js.map +1 -1
- package/dist/mcp/server.d.ts +40 -3
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +288 -36
- package/dist/mcp/server.js.map +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
- package/plugins/dataworks/.claude-plugin/plugin.json +1 -1
- package/plugins/dataworks/.codex-plugin/plugin.json +1 -1
- package/plugins/dataworks/skills/query-dataworks-metrics/SKILL.md +62 -9
package/README.md
CHANGED
|
@@ -131,8 +131,8 @@ after installing a release that adds commands.
|
|
|
131
131
|
|
|
132
132
|
## AI agent metric queries
|
|
133
133
|
|
|
134
|
-
The package includes a focused, read-only MCP server with
|
|
135
|
-
`query_metrics`. It uses the same OS-backed login session and selected tenant as
|
|
134
|
+
The package includes a focused, read-only MCP server with three tools:
|
|
135
|
+
`query_metrics`, `list_athletes`, and `list_events`. It uses the same OS-backed login session and selected tenant as
|
|
136
136
|
`dw`, resolves an athlete by exact ID or unique name, resolves metric names
|
|
137
137
|
against the canonical Dataworks catalogue, polls asynchronous Data Explorer
|
|
138
138
|
queries, and returns normalized structured rows. GPS values include decoded
|
|
@@ -199,8 +199,19 @@ exactly one of `athlete_id` or `athlete_name`, plus `metric`; optional inputs ar
|
|
|
199
199
|
`limit`, `order`, `from`, `to`, `event_id`, `dataset_datasource_id`,
|
|
200
200
|
`tenant_id`, `metric_category`, and `timeout_ms`.
|
|
201
201
|
|
|
202
|
+
A query must be scoped by `athlete_id`, `athlete_name`, `event_id`, or
|
|
203
|
+
`dataset_datasource_id`. Supplying only an event or datasource answers questions
|
|
204
|
+
about a whole race — "the latest heart rate values at T100 San Francisco" — and
|
|
205
|
+
returns a null `athlete` with each row still carrying its own `athlete_id`.
|
|
206
|
+
|
|
207
|
+
`list_athletes` and `list_events` exist so an agent can resolve an ID instead of
|
|
208
|
+
guessing one, and can tell "not in this tenant" apart from "misspelled". When
|
|
209
|
+
`list_events` reports `unavailable: true` the event API returned nothing for that
|
|
210
|
+
session, which is a permissions problem rather than an empty tenant.
|
|
211
|
+
|
|
202
212
|
The server never performs mutations. If name resolution is ambiguous, it
|
|
203
213
|
returns candidates and requires an explicit athlete ID rather than guessing.
|
|
214
|
+
Every error carries a `recovery` field naming the command that fixes it.
|
|
204
215
|
|
|
205
216
|
---
|
|
206
217
|
|
|
@@ -12,4 +12,14 @@ export declare const metricLabels: Record<string, string>;
|
|
|
12
12
|
export declare const allMetricNames: readonly string[];
|
|
13
13
|
/** Category lookup for a canonical metric name. */
|
|
14
14
|
export declare const metricCategoryByName: Record<string, MetricCategory>;
|
|
15
|
+
/**
|
|
16
|
+
* Columns the Data Explorer accepts per category. It allowlists the column names
|
|
17
|
+
* it will place in SQL, and silently ignores an aggregate naming anything else,
|
|
18
|
+
* so grouping and aggregate fields must be checked against this.
|
|
19
|
+
*/
|
|
20
|
+
export declare const metricColumns: {
|
|
21
|
+
METRICS_TYPE_A: string[];
|
|
22
|
+
METRICS_TYPE_B: string[];
|
|
23
|
+
METRICS_TYPE_C: string[];
|
|
24
|
+
};
|
|
15
25
|
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/generated/metrics.ts"],"names":[],"mappings":"AAGA,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEpF,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;CA4CwB,CAAC;AAEtD,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsC/C,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA2C,CAAC;AAExF,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAsC/D,CAAC"}
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/generated/metrics.ts"],"names":[],"mappings":"AAGA,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEpF,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;CA4CwB,CAAC;AAEtD,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsC/C,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA2C,CAAC;AAExF,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAsC/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;CA6C2B,CAAC"}
|
|
@@ -128,4 +128,55 @@ export const metricCategoryByName = {
|
|
|
128
128
|
"power-cycling": "METRICS_TYPE_C",
|
|
129
129
|
"pwr_instant": "METRICS_TYPE_C"
|
|
130
130
|
};
|
|
131
|
+
/**
|
|
132
|
+
* Columns the Data Explorer accepts per category. It allowlists the column names
|
|
133
|
+
* it will place in SQL, and silently ignores an aggregate naming anything else,
|
|
134
|
+
* so grouping and aggregate fields must be checked against this.
|
|
135
|
+
*/
|
|
136
|
+
export const metricColumns = {
|
|
137
|
+
"METRICS_TYPE_A": [
|
|
138
|
+
"timestamp",
|
|
139
|
+
"datasetdatasourcepublicid",
|
|
140
|
+
"eventpublicid",
|
|
141
|
+
"athletepublicid",
|
|
142
|
+
"metric",
|
|
143
|
+
"current"
|
|
144
|
+
],
|
|
145
|
+
"METRICS_TYPE_B": [
|
|
146
|
+
"timestamp",
|
|
147
|
+
"datasetdatasourcepublicid",
|
|
148
|
+
"eventpublicid",
|
|
149
|
+
"athletepublicid",
|
|
150
|
+
"metric",
|
|
151
|
+
"current",
|
|
152
|
+
"max",
|
|
153
|
+
"min",
|
|
154
|
+
"avg"
|
|
155
|
+
],
|
|
156
|
+
"METRICS_TYPE_C": [
|
|
157
|
+
"timestamp",
|
|
158
|
+
"datasetdatasourcepublicid",
|
|
159
|
+
"eventpublicid",
|
|
160
|
+
"athletepublicid",
|
|
161
|
+
"metric",
|
|
162
|
+
"current",
|
|
163
|
+
"max",
|
|
164
|
+
"min",
|
|
165
|
+
"avg",
|
|
166
|
+
"z1_timespent",
|
|
167
|
+
"z1_percentage",
|
|
168
|
+
"z2_timespent",
|
|
169
|
+
"z2_percentage",
|
|
170
|
+
"z3_timespent",
|
|
171
|
+
"z3_percentage",
|
|
172
|
+
"z4_timespent",
|
|
173
|
+
"z4_percentage",
|
|
174
|
+
"z5_timespent",
|
|
175
|
+
"z5_percentage",
|
|
176
|
+
"z6_timespent",
|
|
177
|
+
"z6_percentage",
|
|
178
|
+
"z7_timespent",
|
|
179
|
+
"z7_percentage"
|
|
180
|
+
]
|
|
181
|
+
};
|
|
131
182
|
//# sourceMappingURL=metrics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/generated/metrics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/generated/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roster and event lookup for agents.
|
|
3
|
+
*
|
|
4
|
+
* Without this an agent that hits ATHLETE_NOT_FOUND has no sanctioned way to find
|
|
5
|
+
* out what does exist, and drops to raw GraphQL to go looking — which is how a
|
|
6
|
+
* simple question turns into twenty exploratory shell commands.
|
|
7
|
+
*/
|
|
8
|
+
import { executeGraphql } from "./graphql-transport.js";
|
|
9
|
+
import { requireSession } from "./session.js";
|
|
10
|
+
export interface DiscoverDependencies {
|
|
11
|
+
graphql: typeof executeGraphql;
|
|
12
|
+
session: typeof requireSession;
|
|
13
|
+
}
|
|
14
|
+
export interface AthleteSummary {
|
|
15
|
+
publicId: string;
|
|
16
|
+
name: string | null;
|
|
17
|
+
externalId: string | null;
|
|
18
|
+
}
|
|
19
|
+
export interface EventSummary {
|
|
20
|
+
publicId: string;
|
|
21
|
+
name: string | null;
|
|
22
|
+
startsAt: string | null;
|
|
23
|
+
location: string | null;
|
|
24
|
+
type: string | null;
|
|
25
|
+
/** Dataset the event was reached through, when discovered that way. */
|
|
26
|
+
datasetPublicId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface DiscoverInput {
|
|
29
|
+
search?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
tenantId?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AthleteListOutput {
|
|
34
|
+
tenantId: string;
|
|
35
|
+
total: number;
|
|
36
|
+
count: number;
|
|
37
|
+
search: string | null;
|
|
38
|
+
athletes: AthleteSummary[];
|
|
39
|
+
}
|
|
40
|
+
export interface EventListOutput {
|
|
41
|
+
tenantId: string;
|
|
42
|
+
total: number;
|
|
43
|
+
count: number;
|
|
44
|
+
search: string | null;
|
|
45
|
+
events: EventSummary[];
|
|
46
|
+
/**
|
|
47
|
+
* Set when listEvents returned null AND no events could be reached through
|
|
48
|
+
* datasets. Callers must not read that as "no events exist".
|
|
49
|
+
*/
|
|
50
|
+
unavailable: boolean;
|
|
51
|
+
/** Where the events came from: the events API, or the dataset relation. */
|
|
52
|
+
source: "events" | "datasets" | "none";
|
|
53
|
+
}
|
|
54
|
+
export declare function listAthletes(input?: DiscoverInput, options?: {
|
|
55
|
+
dependencies?: Partial<DiscoverDependencies>;
|
|
56
|
+
}): Promise<AthleteListOutput>;
|
|
57
|
+
export declare function listEvents(input?: DiscoverInput, options?: {
|
|
58
|
+
dependencies?: Partial<DiscoverDependencies>;
|
|
59
|
+
}): Promise<EventListOutput>;
|
|
60
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/lib/discover.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,cAAc,CAAC;IAC/B,OAAO,EAAE,OAAO,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;CACxC;AA2FD,wBAAsB,YAAY,CAChC,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAAO,GAC7D,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AAED,wBAAsB,UAAU,CAC9B,KAAK,GAAE,aAAkB,EACzB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAAO,GAC7D,OAAO,CAAC,eAAe,CAAC,CAqE1B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Roster and event lookup for agents.
|
|
3
|
+
*
|
|
4
|
+
* Without this an agent that hits ATHLETE_NOT_FOUND has no sanctioned way to find
|
|
5
|
+
* out what does exist, and drops to raw GraphQL to go looking — which is how a
|
|
6
|
+
* simple question turns into twenty exploratory shell commands.
|
|
7
|
+
*/
|
|
8
|
+
import { executeGraphql } from "./graphql-transport.js";
|
|
9
|
+
import { CliError, toCliError } from "./errors.js";
|
|
10
|
+
import { requireSession } from "./session.js";
|
|
11
|
+
const listAthletesDocument = `query listAthletes($limit: Int, $nextToken: String, $tenant: String!) {
|
|
12
|
+
listAthletes(limit: $limit, nextToken: $nextToken, tenant: $tenant) {
|
|
13
|
+
items { publicId externalId forename surname name nameShort }
|
|
14
|
+
nextToken
|
|
15
|
+
}
|
|
16
|
+
}`;
|
|
17
|
+
const listEventsDocument = `query listEvents($limit: Int, $nextToken: String, $tenant: String!) {
|
|
18
|
+
listEvents(limit: $limit, nextToken: $nextToken, tenant: $tenant) {
|
|
19
|
+
items { publicId name startsAt location type }
|
|
20
|
+
nextToken
|
|
21
|
+
}
|
|
22
|
+
}`;
|
|
23
|
+
/**
|
|
24
|
+
* Events reached through their datasets.
|
|
25
|
+
*
|
|
26
|
+
* listEvents currently returns null on this API, but every dataset exposes its
|
|
27
|
+
* event, so a race can still be identified by name rather than inferred from an
|
|
28
|
+
* ID prefix. Used only when the events API gives nothing.
|
|
29
|
+
*/
|
|
30
|
+
const datasetEventsDocument = `query listDatasets($limit: Int, $nextToken: String, $tenant: String!) {
|
|
31
|
+
listDatasets(limit: $limit, nextToken: $nextToken, tenant: $tenant) {
|
|
32
|
+
items { publicId name event { publicId name startsAt location type } }
|
|
33
|
+
nextToken
|
|
34
|
+
}
|
|
35
|
+
}`;
|
|
36
|
+
const defaultDependencies = {
|
|
37
|
+
graphql: executeGraphql,
|
|
38
|
+
session: requireSession,
|
|
39
|
+
};
|
|
40
|
+
function normalize(value) {
|
|
41
|
+
return value
|
|
42
|
+
.trim()
|
|
43
|
+
.toLocaleLowerCase()
|
|
44
|
+
.replaceAll(/[^a-z0-9]/g, "");
|
|
45
|
+
}
|
|
46
|
+
function athleteName(athlete) {
|
|
47
|
+
const full = [athlete.forename, athlete.surname]
|
|
48
|
+
.filter((part) => Boolean(String(part ?? "").trim()))
|
|
49
|
+
.join(" ");
|
|
50
|
+
return athlete.name?.trim() || full || athlete.nameShort?.trim() || null;
|
|
51
|
+
}
|
|
52
|
+
async function resolveTenant(input, dependencies) {
|
|
53
|
+
const session = await dependencies.session();
|
|
54
|
+
const tenantId = input.tenantId?.trim() || session.tenant;
|
|
55
|
+
if (!tenantId) {
|
|
56
|
+
throw new CliError("No tenant selected; run `dw tenant select` or provide tenant_id", "TENANT_REQUIRED", 2);
|
|
57
|
+
}
|
|
58
|
+
return tenantId;
|
|
59
|
+
}
|
|
60
|
+
/** Page through a connection, stopping at a page cap rather than looping forever. */
|
|
61
|
+
async function collect(document, field, tenantId, dependencies) {
|
|
62
|
+
const items = [];
|
|
63
|
+
let nextToken;
|
|
64
|
+
let pages = 0;
|
|
65
|
+
let sawConnection = false;
|
|
66
|
+
do {
|
|
67
|
+
const result = await dependencies.graphql(document, {
|
|
68
|
+
limit: 100,
|
|
69
|
+
nextToken,
|
|
70
|
+
tenant: tenantId,
|
|
71
|
+
});
|
|
72
|
+
const connection = result?.[field];
|
|
73
|
+
if (connection)
|
|
74
|
+
sawConnection = true;
|
|
75
|
+
items.push(...(connection?.items ?? []));
|
|
76
|
+
nextToken = connection?.nextToken;
|
|
77
|
+
pages += 1;
|
|
78
|
+
} while (nextToken && pages < 100);
|
|
79
|
+
return { items, unavailable: !sawConnection };
|
|
80
|
+
}
|
|
81
|
+
export async function listAthletes(input = {}, options = {}) {
|
|
82
|
+
const dependencies = { ...defaultDependencies, ...options.dependencies };
|
|
83
|
+
try {
|
|
84
|
+
const tenantId = await resolveTenant(input, dependencies);
|
|
85
|
+
const { items } = await collect(listAthletesDocument, "listAthletes", tenantId, dependencies);
|
|
86
|
+
const all = items.map((athlete) => ({
|
|
87
|
+
publicId: String(athlete.publicId),
|
|
88
|
+
name: athleteName(athlete),
|
|
89
|
+
externalId: athlete.externalId ?? null,
|
|
90
|
+
}));
|
|
91
|
+
const search = input.search?.trim() || null;
|
|
92
|
+
const needle = search ? normalize(search) : null;
|
|
93
|
+
const matched = needle
|
|
94
|
+
? all.filter((athlete) => [athlete.name, athlete.externalId, athlete.publicId]
|
|
95
|
+
.filter((value) => Boolean(value))
|
|
96
|
+
.some((value) => normalize(value).includes(needle)))
|
|
97
|
+
: all;
|
|
98
|
+
const limit = input.limit ?? 50;
|
|
99
|
+
return {
|
|
100
|
+
tenantId,
|
|
101
|
+
total: matched.length,
|
|
102
|
+
count: Math.min(matched.length, limit),
|
|
103
|
+
search,
|
|
104
|
+
athletes: matched.slice(0, limit),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw toCliError(error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function listEvents(input = {}, options = {}) {
|
|
112
|
+
const dependencies = { ...defaultDependencies, ...options.dependencies };
|
|
113
|
+
try {
|
|
114
|
+
const tenantId = await resolveTenant(input, dependencies);
|
|
115
|
+
const toSummary = (event, datasetPublicId) => ({
|
|
116
|
+
publicId: String(event.publicId),
|
|
117
|
+
name: event.name ?? null,
|
|
118
|
+
startsAt: event.startsAt ?? null,
|
|
119
|
+
location: event.location ?? null,
|
|
120
|
+
type: event.type ?? null,
|
|
121
|
+
...(datasetPublicId ? { datasetPublicId } : {}),
|
|
122
|
+
});
|
|
123
|
+
const direct = await collect(listEventsDocument, "listEvents", tenantId, dependencies);
|
|
124
|
+
let source = direct.unavailable ? "none" : "events";
|
|
125
|
+
let all = direct.items.map((event) => toSummary(event));
|
|
126
|
+
// The events API returns null on this deployment. Datasets still carry their
|
|
127
|
+
// event, so fall back rather than leaving the caller to infer an ID.
|
|
128
|
+
if (!all.length) {
|
|
129
|
+
const viaDatasets = await collect(datasetEventsDocument, "listDatasets", tenantId, dependencies);
|
|
130
|
+
const seen = new Set();
|
|
131
|
+
const derived = [];
|
|
132
|
+
for (const dataset of viaDatasets.items) {
|
|
133
|
+
const event = dataset.event;
|
|
134
|
+
if (!event?.publicId || seen.has(String(event.publicId)))
|
|
135
|
+
continue;
|
|
136
|
+
seen.add(String(event.publicId));
|
|
137
|
+
derived.push(toSummary(event, String(dataset.publicId)));
|
|
138
|
+
}
|
|
139
|
+
if (derived.length) {
|
|
140
|
+
all = derived;
|
|
141
|
+
source = "datasets";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const search = input.search?.trim() || null;
|
|
145
|
+
const needle = search ? normalize(search) : null;
|
|
146
|
+
const matched = needle
|
|
147
|
+
? all.filter((event) => [event.name, event.publicId]
|
|
148
|
+
.filter((value) => Boolean(value))
|
|
149
|
+
.some((value) => normalize(value).includes(needle)))
|
|
150
|
+
: all;
|
|
151
|
+
const limit = input.limit ?? 50;
|
|
152
|
+
return {
|
|
153
|
+
tenantId,
|
|
154
|
+
total: matched.length,
|
|
155
|
+
count: Math.min(matched.length, limit),
|
|
156
|
+
search,
|
|
157
|
+
events: matched.slice(0, limit),
|
|
158
|
+
unavailable: all.length === 0 && direct.unavailable,
|
|
159
|
+
source,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
throw toCliError(error);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/lib/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
export interface GraphqlError {
|
|
2
|
+
message: string;
|
|
3
|
+
path?: Array<string | number>;
|
|
4
|
+
}
|
|
5
|
+
export interface GraphqlPayload<T> {
|
|
6
|
+
data?: T | null;
|
|
7
|
+
errors?: GraphqlError[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Decide what a GraphQL response means.
|
|
11
|
+
*
|
|
12
|
+
* AppSync reports a partial failure as `{data: {field: null}, errors: [...]}`.
|
|
13
|
+
* Because `data` is present, an `errors` check keyed on `data` being undefined
|
|
14
|
+
* discards the explanation and hands back a bare null, which is indistinguishable
|
|
15
|
+
* from "there is genuinely nothing here". Callers then debug a silent null.
|
|
16
|
+
*
|
|
17
|
+
* Errors with no usable data are fatal. Errors alongside usable data are a real
|
|
18
|
+
* partial success, so the data is returned rather than thrown away — but the
|
|
19
|
+
* failure is reported to the caller so it cannot vanish.
|
|
20
|
+
*/
|
|
21
|
+
export declare function interpretGraphqlPayload<T>(payload: GraphqlPayload<T>): {
|
|
22
|
+
data: T;
|
|
23
|
+
warnings: string[];
|
|
24
|
+
};
|
|
1
25
|
export declare function executeGraphql<T = unknown>(document: string, variables: Record<string, unknown>): Promise<T>;
|
|
2
26
|
export declare function subscribeGraphql(document: string, variables: Record<string, unknown>, onData: (data: unknown) => void): Promise<void>;
|
|
3
27
|
//# sourceMappingURL=graphql-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-transport.d.ts","sourceRoot":"","sources":["../../src/lib/graphql-transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphql-transport.d.ts","sourceRoot":"","sources":["../../src/lib/graphql-transport.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AAQD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG;IACtE,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAcA;AAED,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC,CAgCZ;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoDf"}
|
|
@@ -3,6 +3,36 @@ import { createSubscriptionHandshakeLink } from "aws-appsync-subscription-link";
|
|
|
3
3
|
import { resolveEnvironment } from "./environment.js";
|
|
4
4
|
import { CliError } from "./errors.js";
|
|
5
5
|
import { requireSession } from "./session.js";
|
|
6
|
+
/** "listEvents: Unauthorized tenant access", or just the message when there is no path. */
|
|
7
|
+
function describe(error) {
|
|
8
|
+
const path = error.path?.join(".");
|
|
9
|
+
return path ? `${path}: ${error.message}` : error.message;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Decide what a GraphQL response means.
|
|
13
|
+
*
|
|
14
|
+
* AppSync reports a partial failure as `{data: {field: null}, errors: [...]}`.
|
|
15
|
+
* Because `data` is present, an `errors` check keyed on `data` being undefined
|
|
16
|
+
* discards the explanation and hands back a bare null, which is indistinguishable
|
|
17
|
+
* from "there is genuinely nothing here". Callers then debug a silent null.
|
|
18
|
+
*
|
|
19
|
+
* Errors with no usable data are fatal. Errors alongside usable data are a real
|
|
20
|
+
* partial success, so the data is returned rather than thrown away — but the
|
|
21
|
+
* failure is reported to the caller so it cannot vanish.
|
|
22
|
+
*/
|
|
23
|
+
export function interpretGraphqlPayload(payload) {
|
|
24
|
+
const errors = payload.errors ?? [];
|
|
25
|
+
if (!errors.length)
|
|
26
|
+
return { data: payload.data, warnings: [] };
|
|
27
|
+
const values = payload.data && typeof payload.data === "object"
|
|
28
|
+
? Object.values(payload.data)
|
|
29
|
+
: [];
|
|
30
|
+
const hasUsableData = values.some((value) => value !== null && value !== undefined);
|
|
31
|
+
if (!hasUsableData) {
|
|
32
|
+
throw new CliError(errors.map(describe).join("; "), "GRAPHQL_ERROR", 1, errors);
|
|
33
|
+
}
|
|
34
|
+
return { data: payload.data, warnings: errors.map(describe) };
|
|
35
|
+
}
|
|
6
36
|
export async function executeGraphql(document, variables) {
|
|
7
37
|
const session = await requireSession();
|
|
8
38
|
const environment = resolveEnvironment(session.environment, session.clientId);
|
|
@@ -25,10 +55,13 @@ export async function executeGraphql(document, variables) {
|
|
|
25
55
|
catch {
|
|
26
56
|
throw new CliError("GraphQL returned invalid JSON", "GRAPHQL_RESPONSE_INVALID");
|
|
27
57
|
}
|
|
28
|
-
|
|
29
|
-
|
|
58
|
+
const { data, warnings } = interpretGraphqlPayload(payload);
|
|
59
|
+
// Partial success: stdout keeps carrying the usable data, including under
|
|
60
|
+
// --json, while the failure still reaches the operator on stderr.
|
|
61
|
+
for (const warning of warnings) {
|
|
62
|
+
process.stderr.write(`Warning: GraphQL partial failure — ${warning}\n`);
|
|
30
63
|
}
|
|
31
|
-
return
|
|
64
|
+
return data;
|
|
32
65
|
}
|
|
33
66
|
export async function subscribeGraphql(document, variables, onData) {
|
|
34
67
|
const session = await requireSession();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-transport.js","sourceRoot":"","sources":["../../src/lib/graphql-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"graphql-transport.js","sourceRoot":"","sources":["../../src/lib/graphql-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* What lives here is the CLI-owned layer the SDK does not define: the everyday
|
|
7
7
|
* wordings a user or model is likely to type, and display units.
|
|
8
8
|
*/
|
|
9
|
-
import { allMetricNames, metricCategories, metricLabels, type MetricCategory } from "../generated/metrics.js";
|
|
10
|
-
export { allMetricNames, metricCategories, metricLabels, type MetricCategory };
|
|
9
|
+
import { allMetricNames, metricCategories, metricColumns, metricLabels, type MetricCategory } from "../generated/metrics.js";
|
|
10
|
+
export { allMetricNames, metricCategories, metricColumns, metricLabels, type MetricCategory, };
|
|
11
11
|
/** Normalize wording to a lookup key: "Heart Rate" and "heart-rate" both give "heartrate". */
|
|
12
12
|
export declare function compactMetricName(value: string): string;
|
|
13
13
|
export interface ResolvedMetricName {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-names.d.ts","sourceRoot":"","sources":["../../src/lib/metric-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,YAAY,EACZ,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"metric-names.d.ts","sourceRoot":"","sources":["../../src/lib/metric-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,aAAa,EACb,YAAY,EACZ,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,KAAK,cAAc,GACpB,CAAC;AA+FF,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvD;AAOD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAQnF;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAyBzE;AASD,sEAAsE;AACtE,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C"}
|
package/dist/lib/metric-names.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* What lives here is the CLI-owned layer the SDK does not define: the everyday
|
|
7
7
|
* wordings a user or model is likely to type, and display units.
|
|
8
8
|
*/
|
|
9
|
-
import { allMetricNames, metricCategories, metricCategoryByName, metricLabels, } from "../generated/metrics.js";
|
|
10
|
-
export { allMetricNames, metricCategories, metricLabels };
|
|
9
|
+
import { allMetricNames, metricCategories, metricCategoryByName, metricColumns, metricLabels, } from "../generated/metrics.js";
|
|
10
|
+
export { allMetricNames, metricCategories, metricColumns, metricLabels, };
|
|
11
11
|
/**
|
|
12
12
|
* Units for metrics whose scale the catalogue states explicitly, either in the
|
|
13
13
|
* SDK's category comments or its label text. Metrics whose unit upstream leaves
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-names.js","sourceRoot":"","sources":["../../src/lib/metric-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,GAEb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"metric-names.js","sourceRoot":"","sources":["../../src/lib/metric-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,GAEb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,GAEb,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAA2B;IAC3C,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,GAAG;IACf,iBAAiB,EAAE,GAAG;IACtB,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,gBAAgB,EAAE,GAAG;IACrB,wBAAwB,EAAE,GAAG;IAC7B,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,MAAM;IACpB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,iBAAiB,EAAE,SAAS;CAC7B,CAAC;AAEF;;;;GAIG;AACH,MAAM,aAAa,GAA2B;IAC5C,MAAM;IACN,GAAG,EAAE,SAAS;IACd,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,SAAS;IACtB,MAAM,EAAE,SAAS;IACjB,aAAa;IACb,EAAE,EAAE,WAAW;IACf,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,WAAW;IACtB,QAAQ;IACR,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,eAAe;IAC1B,YAAY,EAAE,aAAa;IAC3B,UAAU;IACV,GAAG,EAAE,SAAS;IACd,cAAc,EAAE,iBAAiB;IACjC,WAAW,EAAE,iBAAiB;IAC9B,sBAAsB;IACtB,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,UAAU;IAClB,SAAS;IACT,UAAU,EAAE,UAAU;IACtB,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,UAAU;IACrB,WAAW;IACX,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,cAAc;IAC3B,OAAO;IACP,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,UAAU;IACnB,OAAO;IACP,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,sBAAsB;IAC9B,QAAQ,EAAE,sBAAsB;CACjC,CAAC;AAEF;;;;GAIG;AACH,MAAM,mBAAmB,GAAsC;IAC7D,MAAM,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC;IAC/D,IAAI,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC;IAC7D,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC/B,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAClC,GAAG,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,gBAAgB,CAAC;IACxD,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK;SACT,IAAI,EAAE;SACN,iBAAiB,EAAE;SACnB,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,GAA2B;IACtC,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACpF,GAAG,aAAa;CACjB,CAAC;AAQF,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACjD,gFAAgF;IAChF,2EAA2E;IAC3E,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;AACxE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAK,GAAG,CAAC;IAC7D,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,SAAS;SACN,iBAAiB,EAAE;SACnB,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CACvC,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAClF,CAAC;IACF,MAAM,MAAM,GAAG,cAAc;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC;aACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC;aACtE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC;aAClC,IAAI,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,eAA4B;IAC/D,OAAO,MAAM;SACV,iBAAiB,EAAE;SACnB,KAAK,CAAC,YAAY,CAAC;SACnB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,oBAAoB;IAClC,OAAQ,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAsB;SACvD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -2,8 +2,11 @@ import { executeGraphql } from "./graphql-transport.js";
|
|
|
2
2
|
import { type MetricCategory } from "./metric-names.js";
|
|
3
3
|
import { requireSession } from "./session.js";
|
|
4
4
|
export type { MetricCategory };
|
|
5
|
+
export type MetricAggregate = "count" | "avg" | "sum" | "max" | "min";
|
|
5
6
|
export interface QueryMetricsInput {
|
|
6
7
|
athleteId?: string;
|
|
8
|
+
/** Several athletes at once, for comparing them in one query. */
|
|
9
|
+
athleteIds?: string[];
|
|
7
10
|
athleteName?: string;
|
|
8
11
|
metric: string;
|
|
9
12
|
metricCategory?: MetricCategory;
|
|
@@ -15,6 +18,20 @@ export interface QueryMetricsInput {
|
|
|
15
18
|
datasetDatasourceId?: string;
|
|
16
19
|
tenantId?: string;
|
|
17
20
|
timeoutMs?: number;
|
|
21
|
+
/** Compute server-side instead of returning rows, e.g. a maximum over all history. */
|
|
22
|
+
aggregate?: MetricAggregate;
|
|
23
|
+
/** Column to aggregate; defaults to `current`, the metric value. */
|
|
24
|
+
aggregateField?: string;
|
|
25
|
+
/** Column to group by; defaults to `athletepublicid`. */
|
|
26
|
+
groupBy?: string;
|
|
27
|
+
/** Keep only samples whose value is at least this. */
|
|
28
|
+
minValue?: number;
|
|
29
|
+
/** Keep only samples whose value is at most this. */
|
|
30
|
+
maxValue?: number;
|
|
31
|
+
/** Column to sort by; defaults to `timestamp`. */
|
|
32
|
+
orderBy?: string;
|
|
33
|
+
/** Several events at once, for spanning a series of races. */
|
|
34
|
+
eventIds?: string[];
|
|
18
35
|
}
|
|
19
36
|
export interface MetricPosition {
|
|
20
37
|
latitude: number;
|
|
@@ -30,15 +47,26 @@ export interface MetricRow {
|
|
|
30
47
|
position: MetricPosition | null;
|
|
31
48
|
eventId: string | null;
|
|
32
49
|
datasetDatasourceId: string | null;
|
|
50
|
+
/**
|
|
51
|
+
* Every other column the category provides — the rolling max/min/avg, and the
|
|
52
|
+
* seven training zones for heart rate and power. Kept as a map so a column
|
|
53
|
+
* added upstream reaches callers without a code change here.
|
|
54
|
+
*/
|
|
55
|
+
extra: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
export interface MetricAggregateGroup {
|
|
58
|
+
key: string | null;
|
|
59
|
+
value: number | null;
|
|
33
60
|
}
|
|
34
61
|
export interface QueryMetricsOutput {
|
|
35
62
|
environment: "uat" | "live";
|
|
36
63
|
tenantId: string;
|
|
64
|
+
/** Null when the query is scoped by event or datasource rather than an athlete. */
|
|
37
65
|
athlete: {
|
|
38
66
|
publicId: string;
|
|
39
67
|
name: string | null;
|
|
40
68
|
matchedBy: "public_id" | "name" | "partial_name";
|
|
41
|
-
};
|
|
69
|
+
} | null;
|
|
42
70
|
metric: {
|
|
43
71
|
requested: string;
|
|
44
72
|
canonical: string;
|
|
@@ -47,6 +75,10 @@ export interface QueryMetricsOutput {
|
|
|
47
75
|
};
|
|
48
76
|
filters: {
|
|
49
77
|
eventId: string | null;
|
|
78
|
+
/** Echoes a multi-event request; compare against each row's eventId. */
|
|
79
|
+
eventIds: string[] | null;
|
|
80
|
+
/** Echoes a multi-athlete request; an athlete with no data simply has no rows. */
|
|
81
|
+
athleteIds: string[] | null;
|
|
50
82
|
datasetDatasourceId: string | null;
|
|
51
83
|
from: string | null;
|
|
52
84
|
to: string | null;
|
|
@@ -59,6 +91,13 @@ export interface QueryMetricsOutput {
|
|
|
59
91
|
queryExecutionId: string | null;
|
|
60
92
|
queryTimeMs: number | null;
|
|
61
93
|
rows: MetricRow[];
|
|
94
|
+
/** Present only when an aggregate was requested; `rows` is empty in that case. */
|
|
95
|
+
aggregate: {
|
|
96
|
+
function: MetricAggregate;
|
|
97
|
+
field: string;
|
|
98
|
+
groupBy: string;
|
|
99
|
+
groups: MetricAggregateGroup[];
|
|
100
|
+
} | null;
|
|
62
101
|
}
|
|
63
102
|
export interface QueryMetricsDependencies {
|
|
64
103
|
graphql: typeof executeGraphql;
|
|
@@ -66,6 +105,8 @@ export interface QueryMetricsDependencies {
|
|
|
66
105
|
sleep: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
|
|
67
106
|
now: () => number;
|
|
68
107
|
}
|
|
108
|
+
/** Trimmed, de-duplicated, empties dropped. */
|
|
109
|
+
export declare function normalizeIdList(values: string[] | undefined): string[];
|
|
69
110
|
export declare function queryMetrics(input: QueryMetricsInput, options?: {
|
|
70
111
|
dependencies?: Partial<QueryMetricsDependencies>;
|
|
71
112
|
signal?: AbortSignal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-metrics.d.ts","sourceRoot":"","sources":["../../src/lib/query-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EACL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"query-metrics.d.ts","sourceRoot":"","sources":["../../src/lib/query-metrics.ts"],"names":[],"mappings":"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"}
|