@camstack/addon-mqtt-broker 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.
@@ -18850,6 +18850,50 @@ var EventStoreFootprintSchema = object({
18850
18850
  totalBytes: number().int(),
18851
18851
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18852
18852
  });
18853
+ /** Event-media footprint for one {@link MediaFileKind}. */
18854
+ var EventMediaKindFootprintSchema = object({
18855
+ kind: MediaFileKindEnum,
18856
+ /** Media rows of this kind. */
18857
+ rows: number().int(),
18858
+ /** Bytes on disk held by those rows. */
18859
+ bytes: number().int()
18860
+ });
18861
+ /**
18862
+ * The media footprint broken down by KIND — the axis a deletion decision
18863
+ * actually turns on.
18864
+ *
18865
+ * A byte total says how much there is; it cannot say what is safe to remove.
18866
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18867
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18868
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18869
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18870
+ * nothing else, so sizing a deletion means summing per kind.
18871
+ *
18872
+ * ## Why `unaccounted*` exists
18873
+ *
18874
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18875
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18876
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18877
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18878
+ * retired code path, or by a version that knew a kind this one does not) would
18879
+ * otherwise vanish from the total silently, and an operator would delete
18880
+ * against a denominator smaller than the disk.
18881
+ *
18882
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18883
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18884
+ */
18885
+ var EventMediaKindBreakdownSchema = object({
18886
+ /** Every media row in scope, from one unfiltered aggregate. */
18887
+ totalRows: number().int(),
18888
+ /** Every media byte in scope, from that same aggregate. */
18889
+ totalBytes: number().int(),
18890
+ /** Per-kind footprint, ordered by bytes descending. */
18891
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18892
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18893
+ unaccountedRows: number().int(),
18894
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18895
+ unaccountedBytes: number().int()
18896
+ });
18853
18897
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18854
18898
  var EventPruneCountsSchema = object({
18855
18899
  motion: number().int(),
@@ -19053,6 +19097,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19053
19097
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19054
19098
  kind: "query",
19055
19099
  auth: "admin"
19100
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19101
+ kind: "query",
19102
+ auth: "admin"
19056
19103
  }), method(object({
19057
19104
  olderThanMs: number(),
19058
19105
  reason: OpsLogReasonSchema.optional()
@@ -21004,6 +21051,20 @@ method(object({
21004
21051
  error: string().optional()
21005
21052
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21006
21053
  providerId: string(),
21054
+ /**
21055
+ * The location this config is an UNSAVED edit of, when there is one.
21056
+ *
21057
+ * `listLocations` replaces every declared secret with the redaction
21058
+ * sentinel, so the edit modal's form state holds the sentinel for any
21059
+ * credential the operator did not retype — and posting that here
21060
+ * without a way to resolve it makes the provider try to authenticate
21061
+ * as `__camstack_redacted__` and report the operator's own working
21062
+ * password as wrong. Given this id, the orchestrator restores each
21063
+ * sentinel from the stored config (same rule as `upsertLocation`)
21064
+ * before dispatching. Omitted by the "Add location" wizard, where
21065
+ * every value was typed just now and nothing is stored yet.
21066
+ */
21067
+ locationId: string().optional(),
21007
21068
  config: record(string(), unknown())
21008
21069
  }), object({
21009
21070
  ok: boolean(),
@@ -31658,6 +31719,12 @@ Object.freeze({
31658
31719
  addonId: null,
31659
31720
  access: "view"
31660
31721
  },
31722
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31723
+ capName: "pipeline-analytics",
31724
+ capScope: "device",
31725
+ addonId: null,
31726
+ access: "view"
31727
+ },
31661
31728
  "pipelineAnalytics.getEventStoreFootprint": {
31662
31729
  capName: "pipeline-analytics",
31663
31730
  capScope: "device",
@@ -35323,6 +35390,11 @@ Object.freeze({
35323
35390
  form: "single",
35324
35391
  optional: false
35325
35392
  }],
35393
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35394
+ name: "deviceId",
35395
+ form: "single",
35396
+ optional: true
35397
+ }],
35326
35398
  "pipelineAnalytics.getGroup": [{
35327
35399
  name: "deviceId",
35328
35400
  form: "single",
@@ -18845,6 +18845,50 @@ var EventStoreFootprintSchema = object({
18845
18845
  totalBytes: number().int(),
18846
18846
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18847
18847
  });
18848
+ /** Event-media footprint for one {@link MediaFileKind}. */
18849
+ var EventMediaKindFootprintSchema = object({
18850
+ kind: MediaFileKindEnum,
18851
+ /** Media rows of this kind. */
18852
+ rows: number().int(),
18853
+ /** Bytes on disk held by those rows. */
18854
+ bytes: number().int()
18855
+ });
18856
+ /**
18857
+ * The media footprint broken down by KIND — the axis a deletion decision
18858
+ * actually turns on.
18859
+ *
18860
+ * A byte total says how much there is; it cannot say what is safe to remove.
18861
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18862
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18863
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18864
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18865
+ * nothing else, so sizing a deletion means summing per kind.
18866
+ *
18867
+ * ## Why `unaccounted*` exists
18868
+ *
18869
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18870
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18871
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18872
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18873
+ * retired code path, or by a version that knew a kind this one does not) would
18874
+ * otherwise vanish from the total silently, and an operator would delete
18875
+ * against a denominator smaller than the disk.
18876
+ *
18877
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18878
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18879
+ */
18880
+ var EventMediaKindBreakdownSchema = object({
18881
+ /** Every media row in scope, from one unfiltered aggregate. */
18882
+ totalRows: number().int(),
18883
+ /** Every media byte in scope, from that same aggregate. */
18884
+ totalBytes: number().int(),
18885
+ /** Per-kind footprint, ordered by bytes descending. */
18886
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18887
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18888
+ unaccountedRows: number().int(),
18889
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18890
+ unaccountedBytes: number().int()
18891
+ });
18848
18892
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18849
18893
  var EventPruneCountsSchema = object({
18850
18894
  motion: number().int(),
@@ -19048,6 +19092,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19048
19092
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19049
19093
  kind: "query",
19050
19094
  auth: "admin"
19095
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19096
+ kind: "query",
19097
+ auth: "admin"
19051
19098
  }), method(object({
19052
19099
  olderThanMs: number(),
19053
19100
  reason: OpsLogReasonSchema.optional()
@@ -20999,6 +21046,20 @@ method(object({
20999
21046
  error: string().optional()
21000
21047
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21001
21048
  providerId: string(),
21049
+ /**
21050
+ * The location this config is an UNSAVED edit of, when there is one.
21051
+ *
21052
+ * `listLocations` replaces every declared secret with the redaction
21053
+ * sentinel, so the edit modal's form state holds the sentinel for any
21054
+ * credential the operator did not retype — and posting that here
21055
+ * without a way to resolve it makes the provider try to authenticate
21056
+ * as `__camstack_redacted__` and report the operator's own working
21057
+ * password as wrong. Given this id, the orchestrator restores each
21058
+ * sentinel from the stored config (same rule as `upsertLocation`)
21059
+ * before dispatching. Omitted by the "Add location" wizard, where
21060
+ * every value was typed just now and nothing is stored yet.
21061
+ */
21062
+ locationId: string().optional(),
21002
21063
  config: record(string(), unknown())
21003
21064
  }), object({
21004
21065
  ok: boolean(),
@@ -31653,6 +31714,12 @@ Object.freeze({
31653
31714
  addonId: null,
31654
31715
  access: "view"
31655
31716
  },
31717
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31718
+ capName: "pipeline-analytics",
31719
+ capScope: "device",
31720
+ addonId: null,
31721
+ access: "view"
31722
+ },
31656
31723
  "pipelineAnalytics.getEventStoreFootprint": {
31657
31724
  capName: "pipeline-analytics",
31658
31725
  capScope: "device",
@@ -35318,6 +35385,11 @@ Object.freeze({
35318
35385
  form: "single",
35319
35386
  optional: false
35320
35387
  }],
35388
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35389
+ name: "deviceId",
35390
+ form: "single",
35391
+ optional: true
35392
+ }],
35321
35393
  "pipelineAnalytics.getGroup": [{
35322
35394
  name: "deviceId",
35323
35395
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.2.47",
3
+ "version": "1.2.48",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",