@camstack/addon-post-analysis 1.2.244 → 1.2.245

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-B9qx0cEV.mjs
5362
+ //#region ../types/dist/sleep-BfJ2k1jm.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).
@@ -21993,6 +21993,48 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
21993
21993
  * solid is this track", cheaper than re-deriving it from a trajectory. */
21994
21994
  framesMatched: number().int()
21995
21995
  })).readonly() });
21996
+ /**
21997
+ * The long-term series a camera produces. A closed union so a typo cannot
21998
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
21999
+ * is an alias of this, not a second list.
22000
+ */
22001
+ var AnalyticsLtsSeriesSchema = _enum([
22002
+ "motion",
22003
+ "audio-dbfs",
22004
+ "battery",
22005
+ "occupancy"
22006
+ ]);
22007
+ /**
22008
+ * Spell one occupancy scope.
22009
+ *
22010
+ * `occupancyScope()` → `''` (frame, every class)
22011
+ * `occupancyScope('z1')` → `'z1'` (zone, every class)
22012
+ * `occupancyScope(undefined, 'person')` → `'|person'`
22013
+ * `occupancyScope('z1', 'person')` → `'z1|person'`
22014
+ *
22015
+ * The two aggregate spellings are the ones that existed before the class
22016
+ * dimension and they mean exactly what they always did.
22017
+ */
22018
+ function occupancyScope(zoneId, className) {
22019
+ const place = zoneId ?? "";
22020
+ return className === void 0 ? place : `${place}|${className}`;
22021
+ }
22022
+ /**
22023
+ * One closed 5-minute bucket of a long-term series.
22024
+ *
22025
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
22026
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
22027
+ * that exists at all was measured; a bucket that is absent was not, which is a
22028
+ * different claim from zero and the reason this is a sparse series.
22029
+ */
22030
+ var LtsBucketSchema = object({
22031
+ scope: string(),
22032
+ bucketStart: number().int(),
22033
+ samples: number().int().nonnegative(),
22034
+ sum: number(),
22035
+ min: number(),
22036
+ max: number()
22037
+ });
21996
22038
  var pipelineAnalyticsCapability = {
21997
22039
  name: "pipeline-analytics",
21998
22040
  scope: "device",
@@ -22136,6 +22178,30 @@ var pipelineAnalyticsCapability = {
22136
22178
  getKeyEventsBatch: method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()),
22137
22179
  /** Server-side bucketed event counts for the 24-hour timeline.
22138
22180
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
22181
+ /**
22182
+ * Read one camera's long-term series — 5-minute buckets, kept for a year.
22183
+ *
22184
+ * This is the history surface for every chart that used to be served from a
22185
+ * RAM ring: the ring dies with the process, cannot answer about last night,
22186
+ * and had a 60-minute horizon, while these rows are ~60 bytes and already
22187
+ * written. `scope` is the series' own dimension — for `occupancy`, spell it
22188
+ * with {@link occupancyScope} rather than by hand, and omit it to get every
22189
+ * scope back at once (the caller then groups with
22190
+ * {@link parseOccupancyScope}).
22191
+ *
22192
+ * Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
22193
+ * still returns the bucket it lands in — the alternative is a chart whose
22194
+ * last column silently disappears for five minutes out of every five.
22195
+ */
22196
+ readLongTermSeries: method(object({
22197
+ deviceId: number(),
22198
+ series: AnalyticsLtsSeriesSchema,
22199
+ /** Omit for EVERY scope of this series in the range. */
22200
+ scope: string().optional(),
22201
+ from: number(),
22202
+ to: number(),
22203
+ limit: number().int().positive().optional()
22204
+ }), array(LtsBucketSchema).readonly()),
22139
22205
  getEventDensity: method(object({
22140
22206
  deviceId: number(),
22141
22207
  since: number(),
@@ -35575,7 +35641,28 @@ var PerScopeBreakdownSchema = object({
35575
35641
  /** Total tracked objects in this scope (frame / zone / unzoned). */
35576
35642
  totalObjects: number().int().nonnegative(),
35577
35643
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
35578
- byClass: record(string(), number().int().nonnegative())
35644
+ byClass: record(string(), number().int().nonnegative()),
35645
+ /**
35646
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
35647
+ * present but not going anywhere (a parked car, a bin, a statue).
35648
+ *
35649
+ * The operator's question about a scene has two halves and they answer
35650
+ * different things: "what is parked here" is stable for hours and must not
35651
+ * flap, while "who is walking through" is the thing an alert is about. One
35652
+ * number could only serve one of them, and `totalObjects` served the first
35653
+ * badly — a passer-by moved it and every occupancy rule saw a change.
35654
+ *
35655
+ * `standing + transient === totalObjects`, always. The total keeps its old
35656
+ * meaning exactly, so no rule written against it changes behaviour.
35657
+ *
35658
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
35659
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
35660
+ * parked objects here" about a camera whose lot is full.
35661
+ */
35662
+ standingObjects: number().int().nonnegative().optional(),
35663
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
35664
+ * same absence rule. */
35665
+ transientObjects: number().int().nonnegative().optional()
35579
35666
  });
35580
35667
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
35581
35668
  zoneId: string(),
@@ -35698,6 +35785,23 @@ var HistoryPointSchema = object({
35698
35785
  * triple covers the three spatial scopes (per-zone, frame-wide,
35699
35786
  * outside-any-zone). Crossing them with `className?` gives the full
35700
35787
  * combinatorial coverage the operator UI requested.
35788
+ *
35789
+ * ## ⚠️ The three history methods are DEPRECATED
35790
+ *
35791
+ * They are served from a 60-MINUTE in-memory ring. It dies with the process,
35792
+ * so after a restart they report nothing about a night that did happen, and any
35793
+ * window past an hour is silently clamped — a caller cannot tell a clamp from
35794
+ * an empty scene. The presets in the occupancy chart existed to hide that
35795
+ * horizon rather than to answer a question.
35796
+ *
35797
+ * Use `pipelineAnalytics.readLongTermSeries({ series: 'occupancy', scope })`
35798
+ * instead. Those rows are already written for every camera, ~60 bytes per
35799
+ * (camera, scope, 5-minute bucket), kept for a year, and survive a restart.
35800
+ * Spell the scope with `occupancyScope(zoneId?, className?)` — the same
35801
+ * function the writer uses, so the two cannot drift.
35802
+ *
35803
+ * The ring stays until these three go, and it is the only thing left reading
35804
+ * it. Do not add a fourth caller.
35701
35805
  */
35702
35806
  var zoneAnalyticsCapability = {
35703
35807
  name: "zone-analytics",
@@ -40665,6 +40769,12 @@ Object.freeze({
40665
40769
  addonId: null,
40666
40770
  access: "create"
40667
40771
  },
40772
+ "pipelineAnalytics.readLongTermSeries": {
40773
+ capName: "pipeline-analytics",
40774
+ capScope: "device",
40775
+ addonId: null,
40776
+ access: "view"
40777
+ },
40668
40778
  "pipelineAnalytics.rebuildObjectEmbeddings": {
40669
40779
  capName: "pipeline-analytics",
40670
40780
  capScope: "device",
@@ -44481,6 +44591,11 @@ Object.freeze({
44481
44591
  form: "single",
44482
44592
  optional: false
44483
44593
  }],
44594
+ "pipelineAnalytics.readLongTermSeries": [{
44595
+ name: "deviceId",
44596
+ form: "single",
44597
+ optional: false
44598
+ }],
44484
44599
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
44485
44600
  name: "deviceId",
44486
44601
  form: "single",
@@ -46413,4 +46528,4 @@ function vectorDimFromBase64(encoded) {
46413
46528
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
46414
46529
  }
46415
46530
  //#endregion
46416
- export { TimelapseRuleSchema as $, boolean as $t, NcConditionDescriptorSchema as A, readTimelapseGeneratedAt as At, NcTaxonomySchema as B, errMsg as Bt, MOTION_CLOSE_AFTER_MS as C, mayWriteToLocation as Ct, NC_DEFAULT_SNOOZE_MINUTES as D, pipelineAnalyticsCapability as Dt, NC_CONDITION_CATALOG as E, pickClusterStepModels as Et, NcScheduleSchema as F, subKindsOf as Ft, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as G, customAction as Gt, PoolMemoryWatchdog as H, CamProfileSchema as Ht, NcSnoozeInputSchema as I, systemEventFilterApplies as It, SCENE_DIVERGED as J, isDeviceScopedCap as Jt, SCENE_DEFAULT_ANCHOR_THRESHOLD as K, defineCustomActions as Kt, NcSnoozeSchema as L, vectorDimFromBase64 as Lt, NcRulePatchSchema as M, resolvePoolMemoryPolicy as Mt, NcRuleSchema as N, sceneMonitorCapability as Nt, NC_SNOOZE_MAX_MINUTES as O, plateGalleryCapability as Ot, NcRuleTargetSchema as P, storageOccupancyCapability as Pt, TimelapseRulePatchSchema as Q, array as Qt, NcSnoozeSuppressedSchema as R, videoclipsCapability as Rt, MAX_BIRTH_LATENCY_PROXY_MS as S, kebabToCamel as St, NC_ALARM_SYSTEM_EVENT_KINDS as T, parseProcStatus as Tt, RECORDING_EXPORT_MAX_READ_BYTES as U, DeviceType as Ut, OpsLogEntrySchema as V, BaseAddon as Vt, RetrainStatusSchema as W, createEvent as Wt, TIMELAPSE_DENSE_FLOOR_SEC as X, sleep as Xt, SceneMonitorSchema as Y, nodePin as Yt, TimelapseRuleInputSchema as Z, _enum as Zt, FULL_IMAGE_BBOX as _, isDetectionMacroClass as _t, CLUSTER_MODEL_SCOPED_STEPS as a, record as an, audioMetricsCapability as at, MAX_ARCHIVED_DEBUG_NOTES as b, isScheduleActive as bt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as c, EventCategory as cn, cosineSimilarity as ct, DETECTION_PIPELINE_CAP_NAME as d, encodeVectorBase64 as dt, discriminatedUnion 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, partialRecord as in, assertTimelapseCadences as it, NcRuleInputSchema as j, resolveLocationMode as jt, NC_TAXONOMY as k, readDeviceStateFrom as kt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as l, deriveRecordingMode as lt, EVENT_OWNER_TYPES as m, faceGalleryCapability as mt, ArchivedDebugNoteSchema as n, number as nn, addonWidgetsSourceCapability as nt, COCO_TO_MACRO as o, string as on, audioModeOf as ot, EVENT_KIND_BY_CAP as p, evictionPolicyOfLocation as pt, SCENE_DEFAULT_UNCOVERED_POLICY as q, hydrateSchema as qt, BaseDevice as r, object as rn, alarmPanelCapability as rt, DEFAULT_EVENT_COLOR as s, unknown as sn, buildEventKindDescriptor as st, AUDIO_MACRO_LABELS as t, literal 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, zoneAnalyticsCapability as zt };
46531
+ 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 };
@@ -5390,7 +5390,7 @@ var ZodIssueCode = {
5390
5390
  var ZodFirstPartyTypeKind;
5391
5391
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5392
5392
  //#endregion
5393
- //#region ../types/dist/sleep-B9qx0cEV.mjs
5393
+ //#region ../types/dist/sleep-BfJ2k1jm.mjs
5394
5394
  /**
5395
5395
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5396
5396
  * window to float samples (D455).
@@ -22024,6 +22024,48 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
22024
22024
  * solid is this track", cheaper than re-deriving it from a trajectory. */
22025
22025
  framesMatched: number().int()
22026
22026
  })).readonly() });
22027
+ /**
22028
+ * The long-term series a camera produces. A closed union so a typo cannot
22029
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
22030
+ * is an alias of this, not a second list.
22031
+ */
22032
+ var AnalyticsLtsSeriesSchema = _enum([
22033
+ "motion",
22034
+ "audio-dbfs",
22035
+ "battery",
22036
+ "occupancy"
22037
+ ]);
22038
+ /**
22039
+ * Spell one occupancy scope.
22040
+ *
22041
+ * `occupancyScope()` → `''` (frame, every class)
22042
+ * `occupancyScope('z1')` → `'z1'` (zone, every class)
22043
+ * `occupancyScope(undefined, 'person')` → `'|person'`
22044
+ * `occupancyScope('z1', 'person')` → `'z1|person'`
22045
+ *
22046
+ * The two aggregate spellings are the ones that existed before the class
22047
+ * dimension and they mean exactly what they always did.
22048
+ */
22049
+ function occupancyScope(zoneId, className) {
22050
+ const place = zoneId ?? "";
22051
+ return className === void 0 ? place : `${place}|${className}`;
22052
+ }
22053
+ /**
22054
+ * One closed 5-minute bucket of a long-term series.
22055
+ *
22056
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
22057
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
22058
+ * that exists at all was measured; a bucket that is absent was not, which is a
22059
+ * different claim from zero and the reason this is a sparse series.
22060
+ */
22061
+ var LtsBucketSchema = object({
22062
+ scope: string(),
22063
+ bucketStart: number().int(),
22064
+ samples: number().int().nonnegative(),
22065
+ sum: number(),
22066
+ min: number(),
22067
+ max: number()
22068
+ });
22027
22069
  var pipelineAnalyticsCapability = {
22028
22070
  name: "pipeline-analytics",
22029
22071
  scope: "device",
@@ -22167,6 +22209,30 @@ var pipelineAnalyticsCapability = {
22167
22209
  getKeyEventsBatch: method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()),
22168
22210
  /** Server-side bucketed event counts for the 24-hour timeline.
22169
22211
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
22212
+ /**
22213
+ * Read one camera's long-term series — 5-minute buckets, kept for a year.
22214
+ *
22215
+ * This is the history surface for every chart that used to be served from a
22216
+ * RAM ring: the ring dies with the process, cannot answer about last night,
22217
+ * and had a 60-minute horizon, while these rows are ~60 bytes and already
22218
+ * written. `scope` is the series' own dimension — for `occupancy`, spell it
22219
+ * with {@link occupancyScope} rather than by hand, and omit it to get every
22220
+ * scope back at once (the caller then groups with
22221
+ * {@link parseOccupancyScope}).
22222
+ *
22223
+ * Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
22224
+ * still returns the bucket it lands in — the alternative is a chart whose
22225
+ * last column silently disappears for five minutes out of every five.
22226
+ */
22227
+ readLongTermSeries: method(object({
22228
+ deviceId: number(),
22229
+ series: AnalyticsLtsSeriesSchema,
22230
+ /** Omit for EVERY scope of this series in the range. */
22231
+ scope: string().optional(),
22232
+ from: number(),
22233
+ to: number(),
22234
+ limit: number().int().positive().optional()
22235
+ }), array(LtsBucketSchema).readonly()),
22170
22236
  getEventDensity: method(object({
22171
22237
  deviceId: number(),
22172
22238
  since: number(),
@@ -35606,7 +35672,28 @@ var PerScopeBreakdownSchema = object({
35606
35672
  /** Total tracked objects in this scope (frame / zone / unzoned). */
35607
35673
  totalObjects: number().int().nonnegative(),
35608
35674
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
35609
- byClass: record(string(), number().int().nonnegative())
35675
+ byClass: record(string(), number().int().nonnegative()),
35676
+ /**
35677
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
35678
+ * present but not going anywhere (a parked car, a bin, a statue).
35679
+ *
35680
+ * The operator's question about a scene has two halves and they answer
35681
+ * different things: "what is parked here" is stable for hours and must not
35682
+ * flap, while "who is walking through" is the thing an alert is about. One
35683
+ * number could only serve one of them, and `totalObjects` served the first
35684
+ * badly — a passer-by moved it and every occupancy rule saw a change.
35685
+ *
35686
+ * `standing + transient === totalObjects`, always. The total keeps its old
35687
+ * meaning exactly, so no rule written against it changes behaviour.
35688
+ *
35689
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
35690
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
35691
+ * parked objects here" about a camera whose lot is full.
35692
+ */
35693
+ standingObjects: number().int().nonnegative().optional(),
35694
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
35695
+ * same absence rule. */
35696
+ transientObjects: number().int().nonnegative().optional()
35610
35697
  });
35611
35698
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
35612
35699
  zoneId: string(),
@@ -35729,6 +35816,23 @@ var HistoryPointSchema = object({
35729
35816
  * triple covers the three spatial scopes (per-zone, frame-wide,
35730
35817
  * outside-any-zone). Crossing them with `className?` gives the full
35731
35818
  * combinatorial coverage the operator UI requested.
35819
+ *
35820
+ * ## ⚠️ The three history methods are DEPRECATED
35821
+ *
35822
+ * They are served from a 60-MINUTE in-memory ring. It dies with the process,
35823
+ * so after a restart they report nothing about a night that did happen, and any
35824
+ * window past an hour is silently clamped — a caller cannot tell a clamp from
35825
+ * an empty scene. The presets in the occupancy chart existed to hide that
35826
+ * horizon rather than to answer a question.
35827
+ *
35828
+ * Use `pipelineAnalytics.readLongTermSeries({ series: 'occupancy', scope })`
35829
+ * instead. Those rows are already written for every camera, ~60 bytes per
35830
+ * (camera, scope, 5-minute bucket), kept for a year, and survive a restart.
35831
+ * Spell the scope with `occupancyScope(zoneId?, className?)` — the same
35832
+ * function the writer uses, so the two cannot drift.
35833
+ *
35834
+ * The ring stays until these three go, and it is the only thing left reading
35835
+ * it. Do not add a fourth caller.
35732
35836
  */
35733
35837
  var zoneAnalyticsCapability = {
35734
35838
  name: "zone-analytics",
@@ -40696,6 +40800,12 @@ Object.freeze({
40696
40800
  addonId: null,
40697
40801
  access: "create"
40698
40802
  },
40803
+ "pipelineAnalytics.readLongTermSeries": {
40804
+ capName: "pipeline-analytics",
40805
+ capScope: "device",
40806
+ addonId: null,
40807
+ access: "view"
40808
+ },
40699
40809
  "pipelineAnalytics.rebuildObjectEmbeddings": {
40700
40810
  capName: "pipeline-analytics",
40701
40811
  capScope: "device",
@@ -44512,6 +44622,11 @@ Object.freeze({
44512
44622
  form: "single",
44513
44623
  optional: false
44514
44624
  }],
44625
+ "pipelineAnalytics.readLongTermSeries": [{
44626
+ name: "deviceId",
44627
+ form: "single",
44628
+ optional: false
44629
+ }],
44515
44630
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
44516
44631
  name: "deviceId",
44517
44632
  form: "single",
@@ -47032,6 +47147,12 @@ Object.defineProperty(exports, "object", {
47032
47147
  return object;
47033
47148
  }
47034
47149
  });
47150
+ Object.defineProperty(exports, "occupancyScope", {
47151
+ enumerable: true,
47152
+ get: function() {
47153
+ return occupancyScope;
47154
+ }
47155
+ });
47035
47156
  Object.defineProperty(exports, "parseProcStatus", {
47036
47157
  enumerable: true,
47037
47158
  get: function() {
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DxZAf0Hs.js");
5
+ const require_dist = require("../dist-CzmhHYgz.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { H as PoolMemoryWatchdog, Mt as resolvePoolMemoryPolicy, Tt as parseProcStatus, Vt as BaseAddon, gt as hfModelUrl, ut as embeddingEncoderCapability } from "../dist-C-1xTyB-.mjs";
1
+ import { Et as parseProcStatus, H as PoolMemoryWatchdog, Ht as BaseAddon, Nt as resolvePoolMemoryPolicy, gt as hfModelUrl, ut as embeddingEncoderCapability } from "../dist-BI5QyFCV.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";