@camstack/addon-provider-amcrest 0.2.24 → 0.2.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +138 -56
  2. package/dist/addon.mjs +138 -56
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7559,7 +7559,7 @@ var RecordingBandSchema = object({
7559
7559
  postBufferSec: number().min(0).optional()
7560
7560
  });
7561
7561
  ({
7562
- preBufferSec: 10,
7562
+ preBufferSec: 15,
7563
7563
  postBufferSec: 30
7564
7564
  }).postBufferSec * 1e3;
7565
7565
  /**
@@ -13762,128 +13762,103 @@ var COCO_TO_MACRO = {
13762
13762
  var AUDIO_MACRO_LABELS = [
13763
13763
  {
13764
13764
  id: "speech",
13765
- name: "Speech",
13766
- icon: "🗣️"
13765
+ name: "Speech"
13767
13766
  },
13768
13767
  {
13769
13768
  id: "scream",
13770
- name: "Scream / Shout",
13771
- icon: "😱"
13769
+ name: "Scream / Shout"
13772
13770
  },
13773
13771
  {
13774
13772
  id: "crying",
13775
- name: "Crying / Baby",
13776
- icon: "😢"
13773
+ name: "Crying / Baby"
13777
13774
  },
13778
13775
  {
13779
13776
  id: "laughter",
13780
- name: "Laughter",
13781
- icon: "😂"
13777
+ name: "Laughter"
13782
13778
  },
13783
13779
  {
13784
13780
  id: "music",
13785
- name: "Music",
13786
- icon: "🎵"
13781
+ name: "Music"
13787
13782
  },
13788
13783
  {
13789
13784
  id: "dog",
13790
- name: "Dog",
13791
- icon: "🐕"
13785
+ name: "Dog"
13792
13786
  },
13793
13787
  {
13794
13788
  id: "cat",
13795
- name: "Cat",
13796
- icon: "🐈"
13789
+ name: "Cat"
13797
13790
  },
13798
13791
  {
13799
13792
  id: "bird",
13800
- name: "Bird",
13801
- icon: "🐦"
13793
+ name: "Bird"
13802
13794
  },
13803
13795
  {
13804
13796
  id: "animal",
13805
- name: "Animal (other)",
13806
- icon: "🐾"
13797
+ name: "Animal (other)"
13807
13798
  },
13808
13799
  {
13809
13800
  id: "alarm",
13810
- name: "Alarm / Siren",
13811
- icon: "🚨"
13801
+ name: "Alarm / Siren"
13812
13802
  },
13813
13803
  {
13814
13804
  id: "doorbell",
13815
- name: "Doorbell / Knock",
13816
- icon: "🔔"
13805
+ name: "Doorbell / Knock"
13817
13806
  },
13818
13807
  {
13819
13808
  id: "glass_breaking",
13820
- name: "Glass Breaking",
13821
- icon: "💥"
13809
+ name: "Glass Breaking"
13822
13810
  },
13823
13811
  {
13824
13812
  id: "gunshot",
13825
- name: "Gunshot / Explosion",
13826
- icon: "💣"
13813
+ name: "Gunshot / Explosion"
13827
13814
  },
13828
13815
  {
13829
13816
  id: "vehicle",
13830
- name: "Vehicle",
13831
- icon: "🚗"
13817
+ name: "Vehicle"
13832
13818
  },
13833
13819
  {
13834
13820
  id: "siren",
13835
- name: "Emergency Siren",
13836
- icon: "🚑"
13821
+ name: "Emergency Siren"
13837
13822
  },
13838
13823
  {
13839
13824
  id: "fire",
13840
- name: "Fire / Smoke",
13841
- icon: "🔥"
13825
+ name: "Fire / Smoke"
13842
13826
  },
13843
13827
  {
13844
13828
  id: "water",
13845
- name: "Water",
13846
- icon: "💧"
13829
+ name: "Water"
13847
13830
  },
13848
13831
  {
13849
13832
  id: "wind",
13850
- name: "Wind / Weather",
13851
- icon: "🌬️"
13833
+ name: "Wind / Weather"
13852
13834
  },
13853
13835
  {
13854
13836
  id: "door",
13855
- name: "Door",
13856
- icon: "🚪"
13837
+ name: "Door"
13857
13838
  },
13858
13839
  {
13859
13840
  id: "footsteps",
13860
- name: "Footsteps",
13861
- icon: "👣"
13841
+ name: "Footsteps"
13862
13842
  },
13863
13843
  {
13864
13844
  id: "crowd",
13865
- name: "Crowd / Chatter",
13866
- icon: "👥"
13845
+ name: "Crowd / Chatter"
13867
13846
  },
13868
13847
  {
13869
13848
  id: "telephone",
13870
- name: "Telephone",
13871
- icon: "📞"
13849
+ name: "Telephone"
13872
13850
  },
13873
13851
  {
13874
13852
  id: "engine",
13875
- name: "Engine / Motor",
13876
- icon: "⚙️"
13853
+ name: "Engine / Motor"
13877
13854
  },
13878
13855
  {
13879
13856
  id: "tools",
13880
- name: "Tools / Construction",
13881
- icon: "🔨"
13857
+ name: "Tools / Construction"
13882
13858
  },
13883
13859
  {
13884
13860
  id: "silence",
13885
- name: "Silence",
13886
- icon: "🤫"
13861
+ name: "Silence"
13887
13862
  }
13888
13863
  ];
13889
13864
  var YAMNET_TO_MACRO = {
@@ -16385,7 +16360,7 @@ var TrackEnvelopeSchema = object({
16385
16360
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
16386
16361
  * keeps every scalar the list surfaces actually render (ids, class(es),
16387
16362
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
16388
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
16363
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
16389
16364
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
16390
16365
  * `getTrack`. Mirrors the event-store `projection` convention
16391
16366
  * (`getObjectEvents` et al.).
@@ -16680,6 +16655,35 @@ var TrackSchema = object({
16680
16655
  */
