@camstack/addon-post-analysis 1.2.297 → 1.2.299

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.
@@ -5370,7 +5370,7 @@ var ZodIssueCode = {
5370
5370
  var ZodFirstPartyTypeKind;
5371
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5372
5372
  //#endregion
5373
- //#region ../types/dist/sleep-DlrgY4Qb.mjs
5373
+ //#region ../types/dist/sleep-C-v96WpE.mjs
5374
5374
  /**
5375
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5376
5376
  * window to float samples (D455).
@@ -8595,7 +8595,6 @@ var CompositionSchema = object({
8595
8595
  });
8596
8596
  var OWNER_TYPES = new Set([
8597
8597
  "track",
8598
- "summary",
8599
8598
  "face",
8600
8599
  "identity",
8601
8600
  "plate",
@@ -8751,6 +8750,90 @@ var BASE_LIVE_EGRESS_PROFILE = {
8751
8750
  ({ ...BASE_LIVE_EGRESS_PROFILE }), { ...BASE_LIVE_EGRESS_PROFILE.video };
8752
8751
  ({ ...BASE_LIVE_EGRESS_PROFILE }), { ...BASE_LIVE_EGRESS_PROFILE.video };
8753
8752
  /**
8753
+ * The notification GIF's filter chain and argv — ONE definition for every
8754
+ * process that derives a gif from a notification video.
8755
+ *
8756
+ * ## Why this lives in `@camstack/types`
8757
+ *
8758
+ * Two addons derive a notification gif from an mp4, and they may never import
8759
+ * each other:
8760
+ *
8761
+ * - the stream broker (`addon-pipeline`), from the clip it just cut out of its
8762
+ * own ring (`gif-from-mp4.ts`);
8763
+ * - the notification centre (`addon-post-analysis`), from a clip cut out of
8764
+ * the RECORDINGS when the moment is older than any ring holds
8765
+ * ([D682](../../../../docs/decisions/adr-0682-a-pick-ups-footage-is-cut-around-the-pick-up.md)).
8766
+ *
8767
+ * Two copies of this chain would be two gifs of the same kind of moment that
8768
+ * look different depending on how old the moment was — the class of defect
8769
+ * D85/D91 already paid for once. So the chain is here, pure and dependency
8770
+ * free, and each caller owns only its own process lifecycle.
8771
+ *
8772
+ * ## The palette was never the problem
8773
+ *
8774
+ * The `split` + `palettegen(stats_mode=diff)` + `paletteuse(bayer)` pair is
8775
+ * right and stays. The measured cause of "the gif looks de-pixellated" was a
8776
+ * 640×360 substream scaled DOWN to 480 px, upstream of the palette. The `split`
8777
+ * form is a single READ of the input, not a lesser two-pass.
8778
+ */
8779
+ /**
8780
+ * Format a frame rate for an ffmpeg filter argument.
8781
+ *
8782
+ * `12 / 4` must reach the filter as `3` and `15 / 4` as `3.75`, not as a float
8783
+ * tail that `av_parse_video_rate` then has to guess at.
8784
+ */
8785
+ function ffmpegRate(rate) {
8786
+ return String(Math.round(rate * 1e3) / 1e3);
8787
+ }
8788
+ /**
8789
+ * The factor the derive must apply ON TOP of the speed the mp4 already carries.
8790
+ *
8791
+ * The gif is derived from a muxed mp4, so if that mux already ran `setpts` at
8792
+ * the caller's `speed`, applying the absolute gif rate again would compound
8793
+ * them — a 4× gif beside a 2× video would come out at 8×. Discounting here is
8794
+ * what keeps the gif rate ABSOLUTE against real time whatever the video does.
8795
+ */
8796
+ function gifDeriveSpeed(gifSpeed, videoSpeed) {
8797
+ if (!Number.isFinite(videoSpeed) || videoSpeed <= 0) return gifSpeed;
8798
+ return gifSpeed / videoSpeed;
8799
+ }
8800
+ /**
8801
+ * The filter chain. Extracted so a test can assert the palette pair without
8802
+ * spawning ffmpeg — an argv test cannot see quality, but it can see a filter
8803
+ * that somebody deleted.
8804
+ *
8805
+ * `fps` BEFORE `setpts`: decimating an already sped-up timeline yields `speed`
8806
+ * times the frames asked for, and a gif pays for every one. So the decimation
8807
+ * runs at `fps / speed` in SOURCE time and `setpts` multiplies what survived.
8808
+ * The trailing `fps` re-declares the rate, which is NOT redundant: `setpts`
8809
+ * leaves the filter link advertising the sampled rate and the gif muxer
8810
+ * believes the link — measured on 615 as a 3.01 s gif of ten frames.
8811
+ */
8812
+ function gifFilterComplex(input) {
8813
+ const speed = input.speed > 0 ? input.speed : 1;
8814
+ if (speed === 1) return `[0:v]fps=${ffmpegRate(input.fps)},scale=${input.maxWidth}:-2:flags=lanczos,split[a][b];[a]palettegen=stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle`;
8815
+ return `[0:v]fps=${ffmpegRate(input.fps / speed)},setpts=PTS/${speed},fps=${ffmpegRate(input.fps)},scale=${input.maxWidth}:-2:flags=lanczos,split[a][b];[a]palettegen=stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle`;
8816
+ }
8817
+ /** The full argv: mp4 in, gif on stdout. */
8818
+ function gifFromMp4Args(input) {
8819
+ return [
8820
+ "-y",
8821
+ "-v",
8822
+ "error",
8823
+ "-f",
8824
+ "mp4",
8825
+ "-i",
8826
+ input.input ?? "pipe:0",
8827
+ "-filter_complex",
8828
+ gifFilterComplex(input),
8829
+ "-loop",
8830
+ "0",
8831
+ "-f",
8832
+ "gif",
8833
+ "pipe:1"
8834
+ ];
8835
+ }
8836
+ /**
8754
8837
  * Deep wiring healthcheck — snapshot of active reachability probes across
8755
8838
  * every declared capability + widget of every installed plugin, on every
8756
8839
  * node. Produced by the backend `WiringHealthService` and surfaced via
@@ -22982,6 +23065,21 @@ var ObjectEventSchema = object({
22982
23065
  keyFrameMediaId: number().int().optional(),
22983
23066
  /** Populated by B5 (recording playback URL for this event). */
22984
23067
  mediaUrl: string().optional(),
23068
+ /**
23069
+ * When the change this row records HAPPENED, epoch ms, when that is earlier
23070
+ * than {@link timestamp} and the producer could date it (D684).
23071
+ *
23072
+ * Set on a package PICK-UP row only: its `timestamp` is when the departure
23073
+ * was CONCLUDED — five minutes of unseen observed time after the parcel went
23074
+ * — and a notification's footage has to be cut around the pick-up, not the
23075
+ * empty doormat after it (D682). Stored so every path that rebuilds a
23076
+ * notification subject from the row (the boot reconcile, a dry-run) anchors
23077
+ * on the same instant the live hook did.
23078
+ *
23079
+ * `timestamp` keeps its meaning. Absent on every other row and on every
23080
+ * pick-up written before D684 — UNKNOWN, never 0 and never `timestamp`.
23081
+ */
23082
+ observedAt: number().optional(),
22985
23083
  /** The parent track's key-event importance [0,1], propagated to every object
22986
23084
  * event of the track (so an event row can be sorted by importance without a
22987
23085
  * track join). Absent on legacy rows / before the track was scored. */
@@ -23317,131 +23415,6 @@ var RecentTracksQueryInput = object({
23317
23415
  /** See {@link ExcludeSourcesDoc}. */
23318
23416
  excludeSources: array(TrackSourceSchema).optional()
23319
23417
  });
23320
- /**
23321
- * A Summary (D359): the per-camera session envelope that references tracks.
23322
- * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
23323
- * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
23324
- * first frame with a member visible has been materialised (D482 — it was the
23325
- * row's composite key, which embedded the owner and could name another table's
23326
- * row once event ids became per-table rowids).
23327
- */
23328
- var SummarySchema = object({
23329
- id: string(),
23330
- deviceId: number(),
23331
- openedAt: number(),
23332
- lastActiveAt: number(),
23333
- sealedAt: number().nullable(),
23334
- memberCount: number().int().nonnegative(),
23335
- groupShotMediaId: number().int().nullable()
23336
- });
23337
- var SummariesQueryInput = object({
23338
- deviceIds: array(number()).min(1),
23339
- since: number().optional(),
23340
- until: number().optional(),
23341
- limit: number().int().min(1).max(200).default(50),
23342
- /** The same member-wise filter {@link listRecentSummaries} takes — one
23343
- * meaning of "dog" on every summary surface. */
23344
- classes: array(string().min(1).max(60)).max(40).optional()
23345
- });
23346
- var SummaryDetailSchema = object({
23347
- summary: SummarySchema,
23348
- /** Members in absorption order, oldest join first. */
23349
- members: array(object({
23350
- trackId: string(),
23351
- /**
23352
- * The track's class at the time it JOINED, or `null` when it was unresolved
23353
- * and the track no longer exists to fill it.
23354
- *
23355
- * The join, not the latest opinion: class voting can re-decide a track's
23356
- * class afterwards, and a group's composition is the history of who came
23357
- * together. A consumer counts these to badge a thumbnail — "two people and a
23358
- * dog" — rather than being handed a second, denormalised tally that would
23359
- * drift from the members it claims to describe.
23360
- */
23361
- className: string().nullable(),
23362
- /** `primary` is the one member that carries the group's identity. */
23363
- role: _enum([
23364
- "primary",
23365
- "sibling",
23366
- "child"
23367
- ]).nullable(),
23368
- joinedAt: number(),
23369
- /** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
23370
- * at read time. Absent when nothing resolved, never an empty string. */
23371
- label: string().optional(),
23372
- /** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
23373
- * recognised nobody, and absent for a member whose track has been pruned —
23374
- * a thumbnail that names the wrong person is worse than one naming nobody. */
23375
- subLabel: string().optional()
23376
- })).readonly()
23377
- });
23378
- /**
23379
- * What a LIST of groups carries: the envelope plus what it is MADE OF.
23380
- *
23381
- * Coarse on purpose — the operator's rule is "only the rough data on the list,
23382
- * we extend when we notice we need more". Enough to draw the card ("two people
23383
- * and a dog") and no more. The MEMBERS, their names and the per-member links
23384
- * are on {@link getSummary}: shipping every member of every group so a client
23385
- * can count them turns a page of two hundred groups into a thousand records to
23386
- * draw two hundred badges.
23387
- */
23388
- var SummaryListItemSchema = object({
23389
- summary: SummarySchema,
23390
- /** Class counts, most numerous first; `className: null` is a member whose
23391
- * class never resolved, counted so the counts add up to `memberCount`. */
23392
- classes: array(object({
23393
- className: string().nullable(),
23394
- count: number().int().positive()
23395
- })).readonly()
23396
- });
23397
- var SummariesPageSchema = object({ summaries: array(SummaryListItemSchema).readonly() });
23398
- /**
23399
- * The paged feed, deliberately the SAME shape as {@link RecentTracksQueryInput}.
23400
- *
23401
- * The reel on the cameras page and the Events gallery both ride a cursor, so a
23402
- * summaries feed that could only answer "the last N for these cameras"
23403
- * (`listSummaries`) would make groups available in the timeline and nowhere
23404
- * else. Two feeds with different ordering contracts would be two ideas of what
23405
- * "newest" means, on one screen.
23406
- */
23407
- var RecentSummariesQueryInput = object({
23408
- /** Devices to merge. An empty array yields an empty page. */
23409
- deviceIds: array(number()),
23410
- /** Window lower bound on `lastActiveAt` (inclusive). */
23411
- since: number().optional(),
23412
- /** Window upper bound on `lastActiveAt` (inclusive). */
23413
- until: number().optional(),
23414
- limit: number().int().min(1).max(500).default(100),
23415
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
23416
- cursor: string().optional(),
23417
- /**
23418
- * Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
23419
- * deliberately the same name: the events filter tree emits one list of ticked
23420
- * taxonomy nodes, and a summaries feed that called it something else would
23421
- * make the operator's one filter component produce two shapes.
23422
- *
23423
- * A question about the MEMBERS: a group matches when ANY of them does. "Show
23424
- * me the arrivals with a dog" has to return the group of four people who had
23425
- * one with them; a filter on the group's own fields could only ever answer
23426
- * about its primary.
23427
- *
23428
- * Matched against all THREE tiers of a member — the class (`animal`), the
23429
- * sub-class (`dog`) and the instance (a name, a plate) — because which tier a
23430
- * ticked node lives on is the taxonomy's business, not the caller's. `dog` is
23431
- * an event kind in the tree and a tier-1 label on an `animal` track; a filter
23432
- * that read only the class would answer "animal" and never "dog".
23433
- *
23434
- * ABSENT or EMPTY means no filter — absent is not a selection of none.
23435
- */
23436
- classes: array(string().min(1).max(60)).max(40).optional()
23437
- });
23438
- var RecentSummariesPageSchema = object({
23439
- /** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
23440
- * {@link listSummaries} — one list shape, so a card renders the same
23441
- * whichever feed drew it. */
23442
- summaries: array(SummaryListItemSchema).readonly(),
23443
- nextCursor: string().nullable()
23444
- });
23445
23418
  var RecentTracksPageSchema = object({
23446
23419
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
23447
23420
  tracks: array(TrackSchema).readonly(),
@@ -23994,15 +23967,6 @@ var pipelineAnalyticsCapability = {
23994
23967
  * are not included (same contract as `listTracks`).
23995
23968
  */
23996
23969
  listRecentTracks: method(RecentTracksQueryInput, RecentTracksPageSchema),
23997
- /** Newest first by `openedAt`, for a camera set, inside an optional window. */
23998
- listSummaries: method(SummariesQueryInput, SummariesPageSchema),
23999
- /**
24000
- * The PAGED feed — the reel and the Events gallery. Same cursor contract as
24001
- * {@link listRecentTracks}, so one screen cannot hold two ideas of newest.
24002
- */
24003
- listRecentSummaries: method(RecentSummariesQueryInput, RecentSummariesPageSchema),
24004
- /** One summary with its member track ids; `null` for an id nobody wrote. */
24005
- getSummary: method(object({ id: string() }), SummaryDetailSchema.nullable()),
24006
23970
  clearTracks: method(object({ deviceId: number() }), _void(), {
24007
23971
  kind: "mutation",
24008
23972
  auth: "admin"
@@ -47374,12 +47338,6 @@ Object.freeze({
47374
47338
  addonId: null,
47375
47339
  access: "view"
47376
47340
  },
47377
- "pipelineAnalytics.getSummary": {
47378
- capName: "pipeline-analytics",
47379
- capScope: "device",
47380
- addonId: null,
47381
- access: "view"
47382
- },
47383
47341
  "pipelineAnalytics.getTrack": {
47384
47342
  capName: "pipeline-analytics",
47385
47343
  capScope: "device",
@@ -47440,12 +47398,6 @@ Object.freeze({
47440
47398
  addonId: null,
47441
47399
  access: "view"
47442
47400
  },
47443
- "pipelineAnalytics.listRecentSummaries": {
47444
- capName: "pipeline-analytics",
47445
- capScope: "device",
47446
- addonId: null,
47447
- access: "view"
47448
- },
47449
47401
  "pipelineAnalytics.listRecentTracks": {
47450
47402
  capName: "pipeline-analytics",
47451
47403
  capScope: "device",
@@ -47476,12 +47428,6 @@ Object.freeze({
47476
47428
  addonId: null,
47477
47429
  access: "view"
47478
47430
  },
47479
- "pipelineAnalytics.listSummaries": {
47480
- capName: "pipeline-analytics",
47481
- capScope: "device",
47482
- addonId: null,
47483
- access: "view"
47484
- },
47485
47431
  "pipelineAnalytics.listTrackMedia": {
47486
47432
  capName: "pipeline-analytics",
47487
47433
  capScope: "device",
@@ -51651,11 +51597,6 @@ Object.freeze({
51651
51597
  form: "single",
51652
51598
  optional: true
51653
51599
  }],
51654
- "pipelineAnalytics.listRecentSummaries": [{
51655
- name: "deviceIds",
51656
- form: "array",
51657
- optional: false
51658
- }],
51659
51600
  "pipelineAnalytics.listRecentTracks": [{
51660
51601
  name: "deviceIds",
51661
51602
  form: "array",
@@ -51666,11 +51607,6 @@ Object.freeze({
51666
51607
  form: "array",
51667
51608
  optional: true
51668
51609
  }],
51669
- "pipelineAnalytics.listSummaries": [{
51670
- name: "deviceIds",
51671
- form: "array",
51672
- optional: false
51673
- }],
51674
51610
  "pipelineAnalytics.listTrackMedia": [{
51675
51611
  name: "deviceId",
51676
51612
  form: "single",
@@ -55415,4 +55351,4 @@ function buildClipModelRegistry(entries) {
55415
55351
  /** The built-in catalog's registry. */
55416
55352
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
55417
55353
  //#endregion
55418
- export { NcRuleSchema as $, string as $n, isSystemEventSummaryRule as $t, LockStateSchema as A, evaluateSensorEdge as An, audioMetricsCapability as At, NC_DEFAULT_SNOOZE_MINUTES as B, isDeviceScopedCap as Bn, embeddingRefusalOf as Bt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as C, systemEventSummaryScheduleOf as Cn, TimelapseRuleInputSchema as Ct, FULL_IMAGE_BBOX as D, zoneAnalyticsCapability as Dn, addonWidgetsSourceCapability as Dt, FIRST_LEVEL_MACRO_CLASSES as E, vectorDimFromBase64 as En, TrackSourceSchema as Et, MediaFileKindEnum as F, CamProfileSchema as Fn, deriveRecordingMode as Ft, NC_TAXONOMY as G, array as Gn, faceGalleryCapability as Gt, NC_SNOOZE_MAX_MINUTES as H, normalizeNodeId as Hn, embeddingRequirementsUnavailableError as Ht, MotionTriggeredBySchema as I, createEvent as In, describeSystemEventDeliveryProblem as It, NcAlarmSettingsPatchSchema as J, literal as Jn, isEventOwnerType as Jt, NC_TEMPLATE_VARS as K, boolean as Kn, failureContributionCapability as Kt, NC_ALARM_SYSTEM_EVENT_KINDS as L, customAction as Ln, describeSystemEventFamilyProblem as Lt, MAX_BIRTH_DECISION_RECORDS as M, DeviceType as Mn, buildEventKindDescriptor as Mt, MAX_BIRTH_LATENCY_PROXY_MS as N, errMsg as Nn, consumableLowPercentOf as Nt, FailureCounters as O, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as On, alarmPanelCapability as Ot, MOTION_CLOSE_AFTER_MS as P, BaseAddon as Pn, cosineSimilarity as Pt, NcRulePatchSchema as Q, record as Qn, isSystemDelivery as Qt, NC_CONDITION_CATALOG as R, defineCustomActions as Rn, embeddingEncoderCapability as Rt, EMBEDDING_REQUIREMENTS_FAILED as S, systemEventFilterApplies as Sn, TIMELAPSE_DENSE_FLOOR_SEC as St, EVENT_OWNER_TYPES as T, templateVarsFor as Tn, TimelapseRuleSchema as Tt, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as U, sleep as Un, encodeVectorBase64 as Ut, NC_SENSOR_TRANSITION_KINDS as V, nodePin as Vn, embeddingRequirementsFailedError as Vt, NC_TANK_SYSTEM_EVENT_KINDS as W, _enum as Wn, evictionPolicyOfLocation as Wt, NcConditionsSchema as X, object as Xn, isMediaOwnerType as Xt, NcConditionDescriptorSchema as Y, number as Yn, isKnownTemplateVar as Yt, NcRuleInputSchema as Z, partialRecord as Zn, isScheduleActive as Zt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as _, servedTemplateVars as _n, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as _t, CLIP_EMBEDDING_STEP_ID as a, parseProcStatus as an, NcSnoozeSuppressedSchema as at, DeclaredDevices as b, systemEventDeliveryProblems as bn, SCENE_DIVERGED as bt, resolveClusterModelPin as c, readDeviceStateFrom as cn, NcTemplatePreviewInputSchema as ct, ArchivedDebugNoteSchema as d, resolveClipSearchMinScore as dn, OpsLogEntrySchema as dt, isVectorIndexDimConflict as en, unknown as er, NcRuleTargetSchema as et, BaseDevice as f, resolveLocationMode as fn, PoolMemoryWatchdog as ft, DEFAULT_EVENT_COLOR as g, sensorRaisedOf as gn, RetrainStatusSchema as gt, CoverStateSchema as h, sceneMonitorCapability as hn, RebuildObjectEmbeddingsRefusalSchema as ht, CLIP_TEXT_MODELS as i, occupancyScope as in, NcSnoozeSchema as it, MAX_ARCHIVED_DEBUG_NOTES as j, isSourceCap as jn, audioModeOf as jt, LabelAttributionSchema as k, canonicalHash as kn, assertTimelapseCadences as kt, AUDIO_MACRO_LABELS as l, readMotionTriggeredBy as ln, NcTemplatePreviewSchema as lt, COCO_TO_MACRO as m, ruleBelongsToAlarm as mn, RECORDING_SOURCE_CAMSTACK_ADDON as mt, DEFAULT_CLIP_MODEL as n, mayWriteToLocation as nn, NcScheduleSchema as nt, FACE_EMBEDDING_STEP_ID as o, pipelineAnalyticsCapability as on, NcSystemEventKindSchema as ot, BirthDecisionRecordSchema as p, resolvePoolMemoryPolicy as pn, RECORDING_EXPORT_MAX_READ_BYTES as pt, NcAlarmConfigSchema as q, discriminatedUnion as qn, isDetectionMacroClass as qt, CLIP_IMAGE_MODELS as r, notificationRulesCapability as rn, NcSnoozeInputSchema as rt, readClusterModelPinStrict as s, plateGalleryCapability as sn, NcTaxonomySchema as st, BUILTIN_CLIP_MODELS as t, kebabToCamel as tn, EventCategory as tr, NcRuleUpdateInputSchema as tt, AlarmArmModeSchema as u, readTimelapseGeneratedAt as un, NcTemplateVarDescriptorSchema as ut, DETECTION_MACRO_CLASSES as v, storageOccupancyCapability as vn, SCENE_DEFAULT_ANCHOR_THRESHOLD as vt, EVENT_KIND_BY_CAP as w, templateCarriesSummary as wn, TimelapseRulePatchSchema as wt, EMBEDDING_MODEL_FAILED as x, systemEventFamilyProblems as xn, SceneMonitorSchema as xt, DETECTION_PIPELINE_CAP_NAME as y, subKindsOf as yn, SCENE_DEFAULT_UNCOVERED_POLICY as yt, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as z, hydrateSchema as zn, embeddingModelFailedError as zt };
55354
+ export { NcRuleSchema as $, partialRecord as $n, isScheduleActive as $t, LockStateSchema as A, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as An, audioMetricsCapability as At, NC_DEFAULT_SNOOZE_MINUTES as B, defineCustomActions as Bn, embeddingRefusalOf as Bt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as C, systemEventFamilyProblems as Cn, TimelapseRuleInputSchema as Ct, FULL_IMAGE_BBOX as D, templateVarsFor as Dn, addonWidgetsSourceCapability as Dt, FIRST_LEVEL_MACRO_CLASSES as E, templateCarriesSummary as En, TrackSourceSchema as Et, MediaFileKindEnum as F, errMsg as Fn, deriveRecordingMode as Ft, NC_TAXONOMY as G, sleep as Gn, faceGalleryCapability as Gt, NC_SNOOZE_MAX_MINUTES as H, isDeviceScopedCap as Hn, embeddingRequirementsUnavailableError as Ht, MotionTriggeredBySchema as I, BaseAddon as In, describeSystemEventDeliveryProblem as It, NcAlarmSettingsPatchSchema as J, boolean as Jn, gifFromMp4Args as Jt, NC_TEMPLATE_VARS as K, _enum as Kn, failureContributionCapability as Kt, NC_ALARM_SYSTEM_EVENT_KINDS as L, CamProfileSchema as Ln, describeSystemEventFamilyProblem as Lt, MAX_BIRTH_DECISION_RECORDS as M, evaluateSensorEdge as Mn, buildEventKindDescriptor as Mt, MAX_BIRTH_LATENCY_PROXY_MS as N, isSourceCap as Nn, consumableLowPercentOf as Nt, FailureCounters as O, vectorDimFromBase64 as On, alarmPanelCapability as Ot, MOTION_CLOSE_AFTER_MS as P, DeviceType as Pn, cosineSimilarity as Pt, NcRulePatchSchema as Q, object as Qn, isMediaOwnerType as Qt, NC_CONDITION_CATALOG as R, createEvent as Rn, embeddingEncoderCapability as Rt, EMBEDDING_REQUIREMENTS_FAILED as S, systemEventDeliveryProblems as Sn, TIMELAPSE_DENSE_FLOOR_SEC as St, EVENT_OWNER_TYPES as T, systemEventSummaryScheduleOf as Tn, TimelapseRuleSchema as Tt, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as U, nodePin as Un, encodeVectorBase64 as Ut, NC_SENSOR_TRANSITION_KINDS as V, hydrateSchema as Vn, embeddingRequirementsFailedError as Vt, NC_TANK_SYSTEM_EVENT_KINDS as W, normalizeNodeId as Wn, evictionPolicyOfLocation as Wt, NcConditionsSchema as X, literal as Xn, isEventOwnerType as Xt, NcConditionDescriptorSchema as Y, discriminatedUnion as Yn, isDetectionMacroClass as Yt, NcRuleInputSchema as Z, number as Zn, isKnownTemplateVar as Zt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as _, sceneMonitorCapability as _n, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as _t, CLIP_EMBEDDING_STEP_ID as a, notificationRulesCapability as an, NcSnoozeSuppressedSchema as at, DeclaredDevices as b, storageOccupancyCapability as bn, SCENE_DIVERGED as bt, resolveClusterModelPin as c, pipelineAnalyticsCapability as cn, NcTemplatePreviewInputSchema as ct, ArchivedDebugNoteSchema as d, readMotionTriggeredBy as dn, OpsLogEntrySchema as dt, isSystemDelivery as en, record as er, NcRuleTargetSchema as et, BaseDevice as f, readTimelapseGeneratedAt as fn, PoolMemoryWatchdog as ft, DEFAULT_EVENT_COLOR as g, ruleBelongsToAlarm as gn, RetrainStatusSchema as gt, CoverStateSchema as h, resolvePoolMemoryPolicy as hn, RebuildObjectEmbeddingsRefusalSchema as ht, CLIP_TEXT_MODELS as i, mayWriteToLocation as in, NcSnoozeSchema as it, MAX_ARCHIVED_DEBUG_NOTES as j, canonicalHash as jn, audioModeOf as jt, LabelAttributionSchema as k, zoneAnalyticsCapability as kn, assertTimelapseCadences as kt, AUDIO_MACRO_LABELS as l, plateGalleryCapability as ln, NcTemplatePreviewSchema as lt, COCO_TO_MACRO as m, resolveLocationMode as mn, RECORDING_SOURCE_CAMSTACK_ADDON as mt, DEFAULT_CLIP_MODEL as n, isVectorIndexDimConflict as nn, unknown as nr, NcScheduleSchema as nt, FACE_EMBEDDING_STEP_ID as o, occupancyScope as on, NcSystemEventKindSchema as ot, BirthDecisionRecordSchema as p, resolveClipSearchMinScore as pn, RECORDING_EXPORT_MAX_READ_BYTES as pt, NcAlarmConfigSchema as q, array as qn, gifDeriveSpeed as qt, CLIP_IMAGE_MODELS as r, kebabToCamel as rn, EventCategory as rr, NcSnoozeInputSchema as rt, readClusterModelPinStrict as s, parseProcStatus as sn, NcTaxonomySchema as st, BUILTIN_CLIP_MODELS as t, isSystemEventSummaryRule as tn, string as tr, NcRuleUpdateInputSchema as tt, AlarmArmModeSchema as u, readDeviceStateFrom as un, NcTemplateVarDescriptorSchema as ut, DETECTION_MACRO_CLASSES as v, sensorRaisedOf as vn, SCENE_DEFAULT_ANCHOR_THRESHOLD as vt, EVENT_KIND_BY_CAP as w, systemEventFilterApplies as wn, TimelapseRulePatchSchema as wt, EMBEDDING_MODEL_FAILED as x, subKindsOf as xn, SceneMonitorSchema as xt, DETECTION_PIPELINE_CAP_NAME as y, servedTemplateVars as yn, SCENE_DEFAULT_UNCOVERED_POLICY as yt, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as z, customAction as zn, embeddingModelFailedError as zt };