@camstack/addon-export-alexa 1.2.53 → 1.2.54

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.
@@ -19064,6 +19064,50 @@ var EventStoreFootprintSchema = object({
19064
19064
  totalBytes: number().int(),
19065
19065
  devices: array(EventStoreDeviceFootprintSchema).readonly()
19066
19066
  });
19067
+ /** Event-media footprint for one {@link MediaFileKind}. */
19068
+ var EventMediaKindFootprintSchema = object({
19069
+ kind: MediaFileKindEnum,
19070
+ /** Media rows of this kind. */
19071
+ rows: number().int(),
19072
+ /** Bytes on disk held by those rows. */
19073
+ bytes: number().int()
19074
+ });
19075
+ /**
19076
+ * The media footprint broken down by KIND — the axis a deletion decision
19077
+ * actually turns on.
19078
+ *
19079
+ * A byte total says how much there is; it cannot say what is safe to remove.
19080
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
19081
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
19082
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
19083
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
19084
+ * nothing else, so sizing a deletion means summing per kind.
19085
+ *
19086
+ * ## Why `unaccounted*` exists
19087
+ *
19088
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
19089
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
19090
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
19091
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
19092
+ * retired code path, or by a version that knew a kind this one does not) would
19093
+ * otherwise vanish from the total silently, and an operator would delete
19094
+ * against a denominator smaller than the disk.
19095
+ *
19096
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
19097
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
19098
+ */
19099
+ var EventMediaKindBreakdownSchema = object({
19100
+ /** Every media row in scope, from one unfiltered aggregate. */
19101
+ totalRows: number().int(),
19102
+ /** Every media byte in scope, from that same aggregate. */
19103
+ totalBytes: number().int(),
19104
+ /** Per-kind footprint, ordered by bytes descending. */
19105
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
19106
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
19107
+ unaccountedRows: number().int(),
19108
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
19109
+ unaccountedBytes: number().int()
19110
+ });
19067
19111
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
19068
19112
  var EventPruneCountsSchema = object({
19069
19113
  motion: number().int(),
@@ -19267,6 +19311,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19267
19311
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19268
19312
  kind: "query",
19269
19313
  auth: "admin"
19314
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19315
+ kind: "query",
19316
+ auth: "admin"
19270
19317
  }), method(object({
19271
19318
  olderThanMs: number(),
19272
19319
  reason: OpsLogReasonSchema.optional()
@@ -21218,6 +21265,20 @@ method(object({
21218
21265
  error: string().optional()
21219
21266
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21220
21267
  providerId: string(),
21268
+ /**
21269
+ * The location this config is an UNSAVED edit of, when there is one.
21270
+ *
21271
+ * `listLocations` replaces every declared secret with the redaction
21272
+ * sentinel, so the edit modal's form state holds the sentinel for any
21273
+ * credential the operator did not retype — and posting that here
21274
+ * without a way to resolve it makes the provider try to authenticate
21275
+ * as `__camstack_redacted__` and report the operator's own working
21276
+ * password as wrong. Given this id, the orchestrator restores each
21277
+ * sentinel from the stored config (same rule as `upsertLocation`)
21278
+ * before dispatching. Omitted by the "Add location" wizard, where
21279
+ * every value was typed just now and nothing is stored yet.
21280
+ */
21281
+ locationId: string().optional(),
21221
21282
  config: record(string(), unknown())
21222
21283
  }), object({
21223
21284
  ok: boolean(),
@@ -31872,6 +31933,12 @@ Object.freeze({
31872
31933
  addonId: null,
31873
31934
  access: "view"
31874
31935
  },
31936
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31937
+ capName: "pipeline-analytics",
31938
+ capScope: "device",
31939
+ addonId: null,
31940
+ access: "view"
31941
+ },
31875
31942
  "pipelineAnalytics.getEventStoreFootprint": {
31876
31943
  capName: "pipeline-analytics",
31877
31944
  capScope: "device",
@@ -35537,6 +35604,11 @@ Object.freeze({
35537
35604
  form: "single",
35538
35605
  optional: false
35539
35606
  }],
35607
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35608
+ name: "deviceId",
35609
+ form: "single",
35610
+ optional: true
35611
+ }],
35540
35612
  "pipelineAnalytics.getGroup": [{
35541
35613
  name: "deviceId",
35542
35614
  form: "single",
@@ -19037,6 +19037,50 @@ var EventStoreFootprintSchema = object({
19037
19037
  totalBytes: number().int(),
19038
19038
  devices: array(EventStoreDeviceFootprintSchema).readonly()
19039
19039
  });
19040
+ /** Event-media footprint for one {@link MediaFileKind}. */
19041
+ var EventMediaKindFootprintSchema = object({
19042
+ kind: MediaFileKindEnum,
19043
+ /** Media rows of this kind. */
19044
+ rows: number().int(),
19045
+ /** Bytes on disk held by those rows. */
19046
+ bytes: number().int()
19047
+ });
19048
+ /**
19049
+ * The media footprint broken down by KIND — the axis a deletion decision
19050
+ * actually turns on.
19051
+ *
19052
+ * A byte total says how much there is; it cannot say what is safe to remove.
19053
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
19054
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
19055
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
19056
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
19057
+ * nothing else, so sizing a deletion means summing per kind.
19058
+ *
19059
+ * ## Why `unaccounted*` exists
19060
+ *
19061
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
19062
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
19063
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
19064
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
19065
+ * retired code path, or by a version that knew a kind this one does not) would
19066
+ * otherwise vanish from the total silently, and an operator would delete
19067
+ * against a denominator smaller than the disk.
19068
+ *
19069
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
19070
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
19071
+ */
19072
+ var EventMediaKindBreakdownSchema = object({
19073
+ /** Every media row in scope, from one unfiltered aggregate. */
19074
+ totalRows: number().int(),
19075
+ /** Every media byte in scope, from that same aggregate. */
19076
+ totalBytes: number().int(),
19077
+ /** Per-kind footprint, ordered by bytes descending. */
19078
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
19079
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
19080
+ unaccountedRows: number().int(),
19081
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
19082
+ unaccountedBytes: number().int()
19083
+ });
19040
19084
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
19041
19085
  var EventPruneCountsSchema = object({
19042
19086
  motion: number().int(),
@@ -19240,6 +19284,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19240
19284
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19241
19285
  kind: "query",
19242
19286
  auth: "admin"
19287
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19288
+ kind: "query",
19289
+ auth: "admin"
19243
19290
  }), method(object({
19244
19291
  olderThanMs: number(),
19245
19292
  reason: OpsLogReasonSchema.optional()
@@ -21191,6 +21238,20 @@ method(object({
21191
21238
  error: string().optional()
21192
21239
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21193
21240
  providerId: string(),
21241
+ /**
21242
+ * The location this config is an UNSAVED edit of, when there is one.
21243
+ *
21244
+ * `listLocations` replaces every declared secret with the redaction
21245
+ * sentinel, so the edit modal's form state holds the sentinel for any
21246
+ * credential the operator did not retype — and posting that here
21247
+ * without a way to resolve it makes the provider try to authenticate
21248
+ * as `__camstack_redacted__` and report the operator's own working
21249
+ * password as wrong. Given this id, the orchestrator restores each
21250
+ * sentinel from the stored config (same rule as `upsertLocation`)
21251
+ * before dispatching. Omitted by the "Add location" wizard, where
21252
+ * every value was typed just now and nothing is stored yet.
21253
+ */
21254
+ locationId: string().optional(),
21194
21255
  config: record(string(), unknown())
21195
21256
  }), object({
21196
21257
  ok: boolean(),
@@ -31845,6 +31906,12 @@ Object.freeze({
31845
31906
  addonId: null,
31846
31907
  access: "view"
31847
31908
  },
31909
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31910
+ capName: "pipeline-analytics",
31911
+ capScope: "device",
31912
+ addonId: null,
31913
+ access: "view"
31914
+ },
31848
31915
  "pipelineAnalytics.getEventStoreFootprint": {
31849
31916
  capName: "pipeline-analytics",
31850
31917
  capScope: "device",
@@ -35510,6 +35577,11 @@ Object.freeze({
35510
35577
  form: "single",
35511
35578
  optional: false
35512
35579
  }],
35580
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35581
+ name: "deviceId",
35582
+ form: "single",
35583
+ optional: true
35584
+ }],
35513
35585
  "pipelineAnalytics.getGroup": [{
35514
35586
  name: "deviceId",
35515
35587
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.53",
3
+ "version": "1.2.54",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",