@camstack/addon-post-analysis 1.2.272 → 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-CopaBJss.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).
@@ -5559,12 +5559,6 @@ Object.fromEntries([
5559
5559
  icon: "circle-dot",
5560
5560
  order: 40
5561
5561
  },
5562
- {
5563
- id: "clips",
5564
- label: "Clips",
5565
- icon: "clapperboard",
5566
- order: 41
5567
- },
5568
5562
  {
5569
5563
  id: "engine",
5570
5564
  label: "Inference Engine",
@@ -7591,6 +7585,8 @@ var EVENT_OWNER_TYPES = [
7591
7585
  * nothing failing until a caller asked.
7592
7586
  */
7593
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"]);
7594
7590
  var EVENT_OWNER_TYPE_SET = new Set(EVENT_OWNER_TYPES);
7595
7591
  /** True when this key's owner is one of the three event tables. */
7596
7592
  function isEventOwnerType(ownerType) {
@@ -8463,24 +8459,6 @@ var DetectionCatalogClassMapSchema = object({
8463
8459
  preserveOriginal: boolean()
8464
8460
  });
8465
8461
  /**
8466
- * THE canonical event-clip pad: the time window a single-timestamp analytics
8467
- * event expands to when joined with footage (clip window = `[timestamp - preMs,
8468
- * timestamp + postMs]`). Matches the admin-ui clip window (−5s/+10s).
8469
- *
8470
- * Every consumer derives from this ONE constant so event↔footage boundaries
8471
- * agree everywhere (C1): today that is the `videoclips` default provider
8472
- * (addon-post-analysis), which pads its clip windows with it. The recorder used
8473
- * to pad in-RAM playback markers with it too; those markers had no reader
8474
- * anywhere in the repo and were deleted on 2026-08-29.
8475
- *
8476
- * NOTE: this is a UI/JOIN convention, NOT the `events`-band keep/discard gate —
8477
- * that uses the per-device `preBufferSec`/`postBufferSec` config.
8478
- */
8479
- var EVENT_PAD_MS = {
8480
- preMs: 5e3,
8481
- postMs: 1e4
8482
- };
8483
- /**
8484
8462
  * Numeric day-of-week: 0 = Sunday … 6 = Saturday (matches `Date.getDay`).
8485
8463
  * Named `RecordingWeekday` to avoid collision with the string-union
8486
8464
  * `Weekday` exported from `interfaces/timezones.ts`.
@@ -8633,20 +8611,7 @@ var RecordingBandSchema = object({
8633
8611
  preBufferSec: number().min(0).optional(),
8634
8612
  postBufferSec: number().min(0).optional()
8635
8613
  });
8636
- /**
8637
- * Adjacent recorded ranges closer than this belong to the SAME videoclip visit.
8638
- *
8639
- * This is NOT the recorder calendar merge (`RANGE_MERGE_GAP_MS = 5s`). That
8640
- * threshold is for the timeline bar, which must show exact holes — including
8641
- * the ~8s GOP/keyframe rolls measured on events-mode cameras (dispensa 1438,
8642
- * 2026-08-16). A videoclip is the events-mode keep-window (writer session),
8643
- * whose idle bound is `postBufferSec`. Using that default (30s) glues those
8644
- * intra-visit holes without joining visits hours apart.
8645
- *
8646
- * Segments stay the source of truth on disk (`startMs-durMs-bytes.m4s`); a
8647
- * visit is derived, not a second copy of the files.
8648
- */
8649
- var VISIT_MERGE_GAP_MS = { postBufferSec: 30 }.postBufferSec * 1e3;
8614
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8650
8615
  /**
8651
8616
  * Per-device retention overrides. Every field is optional; an unset or `0`
8652
8617
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -14910,8 +14875,6 @@ method(object({
14910
14875
  deviceId: number(),
14911
14876
  capName: string(),
14912
14877
  wrapperAddonId: string(),
14913
- /** The `ClipSource.source` id to toggle. Absent = all of the addon's. */
14914
- sourceId: string().optional(),
14915
14878
  active: boolean()
14916
14879
  }), _void(), {
14917
14880
  kind: "mutation",
@@ -23218,6 +23181,35 @@ var pipelineAnalyticsCapability = {
23218
23181
  deviceId: number()
23219
23182
  }), array(MediaFileInfoSchema).readonly()),
23220
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
+ /**
23221
23213
  * Search object events by text query using CLIP cosine similarity.
23222
23214
  * Encodes `text` via the `embedding-encoder` cap, queries the
23223
23215
  * `ObjectEmbeddingStore` with optional prefilters, ranks all matching
@@ -26291,6 +26283,18 @@ method(VectorDeclareIndexInputSchema, _void(), {
26291
26283
  kind: "mutation",
26292
26284
  auth: "admin"
26293
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"]);
26294
26298
  var ClipSchema = object({
26295
26299
  /** Opaque, provider-namespaced id. The default provider encodes the time
26296
26300
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -26441,7 +26445,25 @@ var ClipSchema = object({
26441
26445
  */
26442
26446
  playable: boolean().optional(),
26443
26447
  /** Why {@link playable} is false, verbatim (`no-file-for-window`). */
26444
- unplayableReason: string().optional()
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()
26445
26467
  });
