@camstack/addon-remote-storage 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.
package/dist/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DAxSJcnX.js");
5
+ const require_shared = require("./shared-BvqywmnV.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-hUiD7Ohg.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-Cysa81KY.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DAxSJcnX.js");
5
+ const require_shared = require("./shared-BvqywmnV.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-hUiD7Ohg.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Cysa81KY.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -18761,6 +18761,50 @@ var EventStoreFootprintSchema = object({
18761
18761
  totalBytes: number().int(),
18762
18762
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18763
18763
  });
18764
+ /** Event-media footprint for one {@link MediaFileKind}. */
18765
+ var EventMediaKindFootprintSchema = object({
18766
+ kind: MediaFileKindEnum,
18767
+ /** Media rows of this kind. */
18768
+ rows: number().int(),
18769
+ /** Bytes on disk held by those rows. */
18770
+ bytes: number().int()
18771
+ });
18772
+ /**
18773
+ * The media footprint broken down by KIND — the axis a deletion decision
18774
+ * actually turns on.
18775
+ *
18776
+ * A byte total says how much there is; it cannot say what is safe to remove.
18777
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18778
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18779
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18780
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18781
+ * nothing else, so sizing a deletion means summing per kind.
18782
+ *
18783
+ * ## Why `unaccounted*` exists
18784
+ *
18785
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18786
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18787
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18788
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18789
+ * retired code path, or by a version that knew a kind this one does not) would
18790
+ * otherwise vanish from the total silently, and an operator would delete
18791
+ * against a denominator smaller than the disk.
18792
+ *
18793
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18794
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18795
+ */
18796
+ var EventMediaKindBreakdownSchema = object({
18797
+ /** Every media row in scope, from one unfiltered aggregate. */
18798
+ totalRows: number().int(),
18799
+ /** Every media byte in scope, from that same aggregate. */
18800
+ totalBytes: number().int(),
18801
+ /** Per-kind footprint, ordered by bytes descending. */
18802
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18803
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18804
+ unaccountedRows: number().int(),
18805
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18806
+ unaccountedBytes: number().int()
18807
+ });
18764
18808
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18765
18809
  var EventPruneCountsSchema = object({
18766
18810
  motion: number().int(),
@@ -18964,6 +19008,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18964
19008
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18965
19009
  kind: "query",
18966
19010
  auth: "admin"
19011
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19012
+ kind: "query",
19013
+ auth: "admin"
18967
19014
  }), method(object({
18968
19015
  olderThanMs: number(),
18969
19016
  reason: OpsLogReasonSchema.optional()
@@ -20915,6 +20962,20 @@ method(object({
20915
20962
  error: string().optional()
20916
20963
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20917
20964
  providerId: string(),
20965
+ /**
20966
+ * The location this config is an UNSAVED edit of, when there is one.
20967
+ *
20968
+ * `listLocations` replaces every declared secret with the redaction
20969
+ * sentinel, so the edit modal's form state holds the sentinel for any
20970
+ * credential the operator did not retype — and posting that here
20971
+ * without a way to resolve it makes the provider try to authenticate
20972
+ * as `__camstack_redacted__` and report the operator's own working
20973
+ * password as wrong. Given this id, the orchestrator restores each
20974
+ * sentinel from the stored config (same rule as `upsertLocation`)
20975
+ * before dispatching. Omitted by the "Add location" wizard, where
20976
+ * every value was typed just now and nothing is stored yet.
20977
+ */
20978
+ locationId: string().optional(),
20918
20979
  config: record(string(), unknown())
20919
20980
  }), object({
20920
20981
  ok: boolean(),
@@ -31629,6 +31690,12 @@ Object.freeze({
31629
31690
  addonId: null,
31630
31691
  access: "view"
31631
31692
  },
31693
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31694
+ capName: "pipeline-analytics",
31695
+ capScope: "device",
31696
+ addonId: null,
31697
+ access: "view"
31698
+ },
31632
31699
  "pipelineAnalytics.getEventStoreFootprint": {
31633
31700
  capName: "pipeline-analytics",
31634
31701
  capScope: "device",
@@ -35294,6 +35361,11 @@ Object.freeze({
35294
35361
  form: "single",
35295
35362
  optional: false
35296
35363
  }],
35364
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35365
+ name: "deviceId",
35366
+ form: "single",
35367
+ optional: true
35368
+ }],
35297
35369
  "pipelineAnalytics.getGroup": [{
35298
35370
  name: "deviceId",
35299
35371
  form: "single",
@@ -18738,6 +18738,50 @@ var EventStoreFootprintSchema = object({
18738
18738
  totalBytes: number().int(),
18739
18739
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18740
18740
  });
18741
+ /** Event-media footprint for one {@link MediaFileKind}. */
18742
+ var EventMediaKindFootprintSchema = object({
18743
+ kind: MediaFileKindEnum,
18744
+ /** Media rows of this kind. */
18745
+ rows: number().int(),
18746
+ /** Bytes on disk held by those rows. */
18747
+ bytes: number().int()
18748
+ });
18749
+ /**
18750
+ * The media footprint broken down by KIND — the axis a deletion decision
18751
+ * actually turns on.
18752
+ *
18753
+ * A byte total says how much there is; it cannot say what is safe to remove.
18754
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18755
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18756
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18757
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18758
+ * nothing else, so sizing a deletion means summing per kind.
18759
+ *
18760
+ * ## Why `unaccounted*` exists
18761
+ *
18762
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18763
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18764
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18765
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18766
+ * retired code path, or by a version that knew a kind this one does not) would
18767
+ * otherwise vanish from the total silently, and an operator would delete
18768
+ * against a denominator smaller than the disk.
18769
+ *
18770
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18771
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18772
+ */
18773
+ var EventMediaKindBreakdownSchema = object({
18774
+ /** Every media row in scope, from one unfiltered aggregate. */
18775
+ totalRows: number().int(),
18776
+ /** Every media byte in scope, from that same aggregate. */
18777
+ totalBytes: number().int(),
18778
+ /** Per-kind footprint, ordered by bytes descending. */
18779
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18780
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18781
+ unaccountedRows: number().int(),
18782
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18783
+ unaccountedBytes: number().int()
18784
+ });
18741
18785
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18742
18786
  var EventPruneCountsSchema = object({
18743
18787
  motion: number().int(),
@@ -18941,6 +18985,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18941
18985
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18942
18986
  kind: "query",
18943
18987
  auth: "admin"
18988
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
18989
+ kind: "query",
18990
+ auth: "admin"
18944
18991
  }), method(object({
18945
18992
  olderThanMs: number(),
18946
18993
  reason: OpsLogReasonSchema.optional()
@@ -20892,6 +20939,20 @@ method(object({
20892
20939
  error: string().optional()
20893
20940
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20894
20941
  providerId: string(),
20942
+ /**
20943
+ * The location this config is an UNSAVED edit of, when there is one.
20944
+ *
20945
+ * `listLocations` replaces every declared secret with the redaction
20946
+ * sentinel, so the edit modal's form state holds the sentinel for any
20947
+ * credential the operator did not retype — and posting that here
20948
+ * without a way to resolve it makes the provider try to authenticate
20949
+ * as `__camstack_redacted__` and report the operator's own working
20950
+ * password as wrong. Given this id, the orchestrator restores each
20951
+ * sentinel from the stored config (same rule as `upsertLocation`)
20952
+ * before dispatching. Omitted by the "Add location" wizard, where
20953
+ * every value was typed just now and nothing is stored yet.
20954
+ */
20955
+ locationId: string().optional(),
20895
20956
  config: record(string(), unknown())
20896
20957
  }), object({
20897
20958
  ok: boolean(),
@@ -31606,6 +31667,12 @@ Object.freeze({
31606
31667
  addonId: null,
31607
31668
  access: "view"
31608
31669
  },
31670
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31671
+ capName: "pipeline-analytics",
31672
+ capScope: "device",
31673
+ addonId: null,
31674
+ access: "view"
31675
+ },
31609
31676
  "pipelineAnalytics.getEventStoreFootprint": {
31610
31677
  capName: "pipeline-analytics",
31611
31678
  capScope: "device",
@@ -35271,6 +35338,11 @@ Object.freeze({
35271
35338
  form: "single",
35272
35339
  optional: false
35273
35340
  }],
35341
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35342
+ name: "deviceId",
35343
+ form: "single",
35344
+ optional: true
35345
+ }],
35274
35346
  "pipelineAnalytics.getGroup": [{
35275
35347
  name: "deviceId",
35276
35348
  form: "single",
package/dist/smb.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DAxSJcnX.js");
5
+ const require_shared = require("./shared-BvqywmnV.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-hUiD7Ohg.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-Cysa81KY.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as path from "node:path";
4
4
  import * as fsp from "node:fs/promises";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DAxSJcnX.js");
5
+ const require_shared = require("./shared-BvqywmnV.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-hUiD7Ohg.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Cysa81KY.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.2.46",
3
+ "version": "1.2.47",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV, SMB) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",