16681
16656
  hasFace: boolean().optional(),
16682
16657
  /**
16658
+ * This track has a face row IN THE GALLERY: a crop **and** an embedding — a
16659
+ * face an operator could ASSIGN to an identity.
16660
+ *
16661
+ * The STRICT twin of {@link hasFace}, and the pair only earns its keep
16662
+ * because the two disagree. `hasFace` is stamped at the TOP of the face
16663
+ * branch, before every gate, and means no more than "a face detector produced
16664
+ * a face detail". This one is stamped at the single moment the gallery row
16665
+ * LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
16666
+ * past the embedding-magnitude verdict, the `minFacePx` detection gate, the
16667
+ * candidate gate, the imageless-track drop (no crop was ever captured) and
16668
+ * the crop-store drop. Everything between the detector and that insert can
16669
+ * legitimately refuse the face, so a flag written any earlier promises the
16670
+ * operator something to assign and delivers nothing.
16671
+ *
16672
+ * **Independent of recognition.** A face collected but never auto-matched is
16673
+ * still assignable — it is in fact the face an operator most wants to reach —
16674
+ * so this is NOT gated on `recognizedIdentityId`. Recognition lands in
16675
+ * `subLabel`; this says only that the raw material exists.
16676
+ *
16677
+ * **Set once, never cleared.** A track that produced a gallery row produced
16678
+ * one; deleting the row later is the gallery's business, not this flag's.
16679
+ *
16680
+ * **Absent ≠ false**, the same rule as {@link hasFace}: every row written
16681
+ * before the column omits it, and so does every server that predates the
16682
+ * field. A consumer must test `=== true` and render nothing otherwise —
16683
+ * never infer "no assignable face".
16684
+ */
16685
+ hasEmbeddedFace: boolean().optional(),
16686
+ /**
16683
16687
  * This subject CONTAINS a folded rider — a person the rider-pairing step
16684
16688
  * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
16685
16689
  * so the passage is tracked once and as a VEHICLE.
@@ -18069,6 +18073,32 @@ var DetailResultSchema = object({
18069
18073
  /** FRAME-space bbox (already mapped back from crop space). */
