@camstack/addon-notifiers 1.2.51 → 1.2.52

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/addon.js CHANGED
@@ -18941,6 +18941,50 @@ var EventStoreFootprintSchema = object({
18941
18941
  totalBytes: number().int(),
18942
18942
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18943
18943
  });
18944
+ /** Event-media footprint for one {@link MediaFileKind}. */
18945
+ var EventMediaKindFootprintSchema = object({
18946
+ kind: MediaFileKindEnum,
18947
+ /** Media rows of this kind. */
18948
+ rows: number().int(),
18949
+ /** Bytes on disk held by those rows. */
18950
+ bytes: number().int()
18951
+ });
18952
+ /**
18953
+ * The media footprint broken down by KIND — the axis a deletion decision
18954
+ * actually turns on.
18955
+ *
18956
+ * A byte total says how much there is; it cannot say what is safe to remove.
18957
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18958
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18959
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18960
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18961
+ * nothing else, so sizing a deletion means summing per kind.
18962
+ *
18963
+ * ## Why `unaccounted*` exists
18964
+ *
18965
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18966
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18967
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18968
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18969
+ * retired code path, or by a version that knew a kind this one does not) would
18970
+ * otherwise vanish from the total silently, and an operator would delete
18971
+ * against a denominator smaller than the disk.
18972
+ *
18973
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18974
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18975
+ */
18976
+ var EventMediaKindBreakdownSchema = object({
18977
+ /** Every media row in scope, from one unfiltered aggregate. */
18978
+ totalRows: number().int(),
18979
+ /** Every media byte in scope, from that same aggregate. */
18980
+ totalBytes: number().int(),
18981
+ /** Per-kind footprint, ordered by bytes descending. */
18982
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18983
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18984
+ unaccountedRows: number().int(),
18985
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18986
+ unaccountedBytes: number().int()
18987
+ });
18944
18988
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18945
18989
  var EventPruneCountsSchema = object({
18946
18990
  motion: number().int(),
@@ -19144,6 +19188,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19144
19188
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19145
19189
  kind: "query",
19146
19190
  auth: "admin"
19191
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19192
+ kind: "query",
19193
+ auth: "admin"
19147
19194
  }), method(object({
19148
19195
  olderThanMs: number(),
19149
19196
  reason: OpsLogReasonSchema.optional()
@@ -21095,6 +21142,20 @@ method(object({
21095
21142
  error: string().optional()
21096
21143
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21097
21144
  providerId: string(),
21145
+ /**
21146
+ * The location this config is an UNSAVED edit of, when there is one.
21147
+ *
21148
+ * `listLocations` replaces every declared secret with the redaction
21149
+ * sentinel, so the edit modal's form state holds the sentinel for any
21150
+ * credential the operator did not retype — and posting that here
21151
+ * without a way to resolve it makes the provider try to authenticate
21152
+ * as `__camstack_redacted__` and report the operator's own working
21153
+ * password as wrong. Given this id, the orchestrator restores each
21154
+ * sentinel from the stored config (same rule as `upsertLocation`)
21155
+ * before dispatching. Omitted by the "Add location" wizard, where
21156
+ * every value was typed just now and nothing is stored yet.
21157
+ */
21158
+ locationId: string().optional(),
21098
21159
  config: record(string(), unknown())
21099
21160
  }), object({
21100
21161
  ok: boolean(),
@@ -31749,6 +31810,12 @@ Object.freeze({
31749
31810
  addonId: null,
31750
31811
  access: "view"
31751
31812
  },
31813
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31814
+ capName: "pipeline-analytics",
31815
+ capScope: "device",
31816
+ addonId: null,
31817
+ access: "view"
31818
+ },
31752
31819
  "pipelineAnalytics.getEventStoreFootprint": {
31753
31820
  capName: "pipeline-analytics",
31754
31821
  capScope: "device",
@@ -35414,6 +35481,11 @@ Object.freeze({
35414
35481
  form: "single",
35415
35482
  optional: false
35416
35483
  }],
35484
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35485
+ name: "deviceId",
35486
+ form: "single",
35487
+ optional: true
35488
+ }],
35417
35489
  "pipelineAnalytics.getGroup": [{
35418
35490
  name: "deviceId",
35419
35491
  form: "single",
package/dist/addon.mjs CHANGED
@@ -18914,6 +18914,50 @@ var EventStoreFootprintSchema = object({
18914
18914
  totalBytes: number().int(),
18915
18915
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18916
18916
  });
18917
+ /** Event-media footprint for one {@link MediaFileKind}. */
18918
+ var EventMediaKindFootprintSchema = object({
18919
+ kind: MediaFileKindEnum,
18920
+ /** Media rows of this kind. */
18921
+ rows: number().int(),
18922
+ /** Bytes on disk held by those rows. */
18923
+ bytes: number().int()
18924
+ });
18925
+ /**
18926
+ * The media footprint broken down by KIND — the axis a deletion decision
18927
+ * actually turns on.
18928
+ *
18929
+ * A byte total says how much there is; it cannot say what is safe to remove.
18930
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18931
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18932
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18933
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18934
+ * nothing else, so sizing a deletion means summing per kind.
18935
+ *
18936
+ * ## Why `unaccounted*` exists
18937
+ *
18938
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18939
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18940
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18941
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18942
+ * retired code path, or by a version that knew a kind this one does not) would
18943
+ * otherwise vanish from the total silently, and an operator would delete
18944
+ * against a denominator smaller than the disk.
18945
+ *
18946
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18947
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18948
+ */
18949
+ var EventMediaKindBreakdownSchema = object({
18950
+ /** Every media row in scope, from one unfiltered aggregate. */
18951
+ totalRows: number().int(),
18952
+ /** Every media byte in scope, from that same aggregate. */
18953
+ totalBytes: number().int(),
18954
+ /** Per-kind footprint, ordered by bytes descending. */
18955
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18956
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18957
+ unaccountedRows: number().int(),
18958
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18959
+ unaccountedBytes: number().int()
18960
+ });
18917
18961
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18918
18962
  var EventPruneCountsSchema = object({
18919
18963
  motion: number().int(),
@@ -19117,6 +19161,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19117
19161
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19118
19162
  kind: "query",
19119
19163
  auth: "admin"
19164
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19165
+ kind: "query",
19166
+ auth: "admin"
19120
19167
  }), method(object({
19121
19168
  olderThanMs: number(),
19122
19169
  reason: OpsLogReasonSchema.optional()
@@ -21068,6 +21115,20 @@ method(object({
21068
21115
  error: string().optional()
21069
21116
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21070
21117
  providerId: string(),
21118
+ /**
21119
+ * The location this config is an UNSAVED edit of, when there is one.
21120
+ *
21121
+ * `listLocations` replaces every declared secret with the redaction
21122
+ * sentinel, so the edit modal's form state holds the sentinel for any
21123
+ * credential the operator did not retype — and posting that here
21124
+ * without a way to resolve it makes the provider try to authenticate
21125
+ * as `__camstack_redacted__` and report the operator's own working
21126
+ * password as wrong. Given this id, the orchestrator restores each
21127
+ * sentinel from the stored config (same rule as `upsertLocation`)
21128
+ * before dispatching. Omitted by the "Add location" wizard, where
21129
+ * every value was typed just now and nothing is stored yet.
21130
+ */
21131
+ locationId: string().optional(),
21071
21132
  config: record(string(), unknown())
21072
21133
  }), object({
21073
21134
  ok: boolean(),
@@ -31722,6 +31783,12 @@ Object.freeze({
31722
31783
  addonId: null,
31723
31784
  access: "view"
31724
31785
  },
31786
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31787
+ capName: "pipeline-analytics",
31788
+ capScope: "device",
31789
+ addonId: null,
31790
+ access: "view"
31791
+ },
31725
31792
  "pipelineAnalytics.getEventStoreFootprint": {
31726
31793
  capName: "pipeline-analytics",
31727
31794
  capScope: "device",
@@ -35387,6 +35454,11 @@ Object.freeze({
35387
35454
  form: "single",
35388
35455
  optional: false
35389
35456
  }],
35457
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35458
+ name: "deviceId",
35459
+ form: "single",
35460
+ optional: true
35461
+ }],
35390
35462
  "pipelineAnalytics.getGroup": [{
35391
35463
  name: "deviceId",
35392
35464
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.51",
3
+ "version": "1.2.52",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",