@stuartshay/otel-graphql-types 1.0.94 → 1.0.95

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 (3) hide show
  1. package/index.d.ts +319 -26
  2. package/package.json +1 -1
  3. package/schema.graphql +590 -2
package/index.d.ts CHANGED
@@ -1,19 +1,14 @@
1
1
  export type Maybe<T> = T | null;
2
2
  export type InputMaybe<T> = Maybe<T>;
3
- export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
4
- export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
5
- export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
6
- export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };
7
- export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
8
3
  /** All built-in and custom scalars, mapped to their actual values */
9
4
  export interface Scalars {
10
- ID: { input: string; output: string; }
11
- String: { input: string; output: string; }
12
- Boolean: { input: boolean; output: boolean; }
13
- Int: { input: number; output: number; }
14
- Float: { input: number; output: number; }
15
- DateTime: { input: string; output: string; }
16
- JSON: { input: Record<string, unknown>; output: Record<string, unknown>; }
5
+ ID: { input: string; output: string };
6
+ String: { input: string; output: string };
7
+ Boolean: { input: boolean; output: boolean };
8
+ Int: { input: number; output: number };
9
+ Float: { input: number; output: number };
10
+ DateTime: { input: string; output: string };
11
+ JSON: { input: Record<string, unknown>; output: Record<string, unknown> };
17
12
  }
18
13
 
19
14
  /** Per-day aggregate combining OwnTracks location stats and Garmin activity metrics. */
@@ -45,6 +40,28 @@ export interface DailyActivitySummary {
45
40
  total_duration_seconds?: Maybe<Scalars['Float']['output']>;
46
41
  }
47
42
 
43
+ /** Paginated list of daily activity summaries. */
44
+ export interface DailySummaryConnection {
45
+ __typename?: 'DailySummaryConnection';
46
+ /** List of daily activity summary items in the current page */
47
+ items: Array<DailyActivitySummary>;
48
+ /** Maximum number of items per page */
49
+ limit: Scalars['Int']['output'];
50
+ /** Number of items skipped from the start */
51
+ offset: Scalars['Int']['output'];
52
+ /** Total number of items matching the query */
53
+ total: Scalars['Int']['output'];
54
+ }
55
+
56
+ /** Earliest and latest activity dates available in the daily activity summary view. */
57
+ export interface DailySummaryDateRange {
58
+ __typename?: 'DailySummaryDateRange';
59
+ /** Latest activity date with daily summary data (YYYY-MM-DD) */
60
+ max_date: Scalars['String']['output'];
61
+ /** Earliest activity date with daily summary data (YYYY-MM-DD) */
62
+ min_date: Scalars['String']['output'];
63
+ }
64
+
48
65
  /** Distinct OwnTracks device identifier. */