18070
18074
  bbox: NativeCropBboxSchema.optional(),
18071
18075
  embedding: string().optional(),
18076
+ /**
18077
+ * L2 magnitude of the RAW pre-normalization embedding. Additive and optional
18078
+ * so an older runner that does not send it degrades to "unmeasurable", which
18079
+ * the consuming gate treats as accept — never as reject.
18080
+ */
18081
+ embeddingMagnitude: number().optional(),
18082
+ /**
18083
+ * Model that produced `embedding` — the SAME contract `labelModelId` has for
18084
+ * `label`, and for the same reason: the producing node is the only side that
18085
+ * knows which model actually ran, and re-deriving it downstream is exactly
18086
+ * the inference this model exists to forbid.
18087
+ *
18088
+ * Additive and optional, so a runner that predates it degrades to
18089
+ * "unmeasurable" rather than to a wrong answer — the consumer falls back to
18090
+ * its previous assumption instead of refusing.
18091
+ *
18092
+ * Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
18093
+ * to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
18094
+ * with nothing on the wire it took the id from the GALLERY, so the gate
18095
+ * compared the gallery against itself and could never fire. That turned the
18096
+ * one guard protecting the face feature space into a tautology, and it is
18097
+ * why swapping `face-embedding`'s model would NOT have stranded the enrolled
18098
+ * gallery as the catalog comment predicts — it would have scored the new
18099
+ * model's vectors against the old model's samples in one cosine space.
18100
+ */
18101
+ embeddingModelId: string().optional(),
18072
18102
  label: string().optional(),
18073
18103
  /**
18074
18104
  * The tier `label` occupies, copied VERBATIM from the producing step's
@@ -19533,6 +19563,7 @@ var snapshotCapability = {
19533
19563
  isBattery: boolean(),
19534
19564
  reason: _enum([
19535
19565
  "disabled",
19566
+ "offline",
19536
19567
  "sleeping",
19537
19568
  "unreachable",
19538
19569
  "waking"
@@ -19622,9 +19653,17 @@ targets: array(object({
19622
19653
  sleeping: boolean(),
19623
19654
  /** Current device state rendered over the cached frame. State images
19624
19655
  * remain authoritative even when their photographic background is
19625
- * old; null means the link must carry a current camera frame. */
19656
+ * old; null means the link must carry a current camera frame.
19657
+ *
19658
+ * **This is the ONLY source a surface may derive an inactive tile
19659
+ * from.** A client that reads a device's `online`/`disabled` flags and
19660
+ * draws its own verdict will disagree with the pixels it is painting
19661
+ * — the frame comes from here, and so must the sentence over it
19662
+ * (D190). Pair with `ageMs` for the age of the photograph behind the
19663
+ * state. */
19626
19664
  stateReason: _enum([
19627
19665
  "disabled",
19666
+ "offline",
19628
19667
  "sleeping",
19629
19668
  "unreachable",
19630
19669
  "waking"
@@ -37590,7 +37629,6 @@ var NC_AUDIO_DEFAULTS = {
37590
37629
  hitPercent: 60,
37591
37630
  samplingSeconds: 10
37592
37631
  };
37593
- new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
37594
37632
  new Set(["devices", "classes"]);
37595
37633
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
37596
37634
  /**
@@ -37824,6 +37862,39 @@ TimelapseRuleInputSchema.extend({
37824
37862
  createdAt: number(),
37825
37863
  updatedAt: number()
37826
37864
  });
37865
+ Object.freeze(Object.fromEntries([{
37866
+ stepId: "face-embedding",
37867
+ label: "Face recognition model",
37868
+ defaultModelId: "arcface-r100",
37869
+ indexName: "the enrolled face gallery",
37870
+ options: [
37871
+ {
37872
+ id: "arcface-r100",
37873
+ label: "ArcFace (ResNet34)"
37874
+ },
37875
+ {
37876
+ id: "auraface-r100",
37877
+ label: "AuraFace R100"
37878
+ },
37879
+ {
37880
+ id: "inception-resnet-v1",
37881
+ label: "Inception ResNet V1"
37882
+ }
37883
+ ]
37884
+ }, {
37885
+ stepId: "clip-embedding",
37886
+ label: "Semantic search model",
37887
+ defaultModelId: "mobileclip-s1",
37888
+ indexName: "the object semantic-search index",
37889
+ options: [{
37890
+ id: "mobileclip-s1",
37891
+ label: "MobileCLIP S1"
37892
+ }, {
37893
+ id: "mobileclip-s2",
37894
+ label: "MobileCLIP S2"
37895
+ }]
37896
+ }].map((s) => [s.stepId, s.defaultModelId])));
37897
+ string().min(1);
37827
37898
  object({
37828
37899
  /**
37829
37900
  * Fraction of the box's own size added on EACH side before cutting.
@@ -37844,10 +37915,21 @@ object({
37844
37915
  */
37845
37916
  square: boolean()
37846
37917
  });
