@camstack/addon-osd-manager 0.1.16 → 0.1.18

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 (19) hide show
  1. package/dist/{MotionZonesSettings-DDk0KstC.mjs → MotionZonesSettings-2bARhPh6.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CsXnMGKT.mjs → PrivacyMaskSettings-Cdqm3uIC.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-8C9vWyuL.mjs → SceneMonitorEditor-C58VvxWO.mjs} +3 -3
  4. package/dist/_stub.js +196 -196
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-Yo6BXk0X.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-AB877qFK.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-KlN_tI2R.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-Df_NHE4W.mjs → hostInit-m3PVQphj.mjs} +3 -3
  9. package/dist/index.js +224 -61
  10. package/dist/index.mjs +224 -61
  11. package/dist/{player-overlays-C5TVZDIL.mjs → player-overlays-CQmBy0Zm.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-B6685e2G.mjs → responsive-jU_1DnOd.mjs} +1 -1
  14. package/dist/{square-ezK9FWt6.mjs → square-BewXHDNm.mjs} +1 -1
  15. package/dist/{trash-2-BoPZpFI0.mjs → trash-2-h2ZuBBnj.mjs} +1 -1
  16. package/dist/{use-device-snapshot-BDmozw2y.mjs → use-device-snapshot--wXDROMR.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CsJNPlNP.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C8_X3KFr.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C9zRtW6C.mjs +0 -26
package/dist/index.js CHANGED
@@ -7641,7 +7641,7 @@ var RecordingBandSchema = object({
7641
7641
  postBufferSec: number().min(0).optional()
7642
7642
  });
7643
7643
  ({
7644
- preBufferSec: 10,
7644
+ preBufferSec: 15,
7645
7645
  postBufferSec: 30
7646
7646
  }).postBufferSec * 1e3;
7647
7647
  /**
@@ -15322,128 +15322,103 @@ var COCO_TO_MACRO = {
15322
15322
  var AUDIO_MACRO_LABELS = [
15323
15323
  {
15324
15324
  id: "speech",
15325
- name: "Speech",
15326
- icon: "🗣️"
15325
+ name: "Speech"
15327
15326
  },
15328
15327
  {
15329
15328
  id: "scream",
15330
- name: "Scream / Shout",
15331
- icon: "😱"
15329
+ name: "Scream / Shout"
15332
15330
  },
15333
15331
  {
15334
15332
  id: "crying",
15335
- name: "Crying / Baby",
15336
- icon: "😢"
15333
+ name: "Crying / Baby"
15337
15334
  },
15338
15335
  {
15339
15336
  id: "laughter",
15340
- name: "Laughter",
15341
- icon: "😂"
15337
+ name: "Laughter"
15342
15338
  },
15343
15339
  {
15344
15340
  id: "music",
15345
- name: "Music",
15346
- icon: "🎵"
15341
+ name: "Music"
15347
15342
  },
15348
15343
  {
15349
15344
  id: "dog",
15350
- name: "Dog",
15351
- icon: "🐕"
15345
+ name: "Dog"
15352
15346
  },
15353
15347
  {
15354
15348
  id: "cat",
15355
- name: "Cat",
15356
- icon: "🐈"
15349
+ name: "Cat"
15357
15350
  },
15358
15351
  {
15359
15352
  id: "bird",
15360
- name: "Bird",
15361
- icon: "🐦"
15353
+ name: "Bird"
15362
15354
  },
15363
15355
  {
15364
15356
  id: "animal",
15365
- name: "Animal (other)",
15366
- icon: "🐾"
15357
+ name: "Animal (other)"
15367
15358
  },
15368
15359
  {
15369
15360
  id: "alarm",
15370
- name: "Alarm / Siren",
15371
- icon: "🚨"
15361
+ name: "Alarm / Siren"
15372
15362
  },
15373
15363
  {
15374
15364
  id: "doorbell",
15375
- name: "Doorbell / Knock",
15376
- icon: "🔔"
15365
+ name: "Doorbell / Knock"
15377
15366
  },
15378
15367
  {
15379
15368
  id: "glass_breaking",
15380
- name: "Glass Breaking",
15381
- icon: "💥"
15369
+ name: "Glass Breaking"
15382
15370
  },
15383
15371
  {
15384
15372
  id: "gunshot",
15385
- name: "Gunshot / Explosion",
15386
- icon: "💣"
15373
+ name: "Gunshot / Explosion"
15387
15374
  },
15388
15375
  {
15389
15376
  id: "vehicle",
15390
- name: "Vehicle",
15391
- icon: "🚗"
15377
+ name: "Vehicle"
15392
15378
  },
15393
15379
  {
15394
15380
  id: "siren",
15395
- name: "Emergency Siren",
15396
- icon: "🚑"
15381
+ name: "Emergency Siren"
15397
15382
  },
15398
15383
  {
15399
15384
  id: "fire",
15400
- name: "Fire / Smoke",
15401
- icon: "🔥"
15385
+ name: "Fire / Smoke"
15402
15386
  },
15403
15387
  {
15404
15388
  id: "water",
15405
- name: "Water",
15406
- icon: "💧"
15389
+ name: "Water"
15407
15390
  },
15408
15391
  {
15409
15392
  id: "wind",
15410
- name: "Wind / Weather",
15411
- icon: "🌬️"
15393
+ name: "Wind / Weather"
15412
15394
  },
15413
15395
  {
15414
15396
  id: "door",
15415
- name: "Door",
15416
- icon: "🚪"
15397
+ name: "Door"
15417
15398
  },
15418
15399
  {
15419
15400
  id: "footsteps",
15420
- name: "Footsteps",
15421
- icon: "👣"
15401
+ name: "Footsteps"
15422
15402
  },
15423
15403
  {
15424
15404
  id: "crowd",
15425
- name: "Crowd / Chatter",
15426
- icon: "👥"
15405
+ name: "Crowd / Chatter"
15427
15406
  },
15428
15407
  {
15429
15408
  id: "telephone",
15430
- name: "Telephone",
15431
- icon: "📞"
15409
+ name: "Telephone"
15432
15410
  },
15433
15411
  {
15434
15412
  id: "engine",
15435
- name: "Engine / Motor",
15436
- icon: "⚙️"
15413
+ name: "Engine / Motor"
15437
15414
  },
15438
15415
  {
15439
15416
  id: "tools",
15440
- name: "Tools / Construction",
15441
- icon: "🔨"
15417
+ name: "Tools / Construction"
15442
15418
  },
15443
15419
  {
15444
15420
  id: "silence",
15445
- name: "Silence",
15446
- icon: "🤫"
15421
+ name: "Silence"
15447
15422
  }
15448
15423
  ];
15449
15424
  var YAMNET_TO_MACRO = {
@@ -18496,7 +18471,7 @@ var TrackEnvelopeSchema = object({
18496
18471
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
18497
18472
  * keeps every scalar the list surfaces actually render (ids, class(es),
18498
18473
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
18499
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
18474
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
18500
18475
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
18501
18476
  * `getTrack`. Mirrors the event-store `projection` convention
18502
18477
  * (`getObjectEvents` et al.).
@@ -18791,6 +18766,35 @@ var TrackSchema = object({
18791
18766
  */
18792
18767
  hasFace: boolean().optional(),
18793
18768
  /**
18769
+ * This track has a face row IN THE GALLERY: a crop **and** an embedding — a
18770
+ * face an operator could ASSIGN to an identity.
18771
+ *
18772
+ * The STRICT twin of {@link hasFace}, and the pair only earns its keep
18773
+ * because the two disagree. `hasFace` is stamped at the TOP of the face
18774
+ * branch, before every gate, and means no more than "a face detector produced
18775
+ * a face detail". This one is stamped at the single moment the gallery row
18776
+ * LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
18777
+ * past the embedding-magnitude verdict, the `minFacePx` detection gate, the
18778
+ * candidate gate, the imageless-track drop (no crop was ever captured) and
18779
+ * the crop-store drop. Everything between the detector and that insert can
18780
+ * legitimately refuse the face, so a flag written any earlier promises the
18781
+ * operator something to assign and delivers nothing.
18782
+ *
18783
+ * **Independent of recognition.** A face collected but never auto-matched is
18784
+ * still assignable — it is in fact the face an operator most wants to reach —
18785
+ * so this is NOT gated on `recognizedIdentityId`. Recognition lands in
18786
+ * `subLabel`; this says only that the raw material exists.
18787
+ *
18788
+ * **Set once, never cleared.** A track that produced a gallery row produced
18789
+ * one; deleting the row later is the gallery's business, not this flag's.
18790
+ *
18791
+ * **Absent ≠ false**, the same rule as {@link hasFace}: every row written
18792
+ * before the column omits it, and so does every server that predates the
18793
+ * field. A consumer must test `=== true` and render nothing otherwise —
18794
+ * never infer "no assignable face".
18795
+ */
18796
+ hasEmbeddedFace: boolean().optional(),
18797
+ /**
18794
18798
  * This subject CONTAINS a folded rider — a person the rider-pairing step
18795
18799
  * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
18796
18800
  * so the passage is tracked once and as a VEHICLE.
@@ -20733,6 +20737,32 @@ var DetailResultSchema = object({
20733
20737
  /** FRAME-space bbox (already mapped back from crop space). */
20734
20738
  bbox: NativeCropBboxSchema.optional(),
20735
20739
  embedding: string().optional(),
20740
+ /**
20741
+ * L2 magnitude of the RAW pre-normalization embedding. Additive and optional
20742
+ * so an older runner that does not send it degrades to "unmeasurable", which
20743
+ * the consuming gate treats as accept — never as reject.
20744
+ */
20745
+ embeddingMagnitude: number().optional(),
20746
+ /**
20747
+ * Model that produced `embedding` — the SAME contract `labelModelId` has for
20748
+ * `label`, and for the same reason: the producing node is the only side that
20749
+ * knows which model actually ran, and re-deriving it downstream is exactly
20750
+ * the inference this model exists to forbid.
20751
+ *
20752
+ * Additive and optional, so a runner that predates it degrades to
20753
+ * "unmeasurable" rather than to a wrong answer — the consumer falls back to
20754
+ * its previous assumption instead of refusing.
20755
+ *
20756
+ * Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
20757
+ * to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
20758
+ * with nothing on the wire it took the id from the GALLERY, so the gate
20759
+ * compared the gallery against itself and could never fire. That turned the
20760
+ * one guard protecting the face feature space into a tautology, and it is
20761
+ * why swapping `face-embedding`'s model would NOT have stranded the enrolled
20762
+ * gallery as the catalog comment predicts — it would have scored the new
20763
+ * model's vectors against the old model's samples in one cosine space.
20764
+ */
20765
+ embeddingModelId: string().optional(),
20736
20766
  label: string().optional(),
20737
20767
  /**
20738
20768
  * The tier `label` occupies, copied VERBATIM from the producing step's
@@ -21750,6 +21780,12 @@ var CameraStatusSchema = object({
21750
21780
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
21751
21781
  fetchedAt: number()
21752
21782
  });
21783
+ var InferenceDeviceExclusionReasonSchema = _enum([
21784
+ "disabled",
21785
+ "unavailable",
21786
+ "cannot-host-camera-root",
21787
+ "accelerator-preferred"
21788
+ ]);
21753
21789
  var NodeInferenceDeviceSchema = object({
21754
21790
  /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
21755
21791
  key: string(),
@@ -21780,7 +21816,17 @@ var NodeInferenceDeviceSchema = object({
21780
21816
  * available per format; this is the stored selection that becomes the
21781
21817
  * default for EVERY camera landing on this accelerator.
21782
21818
  */
21783
- steps: record(string(), DeviceStepConfigSchema).optional()
21819
+ steps: record(string(), DeviceStepConfigSchema).optional(),
21820
+ /**
21821
+ * `null` when the device IS a camera-root candidate on this node; otherwise
21822
+ * the reason the dispatcher drops it. Computed by the SAME
21823
+ * `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
21824
+ * never disagree with the election — deriving it in the UI from
21825
+ * `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
21826
+ * the node's model catalog) and `accelerator-preferred` (needs the node-wide
21827
+ * "an accelerator is serving" predicate).
21828
+ */
21829
+ exclusion: InferenceDeviceExclusionReasonSchema.nullable()
21784
21830
  });