26446
26468
  var ClipPlaybackSchema = object({
26447
26469
  /**
@@ -26524,143 +26546,67 @@ var ClipSourceSchema = object({
26524
26546
  * alternative — a `native:reolink:* → provider-reolink` table inside the
26525
26547
  * widget — is a second authority on provider identity living in the one
26526
26548
  * package with no business knowing it, wrong the day a third source appears
26527
- * (D557). One addon may serve SEVERAL sources: `addon-provider-reolink`
26528
- * answers a hub child with both `native:reolink:onboard` and
26529
- * `native:reolink:hub`, which is why the per-device switch is keyed by
26530
- * SOURCE and not by this (D555).
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).
26531
26553
  *
26532
26554
  * Optional for version skew only. The collection dispatcher stamps it from
26533
26555
  * the registry, so a row that travelled through the fan-out carries the
26534
26556
  * authoritative id whatever the provider filled in.
26535
26557
  */
26536
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(),
26537
26593
  /**
26538
- * Which API this source resolved to FOR THIS CAMERA, when it has a choice.
26539
- *
26540
- * A source may cover one store through more than one surface — the Reolink
26541
- * provider reads a hub child through the parent's event log and a standalone
26542
- * through its own file list, because that is what each camera answers. The
26543
- * CHOICE is the provider's, made from what the camera is, and is never a row
26544
- * the operator has to understand; but it is REPORTED, because a source that
26545
- * silently reads a different API on two cameras and then behaves differently
26546
- * is the thing nobody can debug later. Absent when the source has only one
26547
- * way to read its store.
26548
- */
26549
- via: string().optional(),
26550
- availability: ClipSourceAvailabilitySchema,
26551
- /**
26552
- * The operator switched this source OFF for this camera.
26553
- *
26554
- * Deliberately NOT a member of {@link ClipSourceAvailabilitySchema}'s
26555
- * vocabulary. That enum models what the source CAN do — a sleeping camera, an
26556
- * unmounted card, an index that disagrees with its own calendar — and a
26557
- * switched-off source could answer perfectly well; the operator decided it
26558
- * should not. Folding the choice in is how `disabled` and `broken` stop being
26559
- * distinguishable, which is the D62 rule this repo has already paid for twice:
26560
- * an off switch is REPORTED off (`CameraStatus.switchedOff`, the same word),
26561
- * and disabled must never look like broken. It is also what lets every
26562
- * exhaustive consumer of the availability enum keep compiling.
26563
- *
26564
- * A switched-off source contributes NO clips (`listClips` never calls it) and
26565
- * its row carries no `catalogAsOf`: nothing confirms a catalog it is not
26566
- * allowed to serve, and a frozen age that can only grow draws a stalling
26567
- * source rather than an off switch.
26568
- *
26569
- * The row survives BECAUSE it is the control the operator switches the source
26570
- * back on from — D554 decision 4's rule ("a source that cannot answer
26571
- * produces a ROW, not an absence") applied to the one case D556 carved out of
26572
- * it, and D557's own kept property ("a source is never hidden, only its
26573
- * rows"). Absent means on.
26574
- *
26575
- * A provider never sets this — like {@link ClipSourceSchema.addonId} it is
26576
- * stamped by the collection dispatcher, which holds the registry's projection
26577
- * of the persisted authority (D556) and is the only place that knows it.
26578
- */
26579
- switchedOff: boolean().optional()
26580
- });
26581
- var videoclipsCapability = {
26582
- name: "videoclips",
26583
- scope: "device",
26584
- mode: "collection",
26585
- kind: "wrapper",
26586
- defaultActive: true,
26587
- /** A clip is a window over a camera's footage — the cap is meaningless on a
26588
- * sensor, a button or an event emitter, and the `defaultActive` auto-bind
26589
- * reads this to decide which devices it may claim. */
26590
- deviceTypes: [DeviceType.Camera],
26591
- /**
26592
- * The Clips section of a camera's device details is FRAMEWORK-DERIVED (D14):
26593
- * the aggregator turns this declaration into the `type:'widget'` section and
26594
- * `DeviceDetail.tsx` is never edited. `videoclips` is the first WRAPPER cap
26595
- * to declare one — every previous `host/` widget cap is `deviceNative` — so
26596
- * `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
26597
- * binding entry derives the same section a native one does.
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).
26598
26599
  *
26599
- * `topTab` because the browser owns the whole pane (a day's clips, a source
26600
- * list and a player), exactly as `ptz` does; the widget itself is
26601
- * `host/clips-browser` in ui-library's `HOST_WIDGETS`.
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).
26602
26604
  */
26603
- deviceConfig: { ui: {
26604
- kind: "widget",
26605
- widgetId: "host/clips-browser",
26606
- tab: "clips",
26607
- topTab: true,
26608
- label: "Clips",
26609
- order: 0
26610
- } },
26611
- methods: {
26612
- listClips: method(object({
26613
- deviceId: number(),
26614
- since: number(),
26615
- until: number(),
26616
- limit: number().int().positive().optional(),
26617
- /**
26618
- * View filter over {@link ClipSourceSchema.source} values — the
26619
- * picker's selection, forwarded so a provider need not list what
26620
- * nobody is looking at. ABSENT means every source this camera has,
26621
- * which is the honest default for a surface whose whole point is that
26622
- * nothing is hidden (D554 3). A provider with one source ignores it.
26623
- */
26624
- sources: array(string()).optional()
26625
- }), array(ClipSchema).readonly(), {
26626
- kind: "query",
26627
- auth: "protected"
26628
- }),
26629
- /**
26630
- * The sources this camera has, WITH the reason any of them cannot answer.
26631
- *
26632
- * Asked separately from `listClips` because an empty clip list is
26633
- * ambiguous and this is the only place the ambiguity is resolved: every
26634
- * bound provider contributes its own rows, and a provider that could not
26635
- * be reached at all still produces one row saying so. A surface that draws
26636
- * "no clips" without reading this is drawing a guess.
26637
- */
26638
- listSources: method(object({ deviceId: number() }), array(ClipSourceSchema).readonly(), {
26639
- kind: "query",
26640
- auth: "protected"
26641
- }),
26642
- getClipPlayback: method(object({
26643
- deviceId: number(),
26644
- clipId: string(),
26645
- /**
26646
- * Which twin to serve, on the ONE quality scale the system already has
26647
- * (`CamProfileSchema`). `low | mid` → the sub file, `high` → the main
26648
- * twin; both ids are already on the row so this never re-searches the
26649
- * camera. Absent means the provider's own default (the sub file, which
26650
- * every source is measured to hold).
26651
- *
26652
- * `auto` is deliberately NOT accepted here: a stored file has no
26653
- * broker session, so the adaptive tier cannot be resolved for it. The
26654
- * viewer resolves `auto` to a profile the same way live does, before
26655
- * it calls (D549 15).
26656
- */
26657
- profile: CamProfileSchema.optional()
26658
- }), ClipPlaybackSchema, {
26659
- kind: "query",
26660
- auth: "protected"
26661
- })
26662
- }
26663
- };
26605
+ profile: CamProfileSchema.optional()
26606
+ }), ClipPlaybackSchema, {
26607
+ kind: "query",
26608
+ auth: "protected"
26609
+ });
26664
26610
  /**
26665
26611
  * Optional client-side hints sent at session creation to help the provider
26666
26612
  * pick the best native source. All fields optional — a viewer that knows
@@ -41965,6 +41911,12 @@ Object.freeze({
41965
41911
  addonId: null,
41966
41912
  access: "view"
41967
41913
  },
41914
+ "pipelineAnalytics.ownersWithMedia": {
41915
+ capName: "pipeline-analytics",
41916
+ capScope: "device",
41917
+ addonId: null,
41918
+ access: "view"
41919
+ },
41968
41920
  "pipelineAnalytics.pauseForStorageMigration": {
41969
41921
  capName: "pipeline-analytics",
41970
41922
  capScope: "device",
@@ -45865,6 +45817,11 @@ Object.freeze({
45865
45817
  form: "single",
45866
45818
  optional: false
45867
45819
  }],
45820
+ "pipelineAnalytics.ownersWithMedia": [{
45821
+ name: "deviceId",
45822
+ form: "single",
45823
+ optional: false
45824
+ }],
45868
45825
  "pipelineAnalytics.proposeRetrainAnnotations": [{
45869
45826
  name: "deviceId",
45870
45827
  form: "single",
@@ -47857,4 +47814,4 @@ function vectorDimFromBase64(encoded) {
47857
47814
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
47858
47815
  }
47859
47816
  //#endregion
47860
- 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 };