@tak-ps/node-tak 12.23.1 → 12.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,5 @@
1
1
  import { Static } from '@sinclair/typebox';
2
2
  import { Readable } from 'node:stream';
3
- import type { Feature } from '@tak-ps/node-cot';
4
3
  import Commands, { CommandOutputFormat, type ParsedArgs } from '../commands.js';
5
4
  export declare enum MissionSubscriberRole {
6
5
  MISSION_OWNER = "MISSION_OWNER",
@@ -165,6 +164,437 @@ export declare const MissionSubscriber: import("@sinclair/typebox").TObject<{
165
164
  export declare const MissionOptions: import("@sinclair/typebox").TObject<{
166
165
  token: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
167
166
  }>;
167
+ /**
168
+ * A Mission CoT that could not be parsed or failed validation,
169
+ * with the raw xml-js event included so the caller can extract
170
+ * whatever context (UID, Callsign, etc.) it needs
171
+ */
172
+ export declare const MissionInvalidFeature: import("@sinclair/typebox").TObject<{
173
+ error: import("@sinclair/typebox").TString;
174
+ feature: import("@sinclair/typebox").TUnknown;
175
+ }>;
176
+ export declare const MissionLatestFeats: import("@sinclair/typebox").TObject<{
177
+ features: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
178
+ id: import("@sinclair/typebox").TString;
179
+ type: import("@sinclair/typebox").TLiteral<"Feature">;
180
+ properties: import("@sinclair/typebox").TObject<{
181
+ callsign: import("@sinclair/typebox").TString;
182
+ type: import("@sinclair/typebox").TString;
183
+ how: import("@sinclair/typebox").TString;
184
+ time: import("@sinclair/typebox").TString;
185
+ start: import("@sinclair/typebox").TString;
186
+ stale: import("@sinclair/typebox").TString;
187
+ center: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TNumber>;
188
+ minzoom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
189
+ maxzoom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
190
+ rotate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
191
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
192
+ bearing: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
193
+ creator: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
194
+ uid: import("@sinclair/typebox").TString;
195
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
196
+ time: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
197
+ type: import("@sinclair/typebox").TString;
198
+ }>>;
199
+ course: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
200
+ slope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
201
+ speed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
202
+ labels: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
203
+ "marker-color": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
204
+ "marker-opacity": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
205
+ stroke: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
206
+ "stroke-opacity": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
207
+ "stroke-width": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
208
+ "stroke-style": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
209
+ fill: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
210
+ "fill-opacity": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
211
+ metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
212
+ archived: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
213
+ forcedelete: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
214
+ geofence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
215
+ elevationMonitored: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
216
+ minElevation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
217
+ maxElevation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
218
+ monitor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
219
+ trigger: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
220
+ tracking: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
221
+ boundingSphere: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
222
+ }>>;
223
+ contact: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
224
+ phone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
225
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
226
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
227
+ endpoint: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
228
+ }>>;
229
+ shape: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
230
+ ellipse: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
231
+ major: import("@sinclair/typebox").TNumber;
232
+ minor: import("@sinclair/typebox").TNumber;
233
+ angle: import("@sinclair/typebox").TNumber;
234
+ swapAxis: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
235
+ }>>;
236
+ }>>;
237
+ remarks: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
238
+ milsym: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
239
+ id: import("@sinclair/typebox").TString;
240
+ }>>;
241
+ milicon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
242
+ id: import("@sinclair/typebox").TString;
243
+ }>>;
244
+ mission: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
245
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
246
+ tool: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
247
+ guid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
248
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
249
+ authorUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
250
+ missionLayer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
251
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
252
+ parentUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
253
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
254
+ uid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
255
+ }>>;
256
+ missionChanges: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
257
+ contentUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
258
+ creatorUid: import("@sinclair/typebox").TString;
259
+ isFederatedChange: import("@sinclair/typebox").TBoolean;
260
+ missionName: import("@sinclair/typebox").TString;
261
+ timestamp: import("@sinclair/typebox").TString;
262
+ type: import("@sinclair/typebox").TString;
263
+ contentResource: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
264
+ expiration: import("@sinclair/typebox").TString;
265
+ filename: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
266
+ hash: import("@sinclair/typebox").TString;
267
+ name: import("@sinclair/typebox").TString;
268
+ size: import("@sinclair/typebox").TInteger;
269
+ submissionTime: import("@sinclair/typebox").TString;
270
+ submitter: import("@sinclair/typebox").TString;
271
+ tool: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
272
+ uid: import("@sinclair/typebox").TString;
273
+ }>>;
274
+ details: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
275
+ type: import("@sinclair/typebox").TString;
276
+ callsign: import("@sinclair/typebox").TString;
277
+ color: import("@sinclair/typebox").TString;
278
+ lat: import("@sinclair/typebox").TString;
279
+ lon: import("@sinclair/typebox").TString;
280
+ }>>;
281
+ }>>>;
282
+ }>>;
283
+ fileshare: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
284
+ filename: import("@sinclair/typebox").TString;
285
+ name: import("@sinclair/typebox").TString;
286
+ senderCallsign: import("@sinclair/typebox").TString;
287
+ senderUid: import("@sinclair/typebox").TString;
288
+ senderUrl: import("@sinclair/typebox").TString;
289
+ sha256: import("@sinclair/typebox").TString;
290
+ sizeInBytes: import("@sinclair/typebox").TInteger;
291
+ }>>;
292
+ ackrequest: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
293
+ uid: import("@sinclair/typebox").TString;
294
+ ackrequested: import("@sinclair/typebox").TBoolean;
295
+ tag: import("@sinclair/typebox").TString;
296
+ }>>;
297
+ attachments: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
298
+ sensor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
299
+ elevation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
300
+ vfov: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
301
+ fov: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
302
+ roll: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
303
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
304
+ azimuth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
305
+ north: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
306
+ fovBlue: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
307
+ fovAlpha: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
308
+ fovGreen: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
309
+ fovRed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
310
+ strokeWeight: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
311
+ strokeColor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
312
+ rangeLines: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
313
+ rangeLineStrokeWeight: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
314
+ rangeLineStrokeColor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
315
+ displayMagneticReference: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
316
+ hideFov: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
317
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
318
+ version: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
319
+ model: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
320
+ }>>;
321
+ video: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
322
+ uid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
323
+ url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
324
+ sensor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
325
+ spi: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
326
+ connection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
327
+ uid: import("@sinclair/typebox").TString;
328
+ address: import("@sinclair/typebox").TString;
329
+ networkTimeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
330
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
331
+ protocol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
332
+ bufferTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
333
+ port: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
334
+ roverPort: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
335
+ rtspReliable: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
336
+ ignoreEmbeddedKLV: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
337
+ alias: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
338
+ }>>;
339
+ }>>;
340
+ links: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
341
+ uid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
342
+ relation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
343
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
344
+ point: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
345
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
346
+ mission: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
347
+ event: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
348
+ url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
349
+ mime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
350
+ remarks: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
351
+ production_time: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
352
+ parent_callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
353
+ }>>>;
354
+ chat: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
355
+ parent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
356
+ groupOwner: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
357
+ messageId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
358
+ chatroom: import("@sinclair/typebox").TString;
359
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
360
+ senderCallsign: import("@sinclair/typebox").TString;
361
+ chatgrp: import("@sinclair/typebox").TAny;
362
+ }>>;
363
+ track: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
364
+ speed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
365
+ course: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
366
+ slope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
367
+ eCourse: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
368
+ eSpeed: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
369
+ eSlope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
370
+ }>>;
371
+ dest: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
372
+ uid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
373
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
374
+ group: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
375
+ mission: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
376
+ "mission-guid": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
377
+ after: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
378
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
379
+ }>, import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
380
+ uid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
381
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
382
+ group: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
383
+ mission: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
384
+ "mission-guid": import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
385
+ after: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
386
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
387
+ }>>]>>;
388
+ marti_archive: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
389
+ icon: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
390
+ droid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
391
+ takv: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
392
+ device: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
393
+ platform: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
394
+ os: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
395
+ version: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
396
+ }>>;
397
+ group: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
398
+ name: import("@sinclair/typebox").TString;
399
+ role: import("@sinclair/typebox").TString;
400
+ }>>;
401
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
402
+ battery: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
403
+ readiness: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
404
+ }>>;
405
+ precisionlocation: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
406
+ geopointsrc: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
407
+ altsrc: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
408
+ }>>;
409
+ flow: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TString>>;
410
+ radsensordetail: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
411
+ sensor_data: import("@sinclair/typebox").TObject<{
412
+ time: import("@sinclair/typebox").TString;
413
+ model: import("@sinclair/typebox").TString;
414
+ neutronstatus: import("@sinclair/typebox").TString;
415
+ gammastatus: import("@sinclair/typebox").TString;
416
+ manufacturer: import("@sinclair/typebox").TString;
417
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
418
+ serialnumber: import("@sinclair/typebox").TString;
419
+ batterylevel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
420
+ id_algorithm: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
421
+ search_algorithm: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
422
+ alarm_algorithm: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
423
+ ordinal: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
424
+ subchannel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
425
+ measurement_ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
426
+ master_sensor_manufacturer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
427
+ master_sensor_serial: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
428
+ source_bearing: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
429
+ source_strength: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
430
+ relay_type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
431
+ module_location: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
432
+ detector_number: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
433
+ mission_total_mR: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
434
+ mission_stay_time_sec: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
435
+ mission_acquired_uR: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
436
+ sensor_temp_deg_c: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
437
+ heading: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
438
+ source_distance: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TEnum<{
439
+ MOVE_MUCH_CLOSER: "MOVE_MUCH_CLOSER";
440
+ MOVE_CLOSER: "MOVE_CLOSER";
441
+ OPTIMAL: "OPTIMAL";
442
+ MOVE_AWAY: "MOVE_AWAY";
443
+ MOVE_FAR_AWAY: "MOVE_FAR_AWAY";
444
+ }>>;
445
+ attachedUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
446
+ simulated: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
447
+ }>;
448
+ radmeasurement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
449
+ nalarmstddev: import("@sinclair/typebox").TInteger;
450
+ alarm: import("@sinclair/typebox").TInteger;
451
+ measurement: import("@sinclair/typebox").TNumber;
452
+ name: import("@sinclair/typebox").TEnum<{
453
+ alpha: "alpha";
454
+ beta: "beta";
455
+ gamma: "gamma";
456
+ neutron: "neutron";
457
+ doserate: "doserate";
458
+ }>;
459
+ }>>>;
460
+ physical_module: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
461
+ location: import("@sinclair/typebox").TEnum<{
462
+ FRONT_LEFT: "FRONT_LEFT";
463
+ FRONT_RIGHT: "FRONT_RIGHT";
464
+ REAR_LEFT: "REAR_LEFT";
465
+ REAR_RIGHT: "REAR_RIGHT";
466
+ CAB: "CAB";
467
+ }>;
468
+ gamma_cps: import("@sinclair/typebox").TNumber;
469
+ gamma_alarm: import("@sinclair/typebox").TInteger;
470
+ gamma_dose_rate: import("@sinclair/typebox").TNumber;
471
+ }>>>;
472
+ search_algorithm: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
473
+ neutron_loc: import("@sinclair/typebox").TNumber;
474
+ gamma_loc: import("@sinclair/typebox").TNumber;
475
+ neutron_loc_alarm_value: import("@sinclair/typebox").TNumber;
476
+ gamma_loc_alarm_value: import("@sinclair/typebox").TNumber;
477
+ neutron_loc_alarm: import("@sinclair/typebox").TInteger;
478
+ gamma_loc_alarm: import("@sinclair/typebox").TInteger;
479
+ }>>;
480
+ spectrum: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
481
+ zerocompression: import("@sinclair/typebox").TInteger;
482
+ type: import("@sinclair/typebox").TString;
483
+ livetime_ms: import("@sinclair/typebox").TString;
484
+ realtime_ms: import("@sinclair/typebox").TString;
485
+ channeldata: import("@sinclair/typebox").TString;
486
+ crystal_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
487
+ }>>>;
488
+ isotope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
489
+ confidence: import("@sinclair/typebox").TNumber;
490
+ name: import("@sinclair/typebox").TString;
491
+ type: import("@sinclair/typebox").TString;
492
+ }>>>;
493
+ data_permissions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
494
+ all: import("@sinclair/typebox").TBoolean;
495
+ contact_list: import("@sinclair/typebox").TString;
496
+ }>>;
497
+ command_permissions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
498
+ all: import("@sinclair/typebox").TBoolean;
499
+ contact_list: import("@sinclair/typebox").TString;
500
+ }>>;
501
+ }>>;
502
+ chemsensordetail: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
503
+ sensor_data: import("@sinclair/typebox").TObject<{
504
+ manufacturer: import("@sinclair/typebox").TString;
505
+ model: import("@sinclair/typebox").TString;
506
+ serialnumber: import("@sinclair/typebox").TString;
507
+ batterylevel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
508
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
509
+ revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
510
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
511
+ ordinal: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
512
+ attachedUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
513
+ simulated: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
514
+ }>;
515
+ detection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
516
+ time: import("@sinclair/typebox").TString;
517
+ agent: import("@sinclair/typebox").TString;
518
+ quantity: import("@sinclair/typebox").TNumber;
519
+ quantityunits: import("@sinclair/typebox").TString;
520
+ concentration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
521
+ alarm: import("@sinclair/typebox").TNumber;
522
+ confidence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
523
+ massfraction: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
524
+ percent: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
525
+ class: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
526
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
527
+ }>>>;
528
+ }>>;
529
+ biosensordetail: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
530
+ sensor_data: import("@sinclair/typebox").TObject<{
531
+ manufacturer: import("@sinclair/typebox").TString;
532
+ model: import("@sinclair/typebox").TString;
533
+ serialnumber: import("@sinclair/typebox").TString;
534
+ batterylevel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
535
+ callsign: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
536
+ revision: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
537
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
538
+ ordinal: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
539
+ attachedUid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
540
+ simulated: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
541
+ }>;
542
+ measurement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
543
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
544
+ time: import("@sinclair/typebox").TString;
545
+ confidence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
546
+ concentration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
547
+ bioClass: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
548
+ channel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
549
+ harmful: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
550
+ doseTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
551
+ dose: import("@sinclair/typebox").TNumber;
552
+ confirmationLevel: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
553
+ sampleId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
554
+ persistency: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
555
+ level: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
556
+ levelName: import("@sinclair/typebox").TString;
557
+ levelValue: import("@sinclair/typebox").TString;
558
+ }>>>;
559
+ }>>>;
560
+ }>>;
561
+ spatial: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
562
+ version: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
563
+ attitude: import("@sinclair/typebox").TObject<{
564
+ roll: import("@sinclair/typebox").TNumber;
565
+ pitch: import("@sinclair/typebox").TNumber;
566
+ yaw: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
567
+ eRoll: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
568
+ ePitch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
569
+ eYaw: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
570
+ }>;
571
+ spin: import("@sinclair/typebox").TObject<{
572
+ roll: import("@sinclair/typebox").TNumber;
573
+ pitch: import("@sinclair/typebox").TNumber;
574
+ yaw: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
575
+ eRoll: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
576
+ ePitch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
577
+ eYaw: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
578
+ }>;
579
+ }>>;
580
+ }>;
581
+ path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
582
+ geometry: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
583
+ type: import("@sinclair/typebox").TLiteral<"Point">;
584
+ coordinates: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TNumber>;
585
+ }>, import("@sinclair/typebox").TObject<{
586
+ type: import("@sinclair/typebox").TLiteral<"LineString">;
587
+ coordinates: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TNumber>>;
588
+ }>, import("@sinclair/typebox").TObject<{
589
+ type: import("@sinclair/typebox").TLiteral<"Polygon">;
590
+ coordinates: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TNumber>>>;
591
+ }>]>;
592
+ }>>;
593
+ invalid: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
594
+ error: import("@sinclair/typebox").TString;
595
+ feature: import("@sinclair/typebox").TUnknown;
596
+ }>>;
597
+ }>;
168
598
  export declare const AttachContentsInput: import("@sinclair/typebox").TObject<{
169
599
  hashes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
170
600
  uids: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
@@ -461,8 +891,12 @@ export default class MissionCommands extends Commands {
461
891
  changes(name: string, query: Static<typeof MissionChangesInput>, opts?: Static<typeof MissionOptions>): Promise<Static<typeof TAKList_MissionChange>>;
462
892
  /**
463
893
  * Return all current features in the Data Sync as CoT GeoJSON Features
894
+ *
895
+ * Each CoT in the TAK Server response is parsed & validated individually -
896
+ * those that fail are returned in the `invalid` array so a single poisoned
897
+ * CoT doesn't prevent the valid features from being returned
464
898
  */
465
- latestFeats(name: string, opts?: Static<typeof MissionOptions>): Promise<Static<typeof Feature.Feature>[]>;
899
+ latestFeats(name: string, opts?: Static<typeof MissionOptions>): Promise<Static<typeof MissionLatestFeats>>;
466
900
  /**
467
901
  * Return all current features in the Data Sync as CoT GeoJSON Features
468
902
  *
@@ -1,9 +1,9 @@
1
- import { xml2js } from '@tak-ps/xml-js';
2
- import CoT, { CoTParser } from '@tak-ps/node-cot';
1
+ import { CoTParser } from '@tak-ps/node-cot';
3
2
  import { Type } from '@sinclair/typebox';
4
3
  import Err from '@openaddresses/batch-error';
5
4
  import { TAKItem, TAKList } from './types.js';
6
5
  import { MissionLog } from './mission-log.js';
6
+ import { Feature } from '@tak-ps/node-cot';
7
7
  import Commands, { CommandOutputFormat } from '../commands.js';
8
8
  export var MissionSubscriberRole;
9
9
  (function (MissionSubscriberRole) {
@@ -99,6 +99,19 @@ export const MissionSubscriber = Type.Object({
99
99
  export const MissionOptions = Type.Object({
100
100
  token: Type.Optional(Type.String())
101
101
  });
102
+ /**
103
+ * A Mission CoT that could not be parsed or failed validation,
104
+ * with the raw xml-js event included so the caller can extract
105
+ * whatever context (UID, Callsign, etc.) it needs
106
+ */
107
+ export const MissionInvalidFeature = Type.Object({
108
+ error: Type.String(),
109
+ feature: Type.Unknown()
110
+ });
111
+ export const MissionLatestFeats = Type.Object({
112
+ features: Type.Array(Feature.Feature),
113
+ invalid: Type.Array(MissionInvalidFeature)
114
+ });
102
115
  export const AttachContentsInput = Type.Object({
103
116
  hashes: Type.Optional(Type.Array(Type.String())),
104
117
  uids: Type.Optional(Type.Array(Type.String())),
@@ -282,18 +295,32 @@ export default class MissionCommands extends Commands {
282
295
  }
283
296
  /**
284
297
  * Return all current features in the Data Sync as CoT GeoJSON Features
298
+ *
299
+ * Each CoT in the TAK Server response is parsed & validated individually -
300
+ * those that fail are returned in the `invalid` array so a single poisoned
301
+ * CoT doesn't prevent the valid features from being returned
285
302
  */
286
303
  async latestFeats(name, opts) {
287
- const feats = [];
288
- const res = xml2js(await this.latestCots(name, opts), { compact: true });
289
- if (!Object.keys(res.events).length)
290
- return feats;
291
- if (!res.events.event || (Array.isArray(res.events.event) && !res.events.event.length))
292
- return feats;
293
- for (const event of Array.isArray(res.events.event) ? res.events.event : [res.events.event]) {
294
- feats.push(await CoTParser.to_geojson(new CoT({ event })));
304
+ const features = [];
305
+ const res = CoTParser.from_xml_document(await this.latestCots(name, opts));
306
+ const invalid = res.invalid.map((entry) => {
307
+ return {
308
+ error: entry.error,
309
+ feature: entry.event
310
+ };
311
+ });
312
+ for (const cot of res.cots) {
313
+ try {
314
+ features.push(await CoTParser.to_geojson(cot));
315
+ }
316
+ catch (err) {
317
+ invalid.push({
318
+ error: err instanceof Error ? err.message : String(err),
319
+ feature: cot.raw.event
320
+ });
321
+ }
295
322
  }
296
- return feats;
323
+ return { features, invalid };
297
324
  }
298
325
  /**
299
326
  * Return all current features in the Data Sync as CoT GeoJSON Features