@camstack/types 1.2.304 → 1.2.306
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities/custom-model-registry.cap.d.ts +18 -0
- package/dist/capabilities/device-admin-link-url.d.ts +2 -2
- package/dist/capabilities/device-admin-link.cap.d.ts +1 -1
- package/dist/capabilities/device-manager.cap.d.ts +8 -8
- package/dist/capabilities/index.d.ts +8 -7
- package/dist/capabilities/local-network.cap.d.ts +18 -8
- package/dist/capabilities/model-convert.cap.d.ts +9 -0
- package/dist/capabilities/model-distributor.cap.d.ts +18 -0
- package/dist/capabilities/notification-rules.cap.d.ts +36 -4
- package/dist/capabilities/pipeline-executor.cap.d.ts +45 -0
- package/dist/capabilities/pipeline-runner.cap.d.ts +54 -0
- package/dist/capabilities/viewer-link-url.d.ts +104 -0
- package/dist/catalogs/classifier-fill.d.ts +104 -0
- package/dist/catalogs/frigate-plus-classmap.d.ts +49 -0
- package/dist/catalogs/index.d.ts +2 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.js +10514 -0
- package/dist/client.mjs +10440 -0
- package/dist/composition/evaluate-field.d.ts +12 -0
- package/dist/device/location-icon.d.ts +4 -4
- package/dist/device/site-zone.d.ts +2 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.js +987 -432
- package/dist/index.mjs +957 -433
- package/dist/interfaces/event-bus.d.ts +32 -0
- package/dist/interfaces/pipeline-runner-capability.d.ts +6 -0
- package/dist/notification/alarm-settings.d.ts +25 -0
- package/dist/pipeline/native-lease.d.ts +3 -3
- package/dist/types/models.d.ts +29 -0
- package/package.json +7 -2
package/dist/index.js
CHANGED
|
@@ -5346,6 +5346,567 @@ function resolveClipSearchMinScore(meta, request) {
|
|
|
5346
5346
|
return Math.min(1, Math.round(meta.searchMinScore * factor * 1e3) / 1e3);
|
|
5347
5347
|
}
|
|
5348
5348
|
//#endregion
|
|
5349
|
+
//#region src/catalogs/coco-classmap.ts
|
|
5350
|
+
var COCO_80_LABELS = [
|
|
5351
|
+
{
|
|
5352
|
+
id: "person",
|
|
5353
|
+
name: "Person"
|
|
5354
|
+
},
|
|
5355
|
+
{
|
|
5356
|
+
id: "bicycle",
|
|
5357
|
+
name: "Bicycle"
|
|
5358
|
+
},
|
|
5359
|
+
{
|
|
5360
|
+
id: "car",
|
|
5361
|
+
name: "Car"
|
|
5362
|
+
},
|
|
5363
|
+
{
|
|
5364
|
+
id: "motorcycle",
|
|
5365
|
+
name: "Motorcycle"
|
|
5366
|
+
},
|
|
5367
|
+
{
|
|
5368
|
+
id: "airplane",
|
|
5369
|
+
name: "Airplane"
|
|
5370
|
+
},
|
|
5371
|
+
{
|
|
5372
|
+
id: "bus",
|
|
5373
|
+
name: "Bus"
|
|
5374
|
+
},
|
|
5375
|
+
{
|
|
5376
|
+
id: "train",
|
|
5377
|
+
name: "Train"
|
|
5378
|
+
},
|
|
5379
|
+
{
|
|
5380
|
+
id: "truck",
|
|
5381
|
+
name: "Truck"
|
|
5382
|
+
},
|
|
5383
|
+
{
|
|
5384
|
+
id: "boat",
|
|
5385
|
+
name: "Boat"
|
|
5386
|
+
},
|
|
5387
|
+
{
|
|
5388
|
+
id: "traffic light",
|
|
5389
|
+
name: "Traffic Light"
|
|
5390
|
+
},
|
|
5391
|
+
{
|
|
5392
|
+
id: "fire hydrant",
|
|
5393
|
+
name: "Fire Hydrant"
|
|
5394
|
+
},
|
|
5395
|
+
{
|
|
5396
|
+
id: "stop sign",
|
|
5397
|
+
name: "Stop Sign"
|
|
5398
|
+
},
|
|
5399
|
+
{
|
|
5400
|
+
id: "parking meter",
|
|
5401
|
+
name: "Parking Meter"
|
|
5402
|
+
},
|
|
5403
|
+
{
|
|
5404
|
+
id: "bench",
|
|
5405
|
+
name: "Bench"
|
|
5406
|
+
},
|
|
5407
|
+
{
|
|
5408
|
+
id: "bird",
|
|
5409
|
+
name: "Bird"
|
|
5410
|
+
},
|
|
5411
|
+
{
|
|
5412
|
+
id: "cat",
|
|
5413
|
+
name: "Cat"
|
|
5414
|
+
},
|
|
5415
|
+
{
|
|
5416
|
+
id: "dog",
|
|
5417
|
+
name: "Dog"
|
|
5418
|
+
},
|
|
5419
|
+
{
|
|
5420
|
+
id: "horse",
|
|
5421
|
+
name: "Horse"
|
|
5422
|
+
},
|
|
5423
|
+
{
|
|
5424
|
+
id: "sheep",
|
|
5425
|
+
name: "Sheep"
|
|
5426
|
+
},
|
|
5427
|
+
{
|
|
5428
|
+
id: "cow",
|
|
5429
|
+
name: "Cow"
|
|
5430
|
+
},
|
|
5431
|
+
{
|
|
5432
|
+
id: "elephant",
|
|
5433
|
+
name: "Elephant"
|
|
5434
|
+
},
|
|
5435
|
+
{
|
|
5436
|
+
id: "bear",
|
|
5437
|
+
name: "Bear"
|
|
5438
|
+
},
|
|
5439
|
+
{
|
|
5440
|
+
id: "zebra",
|
|
5441
|
+
name: "Zebra"
|
|
5442
|
+
},
|
|
5443
|
+
{
|
|
5444
|
+
id: "giraffe",
|
|
5445
|
+
name: "Giraffe"
|
|
5446
|
+
},
|
|
5447
|
+
{
|
|
5448
|
+
id: "backpack",
|
|
5449
|
+
name: "Backpack"
|
|
5450
|
+
},
|
|
5451
|
+
{
|
|
5452
|
+
id: "umbrella",
|
|
5453
|
+
name: "Umbrella"
|
|
5454
|
+
},
|
|
5455
|
+
{
|
|
5456
|
+
id: "handbag",
|
|
5457
|
+
name: "Handbag"
|
|
5458
|
+
},
|
|
5459
|
+
{
|
|
5460
|
+
id: "tie",
|
|
5461
|
+
name: "Tie"
|
|
5462
|
+
},
|
|
5463
|
+
{
|
|
5464
|
+
id: "suitcase",
|
|
5465
|
+
name: "Suitcase"
|
|
5466
|
+
},
|
|
5467
|
+
{
|
|
5468
|
+
id: "frisbee",
|
|
5469
|
+
name: "Frisbee"
|
|
5470
|
+
},
|
|
5471
|
+
{
|
|
5472
|
+
id: "skis",
|
|
5473
|
+
name: "Skis"
|
|
5474
|
+
},
|
|
5475
|
+
{
|
|
5476
|
+
id: "snowboard",
|
|
5477
|
+
name: "Snowboard"
|
|
5478
|
+
},
|
|
5479
|
+
{
|
|
5480
|
+
id: "sports ball",
|
|
5481
|
+
name: "Sports Ball"
|
|
5482
|
+
},
|
|
5483
|
+
{
|
|
5484
|
+
id: "kite",
|
|
5485
|
+
name: "Kite"
|
|
5486
|
+
},
|
|
5487
|
+
{
|
|
5488
|
+
id: "baseball bat",
|
|
5489
|
+
name: "Baseball Bat"
|
|
5490
|
+
},
|
|
5491
|
+
{
|
|
5492
|
+
id: "baseball glove",
|
|
5493
|
+
name: "Baseball Glove"
|
|
5494
|
+
},
|
|
5495
|
+
{
|
|
5496
|
+
id: "skateboard",
|
|
5497
|
+
name: "Skateboard"
|
|
5498
|
+
},
|
|
5499
|
+
{
|
|
5500
|
+
id: "surfboard",
|
|
5501
|
+
name: "Surfboard"
|
|
5502
|
+
},
|
|
5503
|
+
{
|
|
5504
|
+
id: "tennis racket",
|
|
5505
|
+
name: "Tennis Racket"
|
|
5506
|
+
},
|
|
5507
|
+
{
|
|
5508
|
+
id: "bottle",
|
|
5509
|
+
name: "Bottle"
|
|
5510
|
+
},
|
|
5511
|
+
{
|
|
5512
|
+
id: "wine glass",
|
|
5513
|
+
name: "Wine Glass"
|
|
5514
|
+
},
|
|
5515
|
+
{
|
|
5516
|
+
id: "cup",
|
|
5517
|
+
name: "Cup"
|
|
5518
|
+
},
|
|
5519
|
+
{
|
|
5520
|
+
id: "fork",
|
|
5521
|
+
name: "Fork"
|
|
5522
|
+
},
|
|
5523
|
+
{
|
|
5524
|
+
id: "knife",
|
|
5525
|
+
name: "Knife"
|
|
5526
|
+
},
|
|
5527
|
+
{
|
|
5528
|
+
id: "spoon",
|
|
5529
|
+
name: "Spoon"
|
|
5530
|
+
},
|
|
5531
|
+
{
|
|
5532
|
+
id: "bowl",
|
|
5533
|
+
name: "Bowl"
|
|
5534
|
+
},
|
|
5535
|
+
{
|
|
5536
|
+
id: "banana",
|
|
5537
|
+
name: "Banana"
|
|
5538
|
+
},
|
|
5539
|
+
{
|
|
5540
|
+
id: "apple",
|
|
5541
|
+
name: "Apple"
|
|
5542
|
+
},
|
|
5543
|
+
{
|
|
5544
|
+
id: "sandwich",
|
|
5545
|
+
name: "Sandwich"
|
|
5546
|
+
},
|
|
5547
|
+
{
|
|
5548
|
+
id: "orange",
|
|
5549
|
+
name: "Orange"
|
|
5550
|
+
},
|
|
5551
|
+
{
|
|
5552
|
+
id: "broccoli",
|
|
5553
|
+
name: "Broccoli"
|
|
5554
|
+
},
|
|
5555
|
+
{
|
|
5556
|
+
id: "carrot",
|
|
5557
|
+
name: "Carrot"
|
|
5558
|
+
},
|
|
5559
|
+
{
|
|
5560
|
+
id: "hot dog",
|
|
5561
|
+
name: "Hot Dog"
|
|
5562
|
+
},
|
|
5563
|
+
{
|
|
5564
|
+
id: "pizza",
|
|
5565
|
+
name: "Pizza"
|
|
5566
|
+
},
|
|
5567
|
+
{
|
|
5568
|
+
id: "donut",
|
|
5569
|
+
name: "Donut"
|
|
5570
|
+
},
|
|
5571
|
+
{
|
|
5572
|
+
id: "cake",
|
|
5573
|
+
name: "Cake"
|
|
5574
|
+
},
|
|
5575
|
+
{
|
|
5576
|
+
id: "chair",
|
|
5577
|
+
name: "Chair"
|
|
5578
|
+
},
|
|
5579
|
+
{
|
|
5580
|
+
id: "couch",
|
|
5581
|
+
name: "Couch"
|
|
5582
|
+
},
|
|
5583
|
+
{
|
|
5584
|
+
id: "potted plant",
|
|
5585
|
+
name: "Potted Plant"
|
|
5586
|
+
},
|
|
5587
|
+
{
|
|
5588
|
+
id: "bed",
|
|
5589
|
+
name: "Bed"
|
|
5590
|
+
},
|
|
5591
|
+
{
|
|
5592
|
+
id: "dining table",
|
|
5593
|
+
name: "Dining Table"
|
|
5594
|
+
},
|
|
5595
|
+
{
|
|
5596
|
+
id: "toilet",
|
|
5597
|
+
name: "Toilet"
|
|
5598
|
+
},
|
|
5599
|
+
{
|
|
5600
|
+
id: "tv",
|
|
5601
|
+
name: "TV"
|
|
5602
|
+
},
|
|
5603
|
+
{
|
|
5604
|
+
id: "laptop",
|
|
5605
|
+
name: "Laptop"
|
|
5606
|
+
},
|
|
5607
|
+
{
|
|
5608
|
+
id: "mouse",
|
|
5609
|
+
name: "Mouse"
|
|
5610
|
+
},
|
|
5611
|
+
{
|
|
5612
|
+
id: "remote",
|
|
5613
|
+
name: "Remote"
|
|
5614
|
+
},
|
|
5615
|
+
{
|
|
5616
|
+
id: "keyboard",
|
|
5617
|
+
name: "Keyboard"
|
|
5618
|
+
},
|
|
5619
|
+
{
|
|
5620
|
+
id: "cell phone",
|
|
5621
|
+
name: "Cell Phone"
|
|
5622
|
+
},
|
|
5623
|
+
{
|
|
5624
|
+
id: "microwave",
|
|
5625
|
+
name: "Microwave"
|
|
5626
|
+
},
|
|
5627
|
+
{
|
|
5628
|
+
id: "oven",
|
|
5629
|
+
name: "Oven"
|
|
5630
|
+
},
|
|
5631
|
+
{
|
|
5632
|
+
id: "toaster",
|
|
5633
|
+
name: "Toaster"
|
|
5634
|
+
},
|
|
5635
|
+
{
|
|
5636
|
+
id: "sink",
|
|
5637
|
+
name: "Sink"
|
|
5638
|
+
},
|
|
5639
|
+
{
|
|
5640
|
+
id: "refrigerator",
|
|
5641
|
+
name: "Refrigerator"
|
|
5642
|
+
},
|
|
5643
|
+
{
|
|
5644
|
+
id: "book",
|
|
5645
|
+
name: "Book"
|
|
5646
|
+
},
|
|
5647
|
+
{
|
|
5648
|
+
id: "clock",
|
|
5649
|
+
name: "Clock"
|
|
5650
|
+
},
|
|
5651
|
+
{
|
|
5652
|
+
id: "vase",
|
|
5653
|
+
name: "Vase"
|
|
5654
|
+
},
|
|
5655
|
+
{
|
|
5656
|
+
id: "scissors",
|
|
5657
|
+
name: "Scissors"
|
|
5658
|
+
},
|
|
5659
|
+
{
|
|
5660
|
+
id: "teddy bear",
|
|
5661
|
+
name: "Teddy Bear"
|
|
5662
|
+
},
|
|
5663
|
+
{
|
|
5664
|
+
id: "hair drier",
|
|
5665
|
+
name: "Hair Drier"
|
|
5666
|
+
},
|
|
5667
|
+
{
|
|
5668
|
+
id: "toothbrush",
|
|
5669
|
+
name: "Toothbrush"
|
|
5670
|
+
}
|
|
5671
|
+
];
|
|
5672
|
+
var MACRO_LABELS = [
|
|
5673
|
+
{
|
|
5674
|
+
id: "person",
|
|
5675
|
+
name: "Person"
|
|
5676
|
+
},
|
|
5677
|
+
{
|
|
5678
|
+
id: "vehicle",
|
|
5679
|
+
name: "Vehicle"
|
|
5680
|
+
},
|
|
5681
|
+
{
|
|
5682
|
+
id: "animal",
|
|
5683
|
+
name: "Animal"
|
|
5684
|
+
},
|
|
5685
|
+
{
|
|
5686
|
+
id: "package",
|
|
5687
|
+
name: "Package"
|
|
5688
|
+
}
|
|
5689
|
+
];
|
|
5690
|
+
/**
|
|
5691
|
+
* The class names a per-class COUNT can ever be keyed on — the macro ids, and
|
|
5692
|
+
* only those.
|
|
5693
|
+
*
|
|
5694
|
+
* `preserveOriginal: false` below is the whole reason this set exists: the
|
|
5695
|
+
* executor maps each raw COCO label onto its macro and DROPS everything else,
|
|
5696
|
+
* so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
|
|
5697
|
+
* Any surface that indexes counts by class name — the ZoneAnalytics occupancy
|
|
5698
|
+
* snapshot's `byClass`, and therefore every occupancy rule — can match nothing
|
|
5699
|
+
* else. Derived from the catalog, never hand-listed, so a new macro joins it by
|
|
5700
|
+
* being declared once.
|
|
5701
|
+
*
|
|
5702
|
+
* Cost of not having it, 2026-08-12: the notification rule editor offered the
|
|
5703
|
+
* full taxonomy for an occupancy class (occupancy is the one condition that
|
|
5704
|
+
* does not go through the engine's macro-expanding `expandClassSelector`), two
|
|
5705
|
+
* live rules were authored on `car`, and both counters read 0 forever.
|
|
5706
|
+
*/
|
|
5707
|
+
var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
|
|
5708
|
+
/** True when `className` is a macro the detector can actually emit (and hence a
|
|
5709
|
+
* class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
|
|
5710
|
+
function isDetectionMacroClass(className) {
|
|
5711
|
+
return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
|
|
5712
|
+
}
|
|
5713
|
+
var COCO_TO_MACRO = {
|
|
5714
|
+
mapping: {
|
|
5715
|
+
person: "person",
|
|
5716
|
+
bicycle: "vehicle",
|
|
5717
|
+
car: "vehicle",
|
|
5718
|
+
motorcycle: "vehicle",
|
|
5719
|
+
airplane: "vehicle",
|
|
5720
|
+
bus: "vehicle",
|
|
5721
|
+
train: "vehicle",
|
|
5722
|
+
truck: "vehicle",
|
|
5723
|
+
boat: "vehicle",
|
|
5724
|
+
bird: "animal",
|
|
5725
|
+
cat: "animal",
|
|
5726
|
+
dog: "animal",
|
|
5727
|
+
horse: "animal",
|
|
5728
|
+
sheep: "animal",
|
|
5729
|
+
cow: "animal",
|
|
5730
|
+
elephant: "animal",
|
|
5731
|
+
bear: "animal",
|
|
5732
|
+
zebra: "animal",
|
|
5733
|
+
giraffe: "animal",
|
|
5734
|
+
suitcase: "package",
|
|
5735
|
+
backpack: "package",
|
|
5736
|
+
handbag: "package"
|
|
5737
|
+
},
|
|
5738
|
+
preserveOriginal: false
|
|
5739
|
+
};
|
|
5740
|
+
//#endregion
|
|
5741
|
+
//#region src/catalogs/classifier-fill.ts
|
|
5742
|
+
/** Steps a root detector may declare it fills. */
|
|
5743
|
+
var FILLABLE_STEP_IDS = [
|
|
5744
|
+
"animal-classifier",
|
|
5745
|
+
"vehicle-classifier",
|
|
5746
|
+
"package-detection"
|
|
5747
|
+
];
|
|
5748
|
+
/** Narrow a step id to a fillable one — type guard, not a cast. */
|
|
5749
|
+
function isFillableStepId(value) {
|
|
5750
|
+
return FILLABLE_STEP_IDS.some((id) => id === value);
|
|
5751
|
+
}
|
|
5752
|
+
/**
|
|
5753
|
+
* The EFFECT vocabulary of each fillable step: exactly the strings the step
|
|
5754
|
+
* itself emits, in its own spelling. A linked label is one of these and nothing
|
|
5755
|
+
* else, so a tier-1 value means the same thing whichever writer produced it.
|
|
5756
|
+
*
|
|
5757
|
+
* - `animal-classifier`: the PRIMARY model's `-labels.json` (Open Images V7,
|
|
5758
|
+
* 8 classes) — also the species allow-list the step offers.
|
|
5759
|
+
* - `vehicle-classifier`: `vehicle-type-v1-labels.json`, capitalised as the
|
|
5760
|
+
* model emits them (the classifier writes `winner.class` verbatim).
|
|
5761
|
+
* - `package-detection`: its one output class.
|
|
5762
|
+
*
|
|
5763
|
+
* `scripts/check-label-link-vocabulary.ts` fails the build if a model entry's
|
|
5764
|
+
* `labelToEffect` names anything outside this table.
|
|
5765
|
+
*/
|
|
5766
|
+
var FILLABLE_STEP_VOCABULARIES = {
|
|
5767
|
+
"animal-classifier": [
|
|
5768
|
+
"bird",
|
|
5769
|
+
"cat",
|
|
5770
|
+
"cow",
|
|
5771
|
+
"deer",
|
|
5772
|
+
"dog",
|
|
5773
|
+
"horse",
|
|
5774
|
+
"sheep",
|
|
5775
|
+
"squirrel"
|
|
5776
|
+
],
|
|
5777
|
+
"vehicle-classifier": [
|
|
5778
|
+
"Ambulance",
|
|
5779
|
+
"Bicycle",
|
|
5780
|
+
"Bus",
|
|
5781
|
+
"Car",
|
|
5782
|
+
"Motorcycle",
|
|
5783
|
+
"Taxi",
|
|
5784
|
+
"Truck",
|
|
5785
|
+
"Van"
|
|
5786
|
+
],
|
|
5787
|
+
"package-detection": ["package"]
|
|
5788
|
+
};
|
|
5789
|
+
/** The macro a detection must carry for the step to apply to it. */
|
|
5790
|
+
var FILLABLE_STEP_MACRO = {
|
|
5791
|
+
"animal-classifier": "animal",
|
|
5792
|
+
"vehicle-classifier": "vehicle",
|
|
5793
|
+
"package-detection": "package"
|
|
5794
|
+
};
|
|
5795
|
+
/**
|
|
5796
|
+
* Raw detector labels that name a vocabulary entry under another spelling.
|
|
5797
|
+
* Case-insensitive equality covers the rest (`car` → `Car`).
|
|
5798
|
+
*/
|
|
5799
|
+
var EFFECT_ALIASES = {
|
|
5800
|
+
"animal-classifier": {},
|
|
5801
|
+
"vehicle-classifier": {
|
|
5802
|
+
school_bus: "Bus",
|
|
5803
|
+
garbage_truck: "Truck"
|
|
5804
|
+
},
|
|
5805
|
+
"package-detection": {}
|
|
5806
|
+
};
|
|
5807
|
+
/** The policy values of a step's `labelLink` setting. */
|
|
5808
|
+
var LABEL_LINK_POLICIES = ["run", "skip-when-filled"];
|
|
5809
|
+
/** Absent setting ⇒ this. It changes nothing unless the root model declares a fill. */
|
|
5810
|
+
var DEFAULT_LABEL_LINK_POLICY = "skip-when-filled";
|
|
5811
|
+
/** The step-settings key the policy is stored under (DeviceStepConfig.settings). */
|
|
5812
|
+
var LABEL_LINK_SETTING_KEY = "labelLink";
|
|
5813
|
+
/** `ScoredLabel.stepId` prefix of a label the detector wrote for a step. */
|
|
5814
|
+
var LINKED_LABEL_STEP_PREFIX = "detector-link:";
|
|
5815
|
+
/** `detector-link:<stepId>` — the attribution of a linked label. */
|
|
5816
|
+
function linkedLabelStepId(stepId) {
|
|
5817
|
+
return `${LINKED_LABEL_STEP_PREFIX}${stepId}`;
|
|
5818
|
+
}
|
|
5819
|
+
/** The step a linked label stands in for, or `undefined` for any other attribution. */
|
|
5820
|
+
function linkedStepOf(attributionStepId) {
|
|
5821
|
+
if (attributionStepId === void 0) return void 0;
|
|
5822
|
+
if (!attributionStepId.startsWith("detector-link:")) return void 0;
|
|
5823
|
+
const stepId = attributionStepId.slice(14);
|
|
5824
|
+
return isFillableStepId(stepId) ? stepId : void 0;
|
|
5825
|
+
}
|
|
5826
|
+
/**
|
|
5827
|
+
* A labelmap is COCO when it carries at least half of the COCO-80 classes. A
|
|
5828
|
+
* COCO detector NEVER fills a step (operator decision, D715): its `dog` / `car`
|
|
5829
|
+
* is the generic class the classifier exists to refine, and its six animal
|
|
5830
|
+
* classes would otherwise read as "fills animal-classifier 6/8". Frigate+
|
|
5831
|
+
* shares about a dozen COCO names; a COCO-80 or COCO-91 labelmap carries ~80.
|
|
5832
|
+
*/
|
|
5833
|
+
function isCocoLabelmap(labels) {
|
|
5834
|
+
const present = new Set(labels);
|
|
5835
|
+
return COCO_80_LABELS.filter((l) => present.has(l.id)).length * 2 >= COCO_80_LABELS.length;
|
|
5836
|
+
}
|
|
5837
|
+
function effectFor(stepId, label) {
|
|
5838
|
+
const alias = EFFECT_ALIASES[stepId][label];
|
|
5839
|
+
if (alias !== void 0) return alias;
|
|
5840
|
+
const folded = label.toLowerCase();
|
|
5841
|
+
return FILLABLE_STEP_VOCABULARIES[stepId].find((v) => v.toLowerCase() === folded);
|
|
5842
|
+
}
|
|
5843
|
+
/**
|
|
5844
|
+
* Which steps a root detector fills, from its labelmap and classMap. A label
|
|
5845
|
+
* counts for a step only when the model's classMap sends it to that step's
|
|
5846
|
+
* macro AND it names a vocabulary entry. A step none of the labels reach is
|
|
5847
|
+
* not declared; a COCO labelmap declares nothing.
|
|
5848
|
+
*/
|
|
5849
|
+
function deriveClassifierFills(labels, classMap) {
|
|
5850
|
+
if (classMap === void 0 || isCocoLabelmap(labels)) return [];
|
|
5851
|
+
const fills = [];
|
|
5852
|
+
for (const stepId of FILLABLE_STEP_IDS) {
|
|
5853
|
+
const labelToEffect = {};
|
|
5854
|
+
for (const label of labels) {
|
|
5855
|
+
if (classMap.mapping[label] !== FILLABLE_STEP_MACRO[stepId]) continue;
|
|
5856
|
+
const effect = effectFor(stepId, label);
|
|
5857
|
+
if (effect !== void 0) labelToEffect[label] = effect;
|
|
5858
|
+
}
|
|
5859
|
+
const covered = new Set(Object.values(labelToEffect));
|
|
5860
|
+
if (covered.size === 0) continue;
|
|
5861
|
+
const uncovered = FILLABLE_STEP_VOCABULARIES[stepId].filter((v) => !covered.has(v));
|
|
5862
|
+
fills.push({
|
|
5863
|
+
stepId,
|
|
5864
|
+
labelToEffect,
|
|
5865
|
+
uncovered
|
|
5866
|
+
});
|
|
5867
|
+
}
|
|
5868
|
+
return fills;
|
|
5869
|
+
}
|
|
5870
|
+
/** The fill a model declares for one step, if any. */
|
|
5871
|
+
function fillFor(entry, stepId) {
|
|
5872
|
+
return entry?.fillsClassifierEffects?.find((f) => f.stepId === stepId);
|
|
5873
|
+
}
|
|
5874
|
+
/** Read the `labelLink` policy off a step's settings bag; anything else ⇒ the default. */
|
|
5875
|
+
function readLabelLinkPolicy(settings) {
|
|
5876
|
+
const raw = settings?.[LABEL_LINK_SETTING_KEY];
|
|
5877
|
+
return LABEL_LINK_POLICIES.find((p) => p === raw) ?? "skip-when-filled";
|
|
5878
|
+
}
|
|
5879
|
+
/**
|
|
5880
|
+
* Decide the writer of one filled effect for one camera.
|
|
5881
|
+
*
|
|
5882
|
+
* - The step is not running (disabled, or not in the camera's tree): the
|
|
5883
|
+
* detector is the only writer — authoritative, nothing to skip.
|
|
5884
|
+
* - The step runs, the policy is `skip-when-filled` and every coverage gap is
|
|
5885
|
+
* switched off in `enabledClasses`: the detector is authoritative and the
|
|
5886
|
+
* step is skipped.
|
|
5887
|
+
* - Otherwise the step runs and is the writer; the linked label is a score-0
|
|
5888
|
+
* fallback.
|
|
5889
|
+
*/
|
|
5890
|
+
function resolveLabelLink(fill, step) {
|
|
5891
|
+
const policy = readLabelLinkPolicy(step?.settings);
|
|
5892
|
+
const rawEnabled = step?.settings?.["enabledClasses"];
|
|
5893
|
+
const allowList = Array.isArray(rawEnabled) && rawEnabled.length > 0 ? rawEnabled.filter((v) => typeof v === "string") : null;
|
|
5894
|
+
const openGaps = fill.uncovered.filter((g) => allowList === null || allowList.includes(g));
|
|
5895
|
+
if (step === void 0 || !step.enabled) return {
|
|
5896
|
+
authoritative: true,
|
|
5897
|
+
skip: false,
|
|
5898
|
+
policy,
|
|
5899
|
+
openGaps
|
|
5900
|
+
};
|
|
5901
|
+
const skip = policy === "skip-when-filled" && openGaps.length === 0;
|
|
5902
|
+
return {
|
|
5903
|
+
authoritative: skip,
|
|
5904
|
+
skip,
|
|
5905
|
+
policy,
|
|
5906
|
+
openGaps
|
|
5907
|
+
};
|
|
5908
|
+
}
|
|
5909
|
+
//#endregion
|
|
5349
5910
|
//#region src/types/models.ts
|
|
5350
5911
|
var MODEL_FORMATS = [
|
|
5351
5912
|
"onnx",
|
|
@@ -5501,6 +6062,12 @@ var ModelLicenseRecordSchema = zod.z.object({
|
|
|
5501
6062
|
* `camstack/docs` → `/docs/detection/models`.
|
|
5502
6063
|
*/
|
|
5503
6064
|
var ModelLicenseSchema = zod.z.preprocess((value) => typeof value === "string" ? { weights: value } : value, ModelLicenseRecordSchema);
|
|
6065
|
+
/** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
|
|
6066
|
+
var FillsClassifierEffectSchema = zod.z.object({
|
|
6067
|
+
stepId: zod.z.enum(FILLABLE_STEP_IDS),
|
|
6068
|
+
labelToEffect: zod.z.record(zod.z.string(), zod.z.string()),
|
|
6069
|
+
uncovered: zod.z.array(zod.z.string()).readonly()
|
|
6070
|
+
});
|
|
5504
6071
|
var ModelCatalogEntrySchema = zod.z.object({
|
|
5505
6072
|
id: zod.z.string(),
|
|
5506
6073
|
name: zod.z.string(),
|
|
@@ -5627,6 +6194,16 @@ var ModelCatalogEntrySchema = zod.z.object({
|
|
|
5627
6194
|
*/
|
|
5628
6195
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
5629
6196
|
/**
|
|
6197
|
+
* The pipeline steps this ROOT detector already does the work of (D715):
|
|
6198
|
+
* its labels name the effect the step exists to produce (`deer` for
|
|
6199
|
+
* `animal-classifier`, `package` for `package-detection`). Derived from the
|
|
6200
|
+
* labelmap by `deriveClassifierFills`, never hand-written; a COCO model
|
|
6201
|
+
* declares none. Whether a declaration is honoured is the step's own
|
|
6202
|
+
* `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
|
|
6203
|
+
* `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
|
|
6204
|
+
*/
|
|
6205
|
+
fillsClassifierEffects: zod.z.array(FillsClassifierEffectSchema).readonly().optional(),
|
|
6206
|
+
/**
|
|
5630
6207
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
5631
6208
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
5632
6209
|
* CLIP image encoder; its absence is what "not a CLIP model" means to the
|
|
@@ -12460,7 +13037,7 @@ var detectionPipelineCapability = {
|
|
|
12460
13037
|
* This matters here more than anywhere else in the repo, because every provider
|
|
12461
13038
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
12462
13039
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
12463
|
-
* and `http://admin:hunter2@192.168.
|
|
13040
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
12464
13041
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
12465
13042
|
* filling it is the operator's business, not ours.
|
|
12466
13043
|
*
|
|
@@ -18014,398 +18591,6 @@ var notificationOutputCapability = {
|
|
|
18014
18591
|
}
|
|
18015
18592
|
};
|
|
18016
18593
|
//#endregion
|
|
18017
|
-
//#region src/catalogs/coco-classmap.ts
|
|
18018
|
-
var COCO_80_LABELS = [
|
|
18019
|
-
{
|
|
18020
|
-
id: "person",
|
|
18021
|
-
name: "Person"
|
|
18022
|
-
},
|
|
18023
|
-
{
|
|
18024
|
-
id: "bicycle",
|
|
18025
|
-
name: "Bicycle"
|
|
18026
|
-
},
|
|
18027
|
-
{
|
|
18028
|
-
id: "car",
|
|
18029
|
-
name: "Car"
|
|
18030
|
-
},
|
|
18031
|
-
{
|
|
18032
|
-
id: "motorcycle",
|
|
18033
|
-
name: "Motorcycle"
|
|
18034
|
-
},
|
|
18035
|
-
{
|
|
18036
|
-
id: "airplane",
|
|
18037
|
-
name: "Airplane"
|
|
18038
|
-
},
|
|
18039
|
-
{
|
|
18040
|
-
id: "bus",
|
|
18041
|
-
name: "Bus"
|
|
18042
|
-
},
|
|
18043
|
-
{
|
|
18044
|
-
id: "train",
|
|
18045
|
-
name: "Train"
|
|
18046
|
-
},
|
|
18047
|
-
{
|
|
18048
|
-
id: "truck",
|
|
18049
|
-
name: "Truck"
|
|
18050
|
-
},
|
|
18051
|
-
{
|
|
18052
|
-
id: "boat",
|
|
18053
|
-
name: "Boat"
|
|
18054
|
-
},
|
|
18055
|
-
{
|
|
18056
|
-
id: "traffic light",
|
|
18057
|
-
name: "Traffic Light"
|
|
18058
|
-
},
|
|
18059
|
-
{
|
|
18060
|
-
id: "fire hydrant",
|
|
18061
|
-
name: "Fire Hydrant"
|
|
18062
|
-
},
|
|
18063
|
-
{
|
|
18064
|
-
id: "stop sign",
|
|
18065
|
-
name: "Stop Sign"
|
|
18066
|
-
},
|
|
18067
|
-
{
|
|
18068
|
-
id: "parking meter",
|
|
18069
|
-
name: "Parking Meter"
|
|
18070
|
-
},
|
|
18071
|
-
{
|
|
18072
|
-
id: "bench",
|
|
18073
|
-
name: "Bench"
|
|
18074
|
-
},
|
|
18075
|
-
{
|
|
18076
|
-
id: "bird",
|
|
18077
|
-
name: "Bird"
|
|
18078
|
-
},
|
|
18079
|
-
{
|
|
18080
|
-
id: "cat",
|
|
18081
|
-
name: "Cat"
|
|
18082
|
-
},
|
|
18083
|
-
{
|
|
18084
|
-
id: "dog",
|
|
18085
|
-
name: "Dog"
|
|
18086
|
-
},
|
|
18087
|
-
{
|
|
18088
|
-
id: "horse",
|
|
18089
|
-
name: "Horse"
|
|
18090
|
-
},
|
|
18091
|
-
{
|
|
18092
|
-
id: "sheep",
|
|
18093
|
-
name: "Sheep"
|
|
18094
|
-
},
|
|
18095
|
-
{
|
|
18096
|
-
id: "cow",
|
|
18097
|
-
name: "Cow"
|
|
18098
|
-
},
|
|
18099
|
-
{
|
|
18100
|
-
id: "elephant",
|
|
18101
|
-
name: "Elephant"
|
|
18102
|
-
},
|
|
18103
|
-
{
|
|
18104
|
-
id: "bear",
|
|
18105
|
-
name: "Bear"
|
|
18106
|
-
},
|
|
18107
|
-
{
|
|
18108
|
-
id: "zebra",
|
|
18109
|
-
name: "Zebra"
|
|
18110
|
-
},
|
|
18111
|
-
{
|
|
18112
|
-
id: "giraffe",
|
|
18113
|
-
name: "Giraffe"
|
|
18114
|
-
},
|
|
18115
|
-
{
|
|
18116
|
-
id: "backpack",
|
|
18117
|
-
name: "Backpack"
|
|
18118
|
-
},
|
|
18119
|
-
{
|
|
18120
|
-
id: "umbrella",
|
|
18121
|
-
name: "Umbrella"
|
|
18122
|
-
},
|
|
18123
|
-
{
|
|
18124
|
-
id: "handbag",
|
|
18125
|
-
name: "Handbag"
|
|
18126
|
-
},
|
|
18127
|
-
{
|
|
18128
|
-
id: "tie",
|
|
18129
|
-
name: "Tie"
|
|
18130
|
-
},
|
|
18131
|
-
{
|
|
18132
|
-
id: "suitcase",
|
|
18133
|
-
name: "Suitcase"
|
|
18134
|
-
},
|
|
18135
|
-
{
|
|
18136
|
-
id: "frisbee",
|
|
18137
|
-
name: "Frisbee"
|
|
18138
|
-
},
|
|
18139
|
-
{
|
|
18140
|
-
id: "skis",
|
|
18141
|
-
name: "Skis"
|
|
18142
|
-
},
|
|
18143
|
-
{
|
|
18144
|
-
id: "snowboard",
|
|
18145
|
-
name: "Snowboard"
|
|
18146
|
-
},
|
|
18147
|
-
{
|
|
18148
|
-
id: "sports ball",
|
|
18149
|
-
name: "Sports Ball"
|
|
18150
|
-
},
|
|
18151
|
-
{
|
|
18152
|
-
id: "kite",
|
|
18153
|
-
name: "Kite"
|
|
18154
|
-
},
|
|
18155
|
-
{
|
|
18156
|
-
id: "baseball bat",
|
|
18157
|
-
name: "Baseball Bat"
|
|
18158
|
-
},
|
|
18159
|
-
{
|
|
18160
|
-
id: "baseball glove",
|
|
18161
|
-
name: "Baseball Glove"
|
|
18162
|
-
},
|
|
18163
|
-
{
|
|
18164
|
-
id: "skateboard",
|
|
18165
|
-
name: "Skateboard"
|
|
18166
|
-
},
|
|
18167
|
-
{
|
|
18168
|
-
id: "surfboard",
|
|
18169
|
-
name: "Surfboard"
|
|
18170
|
-
},
|
|
18171
|
-
{
|
|
18172
|
-
id: "tennis racket",
|
|
18173
|
-
name: "Tennis Racket"
|
|
18174
|
-
},
|
|
18175
|
-
{
|
|
18176
|
-
id: "bottle",
|
|
18177
|
-
name: "Bottle"
|
|
18178
|
-
},
|
|
18179
|
-
{
|
|
18180
|
-
id: "wine glass",
|
|
18181
|
-
name: "Wine Glass"
|
|
18182
|
-
},
|
|
18183
|
-
{
|
|
18184
|
-
id: "cup",
|
|
18185
|
-
name: "Cup"
|
|
18186
|
-
},
|
|
18187
|
-
{
|
|
18188
|
-
id: "fork",
|
|
18189
|
-
name: "Fork"
|
|
18190
|
-
},
|
|
18191
|
-
{
|
|
18192
|
-
id: "knife",
|
|
18193
|
-
name: "Knife"
|
|
18194
|
-
},
|
|
18195
|
-
{
|
|
18196
|
-
id: "spoon",
|
|
18197
|
-
name: "Spoon"
|
|
18198
|
-
},
|
|
18199
|
-
{
|
|
18200
|
-
id: "bowl",
|
|
18201
|
-
name: "Bowl"
|
|
18202
|
-
},
|
|
18203
|
-
{
|
|
18204
|
-
id: "banana",
|
|
18205
|
-
name: "Banana"
|
|
18206
|
-
},
|
|
18207
|
-
{
|
|
18208
|
-
id: "apple",
|
|
18209
|
-
name: "Apple"
|
|
18210
|
-
},
|
|
18211
|
-
{
|
|
18212
|
-
id: "sandwich",
|
|
18213
|
-
name: "Sandwich"
|
|
18214
|
-
},
|
|
18215
|
-
{
|
|
18216
|
-
id: "orange",
|
|
18217
|
-
name: "Orange"
|
|
18218
|
-
},
|
|
18219
|
-
{
|
|
18220
|
-
id: "broccoli",
|
|
18221
|
-
name: "Broccoli"
|
|
18222
|
-
},
|
|
18223
|
-
{
|
|
18224
|
-
id: "carrot",
|
|
18225
|
-
name: "Carrot"
|
|
18226
|
-
},
|
|
18227
|
-
{
|
|
18228
|
-
id: "hot dog",
|
|
18229
|
-
name: "Hot Dog"
|
|
18230
|
-
},
|
|
18231
|
-
{
|
|
18232
|
-
id: "pizza",
|
|
18233
|
-
name: "Pizza"
|
|
18234
|
-
},
|
|
18235
|
-
{
|
|
18236
|
-
id: "donut",
|
|
18237
|
-
name: "Donut"
|
|
18238
|
-
},
|
|
18239
|
-
{
|
|
18240
|
-
id: "cake",
|
|
18241
|
-
name: "Cake"
|
|
18242
|
-
},
|
|
18243
|
-
{
|
|
18244
|
-
id: "chair",
|
|
18245
|
-
name: "Chair"
|
|
18246
|
-
},
|
|
18247
|
-
{
|
|
18248
|
-
id: "couch",
|
|
18249
|
-
name: "Couch"
|
|
18250
|
-
},
|
|
18251
|
-
{
|
|
18252
|
-
id: "potted plant",
|
|
18253
|
-
name: "Potted Plant"
|
|
18254
|
-
},
|
|
18255
|
-
{
|
|
18256
|
-
id: "bed",
|
|
18257
|
-
name: "Bed"
|
|
18258
|
-
},
|
|
18259
|
-
{
|
|
18260
|
-
id: "dining table",
|
|
18261
|
-
name: "Dining Table"
|
|
18262
|
-
},
|
|
18263
|
-
{
|
|
18264
|
-
id: "toilet",
|
|
18265
|
-
name: "Toilet"
|
|
18266
|
-
},
|
|
18267
|
-
{
|
|
18268
|
-
id: "tv",
|
|
18269
|
-
name: "TV"
|
|
18270
|
-
},
|
|
18271
|
-
{
|
|
18272
|
-
id: "laptop",
|
|
18273
|
-
name: "Laptop"
|
|
18274
|
-
},
|
|
18275
|
-
{
|
|
18276
|
-
id: "mouse",
|
|
18277
|
-
name: "Mouse"
|
|
18278
|
-
},
|
|
18279
|
-
{
|
|
18280
|
-
id: "remote",
|
|
18281
|
-
name: "Remote"
|
|
18282
|
-
},
|
|
18283
|
-
{
|
|
18284
|
-
id: "keyboard",
|
|
18285
|
-
name: "Keyboard"
|
|
18286
|
-
},
|
|
18287
|
-
{
|
|
18288
|
-
id: "cell phone",
|
|
18289
|
-
name: "Cell Phone"
|
|
18290
|
-
},
|
|
18291
|
-
{
|
|
18292
|
-
id: "microwave",
|
|
18293
|
-
name: "Microwave"
|
|
18294
|
-
},
|
|
18295
|
-
{
|
|
18296
|
-
id: "oven",
|
|
18297
|
-
name: "Oven"
|
|
18298
|
-
},
|
|
18299
|
-
{
|
|
18300
|
-
id: "toaster",
|
|
18301
|
-
name: "Toaster"
|
|
18302
|
-
},
|
|
18303
|
-
{
|
|
18304
|
-
id: "sink",
|
|
18305
|
-
name: "Sink"
|
|
18306
|
-
},
|
|
18307
|
-
{
|
|
18308
|
-
id: "refrigerator",
|
|
18309
|
-
name: "Refrigerator"
|
|
18310
|
-
},
|
|
18311
|
-
{
|
|
18312
|
-
id: "book",
|
|
18313
|
-
name: "Book"
|
|
18314
|
-
},
|
|
18315
|
-
{
|
|
18316
|
-
id: "clock",
|
|
18317
|
-
name: "Clock"
|
|
18318
|
-
},
|
|
18319
|
-
{
|
|
18320
|
-
id: "vase",
|
|
18321
|
-
name: "Vase"
|
|
18322
|
-
},
|
|
18323
|
-
{
|
|
18324
|
-
id: "scissors",
|
|
18325
|
-
name: "Scissors"
|
|
18326
|
-
},
|
|
18327
|
-
{
|
|
18328
|
-
id: "teddy bear",
|
|
18329
|
-
name: "Teddy Bear"
|
|
18330
|
-
},
|
|
18331
|
-
{
|
|
18332
|
-
id: "hair drier",
|
|
18333
|
-
name: "Hair Drier"
|
|
18334
|
-
},
|
|
18335
|
-
{
|
|
18336
|
-
id: "toothbrush",
|
|
18337
|
-
name: "Toothbrush"
|
|
18338
|
-
}
|
|
18339
|
-
];
|
|
18340
|
-
var MACRO_LABELS = [
|
|
18341
|
-
{
|
|
18342
|
-
id: "person",
|
|
18343
|
-
name: "Person"
|
|
18344
|
-
},
|
|
18345
|
-
{
|
|
18346
|
-
id: "vehicle",
|
|
18347
|
-
name: "Vehicle"
|
|
18348
|
-
},
|
|
18349
|
-
{
|
|
18350
|
-
id: "animal",
|
|
18351
|
-
name: "Animal"
|
|
18352
|
-
},
|
|
18353
|
-
{
|
|
18354
|
-
id: "package",
|
|
18355
|
-
name: "Package"
|
|
18356
|
-
}
|
|
18357
|
-
];
|
|
18358
|
-
/**
|
|
18359
|
-
* The class names a per-class COUNT can ever be keyed on — the macro ids, and
|
|
18360
|
-
* only those.
|
|
18361
|
-
*
|
|
18362
|
-
* `preserveOriginal: false` below is the whole reason this set exists: the
|
|
18363
|
-
* executor maps each raw COCO label onto its macro and DROPS everything else,
|
|
18364
|
-
* so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
|
|
18365
|
-
* Any surface that indexes counts by class name — the ZoneAnalytics occupancy
|
|
18366
|
-
* snapshot's `byClass`, and therefore every occupancy rule — can match nothing
|
|
18367
|
-
* else. Derived from the catalog, never hand-listed, so a new macro joins it by
|
|
18368
|
-
* being declared once.
|
|
18369
|
-
*
|
|
18370
|
-
* Cost of not having it, 2026-08-12: the notification rule editor offered the
|
|
18371
|
-
* full taxonomy for an occupancy class (occupancy is the one condition that
|
|
18372
|
-
* does not go through the engine's macro-expanding `expandClassSelector`), two
|
|
18373
|
-
* live rules were authored on `car`, and both counters read 0 forever.
|
|
18374
|
-
*/
|
|
18375
|
-
var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
|
|
18376
|
-
/** True when `className` is a macro the detector can actually emit (and hence a
|
|
18377
|
-
* class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
|
|
18378
|
-
function isDetectionMacroClass(className) {
|
|
18379
|
-
return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
|
|
18380
|
-
}
|
|
18381
|
-
var COCO_TO_MACRO = {
|
|
18382
|
-
mapping: {
|
|
18383
|
-
person: "person",
|
|
18384
|
-
bicycle: "vehicle",
|
|
18385
|
-
car: "vehicle",
|
|
18386
|
-
motorcycle: "vehicle",
|
|
18387
|
-
airplane: "vehicle",
|
|
18388
|
-
bus: "vehicle",
|
|
18389
|
-
train: "vehicle",
|
|
18390
|
-
truck: "vehicle",
|
|
18391
|
-
boat: "vehicle",
|
|
18392
|
-
bird: "animal",
|
|
18393
|
-
cat: "animal",
|
|
18394
|
-
dog: "animal",
|
|
18395
|
-
horse: "animal",
|
|
18396
|
-
sheep: "animal",
|
|
18397
|
-
cow: "animal",
|
|
18398
|
-
elephant: "animal",
|
|
18399
|
-
bear: "animal",
|
|
18400
|
-
zebra: "animal",
|
|
18401
|
-
giraffe: "animal",
|
|
18402
|
-
suitcase: "package",
|
|
18403
|
-
backpack: "package",
|
|
18404
|
-
handbag: "package"
|
|
18405
|
-
},
|
|
18406
|
-
preserveOriginal: false
|
|
18407
|
-
};
|
|
18408
|
-
//#endregion
|
|
18409
18594
|
//#region src/catalogs/audio-classmap.ts
|
|
18410
18595
|
var AUDIO_MACRO_LABELS = [
|
|
18411
18596
|
{
|
|
@@ -19768,7 +19953,7 @@ var NcLegacyRuleActionSequenceSchema = zod.z.object({
|
|
|
19768
19953
|
minDelaySec: zod.z.number().int().min(0).max(86400).optional(),
|
|
19769
19954
|
actions: zod.z.array(NcRuleActionSchema).min(1)
|
|
19770
19955
|
});
|
|
19771
|
-
/** @deprecated */
|
|
19956
|
+
/** @deprecated Alias kept for call sites mid-migration; prefer {@link NcSharedSequence}. */
|
|
19772
19957
|
var NcRuleActionSequenceSchema = NcLegacyRuleActionSequenceSchema;
|
|
19773
19958
|
/**
|
|
19774
19959
|
* "This rule applies only while `deviceId` is in one of `states`."
|
|
@@ -20504,8 +20689,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
20504
20689
|
disabledTargetIds: zod.z.array(zod.z.string()).default([])
|
|
20505
20690
|
});
|
|
20506
20691
|
/**
|
|
20507
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
20508
|
-
* still-true state. `
|
|
20692
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
20693
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
20694
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
20509
20695
|
* job is not an open state, and the alarm stays instant.
|
|
20510
20696
|
*/
|
|
20511
20697
|
var NcStateSummarySectionIdSchema = zod.z.enum([
|
|
@@ -20517,6 +20703,7 @@ var NcStateSummarySectionIdSchema = zod.z.enum([
|
|
|
20517
20703
|
"detection-blind",
|
|
20518
20704
|
"nodes",
|
|
20519
20705
|
"addons",
|
|
20706
|
+
"addon-updates",
|
|
20520
20707
|
"updates"
|
|
20521
20708
|
]);
|
|
20522
20709
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -21555,7 +21742,19 @@ var NcAlarmModeDelaysSchema = zod.z.object({
|
|
|
21555
21742
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21556
21743
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21557
21744
|
*/
|
|
21558
|
-
schedule: NcScheduleSchema.optional()
|
|
21745
|
+
schedule: NcScheduleSchema.optional(),
|
|
21746
|
+
/**
|
|
21747
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
21748
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
21749
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
21750
|
+
*/
|
|
21751
|
+
notifyDuringEntryDelay: zod.z.boolean().optional(),
|
|
21752
|
+
/**
|
|
21753
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
21754
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
21755
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
21756
|
+
*/
|
|
21757
|
+
notifySensorRewatched: zod.z.boolean().optional()
|
|
21559
21758
|
});
|
|
21560
21759
|
var NcAlarmModeDelaysListSchema = zod.z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21561
21760
|
/**
|
|
@@ -21570,7 +21769,11 @@ var NcAlarmModeDelaysEditSchema = zod.z.object({
|
|
|
21570
21769
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21571
21770
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21572
21771
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21573
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
21772
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
21773
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21774
|
+
notifyDuringEntryDelay: zod.z.boolean().nullable().optional(),
|
|
21775
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21776
|
+
notifySensorRewatched: zod.z.boolean().nullable().optional()
|
|
21574
21777
|
});
|
|
21575
21778
|
var NcAlarmModeDelaysEditListSchema = zod.z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21576
21779
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
@@ -25765,7 +25968,8 @@ var PipelineModelOptionSchema = zod.z.object({
|
|
|
25765
25968
|
group: ModelVariantGroupSchema.optional(),
|
|
25766
25969
|
legacy: zod.z.boolean().optional(),
|
|
25767
25970
|
provider: ModelProviderIdSchema.optional(),
|
|
25768
|
-
defaultConfidence: zod.z.number().optional()
|
|
25971
|
+
defaultConfidence: zod.z.number().optional(),
|
|
25972
|
+
fillsClassifierEffects: zod.z.array(FillsClassifierEffectSchema).readonly().optional()
|
|
25769
25973
|
});
|
|
25770
25974
|
var ConfigFieldBridge = zod.z.custom();
|
|
25771
25975
|
var PipelineAddonSchemaSchema = zod.z.object({
|
|
@@ -26801,6 +27005,22 @@ var MotionSourceEnum = zod.z.enum([
|
|
|
26801
27005
|
"device-activity"
|
|
26802
27006
|
]);
|
|
26803
27007
|
/**
|
|
27008
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
27009
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
27010
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
27011
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
27012
|
+
* absent when unknown or when the camera itself triggered.
|
|
27013
|
+
*
|
|
27014
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
27015
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
27016
|
+
* runner never decides anything on it.
|
|
27017
|
+
*/
|
|
27018
|
+
var SessionTriggerSchema = zod.z.object({
|
|
27019
|
+
source: MotionSourceEnum,
|
|
27020
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
27021
|
+
sensorName: zod.z.string().optional()
|
|
27022
|
+
});
|
|
27023
|
+
/**
|
|
26804
27024
|
* List of motion sources active on a camera. Empty array is valid:
|
|
26805
27025
|
* "no source" — happens for battery cams without firmware motion when
|
|
26806
27026
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -27057,6 +27277,14 @@ var RunnerCameraConfigSchema = zod.z.object({
|
|
|
27057
27277
|
*/
|
|
27058
27278
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
27059
27279
|
/**
|
|
27280
|
+
* What opened this attach, on a SESSION attach only (see
|
|
27281
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
27282
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
27283
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
27284
|
+
* runner then names no source on the phase event.
|
|
27285
|
+
*/
|
|
27286
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
27287
|
+
/**
|
|
27060
27288
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
27061
27289
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
27062
27290
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -32212,6 +32440,122 @@ var CLIP_PLAYBACK_OPTIONS = {
|
|
|
32212
32440
|
}
|
|
32213
32441
|
};
|
|
32214
32442
|
//#endregion
|
|
32443
|
+
//#region src/capabilities/viewer-link-url.ts
|
|
32444
|
+
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
32445
|
+
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
32446
|
+
/** Where the hub serves the viewer SPA. */
|
|
32447
|
+
var HUB_VIEWER_MOUNT = "/viewer/camstack";
|
|
32448
|
+
/** True when `baseUrl` names the CamStack app link rather than a hub address. */
|
|
32449
|
+
function isAppLinkBase(baseUrl) {
|
|
32450
|
+
if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
|
|
32451
|
+
try {
|
|
32452
|
+
return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
|
|
32453
|
+
} catch {
|
|
32454
|
+
return false;
|
|
32455
|
+
}
|
|
32456
|
+
}
|
|
32457
|
+
/**
|
|
32458
|
+
* The base a viewer link is built on, from the flagged notification address:
|
|
32459
|
+
* the effective address is the explicit choice, else AUTO's `resolved`. The
|
|
32460
|
+
* one reading of that answer — the NC's tap and the Network page's preview
|
|
32461
|
+
* both go through it.
|
|
32462
|
+
*/
|
|
32463
|
+
function viewerLinkBaseOf(endpoint) {
|
|
32464
|
+
const flagged = endpoint.baseUrl ?? endpoint.resolved;
|
|
32465
|
+
return isAppLinkBase(flagged) ? {
|
|
32466
|
+
form: "app",
|
|
32467
|
+
hubBaseUrl: endpoint.appLinkHub ?? null
|
|
32468
|
+
} : {
|
|
32469
|
+
form: "hub",
|
|
32470
|
+
hubBaseUrl: flagged
|
|
32471
|
+
};
|
|
32472
|
+
}
|
|
32473
|
+
/**
|
|
32474
|
+
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
32475
|
+
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
32476
|
+
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
32477
|
+
* viewer under the origin itself.
|
|
32478
|
+
*/
|
|
32479
|
+
function toAppLinkHubOrigin(baseUrl) {
|
|
32480
|
+
let parsed;
|
|
32481
|
+
try {
|
|
32482
|
+
parsed = new URL(baseUrl);
|
|
32483
|
+
} catch {
|
|
32484
|
+
return null;
|
|
32485
|
+
}
|
|
32486
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
32487
|
+
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
32488
|
+
if (parsed.hostname === "") return null;
|
|
32489
|
+
return parsed.origin;
|
|
32490
|
+
}
|
|
32491
|
+
/**
|
|
32492
|
+
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
32493
|
+
* advertised palette so it always agrees with what the Network page lists:
|
|
32494
|
+
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
32495
|
+
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
32496
|
+
* when the hub advertises neither.
|
|
32497
|
+
*/
|
|
32498
|
+
function pickAppLinkHub(endpoints) {
|
|
32499
|
+
const rank = (e) => {
|
|
32500
|
+
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
32501
|
+
if (e.interfaceKind === "public") return 0;
|
|
32502
|
+
if (e.interfaceKind === "vpn") return 1;
|
|
32503
|
+
return null;
|
|
32504
|
+
};
|
|
32505
|
+
return endpoints.flatMap((e) => {
|
|
32506
|
+
const r = rank(e);
|
|
32507
|
+
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
32508
|
+
return r === null || origin === null ? [] : [{
|
|
32509
|
+
r,
|
|
32510
|
+
p: e.priority,
|
|
32511
|
+
origin
|
|
32512
|
+
}];
|
|
32513
|
+
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
32514
|
+
}
|
|
32515
|
+
/** The viewer route for a destination, or null when it names nothing. */
|
|
32516
|
+
function viewerRoute(destination) {
|
|
32517
|
+
switch (destination.kind) {
|
|
32518
|
+
case "camera": {
|
|
32519
|
+
if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
|
|
32520
|
+
const at = destination.atMs;
|
|
32521
|
+
return {
|
|
32522
|
+
path: `/camera/${String(destination.deviceId)}`,
|
|
32523
|
+
query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
|
|
32524
|
+
};
|
|
32525
|
+
}
|
|
32526
|
+
case "events": return {
|
|
32527
|
+
path: "/events",
|
|
32528
|
+
query: []
|
|
32529
|
+
};
|
|
32530
|
+
case "notifications": return {
|
|
32531
|
+
path: "/notifications",
|
|
32532
|
+
query: []
|
|
32533
|
+
};
|
|
32534
|
+
}
|
|
32535
|
+
}
|
|
32536
|
+
function encodeQuery(query) {
|
|
32537
|
+
if (query.length === 0) return "";
|
|
32538
|
+
return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
|
|
32539
|
+
}
|
|
32540
|
+
/**
|
|
32541
|
+
* The link for a viewer destination, or `null` when none can be minted: an
|
|
32542
|
+
* unknown destination, or the `hub` form with no reachable base (a dead link
|
|
32543
|
+
* is worse than none).
|
|
32544
|
+
*/
|
|
32545
|
+
function buildViewerLink(input) {
|
|
32546
|
+
const route = viewerRoute(input.destination);
|
|
32547
|
+
if (route === null) return null;
|
|
32548
|
+
const raw = input.base.hubBaseUrl;
|
|
32549
|
+
const base = raw === null ? "" : raw.replace(/\/+$/, "");
|
|
32550
|
+
if (input.base.form === "app") {
|
|
32551
|
+
const origin = base === "" ? null : toAppLinkHubOrigin(base);
|
|
32552
|
+
const query = origin === null ? route.query : [...route.query, ["hub", origin]];
|
|
32553
|
+
return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
|
|
32554
|
+
}
|
|
32555
|
+
if (base === "" || isAppLinkBase(base)) return null;
|
|
32556
|
+
return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
|
|
32557
|
+
}
|
|
32558
|
+
//#endregion
|
|
32215
32559
|
//#region src/capabilities/webrtc-session.cap.ts
|
|
32216
32560
|
/**
|
|
32217
32561
|
* Optional client-side hints sent at session creation to help the provider
|
|
@@ -37085,7 +37429,7 @@ var LocalInterfaceSchema = zod.z.object({
|
|
|
37085
37429
|
name: zod.z.string(),
|
|
37086
37430
|
family: zod.z.enum(["IPv4", "IPv6"]),
|
|
37087
37431
|
address: zod.z.string(),
|
|
37088
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
37432
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
37089
37433
|
cidr: zod.z.string(),
|
|
37090
37434
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
37091
37435
|
netmask: zod.z.string(),
|
|
@@ -37139,7 +37483,8 @@ var ConnectionEndpointSchema = zod.z.object({
|
|
|
37139
37483
|
"lan-ipv4",
|
|
37140
37484
|
"lan-ipv6",
|
|
37141
37485
|
"public",
|
|
37142
|
-
"loopback"
|
|
37486
|
+
"loopback",
|
|
37487
|
+
"app-link"
|
|
37143
37488
|
]),
|
|
37144
37489
|
/**
|
|
37145
37490
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -37208,15 +37553,27 @@ var GetConnectionEndpointsResultSchema = zod.z.object({
|
|
|
37208
37553
|
localPort: AdvertisedLocalPortSchema
|
|
37209
37554
|
});
|
|
37210
37555
|
/**
|
|
37211
|
-
* The
|
|
37212
|
-
*
|
|
37213
|
-
*
|
|
37556
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
37557
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
37558
|
+
* so the UI can show it either way.
|
|
37214
37559
|
*/
|
|
37215
37560
|
var NotificationEndpointSchema = zod.z.object({
|
|
37216
37561
|
/** The operator's explicit choice, or null for AUTO. */
|
|
37217
37562
|
baseUrl: zod.z.string().nullable(),
|
|
37218
|
-
/**
|
|
37219
|
-
|
|
37563
|
+
/**
|
|
37564
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
37565
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
37566
|
+
* answered the public tunnel / mesh here, or null.
|
|
37567
|
+
*/
|
|
37568
|
+
resolved: zod.z.string().nullable(),
|
|
37569
|
+
/**
|
|
37570
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
37571
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
37572
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
37573
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
37574
|
+
* Absent on a pre-D709 hub.
|
|
37575
|
+
*/
|
|
37576
|
+
appLinkHub: zod.z.string().nullable()
|
|
37220
37577
|
});
|
|
37221
37578
|
/**
|
|
37222
37579
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -37284,7 +37641,7 @@ var localNetworkCapability = {
|
|
|
37284
37641
|
* every client a second authority on a socket only the hub binds. A viewer
|
|
37285
37642
|
* configured with a port-less public URL (`https://camstack.example.top`)
|
|
37286
37643
|
* infers 443 from the scheme, asks with 443, and was handed
|
|
37287
|
-
* `https://192.168.
|
|
37644
|
+
* `https://192.168.10.9:443` for a hub listening on 4443. That candidate
|
|
37288
37645
|
* cannot ever answer, and losing its race reads in the log exactly like
|
|
37289
37646
|
* "the LAN was tried and it was slower" — so an operator sitting on his own
|
|
37290
37647
|
* WiFi stayed on the public tunnel for weeks, with the LAN candidate born
|
|
@@ -37317,13 +37674,21 @@ var localNetworkCapability = {
|
|
|
37317
37674
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
37318
37675
|
* to avoid mixed-content blocks in the browser. The public
|
|
37319
37676
|
* tunnel always emits `https://` regardless. */
|
|
37320
|
-
scheme: zod.z.enum(["http", "https"]).optional()
|
|
37677
|
+
scheme: zod.z.enum(["http", "https"]).optional(),
|
|
37678
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
37679
|
+
* an address notification links can be flagged with, not a hub
|
|
37680
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
37681
|
+
includeAppLink: zod.z.boolean().optional()
|
|
37321
37682
|
}), GetConnectionEndpointsResultSchema),
|
|
37322
37683
|
/**
|
|
37323
|
-
* The
|
|
37324
|
-
*
|
|
37325
|
-
*
|
|
37326
|
-
*
|
|
37684
|
+
* The address notification links are flagged with. `baseUrl: null` means
|
|
37685
|
+
* AUTO, which is the CamStack app link (D709): viewer taps go through
|
|
37686
|
+
* `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
|
|
37687
|
+
* hub address the palette lists can be flagged instead; then viewer taps,
|
|
37688
|
+
* attachment links and action buttons all use it. Signed media and
|
|
37689
|
+
* buttons never use the app link — with it flagged (or AUTO) they keep
|
|
37690
|
+
* the ranked hub ladder (a configured origin, a connected tunnel, then
|
|
37691
|
+
* the LAN), never loopback.
|
|
37327
37692
|
*
|
|
37328
37693
|
* Why an explicit marker: the automatic ranking cannot know which of
|
|
37329
37694
|
* several reachable addresses the RECIPIENT can actually open. A link is
|
|
@@ -37743,7 +38108,7 @@ var MeshPeerSchema = zod.z.object({
|
|
|
37743
38108
|
tags: zod.z.array(zod.z.string()).readonly(),
|
|
37744
38109
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
37745
38110
|
exitNodeOption: zod.z.boolean(),
|
|
37746
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
38111
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
37747
38112
|
advertisedRoutes: zod.z.array(zod.z.string()).readonly(),
|
|
37748
38113
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
37749
38114
|
userLogin: zod.z.string().nullable(),
|
|
@@ -47092,7 +47457,8 @@ function expressionOutcome(source, read, now, stateful) {
|
|
|
47092
47457
|
value: null,
|
|
47093
47458
|
reason: `the expression failed: ${result.error}`,
|
|
47094
47459
|
fatal: false,
|
|
47095
|
-
confirmed: true
|
|
47460
|
+
confirmed: true,
|
|
47461
|
+
expressionFailed: true
|
|
47096
47462
|
};
|
|
47097
47463
|
return {
|
|
47098
47464
|
state: staleReasons.length > 0 ? "stale" : "fresh",
|
|
@@ -47442,6 +47808,116 @@ function convertPresetFeature(input) {
|
|
|
47442
47808
|
};
|
|
47443
47809
|
}
|
|
47444
47810
|
//#endregion
|
|
47811
|
+
//#region src/catalogs/frigate-plus-classmap.ts
|
|
47812
|
+
function isClassMapMacroTarget(value) {
|
|
47813
|
+
return CLASS_MAP_MACRO_TARGETS.some((target) => target === value);
|
|
47814
|
+
}
|
|
47815
|
+
/**
|
|
47816
|
+
* Raw Frigate+ label → detection macro. Every label of the documented
|
|
47817
|
+
* Frigate+ base set (docs.frigate.video/plus, verified 2026-08-21) is either
|
|
47818
|
+
* here or in {@link FRIGATE_PLUS_UNMAPPED_LABELS}, with the reason it is not.
|
|
47819
|
+
*
|
|
47820
|
+
* Why this exists: a Frigate+ import used to carry NO classMap, so it inherited
|
|
47821
|
+
* the step's `COCO_TO_MACRO` (`preserveOriginal: false`) and the executor
|
|
47822
|
+
* dropped every label COCO does not name — deer, raccoon, fox, squirrel, goat,
|
|
47823
|
+
* rabbit, skunk, kangaroo, possum, rodent, school_bus, garbage_truck and even
|
|
47824
|
+
* `package` vanished as `class-filter` discards. The executor keeps the raw
|
|
47825
|
+
* label as `originalClass` whenever the map resolves it, so the fine identity
|
|
47826
|
+
* survives under the macro.
|
|
47827
|
+
*/
|
|
47828
|
+
var FRIGATE_PLUS_TO_MACRO = {
|
|
47829
|
+
person: "person",
|
|
47830
|
+
baby: "person",
|
|
47831
|
+
car: "vehicle",
|
|
47832
|
+
motorcycle: "vehicle",
|
|
47833
|
+
bicycle: "vehicle",
|
|
47834
|
+
boat: "vehicle",
|
|
47835
|
+
school_bus: "vehicle",
|
|
47836
|
+
garbage_truck: "vehicle",
|
|
47837
|
+
dog: "animal",
|
|
47838
|
+
cat: "animal",
|
|
47839
|
+
deer: "animal",
|
|
47840
|
+
horse: "animal",
|
|
47841
|
+
bird: "animal",
|
|
47842
|
+
raccoon: "animal",
|
|
47843
|
+
fox: "animal",
|
|
47844
|
+
bear: "animal",
|
|
47845
|
+
cow: "animal",
|
|
47846
|
+
squirrel: "animal",
|
|
47847
|
+
goat: "animal",
|
|
47848
|
+
rabbit: "animal",
|
|
47849
|
+
skunk: "animal",
|
|
47850
|
+
kangaroo: "animal",
|
|
47851
|
+
possum: "animal",
|
|
47852
|
+
rodent: "animal",
|
|
47853
|
+
package: "package"
|
|
47854
|
+
};
|
|
47855
|
+
/**
|
|
47856
|
+
* Frigate+ labels deliberately left OUT of {@link FRIGATE_PLUS_TO_MACRO}.
|
|
47857
|
+
*
|
|
47858
|
+
* - `attribute`: Frigate+ emits these INSIDE a parent box (a face inside a
|
|
47859
|
+
* person, a plate or a carrier logo on a vehicle). Mapping one to its
|
|
47860
|
+
* parent's macro would spawn a second, overlapping track for the same
|
|
47861
|
+
* subject; CamStack derives faces and plates with its own detail steps.
|
|
47862
|
+
* - `no-macro`: an object with no detection macro to live under.
|
|
47863
|
+
*/
|
|
47864
|
+
var FRIGATE_PLUS_UNMAPPED_LABELS = {
|
|
47865
|
+
face: "attribute",
|
|
47866
|
+
license_plate: "attribute",
|
|
47867
|
+
amazon: "attribute",
|
|
47868
|
+
usps: "attribute",
|
|
47869
|
+
ups: "attribute",
|
|
47870
|
+
fedex: "attribute",
|
|
47871
|
+
dhl: "attribute",
|
|
47872
|
+
an_post: "attribute",
|
|
47873
|
+
purolator: "attribute",
|
|
47874
|
+
postnl: "attribute",
|
|
47875
|
+
nzpost: "attribute",
|
|
47876
|
+
postnord: "attribute",
|
|
47877
|
+
gls: "attribute",
|
|
47878
|
+
dpd: "attribute",
|
|
47879
|
+
canada_post: "attribute",
|
|
47880
|
+
royal_mail: "attribute",
|
|
47881
|
+
waste_bin: "no-macro",
|
|
47882
|
+
bbq_grill: "no-macro",
|
|
47883
|
+
robot_lawnmower: "no-macro",
|
|
47884
|
+
umbrella: "no-macro",
|
|
47885
|
+
baby_stroller: "no-macro"
|
|
47886
|
+
};
|
|
47887
|
+
/**
|
|
47888
|
+
* The per-model classMap for a Frigate / Frigate+ detector, derived from ITS
|
|
47889
|
+
* labelmap: each label resolves through {@link FRIGATE_PLUS_TO_MACRO} first,
|
|
47890
|
+
* then `COCO_TO_MACRO` (Frigate's default model ships the COCO-91 labelmap, so
|
|
47891
|
+
* a preset import may carry either vocabulary). A label neither knows is left
|
|
47892
|
+
* out, and `preserveOriginal: false` drops it in the executor — the same
|
|
47893
|
+
* contract as the COCO map, now with the Frigate+ vocabulary in it.
|
|
47894
|
+
*/
|
|
47895
|
+
function buildFrigateClassMap(labels) {
|
|
47896
|
+
const mapping = {};
|
|
47897
|
+
for (const label of labels) {
|
|
47898
|
+
const target = FRIGATE_PLUS_TO_MACRO[label] ?? COCO_TO_MACRO.mapping[label];
|
|
47899
|
+
if (target !== void 0 && isClassMapMacroTarget(target)) mapping[label] = target;
|
|
47900
|
+
}
|
|
47901
|
+
return {
|
|
47902
|
+
mapping,
|
|
47903
|
+
preserveOriginal: false
|
|
47904
|
+
};
|
|
47905
|
+
}
|
|
47906
|
+
/**
|
|
47907
|
+
* Everything a Frigate / Frigate+ entry derives from its labelmap: the classMap
|
|
47908
|
+
* and the steps it fills (D715). Every Frigate builder spreads this, so the two
|
|
47909
|
+
* cannot be derived from different label lists. A COCO labelmap gets its map
|
|
47910
|
+
* and no fill.
|
|
47911
|
+
*/
|
|
47912
|
+
function frigateLabelFields(labels) {
|
|
47913
|
+
const classMap = buildFrigateClassMap(labels);
|
|
47914
|
+
const fills = deriveClassifierFills(labels, classMap);
|
|
47915
|
+
return fills.length > 0 ? {
|
|
47916
|
+
classMap,
|
|
47917
|
+
fillsClassifierEffects: fills
|
|
47918
|
+
} : { classMap };
|
|
47919
|
+
}
|
|
47920
|
+
//#endregion
|
|
47445
47921
|
//#region src/catalogs/device-state-vocabulary.ts
|
|
47446
47922
|
/**
|
|
47447
47923
|
* Most specific first. Extending this list is how a new device kind becomes
|
|
@@ -66902,12 +67378,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
66902
67378
|
{
|
|
66903
67379
|
id: "addons",
|
|
66904
67380
|
family: "system",
|
|
66905
|
-
label: "Addons",
|
|
66906
|
-
kinds: [
|
|
66907
|
-
|
|
66908
|
-
|
|
66909
|
-
|
|
66910
|
-
|
|
67381
|
+
label: "Addons stopped",
|
|
67382
|
+
kinds: ["addon-crash-loop"]
|
|
67383
|
+
},
|
|
67384
|
+
{
|
|
67385
|
+
id: "addon-updates",
|
|
67386
|
+
family: "system",
|
|
67387
|
+
label: "Addon updates",
|
|
67388
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
66911
67389
|
},
|
|
66912
67390
|
{
|
|
66913
67391
|
id: "updates",
|
|
@@ -67754,6 +68232,26 @@ var NC_ALARM_DELAY_FIELDS = [
|
|
|
67754
68232
|
"triggeredDurationSec"
|
|
67755
68233
|
];
|
|
67756
68234
|
/**
|
|
68235
|
+
* The STOCK after-trigger duration a panel seeds and every mode inherits unless it sets its
|
|
68236
|
+
* own (D706: 30 s, was 10 s under D701). Only the seed: a persisted value is never rewritten.
|
|
68237
|
+
* The panel's defaults, its one-shot migration and the admin UI's "pick a timed action" fill
|
|
68238
|
+
* all read this one constant.
|
|
68239
|
+
*/
|
|
68240
|
+
var NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = 30;
|
|
68241
|
+
var NC_ALARM_NOTIFY_FIELDS = ["notifyDuringEntryDelay", "notifySensorRewatched"];
|
|
68242
|
+
/**
|
|
68243
|
+
* The switches `mode` runs on. There is no global value: absent is OFF (operator decision
|
|
68244
|
+
* 2026-10-06 — the entry-delay notification is the only one by default, and "watched again"
|
|
68245
|
+
* is not sent). An answer from an older hub carries no switch and reads as off.
|
|
68246
|
+
*/
|
|
68247
|
+
function resolveModeNotifyPolicy(settings, mode) {
|
|
68248
|
+
const entry = (settings.modeDelays ?? []).find((e) => e.mode === mode);
|
|
68249
|
+
return {
|
|
68250
|
+
notifyDuringEntryDelay: entry?.notifyDuringEntryDelay === true,
|
|
68251
|
+
notifySensorRewatched: entry?.notifySensorRewatched === true
|
|
68252
|
+
};
|
|
68253
|
+
}
|
|
68254
|
+
/**
|
|
67757
68255
|
* Derive the post-triggered action from a stored blob that may predate the field:
|
|
67758
68256
|
* a positive duration meant re-arm; zero/absent meant stay triggered.
|
|
67759
68257
|
*/
|
|
@@ -67802,6 +68300,10 @@ function editedAction(current, edit) {
|
|
|
67802
68300
|
if (edit === void 0) return current;
|
|
67803
68301
|
return edit === null ? void 0 : edit;
|
|
67804
68302
|
}
|
|
68303
|
+
function editedFlag(current, edit) {
|
|
68304
|
+
if (edit === void 0) return current;
|
|
68305
|
+
return edit === null ? void 0 : edit;
|
|
68306
|
+
}
|
|
67805
68307
|
function editedSchedule(current, edit) {
|
|
67806
68308
|
if (edit === void 0) return current;
|
|
67807
68309
|
return edit === null ? void 0 : edit;
|
|
@@ -67836,15 +68338,19 @@ function applyModeDelaysEdits(current, edits) {
|
|
|
67836
68338
|
const triggered = edited(base.triggeredDurationSec, edit.triggeredDurationSec);
|
|
67837
68339
|
const action = editedAction(base.postTriggeredAction, edit.postTriggeredAction);
|
|
67838
68340
|
const schedule = editedSchedule(base.schedule, edit.schedule);
|
|
68341
|
+
const duringEntry = editedFlag(base.notifyDuringEntryDelay, edit.notifyDuringEntryDelay);
|
|
68342
|
+
const rewatched = editedFlag(base.notifySensorRewatched, edit.notifySensorRewatched);
|
|
67839
68343
|
if (exit !== void 0) next.exitDelaySec = exit;
|
|
67840
68344
|
if (entry !== void 0) next.entryDelaySec = entry;
|
|
67841
68345
|
if (triggered !== void 0) next.triggeredDurationSec = triggered;
|
|
67842
68346
|
if (action !== void 0) next.postTriggeredAction = action;
|
|
67843
68347
|
if (schedule !== void 0) next.schedule = schedule;
|
|
68348
|
+
if (duringEntry !== void 0) next.notifyDuringEntryDelay = duringEntry;
|
|
68349
|
+
if (rewatched !== void 0) next.notifySensorRewatched = rewatched;
|
|
67844
68350
|
if (at >= 0) out[at] = next;
|
|
67845
68351
|
else out.push(next);
|
|
67846
68352
|
}
|
|
67847
|
-
return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0);
|
|
68353
|
+
return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0 || e.notifyDuringEntryDelay !== void 0 || e.notifySensorRewatched !== void 0);
|
|
67848
68354
|
}
|
|
67849
68355
|
/**
|
|
67850
68356
|
* Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
|
|
@@ -67989,6 +68495,12 @@ function alarmPatchLanded(patch, returned) {
|
|
|
67989
68495
|
const got = entry?.postTriggeredAction;
|
|
67990
68496
|
if (edit.postTriggeredAction === null ? got !== void 0 : got !== edit.postTriggeredAction) return false;
|
|
67991
68497
|
}
|
|
68498
|
+
for (const field of NC_ALARM_NOTIFY_FIELDS) {
|
|
68499
|
+
const want = edit[field];
|
|
68500
|
+
if (want === void 0) continue;
|
|
68501
|
+
const got = entry?.[field];
|
|
68502
|
+
if (want === null ? got !== void 0 : got !== want) return false;
|
|
68503
|
+
}
|
|
67992
68504
|
if (edit.schedule !== void 0) {
|
|
67993
68505
|
const got = entry?.schedule;
|
|
67994
68506
|
if (edit.schedule === null ? got !== void 0 : !sameSchedule(got, edit.schedule)) return false;
|
|
@@ -68385,13 +68897,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
68385
68897
|
},
|
|
68386
68898
|
{
|
|
68387
68899
|
name: "summaryAddons",
|
|
68388
|
-
label: "Summary: addons",
|
|
68389
|
-
example: "
|
|
68390
|
-
kinds: [
|
|
68391
|
-
|
|
68392
|
-
|
|
68393
|
-
|
|
68394
|
-
|
|
68900
|
+
label: "Summary: addons stopped",
|
|
68901
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
68902
|
+
kinds: ["addon-crash-loop"]
|
|
68903
|
+
},
|
|
68904
|
+
{
|
|
68905
|
+
name: "summaryAddonUpdates",
|
|
68906
|
+
label: "Summary: addon updates",
|
|
68907
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
68908
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
68395
68909
|
},
|
|
68396
68910
|
{
|
|
68397
68911
|
name: "summaryUpdates",
|
|
@@ -68732,6 +69246,16 @@ var NC_TEMPLATE_VARS = [
|
|
|
68732
69246
|
kinds: ["system"],
|
|
68733
69247
|
systemEventKinds: [...DEVICE_EVENTS]
|
|
68734
69248
|
},
|
|
69249
|
+
{
|
|
69250
|
+
name: "locations",
|
|
69251
|
+
label: "Intrusion locations",
|
|
69252
|
+
example: "Ingresso, Corridoio, Salone",
|
|
69253
|
+
group: "system",
|
|
69254
|
+
families: ["rule"],
|
|
69255
|
+
fields: [...RULE_TEXT],
|
|
69256
|
+
kinds: ["system"],
|
|
69257
|
+
systemEventKinds: [...COMBINED_ALARM]
|
|
69258
|
+
},
|
|
68735
69259
|
{
|
|
68736
69260
|
name: "deviceId",
|
|
68737
69261
|
label: "Device id",
|
|
@@ -69448,7 +69972,7 @@ function sendTimesForEditor(schedule) {
|
|
|
69448
69972
|
approximated: times.length > 0
|
|
69449
69973
|
};
|
|
69450
69974
|
}
|
|
69451
|
-
var SUMMARY_CONTENT_VAR = /\{\{\s*summary(?:Text|Devices|Streams|Battery|Consumables|Tanks|Detection|Nodes|Addons|Updates)\s*\}\}/;
|
|
69975
|
+
var SUMMARY_CONTENT_VAR = /\{\{\s*summary(?:Text|Devices|Streams|Battery|Consumables|Tanks|Detection|Nodes|Addons|AddonUpdates|Updates)\s*\}\}/;
|
|
69452
69976
|
/**
|
|
69453
69977
|
* Does a custom BODY carry the summary's content (`{{summaryText}}` or a
|
|
69454
69978
|
* section variable)? A body that does not would send a summary with nothing
|
|
@@ -70667,9 +71191,9 @@ function slideInsideFrame(rect, frameWidth, frameHeight) {
|
|
|
70667
71191
|
* ## What each knob costs
|
|
70668
71192
|
*
|
|
70669
71193
|
* A HELD frame is a full NATIVE-resolution copy in system RAM. With the
|
|
70670
|
-
*
|
|
70671
|
-
* 4K ≈ 24.9 MB/frame, 1080p ≈ 6.2 MB/frame. On the YUV420P path (
|
|
70672
|
-
*
|
|
71194
|
+
* pinned-RGB24 lease path (hardware sessions):
|
|
71195
|
+
* 4K ≈ 24.9 MB/frame, 1080p ≈ 6.2 MB/frame. On the YUV420P path (software-decoded
|
|
71196
|
+
* sessions): 4K ≈ 12.4 MB, 1080p ≈ 3.1 MB. Worst-case
|
|
70673
71197
|
* resident RAM for ONE busy camera is now `frameBytes × holdFrames`, clamped by
|
|
70674
71198
|
* the budget ceiling — bounded by a COUNT because a held frame is waiting for
|
|
70675
71199
|
* one specific event (its own detection result), not for a clock.
|
|
@@ -72662,6 +73186,7 @@ exports.CAMERA_SENSORS_SETTINGS_KEY = CAMERA_SENSORS_SETTINGS_KEY;
|
|
|
72662
73186
|
exports.CAMERA_SWITCH_CATALOG = CAMERA_SWITCH_CATALOG;
|
|
72663
73187
|
exports.CAMERA_SWITCH_ORDER = CAMERA_SWITCH_ORDER;
|
|
72664
73188
|
exports.CAMERA_TRIGGER = CAMERA_TRIGGER;
|
|
73189
|
+
exports.CAMSTACK_APP_LINK_ORIGIN = CAMSTACK_APP_LINK_ORIGIN;
|
|
72665
73190
|
exports.CAM_PROFILE_ORDER = require_sleep.CAM_PROFILE_ORDER;
|
|
72666
73191
|
exports.CAPABILITY_NAMES = CAPABILITY_NAMES;
|
|
72667
73192
|
exports.CAPABILITY_ROUTER_KEYS = CAPABILITY_ROUTER_KEYS;
|
|
@@ -72890,6 +73415,7 @@ exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
|
|
|
72890
73415
|
exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
|
|
72891
73416
|
exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
|
|
72892
73417
|
exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
|
|
73418
|
+
exports.DEFAULT_LABEL_LINK_POLICY = DEFAULT_LABEL_LINK_POLICY;
|
|
72893
73419
|
exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
|
|
72894
73420
|
exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
|
|
72895
73421
|
exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
|
|
@@ -73066,7 +73592,12 @@ exports.ExtensionSourceSchema = ExtensionSourceSchema;
|
|
|
73066
73592
|
exports.FEEDER_EXAMPLE_ADDON_ID = FEEDER_EXAMPLE_ADDON_ID;
|
|
73067
73593
|
exports.FEEDER_EXAMPLE_HA_DEVICE_ID = FEEDER_EXAMPLE_HA_DEVICE_ID;
|
|
73068
73594
|
exports.FFMPEG_PATH_ENV = require_composition.FFMPEG_PATH_ENV;
|
|
73595
|
+
exports.FILLABLE_STEP_IDS = FILLABLE_STEP_IDS;
|
|
73596
|
+
exports.FILLABLE_STEP_MACRO = FILLABLE_STEP_MACRO;
|
|
73597
|
+
exports.FILLABLE_STEP_VOCABULARIES = FILLABLE_STEP_VOCABULARIES;
|
|
73069
73598
|
exports.FIRST_LEVEL_MACRO_CLASSES = FIRST_LEVEL_MACRO_CLASSES;
|
|
73599
|
+
exports.FRIGATE_PLUS_TO_MACRO = FRIGATE_PLUS_TO_MACRO;
|
|
73600
|
+
exports.FRIGATE_PLUS_UNMAPPED_LABELS = FRIGATE_PLUS_UNMAPPED_LABELS;
|
|
73070
73601
|
exports.FULL_IMAGE_BBOX = FULL_IMAGE_BBOX;
|
|
73071
73602
|
exports.FailureContributionSchema = FailureContributionSchema;
|
|
73072
73603
|
exports.FailureCounters = FailureCounters;
|
|
@@ -73077,6 +73608,7 @@ exports.FeatureManifestSchema = FeatureManifestSchema;
|
|
|
73077
73608
|
exports.FeatureProbeStatusSchema = FeatureProbeStatusSchema;
|
|
73078
73609
|
exports.FieldClaimModeSchema = FieldClaimModeSchema;
|
|
73079
73610
|
exports.FieldClaimSchema = FieldClaimSchema;
|
|
73611
|
+
exports.FillsClassifierEffectSchema = FillsClassifierEffectSchema;
|
|
73080
73612
|
exports.FloodStatusSchema = FloodStatusSchema;
|
|
73081
73613
|
exports.Fmp4BoxSplitter = require_composition.Fmp4BoxSplitter;
|
|
73082
73614
|
exports.FrameHandleFormatSchema = require_sleep.FrameHandleFormatSchema;
|
|
@@ -73098,6 +73630,7 @@ exports.HAP_KEYFRAME_INTERVAL_SEC = HAP_KEYFRAME_INTERVAL_SEC;
|
|
|
73098
73630
|
exports.HF_BASE_URL = HF_BASE_URL;
|
|
73099
73631
|
exports.HF_REPO = HF_REPO;
|
|
73100
73632
|
exports.HOURS_PER_DAY = HOURS_PER_DAY;
|
|
73633
|
+
exports.HUB_VIEWER_MOUNT = HUB_VIEWER_MOUNT;
|
|
73101
73634
|
exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
|
|
73102
73635
|
exports.HealthStatusSchema = HealthStatusSchema;
|
|
73103
73636
|
exports.HfModelResolutionSchema = HfModelResolutionSchema;
|
|
@@ -73124,8 +73657,11 @@ exports.IntercomAbilitySchema = IntercomAbilitySchema;
|
|
|
73124
73657
|
exports.IntercomStatusSchema = IntercomStatusSchema;
|
|
73125
73658
|
exports.KNOWN_CAP_NAMES = KNOWN_CAP_NAMES;
|
|
73126
73659
|
exports.KeyEventSchema = KeyEventSchema;
|
|
73660
|
+
exports.LABEL_LINK_POLICIES = LABEL_LINK_POLICIES;
|
|
73661
|
+
exports.LABEL_LINK_SETTING_KEY = LABEL_LINK_SETTING_KEY;
|
|
73127
73662
|
exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
|
|
73128
73663
|
exports.LINKED_DEVICES_SLOT = LINKED_DEVICES_SLOT;
|
|
73664
|
+
exports.LINKED_LABEL_STEP_PREFIX = LINKED_LABEL_STEP_PREFIX;
|
|
73129
73665
|
exports.LOAD_CONTRIBUTION_ATTRIBUTIONS = LOAD_CONTRIBUTION_ATTRIBUTIONS;
|
|
73130
73666
|
exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
|
|
73131
73667
|
exports.LOCATION_DESCRIPTION_MAX = LOCATION_DESCRIPTION_MAX;
|
|
@@ -73315,9 +73851,11 @@ exports.NAVIGATION_LIGHT_LEVEL_MIN = NAVIGATION_LIGHT_LEVEL_MIN;
|
|
|
73315
73851
|
exports.NC_ALARM_CONTROLLABLE_CAPS = NC_ALARM_CONTROLLABLE_CAPS;
|
|
73316
73852
|
exports.NC_ALARM_DEFAULT_PROFILE_ID = NC_ALARM_DEFAULT_PROFILE_ID;
|
|
73317
73853
|
exports.NC_ALARM_DEFAULT_PROFILE_NAME = NC_ALARM_DEFAULT_PROFILE_NAME;
|
|
73854
|
+
exports.NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC;
|
|
73318
73855
|
exports.NC_ALARM_DELAY_FIELDS = NC_ALARM_DELAY_FIELDS;
|
|
73319
73856
|
exports.NC_ALARM_DELAY_MAX_SEC = NC_ALARM_DELAY_MAX_SEC;
|
|
73320
73857
|
exports.NC_ALARM_NONBLOCKING_MAX = NC_ALARM_NONBLOCKING_MAX;
|
|
73858
|
+
exports.NC_ALARM_NOTIFY_FIELDS = NC_ALARM_NOTIFY_FIELDS;
|
|
73321
73859
|
exports.NC_ALARM_OPENING_EVENT_KINDS = NC_ALARM_OPENING_EVENT_KINDS;
|
|
73322
73860
|
exports.NC_ALARM_SENSORS_MAX = NC_ALARM_SENSORS_MAX;
|
|
73323
73861
|
exports.NC_ALARM_SYSTEM_DEFAULT_DELAYS = NC_ALARM_SYSTEM_DEFAULT_DELAYS;
|
|
@@ -73793,6 +74331,7 @@ exports.ServerUpdateActionResultSchema = ServerUpdateActionResultSchema;
|
|
|
73793
74331
|
exports.ServerUpdateCheckResultSchema = ServerUpdateCheckResultSchema;
|
|
73794
74332
|
exports.ServerUpdateOutcomeSchema = ServerUpdateOutcomeSchema;
|
|
73795
74333
|
exports.ServerUpdateStateSchema = ServerUpdateStateSchema;
|
|
74334
|
+
exports.SessionTriggerSchema = SessionTriggerSchema;
|
|
73796
74335
|
exports.SetCameraSensorsInputSchema = SetCameraSensorsInputSchema;
|
|
73797
74336
|
exports.SetLoggingSettingsInputSchema = SetLoggingSettingsInputSchema;
|
|
73798
74337
|
exports.SetSiteLocationInputSchema = SetSiteLocationInputSchema;
|
|
@@ -74070,12 +74609,14 @@ exports.buildDeviceAdminUrl = buildDeviceAdminUrl;
|
|
|
74070
74609
|
exports.buildDoorbellCompositionFeature = buildDoorbellCompositionFeature;
|
|
74071
74610
|
exports.buildEventKindDescriptor = buildEventKindDescriptor;
|
|
74072
74611
|
exports.buildFfmpegArgs = require_composition.buildFfmpegArgs;
|
|
74612
|
+
exports.buildFrigateClassMap = buildFrigateClassMap;
|
|
74073
74613
|
exports.buildInputArgs = require_composition.buildInputArgs;
|
|
74074
74614
|
exports.buildModelVariantGroups = buildModelVariantGroups;
|
|
74075
74615
|
exports.buildNcTaxonomy = buildNcTaxonomy;
|
|
74076
74616
|
exports.buildRoleScopes = buildRoleScopes;
|
|
74077
74617
|
exports.buildStreamParamsConfigSchema = buildStreamParamsConfigSchema;
|
|
74078
74618
|
exports.buildVideoArgs = require_composition.buildVideoArgs;
|
|
74619
|
+
exports.buildViewerLink = buildViewerLink;
|
|
74079
74620
|
exports.builtCapabilityBlockers = builtCapabilityBlockers;
|
|
74080
74621
|
exports.buttonCapability = buttonCapability;
|
|
74081
74622
|
exports.calendarSourceCapability = calendarSourceCapability;
|
|
@@ -74175,6 +74716,7 @@ exports.defineExtensionSlotProvider = defineExtensionSlotProvider;
|
|
|
74175
74716
|
exports.deleteAlarmProfile = deleteAlarmProfile;
|
|
74176
74717
|
exports.deriveBatteryPresence = deriveBatteryPresence;
|
|
74177
74718
|
exports.deriveCameraSwitches = deriveCameraSwitches;
|
|
74719
|
+
exports.deriveClassifierFills = deriveClassifierFills;
|
|
74178
74720
|
exports.deriveDetailCropRect = deriveDetailCropRect;
|
|
74179
74721
|
exports.derivePostTriggeredAction = derivePostTriggeredAction;
|
|
74180
74722
|
exports.deriveRecordingMode = deriveRecordingMode;
|
|
@@ -74266,6 +74808,7 @@ exports.feederExampleSources = feederExampleSources;
|
|
|
74266
74808
|
exports.ffmpegRate = ffmpegRate;
|
|
74267
74809
|
exports.fieldReads = require_composition.fieldReads;
|
|
74268
74810
|
exports.filesystemBrowseCapability = filesystemBrowseCapability;
|
|
74811
|
+
exports.fillFor = fillFor;
|
|
74269
74812
|
exports.findCandidateCycles = findCandidateCycles;
|
|
74270
74813
|
exports.findCompositionCycles = findCompositionCycles;
|
|
74271
74814
|
exports.findTimezone = findTimezone;
|
|
@@ -74275,6 +74818,7 @@ exports.formatForRuntime = formatForRuntime;
|
|
|
74275
74818
|
exports.formatMediaOwnerKey = formatMediaOwnerKey;
|
|
74276
74819
|
exports.formatMinutes = formatMinutes;
|
|
74277
74820
|
exports.formatParkedFor = formatParkedFor;
|
|
74821
|
+
exports.frigateLabelFields = frigateLabelFields;
|
|
74278
74822
|
exports.gasCapability = gasCapability;
|
|
74279
74823
|
exports.gbToBytes = gbToBytes;
|
|
74280
74824
|
exports.generateAutomationBlock = generateAutomationBlock;
|
|
@@ -74305,6 +74849,7 @@ exports.invertPresetFeature = invertPresetFeature;
|
|
|
74305
74849
|
exports.invocationFromEncodeProfile = require_composition.invocationFromEncodeProfile;
|
|
74306
74850
|
exports.isAgentOnlyPlacement = isAgentOnlyPlacement;
|
|
74307
74851
|
exports.isAlarmControllableCap = isAlarmControllableCap;
|
|
74852
|
+
exports.isAppLinkBase = isAppLinkBase;
|
|
74308
74853
|
exports.isArrayOutputSchema = isArrayOutputSchema;
|
|
74309
74854
|
exports.isAudioChunkFormat = require_sleep.isAudioChunkFormat;
|
|
74310
74855
|
exports.isAudioClassName = isAudioClassName;
|
|
@@ -74313,6 +74858,7 @@ exports.isAudioRule = isAudioRule;
|
|
|
74313
74858
|
exports.isBaseConditionKey = isBaseConditionKey;
|
|
74314
74859
|
exports.isBatteryPresenceFault = isBatteryPresenceFault;
|
|
74315
74860
|
exports.isClusterScopedStep = isClusterScopedStep;
|
|
74861
|
+
exports.isCocoLabelmap = isCocoLabelmap;
|
|
74316
74862
|
exports.isCollectionArrayMethod = isCollectionArrayMethod;
|
|
74317
74863
|
exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
|
|
74318
74864
|
exports.isDeployableToAgent = isDeployableToAgent;
|
|
@@ -74326,6 +74872,7 @@ exports.isEmbeddingModelFailed = isEmbeddingModelFailed;
|
|
|
74326
74872
|
exports.isEvent = require_sleep.isEvent;
|
|
74327
74873
|
exports.isEventKindLabelKey = isEventKindLabelKey;
|
|
74328
74874
|
exports.isEventOwnerType = isEventOwnerType;
|
|
74875
|
+
exports.isFillableStepId = isFillableStepId;
|
|
74329
74876
|
exports.isFirstLevelMacroClass = isFirstLevelMacroClass;
|
|
74330
74877
|
exports.isHeldBackTemplateVar = isHeldBackTemplateVar;
|
|
74331
74878
|
exports.isIsolatedBuiltin = isIsolatedBuiltin;
|
|
@@ -74365,6 +74912,8 @@ exports.lifecycleJobSchema = lifecycleJobSchema;
|
|
|
74365
74912
|
exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
|
|
74366
74913
|
exports.lifecycleJobStateSchema = lifecycleJobStateSchema;
|
|
74367
74914
|
exports.lifecycleTaskSchema = lifecycleTaskSchema;
|
|
74915
|
+
exports.linkedLabelStepId = linkedLabelStepId;
|
|
74916
|
+
exports.linkedStepOf = linkedStepOf;
|
|
74368
74917
|
exports.llmCapability = llmCapability;
|
|
74369
74918
|
exports.llmRuntimeCapability = llmRuntimeCapability;
|
|
74370
74919
|
exports.loadContributionCapability = loadContributionCapability;
|
|
@@ -74451,6 +75000,7 @@ exports.parseStreamParamsFormPatch = parseStreamParamsFormPatch;
|
|
|
74451
75000
|
exports.patchAudio = patchAudio;
|
|
74452
75001
|
exports.petFeederCapability = petFeederCapability;
|
|
74453
75002
|
exports.pickAccessoryControl = pickAccessoryControl;
|
|
75003
|
+
exports.pickAppLinkHub = pickAppLinkHub;
|
|
74454
75004
|
exports.pickClusterStepModels = pickClusterStepModels;
|
|
74455
75005
|
exports.pickClusterStepSettings = pickClusterStepSettings;
|
|
74456
75006
|
exports.pickDetailCropConvention = pickDetailCropConvention;
|
|
@@ -74489,6 +75039,7 @@ exports.readClusterStepSettings = readClusterStepSettings;
|
|
|
74489
75039
|
exports.readDetailCropConvention = readDetailCropConvention;
|
|
74490
75040
|
exports.readDeviceStateFrom = readDeviceStateFrom;
|
|
74491
75041
|
exports.readHubMotionDetected = readHubMotionDetected;
|
|
75042
|
+
exports.readLabelLinkPolicy = readLabelLinkPolicy;
|
|
74492
75043
|
exports.readMotionTriggeredBy = readMotionTriggeredBy;
|
|
74493
75044
|
exports.readNativeLeaseOverride = readNativeLeaseOverride;
|
|
74494
75045
|
exports.readNodePin = require_sleep.readNodePin;
|
|
@@ -74526,10 +75077,12 @@ exports.resolveEgressDecodeHwAccel = resolveEgressDecodeHwAccel;
|
|
|
74526
75077
|
exports.resolveExportProfiles = resolveExportProfiles;
|
|
74527
75078
|
exports.resolveFormat = resolveFormat;
|
|
74528
75079
|
exports.resolveHydratedFieldValue = require_sleep.resolveHydratedFieldValue;
|
|
75080
|
+
exports.resolveLabelLink = resolveLabelLink;
|
|
74529
75081
|
exports.resolveLocationIcon = resolveLocationIcon;
|
|
74530
75082
|
exports.resolveLocationMode = resolveLocationMode;
|
|
74531
75083
|
exports.resolveMethodAuth = resolveMethodAuth;
|
|
74532
75084
|
exports.resolveModeDelays = resolveModeDelays;
|
|
75085
|
+
exports.resolveModeNotifyPolicy = resolveModeNotifyPolicy;
|
|
74533
75086
|
exports.resolveMutate = resolveMutate;
|
|
74534
75087
|
exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
|
|
74535
75088
|
exports.resolveRecordingProfiles = resolveRecordingProfiles;
|
|
@@ -74638,6 +75191,7 @@ exports.templateVarsFor = templateVarsFor;
|
|
|
74638
75191
|
exports.terminalSessionCapability = terminalSessionCapability;
|
|
74639
75192
|
exports.textToHtml = textToHtml;
|
|
74640
75193
|
exports.timeOfDayToMinutes = timeOfDayToMinutes;
|
|
75194
|
+
exports.toAppLinkHubOrigin = toAppLinkHubOrigin;
|
|
74641
75195
|
exports.toDeviceSummary = toDeviceSummary;
|
|
74642
75196
|
exports.toExpressionValue = require_composition.toExpressionValue;
|
|
74643
75197
|
exports.toNodeId = require_sleep.toNodeId;
|
|
@@ -74665,6 +75219,7 @@ exports.vectorIndexDimConflictError = vectorIndexDimConflictError;
|
|
|
74665
75219
|
exports.vectorStoreCapability = vectorStoreCapability;
|
|
74666
75220
|
exports.vibrationCapability = vibrationCapability;
|
|
74667
75221
|
exports.videoclipsCapability = videoclipsCapability;
|
|
75222
|
+
exports.viewerLinkBaseOf = viewerLinkBaseOf;
|
|
74668
75223
|
exports.viewerUiCapability = require_sleep.viewerUiCapability;
|
|
74669
75224
|
exports.waterHeaterCapability = waterHeaterCapability;
|
|
74670
75225
|
exports.weatherCapability = weatherCapability;
|