37847
- ({
37918
+ /**
37919
+ * The convention in force when nobody has configured one — byte-for-byte the
37920
+ * behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
37921
+ */
37922
+ var DEFAULT_DETAIL_CROP_CONVENTION = {
37848
37923
  paddingRatio: .15,
37849
37924
  square: false
37850
- }).paddingRatio;
37925
+ };
37926
+ Object.freeze({
37927
+ x: 0,
37928
+ y: 0,
37929
+ w: 1,
37930
+ h: 1
37931
+ });
37932
+ DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
37851
37933
  /**
37852
37934
  * WHICH delivered frames the decode worker retains a native copy of.
37853
37935
  *
package/dist/addon.mjs CHANGED
@@ -7560,7 +7560,7 @@ var RecordingBandSchema = object({
7560
7560
  postBufferSec: number().min(0).optional()
7561
7561
  });
7562
7562
  ({
7563
- preBufferSec: 10,
7563
+ preBufferSec: 15,
7564
7564
  postBufferSec: 30
7565
7565
  }).postBufferSec * 1e3;
7566
7566
  /**
@@ -13763,128 +13763,103 @@ var COCO_TO_MACRO = {
13763
13763
  var AUDIO_MACRO_LABELS = [
13764
13764
  {
13765
13765
  id: "speech",
13766
- name: "Speech",
13767
- icon: "🗣️"
13766
+ name: "Speech"
13768
13767
  },
13769
13768
  {
13770
13769
  id: "scream",
13771
- name: "Scream / Shout",
13772
- icon: "😱"
13770
+ name: "Scream / Shout"
13773
13771
  },
13774
13772
  {
13775
13773
  id: "crying",
13776
- name: "Crying / Baby",
13777
- icon: "😢"
13774
+ name: "Crying / Baby"
13778
13775
  },
13779
13776
  {
13780
13777
  id: "laughter",
13781
- name: "Laughter",
13782
- icon: "😂"
13778
+ name: "Laughter"
13783
13779
  },
13784
13780
  {
13785
13781
  id: "music",
13786
- name: "Music",
13787
- icon: "🎵"
13782
+ name: "Music"
13788
13783
  },
13789
13784
  {
13790
13785
  id: "dog",
13791
- name: "Dog",
13792
- icon: "🐕"
13786
+ name: "Dog"
13793
13787
  },
13794
13788
  {
13795
13789
  id: "cat",
13796
- name: "Cat",
13797
- icon: "🐈"
13790
+ name: "Cat"
13798
13791
  },
13799
13792
  {
13800
13793
  id: "bird",
13801
- name: "Bird",
13802
- icon: "🐦"
13794
+ name: "Bird"
13803
13795
  },
13804
13796
  {
13805
13797
  id: "animal",
13806
- name: "Animal (other)",
13807
- icon: "🐾"
13798
+ name: "Animal (other)"
13808
13799
  },
13809
13800
  {
13810
13801
  id: "alarm",
13811
- name: "Alarm / Siren",
13812
- icon: "🚨"
13802
+ name: "Alarm / Siren"
13813
13803
  },
13814
13804
  {
13815
13805
  id: "doorbell",
13816
- name: "Doorbell / Knock",
13817
- icon: "🔔"
13806
+ name: "Doorbell / Knock"
13818
13807
  },
13819
13808
  {
13820
13809
  id: "glass_breaking",
13821
- name: "Glass Breaking",
13822
- icon: "💥"
13810
+ name: "Glass Breaking"
13823
13811
  },
13824
13812
  {
13825
13813
  id: "gunshot",
13826
- name: "Gunshot / Explosion",
13827
- icon: "💣"
13814
+ name: "Gunshot / Explosion"
13828
13815
  },
13829
13816
  {
13830
13817
  id: "vehicle",
13831
- name: "Vehicle",
13832
- icon: "🚗"
13818
+ name: "Vehicle"
13833
13819
  },
13834
13820
  {
13835
13821
  id: "siren",
13836
- name: "Emergency Siren",
13837
- icon: "🚑"
13822
+ name: "Emergency Siren"
13838
13823
  },
13839
13824
  {
13840
13825
  id: "fire",
13841
- name: "Fire / Smoke",
13842
- icon: "🔥"
13826
+ name: "Fire / Smoke"
13843
13827
  },
13844
13828
  {
13845
13829
  id: "water",
13846
- name: "Water",
13847
- icon: "💧"
13830
+ name: "Water"
13848
13831
  },
13849
13832
  {
13850
13833
  id: "wind",
13851
- name: "Wind / Weather",
13852
- icon: "🌬️"
13834
+ name: "Wind / Weather"
13853
13835
  },
13854
13836
  {
13855
13837
  id: "door",
13856
- name: "Door",
13857
- icon: "🚪"
13838
+ name: "Door"
13858
13839
  },
13859
13840
  {
13860
13841
  id: "footsteps",
13861
- name: "Footsteps",
13862
- icon: "👣"
13842
+ name: "Footsteps"
13863
13843
  },
13864
13844
  {
13865
13845
  id: "crowd",
13866
- name: "Crowd / Chatter",
13867
- icon: "👥"
13846
+ name: "Crowd / Chatter"
13868
13847
  },
13869
13848
  {
13870
13849
  id: "telephone",
13871
- name: "Telephone",
13872
- icon: "📞"
13850
+ name: "Telephone"
13873
13851
  },
13874
13852
  {
13875
13853
  id: "engine",
13876
- name: "Engine / Motor",
13877
- icon: "⚙️"
13854
+ name: "Engine / Motor"
13878
13855
  },
13879
13856
  {
13880
13857
  id: "tools",
13881
- name: "Tools / Construction",
13882
- icon: "🔨"
13858
+ name: "Tools / Construction"
13883
13859
  },
13884
13860
  {
13885
13861
  id: "silence",
13886
- name: "Silence",
13887
- icon: "🤫"
13862
+ name: "Silence"
13888
13863
  }
13889
13864
  ];
13890
13865
  var YAMNET_TO_MACRO = {
@@ -16386,7 +16361,7 @@ var TrackEnvelopeSchema = object({
16386
16361
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
16387
16362
  * keeps every scalar the list surfaces actually render (ids, class(es),
16388
16363
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
16389
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
16364
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
16390
16365
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
16391
16366
  * `getTrack`. Mirrors the event-store `projection` convention
16392
16367
  * (`getObjectEvents` et al.).
@@ -16681,6 +16656,35 @@ var TrackSchema = object({
16681
16656
  */
