@camstack/addon-post-analysis 1.2.271 → 1.2.273

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.
@@ -5359,7 +5359,7 @@ var ZodIssueCode = {
5359
5359
  var ZodFirstPartyTypeKind;
5360
5360
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5361
5361
  //#endregion
5362
- //#region ../types/dist/sleep-CiR4z7r9.mjs
5362
+ //#region ../types/dist/sleep-CaB_hL5g.mjs
5363
5363
  /**
5364
5364
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5365
5365
  * window to float samples (D455).
@@ -7585,6 +7585,8 @@ var EVENT_OWNER_TYPES = [
7585
7585
  * nothing failing until a caller asked.
7586
7586
  */
7587
7587
  var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
7588
+ /** The same list as a Zod enum, for the cap input that carries it. */
7589
+ var MediaPresenceOwnerKindSchema = _enum([...EVENT_OWNER_TYPES, "track"]);
7588
7590
  var EVENT_OWNER_TYPE_SET = new Set(EVENT_OWNER_TYPES);
7589
7591
  /** True when this key's owner is one of the three event tables. */
7590
7592
  function isEventOwnerType(ownerType) {
@@ -8457,24 +8459,6 @@ var DetectionCatalogClassMapSchema = object({
8457
8459
  preserveOriginal: boolean()
8458
8460
  });
8459
8461
  /**
8460
- * THE canonical event-clip pad: the time window a single-timestamp analytics
8461
- * event expands to when joined with footage (clip window = `[timestamp - preMs,
8462
- * timestamp + postMs]`). Matches the admin-ui clip window (−5s/+10s).
8463
- *
8464
- * Every consumer derives from this ONE constant so event↔footage boundaries
8465
- * agree everywhere (C1): today that is the `videoclips` default provider
8466
- * (addon-post-analysis), which pads its clip windows with it. The recorder used
8467
- * to pad in-RAM playback markers with it too; those markers had no reader
8468
- * anywhere in the repo and were deleted on 2026-08-29.
8469
- *
8470
- * NOTE: this is a UI/JOIN convention, NOT the `events`-band keep/discard gate —
8471
- * that uses the per-device `preBufferSec`/`postBufferSec` config.
8472
- */
8473
- var EVENT_PAD_MS = {
8474
- preMs: 5e3,
8475
- postMs: 1e4
8476
- };
8477
- /**
8478
8462
  * Numeric day-of-week: 0 = Sunday … 6 = Saturday (matches `Date.getDay`).
8479
8463
  * Named `RecordingWeekday` to avoid collision with the string-union
8480
8464
  * `Weekday` exported from `interfaces/timezones.ts`.
@@ -8627,20 +8611,7 @@ var RecordingBandSchema = object({
8627
8611
  preBufferSec: number().min(0).optional(),
8628
8612
  postBufferSec: number().min(0).optional()
8629
8613
  });
8630
- /**
8631
- * Adjacent recorded ranges closer than this belong to the SAME videoclip visit.
8632
- *
8633
- * This is NOT the recorder calendar merge (`RANGE_MERGE_GAP_MS = 5s`). That
8634
- * threshold is for the timeline bar, which must show exact holes — including
8635
- * the ~8s GOP/keyframe rolls measured on events-mode cameras (dispensa 1438,
8636
- * 2026-08-16). A videoclip is the events-mode keep-window (writer session),
8637
- * whose idle bound is `postBufferSec`. Using that default (30s) glues those
8638
- * intra-visit holes without joining visits hours apart.
8639
- *
8640
- * Segments stay the source of truth on disk (`startMs-durMs-bytes.m4s`); a
8641
- * visit is derived, not a second copy of the files.
8642
- */
8643
- var VISIT_MERGE_GAP_MS = { postBufferSec: 30 }.postBufferSec * 1e3;
8614
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8644
8615
  /**
8645
8616
  * Per-device retention overrides. Every field is optional; an unset or `0`
8646
8617
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -23210,6 +23181,35 @@ var pipelineAnalyticsCapability = {
23210
23181
  deviceId: number()
23211
23182
  }), array(MediaFileInfoSchema).readonly()),
23212
23183
  /**
23184
+ * Which of `ownerIds` hold at least ONE media row — an INDEX read, never a
23185
+ * blob read, and the LICENCE `videoclips` needs to publish a `thumbnail`.
23186
+ *
23187
+ * The event-media URL is stamped from a template for every event in the
23188
+ * system, so "the plane is up" was being served as "there are bytes": 64 of
23189
+ * one camera's 179 clips pointed at a 404 (device 3836, 2026-08-17). This
23190
+ * is the question that turns the stamp into a claim.
23191
+ *
23192
+ * It is on the WIRE because the clip source is registered by the addon that
23193
+ * owns the FOOTAGE, not by this one (D560) — the probe used to be an
23194
+ * in-process `MediaStore` read. One call per OWNER KIND, never one per
23195
+ * owner: that N+1 is what `MediaStore.ownersWithMedia` was written to
23196
+ * prevent, and crossing a process boundary makes it worse, not better.
23197
+ * `ownerIds` is bounded at the same 5 000 the annotation fetch is bounded
23198
+ * at, so one pathological camera-day cannot mint an unbounded request.
23199
+ *
23200
+ * THROWS rather than answering partially. A probe that quietly
23201
+ * under-reports reads as "these owners have nothing" and the caller drops
23202
+ * thumbnails that exist — the opposite failure to the one above, and
23203
+ * equally invisible.
23204
+ *
23205
+ * `deviceId` is the authorization subject, exactly as on `getEventMedia`.
23206
+ */
23207
+ ownersWithMedia: method(object({
23208
+ deviceId: number(),
23209
+ ownerKind: MediaPresenceOwnerKindSchema,
23210
+ ownerIds: array(string()).max(5e3)
23211
+ }), array(string()).readonly()),
23212
+ /**
23213
23213
  * Search object events by text query using CLIP cosine similarity.
23214
23214
  * Encodes `text` via the `embedding-encoder` cap, queries the
23215
23215
  * `ObjectEmbeddingStore` with optional prefilters, ranks all matching
@@ -26283,6 +26283,18 @@ method(VectorDeclareIndexInputSchema, _void(), {
26283
26283
  kind: "mutation",
26284
26284
  auth: "admin"
26285
26285
  }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
26286
+ _enum([
26287
+ "queue-full",
26288
+ "camera-backoff",
26289
+ "sleeping",
26290
+ "camera-refused",
26291
+ "no-keyframe",
26292
+ "no-catalog-row",
26293
+ "unsupported",
26294
+ "unknown-device",
26295
+ "uid-missing"
26296
+ ]);
26297
+ _enum(["deferred", "final"]);
26286
26298
  var ClipSchema = object({
26287
26299
  /** Opaque, provider-namespaced id. The default provider encodes the time
26288
26300
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -26357,44 +26369,244 @@ var ClipSchema = object({
26357
26369
  holes: array(object({
26358
26370
  startMs: number(),
26359
26371
  endMs: number()
26360
- })).optional()
26372
+ })).optional(),
26373
+ /**
26374
+ * A URL that MAY produce this clip's still, asked only for rows actually on
26375
+ * screen. The opposite of {@link ClipSchema.thumbnail}: that one is VOUCHED
26376
+ * (a JPEG is already on disk), this one is an offer. The route answers 200
26377
+ * with the image, or 204 with `x-camstack-reason` when it could not mint one
26378
+ * — a surface latches that refusal to the instant rather than retrying.
26379
+ *
26380
+ * Never both: a clip with a vouched `thumbnail` needs no mint.
26381
+ */
26382
+ thumbnailMint: string().optional(),
26383
+ /**
26384
+ * Why no still will be produced for this clip RIGHT NOW — set when the
26385
+ * provider already knows, so the surface draws the glyph and the reason
26386
+ * instead of firing a mint that cannot succeed.
26387
+ *
26388
+ * `sleeping` — a standalone battery camera; a read would be a wake (D549 4).
26389
+ * `camera-refused` — the camera answered the CoverPreview with a refusal.
26390
+ * `no-keyframe` — the window holds no decodable I-frame (an event that sits
26391
+ * inside no file is the measured case).
26392
+ * `unsupported` — this source cannot mint stills at all.
26393
+ */
26394
+ thumbnailUnavailable: object({ reason: _enum([
26395
+ "sleeping",
26396
+ "camera-refused",
26397
+ "no-keyframe",
26398
+ "unsupported"
26399
+ ]) }).optional(),
26400
+ /**
26401
+ * When the catalog this row came from was last CONFIRMED against the device.
26402
+ * Absent means "this row was read live". A persisted catalog served while a
26403
+ * camera sleeps carries the age it really has — a cached list is never drawn
26404
+ * as current (D549 13).
26405
+ */
26406
+ catalogAsOf: number().optional(),
26407
+ /**
26408
+ * The camera's OWN type strings for this clip, all of them, unmapped
26409
+ * (`md`, `people`, `dog_cat`, `sched`, …). Kept beside {@link labels}
26410
+ * because a firmware inventing a type must not vanish: the mapping into our
26411
+ * filter vocabulary is lossy on purpose and this is the lossless copy
26412
+ * (D549 20).
26413
+ */
26414
+ nativeTypes: array(string()).optional(),
26415
+ /**
26416
+ * What the subject DID — `crossline`, `intrude`, `loitering`. A behaviour
26417
+ * travels BESIDE a class, never instead of one, and the class filter ignores
26418
+ * it: "a person crossed a line" is still a person (D549 20).
26419
+ */
26420
+ behaviours: array(string()).optional(),
26421
+ /**
26422
+ * The same recording as two files — the sub twin (what the row and its
26423
+ * thumbnail are) and its main twin, matched at listing time so a quality
26424
+ * change never re-searches the camera (D549 15). `getClipPlayback`'s
26425
+ * `profile` picks between them: `low | mid` → sub, `high` → main.
26426
+ */
26427
+ streams: object({
26428
+ sub: object({
26429
+ id: string(),
26430
+ bytes: number().optional()
26431
+ }).optional(),
26432
+ main: object({
26433
+ id: string(),
26434
+ bytes: number().optional()
26435
+ }).optional()
26436
+ }).optional(),
26437
+ /** The camera says it holds a sub-stream copy of this recording. */
26438
+ supportSub: boolean().optional(),
26439
+ /**
26440
+ * Whether this row has bytes behind it. ABSENT means yes — every clip that
26441
+ * IS a file is playable, and only a source that lists EVENTS can produce a
26442
+ * row with nothing to play (the measured case: 1 of 29 hub events on 3628
26443
+ * fell inside no file). Such a row is shown, never dropped and never offered
26444
+ * as playable-then-failing (D549 19).
26445
+ */
26446
+ playable: boolean().optional(),
26447
+ /** Why {@link playable} is false, verbatim (`no-file-for-window`). */
26448
+ unplayableReason: string().optional(),
26449
+ /**
26450
+ * This clip is STILL BEING WRITTEN, so {@link ClipSchema.timeRange}`.endMs`
26451
+ * is not its end.
26452
+ *
26453
+ * Absent — the common case — means the row is closed and its `endMs` is the
26454
+ * end of the recording. Present and `true` means the source told us the file
26455
+ * has no end yet, and the `endMs` we carry is whatever the camera's index
26456
+ * entry happened to hold: on a Reolink E1 Outdoor PoE (592, measured
26457
+ * 2026-09-20) the newest file `…_192927_000000_…_0.mp4` reported an `endTime`
26458
+ * of 19:29:56 and STILL reported it eight minutes later, while the file went
26459
+ * on growing. A surface that drew 29 s there was lying about a clip that
26460
+ * plays for minutes, on the one row the operator looks at first.
26461
+ *
26462
+ * `endMs` is deliberately still a number: it is the best bound anything has
26463
+ * for a mint window or a byte fetch, and every consumer already requires it.
26464
+ * This flag says what it is WORTH, and a duration is not drawn from it.
26465
+ */
26466
+ inProgress: boolean().optional()
26361
26467
  });
