@signalk/server-api 2.10.0 → 2.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,709 @@
1
+ /**
2
+ * Radar API Types
3
+ *
4
+ * Types and interfaces for the Signal K Radar API at
5
+ * /signalk/v2/api/vessels/self/radars
6
+ */
7
+ /** @category Radar API */
8
+ export type RadarStatus = 'off' | 'standby' | 'transmit' | 'warming';
9
+ /** @category Radar API */
10
+ export interface RadarControlValue {
11
+ auto: boolean;
12
+ value: number;
13
+ }
14
+ /** @category Radar API */
15
+ export interface RadarControls {
16
+ gain: RadarControlValue;
17
+ sea?: RadarControlValue;
18
+ rain?: {
19
+ value: number;
20
+ };
21
+ interferenceRejection?: {
22
+ value: number;
23
+ };
24
+ targetExpansion?: {
25
+ value: number;
26
+ };
27
+ targetBoost?: {
28
+ value: number;
29
+ };
30
+ [key: string]: RadarControlValue | {
31
+ value: number;
32
+ } | undefined;
33
+ }
34
+ /** @category Radar API */
35
+ export interface LegendEntry {
36
+ color: string;
37
+ label: string;
38
+ minValue?: number;
39
+ maxValue?: number;
40
+ }
41
+ /**
42
+ * Optional features a radar provider may support.
43
+ *
44
+ * These indicate what API features are implemented by the provider,
45
+ * NOT hardware capabilities (those are in characteristics).
46
+ *
47
+ * @category Radar API
48
+ */
49
+ export type SupportedFeature = 'arpa' | 'guardZones' | 'trails' | 'dualRange';
50
+ /**
51
+ * Hardware characteristics of a radar.
52
+ *
53
+ * @category Radar API
54
+ */
55
+ export interface RadarCharacteristics {
56
+ /** Maximum detection range in meters */
57
+ maxRange: number;
58
+ /** Minimum detection range in meters */
59
+ minRange: number;
60
+ /** Supported discrete range values in meters */
61
+ supportedRanges: number[];
62
+ /** Number of spokes per full rotation */
63
+ spokesPerRevolution: number;
64
+ /** Maximum spoke length in samples */
65
+ maxSpokeLength: number;
66
+ /** Whether the radar supports Doppler/motion detection */
67
+ hasDoppler: boolean;
68
+ /** Whether the radar supports dual-range mode */
69
+ hasDualRange: boolean;
70
+ /** Maximum range for dual-range mode (if supported) */
71
+ maxDualRange?: number;
72
+ /** Number of no-transmit zones supported */
73
+ noTransmitZoneCount: number;
74
+ }
75
+ /**
76
+ * Control definition describing a radar control.
77
+ *
78
+ * @category Radar API
79
+ */
80
+ export interface ControlDefinitionV5 {
81
+ /** Semantic control ID (e.g., "gain", "beamSharpening") */
82
+ id: string;
83
+ /** Human-readable name */
84
+ name: string;
85
+ /** Description for tooltips */
86
+ description: string;
87
+ /** Category: base controls all radars have, extended are model-specific */
88
+ category: 'base' | 'extended';
89
+ /** Control value type */
90
+ type: 'boolean' | 'number' | 'enum' | 'compound';
91
+ /** For type: "number" - value range constraints */
92
+ range?: {
93
+ min: number;
94
+ max: number;
95
+ step?: number;
96
+ unit?: string;
97
+ };
98
+ /** For type: "enum" - allowed values */
99
+ values?: Array<{
100
+ value: string | number;
101
+ label: string;
102
+ description?: string;
103
+ }>;
104
+ /** For type: "compound" - property definitions */
105
+ properties?: Record<string, any>;
106
+ /** Supported modes (auto/manual) */
107
+ modes?: ('auto' | 'manual')[];
108
+ /** Default mode */
109
+ defaultMode?: 'auto' | 'manual';
110
+ /** Whether this control is read-only */
111
+ readOnly?: boolean;
112
+ /** Default value */
113
+ default?: any;
114
+ }
115
+ /**
116
+ * Control constraint describing dependencies between controls.
117
+ *
118
+ * @category Radar API
119
+ */
120
+ export interface ControlConstraint {
121
+ /** Control ID this constraint applies to */
122
+ controlId: string;
123
+ /** Condition that triggers the constraint */
124
+ condition: {
125
+ type: 'disabled_when' | 'read_only_when' | 'restricted_when';
126
+ dependsOn: string;
127
+ operator: '==' | '!=' | '>' | '<' | '>=' | '<=';
128
+ value: string | number | boolean;
129
+ };
130
+ /** Effect when condition is true */
131
+ effect: {
132
+ disabled?: boolean;
133
+ readOnly?: boolean;
134
+ allowedValues?: any[];
135
+ reason?: string;
136
+ };
137
+ }
138
+ /**
139
+ * Capability manifest describing what a radar can do.
140
+ * This is cacheable - capabilities rarely change at runtime.
141
+ *
142
+ * @category Radar API
143
+ *
144
+ * @example
145
+ * ```json
146
+ * {
147
+ * "id": "1",
148
+ * "make": "Furuno",
149
+ * "model": "DRS4D-NXT",
150
+ * "characteristics": {
151
+ * "maxRange": 88896,
152
+ * "minRange": 116,
153
+ * "supportedRanges": [116, 231, 463, ...],
154
+ * "hasDoppler": true
155
+ * },
156
+ * "controls": [
157
+ * {"id": "power", "type": "enum", ...},
158
+ * {"id": "gain", "type": "compound", ...}
159
+ * ]
160
+ * }
161
+ * ```
162
+ */
163
+ export interface CapabilityManifest {
164
+ /** Radar ID */
165
+ id: string;
166
+ /** Manufacturer name */
167
+ make: string;
168
+ /** Model name */
169
+ model: string;
170
+ /** Model family (optional) */
171
+ modelFamily?: string;
172
+ /** Serial number (optional) */
173
+ serialNumber?: string;
174
+ /** Firmware version (optional) */
175
+ firmwareVersion?: string;
176
+ /** Hardware characteristics */
177
+ characteristics: RadarCharacteristics;
178
+ /** Available controls with their schemas */
179
+ controls: ControlDefinitionV5[];
180
+ /** Control dependencies/constraints */
181
+ constraints?: ControlConstraint[];
182
+ /**
183
+ * Optional features this provider implements.
184
+ *
185
+ * Indicates which optional API features are available:
186
+ * - 'arpa': ARPA target tracking (GET /targets, POST /targets, etc.)
187
+ * - 'guardZones': Guard zone alerting (GET /guardZones, etc.)
188
+ * - 'trails': Target trails/history (GET /trails)
189
+ * - 'dualRange': Dual-range simultaneous display
190
+ *
191
+ * Note: This declares API capabilities, not hardware. A radar may have
192
+ * hardware Doppler support (characteristics.hasDoppler) but the provider
193
+ * might not implement the trails API endpoint.
194
+ */
195
+ supportedFeatures?: SupportedFeature[];
196
+ }
197
+ /**
198
+ * Current radar state.
199
+ * Contains status and all current control values.
200
+ *
201
+ * @category Radar API
202
+ *
203
+ * @example
204
+ * ```json
205
+ * {
206
+ * "id": "1",
207
+ * "timestamp": "2025-01-15T10:30:00Z",
208
+ * "status": "transmit",
209
+ * "controls": {
210
+ * "power": "transmit",
211
+ * "range": 5556,
212
+ * "gain": {"mode": "auto", "value": 65}
213
+ * }
214
+ * }
215
+ * ```
216
+ */
217
+ export interface RadarState {
218
+ /** Radar ID */
219
+ id: string;
220
+ /** ISO 8601 timestamp of when state was captured */
221
+ timestamp: string;
222
+ /** Current operational status */
223
+ status: RadarStatus;
224
+ /** Current control values keyed by control ID */
225
+ controls: Record<string, any>;
226
+ /** Controls that are currently disabled and why */
227
+ disabledControls?: Array<{
228
+ controlId: string;
229
+ reason: string;
230
+ }>;
231
+ }
232
+ /**
233
+ * ARPA target status.
234
+ *
235
+ * @category Radar API
236
+ */
237
+ export type ArpaTargetStatus = 'tracking' | 'lost' | 'acquiring';
238
+ /**
239
+ * ARPA target acquisition method.
240
+ *
241
+ * @category Radar API
242
+ */
243
+ export type ArpaAcquisitionMethod = 'manual' | 'auto';
244
+ /**
245
+ * ARPA target position data.
246
+ *
247
+ * @category Radar API
248
+ */
249
+ export interface ArpaTargetPosition {
250
+ /** Bearing from own ship in degrees (0-360, true north) */
251
+ bearing: number;
252
+ /** Distance from own ship in meters */
253
+ distance: number;
254
+ /** Latitude (if GPS available) */
255
+ latitude?: number;
256
+ /** Longitude (if GPS available) */
257
+ longitude?: number;
258
+ }
259
+ /**
260
+ * ARPA target motion data.
261
+ *
262
+ * @category Radar API
263
+ */
264
+ export interface ArpaTargetMotion {
265
+ /** Course over ground in degrees (0-360, true north) */
266
+ course: number;
267
+ /** Speed over ground in meters per second */
268
+ speed: number;
269
+ }
270
+ /**
271
+ * ARPA target danger assessment.
272
+ *
273
+ * @category Radar API
274
+ */
275
+ export interface ArpaTargetDanger {
276
+ /** Closest Point of Approach in meters */
277
+ cpa: number;
278
+ /** Time to CPA in seconds (negative if target is receding) */
279
+ tcpa: number;
280
+ }
281
+ /**
282
+ * ARPA tracked target.
283
+ *
284
+ * @category Radar API
285
+ *
286
+ * @example
287
+ * ```json
288
+ * {
289
+ * "id": 1,
290
+ * "status": "tracking",
291
+ * "position": {
292
+ * "bearing": 45.2,
293
+ * "distance": 1852,
294
+ * "latitude": 52.1234,
295
+ * "longitude": 4.5678
296
+ * },
297
+ * "motion": {
298
+ * "course": 180.5,
299
+ * "speed": 5.14
300
+ * },
301
+ * "danger": {
302
+ * "cpa": 150,
303
+ * "tcpa": 300
304
+ * },
305
+ * "acquisition": "manual",
306
+ * "firstSeen": "2025-01-15T10:28:00Z",
307
+ * "lastSeen": "2025-01-15T10:30:00Z"
308
+ * }
309
+ * ```
310
+ */
311
+ export interface ArpaTarget {
312
+ /** Unique target identifier (1-99 typically) */
313
+ id: number;
314
+ /** Current tracking status */
315
+ status: ArpaTargetStatus;
316
+ /** Target position relative to own ship */
317
+ position: ArpaTargetPosition;
318
+ /** Target motion (course and speed) */
319
+ motion: ArpaTargetMotion;
320
+ /** Danger assessment (CPA/TCPA) */
321
+ danger: ArpaTargetDanger;
322
+ /** How this target was acquired */
323
+ acquisition: ArpaAcquisitionMethod;
324
+ /** ISO 8601 timestamp when target was first acquired */
325
+ firstSeen: string;
326
+ /** ISO 8601 timestamp of most recent radar return */
327
+ lastSeen: string;
328
+ }
329
+ /**
330
+ * Response from GET /radars/{id}/targets.
331
+ *
332
+ * @category Radar API
333
+ *
334
+ * @example
335
+ * ```json
336
+ * {
337
+ * "radarId": "radar-0",
338
+ * "timestamp": "2025-01-15T10:30:00Z",
339
+ * "targets": [
340
+ * { "id": 1, "status": "tracking", ... },
341
+ * { "id": 2, "status": "lost", ... }
342
+ * ]
343
+ * }
344
+ * ```
345
+ */
346
+ export interface TargetListResponse {
347
+ /** Radar ID */
348
+ radarId: string;
349
+ /** ISO 8601 timestamp */
350
+ timestamp: string;
351
+ /** List of tracked targets */
352
+ targets: ArpaTarget[];
353
+ }
354
+ /**
355
+ * WebSocket message for target streaming.
356
+ *
357
+ * @category Radar API
358
+ */
359
+ export interface TargetStreamMessage {
360
+ /** Message type */
361
+ type: 'target_update' | 'target_lost' | 'target_acquired';
362
+ /** ISO 8601 timestamp */
363
+ timestamp: string;
364
+ /** Updated/lost/acquired target */
365
+ target: ArpaTarget;
366
+ }
367
+ /**
368
+ * ARPA settings for a radar.
369
+ *
370
+ * @category Radar API
371
+ */
372
+ export interface ArpaSettings {
373
+ /** Whether ARPA is enabled */
374
+ enabled: boolean;
375
+ /** Maximum number of targets to track (typically 10-100) */
376
+ maxTargets: number;
377
+ /** CPA threshold for danger alert in meters */
378
+ cpaThreshold: number;
379
+ /** TCPA threshold for danger alert in seconds */
380
+ tcpaThreshold: number;
381
+ /** Seconds before marking a target as lost */
382
+ lostTargetTimeout: number;
383
+ /** Auto-acquisition sensitivity (0=off, 1-3=low/med/high) */
384
+ autoAcquisition: number;
385
+ }
386
+ /**
387
+ * Radar information returned by GET /radars/{id}
388
+ *
389
+ * @category Radar API
390
+ *
391
+ * @example
392
+ * ```json
393
+ * {
394
+ * "id": "radar-0",
395
+ * "name": "Furuno DRS4D-NXT",
396
+ * "brand": "Furuno",
397
+ * "status": "transmit",
398
+ * "spokesPerRevolution": 2048,
399
+ * "maxSpokeLen": 1024,
400
+ * "range": 2000,
401
+ * "controls": {
402
+ * "gain": { "auto": false, "value": 50 },
403
+ * "sea": { "auto": true, "value": 30 }
404
+ * },
405
+ * "streamUrl": "ws://192.168.1.100:3001/v1/api/stream/radar-0"
406
+ * }
407
+ * ```
408
+ */
409
+ export interface RadarInfo {
410
+ /** Unique identifier for this radar */
411
+ id: string;
412
+ /** Display name */
413
+ name: string;
414
+ /** Radar brand/manufacturer */
415
+ brand?: string;
416
+ /** Current operational status */
417
+ status: RadarStatus;
418
+ /** Number of spokes per full rotation */
419
+ spokesPerRevolution: number;
420
+ /** Maximum spoke length in samples */
421
+ maxSpokeLen: number;
422
+ /** Current range in meters */
423
+ range: number;
424
+ /** Current control settings */
425
+ controls: RadarControls;
426
+ /** Color legend for radar display */
427
+ legend?: LegendEntry[];
428
+ /**
429
+ * WebSocket URL for radar spoke streaming.
430
+ *
431
+ * - If **absent**: Clients use the built-in stream endpoint:
432
+ * `ws://server/signalk/v2/api/vessels/self/radars/{id}/stream`
433
+ * or `ws://server/signalk/v2/api/streams/radars/{id}`
434
+ * (WASM plugins emit spokes via `sk_radar_emit_spokes()` FFI binding)
435
+ *
436
+ * - If **present**: Clients connect directly to external URL (backward compat)
437
+ * @example "ws://192.168.1.100:3001/stream" (external mayara-server)
438
+ */
439
+ streamUrl?: string;
440
+ }
441
+ /**
442
+ * Provider interface for plugins that provide radar data.
443
+ *
444
+ * @category Radar API
445
+ *
446
+ * @example
447
+ * ```javascript
448
+ * app.registerRadarProvider({
449
+ * name: 'Furuno Radar Plugin',
450
+ * methods: {
451
+ * getRadars: async () => ['radar-0'],
452
+ * getRadarInfo: async (id) => ({
453
+ * id: 'radar-0',
454
+ * name: 'Furuno DRS4D-NXT',
455
+ * status: 'transmit',
456
+ * spokesPerRevolution: 2048,
457
+ * maxSpokeLen: 1024,
458
+ * range: 2000,
459
+ * controls: { gain: { auto: false, value: 50 } },
460
+ * streamUrl: 'ws://192.168.1.100:3001/stream'
461
+ * }),
462
+ * setPower: async (id, state) => { ... },
463
+ * setRange: async (id, range) => { ... },
464
+ * setGain: async (id, gain) => { ... }
465
+ * }
466
+ * })
467
+ * ```
468
+ */
469
+ export interface RadarProvider {
470
+ /** Display name for this radar provider */
471
+ name: string;
472
+ /** Provider methods */
473
+ methods: RadarProviderMethods;
474
+ }
475
+ /** @category Radar API */
476
+ export interface RadarProviderMethods {
477
+ /** Plugin ID (set automatically on registration) */
478
+ pluginId?: string;
479
+ /**
480
+ * Get list of radar IDs this provider manages.
481
+ * @returns Array of radar IDs
482
+ */
483
+ getRadars: () => Promise<string[]>;
484
+ /**
485
+ * Get detailed info for a specific radar.
486
+ * @param radarId The radar ID
487
+ * @returns Radar info or null if not found
488
+ */
489
+ getRadarInfo: (radarId: string) => Promise<RadarInfo | null>;
490
+ /**
491
+ * Set radar power state.
492
+ * @param radarId The radar ID
493
+ * @param state Target power state
494
+ * @returns true on success
495
+ */
496
+ setPower?: (radarId: string, state: RadarStatus) => Promise<boolean>;
497
+ /**
498
+ * Set radar range in meters.
499
+ * @param radarId The radar ID
500
+ * @param range Range in meters
501
+ * @returns true on success
502
+ */
503
+ setRange?: (radarId: string, range: number) => Promise<boolean>;
504
+ /**
505
+ * Set radar gain.
506
+ * @param radarId The radar ID
507
+ * @param gain Gain settings
508
+ * @returns true on success
509
+ */
510
+ setGain?: (radarId: string, gain: {
511
+ auto: boolean;
512
+ value?: number;
513
+ }) => Promise<boolean>;
514
+ /**
515
+ * Set radar sea clutter.
516
+ * @param radarId The radar ID
517
+ * @param sea Sea clutter settings
518
+ * @returns true on success
519
+ */
520
+ setSea?: (radarId: string, sea: {
521
+ auto: boolean;
522
+ value?: number;
523
+ }) => Promise<boolean>;
524
+ /**
525
+ * Set radar rain clutter.
526
+ * @param radarId The radar ID
527
+ * @param rain Rain clutter settings
528
+ * @returns true on success
529
+ */
530
+ setRain?: (radarId: string, rain: {
531
+ auto: boolean;
532
+ value?: number;
533
+ }) => Promise<boolean>;
534
+ /**
535
+ * Set multiple radar controls at once.
536
+ * @param radarId The radar ID
537
+ * @param controls Partial controls to update
538
+ * @returns true on success
539
+ */
540
+ setControls?: (radarId: string, controls: Partial<RadarControls>) => Promise<boolean>;
541
+ /**
542
+ * Handle WebSocket stream connection (optional).
543
+ * Only needed if provider doesn't expose external streamUrl.
544
+ * @param radarId The radar ID
545
+ * @param ws WebSocket connection to send spoke data to
546
+ */
547
+ handleStreamConnection?: (radarId: string, ws: WebSocket) => void;
548
+ /**
549
+ * Get capability manifest for a radar.
550
+ * Returns detailed capabilities including supported controls, ranges, features.
551
+ * @param radarId The radar ID
552
+ * @returns CapabilityManifest or null if not found
553
+ */
554
+ getCapabilities?: (radarId: string) => Promise<CapabilityManifest | null>;
555
+ /**
556
+ * Get current radar state.
557
+ * Returns status and all current control values.
558
+ * @param radarId The radar ID
559
+ * @returns RadarState or null if not found
560
+ */
561
+ getState?: (radarId: string) => Promise<RadarState | null>;
562
+ /**
563
+ * Get a single control value.
564
+ * @param radarId The radar ID
565
+ * @param controlId The semantic control ID (e.g., "gain", "beamSharpening")
566
+ * @returns Control value or null if not found
567
+ */
568
+ getControl?: (radarId: string, controlId: string) => Promise<any | null>;
569
+ /**
570
+ * Set a single control value.
571
+ * @param radarId The radar ID
572
+ * @param controlId The semantic control ID (e.g., "gain", "beamSharpening")
573
+ * @param value The value to set
574
+ * @returns Result with success flag and optional error
575
+ */
576
+ setControl?: (radarId: string, controlId: string, value: any) => Promise<{
577
+ success: boolean;
578
+ error?: string;
579
+ }>;
580
+ /**
581
+ * Get all tracked ARPA targets.
582
+ * @param radarId The radar ID
583
+ * @returns Target list response or null if not supported
584
+ */
585
+ getTargets?: (radarId: string) => Promise<TargetListResponse | null>;
586
+ /**
587
+ * Manually acquire a target at the specified position.
588
+ * @param radarId The radar ID
589
+ * @param bearing Bearing in degrees (0-360, true north)
590
+ * @param distance Distance in meters
591
+ * @returns Result with success flag and optional target ID
592
+ */
593
+ acquireTarget?: (radarId: string, bearing: number, distance: number) => Promise<{
594
+ success: boolean;
595
+ targetId?: number;
596
+ error?: string;
597
+ }>;
598
+ /**
599
+ * Cancel tracking of a target.
600
+ * @param radarId The radar ID
601
+ * @param targetId The target ID to cancel
602
+ * @returns true on success
603
+ */
604
+ cancelTarget?: (radarId: string, targetId: number) => Promise<boolean>;
605
+ /**
606
+ * Handle WebSocket target stream connection.
607
+ * Streams target updates in real-time.
608
+ * @param radarId The radar ID
609
+ * @param ws WebSocket connection to send target updates to
610
+ */
611
+ handleTargetStreamConnection?: (radarId: string, ws: WebSocket) => void;
612
+ /**
613
+ * Get ARPA settings.
614
+ * @param radarId The radar ID
615
+ * @returns ARPA settings or null if not supported
616
+ */
617
+ getArpaSettings?: (radarId: string) => Promise<ArpaSettings | null>;
618
+ /**
619
+ * Update ARPA settings.
620
+ * @param radarId The radar ID
621
+ * @param settings Partial settings to update
622
+ * @returns Result with success flag and optional error
623
+ */
624
+ setArpaSettings?: (radarId: string, settings: Partial<ArpaSettings>) => Promise<{
625
+ success: boolean;
626
+ error?: string;
627
+ }>;
628
+ }
629
+ /**
630
+ * Radar API methods available on the server.
631
+ *
632
+ * @category Radar API
633
+ */
634
+ export interface RadarApi {
635
+ /** Register a radar provider plugin */
636
+ register: (pluginId: string, provider: RadarProvider) => void;
637
+ /** Unregister a radar provider plugin */
638
+ unRegister: (pluginId: string) => void;
639
+ /** Get list of all radars from all providers */
640
+ getRadars: () => Promise<RadarInfo[]>;
641
+ /** Get info for a specific radar */
642
+ getRadarInfo: (radarId: string) => Promise<RadarInfo | null>;
643
+ }
644
+ /**
645
+ * Registry interface exposed to plugins via ServerAPI.
646
+ *
647
+ * @category Radar API
648
+ */
649
+ export interface RadarProviderRegistry {
650
+ /**
651
+ * Register a radar provider plugin.
652
+ * See Radar Provider Plugins documentation for details.
653
+ *
654
+ * @category Radar API
655
+ */
656
+ registerRadarProvider: (provider: RadarProvider) => void;
657
+ /**
658
+ * Access the Radar API to get radar info and manage radars.
659
+ *
660
+ * @category Radar API
661
+ */
662
+ radarApi: RadarApi;
663
+ }
664
+ /**
665
+ * Interface for accessing the Radar API from plugins.
666
+ *
667
+ * This provides typed, in-process programmatic access to the Radar API,
668
+ * similar to {@link history!WithHistoryApi | WithHistoryApi} for the History API.
669
+ *
670
+ * @category Radar API
671
+ *
672
+ * @example
673
+ * ```javascript
674
+ * // Check if Radar API is available
675
+ * if (app.getRadarApi) {
676
+ * const radarApi = await app.getRadarApi();
677
+ * const radars = await radarApi.getRadars();
678
+ * app.debug(`Found ${radars.length} radars`);
679
+ * }
680
+ * ```
681
+ */
682
+ export type WithRadarApi = {
683
+ /**
684
+ * Returns a promise for the active Radar API implementation, or rejects if unavailable.
685
+ * The property is optional to support older servers that do not have radar API support.
686
+ *
687
+ * @returns Promise that resolves to a {@link RadarApi} instance if available, or rejects with an error if not.
688
+ */
689
+ getRadarApi?: () => Promise<RadarApi>;
690
+ };
691
+ /**
692
+ * List of registered radar providers (for /_providers endpoint)
693
+ *
694
+ * @hidden visible through API
695
+ * @category Radar API
696
+ */
697
+ export interface RadarProviders {
698
+ [id: string]: {
699
+ name: string;
700
+ isDefault: boolean;
701
+ };
702
+ }
703
+ /**
704
+ * Type guard to validate a RadarProvider object.
705
+ *
706
+ * @category Radar API
707
+ */
708
+ export declare const isRadarProvider: (obj: any) => obj is RadarProvider;
709
+ //# sourceMappingURL=radarapi.d.ts.map