@camstack/addon-provider-rademacher 0.2.46 → 0.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.
package/dist/addon.js CHANGED
@@ -20080,6 +20080,50 @@ var EventStoreFootprintSchema = object({
20080
20080
  totalBytes: number().int(),
20081
20081
  devices: array(EventStoreDeviceFootprintSchema).readonly()
20082
20082
  });
20083
+ /** Event-media footprint for one {@link MediaFileKind}. */
20084
+ var EventMediaKindFootprintSchema = object({
20085
+ kind: MediaFileKindEnum,
20086
+ /** Media rows of this kind. */
20087
+ rows: number().int(),
20088
+ /** Bytes on disk held by those rows. */
20089
+ bytes: number().int()
20090
+ });
20091
+ /**
20092
+ * The media footprint broken down by KIND — the axis a deletion decision
20093
+ * actually turns on.
20094
+ *
20095
+ * A byte total says how much there is; it cannot say what is safe to remove.
20096
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
20097
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
20098
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
20099
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
20100
+ * nothing else, so sizing a deletion means summing per kind.
20101
+ *
20102
+ * ## Why `unaccounted*` exists
20103
+ *
20104
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
20105
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
20106
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
20107
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
20108
+ * retired code path, or by a version that knew a kind this one does not) would
20109
+ * otherwise vanish from the total silently, and an operator would delete
20110
+ * against a denominator smaller than the disk.
20111
+ *
20112
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
20113
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
20114
+ */
20115
+ var EventMediaKindBreakdownSchema = object({
20116
+ /** Every media row in scope, from one unfiltered aggregate. */
20117
+ totalRows: number().int(),
20118
+ /** Every media byte in scope, from that same aggregate. */
20119
+ totalBytes: number().int(),
20120
+ /** Per-kind footprint, ordered by bytes descending. */
20121
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
20122
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
20123
+ unaccountedRows: number().int(),
20124
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
20125
+ unaccountedBytes: number().int()
20126
+ });
20083
20127
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
20084
20128
  var EventPruneCountsSchema = object({
20085
20129
  motion: number().int(),
@@ -20283,6 +20327,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20283
20327
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
20284
20328
  kind: "query",
20285
20329
  auth: "admin"
20330
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
20331
+ kind: "query",
20332
+ auth: "admin"
20286
20333
  }), method(object({
20287
20334
  olderThanMs: number(),
20288
20335
  reason: OpsLogReasonSchema.optional()
@@ -22234,6 +22281,20 @@ method(object({
22234
22281
  error: string().optional()
22235
22282
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
22236
22283
  providerId: string(),
22284
+ /**
22285
+ * The location this config is an UNSAVED edit of, when there is one.
22286
+ *
22287
+ * `listLocations` replaces every declared secret with the redaction
22288
+ * sentinel, so the edit modal's form state holds the sentinel for any
22289
+ * credential the operator did not retype — and posting that here
22290
+ * without a way to resolve it makes the provider try to authenticate
22291
+ * as `__camstack_redacted__` and report the operator's own working
22292
+ * password as wrong. Given this id, the orchestrator restores each
22293
+ * sentinel from the stored config (same rule as `upsertLocation`)
22294
+ * before dispatching. Omitted by the "Add location" wizard, where
22295
+ * every value was typed just now and nothing is stored yet.
22296
+ */
22297
+ locationId: string().optional(),
22237
22298
  config: record(string(), unknown())
22238
22299
  }), object({
22239
22300
  ok: boolean(),
@@ -36272,6 +36333,12 @@ Object.freeze({
36272
36333
  addonId: null,
36273
36334
  access: "view"
36274
36335
  },
36336
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
36337
+ capName: "pipeline-analytics",
36338
+ capScope: "device",
36339
+ addonId: null,
36340
+ access: "view"
36341
+ },
36275
36342
  "pipelineAnalytics.getEventStoreFootprint": {
36276
36343
  capName: "pipeline-analytics",
36277
36344
  capScope: "device",
@@ -39937,6 +40004,11 @@ Object.freeze({
39937
40004
  form: "single",
39938
40005
  optional: false
39939
40006
  }],
40007
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
40008
+ name: "deviceId",
40009
+ form: "single",
40010
+ optional: true
40011
+ }],
39940
40012
  "pipelineAnalytics.getGroup": [{
39941
40013
  name: "deviceId",
39942
40014
  form: "single",
package/dist/addon.mjs CHANGED
@@ -20079,6 +20079,50 @@ var EventStoreFootprintSchema = object({
20079
20079
  totalBytes: number().int(),
20080
20080
  devices: array(EventStoreDeviceFootprintSchema).readonly()
20081
20081
  });
20082
+ /** Event-media footprint for one {@link MediaFileKind}. */
20083
+ var EventMediaKindFootprintSchema = object({
20084
+ kind: MediaFileKindEnum,
20085
+ /** Media rows of this kind. */
20086
+ rows: number().int(),
20087
+ /** Bytes on disk held by those rows. */
20088
+ bytes: number().int()
20089
+ });
20090
+ /**
20091
+ * The media footprint broken down by KIND — the axis a deletion decision
20092
+ * actually turns on.
20093
+ *
20094
+ * A byte total says how much there is; it cannot say what is safe to remove.
20095
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
20096
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
20097
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
20098
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
20099
+ * nothing else, so sizing a deletion means summing per kind.
20100
+ *
20101
+ * ## Why `unaccounted*` exists
20102
+ *
20103
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
20104
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
20105
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
20106
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
20107
+ * retired code path, or by a version that knew a kind this one does not) would
20108
+ * otherwise vanish from the total silently, and an operator would delete
20109
+ * against a denominator smaller than the disk.
20110
+ *
20111
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
20112
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
20113
+ */
20114
+ var EventMediaKindBreakdownSchema = object({
20115
+ /** Every media row in scope, from one unfiltered aggregate. */
20116
+ totalRows: number().int(),
20117
+ /** Every media byte in scope, from that same aggregate. */
20118
+ totalBytes: number().int(),
20119
+ /** Per-kind footprint, ordered by bytes descending. */
20120
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
20121
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
20122
+ unaccountedRows: number().int(),
20123
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
20124
+ unaccountedBytes: number().int()
20125
+ });
20082
20126
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
20083
20127
  var EventPruneCountsSchema = object({
20084
20128
  motion: number().int(),
@@ -20282,6 +20326,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20282
20326
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
20283
20327
  kind: "query",
20284
20328
  auth: "admin"
20329
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
20330
+ kind: "query",
20331
+ auth: "admin"
20285
20332
  }), method(object({
20286
20333
  olderThanMs: number(),
20287
20334
  reason: OpsLogReasonSchema.optional()
@@ -22233,6 +22280,20 @@ method(object({
22233
22280
  error: string().optional()
22234
22281
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
22235
22282
  providerId: string(),
22283
+ /**
22284
+ * The location this config is an UNSAVED edit of, when there is one.
22285
+ *
22286
+ * `listLocations` replaces every declared secret with the redaction
22287
+ * sentinel, so the edit modal's form state holds the sentinel for any
22288
+ * credential the operator did not retype — and posting that here
22289
+ * without a way to resolve it makes the provider try to authenticate
22290
+ * as `__camstack_redacted__` and report the operator's own working
22291
+ * password as wrong. Given this id, the orchestrator restores each
22292
+ * sentinel from the stored config (same rule as `upsertLocation`)
22293
+ * before dispatching. Omitted by the "Add location" wizard, where
22294
+ * every value was typed just now and nothing is stored yet.
22295
+ */
22296
+ locationId: string().optional(),
22236
22297
  config: record(string(), unknown())
22237
22298
  }), object({
22238
22299
  ok: boolean(),
@@ -36271,6 +36332,12 @@ Object.freeze({
36271
36332
  addonId: null,
36272
36333
  access: "view"
36273
36334
  },
36335
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
36336
+ capName: "pipeline-analytics",
36337
+ capScope: "device",
36338
+ addonId: null,
36339
+ access: "view"
36340
+ },
36274
36341
  "pipelineAnalytics.getEventStoreFootprint": {
36275
36342
  capName: "pipeline-analytics",
36276
36343
  capScope: "device",
@@ -39936,6 +40003,11 @@ Object.freeze({
39936
40003
  form: "single",
39937
40004
  optional: false
39938
40005
  }],
40006
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
40007
+ name: "deviceId",
40008
+ form: "single",
40009
+ optional: true
40010
+ }],
39939
40011
  "pipelineAnalytics.getGroup": [{
39940
40012
  name: "deviceId",
39941
40013
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.46",
3
+ "version": "0.2.47",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",