@stuartshay/otel-graphql-types 1.0.445 → 1.0.468

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 +212 -2
  2. package/package.json +1 -1
  3. package/schema.graphql +385 -2
package/index.d.ts CHANGED
@@ -11,6 +11,32 @@ export interface Scalars {
11
11
  JSON: { input: Record<string, unknown>; output: Record<string, unknown> };
12
12
  }
13
13
 
14
+ /** Input for creating a saved Garmin segment (e.g. from an activity lap or climb). */
15
+ export interface CreateGarminSegmentInput {
16
+ /** Segment length in meters (optional metadata) */
17
+ distance_meters?: InputMaybe<Scalars['Float']['input']>;
18
+ /** Segment end latitude */
19
+ end_latitude: Scalars['Float']['input'];
20
+ /** Segment end longitude */
21
+ end_longitude: Scalars['Float']['input'];
22
+ /** Corridor radius (m) used to match traversing activities (default 35) */
23
+ match_tolerance_meters?: InputMaybe<Scalars['Float']['input']>;
24
+ /** Human-readable segment name */
25
+ name: Scalars['String']['input'];
26
+ /** Garmin activity this segment is created from, if any */
27
+ source_activity_id?: InputMaybe<Scalars['String']['input']>;
28
+ /** Zero-based ClimbPro split index the segment is created from, if any */
29
+ source_climb_index?: InputMaybe<Scalars['Int']['input']>;
30
+ /** Zero-based lap index the segment is created from, if any */
31
+ source_lap_index?: InputMaybe<Scalars['Int']['input']>;
32
+ /** Sport this segment applies to (e.g. cycling); null matches all sports */
33
+ sport?: InputMaybe<Scalars['String']['input']>;
34
+ /** Segment start latitude */
35
+ start_latitude: Scalars['Float']['input'];
36
+ /** Segment start longitude */
37
+ start_longitude: Scalars['Float']['input'];
38
+ }
39
+
14
40
  /** Per-day aggregate combining OwnTracks location stats and Garmin activity metrics. */