49
66
  export interface DeviceInfo {
50
67
  __typename?: 'DeviceInfo';
@@ -72,12 +89,18 @@ export interface GarminActivity {
72
89
  __typename?: 'GarminActivity';
73
90
  /** Garmin Connect activity identifier */
74
91
  activity_id: Scalars['String']['output'];
92
+ /** Aerobic training effect score */
93
+ aerobic_training_effect?: Maybe<Scalars['Float']['output']>;
94
+ /** Anaerobic training effect score */
95
+ anaerobic_training_effect?: Maybe<Scalars['Float']['output']>;
75
96
  /** Average cadence in RPM */
76
97
  avg_cadence?: Maybe<Scalars['Int']['output']>;
77
98
  /** Average heart rate in beats per minute */
78
99
  avg_heart_rate?: Maybe<Scalars['Int']['output']>;
79
100
  /** Average pace in minutes per kilometre */
80
101
  avg_pace?: Maybe<Scalars['Float']['output']>;
102
+ /** Average respiration rate in breaths per minute */
103
+ avg_respiration_rate?: Maybe<Scalars['Int']['output']>;
81
104
  /** Average speed in km/h */
82
105
  avg_speed_kmh?: Maybe<Scalars['Float']['output']>;
83
106
  /** Average ambient temperature in degrees C */
@@ -86,6 +109,8 @@ export interface GarminActivity {
86
109
  calories?: Maybe<Scalars['Int']['output']>;
87
110
  /** UTC timestamp when the record was inserted */
88
111
  created_at?: Maybe<Scalars['String']['output']>;
112
+ /** Recording device metadata (manufacturer, model, firmware) */
113
+ device?: Maybe<GarminDevice>;
89
114
  /** Device manufacturer (e.g. garmin) */
90
115
  device_manufacturer?: Maybe<Scalars['String']['output']>;
91
116
  /** Total distance in kilometres */
@@ -94,22 +119,38 @@ export interface GarminActivity {
94
119
  duration_seconds?: Maybe<Scalars['Float']['output']>;
95
120
  /** Activity end time in UTC */
96
121
  end_time?: Maybe<Scalars['String']['output']>;
122
+ /** Exercise load score */
123
+ exercise_load?: Maybe<Scalars['Int']['output']>;
124
+ /** Whether this activity has usable heart-rate data in summary or track points */
125
+ hr_available: Scalars['Boolean']['output'];
97
126
  /** Maximum cadence in RPM */
98
127
  max_cadence?: Maybe<Scalars['Int']['output']>;
99
128
  /** Maximum heart rate in beats per minute */
100
129
  max_heart_rate?: Maybe<Scalars['Int']['output']>;
130
+ /** Maximum respiration rate in breaths per minute */
131
+ max_respiration_rate?: Maybe<Scalars['Int']['output']>;
101
132
  /** Maximum speed in km/h */
102
133
  max_speed_kmh?: Maybe<Scalars['Float']['output']>;
103
134
  /** Maximum ambient temperature in degrees C */
104
135
  max_temperature_c?: Maybe<Scalars['Int']['output']>;
136
+ /** Minimum heart rate in beats per minute */
137
+ min_heart_rate?: Maybe<Scalars['Int']['output']>;
138
+ /** Minimum respiration rate in breaths per minute */
139
+ min_respiration_rate?: Maybe<Scalars['Int']['output']>;
105
140
  /** Minimum ambient temperature in degrees C */
106
141
  min_temperature_c?: Maybe<Scalars['Int']['output']>;
142
+ /** Moderate intensity minutes */
143
+ moderate_intensity_minutes?: Maybe<Scalars['Int']['output']>;
144
+ /** Distance over paved surfaces in kilometres */
145
+ paved_distance_km?: Maybe<Scalars['Float']['output']>;
107
146
  /** Primary sport type (e.g. cycling, running) */
108
147
  sport: Scalars['String']['output'];
109
148
  /** Activity start time in UTC */
110
149
  start_time?: Maybe<Scalars['String']['output']>;
111
150
  /** Sub-sport classification (e.g. road, trail) */
112
151
  sub_sport?: Maybe<Scalars['String']['output']>;
152
+ /** Estimated sweat loss in millilitres */
153
+ sweat_loss_ml?: Maybe<Scalars['Int']['output']>;
113
154
  /** Total elevation gain in meters */
114
155
  total_ascent_m?: Maybe<Scalars['Float']['output']>;
115
156
  /** Total elevation loss in meters */
@@ -118,12 +159,59 @@ export interface GarminActivity {
118
159
  total_distance?: Maybe<Scalars['Float']['output']>;
119
160
  /** Total elapsed time in seconds (includes pauses) */
120
161
  total_elapsed_time?: Maybe<Scalars['Float']['output']>;
162
+ /** Total intensity minutes */
163
+ total_intensity_minutes?: Maybe<Scalars['Int']['output']>;
164
+ /** Total activity strokes */
165
+ total_strokes?: Maybe<Scalars['Int']['output']>;
121
166
  /** Total timer time in seconds (active recording) */
122
167
  total_timer_time?: Maybe<Scalars['Float']['output']>;
123
168
  /** Number of GPS track points in this activity */
124
169
  track_point_count?: Maybe<Scalars['Int']['output']>;
170
+ /** Distance over unpaved surfaces in kilometres */
171
+ unpaved_distance_km?: Maybe<Scalars['Float']['output']>;
125
172
  /** UTC timestamp when the FIT file was uploaded */
126
173
  uploaded_at?: Maybe<Scalars['String']['output']>;
174
+ /** Vigorous intensity minutes */
175
+ vigorous_intensity_minutes?: Maybe<Scalars['Int']['output']>;
176
+ }
177
+
178
+ /** Full reverse-geocoded address attached to a Garmin activity waypoint. */
179
+ export interface GarminActivityAddress {
180
+ __typename?: 'GarminActivityAddress';
181
+ /** Parent Garmin activity identifier */
182
+ activity_id: Scalars['String']['output'];
183
+ /** Pelias confidence score (0-1) */
184
+ confidence?: Maybe<Scalars['Float']['output']>;
185
+ /** Country name */
186
+ country?: Maybe<Scalars['String']['output']>;
187
+ /** Full formatted address label from Pelias */
188
+ display_address?: Maybe<Scalars['String']['output']>;
189
+ /** UTC timestamp when geocoding was performed */
190
+ geocoded_at?: Maybe<Scalars['String']['output']>;
191
+ /** House or building number */
192
+ housenumber?: Maybe<Scalars['String']['output']>;
193
+ /** GPS latitude in decimal degrees (WGS 84) */
194
+ latitude: Scalars['Float']['output'];
195
+ /** City or town */
196
+ locality?: Maybe<Scalars['String']['output']>;
197
+ /** GPS longitude in decimal degrees (WGS 84) */
198
+ longitude: Scalars['Float']['output'];
199
+ /** Neighbourhood name */
200
+ neighbourhood?: Maybe<Scalars['String']['output']>;
201
+ /** Postal or ZIP code */
202
+ postalcode?: Maybe<Scalars['String']['output']>;
203
+ /** State or province */
204
+ region?: Maybe<Scalars['String']['output']>;
205
+ /** Geocoding status: success, no_coverage, error, pending */
206
+ status: Scalars['String']['output'];
207
+ /** Street name */
208
+ street?: Maybe<Scalars['String']['output']>;
209
+ /** UTC timestamp of the track point this address was derived from */
210
+ timestamp: Scalars['DateTime']['output'];
211
+ /** garmin_track_points.id this address was geocoded from */
212
+ track_point_id: Scalars['Int']['output'];
213
+ /** Role of this waypoint within the activity: start, end, or waypoint */
214
+ waypoint_kind: Scalars['String']['output'];
127
215
  }
128
216
 
129
217
  /** Paginated list of Garmin activities. */
@@ -139,6 +227,23 @@ export interface GarminActivityConnection {
139
227
  total: Scalars['Int']['output'];
140
228
  }
141
229
 
230
+ /** Aggregated Garmin activity totals for a single time bucket (week, month, or year). */
231
+ export interface GarminActivityTotal {
232
+ __typename?: 'GarminActivityTotal';
233
+ /** Number of activities in the period */
234
+ activity_count: Scalars['Int']['output'];
235
+ /** Start date of the period bucket (DATE_TRUNC of week/month/year) */
236
+ period_start: Scalars['String']['output'];
237
+ /** Sum of elevation gain in meters */
238
+ total_ascent_m?: Maybe<Scalars['Int']['output']>;
239
+ /** Sum of calories burned */
240
+ total_calories?: Maybe<Scalars['Int']['output']>;
241
+ /** Sum of distance in kilometres */
242
+ total_distance_km?: Maybe<Scalars['Float']['output']>;
243
+ /** Sum of active duration in seconds (excludes pauses) */
244
+ total_duration_seconds?: Maybe<Scalars['Int']['output']>;
245
+ }
246
+
142
247
  /** Lightweight track point optimised for time-series chart rendering. */
143
248
  export interface GarminChartPoint {
144
249
  __typename?: 'GarminChartPoint';
@@ -150,10 +255,14 @@ export interface GarminChartPoint {
150
255
  distance_from_start_km?: Maybe<Scalars['Float']['output']>;
151
256
  /** Heart rate in beats per minute */
152
257
  heart_rate?: Maybe<Scalars['Int']['output']>;
258
+ /** Heart-rate zone index (1-5) */
259
+ hr_zone?: Maybe<Scalars['Int']['output']>;
153
260
  /** GPS latitude in decimal degrees (WGS 84) */
154
261
  latitude: Scalars['Float']['output'];
155
262
  /** GPS longitude in decimal degrees (WGS 84) */
156
263
  longitude: Scalars['Float']['output'];
264
+ /** Respiration rate in breaths per minute */
265
+ respiration_rate?: Maybe<Scalars['Int']['output']>;
157
266
  /** Instantaneous speed in km/h */
158
267
  speed_kmh?: Maybe<Scalars['Float']['output']>;
159
268
  /** Ambient temperature in degrees C */
@@ -162,6 +271,30 @@ export interface GarminChartPoint {
162
271
  timestamp: Scalars['DateTime']['output'];
163
272
  }
164
273
 
274
+ /** Earliest and latest timestamps in the Garmin activities table. */
275
+ export interface GarminDateRange {
276
+ __typename?: 'GarminDateRange';
277
+ /** Latest Garmin activity timestamp (ISO 8601) */
278
+ max_date: Scalars['DateTime']['output'];
279
+ /** Earliest Garmin activity timestamp (ISO 8601) */
280
+ min_date: Scalars['DateTime']['output'];
281
+ }
282
+
283
+ /** Recording device metadata captured from a Garmin activity's FIT file. */
284
+ export interface GarminDevice {
285
+ __typename?: 'GarminDevice';
286
+ /** Recording device serial number */
287
+ device_id?: Maybe<Scalars['Float']['output']>;
288
+ /** Raw Garmin product enum id from the FIT file (e.g. 4061) */
289
+ garmin_product?: Maybe<Scalars['Int']['output']>;
290
+ /** Device manufacturer (e.g. garmin) */
291
+ manufacturer?: Maybe<Scalars['String']['output']>;
292
+ /** Friendly device model name (e.g. Edge 540 Solar) */
293
+ model?: Maybe<Scalars['String']['output']>;
294
+ /** Device firmware/software version (e.g. 31.30) */
295
+ software_version?: Maybe<Scalars['String']['output']>;
296
+ }
297
+
165
298
  /** Result payload returned when triggering an on-demand Garmin sync. */
166
299
  export interface GarminSyncTriggerResult {
167
300
  __typename?: 'GarminSyncTriggerResult';
@@ -188,6 +321,8 @@ export interface GarminTrackPoint {
188
321
  __typename?: 'GarminTrackPoint';
189
322
  /** Parent Garmin activity identifier */
190
323
  activity_id: Scalars['String']['output'];
324
+ /** Compact reverse-geocoded address summary, when geocoded */
325
+ address?: Maybe<GeocodedAddressSummary>;
191
326
  /** Elevation above sea level in meters */
192
327
  altitude?: Maybe<Scalars['Float']['output']>;
193
328
  /** Pedal/step cadence in RPM */
@@ -196,16 +331,24 @@ export interface GarminTrackPoint {
196
331
  created_at?: Maybe<Scalars['String']['output']>;
197
332
  /** Cumulative distance from activity start in km */
198
333
  distance_from_start_km?: Maybe<Scalars['Float']['output']>;
334
+ /** Effort classification label */
335
+ effort_level?: Maybe<Scalars['String']['output']>;
199
336
  /** Heart rate in beats per minute */
200
337
  heart_rate?: Maybe<Scalars['Int']['output']>;
338
+ /** Heart-rate zone index (1-5) */
339
+ hr_zone?: Maybe<Scalars['Int']['output']>;
201
340
  /** Unique track point record identifier */
202
341
  id: Scalars['Int']['output'];
203
342
  /** GPS latitude in decimal degrees (WGS 84) */
204
343
  latitude: Scalars['Float']['output'];
205
344
  /** GPS longitude in decimal degrees (WGS 84) */
206
345
  longitude: Scalars['Float']['output'];
346
+ /** Respiration rate in breaths per minute */
347
+ respiration_rate?: Maybe<Scalars['Int']['output']>;
207
348
  /** Instantaneous speed in km/h */
208
349
  speed_kmh?: Maybe<Scalars['Float']['output']>;
350
+ /** Road or terrain type */
351
+ surface_type?: Maybe<Scalars['String']['output']>;
209
352
  /** Ambient temperature in degrees C */
210
353
  temperature_c?: Maybe<Scalars['Float']['output']>;
211
354
  /** UTC timestamp of the track point recording */
@@ -225,6 +368,124 @@ export interface GarminTrackPointConnection {
225
368
  total: Scalars['Int']['output'];
226
369
  }
227
370
 
371
+ /** Reverse-geocoded address components from Pelias. */
372
+ export interface GeocodedAddress {
373
+ __typename?: 'GeocodedAddress';
374
+ /** Pelias confidence score (0-1) */
375
+ confidence?: Maybe<Scalars['Float']['output']>;
376
+ /** Country name */
377
+ country?: Maybe<Scalars['String']['output']>;
378
+ /** Full formatted address label from Pelias */
379
+ display_address?: Maybe<Scalars['String']['output']>;
380
+ /** UTC timestamp when geocoding was performed */
381
+ geocoded_at?: Maybe<Scalars['String']['output']>;
382
+ /** House or building number */
383
+ housenumber?: Maybe<Scalars['String']['output']>;
384
+ /** City or town */
385
+ locality?: Maybe<Scalars['String']['output']>;
386
+ /** Neighbourhood name */
387
+ neighbourhood?: Maybe<Scalars['String']['output']>;
388
+ /** Postal or ZIP code */
389
+ postalcode?: Maybe<Scalars['String']['output']>;
390
+ /** State or province */
391
+ region?: Maybe<Scalars['String']['output']>;
392
+ /** Geocoding status: success, no_coverage, error, pending */
393
+ status: Scalars['String']['output'];
394
+ /** Street name */
395
+ street?: Maybe<Scalars['String']['output']>;
396
+ }
397
+
398
+ /** Compact reverse-geocoded address summary embedded in track-point payloads. */
399
+ export interface GeocodedAddressSummary {
400
+ __typename?: 'GeocodedAddressSummary';
401
+ /** Pelias confidence score (0-1) */
402
+ confidence?: Maybe<Scalars['Float']['output']>;
403
+ /** Country name */
404
+ country?: Maybe<Scalars['String']['output']>;
405
+ /** Full formatted address label from Pelias */
406
+ display_address?: Maybe<Scalars['String']['output']>;
407
+ /** UTC timestamp when geocoding was performed */
408
+ geocoded_at?: Maybe<Scalars['String']['output']>;
409
+ /** House or building number */
410
+ housenumber?: Maybe<Scalars['String']['output']>;
411
+ /** City or town */
412
+ locality?: Maybe<Scalars['String']['output']>;
413
+ /** Neighbourhood name */
414
+ neighbourhood?: Maybe<Scalars['String']['output']>;
415
+ /** Postal or ZIP code */
416
+ postalcode?: Maybe<Scalars['String']['output']>;
417
+ /** State or province */
418
+ region?: Maybe<Scalars['String']['output']>;
419
+ /** Geocoding status: success, no_coverage, error, pending */
420
+ status: Scalars['String']['output'];
421
+ /** Street name */
422
+ street?: Maybe<Scalars['String']['output']>;
423
+ /** Role of this waypoint within a Garmin activity (start, end, waypoint). Null for OwnTracks records. */
424
+ waypoint_kind?: Maybe<Scalars['String']['output']>;
425
+ }
426
+
427
+ /** Coverage statistics for a single geocoding source (owntracks or garmin). */
428
+ export interface GeocodingSourceStatus {
429
+ __typename?: 'GeocodingSourceStatus';
430
+ /** Number of records that failed geocoding */
431
+ errors: Scalars['Int']['output'];
432
+ /** Number of records outside Pelias coverage area */
433
+ no_coverage: Scalars['Int']['output'];
434
+ /** Number of records awaiting geocoding for this source */
435
+ pending: Scalars['Int']['output'];
436
+ /** Number of successfully geocoded records for this source */
437
+ success: Scalars['Int']['output'];
438
+ /** Total number of geocoded_addresses rows for this source */
439
+ total: Scalars['Int']['output'];
440
+ }
441
+
442
+ /** Coverage statistics for geocoded location records. */
443
+ export interface GeocodingStatus {
444
+ __typename?: 'GeocodingStatus';
445
+ /** Per-source breakdown of geocoding coverage (owntracks, garmin) */
446
+ by_source: GeocodingStatusBySource;
447
+ /** Percentage of locations with a geocoded address */
448
+ coverage_percent: Scalars['Float']['output'];
449
+ /** Number of locations that failed geocoding */
450
+ errors: Scalars['Int']['output'];
451
+ /** Number of locations with a geocoded address (any status) */
452
+ geocoded: Scalars['Int']['output'];
453
+ /** Number of locations outside Pelias coverage area */
454
+ no_coverage: Scalars['Int']['output'];
455
+ /** Number of locations awaiting geocoding */
456
+ pending: Scalars['Int']['output'];
457
+ /** Number of successfully geocoded locations */
458
+ success: Scalars['Int']['output'];
459
+ /** Total number of OwnTracks location records */
460
+ total_locations: Scalars['Int']['output'];
461
+ }
462
+
463
+ /** Per-source breakdown of geocoding coverage. */
464
+ export interface GeocodingStatusBySource {
465
+ __typename?: 'GeocodingStatusBySource';
466
+ /** Coverage stats for Garmin rows */
467
+ garmin: GeocodingSourceStatus;
468
+ /** Number of Garmin activities that have at least one address row */
469
+ garmin_activities_geocoded: Scalars['Int']['output'];
470
+ /** Total number of Garmin activities (denominator for activity-level coverage) */
471
+ garmin_activities_total: Scalars['Int']['output'];
472
+ /** Percentage of Garmin activities with at least one geocoded address */
473
+ garmin_coverage_percent: Scalars['Float']['output'];
474
+ /** Coverage stats for OwnTracks rows */
475
+ owntracks: GeocodingSourceStatus;
476
+ }
477
+
478
+ /** Result of triggering a batch geocoding operation. */
479
+ export interface GeocodingTriggerResult {
480
+ __typename?: 'GeocodingTriggerResult';
481
+ /** Number of records processed in this batch */
482
+ processed: Scalars['Int']['output'];
483
+ /** Number of records still awaiting geocoding */
484
+ remaining: Scalars['Int']['output'];
485
+ /** Number of records skipped via proximity deduplication */
486
+ skipped_dedup: Scalars['Int']['output'];
487
+ }
488
+
228
489
  /** Service health status. */
229
490
  export interface HealthStatus {
230
491
  __typename?: 'HealthStatus';
@@ -251,6 +512,8 @@ export interface Location {
251
512
  created_at?: Maybe<Scalars['String']['output']>;
252
513
  /** OwnTracks device identifier (e.g. iphone_stuart) */
253
514
  device_id: Scalars['String']['output'];
515
+ /** Short formatted address from reverse geocoding */
516
+ display_address?: Maybe<Scalars['String']['output']>;
254
517
  /** Unique location record identifier */
255
518
  id: Scalars['Int']['output'];
256
519
  /** GPS latitude in decimal degrees (WGS 84) */
@@ -291,11 +554,22 @@ export interface LocationCount {
291
554
  device_id?: Maybe<Scalars['String']['output']>;
292
555
  }
293
556
 
557
+ /** Earliest and latest timestamps in the locations table. */
558
+ export interface LocationDateRange {
559
+ __typename?: 'LocationDateRange';
560
+ /** Latest location timestamp (ISO 8601) */
561
+ max_date: Scalars['DateTime']['output'];
562
+ /** Earliest location timestamp (ISO 8601) */
563
+ min_date: Scalars['DateTime']['output'];
564
+ }
565
+
294
566
  /** Full location detail including the original OwnTracks JSON payload. */
295
567
  export interface LocationDetail {
296
568
  __typename?: 'LocationDetail';
297
569
  /** Horizontal accuracy of the GPS fix in meters */
298
570
  accuracy?: Maybe<Scalars['Float']['output']>;
571
+ /** Full reverse-geocoded address components from Pelias */
572
+ address?: Maybe<GeocodedAddress>;
299
573
  /** Altitude above sea level in meters */
300
574
  altitude?: Maybe<Scalars['Float']['output']>;
301
575
  /** Device battery level as a percentage (0-100) */
@@ -330,14 +604,20 @@ export interface Mutation {
330
604
  __typename?: 'Mutation';
331
605
  /** Trigger an on-demand Garmin sync in the upstream API. */
332
606
  triggerGarminSync: GarminSyncTriggerResult;
607
+ /** Trigger batch reverse-geocoding of un-geocoded location records. */
608
+ triggerGeocoding: GeocodingTriggerResult;
333
609
  }
334
610
 
335
-
336
611
  export interface MutationTriggerGarminSyncArgs {
337
612
  lookback?: InputMaybe<Scalars['Int']['input']>;
338
613
  window_hours?: InputMaybe<Scalars['Int']['input']>;
339
614
  }
340
615
 
616
+ export interface MutationTriggerGeocodingArgs {
617
+ batch_size?: InputMaybe<Scalars['Int']['input']>;
618
+ retry_failed?: InputMaybe<Scalars['Boolean']['input']>;
619
+ }
620
+
341
621
  /** GPS point found within a spatial proximity search. */
342
622
  export interface NearbyPoint {
343
623
  __typename?: 'NearbyPoint';
@@ -371,25 +651,37 @@ export interface Query {
371
651
  /** Calculate the geodesic distance between two geographic points. */
372
652
  calculateDistance: DistanceResult;
373
653
  /** Retrieve daily activity summaries combining OwnTracks and Garmin data. */
374
- dailySummary: Array<DailyActivitySummary>;
654
+ dailySummary: DailySummaryConnection;
655
+ /** Get the earliest and latest activity dates available in the daily activity summary view. */
656
+ dailySummaryDateRange: DailySummaryDateRange;
375
657
  /** List all distinct OwnTracks device identifiers. */
376
658
  devices: Array<DeviceInfo>;
377
659
  /** Retrieve a paginated list of Garmin activities. */
378
660
  garminActivities: GarminActivityConnection;
379
661
  /** Retrieve a single Garmin activity by its ID. */
380
662
  garminActivity?: Maybe<GarminActivity>;
663
+ /** Retrieve all reverse-geocoded addresses for a Garmin activity (start, mid-route waypoints, and end). */
664
+ garminActivityAddresses: Array<GarminActivityAddress>;
665
+ /** Aggregate Garmin activity totals grouped by week, month, or year. */
666
+ garminActivityTotals: Array<GarminActivityTotal>;
381
667
  /** Retrieve chart-optimised track points for a Garmin activity. */
382
668
  garminChartData: Array<GarminChartPoint>;
669
+ /** Get the earliest and latest Garmin activity timestamps. */
670
+ garminDateRange: GarminDateRange;
383
671
  /** List all distinct sport types with activity counts. */
384
672
  garminSports: Array<SportInfo>;
385
673
  /** Retrieve paginated GPS track points for a Garmin activity. */
386
674
  garminTrackPoints: GarminTrackPointConnection;
675
+ /** Get geocoding coverage statistics. */
676
+ geocodingStatus: GeocodingStatus;
387
677
  /** Get service health status. */
388
678
  health: HealthStatus;
389
679
  /** Retrieve a single location by its ID, including raw payload. */
390
680
  location?: Maybe<LocationDetail>;
391
681
  /** Get aggregate count of location records with optional filters. */
392
682
  locationCount: LocationCount;
683
+ /** Get the earliest and latest location timestamps. */
684
+ locationDateRange: LocationDateRange;
393
685
  /** Retrieve a paginated list of OwnTracks location records. */
394
686
  locations: LocationConnection;
395
687
  /** Find GPS points within a radius of a geographic coordinate. */
@@ -406,7 +698,6 @@ export interface Query {
406
698
  withinReference: WithinReferenceResult;
407
699
  }
408
700
 
409
-
410
701
  export interface QueryCalculateDistanceArgs {
411
702
  from_lat: Scalars['Float']['input'];
412
703
  from_lon: Scalars['Float']['input'];
@@ -414,14 +705,13 @@ export interface QueryCalculateDistanceArgs {
414
705
  to_lon: Scalars['Float']['input'];
415
706
  }
416
707
 
417
-
418
708
  export interface QueryDailySummaryArgs {
419
709
  date_from?: InputMaybe<Scalars['String']['input']>;
420
710
  date_to?: InputMaybe<Scalars['String']['input']>;
421
711
  limit?: InputMaybe<Scalars['Int']['input']>;
712
+ offset?: InputMaybe<Scalars['Int']['input']>;
422
713
  }
423
714
 
424
-
425
715
  export interface QueryGarminActivitiesArgs {
426
716
  date_from?: InputMaybe<Scalars['String']['input']>;
427
717
  date_to?: InputMaybe<Scalars['String']['input']>;
@@ -432,17 +722,25 @@ export interface QueryGarminActivitiesArgs {
432
722
  sport?: InputMaybe<Scalars['String']['input']>;
433
723
  }
434
724
 
435
-
436
725
  export interface QueryGarminActivityArgs {
437
726
  activity_id: Scalars['String']['input'];
438
727
  }
439
728
 
729
+ export interface QueryGarminActivityAddressesArgs {
730
+ activity_id: Scalars['String']['input'];
731
+ }
732
+
733
+ export interface QueryGarminActivityTotalsArgs {
734
+ date_from?: InputMaybe<Scalars['String']['input']>;
735
+ date_to?: InputMaybe<Scalars['String']['input']>;
736
+ period: Scalars['String']['input'];
737
+ sport?: InputMaybe<Scalars['String']['input']>;
738
+ }
440
739
 
441
740
  export interface QueryGarminChartDataArgs {
442
741
  activity_id: Scalars['String']['input'];
443
742
  }
444
743
 
445
-
446
744
  export interface QueryGarminTrackPointsArgs {
447
745
  activity_id: Scalars['String']['input'];
448
746
  limit?: InputMaybe<Scalars['Int']['input']>;
@@ -452,18 +750,15 @@ export interface QueryGarminTrackPointsArgs {
452
750
  sort?: InputMaybe<Scalars['String']['input']>;
453
751
  }
454
752
 
455
-
456
753
  export interface QueryLocationArgs {
457
754
  id: Scalars['Int']['input'];
458
755
  }
459
756
 
460
-
461
757
  export interface QueryLocationCountArgs {
462
758
  date?: InputMaybe<Scalars['String']['input']>;
463
759
  device_id?: InputMaybe<Scalars['String']['input']>;
464
760
  }
465
761
 
466
-
467
762
  export interface QueryLocationsArgs {
468
763
  date_from?: InputMaybe<Scalars['String']['input']>;
469
764
  date_to?: InputMaybe<Scalars['String']['input']>;
@@ -474,7 +769,6 @@ export interface QueryLocationsArgs {
474
769
  sort?: InputMaybe<Scalars['String']['input']>;
475
770
  }
476
771
 
477
-
478
772
  export interface QueryNearbyPointsArgs {
479
773
  lat: Scalars['Float']['input'];
480
774
  limit?: InputMaybe<Scalars['Int']['input']>;
@@ -483,22 +777,21 @@ export interface QueryNearbyPointsArgs {
483
777
  source?: InputMaybe<Scalars['String']['input']>;
484
778
  }
485
779
 
486
-
487
780
  export interface QueryReferenceLocationArgs {
488
781
  id: Scalars['Int']['input'];
489
782
  }
490
783
 
491
-
492
784
  export interface QueryUnifiedGpsArgs {
493
785
  date_from?: InputMaybe<Scalars['String']['input']>;
494
786
  date_to?: InputMaybe<Scalars['String']['input']>;
787
+ deduplicate?: InputMaybe<Scalars['Boolean']['input']>;
788
+ exclude_stationary?: InputMaybe<Scalars['Boolean']['input']>;
495
789
  limit?: InputMaybe<Scalars['Int']['input']>;
496
790
  offset?: InputMaybe<Scalars['Int']['input']>;
497
791
  order?: InputMaybe<SortOrder>;
498
792
  source?: InputMaybe<Scalars['String']['input']>;
499
793
  }
500
794
 
501
-
502
795
  export interface QueryWithinReferenceArgs {
503
796
  limit?: InputMaybe<Scalars['Int']['input']>;
504
797
  name: Scalars['String']['input'];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuartshay/otel-graphql-types",
3
- "version": "1.0.94",
3
+ "version": "1.0.95",
4
4
  "description": "TypeScript types for otel-data-gateway — Auto-generated from GraphQL schema",
5
5
  "types": "index.d.ts",
6
6
  "exports": {
package/schema.graphql CHANGED
@@ -122,6 +122,10 @@ type Location {
122
122
  UTC timestamp when the record was inserted into the database
123
123
  """
124
124
  created_at: String
125
+ """
126
+ Short formatted address from reverse geocoding
127
+ """
128
+ display_address: String
125
129
  }
126
130
 
127
131
  """
@@ -188,10 +192,175 @@ type LocationDetail {
188
192
  Original OwnTracks JSON payload as received from the MQTT broker
189
193
  """
190
194
  raw_payload: JSON
195
+ """
196
+ Full reverse-geocoded address components from Pelias
197
+ """
198
+ address: GeocodedAddress
191
199
  }
192
200
 
193
201
  scalar JSON
194
202
 
203
+ # -------------------------------------------------------
204
+ # Geocoding
205
+ # -------------------------------------------------------
206
+ """
207
+ Reverse-geocoded address components from Pelias.
208
+ """
209
+ type GeocodedAddress {
210
+ """
211
+ Full formatted address label from Pelias
212
+ """
213
+ display_address: String
214
+ """
215
+ Street name
216
+ """
217
+ street: String
218
+ """
219
+ House or building number
220
+ """
221
+ housenumber: String
222
+ """
223
+ Neighbourhood name
224
+ """
225
+ neighbourhood: String
226
+ """
227
+ City or town
228
+ """
229
+ locality: String
230
+ """
231
+ State or province
232
+ """
233
+ region: String
234
+ """
235
+ Country name
236
+ """
237
+ country: String
238
+ """
239
+ Postal or ZIP code
240
+ """
241
+ postalcode: String
242
+ """
243
+ Pelias confidence score (0-1)
244
+ """
245
+ confidence: Float
246
+ """
247
+ Geocoding status: success, no_coverage, error, pending
248
+ """
249
+ status: String!
250
+ """
251
+ UTC timestamp when geocoding was performed
252
+ """
253
+ geocoded_at: String
254
+ }
255
+
256
+ """
257
+ Coverage statistics for geocoded location records.
258
+ """
259
+ type GeocodingStatus {
260
+ """
261
+ Total number of OwnTracks location records
262
+ """
263
+ total_locations: Int!
264
+ """
265
+ Number of locations with a geocoded address (any status)
266
+ """
267
+ geocoded: Int!
268
+ """
269
+ Number of successfully geocoded locations
270
+ """
271
+ success: Int!
272
+ """
273
+ Number of locations awaiting geocoding
274
+ """
275
+ pending: Int!
276
+ """
277
+ Number of locations outside Pelias coverage area
278
+ """
279
+ no_coverage: Int!
280
+ """
281
+ Number of locations that failed geocoding
282
+ """
283
+ errors: Int!
284
+ """
285
+ Percentage of locations with a geocoded address
286
+ """
287
+ coverage_percent: Float!
288
+ """
289
+ Per-source breakdown of geocoding coverage (owntracks, garmin)
290
+ """
291
+ by_source: GeocodingStatusBySource!
292
+ }
293
+
294
+ """
295
+ Coverage statistics for a single geocoding source (owntracks or garmin).
296
+ """
297
+ type GeocodingSourceStatus {
298
+ """
299
+ Number of successfully geocoded records for this source
300
+ """
301
+ success: Int!
302
+ """
303
+ Number of records awaiting geocoding for this source
304
+ """
305
+ pending: Int!
306
+ """
307
+ Number of records outside Pelias coverage area
308
+ """
309
+ no_coverage: Int!
310
+ """
311
+ Number of records that failed geocoding
312
+ """
313
+ errors: Int!
314
+ """
315
+ Total number of geocoded_addresses rows for this source
316
+ """
317
+ total: Int!
318
+ }
319
+
320
+ """
321
+ Per-source breakdown of geocoding coverage.
322
+ """
323
+ type GeocodingStatusBySource {
324
+ """
325
+ Coverage stats for OwnTracks rows
326
+ """
327
+ owntracks: GeocodingSourceStatus!
328
+ """
329
+ Coverage stats for Garmin rows
330
+ """
331
+ garmin: GeocodingSourceStatus!
332
+ """
333
+ Total number of Garmin activities (denominator for activity-level coverage)
334
+ """
335
+ garmin_activities_total: Int!
336
+ """
337
+ Number of Garmin activities that have at least one address row
338
+ """
339
+ garmin_activities_geocoded: Int!
340
+ """
341
+ Percentage of Garmin activities with at least one geocoded address
342
+ """
343
+ garmin_coverage_percent: Float!
344
+ }
345
+
346
+ """
347
+ Result of triggering a batch geocoding operation.
348
+ """
349
+ type GeocodingTriggerResult {
350
+ """
351
+ Number of records processed in this batch
352
+ """
353
+ processed: Int!
354
+ """
355
+ Number of records still awaiting geocoding
356
+ """
357
+ remaining: Int!
358
+ """
359
+ Number of records skipped via proximity deduplication
360
+ """
361
+ skipped_dedup: Int!
362
+ }
363
+
195
364
  """
196
365
  Paginated list of OwnTracks location records.
197
366
  """
@@ -242,9 +411,49 @@ type LocationCount {
242
411
  device_id: String
243
412
  }
244
413
 
414
+ """
415
+ Earliest and latest timestamps in the locations table.
416
+ """
417
+ type LocationDateRange {
418
+ """
419
+ Earliest location timestamp (ISO 8601)
420
+ """
421
+ min_date: DateTime!
422
+ """
423
+ Latest location timestamp (ISO 8601)
424
+ """
425
+ max_date: DateTime!
426
+ }
427
+
245
428
  # -------------------------------------------------------
246
429
  # Garmin
247
430
  # -------------------------------------------------------
431
+ """
432
+ Recording device metadata captured from a Garmin activity's FIT file.
433
+ """
434
+ type GarminDevice {
435
+ """
436
+ Recording device serial number
437
+ """
438
+ device_id: Float
439
+ """
440
+ Device manufacturer (e.g. garmin)
441
+ """
442
+ manufacturer: String
443
+ """
444
+ Raw Garmin product enum id from the FIT file (e.g. 4061)
445
+ """
446
+ garmin_product: Int
447
+ """
448
+ Friendly device model name (e.g. Edge 540 Solar)
449
+ """
450
+ model: String
451
+ """
452
+ Device firmware/software version (e.g. 31.30)
453
+ """
454
+ software_version: String
455
+ }
456
+
248
457
  """
249
458
  Summary of a Garmin Connect activity parsed from a FIT file.
250
459
  """
@@ -286,6 +495,62 @@ type GarminActivity {
286
495
  """
287
496
  max_heart_rate: Int
288
497
  """
498
+ Whether this activity has usable heart-rate data in summary or track points
499
+ """
500
+ hr_available: Boolean!
501
+ """
502
+ Minimum heart rate in beats per minute
503
+ """
504
+ min_heart_rate: Int
505
+ """
506
+ Aerobic training effect score
507
+ """
508
+ aerobic_training_effect: Float
509
+ """
510
+ Anaerobic training effect score
511
+ """
512
+ anaerobic_training_effect: Float
513
+ """
514
+ Exercise load score
515
+ """
516
+ exercise_load: Int
517
+ """
518
+ Average respiration rate in breaths per minute
519
+ """
520
+ avg_respiration_rate: Int
521
+ """
522
+ Minimum respiration rate in breaths per minute
523
+ """
524
+ min_respiration_rate: Int
525
+ """
526
+ Maximum respiration rate in breaths per minute
527
+ """
528
+ max_respiration_rate: Int
529
+ """
530
+ Estimated sweat loss in millilitres
531
+ """
532
+ sweat_loss_ml: Int
533
+ """
534
+ Moderate intensity minutes
535
+ """
536
+ moderate_intensity_minutes: Int
537
+ """
538
+ Vigorous intensity minutes
539
+ """
540
+ vigorous_intensity_minutes: Int
541
+ """
542
+ Total intensity minutes
543
+ """
544
+ total_intensity_minutes: Int
545
+ """
546
+ Distance over paved surfaces in kilometres
547
+ """
548
+ paved_distance_km: Float
549
+ """
550
+ Distance over unpaved surfaces in kilometres
551
+ """
552
+ unpaved_distance_km: Float
553
+ """
289
554
  Average cadence in RPM
290
555
  """
291
556
  avg_cadence: Int
@@ -294,6 +559,10 @@ type GarminActivity {
294
559
  """
295
560
  max_cadence: Int
296
561
  """
562
+ Total activity strokes
563
+ """
564
+ total_strokes: Int
565
+ """
297
566
  Total calories burned
298
567
  """
299
568
  calories: Int
@@ -326,6 +595,10 @@ type GarminActivity {
326
595
  """
327
596
  device_manufacturer: String
328
597
  """
598
+ Recording device metadata (manufacturer, model, firmware)
599
+ """
600
+ device: GarminDevice
601
+ """
329
602
  Average ambient temperature in degrees C
330
603
  """
331
604
  avg_temperature_c: Int
@@ -381,6 +654,20 @@ type GarminActivityConnection {
381
654
  offset: Int!
382
655
  }
383
656
 
657
+ """
658
+ Earliest and latest timestamps in the Garmin activities table.
659
+ """
660
+ type GarminDateRange {
661
+ """
662
+ Earliest Garmin activity timestamp (ISO 8601)
663
+ """
664
+ min_date: DateTime!
665
+ """
666
+ Latest Garmin activity timestamp (ISO 8601)
667
+ """
668
+ max_date: DateTime!
669
+ }
670
+
384
671
  """
385
672
  Individual GPS track point within a Garmin activity.
386
673
  """
@@ -422,6 +709,14 @@ type GarminTrackPoint {
422
709
  """
423
710
  heart_rate: Int
424
711
  """
712
+ Heart-rate zone index (1-5)
713
+ """
714
+ hr_zone: Int
715
+ """
716
+ Respiration rate in breaths per minute
717
+ """
718
+ respiration_rate: Int
719
+ """
425
720
  Pedal/step cadence in RPM
426
721
  """
427
722
  cadence: Int
@@ -430,9 +725,149 @@ type GarminTrackPoint {
430
725
  """
431
726
  temperature_c: Float
432
727
  """
728
+ Road or terrain type
729
+ """
730
+ surface_type: String
731
+ """
732
+ Effort classification label
733
+ """
734
+ effort_level: String
735
+ """
433
736
  UTC timestamp when the record was inserted
434
737
  """
435
738
  created_at: String
739
+ """
740
+ Compact reverse-geocoded address summary, when geocoded
741
+ """
742
+ address: GeocodedAddressSummary
743
+ }
744
+
745
+ """
746
+ Compact reverse-geocoded address summary embedded in track-point payloads.
747
+ """
748
+ type GeocodedAddressSummary {
749
+ """
750
+ Full formatted address label from Pelias
751
+ """
752
+ display_address: String
753
+ """
754
+ Street name
755
+ """
756
+ street: String
757
+ """
758
+ House or building number
759
+ """
760
+ housenumber: String
761
+ """
762
+ Neighbourhood name
763
+ """
764
+ neighbourhood: String
765
+ """
766
+ City or town
767
+ """
768
+ locality: String
769
+ """
770
+ State or province
771
+ """
772
+ region: String
773
+ """
774
+ Country name
775
+ """
776
+ country: String
777
+ """
778
+ Postal or ZIP code
779
+ """
780
+ postalcode: String
781
+ """
782
+ Pelias confidence score (0-1)
783
+ """
784
+ confidence: Float
785
+ """
786
+ Role of this waypoint within a Garmin activity (start, end, waypoint). Null for OwnTracks records.
787
+ """
788
+ waypoint_kind: String
789
+ """
790
+ Geocoding status: success, no_coverage, error, pending
791
+ """
792
+ status: String!
793
+ """
794
+ UTC timestamp when geocoding was performed
795
+ """
796
+ geocoded_at: String
797
+ }
798
+
799
+ """
800
+ Full reverse-geocoded address attached to a Garmin activity waypoint.
801
+ """
802
+ type GarminActivityAddress {
803
+ """
804
+ garmin_track_points.id this address was geocoded from
805
+ """
806
+ track_point_id: Int!
807
+ """
808
+ Parent Garmin activity identifier
809
+ """
810
+ activity_id: String!
811
+ """
812
+ Role of this waypoint within the activity: start, end, or waypoint
813
+ """
814
+ waypoint_kind: String!
815
+ """
816
+ UTC timestamp of the track point this address was derived from
817
+ """
818
+ timestamp: DateTime!
819
+ """
820
+ GPS latitude in decimal degrees (WGS 84)
821
+ """
822
+ latitude: Float!
823
+ """
824
+ GPS longitude in decimal degrees (WGS 84)
825
+ """
826
+ longitude: Float!
827
+ """
828
+ Full formatted address label from Pelias
829
+ """
830
+ display_address: String
831
+ """
832
+ Street name
833
+ """
834
+ street: String
835
+ """
836
+ House or building number
837
+ """
838
+ housenumber: String
839
+ """
840
+ Neighbourhood name
841
+ """
842
+ neighbourhood: String
843
+ """
844
+ City or town
845
+ """
846
+ locality: String
847
+ """
848
+ State or province
849
+ """
850
+ region: String
851
+ """
852
+ Country name
853
+ """
854
+ country: String
855
+ """
856
+ Postal or ZIP code
857
+ """
858
+ postalcode: String
859
+ """
860
+ Pelias confidence score (0-1)
861
+ """
862
+ confidence: Float
863
+ """
864
+ Geocoding status: success, no_coverage, error, pending
865
+ """
866
+ status: String!
867
+ """
868
+ UTC timestamp when geocoding was performed
869
+ """
870
+ geocoded_at: String
436
871
  }
437
872
 
438
873
  """
@@ -496,6 +931,14 @@ type GarminChartPoint {
496
931
  """
497
932
  heart_rate: Int
498
933
  """
934
+ Heart-rate zone index (1-5)
935
+ """
936
+ hr_zone: Int
937
+ """
938
+ Respiration rate in breaths per minute
939
+ """
940
+ respiration_rate: Int
941
+ """
499
942
  Pedal/step cadence in RPM
500
943
  """
501
944
  cadence: Int
@@ -513,6 +956,36 @@ type GarminChartPoint {
513
956
  longitude: Float!
514
957
  }
515
958
 
959
+ """
960
+ Aggregated Garmin activity totals for a single time bucket (week, month, or year).
961
+ """
962
+ type GarminActivityTotal {
963
+ """
964
+ Start date of the period bucket (DATE_TRUNC of week/month/year)
965
+ """
966
+ period_start: String!
967
+ """
968
+ Number of activities in the period
969
+ """
970
+ activity_count: Int!
971
+ """
972
+ Sum of distance in kilometres
973
+ """
974
+ total_distance_km: Float
975
+ """
976
+ Sum of active duration in seconds (excludes pauses)
977
+ """
978
+ total_duration_seconds: Int
979
+ """
980
+ Sum of elevation gain in meters
981
+ """
982
+ total_ascent_m: Int
983
+ """
984
+ Sum of calories burned
985
+ """
986
+ total_calories: Int
987
+ }
988
+
516
989
  # -------------------------------------------------------
517
990
  # Unified GPS
518
991
  # -------------------------------------------------------
@@ -638,6 +1111,42 @@ type DailyActivitySummary {
638
1111
  total_calories: Int
639
1112
  }
640
1113
 
1114
+ """
1115
+ Paginated list of daily activity summaries.
1116
+ """
1117
+ type DailySummaryConnection {
1118
+ """
1119
+ List of daily activity summary items in the current page
1120
+ """
1121
+ items: [DailyActivitySummary!]!
1122
+ """
1123
+ Total number of items matching the query
1124
+ """
1125
+ total: Int!
1126
+ """
1127
+ Maximum number of items per page
1128
+ """
1129
+ limit: Int!
1130
+ """
1131
+ Number of items skipped from the start
1132
+ """
1133
+ offset: Int!
1134
+ }
1135
+
1136
+ """
1137
+ Earliest and latest activity dates available in the daily activity summary view.
1138
+ """
1139
+ type DailySummaryDateRange {
1140
+ """
1141
+ Earliest activity date with daily summary data (YYYY-MM-DD)
1142
+ """
1143
+ min_date: String!
1144
+ """
1145
+ Latest activity date with daily summary data (YYYY-MM-DD)
1146
+ """
1147
+ max_date: String!
1148
+ }
1149
+
641
1150
  # -------------------------------------------------------
642
1151
  # Reference Locations
643
1152
  # -------------------------------------------------------
@@ -893,7 +1402,17 @@ type Query {
893
1402
  device_id: String
894
1403
  ): LocationCount!
895
1404
 
1405
+ """
1406
+ Get the earliest and latest location timestamps.
1407
+ """
1408
+ locationDateRange: LocationDateRange!
1409
+
896
1410
  # Garmin
1411
+ """
1412
+ Get the earliest and latest Garmin activity timestamps.
1413
+ """
1414
+ garminDateRange: GarminDateRange!
1415
+
897
1416
  """
898
1417
  Retrieve a paginated list of Garmin activities.
899
1418
  """
@@ -983,6 +1502,38 @@ type Query {
983
1502
  activity_id: String!
984
1503
  ): [GarminChartPoint!]!
985
1504
 
1505
+ """
1506
+ Retrieve all reverse-geocoded addresses for a Garmin activity (start, mid-route waypoints, and end).
1507
+ """
1508
+ garminActivityAddresses(
1509
+ """
1510
+ Garmin Connect activity identifier
1511
+ """
1512
+ activity_id: String!
1513
+ ): [GarminActivityAddress!]!
1514
+
1515
+ """
1516
+ Aggregate Garmin activity totals grouped by week, month, or year.
1517
+ """
1518
+ garminActivityTotals(
1519
+ """
1520
+ Aggregation period: 'week', 'month', or 'year'
1521
+ """
1522
+ period: String!
1523
+ """
1524
+ Filter by sport (e.g. cycling, running)
1525
+ """
1526
+ sport: String
1527
+ """
1528
+ Inclusive lower bound on activity start time (YYYY-MM-DD)
1529
+ """
1530
+ date_from: String
1531
+ """
1532
+ Inclusive upper bound on activity start time (YYYY-MM-DD)
1533
+ """
1534
+ date_to: String
1535
+ ): [GarminActivityTotal!]!
1536
+
986
1537
  # Unified GPS
987
1538
  """
988
1539
  Retrieve a paginated list of unified GPS points from all sources.
@@ -1012,6 +1563,14 @@ type Query {
1012
1563
  Sort direction
1013
1564
  """
1014
1565
  order: SortOrder
1566
+ """
1567
+ Exclude stationary points where speed is zero
1568
+ """
1569
+ exclude_stationary: Boolean
1570
+ """
1571
+ Remove points with duplicate coordinates (rounded to ~11m precision)
1572
+ """
1573
+ deduplicate: Boolean
1015
1574
  ): UnifiedGpsConnection!
1016
1575
 
1017
1576
  """
@@ -1027,10 +1586,19 @@ type Query {
1027
1586
  """
1028
1587
  date_to: String
1029
1588
  """
1030
- Maximum number of days to return
1589
+ Maximum number of days to return per page
1031
1590
  """
1032
1591
  limit: Int
1033
- ): [DailyActivitySummary!]!
1592
+ """
1593
+ Number of items to skip for pagination
1594
+ """
1595
+ offset: Int
1596
+ ): DailySummaryConnection!
1597
+
1598
+ """
1599
+ Get the earliest and latest activity dates available in the daily activity summary view.
1600
+ """
1601
+ dailySummaryDateRange: DailySummaryDateRange!
1034
1602
 
1035
1603
  # Reference Locations
1036
1604
  """
@@ -1113,6 +1681,12 @@ type Query {
1113
1681
  """
1114
1682
  limit: Int
1115
1683
  ): WithinReferenceResult!
1684
+
1685
+ # Geocoding
1686
+ """
1687
+ Get geocoding coverage statistics.
1688
+ """
1689
+ geocodingStatus: GeocodingStatus!
1116
1690
  }
1117
1691
 
1118
1692
  # -------------------------------------------------------
@@ -1132,4 +1706,18 @@ type Mutation {
1132
1706
  """
1133
1707
  lookback: Int
1134
1708
  ): GarminSyncTriggerResult!
1709
+
1710
+ """
1711
+ Trigger batch reverse-geocoding of un-geocoded location records.
1712
+ """
1713
+ triggerGeocoding(
1714
+ """
1715
+ Number of locations to geocode in this batch (default 100)
1716
+ """
1717
+ batch_size: Int
1718
+ """
1719
+ Re-process previously failed location records (for example, those with status `no_coverage`)
1720
+ """
1721
+ retry_failed: Boolean
1722
+ ): GeocodingTriggerResult!
1135
1723
  }