16682
16657
  hasFace: boolean().optional(),
16683
16658
  /**
16659
+ * This track has a face row IN THE GALLERY: a crop **and** an embedding — a
16660
+ * face an operator could ASSIGN to an identity.
16661
+ *
16662
+ * The STRICT twin of {@link hasFace}, and the pair only earns its keep
16663
+ * because the two disagree. `hasFace` is stamped at the TOP of the face
16664
+ * branch, before every gate, and means no more than "a face detector produced
16665
+ * a face detail". This one is stamped at the single moment the gallery row
16666
+ * LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
16667
+ * past the embedding-magnitude verdict, the `minFacePx` detection gate, the
16668
+ * candidate gate, the imageless-track drop (no crop was ever captured) and
16669
+ * the crop-store drop. Everything between the detector and that insert can
16670
+ * legitimately refuse the face, so a flag written any earlier promises the
16671
+ * operator something to assign and delivers nothing.
16672
+ *
16673
+ * **Independent of recognition.** A face collected but never auto-matched is
16674
+ * still assignable — it is in fact the face an operator most wants to reach —
16675
+ * so this is NOT gated on `recognizedIdentityId`. Recognition lands in
16676
+ * `subLabel`; this says only that the raw material exists.
16677
+ *
16678
+ * **Set once, never cleared.** A track that produced a gallery row produced
16679
+ * one; deleting the row later is the gallery's business, not this flag's.
16680
+ *
16681
+ * **Absent ≠ false**, the same rule as {@link hasFace}: every row written
16682
+ * before the column omits it, and so does every server that predates the
16683
+ * field. A consumer must test `=== true` and render nothing otherwise —
16684
+ * never infer "no assignable face".
16685
+ */
16686
+ hasEmbeddedFace: boolean().optional(),
16687
+ /**
16684
16688
  * This subject CONTAINS a folded rider — a person the rider-pairing step
16685
16689
  * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
16686
16690
  * so the passage is tracked once and as a VEHICLE.
@@ -18070,6 +18074,32 @@ var DetailResultSchema = object({
18070
18074
  /** FRAME-space bbox (already mapped back from crop space). */