15
41
  export interface DailyActivitySummary {
16
42
  __typename?: 'DailyActivitySummary';
@@ -345,6 +371,15 @@ export interface GarminActivityLap {
345
371
  updated_at?: Maybe<Scalars['String']['output']>;
346
372
  }
347
373
 
374
+ /** Laps for a single activity within the batch laps comparison response. */
375
+ export interface GarminActivityLapsGroup {
376
+ __typename?: 'GarminActivityLapsGroup';
377
+ /** Parent activity summary */
378
+ activity: GarminLapsActivity;
379
+ /** Laps ordered by lap_index ascending */
380
+ laps: Array<GarminActivityLap>;
381
+ }
382
+
348
383
  /** Aggregated Garmin activity totals for a single time bucket (week, month, or year). */
349
384
  export interface GarminActivityTotal {
350
385
  __typename?: 'GarminActivityTotal';
@@ -422,6 +457,133 @@ export interface GarminDeviceCount {
422
457
  label: Scalars['String']['output'];
423
458
  }
424
459
 
460
+ /** Activity summary metadata for a batch laps comparison item. */
461
+ export interface GarminLapsActivity {
462
+ __typename?: 'GarminLapsActivity';
463
+ /** Garmin Connect activity identifier */
464
+ activity_id: Scalars['String']['output'];
465
+ /** Average activity heart rate in bpm */
466
+ avg_heart_rate?: Maybe<Scalars['Int']['output']>;
467
+ /** Average activity speed in km/h */
468
+ avg_speed_kmh?: Maybe<Scalars['Float']['output']>;
469
+ /** Total activity distance in kilometers */
470
+ distance_km?: Maybe<Scalars['Float']['output']>;
471
+ /** Total activity duration in seconds */
472
+ duration_seconds?: Maybe<Scalars['Float']['output']>;
473
+ /** Maximum activity heart rate in bpm */
474
+ max_heart_rate?: Maybe<Scalars['Int']['output']>;
475
+ /** Sport type (e.g. cycling) */
476
+ sport?: Maybe<Scalars['String']['output']>;
477
+ /** UTC activity start time */
478
+ start_time?: Maybe<Scalars['String']['output']>;
479
+ /** Sub-sport type (e.g. road) */
480
+ sub_sport?: Maybe<Scalars['String']['output']>;
481
+ /** Total activity elevation gain in meters */
482
+ total_ascent_m?: Maybe<Scalars['Float']['output']>;
483
+ }
484
+
485
+ /** Paginated batch of activities (each with their laps) for cross-activity lap comparison. */
486
+ export interface GarminLapsComparisonConnection {
487
+ __typename?: 'GarminLapsComparisonConnection';
488
+ /** Activities (newest first), each with their laps ordered by lap_index */
489
+ items: Array<GarminActivityLapsGroup>;
490
+ /** Maximum number of activities per page */
491
+ limit: Scalars['Int']['output'];
492
+ /** Number of activities skipped from the start */
493
+ offset: Scalars['Int']['output'];
494
+ /** Total number of activities matching the query */
495
+ total: Scalars['Int']['output'];
496
+ }
497
+
498
+ /**
499
+ * A saved (named) Garmin segment: a start→end corridor used to compare efforts
500
+ * across all activities that traverse the same route.
501
+ */
502
+ export interface GarminSegment {
503
+ __typename?: 'GarminSegment';
504
+ /** UTC timestamp when the segment was created */
505
+ created_at?: Maybe<Scalars['String']['output']>;
506
+ /** Segment length in meters (optional metadata) */
507
+ distance_meters?: Maybe<Scalars['Float']['output']>;
508
+ /** Segment end latitude */
509
+ end_latitude: Scalars['Float']['output'];
510
+ /** Segment end longitude */
511
+ end_longitude: Scalars['Float']['output'];
512
+ /** Unique segment identifier */
513
+ id: Scalars['Int']['output'];
514
+ /** Corridor radius (m) used to match traversing activities */
515
+ match_tolerance_meters: Scalars['Float']['output'];
516
+ /** Human-readable segment name (e.g. "Harlem Hill") */
517
+ name: Scalars['String']['output'];
518
+ /** Garmin activity this segment was created from, if any */
519
+ source_activity_id?: Maybe<Scalars['String']['output']>;
520
+ /** Zero-based ClimbPro split index the segment was created from, if any */
521
+ source_climb_index?: Maybe<Scalars['Int']['output']>;
522
+ /** Zero-based lap index the segment was created from, if any */
523
+ source_lap_index?: Maybe<Scalars['Int']['output']>;
524
+ /** Sport this segment applies to (e.g. cycling); null matches all sports */
525
+ sport?: Maybe<Scalars['String']['output']>;
526
+ /** Segment start latitude */
527
+ start_latitude: Scalars['Float']['output'];
528
+ /** Segment start longitude */
529
+ start_longitude: Scalars['Float']['output'];
530
+ /** UTC timestamp when the segment was last updated */
531
+ updated_at?: Maybe<Scalars['String']['output']>;
532
+ }
533
+
534
+ /** The start→end corridor a segment-efforts query was matched against. */
535
+ export interface GarminSegmentDefinition {
536
+ __typename?: 'GarminSegmentDefinition';
537
+ /** Corridor end latitude */
538
+ end_lat: Scalars['Float']['output'];
539
+ /** Corridor end longitude */
540
+ end_lon: Scalars['Float']['output'];
541
+ /** Corridor start latitude */
542
+ start_lat: Scalars['Float']['output'];
543
+ /** Corridor start longitude */
544
+ start_lon: Scalars['Float']['output'];
545
+ /** Corridor radius in meters used for matching */
546
+ tolerance_meters: Scalars['Float']['output'];
547
+ }
548
+
549
+ /** A single activity's best traversal of a segment, ranked against all others. */
550
+ export interface GarminSegmentEffort {
551
+ __typename?: 'GarminSegmentEffort';
552
+ /** Garmin activity identifier for this effort */
553
+ activity_id: Scalars['String']['output'];
554
+ /** UTC start time of the parent activity */
555
+ activity_start_time?: Maybe<Scalars['String']['output']>;
556
+ /** Average heart rate across the segment in bpm */
557
+ avg_heart_rate?: Maybe<Scalars['Int']['output']>;
558
+ /** Average speed across the segment in km/h */
559
+ avg_speed_kmh?: Maybe<Scalars['Float']['output']>;
560
+ /** Distance covered across the segment in km */
561
+ distance_km?: Maybe<Scalars['Float']['output']>;
562
+ /** UTC timestamp reaching the segment end corridor */
563
+ effort_end: Scalars['String']['output'];
564
+ /** UTC timestamp entering the segment start corridor */
565
+ effort_start: Scalars['String']['output'];
566
+ /** Segment elapsed time in seconds */
567
+ elapsed_seconds: Scalars['Float']['output'];
568
+ /** Maximum heart rate across the segment in bpm */
569
+ max_heart_rate?: Maybe<Scalars['Int']['output']>;
570
+ /** 1-based rank by elapsed time (1 = fastest) */
571
+ rank: Scalars['Int']['output'];
572
+ /** Sport type (e.g. cycling) */
573
+ sport?: Maybe<Scalars['String']['output']>;
574
+ }
575
+
576
+ /** Ranked efforts for a segment across all matching activities (fastest first). */
577
+ export interface GarminSegmentEffortsConnection {
578
+ __typename?: 'GarminSegmentEffortsConnection';
579
+ /** Efforts ordered fastest-first */
580
+ items: Array<GarminSegmentEffort>;
581
+ /** The corridor the efforts were matched against */
582
+ segment: GarminSegmentDefinition;
583
+ /** Total number of matching efforts */
584
+ total: Scalars['Int']['output'];
585
+ }
586
+
425
587
  /** Result payload returned when triggering an on-demand Garmin sync. */
426
588
  export interface GarminSyncTriggerResult {
427
589
  __typename?: 'GarminSyncTriggerResult';
@@ -729,12 +891,28 @@ export interface LocationDetail {
729
891
 
730
892
  export interface Mutation {
731
893
  __typename?: 'Mutation';
894
+ /**
895
+ * Create a saved Garmin segment (requires authentication). Typically called with
896
+ * the start/end coordinates of an activity lap or ClimbPro split to "save this
897
+ * lap as a segment".
898
+ */
899
+ createGarminSegment: GarminSegment;
900
+ /** Delete a saved Garmin segment by id (requires authentication). Returns true on success. */
901
+ deleteGarminSegment: Scalars['Boolean']['output'];
732
902
  /** Trigger an on-demand Garmin sync in the upstream API. */
733
903
  triggerGarminSync: GarminSyncTriggerResult;
734
904
  /** Trigger batch reverse-geocoding of un-geocoded location records. */
735
905
  triggerGeocoding: GeocodingTriggerResult;
736
906
  }
737
907
 
908
+ export interface MutationCreateGarminSegmentArgs {
909
+ input: CreateGarminSegmentInput;
910
+ }
911
+
912
+ export interface MutationDeleteGarminSegmentArgs {
913
+ id: Scalars['Int']['input'];
914
+ }
915
+
738
916
  export interface MutationTriggerGarminSyncArgs {
739
917
  lookback?: InputMaybe<Scalars['Int']['input']>;
740
918
  window_hours?: InputMaybe<Scalars['Int']['input']>;
@@ -801,6 +979,14 @@ export interface Query {
801
979
  garminDateRange: GarminDateRange;
802
980
  /** List Garmin recording device labels with activity counts. */
803
981
  garminDeviceCounts: Array<GarminDeviceCount>;
982
+ /** Batch laps across activities for cross-activity comparison (matrix of activities x lap_index). */
983
+ garminLapsComparison: GarminLapsComparisonConnection;
984
+ /** Fetch a single saved Garmin segment by id. Returns null if it does not exist. */
985
+ garminSegment?: Maybe<GarminSegment>;
986
+ /** Rank all historical activity efforts over a saved segment (fastest first). */
987
+ garminSegmentEfforts: GarminSegmentEffortsConnection;
988
+ /** List saved Garmin segments, optionally filtered by sport. */
989
+ garminSegments: Array<GarminSegment>;
804
990
  /** List all distinct sport types with activity counts. */
805
991
  garminSports: Array<SportInfo>;
806
992
  /** Retrieve paginated GPS track points for a Garmin activity. */
@@ -882,6 +1068,30 @@ export interface QueryGarminChartDataArgs {
882
1068
  activity_id: Scalars['String']['input'];
883
1069
  }
884
1070
 
1071
+ export interface QueryGarminLapsComparisonArgs {
1072
+ date_from?: InputMaybe<Scalars['String']['input']>;
1073
+ date_to?: InputMaybe<Scalars['String']['input']>;
1074
+ limit?: InputMaybe<Scalars['Int']['input']>;
1075
+ offset?: InputMaybe<Scalars['Int']['input']>;
1076
+ sport?: InputMaybe<Scalars['String']['input']>;
1077
+ }
1078
+
1079
+ export interface QueryGarminSegmentArgs {
1080
+ id: Scalars['Int']['input'];
1081
+ }
1082
+
1083
+ export interface QueryGarminSegmentEffortsArgs {
1084
+ date_from?: InputMaybe<Scalars['String']['input']>;
1085
+ date_to?: InputMaybe<Scalars['String']['input']>;
1086
+ id: Scalars['Int']['input'];
1087
+ limit?: InputMaybe<Scalars['Int']['input']>;
1088
+ max_effort_seconds?: InputMaybe<Scalars['Int']['input']>;
1089
+ }
1090
+
1091
+ export interface QueryGarminSegmentsArgs {
1092
+ sport?: InputMaybe<Scalars['String']['input']>;
1093
+ }
1094
+
885
1095
  export interface QueryGarminTrackPointsArgs {
886
1096
  activity_id: Scalars['String']['input'];
887
1097
  limit?: InputMaybe<Scalars['Int']['input']>;
@@ -942,8 +1152,8 @@ export interface QueryWithinReferenceArgs {
942
1152
  /** Service readiness status including database connectivity. */
943
1153
  export interface ReadyStatus {
944
1154
  __typename?: 'ReadyStatus';
945
- /** Database connection status */
946
- database?: Maybe<Scalars['String']['output']>;
1155
+ /** Database readiness payload returned by otel-data-api */
1156
+ database?: Maybe<Scalars['JSON']['output']>;
947
1157
  /** Service readiness status */
948
1158
  status: Scalars['String']['output'];
949
1159
  /** Application version from VERSION file */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuartshay/otel-graphql-types",
3
- "version": "1.0.445",
3
+ "version": "1.0.468",
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
@@ -50,9 +50,9 @@ type ReadyStatus {
50
50
  """
51
51
  status: String!
52
52
  """
53
- Database connection status
53
+ Database readiness payload returned by otel-data-api
54
54
  """
55
- database: String
55
+ database: JSON
56
56
  """
57
57
  Application version from VERSION file
58
58
  """
@@ -896,6 +896,295 @@ type GarminActivityLap {
896
896
  updated_at: String
897
897
  }
898
898
 
899
+ """
900
+ Activity summary metadata for a batch laps comparison item.
901
+ """
902
+ type GarminLapsActivity {
903
+ """
904
+ Garmin Connect activity identifier
905
+ """
906
+ activity_id: String!
907
+ """
908
+ Sport type (e.g. cycling)
909
+ """
910
+ sport: String
911
+ """
912
+ Sub-sport type (e.g. road)
913
+ """
914
+ sub_sport: String
915
+ """
916
+ UTC activity start time
917
+ """
918
+ start_time: String
919
+ """
920
+ Total activity distance in kilometers
921
+ """
922
+ distance_km: Float
923
+ """
924
+ Total activity duration in seconds
925
+ """
926
+ duration_seconds: Float
927
+ """
928
+ Average activity speed in km/h
929
+ """
930
+ avg_speed_kmh: Float
931
+ """
932
+ Average activity heart rate in bpm
933
+ """
934
+ avg_heart_rate: Int
935
+ """
936
+ Maximum activity heart rate in bpm
937
+ """
938
+ max_heart_rate: Int
939
+ """
940
+ Total activity elevation gain in meters
941
+ """
942
+ total_ascent_m: Float
943
+ }
944
+
945
+ """
946
+ Laps for a single activity within the batch laps comparison response.
947
+ """
948
+ type GarminActivityLapsGroup {
949
+ """
950
+ Parent activity summary
951
+ """
952
+ activity: GarminLapsActivity!
953
+ """
954
+ Laps ordered by lap_index ascending
955
+ """
956
+ laps: [GarminActivityLap!]!
957
+ }
958
+
959
+ """
960
+ Paginated batch of activities (each with their laps) for cross-activity lap comparison.
961
+ """
962
+ type GarminLapsComparisonConnection {
963
+ """
964
+ Activities (newest first), each with their laps ordered by lap_index
965
+ """
966
+ items: [GarminActivityLapsGroup!]!
967
+ """
968
+ Total number of activities matching the query
969
+ """
970
+ total: Int!
971
+ """
972
+ Maximum number of activities per page
973
+ """
974
+ limit: Int!
975
+ """
976
+ Number of activities skipped from the start
977
+ """
978
+ offset: Int!
979
+ }
980
+
981
+ """
982
+ A saved (named) Garmin segment: a start→end corridor used to compare efforts
983
+ across all activities that traverse the same route.
984
+ """
985
+ type GarminSegment {
986
+ """
987
+ Unique segment identifier
988
+ """
989
+ id: Int!
990
+ """
991
+ Human-readable segment name (e.g. "Harlem Hill")
992
+ """
993
+ name: String!
994
+ """
995
+ Sport this segment applies to (e.g. cycling); null matches all sports
996
+ """
997
+ sport: String
998
+ """
999
+ Segment start latitude
1000
+ """
1001
+ start_latitude: Float!
1002
+ """
1003
+ Segment start longitude
1004
+ """
1005
+ start_longitude: Float!
1006
+ """
1007
+ Segment end latitude
1008
+ """
1009
+ end_latitude: Float!
1010
+ """
1011
+ Segment end longitude
1012
+ """
1013
+ end_longitude: Float!
1014
+ """
1015
+ Segment length in meters (optional metadata)
1016
+ """
1017
+ distance_meters: Float
1018
+ """
1019
+ Corridor radius (m) used to match traversing activities
1020
+ """
1021
+ match_tolerance_meters: Float!
1022
+ """
1023
+ Garmin activity this segment was created from, if any
1024
+ """
1025
+ source_activity_id: String
1026
+ """
1027
+ Zero-based lap index the segment was created from, if any
1028
+ """
1029
+ source_lap_index: Int
1030
+ """
1031
+ Zero-based ClimbPro split index the segment was created from, if any
1032
+ """
1033
+ source_climb_index: Int
1034
+ """
1035
+ UTC timestamp when the segment was created
1036
+ """
1037
+ created_at: String
1038
+ """
1039
+ UTC timestamp when the segment was last updated
1040
+ """
1041
+ updated_at: String
1042
+ }
1043
+
1044
+ """
1045
+ The start→end corridor a segment-efforts query was matched against.
1046
+ """
1047
+ type GarminSegmentDefinition {
1048
+ """
1049
+ Corridor start latitude
1050
+ """
1051
+ start_lat: Float!
1052
+ """
1053
+ Corridor start longitude
1054
+ """
1055
+ start_lon: Float!
1056
+ """
1057
+ Corridor end latitude
1058
+ """
1059
+ end_lat: Float!
1060
+ """
1061
+ Corridor end longitude
1062
+ """
1063
+ end_lon: Float!
1064
+ """
1065
+ Corridor radius in meters used for matching
1066
+ """
1067
+ tolerance_meters: Float!
1068
+ }
1069
+
1070
+ """
1071
+ A single activity's best traversal of a segment, ranked against all others.
1072
+ """
1073
+ type GarminSegmentEffort {
1074
+ """
1075
+ 1-based rank by elapsed time (1 = fastest)
1076
+ """
1077
+ rank: Int!
1078
+ """
1079
+ Garmin activity identifier for this effort
1080
+ """
1081
+ activity_id: String!
1082
+ """
1083
+ Sport type (e.g. cycling)
1084
+ """
1085
+ sport: String
1086
+ """
1087
+ UTC start time of the parent activity
1088
+ """
1089
+ activity_start_time: String
1090
+ """
1091
+ UTC timestamp entering the segment start corridor
1092
+ """
1093
+ effort_start: String!
1094
+ """
1095
+ UTC timestamp reaching the segment end corridor
1096
+ """
1097
+ effort_end: String!
1098
+ """
1099
+ Segment elapsed time in seconds
1100
+ """
1101
+ elapsed_seconds: Float!
1102
+ """
1103
+ Distance covered across the segment in km
1104
+ """
1105
+ distance_km: Float
1106
+ """
1107
+ Average speed across the segment in km/h
1108
+ """
1109
+ avg_speed_kmh: Float
1110
+ """
1111
+ Average heart rate across the segment in bpm
1112
+ """
1113
+ avg_heart_rate: Int
1114
+ """
1115
+ Maximum heart rate across the segment in bpm
1116
+ """
1117
+ max_heart_rate: Int
1118
+ }
1119
+
1120
+ """
1121
+ Ranked efforts for a segment across all matching activities (fastest first).
1122
+ """
1123
+ type GarminSegmentEffortsConnection {
1124
+ """
1125
+ The corridor the efforts were matched against
1126
+ """
1127
+ segment: GarminSegmentDefinition!
1128
+ """
1129
+ Efforts ordered fastest-first
1130
+ """
1131
+ items: [GarminSegmentEffort!]!
1132
+ """
1133
+ Total number of matching efforts
1134
+ """
1135
+ total: Int!
1136
+ }
1137
+
1138
+ """
1139
+ Input for creating a saved Garmin segment (e.g. from an activity lap or climb).
1140
+ """
1141
+ input CreateGarminSegmentInput {
1142
+ """
1143
+ Human-readable segment name
1144
+ """
1145
+ name: String!
1146
+ """
1147
+ Sport this segment applies to (e.g. cycling); null matches all sports
1148
+ """
1149
+ sport: String
1150
+ """
1151
+ Segment start latitude
1152
+ """
1153
+ start_latitude: Float!
1154
+ """
1155
+ Segment start longitude
1156
+ """
1157
+ start_longitude: Float!
1158
+ """
1159
+ Segment end latitude
1160
+ """
1161
+ end_latitude: Float!
1162
+ """
1163
+ Segment end longitude
1164
+ """
1165
+ end_longitude: Float!
1166
+ """
1167
+ Segment length in meters (optional metadata)
1168
+ """
1169
+ distance_meters: Float
1170
+ """
1171
+ Corridor radius (m) used to match traversing activities (default 35)
1172
+ """
1173
+ match_tolerance_meters: Float
1174
+ """
1175
+ Garmin activity this segment is created from, if any
1176
+ """
1177
+ source_activity_id: String
1178
+ """
1179
+ Zero-based lap index the segment is created from, if any
1180
+ """
1181
+ source_lap_index: Int
1182
+ """
1183
+ Zero-based ClimbPro split index the segment is created from, if any
1184
+ """
1185
+ source_climb_index: Int
1186
+ }
1187
+
899
1188
  """
900
1189
  Individual GPS track point within a Garmin activity.
901
1190
  """
@@ -1769,6 +2058,78 @@ type Query {
1769
2058
  activity_id: String!
1770
2059
  ): [GarminActivityLap!]!
1771
2060
 
2061
+ """
2062
+ Batch laps across activities for cross-activity comparison (matrix of activities x lap_index).
2063
+ """
2064
+ garminLapsComparison(
2065
+ """
2066
+ Filter by sport type (e.g. cycling, running)
2067
+ """
2068
+ sport: String
2069
+ """
2070
+ Start date filter (YYYY-MM-DD), inclusive on activity start_time
2071
+ """
2072
+ date_from: String
2073
+ """
2074
+ End date filter (YYYY-MM-DD), inclusive on activity start_time
2075
+ """
2076
+ date_to: String
2077
+ """
2078
+ Maximum number of activities to return per page
2079
+ """
2080
+ limit: Int
2081
+ """
2082
+ Number of activities to skip for pagination
2083
+ """
2084
+ offset: Int
2085
+ ): GarminLapsComparisonConnection!
2086
+
2087
+ """
2088
+ List saved Garmin segments, optionally filtered by sport.
2089
+ """
2090
+ garminSegments(
2091
+ """
2092
+ Filter by sport type (e.g. cycling, running)
2093
+ """
2094
+ sport: String
2095
+ ): [GarminSegment!]!
2096
+
2097
+ """
2098
+ Fetch a single saved Garmin segment by id. Returns null if it does not exist.
2099
+ """
2100
+ garminSegment(
2101
+ """
2102
+ Segment identifier
2103
+ """
2104
+ id: Int!
2105
+ ): GarminSegment
2106
+
2107
+ """
2108
+ Rank all historical activity efforts over a saved segment (fastest first).
2109
+ """
2110
+ garminSegmentEfforts(
2111
+ """
2112
+ Segment identifier
2113
+ """
2114
+ id: Int!
2115
+ """
2116
+ Start date filter (YYYY-MM-DD), inclusive on activity start_time
2117
+ """
2118
+ date_from: String
2119
+ """
2120
+ End date filter (YYYY-MM-DD), inclusive on activity start_time
2121
+ """
2122
+ date_to: String
2123
+ """
2124
+ Ignore traversals longer than this many seconds (filters loop/return mismatches)
2125
+ """
2126
+ max_effort_seconds: Int
2127
+ """
2128
+ Maximum number of efforts to return
2129
+ """
2130
+ limit: Int
2131
+ ): GarminSegmentEffortsConnection!
2132
+
1772
2133
  """
1773
2134
  Retrieve all reverse-geocoded addresses for a Garmin activity (start, mid-route waypoints, and end).
1774
2135
  """
@@ -1987,4 +2348,26 @@ type Mutation {
1987
2348
  """
1988
2349
  retry_failed: Boolean
1989
2350
  ): GeocodingTriggerResult!
2351
+
2352
+ """
2353
+ Create a saved Garmin segment (requires authentication). Typically called with
2354
+ the start/end coordinates of an activity lap or ClimbPro split to "save this
2355
+ lap as a segment".
2356
+ """
2357
+ createGarminSegment(
2358
+ """
2359
+ Segment definition
2360
+ """
2361
+ input: CreateGarminSegmentInput!
2362
+ ): GarminSegment!
2363
+
2364
+ """
2365
+ Delete a saved Garmin segment by id (requires authentication). Returns true on success.
2366
+ """
2367
+ deleteGarminSegment(
2368
+ """
2369
+ Segment identifier
2370
+ """
2371
+ id: Int!
2372
+ ): Boolean!
1990
2373
  }