@camstack/addon-smtp-nodemailer 1.2.46 → 1.2.47

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.
@@ -18774,6 +18774,50 @@ var EventStoreFootprintSchema = object({
18774
18774
  totalBytes: number().int(),
18775
18775
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18776
18776
  });
18777
+ /** Event-media footprint for one {@link MediaFileKind}. */
18778
+ var EventMediaKindFootprintSchema = object({
18779
+ kind: MediaFileKindEnum,
18780
+ /** Media rows of this kind. */
18781
+ rows: number().int(),
18782
+ /** Bytes on disk held by those rows. */
18783
+ bytes: number().int()
18784
+ });
18785
+ /**
18786
+ * The media footprint broken down by KIND — the axis a deletion decision
18787
+ * actually turns on.
18788
+ *
18789
+ * A byte total says how much there is; it cannot say what is safe to remove.
18790
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18791
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18792
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18793
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18794
+ * nothing else, so sizing a deletion means summing per kind.
18795
+ *
18796
+ * ## Why `unaccounted*` exists
18797
+ *
18798
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18799
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18800
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18801
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18802
+ * retired code path, or by a version that knew a kind this one does not) would
18803
+ * otherwise vanish from the total silently, and an operator would delete
18804
+ * against a denominator smaller than the disk.
18805
+ *
18806
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18807
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18808
+ */
18809
+ var EventMediaKindBreakdownSchema = object({
18810
+ /** Every media row in scope, from one unfiltered aggregate. */
18811
+ totalRows: number().int(),
18812
+ /** Every media byte in scope, from that same aggregate. */
18813
+ totalBytes: number().int(),
18814
+ /** Per-kind footprint, ordered by bytes descending. */
18815
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18816
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18817
+ unaccountedRows: number().int(),
18818
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18819
+ unaccountedBytes: number().int()
18820
+ });
18777
18821
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18778
18822
  var EventPruneCountsSchema = object({
18779
18823
  motion: number().int(),
@@ -18977,6 +19021,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18977
19021
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18978
19022
  kind: "query",
18979
19023
  auth: "admin"
19024
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19025
+ kind: "query",
19026
+ auth: "admin"
18980
19027
  }), method(object({
18981
19028
  olderThanMs: number(),
18982
19029
  reason: OpsLogReasonSchema.optional()
@@ -20941,6 +20988,20 @@ method(object({
20941
20988
  error: string().optional()
20942
20989
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20943
20990
  providerId: string(),
20991
+ /**
20992
+ * The location this config is an UNSAVED edit of, when there is one.
20993
+ *
20994
+ * `listLocations` replaces every declared secret with the redaction
20995
+ * sentinel, so the edit modal's form state holds the sentinel for any
20996
+ * credential the operator did not retype — and posting that here
20997
+ * without a way to resolve it makes the provider try to authenticate
20998
+ * as `__camstack_redacted__` and report the operator's own working
20999
+ * password as wrong. Given this id, the orchestrator restores each
21000
+ * sentinel from the stored config (same rule as `upsertLocation`)
21001
+ * before dispatching. Omitted by the "Add location" wizard, where
21002
+ * every value was typed just now and nothing is stored yet.
21003
+ */
21004
+ locationId: string().optional(),
20944
21005
  config: record(string(), unknown())
20945
21006
  }), object({
20946
21007
  ok: boolean(),
@@ -31595,6 +31656,12 @@ Object.freeze({
31595
31656
  addonId: null,
31596
31657
  access: "view"
31597
31658
  },
31659
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31660
+ capName: "pipeline-analytics",
31661
+ capScope: "device",
31662
+ addonId: null,
31663
+ access: "view"
31664
+ },
31598
31665
  "pipelineAnalytics.getEventStoreFootprint": {
31599
31666
  capName: "pipeline-analytics",
31600
31667
  capScope: "device",
@@ -35260,6 +35327,11 @@ Object.freeze({
35260
35327
  form: "single",
35261
35328
  optional: false
35262
35329
  }],
35330
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35331
+ name: "deviceId",
35332
+ form: "single",
35333
+ optional: true
35334
+ }],
35263
35335
  "pipelineAnalytics.getGroup": [{
35264
35336
  name: "deviceId",
35265
35337
  form: "single",
@@ -18772,6 +18772,50 @@ var EventStoreFootprintSchema = object({
18772
18772
  totalBytes: number().int(),
18773
18773
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18774
18774
  });
18775
+ /** Event-media footprint for one {@link MediaFileKind}. */
18776
+ var EventMediaKindFootprintSchema = object({
18777
+ kind: MediaFileKindEnum,
18778
+ /** Media rows of this kind. */
18779
+ rows: number().int(),
18780
+ /** Bytes on disk held by those rows. */
18781
+ bytes: number().int()
18782
+ });
18783
+ /**
18784
+ * The media footprint broken down by KIND — the axis a deletion decision
18785
+ * actually turns on.
18786
+ *
18787
+ * A byte total says how much there is; it cannot say what is safe to remove.
18788
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18789
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18790
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18791
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18792
+ * nothing else, so sizing a deletion means summing per kind.
18793
+ *
18794
+ * ## Why `unaccounted*` exists
18795
+ *
18796
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18797
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18798
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18799
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18800
+ * retired code path, or by a version that knew a kind this one does not) would
18801
+ * otherwise vanish from the total silently, and an operator would delete
18802
+ * against a denominator smaller than the disk.
18803
+ *
18804
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18805
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18806
+ */
18807
+ var EventMediaKindBreakdownSchema = object({
18808
+ /** Every media row in scope, from one unfiltered aggregate. */
18809
+ totalRows: number().int(),
18810
+ /** Every media byte in scope, from that same aggregate. */
18811
+ totalBytes: number().int(),
18812
+ /** Per-kind footprint, ordered by bytes descending. */
18813
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18814
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18815
+ unaccountedRows: number().int(),
18816
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18817
+ unaccountedBytes: number().int()
18818
+ });
18775
18819
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18776
18820
  var EventPruneCountsSchema = object({
18777
18821
  motion: number().int(),
@@ -18975,6 +19019,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18975
19019
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18976
19020
  kind: "query",
18977
19021
  auth: "admin"
19022
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19023
+ kind: "query",
19024
+ auth: "admin"
18978
19025
  }), method(object({
18979
19026
  olderThanMs: number(),
18980
19027
  reason: OpsLogReasonSchema.optional()
@@ -20939,6 +20986,20 @@ method(object({
20939
20986
  error: string().optional()
20940
20987
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20941
20988
  providerId: string(),
20989
+ /**
20990
+ * The location this config is an UNSAVED edit of, when there is one.
20991
+ *
20992
+ * `listLocations` replaces every declared secret with the redaction
20993
+ * sentinel, so the edit modal's form state holds the sentinel for any
20994
+ * credential the operator did not retype — and posting that here
20995
+ * without a way to resolve it makes the provider try to authenticate
20996
+ * as `__camstack_redacted__` and report the operator's own working
20997
+ * password as wrong. Given this id, the orchestrator restores each
20998
+ * sentinel from the stored config (same rule as `upsertLocation`)
20999
+ * before dispatching. Omitted by the "Add location" wizard, where
21000
+ * every value was typed just now and nothing is stored yet.
21001
+ */
21002
+ locationId: string().optional(),
20942
21003
  config: record(string(), unknown())
20943
21004
  }), object({
20944
21005
  ok: boolean(),
@@ -31593,6 +31654,12 @@ Object.freeze({
31593
31654
  addonId: null,
31594
31655
  access: "view"
31595
31656
  },
31657
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31658
+ capName: "pipeline-analytics",
31659
+ capScope: "device",
31660
+ addonId: null,
31661
+ access: "view"
31662
+ },
31596
31663
  "pipelineAnalytics.getEventStoreFootprint": {
31597
31664
  capName: "pipeline-analytics",
31598
31665
  capScope: "device",
@@ -35258,6 +35325,11 @@ Object.freeze({
35258
35325
  form: "single",
35259
35326
  optional: false
35260
35327
  }],
35328
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35329
+ name: "deviceId",
35330
+ form: "single",
35331
+ optional: true
35332
+ }],
35261
35333
  "pipelineAnalytics.getGroup": [{
35262
35334
  name: "deviceId",
35263
35335
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.46",
3
+ "version": "1.2.47",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",