18071
18075
  bbox: NativeCropBboxSchema.optional(),
18072
18076
  embedding: string().optional(),
18077
+ /**
18078
+ * L2 magnitude of the RAW pre-normalization embedding. Additive and optional
18079
+ * so an older runner that does not send it degrades to "unmeasurable", which
18080
+ * the consuming gate treats as accept — never as reject.
18081
+ */
18082
+ embeddingMagnitude: number().optional(),
18083
+ /**
18084
+ * Model that produced `embedding` — the SAME contract `labelModelId` has for
18085
+ * `label`, and for the same reason: the producing node is the only side that
18086
+ * knows which model actually ran, and re-deriving it downstream is exactly
18087
+ * the inference this model exists to forbid.
18088
+ *
18089
+ * Additive and optional, so a runner that predates it degrades to
18090
+ * "unmeasurable" rather than to a wrong answer — the consumer falls back to
18091
+ * its previous assumption instead of refusing.
18092
+ *
18093
+ * Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
18094
+ * to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
18095
+ * with nothing on the wire it took the id from the GALLERY, so the gate
18096
+ * compared the gallery against itself and could never fire. That turned the
18097
+ * one guard protecting the face feature space into a tautology, and it is
18098
+ * why swapping `face-embedding`'s model would NOT have stranded the enrolled
18099
+ * gallery as the catalog comment predicts — it would have scored the new
18100
+ * model's vectors against the old model's samples in one cosine space.
18101
+ */
18102
+ embeddingModelId: string().optional(),
18073
18103
  label: string().optional(),