26362
26468
  var ClipPlaybackSchema = object({
26363
- /** HLS master URL through the hub data-plane (Range + token in path). */
26469
+ /**
26470
+ * A media URL through the hub data-plane. {@link ClipPlaybackSchema.format}
26471
+ * says what kind — an HLS master playlist for a recording-derived clip, a
26472
+ * progressive MP4 for a native file the vendor addon muxed and serves with
26473
+ * `Range`. The URL is NOT a credential: both planes are registered
26474
+ * `access: 'authenticated'` and the hub's `/addon/<id>/<prefix>` proxy takes
26475
+ * the session cookie, so nothing is appended to it (D549 22).
26476
+ */
26364
26477
  playbackUrl: string(),
26478
+ /**
26479
+ * How to play {@link playbackUrl}. Absent means `hls` — the shape every
26480
+ * existing consumer already assumes. A player that branches on this is the
26481
+ * one change a native clip needs; a player that ignores it will hand an MP4
26482
+ * to hls.js and fail parsing it as a manifest.
26483
+ */
26484
+ format: _enum(["hls", "mp4"]).optional(),
26485
+ /**
26486
+ * Which twin was actually served. A clip that holds only one stream answers
26487
+ * with the one it has, and the surface SAYS so — a missing main twin is
26488
+ * never served silently as if it were the asked-for quality (D549 15).
26489
+ */
26490
+ served: CamProfileSchema.optional(),
26365
26491
  /** Optional LAN/remote alternates for the same clip. */
26366
26492
  playbackEndpoints: array(string()).optional(),
26367
26493
  token: string().optional()
26368
26494
  });