21785
21831
  var NodeInferenceDevicesSchema = object({
21786
21832
  nodeId: string(),
@@ -22695,6 +22741,7 @@ var snapshotCapability = {
22695
22741
  isBattery: boolean(),
22696
22742
  reason: _enum([
22697
22743
  "disabled",
22744
+ "offline",
22698
22745
  "sleeping",
22699
22746
  "unreachable",
22700
22747
  "waking"
@@ -22784,9 +22831,17 @@ targets: array(object({
22784
22831
  sleeping: boolean(),
22785
22832
  /** Current device state rendered over the cached frame. State images
22786
22833
  * remain authoritative even when their photographic background is
22787
- * old; null means the link must carry a current camera frame. */
22834
+ * old; null means the link must carry a current camera frame.
22835
+ *
22836
+ * **This is the ONLY source a surface may derive an inactive tile
22837
+ * from.** A client that reads a device's `online`/`disabled` flags and
22838
+ * draws its own verdict will disagree with the pixels it is painting
22839
+ * — the frame comes from here, and so must the sentence over it
22840
+ * (D190). Pair with `ageMs` for the age of the photograph behind the
22841
+ * state. */
22788
22842
  stateReason: _enum([
22789
22843
  "disabled",
22844
+ "offline",
22790
22845
  "sleeping",
22791
22846
  "unreachable",
22792
22847
  "waking"
@@ -27744,7 +27799,12 @@ var ListResultSchema = object({
27744
27799
  probedAt: number()
27745
27800
  });
27746
27801
  var PreferredSchema = LocalInterfaceSchema.nullable();
27747
- var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
27802
+ /**
27803
+ * Candidate base URL for the SDK to race on connect. Order matters —
27804
+ * the SDK should attempt these top-to-bottom with a short per-candidate
27805
+ * timeout (e.g. 1500ms) and cache the winner for the session.
27806
+ */
27807
+ var ConnectionEndpointSchema = object({
27748
27808
  /** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
27749
27809
  label: string(),
27750
27810
  /** Fully-formed base URL with scheme + host + port. */
@@ -27787,7 +27847,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
27787
27847
  * ordering between polls.
27788
27848
  */
27789
27849
  priority: number()
27790
- })).readonly() });
27850
+ });
27851
+ /**
27852
+ * Where the advertised local port came from. Ordered most → least
27853
+ * authoritative, and the whole point of returning it: a client must be able to
27854
+ * tell a FACT about the hub's socket from an echo of its own guess.
27855
+ */
27856
+ var LocalPortSourceEnum = _enum([
27857
+ "server-config",
27858
+ "server-env",
27859
+ "caller-hint",
27860
+ "default"
27861
+ ]);
27862
+ /** The port every LAN/loopback `baseUrl` in the same result was built with. */
27863
+ var AdvertisedLocalPortSchema = object({
27864
+ port: number().int().min(1).max(65535),
27865
+ source: LocalPortSourceEnum
27866
+ });
27867
+ var GetConnectionEndpointsResultSchema = object({
27868
+ endpoints: array(ConnectionEndpointSchema).readonly(),
27869
+ /**
27870
+ * The port the hub built the LAN/loopback URLs with, and where that number
27871
+ * came from.
27872
+ *
27873
+ * Returned rather than merely applied, because "the URL is right" and "the
27874
+ * client can KNOW the URL is right" are different properties. A client that
27875
+ * only sees a corrected URL cannot distinguish a hub that fixed the port from
27876
+ * a hub that echoed the port the client sent, so it cannot decide whether to
27877
+ * race the candidate or discard it. With `source` it can: anything but
27878
+ * `caller-hint` is the hub's own socket.
27879
+ *
27880
+ * Absent on hubs predating this field — a client that finds it missing is
27881
+ * talking to an echoing hub and must degrade exactly as it does for
27882
+ * `caller-hint`.
27883
+ */
27884
+ localPort: AdvertisedLocalPortSchema
27885
+ });
27791
27886
  /**
27792
27887
  * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
27793
27888
  * AUTO (resolved from the candidate ranking at send time); `resolved` reports
@@ -27833,10 +27928,35 @@ var localNetworkCapability = {
27833
27928
  * Honours `getAllowedAddresses()` when set — addresses outside
27834
27929
  * the allowlist are dropped (the public tunnel + loopback are
27835
27930
  * always included as escape hatches).
27931
+ *
27932
+ * **The port is the hub's, not the caller's** (D62 — a function's fact
27933
+ * belongs to whoever already owns it). This method used to take a `port`
27934
+ * and echo it onto every LAN and loopback URL it advertised, which made
27935
+ * every client a second authority on a socket only the hub binds. A viewer
27936
+ * configured with a port-less public URL (`https://camstack.example.top`)
27937
+ * infers 443 from the scheme, asks with 443, and was handed
27938
+ * `https://192.168.1.9:443` for a hub listening on 4443. That candidate
27939
+ * cannot ever answer, and losing its race reads in the log exactly like
27940
+ * "the LAN was tried and it was slower" — so an operator sitting on his own
27941
+ * WiFi stayed on the public tunnel for weeks, with the LAN candidate born
27942
+ * dead on every single connect.
27943
+ *
27944
+ * The hub now resolves its own listen port and reports it as `localPort`,
27945
+ * with the SOURCE of the number, so a client can tell a fact from an echo.
27946
+ *
27947
+ * Out of scope on purpose: a LAN URL that is not the hub's own socket (a
27948
+ * reverse proxy in front of it on another port) is not this method's to
27949
+ * invent either — pin it with `setNotificationEndpoint` / a configured
27950
+ * origin, which is an operator statement rather than a guess.
27836
27951
  */
27837
27952
  getConnectionEndpoints: method(object({
27838
- /** Local hub HTTP port to use in base URLs. */
27839
- port: number().int().min(1).max(65535),
27953
+ /**
27954
+ * LEGACY HINT — do not send from new code. Kept optional so clients
27955
+ * written against the echoing contract keep working; the hub uses it
27956
+ * only when it cannot read its own port, and says so via
27957
+ * `localPort.source === 'caller-hint'`.
27958
+ */
27959
+ port: number().int().min(1).max(65535).optional(),
27840
27960
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
27841
27961
  * candidate. Default `true`. */
27842
27962
  includeLoopback: boolean().optional(),
@@ -40780,7 +40900,6 @@ var NC_AUDIO_DEFAULTS = {
40780
40900
  hitPercent: 60,
40781
40901
  samplingSeconds: 10
40782
40902
  };
40783
- new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
40784
40903
  new Set(["devices", "classes"]);
40785
40904
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
40786
40905
  var WEEKDAY_TO_DAY = {
@@ -41074,6 +41193,39 @@ TimelapseRuleInputSchema.extend({
41074
41193
  createdAt: number(),
41075
41194
  updatedAt: number()
41076
41195
  });
41196
+ Object.freeze(Object.fromEntries([{
41197
+ stepId: "face-embedding",
41198
+ label: "Face recognition model",
41199
+ defaultModelId: "arcface-r100",
41200
+ indexName: "the enrolled face gallery",
41201
+ options: [
41202
+ {
41203
+ id: "arcface-r100",
41204
+ label: "ArcFace (ResNet34)"
41205
+ },
41206
+ {
41207
+ id: "auraface-r100",
41208
+ label: "AuraFace R100"
41209
+ },
41210
+ {
41211
+ id: "inception-resnet-v1",
41212
+ label: "Inception ResNet V1"
41213
+ }
41214
+ ]
41215
+ }, {
41216
+ stepId: "clip-embedding",
41217
+ label: "Semantic search model",
41218
+ defaultModelId: "mobileclip-s1",
41219
+ indexName: "the object semantic-search index",
41220
+ options: [{
41221
+ id: "mobileclip-s1",
41222
+ label: "MobileCLIP S1"
41223
+ }, {
41224
+ id: "mobileclip-s2",
41225
+ label: "MobileCLIP S2"
41226
+ }]
41227
+ }].map((s) => [s.stepId, s.defaultModelId])));
41228
+ string().min(1);
41077
41229
  object({
41078
41230
  /**
41079
41231
  * Fraction of the box's own size added on EACH side before cutting.
@@ -41094,10 +41246,21 @@ object({
41094
41246
  */
41095
41247
  square: boolean()
41096
41248
  });
41097
- ({
41249
+ /**
41250
+ * The convention in force when nobody has configured one — byte-for-byte the
41251
+ * behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
41252
+ */
41253
+ var DEFAULT_DETAIL_CROP_CONVENTION = {
41098
41254
  paddingRatio: .15,
41099
41255
  square: false
41100
- }).paddingRatio;
41256
+ };
41257
+ Object.freeze({
41258
+ x: 0,
41259
+ y: 0,
41260
+ w: 1,
41261
+ h: 1
41262
+ });
41263
+ DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
41101
41264
  /**
41102
41265
  * WHICH delivered frames the decode worker retains a native copy of.
41103
41266
  *