@camstack/addon-decoder-nodeav 1.2.47 → 1.2.48

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.
package/dist/index.js CHANGED
@@ -18883,6 +18883,50 @@ var EventStoreFootprintSchema = object({
18883
18883
  totalBytes: number().int(),
18884
18884
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18885
18885
  });
18886
+ /** Event-media footprint for one {@link MediaFileKind}. */
18887
+ var EventMediaKindFootprintSchema = object({
18888
+ kind: MediaFileKindEnum,
18889
+ /** Media rows of this kind. */
18890
+ rows: number().int(),
18891
+ /** Bytes on disk held by those rows. */
18892
+ bytes: number().int()
18893
+ });
18894
+ /**
18895
+ * The media footprint broken down by KIND — the axis a deletion decision
18896
+ * actually turns on.
18897
+ *
18898
+ * A byte total says how much there is; it cannot say what is safe to remove.
18899
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18900
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18901
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18902
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18903
+ * nothing else, so sizing a deletion means summing per kind.
18904
+ *
18905
+ * ## Why `unaccounted*` exists
18906
+ *
18907
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18908
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18909
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18910
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18911
+ * retired code path, or by a version that knew a kind this one does not) would
18912
+ * otherwise vanish from the total silently, and an operator would delete
18913
+ * against a denominator smaller than the disk.
18914
+ *
18915
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18916
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18917
+ */
18918
+ var EventMediaKindBreakdownSchema = object({
18919
+ /** Every media row in scope, from one unfiltered aggregate. */
18920
+ totalRows: number().int(),
18921
+ /** Every media byte in scope, from that same aggregate. */
18922
+ totalBytes: number().int(),
18923
+ /** Per-kind footprint, ordered by bytes descending. */
18924
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18925
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18926
+ unaccountedRows: number().int(),
18927
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18928
+ unaccountedBytes: number().int()
18929
+ });
18886
18930
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18887
18931
  var EventPruneCountsSchema = object({
18888
18932
  motion: number().int(),
@@ -19086,6 +19130,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19086
19130
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19087
19131
  kind: "query",
19088
19132
  auth: "admin"
19133
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19134
+ kind: "query",
19135
+ auth: "admin"
19089
19136
  }), method(object({
19090
19137
  olderThanMs: number(),
19091
19138
  reason: OpsLogReasonSchema.optional()
@@ -21037,6 +21084,20 @@ method(object({
21037
21084
  error: string().optional()
21038
21085
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21039
21086
  providerId: string(),
21087
+ /**
21088
+ * The location this config is an UNSAVED edit of, when there is one.
21089
+ *
21090
+ * `listLocations` replaces every declared secret with the redaction
21091
+ * sentinel, so the edit modal's form state holds the sentinel for any
21092
+ * credential the operator did not retype — and posting that here
21093
+ * without a way to resolve it makes the provider try to authenticate
21094
+ * as `__camstack_redacted__` and report the operator's own working
21095
+ * password as wrong. Given this id, the orchestrator restores each
21096
+ * sentinel from the stored config (same rule as `upsertLocation`)
21097
+ * before dispatching. Omitted by the "Add location" wizard, where
21098
+ * every value was typed just now and nothing is stored yet.
21099
+ */
21100
+ locationId: string().optional(),
21040
21101
  config: record(string(), unknown())
21041
21102
  }), object({
21042
21103
  ok: boolean(),
@@ -31691,6 +31752,12 @@ Object.freeze({
31691
31752
  addonId: null,
31692
31753
  access: "view"
31693
31754
  },
31755
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31756
+ capName: "pipeline-analytics",
31757
+ capScope: "device",
31758
+ addonId: null,
31759
+ access: "view"
31760
+ },
31694
31761
  "pipelineAnalytics.getEventStoreFootprint": {
31695
31762
  capName: "pipeline-analytics",
31696
31763
  capScope: "device",
@@ -35356,6 +35423,11 @@ Object.freeze({
35356
35423
  form: "single",
35357
35424
  optional: false
35358
35425
  }],
35426
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35427
+ name: "deviceId",
35428
+ form: "single",
35429
+ optional: true
35430
+ }],
35359
35431
  "pipelineAnalytics.getGroup": [{
35360
35432
  name: "deviceId",
35361
35433
  form: "single",
package/dist/index.mjs CHANGED
@@ -18879,6 +18879,50 @@ var EventStoreFootprintSchema = object({
18879
18879
  totalBytes: number().int(),
18880
18880
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18881
18881
  });
18882
+ /** Event-media footprint for one {@link MediaFileKind}. */
18883
+ var EventMediaKindFootprintSchema = object({
18884
+ kind: MediaFileKindEnum,
18885
+ /** Media rows of this kind. */
18886
+ rows: number().int(),
18887
+ /** Bytes on disk held by those rows. */
18888
+ bytes: number().int()
18889
+ });
18890
+ /**
18891
+ * The media footprint broken down by KIND — the axis a deletion decision
18892
+ * actually turns on.
18893
+ *
18894
+ * A byte total says how much there is; it cannot say what is safe to remove.
18895
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18896
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18897
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18898
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18899
+ * nothing else, so sizing a deletion means summing per kind.
18900
+ *
18901
+ * ## Why `unaccounted*` exists
18902
+ *
18903
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18904
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18905
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18906
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18907
+ * retired code path, or by a version that knew a kind this one does not) would
18908
+ * otherwise vanish from the total silently, and an operator would delete
18909
+ * against a denominator smaller than the disk.
18910
+ *
18911
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18912
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18913
+ */
18914
+ var EventMediaKindBreakdownSchema = object({
18915
+ /** Every media row in scope, from one unfiltered aggregate. */
18916
+ totalRows: number().int(),
18917
+ /** Every media byte in scope, from that same aggregate. */
18918
+ totalBytes: number().int(),
18919
+ /** Per-kind footprint, ordered by bytes descending. */
18920
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18921
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18922
+ unaccountedRows: number().int(),
18923
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18924
+ unaccountedBytes: number().int()
18925
+ });
18882
18926
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18883
18927
  var EventPruneCountsSchema = object({
18884
18928
  motion: number().int(),
@@ -19082,6 +19126,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19082
19126
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19083
19127
  kind: "query",
19084
19128
  auth: "admin"
19129
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19130
+ kind: "query",
19131
+ auth: "admin"
19085
19132
  }), method(object({
19086
19133
  olderThanMs: number(),
19087
19134
  reason: OpsLogReasonSchema.optional()
@@ -21033,6 +21080,20 @@ method(object({
21033
21080
  error: string().optional()
21034
21081
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21035
21082
  providerId: string(),
21083
+ /**
21084
+ * The location this config is an UNSAVED edit of, when there is one.
21085
+ *
21086
+ * `listLocations` replaces every declared secret with the redaction
21087
+ * sentinel, so the edit modal's form state holds the sentinel for any
21088
+ * credential the operator did not retype — and posting that here
21089
+ * without a way to resolve it makes the provider try to authenticate
21090
+ * as `__camstack_redacted__` and report the operator's own working
21091
+ * password as wrong. Given this id, the orchestrator restores each
21092
+ * sentinel from the stored config (same rule as `upsertLocation`)
21093
+ * before dispatching. Omitted by the "Add location" wizard, where
21094
+ * every value was typed just now and nothing is stored yet.
21095
+ */
21096
+ locationId: string().optional(),
21036
21097
  config: record(string(), unknown())
21037
21098
  }), object({
21038
21099
  ok: boolean(),
@@ -31687,6 +31748,12 @@ Object.freeze({
31687
31748
  addonId: null,
31688
31749
  access: "view"
31689
31750
  },
31751
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31752
+ capName: "pipeline-analytics",
31753
+ capScope: "device",
31754
+ addonId: null,
31755
+ access: "view"
31756
+ },
31690
31757
  "pipelineAnalytics.getEventStoreFootprint": {
31691
31758
  capName: "pipeline-analytics",
31692
31759
  capScope: "device",
@@ -35352,6 +35419,11 @@ Object.freeze({
35352
35419
  form: "single",
35353
35420
  optional: false
35354
35421
  }],
35422
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35423
+ name: "deviceId",
35424
+ form: "single",
35425
+ optional: true
35426
+ }],
35355
35427
  "pipelineAnalytics.getGroup": [{
35356
35428
  name: "deviceId",
35357
35429
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-decoder-nodeav",
3
- "version": "1.2.47",
3
+ "version": "1.2.48",
4
4
  "description": "Standalone in-process node-av decoder addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",