26369
- var videoclipsCapability = {
26370
- name: "videoclips",
26371
- scope: "device",
26372
- mode: "singleton",
26373
- kind: "wrapper",
26374
- defaultActive: true,
26375
- /** A clip is a window over a camera's footage — the cap is meaningless on a
26376
- * sensor, a button or an event emitter, and the `defaultActive` auto-bind
26377
- * reads this to decide which devices it may claim. */
26378
- deviceTypes: [DeviceType.Camera],
26379
- methods: {
26380
- listClips: method(object({
26381
- deviceId: number(),
26382
- since: number(),
26383
- until: number(),
26384
- limit: number().int().positive().optional()
26385
- }), array(ClipSchema).readonly(), {
26386
- kind: "query",
26387
- auth: "admin"
26388
- }),
26389
- getClipPlayback: method(object({
26390
- deviceId: number(),
26391
- clipId: string()
26392
- }), ClipPlaybackSchema, {
26393
- kind: "query",
26394
- auth: "admin"
26395
- })
26396
- }
26397
- };
26495
+ /**
26496
+ * Why a source cannot answer right now — per SOURCE, never fleet-wide.
26497
+ *
26498
+ * `ok` is the only state whose clip list may be read as complete. The other
26499
+ * three exist because an empty list from a sleeping camera reads as "this
26500
+ * camera has no recordings", which is the defect this whole line of work is
26501
+ * about: a battery camera nobody woke (`sleeping`), a camera that could not be
26502
+ * reached at all (`unreachable`, also what a provider that THREW reports), a
26503
+ * camera whose SD card is not mounted (`no-storage`, measured on 640 —
26504
+ * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
26505
+ * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
26506
+ * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
26507
+ * files on both streams and both filters, with 177 GB free). That last one is
26508
+ * a defect ON THE CAMERA, and the only honest thing a provider can do is say
26509
+ * which days it asked for and got nothing — "no clips" would be a lie about a
26510
+ * card that is full of them.
26511
+ */
26512
+ var ClipSourceAvailabilitySchema = object({
26513
+ state: _enum([
26514
+ "ok",
26515
+ "sleeping",
26516
+ "unreachable",
26517
+ "no-storage",
26518
+ "index-empty"
26519
+ ]),
26520
+ /** Free text, shown verbatim. Names the camera's own refusal when there is one. */
26521
+ reason: string().optional(),
26522
+ /** When this source's catalog was last CONFIRMED. A cached list is never
26523
+ * drawn as current: the surface shows the age whenever it is older than the
26524
+ * refresh interval. */
26525
+ catalogAsOf: number().optional()
26526
+ });
26527
+ /**
26528
+ * One SOURCE of clips for a camera — a row of the picker, and the namespace
26529
+ * every clip id from it is prefixed with (`analytics`,
26530
+ * `native:reolink:onboard`, `hksv`, …).
26531
+ *
26532
+ * A provider lists the sources IT serves for that device, and answers for each
26533
+ * of them whether it can answer at all. A provider with nothing to offer on a
26534
+ * camera returns `[]` — it is not that camera's business.
26535
+ */
26536
+ var ClipSourceSchema = object({
26537
+ /** The value this source stamps on {@link ClipSchema.source}, and the prefix
26538
+ * of every clip id it mints. `getClipPlayback` routes on it. */
26539
+ source: string(),
26540
+ /** Operator-facing name of the source ("CamStack recordings", "SD card"). */
26541
+ label: string(),
26542
+ /**
26543
+ * The addon that SERVES this row.
26544
+ *
26545
+ * A surface cannot otherwise resolve a source to who answers it, and the
26546
+ * alternative — a `native:reolink:* → provider-reolink` table inside the
26547
+ * widget — is a second authority on provider identity living in the one
26548
+ * package with no business knowing it, wrong the day a third source appears
26549
+ * (D557). One addon may serve SEVERAL sources, which is why the per-device
26550
+ * switch is keyed by SOURCE and not by this (D555) — `addon-provider-reolink`
26551
+ * served a hub child two of them until the two views were measured to be one
26552
+ * store read twice (D555) and then read ONE way (D565).
26553
+ *
26554
+ * Optional for version skew only. The collection dispatcher stamps it from
26555
+ * the registry, so a row that travelled through the fan-out carries the
26556
+ * authoritative id whatever the provider filled in.
26557
+ */
26558
+ addonId: string().optional(),
26559
+ availability: ClipSourceAvailabilitySchema
26560
+ });
26561
+ DeviceType.Camera, method(object({
26562
+ deviceId: number(),
26563
+ since: number(),
26564
+ until: number(),
26565
+ limit: number().int().positive().optional(),
26566
+ /**
26567
+ * WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
26568
+ * carries, never a source id and never a list.
26569
+ *
26570
+ * Absent means the device's BOUND provider, which is CamStack on every
26571
+ * camera today because that is what `deviceManager.getBindings`
26572
+ * answers with. A provider the device is not bound to is refused by
26573
+ * name rather than answered by another one (D552's
26574
+ * `rejectUnresolvedAddonPin` rule).
26575
+ *
26576
+ * It replaced `sources?: string[]`, a VIEW filter over source ids that
26577
+ * assumed the answer was a fan-out over everything a camera has. The
26578
+ * operator settled otherwise on 2026-09-20 — *"il get videoclips
26579
+ * prendere un provider opzionale, di default va su camstack"*,
26580
+ * *"l'utilizzatore è uno solo"* — so the list is asked of one provider
26581
+ * at a time and there is nothing to filter out of it.
26582
+ */
26583
+ provider: string().optional()
26584
+ }), array(ClipSchema).readonly(), {
26585
+ kind: "query",
26586
+ auth: "protected"
26587
+ }), method(object({ deviceId: number() }), array(ClipSourceSchema).readonly(), {
26588
+ kind: "query",
26589
+ auth: "protected"
26590
+ }), method(object({
26591
+ deviceId: number(),
26592
+ clipId: string(),
26593
+ /**
26594
+ * Which twin to serve, on the ONE quality scale the system already has
26595
+ * (`CamProfileSchema`). `low | mid` → the sub file, `high` → the main
26596
+ * twin; both ids are already on the row so this never re-searches the
26597
+ * camera. Absent means the provider's own default (the sub file, which
26598
+ * every source is measured to hold).
26599
+ *
26600
+ * `auto` is deliberately NOT accepted here: a stored file has no
26601
+ * broker session, so the adaptive tier cannot be resolved for it. The
26602
+ * viewer resolves `auto` to a profile the same way live does, before
26603
+ * it calls (D549 15).
26604
+ */
26605
+ profile: CamProfileSchema.optional()
26606
+ }), ClipPlaybackSchema, {
26607
+ kind: "query",
26608
+ auth: "protected"
26609
+ });
26398
26610
  /**
26399
26611
  * Optional client-side hints sent at session creation to help the provider
26400
26612
  * pick the best native source. All fields optional — a viewer that knows
@@ -41699,6 +41911,12 @@ Object.freeze({
41699
41911
  addonId: null,
41700
41912
  access: "view"
41701
41913
  },
41914
+ "pipelineAnalytics.ownersWithMedia": {
41915
+ capName: "pipeline-analytics",
41916
+ capScope: "device",
41917
+ addonId: null,
41918
+ access: "view"
41919
+ },
41702
41920
  "pipelineAnalytics.pauseForStorageMigration": {
41703
41921
  capName: "pipeline-analytics",
41704
41922
  capScope: "device",
@@ -44291,6 +44509,12 @@ Object.freeze({
44291
44509
  addonId: null,
44292
44510
  access: "view"
44293
44511
  },
44512
+ "videoclips.listSources": {
44513
+ capName: "videoclips",
44514
+ capScope: "device",
44515
+ addonId: null,
44516
+ access: "view"
44517
+ },
44294
44518
  "viewerUi.getStaticDir": {
44295
44519
  capName: "viewer-ui",
44296
44520
  capScope: "system",
@@ -45593,6 +45817,11 @@ Object.freeze({
45593
45817
  form: "single",
45594
45818
  optional: false
45595
45819
  }],
45820
+ "pipelineAnalytics.ownersWithMedia": [{
45821
+ name: "deviceId",
45822
+ form: "single",
45823
+ optional: false
45824
+ }],
45596
45825
  "pipelineAnalytics.proposeRetrainAnnotations": [{
45597
45826
  name: "deviceId",
45598
45827
  form: "single",
@@ -46299,6 +46528,11 @@ Object.freeze({
46299
46528
  form: "single",
46300
46529
  optional: false
46301
46530
  }],
46531
+ "videoclips.listSources": [{
46532
+ name: "deviceId",
46533
+ form: "single",
46534
+ optional: false
46535
+ }],
46302
46536
  "waterHeater.setAway": [{
46303
46537
  name: "deviceId",
46304
46538
  form: "single",
@@ -47580,4 +47814,4 @@ function vectorDimFromBase64(encoded) {
47580
47814
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
47581
47815
  }
47582
47816
  //#endregion
47583
- export { TimelapseRuleSchema as $, array as $t, NcConditionDescriptorSchema as A, readDeviceStateFrom as At, NcTaxonomySchema as B, zoneAnalyticsCapability as Bt, MOTION_CLOSE_AFTER_MS as C, mayWriteToLocation as Ct, NC_DEFAULT_SNOOZE_MINUTES as D, pickClusterStepModels as Dt, NC_CONDITION_CATALOG as E, parseProcStatus as Et, NcScheduleSchema as F, storageOccupancyCapability as Ft, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as G, createEvent as Gt, PoolMemoryWatchdog as H, BaseAddon as Ht, NcSnoozeInputSchema as I, subKindsOf as It, SCENE_DIVERGED as J, hydrateSchema as Jt, SCENE_DEFAULT_ANCHOR_THRESHOLD as K, customAction as Kt, NcSnoozeSchema as L, systemEventFilterApplies as Lt, NcRulePatchSchema as M, resolveLocationMode as Mt, NcRuleSchema as N, resolvePoolMemoryPolicy as Nt, NC_SNOOZE_MAX_MINUTES as O, pipelineAnalyticsCapability as Ot, NcRuleTargetSchema as P, sceneMonitorCapability as Pt, TimelapseRulePatchSchema as Q, _enum as Qt, NcSnoozeSuppressedSchema as R, vectorDimFromBase64 as Rt, MAX_BIRTH_LATENCY_PROXY_MS as S, kebabToCamel as St, NC_ALARM_SYSTEM_EVENT_KINDS as T, occupancyScope as Tt, RECORDING_EXPORT_MAX_READ_BYTES as U, CamProfileSchema as Ut, OpsLogEntrySchema as V, errMsg as Vt, RetrainStatusSchema as W, DeviceType as Wt, TIMELAPSE_DENSE_FLOOR_SEC as X, nodePin as Xt, SceneMonitorSchema as Y, isDeviceScopedCap as Yt, TimelapseRuleInputSchema as Z, sleep as Zt, FULL_IMAGE_BBOX as _, isDetectionMacroClass as _t, CLUSTER_MODEL_SCOPED_STEPS as a, partialRecord as an, audioMetricsCapability as at, MAX_ARCHIVED_DEBUG_NOTES as b, isScheduleActive as bt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as c, unknown as cn, cosineSimilarity as ct, DETECTION_PIPELINE_CAP_NAME as d, encodeVectorBase64 as dt, boolean as en, TrackSourceSchema as et, DeclaredDevices as f, evaluateSensorEdge as ft, FIRST_LEVEL_MACRO_CLASSES as g, hfModelUrl as gt, EVENT_PAD_MS as h, failureContributionCapability as ht, BirthDecisionRecordSchema as i, object as in, assertTimelapseCadences as it, NcRuleInputSchema as j, readTimelapseGeneratedAt as jt, NC_TAXONOMY as k, plateGalleryCapability as kt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as l, EventCategory as ln, deriveRecordingMode as lt, EVENT_OWNER_TYPES as m, faceGalleryCapability as mt, ArchivedDebugNoteSchema as n, literal as nn, addonWidgetsSourceCapability as nt, COCO_TO_MACRO as o, record as on, audioModeOf as ot, EVENT_KIND_BY_CAP as p, evictionPolicyOfLocation as pt, SCENE_DEFAULT_UNCOVERED_POLICY as q, defineCustomActions as qt, BaseDevice as r, number as rn, alarmPanelCapability as rt, DEFAULT_EVENT_COLOR as s, string as sn, buildEventKindDescriptor as st, AUDIO_MACRO_LABELS as t, discriminatedUnion as tn, VISIT_MERGE_GAP_MS as tt, DETECTION_MACRO_CLASSES as u, embeddingEncoderCapability as ut, FailureCounters as v, isEventOwnerType as vt, MediaFileKindEnum as w, notificationRulesCapability as wt, MAX_BIRTH_DECISION_RECORDS as x, isSourceCap as xt, LabelAttributionSchema as y, isMediaOwnerType as yt, NcSystemEventKindSchema as z, videoclipsCapability as zt };
47817
+ export { TrackSourceSchema as $, literal as $t, NcRuleInputSchema as A, resolveLocationMode as At, OpsLogEntrySchema as B, CamProfileSchema as Bt, MediaFileKindEnum as C, occupancyScope as Ct, NC_SNOOZE_MAX_MINUTES as D, plateGalleryCapability as Dt, NC_DEFAULT_SNOOZE_MINUTES as E, pipelineAnalyticsCapability as Et, NcSnoozeInputSchema as F, systemEventFilterApplies as Ft, SCENE_DEFAULT_ANCHOR_THRESHOLD as G, hydrateSchema as Gt, RECORDING_EXPORT_MAX_READ_BYTES as H, createEvent as Ht, NcSnoozeSchema as I, vectorDimFromBase64 as It, SceneMonitorSchema as J, sleep as Jt, SCENE_DEFAULT_UNCOVERED_POLICY as K, isDeviceScopedCap as Kt, NcSnoozeSuppressedSchema as L, zoneAnalyticsCapability as Lt, NcRuleSchema as M, sceneMonitorCapability as Mt, NcRuleTargetSchema as N, storageOccupancyCapability as Nt, NC_TAXONOMY as O, readDeviceStateFrom as Ot, NcScheduleSchema as P, subKindsOf as Pt, TimelapseRuleSchema as Q, discriminatedUnion as Qt, NcSystemEventKindSchema as R, errMsg as Rt, MOTION_CLOSE_AFTER_MS as S, notificationRulesCapability as St, NC_CONDITION_CATALOG as T, pickClusterStepModels as Tt, RetrainStatusSchema as U, customAction as Ut, PoolMemoryWatchdog as V, DeviceType as Vt, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as W, defineCustomActions as Wt, TimelapseRuleInputSchema as X, array as Xt, TIMELAPSE_DENSE_FLOOR_SEC as Y, _enum as Yt, TimelapseRulePatchSchema as Z, boolean as Zt, FailureCounters as _, isMediaOwnerType as _t, CLUSTER_MODEL_SCOPED_STEPS as a, unknown as an, buildEventKindDescriptor as at, MAX_BIRTH_DECISION_RECORDS as b, kebabToCamel as bt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as c, embeddingEncoderCapability as ct, DETECTION_PIPELINE_CAP_NAME as d, evictionPolicyOfLocation as dt, number as en, addonWidgetsSourceCapability as et, DeclaredDevices as f, faceGalleryCapability as ft, FULL_IMAGE_BBOX as g, isEventOwnerType as gt, FIRST_LEVEL_MACRO_CLASSES as h, isDetectionMacroClass as ht, BirthDecisionRecordSchema as i, string as in, audioModeOf as it, NcRulePatchSchema as j, resolvePoolMemoryPolicy as jt, NcConditionDescriptorSchema as k, readTimelapseGeneratedAt as kt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as l, encodeVectorBase64 as lt, EVENT_OWNER_TYPES as m, hfModelUrl as mt, ArchivedDebugNoteSchema as n, partialRecord as nn, assertTimelapseCadences as nt, COCO_TO_MACRO as o, EventCategory as on, cosineSimilarity as ot, EVENT_KIND_BY_CAP as p, failureContributionCapability as pt, SCENE_DIVERGED as q, nodePin as qt, BaseDevice as r, record as rn, audioMetricsCapability as rt, DEFAULT_EVENT_COLOR as s, deriveRecordingMode as st, AUDIO_MACRO_LABELS as t, object as tn, alarmPanelCapability as tt, DETECTION_MACRO_CLASSES as u, evaluateSensorEdge as ut, LabelAttributionSchema as v, isScheduleActive as vt, NC_ALARM_SYSTEM_EVENT_KINDS as w, parseProcStatus as wt, MAX_BIRTH_LATENCY_PROXY_MS as x, mayWriteToLocation as xt, MAX_ARCHIVED_DEBUG_NOTES as y, isSourceCap as yt, NcTaxonomySchema as z, BaseAddon as zt };