18074
18104
  /**
18075
18105
  * The tier `label` occupies, copied VERBATIM from the producing step's
@@ -19534,6 +19564,7 @@ var snapshotCapability = {
19534
19564
  isBattery: boolean(),
19535
19565
  reason: _enum([
19536
19566
  "disabled",
19567
+ "offline",
19537
19568
  "sleeping",
19538
19569
  "unreachable",
19539
19570
  "waking"
@@ -19623,9 +19654,17 @@ targets: array(object({
19623
19654
  sleeping: boolean(),
19624
19655
  /** Current device state rendered over the cached frame. State images
19625
19656
  * remain authoritative even when their photographic background is
19626
- * old; null means the link must carry a current camera frame. */
19657
+ * old; null means the link must carry a current camera frame.
19658
+ *
19659
+ * **This is the ONLY source a surface may derive an inactive tile
19660
+ * from.** A client that reads a device's `online`/`disabled` flags and
19661
+ * draws its own verdict will disagree with the pixels it is painting
19662
+ * — the frame comes from here, and so must the sentence over it
19663
+ * (D190). Pair with `ageMs` for the age of the photograph behind the
19664
+ * state. */
19627
19665
  stateReason: _enum([
19628
19666
  "disabled",
19667
+ "offline",
19629
19668
  "sleeping",
19630
19669
  "unreachable",
19631
19670
  "waking"
@@ -37591,7 +37630,6 @@ var NC_AUDIO_DEFAULTS = {
37591
37630
  hitPercent: 60,
37592
37631
  samplingSeconds: 10
37593
37632
  };
37594
- new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
37595
37633
  new Set(["devices", "classes"]);
37596
37634
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
37597
37635
  /**
@@ -37825,6 +37863,39 @@ TimelapseRuleInputSchema.extend({
37825
37863
  createdAt: number(),
37826
37864
  updatedAt: number()
37827
37865
  });
37866
+ Object.freeze(Object.fromEntries([{
37867
+ stepId: "face-embedding",
37868
+ label: "Face recognition model",
37869
+ defaultModelId: "arcface-r100",
37870
+ indexName: "the enrolled face gallery",
37871
+ options: [
37872
+ {
37873
+ id: "arcface-r100",
37874
+ label: "ArcFace (ResNet34)"
37875
+ },
37876
+ {
37877
+ id: "auraface-r100",
37878
+ label: "AuraFace R100"
37879
+ },
37880
+ {
37881
+ id: "inception-resnet-v1",
37882
+ label: "Inception ResNet V1"
37883
+ }
37884
+ ]
37885
+ }, {
37886
+ stepId: "clip-embedding",
37887
+ label: "Semantic search model",
37888
+ defaultModelId: "mobileclip-s1",
37889
+ indexName: "the object semantic-search index",
37890
+ options: [{
37891
+ id: "mobileclip-s1",
37892
+ label: "MobileCLIP S1"
37893
+ }, {
37894
+ id: "mobileclip-s2",
37895
+ label: "MobileCLIP S2"
37896
+ }]
37897
+ }].map((s) => [s.stepId, s.defaultModelId])));
37898
+ string().min(1);
37828
37899
  object({
37829
37900
  /**
37830
37901
  * Fraction of the box's own size added on EACH side before cutting.
@@ -37845,10 +37916,21 @@ object({
37845
37916
  */
37846
37917
  square: boolean()
37847
37918
  });
37848
- ({
37919
+ /**
37920
+ * The convention in force when nobody has configured one — byte-for-byte the
37921
+ * behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
37922
+ */
37923
+ var DEFAULT_DETAIL_CROP_CONVENTION = {
37849
37924
  paddingRatio: .15,
37850
37925
  square: false
37851
- }).paddingRatio;
37926
+ };
37927
+ Object.freeze({
37928
+ x: 0,
37929
+ y: 0,
37930
+ w: 1,
37931
+ h: 1
37932
+ });
37933
+ DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
37852
37934
  /**
37853
37935
  * WHICH delivered frames the decode worker retains a native copy of.
37854
37936
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.24",
3
+ "version": "0.2.25",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",