@camstack/addon-remote-storage 1.2.101 → 1.2.102

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-SgmN8tGm.js");
5
+ const require_shared = require("./shared-b3T91scO.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-C0LzFm0z.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-DBRkf9F0.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-SgmN8tGm.js");
5
+ const require_shared = require("./shared-b3T91scO.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-C0LzFm0z.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-DBRkf9F0.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
@@ -5361,7 +5361,7 @@ var ZodIssueCode = {
5361
5361
  var ZodFirstPartyTypeKind;
5362
5362
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5363
5363
  //#endregion
5364
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5364
+ //#region ../types/dist/sleep-BDR76Ykr.mjs
5365
5365
  /**
5366
5366
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5367
5367
  * window to float samples (D455).
@@ -17819,6 +17819,48 @@ var NcAlarmConfigSchema = object({
17819
17819
  settings: NcAlarmSettingsSchema,
17820
17820
  coverage: array(NcAlarmModeCoverageSchema)
17821
17821
  });
17822
+ /**
17823
+ * ONE rule's demand on ONE camera's clip ring.
17824
+ *
17825
+ * A rule, not a camera: the broker takes the MAX over the asks that reach a
17826
+ * camera, so the answer stays a faithful description of the rules and the
17827
+ * bounding (the byte budget, the broker's own ceiling) stays where the cost
17828
+ * lives. A camera that appears in no ask is being told **nothing** — which is
17829
+ * a different thing from never having been told, and only the envelope
17830
+ * (`rulesLoaded`) can tell those apart.
17831
+ */
17832
+ var NcClipRetentionAskSchema = object({
17833
+ /**
17834
+ * The camera this ask is about. **Absent = every camera**, which is what a
17835
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
17836
+ * asking everywhere.
17837
+ */
17838
+ deviceId: number().int().nonnegative().optional(),
17839
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
17840
+ * needs nothing produces no ask at all. */
17841
+ seconds: number().min(0).max(60),
17842
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
17843
+ * assigned, which is what the cut defaults to. */
17844
+ profile: CamProfileSchema.optional(),
17845
+ /** Who is asking — so a retention the operator did not expect names a rule. */
17846
+ ruleId: string(),
17847
+ ruleName: string(),
17848
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
17849
+ reason: _enum(["window", "occupancy"])
17850
+ });
17851
+ /**
17852
+ * The whole answer, with the one bit that keeps absence from reading as zero.
17853
+ *
17854
+ * `rulesLoaded` is false until the rule ledger has completed a load at least
17855
+ * once. A centre that is up but has not read its rules yet answers with an
17856
+ * empty ask list that means nothing at all — applying it would drop every
17857
+ * camera's ring to zero for the first events after a restart, which is the
17858
+ * footage this mechanism exists to keep.
17859
+ */
17860
+ var NcClipRetentionPlanSchema = object({
17861
+ rulesLoaded: boolean(),
17862
+ asks: array(NcClipRetentionAskSchema).readonly()
17863
+ });
17822
17864
  method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), method(object({ ruleId: string() }), object({ rule: NcRuleSchema.nullable() }), { auth: "admin" }), method(object({ rule: NcRuleInputSchema }), object({ rule: NcRuleSchema }), {
17823
17865
  kind: "mutation",
17824
17866
  auth: "admin",
@@ -17839,7 +17881,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
17839
17881
  }), object({ success: literal(true) }), {
17840
17882
  kind: "mutation",
17841
17883
  auth: "admin"
17842
- }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
17884
+ }), method(object({}), NcClipRetentionPlanSchema, { auth: "admin" }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
17843
17885
  deviceId: number().int(),
17844
17886
  muted: boolean()
17845
17887
  }), object({ success: literal(true) }), {
@@ -20373,6 +20415,33 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
20373
20415
  * solid is this track", cheaper than re-deriving it from a trajectory. */
20374
20416
  framesMatched: number().int()
20375
20417
  })).readonly() });
20418
+ /**
20419
+ * The long-term series a camera produces. A closed union so a typo cannot
20420
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
20421
+ * is an alias of this, not a second list.
20422
+ */
20423
+ var AnalyticsLtsSeriesSchema = _enum([
20424
+ "motion",
20425
+ "audio-dbfs",
20426
+ "battery",
20427
+ "occupancy"
20428
+ ]);
20429
+ /**
20430
+ * One closed 5-minute bucket of a long-term series.
20431
+ *
20432
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
20433
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
20434
+ * that exists at all was measured; a bucket that is absent was not, which is a
20435
+ * different claim from zero and the reason this is a sparse series.
20436
+ */
20437
+ var LtsBucketSchema = object({
20438
+ scope: string(),
20439
+ bucketStart: number().int(),
20440
+ samples: number().int().nonnegative(),
20441
+ sum: number(),
20442
+ min: number(),
20443
+ max: number()
20444
+ });
20376
20445
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
20377
20446
  deviceId: number(),
20378
20447
  trackId: string()
@@ -20419,6 +20488,14 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20419
20488
  kinds: array(string()).optional(),
20420
20489
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
20421
20490
  }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
20491
+ deviceId: number(),
20492
+ series: AnalyticsLtsSeriesSchema,
20493
+ /** Omit for EVERY scope of this series in the range. */
20494
+ scope: string().optional(),
20495
+ from: number(),
20496
+ to: number(),
20497
+ limit: number().int().positive().optional()
20498
+ }), array(LtsBucketSchema).readonly()), method(object({
20422
20499
  deviceId: number(),
20423
20500
  since: number(),
20424
20501
  until: number(),
@@ -21037,6 +21114,14 @@ var MotionSourceEnum = _enum([
21037
21114
  */
21038
21115
  var MotionSourcesSchema = array(MotionSourceEnum);
21039
21116
  /**
21117
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21118
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21119
+ * than a second spelling of the same two ideas — the value an operator picks
21120
+ * here is the value that comes back on the track, the overlay and the debug
21121
+ * row.
21122
+ */
21123
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
21124
+ /**
21040
21125
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21041
21126
  * so cap-side consumers (the orchestrator forward, the runner addon's
21042
21127
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21187,6 +21272,35 @@ var RunnerCameraConfigSchema = object({
21187
21272
  * events; the orchestrator forwards to `reportMotion`.
21188
21273
  */
21189
21274
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21275
+ /**
21276
+ * WHICH root detector runs for this camera. The detection counterpart of
21277
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21278
+ * of sources the system understands, vendor-agnostic, owned here.
21279
+ *
21280
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21281
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21282
+ * here. Its boxes reach post-analysis on the same
21283
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21284
+ * track gets the same tracker, the same overlay and the same detail
21285
+ * subtree (face / plate / embedding).
21286
+ *
21287
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21288
+ * run, and that is where a camera with a usable onboard detector buys back
21289
+ * its share of the accelerator. It saves the root inference, not the decode
21290
+ * — the detail subtree still needs pixels to cut crops from.
21291
+ *
21292
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21293
+ * step at all (there is nothing to track), and the cap that knows this says
21294
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21295
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21296
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21297
+ * worth exactly what it already is — a wake signal with a class.
21298
+ *
21299
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21300
+ * vendor never turns a detector on for the operator, and neither does a
21301
+ * default.
21302
+ */
21303
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21190
21304
  pipelineEnabled: boolean().default(true),
21191
21305
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21192
21306
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -21368,7 +21482,47 @@ var RunnerLocalMetricsSchema = object({
21368
21482
  queueDepth: number(),
21369
21483
  frameLazy: FrameLazyMetricsSchema.optional()
21370
21484
  });
21485
+ /**
21486
+ * Pipeline Runner capability — runtime detection workhorse.
21487
+ *
21488
+ * One instance per node. Receives camera assignments from
21489
+ * `addon-pipeline-orchestrator`, subscribes to the local stream-broker for
21490
+ * decoded frames, drains motion + detection queues, calls the local
21491
+ * `motion-detection` and `pipeline-executor` capabilities, and emits typed
21492
+ * `pipeline.inference-result` and `detection.motion-analysis` events on
21493
+ * the bus.
21494
+ *
21495
+ * Distinct from `pipeline-orchestrator` (the hub-side load balancer) — the
21496
+ * runner has zero knowledge of other agents, no global state, and never
21497
+ * makes assignment decisions itself.
21498
+ */
21499
+ /**
21500
+ * Why a runner declined to look at a camera out of band. Named rather than a
21501
+ * bare `false`: a camera asleep on battery (D173), one attached elsewhere, one
21502
+ * already mid-session and one already bursting are four different facts, and a
21503
+ * caller told only "no" cannot tell a protection from a bug.
21504
+ */
21505
+ var OccupancyBurstRefusalSchema = _enum([
21506
+ "not-attached",
21507
+ "battery-asleep",
21508
+ "not-watching",
21509
+ "already-bursting"
21510
+ ]);
21371
21511
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
21512
+ deviceId: number(),
21513
+ /** How many frames to collect. The caller sizes this against what its
21514
+ * own confirmation needs; the runner clamps it to the field's range. */
21515
+ frames: number().int().positive().optional(),
21516
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
21517
+ * defend — the periodic one at least has a timer to point at. */
21518
+ reason: string()
21519
+ }), object({
21520
+ started: boolean(),
21521
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
21522
+ }), {
21523
+ auth: "admin",
21524
+ kind: "mutation"
21525
+ }), method(object({
21372
21526
  handle: FrameHandleSchema,
21373
21527
  bbox: NativeCropBboxSchema,
21374
21528
  maxWidth: number().int().positive().optional(),
@@ -26897,7 +27051,7 @@ var NativeDetectionSchema = object({
26897
27051
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
26898
27052
  confidence: number().min(0).max(1).optional()
26899
27053
  });
26900
- object({
27054
+ var NativeObjectDetectionStatusSchema = object({
26901
27055
  /**
26902
27056
  * Last observed instance per class. Missing entries mean the class
26903
27057
  * is supported but nothing has been seen since the provider started.
@@ -26914,14 +27068,56 @@ object({
26914
27068
  supportedClasses: array(NativeObjectClassEnum).readonly(),
26915
27069
  /**
26916
27070
  * Whether forwarding of onboard AI detections is enabled for this device.
26917
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
26918
- * churn the tracker, so forwarding stays off until the operator enables it.
27071
+ *
27072
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
27073
+ * camera runs — that is the operator's choice, and it is made where every
27074
+ * other detection choice is made. `geometry` on
27075
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
27076
+ * choice would buy this particular camera.
26919
27077
  */
26920
27078
  enabled: boolean()
26921
- }).extend({
27079
+ });
27080
+ /**
27081
+ * WHEN a camera's onboard detections carry geometry.
27082
+ *
27083
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
27084
+ * a detection is a trackable subject whenever the camera sees one.
27085
+ * - `while-streaming` — only while some stream of this camera is already open.
27086
+ * The boxes ride the video's own side-channel rather than a feed of their
27087
+ * own, so they cost nothing and they exist only when something is pulling.
27088
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
27089
+ * radio drain, but a camera that is awake is awake precisely because
27090
+ * something is in front of it, and its stream is already being pulled.
27091
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
27092
+ * pipeline needs geometry to make a subject, so such a push reaches the
27093
+ * tracker as motion and no further.
27094
+ *
27095
+ * Reported and not inferred, because the operator's question in front of the
27096
+ * picker is "what do I get", and these are three different answers (D14: the
27097
+ * derived form is only as honest as `getOptions`).
27098
+ */
27099
+ var NativeObjectGeometryEnum = _enum([
27100
+ "boxed",
27101
+ "while-streaming",
27102
+ "flag-only"
27103
+ ]);
27104
+ var NativeObjectDetectionOptionsSchema = object({
27105
+ /** Classes this firmware can detect — the same list the status reports. */
27106
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
27107
+ /** What a detection from this camera carries. */
27108
+ geometry: NativeObjectGeometryEnum
27109
+ });
27110
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
27111
+ NativeObjectDetectionStatusSchema.extend({
26922
27112
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
26923
27113
  lastFetchedAt: number() });
26924
- DeviceType.Camera, method(object({
27114
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
27115
+ deviceId: number(),
27116
+ settings: NativeObjectDetectionSettingsPatchSchema
27117
+ }), _void(), {
27118
+ kind: "mutation",
27119
+ auth: "admin"
27120
+ }), method(object({
26925
27121
  deviceId: number(),
26926
27122
  enabled: boolean()
26927
27123
  }), _void(), {
@@ -30720,7 +30916,28 @@ var PerScopeBreakdownSchema = object({
30720
30916
  /** Total tracked objects in this scope (frame / zone / unzoned). */
30721
30917
  totalObjects: number().int().nonnegative(),
30722
30918
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
30723
- byClass: record(string(), number().int().nonnegative())
30919
+ byClass: record(string(), number().int().nonnegative()),
30920
+ /**
30921
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
30922
+ * present but not going anywhere (a parked car, a bin, a statue).
30923
+ *
30924
+ * The operator's question about a scene has two halves and they answer
30925
+ * different things: "what is parked here" is stable for hours and must not
30926
+ * flap, while "who is walking through" is the thing an alert is about. One
30927
+ * number could only serve one of them, and `totalObjects` served the first
30928
+ * badly — a passer-by moved it and every occupancy rule saw a change.
30929
+ *
30930
+ * `standing + transient === totalObjects`, always. The total keeps its old
30931
+ * meaning exactly, so no rule written against it changes behaviour.
30932
+ *
30933
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
30934
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
30935
+ * parked objects here" about a camera whose lot is full.
30936
+ */
30937
+ standingObjects: number().int().nonnegative().optional(),
30938
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
30939
+ * same absence rule. */
30940
+ transientObjects: number().int().nonnegative().optional()
30724
30941
  });
30725
30942
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
30726
30943
  zoneId: string(),
@@ -33659,12 +33876,24 @@ Object.freeze({
33659
33876
  addonId: null,
33660
33877
  access: "create"
33661
33878
  },
33879
+ "nativeObjectDetection.getOptions": {
33880
+ capName: "native-object-detection",
33881
+ capScope: "device",
33882
+ addonId: null,
33883
+ access: "view"
33884
+ },
33662
33885
  "nativeObjectDetection.setEnabled": {
33663
33886
  capName: "native-object-detection",
33664
33887
  capScope: "device",
33665
33888
  addonId: null,
33666
33889
  access: "create"
33667
33890
  },
33891
+ "nativeObjectDetection.setSettings": {
33892
+ capName: "native-object-detection",
33893
+ capScope: "device",
33894
+ addonId: null,
33895
+ access: "create"
33896
+ },
33668
33897
  "navigation.getFeatures": {
33669
33898
  capName: "navigation",
33670
33899
  capScope: "device",
@@ -33929,6 +34158,12 @@ Object.freeze({
33929
34158
  addonId: null,
33930
34159
  access: "view"
33931
34160
  },
34161
+ "notificationRules.getClipRetentionAsks": {
34162
+ capName: "notification-rules",
34163
+ capScope: "system",
34164
+ addonId: null,
34165
+ access: "view"
34166
+ },
33932
34167
  "notificationRules.getConditionCatalog": {
33933
34168
  capName: "notification-rules",
33934
34169
  capScope: "system",
@@ -34439,6 +34674,12 @@ Object.freeze({
34439
34674
  addonId: null,
34440
34675
  access: "create"
34441
34676
  },
34677
+ "pipelineAnalytics.readLongTermSeries": {
34678
+ capName: "pipeline-analytics",
34679
+ capScope: "device",
34680
+ addonId: null,
34681
+ access: "view"
34682
+ },
34442
34683
  "pipelineAnalytics.rebuildObjectEmbeddings": {
34443
34684
  capName: "pipeline-analytics",
34444
34685
  capScope: "device",
@@ -35111,6 +35352,12 @@ Object.freeze({
35111
35352
  addonId: null,
35112
35353
  access: "create"
35113
35354
  },
35355
+ "pipelineRunner.requestOccupancyBurst": {
35356
+ capName: "pipeline-runner",
35357
+ capScope: "system",
35358
+ addonId: null,
35359
+ access: "create"
35360
+ },
35114
35361
  "pipelineRunner.runDetailSubtree": {
35115
35362
  capName: "pipeline-runner",
35116
35363
  capScope: "system",
@@ -37891,11 +38138,21 @@ Object.freeze({
37891
38138
  form: "single",
37892
38139
  optional: false
37893
38140
  }],
38141
+ "nativeObjectDetection.getOptions": [{
38142
+ name: "deviceId",
38143
+ form: "single",
38144
+ optional: false
38145
+ }],
37894
38146
  "nativeObjectDetection.setEnabled": [{
37895
38147
  name: "deviceId",
37896
38148
  form: "single",
37897
38149
  optional: false
37898
38150
  }],
38151
+ "nativeObjectDetection.setSettings": [{
38152
+ name: "deviceId",
38153
+ form: "single",
38154
+ optional: false
38155
+ }],
37899
38156
  "navigation.getFeatures": [{
37900
38157
  name: "deviceId",
37901
38158
  form: "single",
@@ -38245,6 +38502,11 @@ Object.freeze({
38245
38502
  form: "single",
38246
38503
  optional: false
38247
38504
  }],
38505
+ "pipelineAnalytics.readLongTermSeries": [{
38506
+ name: "deviceId",
38507
+ form: "single",
38508
+ optional: false
38509
+ }],
38248
38510
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
38249
38511
  name: "deviceId",
38250
38512
  form: "single",
@@ -38435,6 +38697,11 @@ Object.freeze({
38435
38697
  form: "single",
38436
38698
  optional: false
38437
38699
  }],
38700
+ "pipelineRunner.requestOccupancyBurst": [{
38701
+ name: "deviceId",
38702
+ form: "single",
38703
+ optional: false
38704
+ }],
38438
38705
  "pipelineRunner.runDetailSubtree": [{
38439
38706
  name: "deviceId",
38440
38707
  form: "single",
@@ -5384,7 +5384,7 @@ var ZodIssueCode = {
5384
5384
  var ZodFirstPartyTypeKind;
5385
5385
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5386
5386
  //#endregion
5387
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5387
+ //#region ../types/dist/sleep-BDR76Ykr.mjs
5388
5388
  /**
5389
5389
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5390
5390
  * window to float samples (D455).
@@ -17842,6 +17842,48 @@ var NcAlarmConfigSchema = object({
17842
17842
  settings: NcAlarmSettingsSchema,
17843
17843
  coverage: array(NcAlarmModeCoverageSchema)
17844
17844
  });
17845
+ /**
17846
+ * ONE rule's demand on ONE camera's clip ring.
17847
+ *
17848
+ * A rule, not a camera: the broker takes the MAX over the asks that reach a
17849
+ * camera, so the answer stays a faithful description of the rules and the
17850
+ * bounding (the byte budget, the broker's own ceiling) stays where the cost
17851
+ * lives. A camera that appears in no ask is being told **nothing** — which is
17852
+ * a different thing from never having been told, and only the envelope
17853
+ * (`rulesLoaded`) can tell those apart.
17854
+ */
17855
+ var NcClipRetentionAskSchema = object({
17856
+ /**
17857
+ * The camera this ask is about. **Absent = every camera**, which is what a
17858
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
17859
+ * asking everywhere.
17860
+ */
17861
+ deviceId: number().int().nonnegative().optional(),
17862
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
17863
+ * needs nothing produces no ask at all. */
17864
+ seconds: number().min(0).max(60),
17865
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
17866
+ * assigned, which is what the cut defaults to. */
17867
+ profile: CamProfileSchema.optional(),
17868
+ /** Who is asking — so a retention the operator did not expect names a rule. */
17869
+ ruleId: string(),
17870
+ ruleName: string(),
17871
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
17872
+ reason: _enum(["window", "occupancy"])
17873
+ });
17874
+ /**
17875
+ * The whole answer, with the one bit that keeps absence from reading as zero.
17876
+ *
17877
+ * `rulesLoaded` is false until the rule ledger has completed a load at least
17878
+ * once. A centre that is up but has not read its rules yet answers with an
17879
+ * empty ask list that means nothing at all — applying it would drop every
17880
+ * camera's ring to zero for the first events after a restart, which is the
17881
+ * footage this mechanism exists to keep.
17882
+ */
17883
+ var NcClipRetentionPlanSchema = object({
17884
+ rulesLoaded: boolean(),
17885
+ asks: array(NcClipRetentionAskSchema).readonly()
17886
+ });
17845
17887
  method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), method(object({ ruleId: string() }), object({ rule: NcRuleSchema.nullable() }), { auth: "admin" }), method(object({ rule: NcRuleInputSchema }), object({ rule: NcRuleSchema }), {
17846
17888
  kind: "mutation",
17847
17889
  auth: "admin",
@@ -17862,7 +17904,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
17862
17904
  }), object({ success: literal(true) }), {
17863
17905
  kind: "mutation",
17864
17906
  auth: "admin"
17865
- }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
17907
+ }), method(object({}), NcClipRetentionPlanSchema, { auth: "admin" }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
17866
17908
  deviceId: number().int(),
17867
17909
  muted: boolean()
17868
17910
  }), object({ success: literal(true) }), {
@@ -20396,6 +20438,33 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
20396
20438
  * solid is this track", cheaper than re-deriving it from a trajectory. */
20397
20439
  framesMatched: number().int()
20398
20440
  })).readonly() });
20441
+ /**
20442
+ * The long-term series a camera produces. A closed union so a typo cannot
20443
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
20444
+ * is an alias of this, not a second list.
20445
+ */
20446
+ var AnalyticsLtsSeriesSchema = _enum([
20447
+ "motion",
20448
+ "audio-dbfs",
20449
+ "battery",
20450
+ "occupancy"
20451
+ ]);
20452
+ /**
20453
+ * One closed 5-minute bucket of a long-term series.
20454
+ *
20455
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
20456
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
20457
+ * that exists at all was measured; a bucket that is absent was not, which is a
20458
+ * different claim from zero and the reason this is a sparse series.
20459
+ */
20460
+ var LtsBucketSchema = object({
20461
+ scope: string(),
20462
+ bucketStart: number().int(),
20463
+ samples: number().int().nonnegative(),
20464
+ sum: number(),
20465
+ min: number(),
20466
+ max: number()
20467
+ });
20399
20468
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
20400
20469
  deviceId: number(),
20401
20470
  trackId: string()
@@ -20442,6 +20511,14 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20442
20511
  kinds: array(string()).optional(),
20443
20512
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
20444
20513
  }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
20514
+ deviceId: number(),
20515
+ series: AnalyticsLtsSeriesSchema,
20516
+ /** Omit for EVERY scope of this series in the range. */
20517
+ scope: string().optional(),
20518
+ from: number(),
20519
+ to: number(),
20520
+ limit: number().int().positive().optional()
20521
+ }), array(LtsBucketSchema).readonly()), method(object({
20445
20522
  deviceId: number(),
20446
20523
  since: number(),
20447
20524
  until: number(),
@@ -21060,6 +21137,14 @@ var MotionSourceEnum = _enum([
21060
21137
  */
21061
21138
  var MotionSourcesSchema = array(MotionSourceEnum);
21062
21139
  /**
21140
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21141
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21142
+ * than a second spelling of the same two ideas — the value an operator picks
21143
+ * here is the value that comes back on the track, the overlay and the debug
21144
+ * row.
21145
+ */
21146
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
21147
+ /**
21063
21148
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21064
21149
  * so cap-side consumers (the orchestrator forward, the runner addon's
21065
21150
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21210,6 +21295,35 @@ var RunnerCameraConfigSchema = object({
21210
21295
  * events; the orchestrator forwards to `reportMotion`.
21211
21296
  */
21212
21297
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21298
+ /**
21299
+ * WHICH root detector runs for this camera. The detection counterpart of
21300
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21301
+ * of sources the system understands, vendor-agnostic, owned here.
21302
+ *
21303
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21304
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21305
+ * here. Its boxes reach post-analysis on the same
21306
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21307
+ * track gets the same tracker, the same overlay and the same detail
21308
+ * subtree (face / plate / embedding).
21309
+ *
21310
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21311
+ * run, and that is where a camera with a usable onboard detector buys back
21312
+ * its share of the accelerator. It saves the root inference, not the decode
21313
+ * — the detail subtree still needs pixels to cut crops from.
21314
+ *
21315
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21316
+ * step at all (there is nothing to track), and the cap that knows this says
21317
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21318
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21319
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21320
+ * worth exactly what it already is — a wake signal with a class.
21321
+ *
21322
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21323
+ * vendor never turns a detector on for the operator, and neither does a
21324
+ * default.
21325
+ */
21326
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21213
21327
  pipelineEnabled: boolean().default(true),
21214
21328
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21215
21329
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -21391,7 +21505,47 @@ var RunnerLocalMetricsSchema = object({
21391
21505
  queueDepth: number(),
21392
21506
  frameLazy: FrameLazyMetricsSchema.optional()
21393
21507
  });
21508
+ /**
21509
+ * Pipeline Runner capability — runtime detection workhorse.
21510
+ *
21511
+ * One instance per node. Receives camera assignments from
21512
+ * `addon-pipeline-orchestrator`, subscribes to the local stream-broker for
21513
+ * decoded frames, drains motion + detection queues, calls the local
21514
+ * `motion-detection` and `pipeline-executor` capabilities, and emits typed
21515
+ * `pipeline.inference-result` and `detection.motion-analysis` events on
21516
+ * the bus.
21517
+ *
21518
+ * Distinct from `pipeline-orchestrator` (the hub-side load balancer) — the
21519
+ * runner has zero knowledge of other agents, no global state, and never
21520
+ * makes assignment decisions itself.
21521
+ */
21522
+ /**
21523
+ * Why a runner declined to look at a camera out of band. Named rather than a
21524
+ * bare `false`: a camera asleep on battery (D173), one attached elsewhere, one
21525
+ * already mid-session and one already bursting are four different facts, and a
21526
+ * caller told only "no" cannot tell a protection from a bug.
21527
+ */
21528
+ var OccupancyBurstRefusalSchema = _enum([
21529
+ "not-attached",
21530
+ "battery-asleep",
21531
+ "not-watching",
21532
+ "already-bursting"
21533
+ ]);
21394
21534
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
21535
+ deviceId: number(),
21536
+ /** How many frames to collect. The caller sizes this against what its
21537
+ * own confirmation needs; the runner clamps it to the field's range. */
21538
+ frames: number().int().positive().optional(),
21539
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
21540
+ * defend — the periodic one at least has a timer to point at. */
21541
+ reason: string()
21542
+ }), object({
21543
+ started: boolean(),
21544
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
21545
+ }), {
21546
+ auth: "admin",
21547
+ kind: "mutation"
21548
+ }), method(object({
21395
21549
  handle: FrameHandleSchema,
21396
21550
  bbox: NativeCropBboxSchema,
21397
21551
  maxWidth: number().int().positive().optional(),
@@ -26920,7 +27074,7 @@ var NativeDetectionSchema = object({
26920
27074
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
26921
27075
  confidence: number().min(0).max(1).optional()
26922
27076
  });
26923
- object({
27077
+ var NativeObjectDetectionStatusSchema = object({
26924
27078
  /**
26925
27079
  * Last observed instance per class. Missing entries mean the class
26926
27080
  * is supported but nothing has been seen since the provider started.
@@ -26937,14 +27091,56 @@ object({
26937
27091
  supportedClasses: array(NativeObjectClassEnum).readonly(),
26938
27092
  /**
26939
27093
  * Whether forwarding of onboard AI detections is enabled for this device.
26940
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
26941
- * churn the tracker, so forwarding stays off until the operator enables it.
27094
+ *
27095
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
27096
+ * camera runs — that is the operator's choice, and it is made where every
27097
+ * other detection choice is made. `geometry` on
27098
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
27099
+ * choice would buy this particular camera.
26942
27100
  */
26943
27101
  enabled: boolean()
26944
- }).extend({
27102
+ });
27103
+ /**
27104
+ * WHEN a camera's onboard detections carry geometry.
27105
+ *
27106
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
27107
+ * a detection is a trackable subject whenever the camera sees one.
27108
+ * - `while-streaming` — only while some stream of this camera is already open.
27109
+ * The boxes ride the video's own side-channel rather than a feed of their
27110
+ * own, so they cost nothing and they exist only when something is pulling.
27111
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
27112
+ * radio drain, but a camera that is awake is awake precisely because
27113
+ * something is in front of it, and its stream is already being pulled.
27114
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
27115
+ * pipeline needs geometry to make a subject, so such a push reaches the
27116
+ * tracker as motion and no further.
27117
+ *
27118
+ * Reported and not inferred, because the operator's question in front of the
27119
+ * picker is "what do I get", and these are three different answers (D14: the
27120
+ * derived form is only as honest as `getOptions`).
27121
+ */
27122
+ var NativeObjectGeometryEnum = _enum([
27123
+ "boxed",
27124
+ "while-streaming",
27125
+ "flag-only"
27126
+ ]);
27127
+ var NativeObjectDetectionOptionsSchema = object({
27128
+ /** Classes this firmware can detect — the same list the status reports. */
27129
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
27130
+ /** What a detection from this camera carries. */
27131
+ geometry: NativeObjectGeometryEnum
27132
+ });
27133
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
27134
+ NativeObjectDetectionStatusSchema.extend({
26945
27135
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
26946
27136
  lastFetchedAt: number() });
26947
- DeviceType.Camera, method(object({
27137
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
27138
+ deviceId: number(),
27139
+ settings: NativeObjectDetectionSettingsPatchSchema
27140
+ }), _void(), {
27141
+ kind: "mutation",
27142
+ auth: "admin"
27143
+ }), method(object({
26948
27144
  deviceId: number(),
26949
27145
  enabled: boolean()
26950
27146
  }), _void(), {
@@ -30743,7 +30939,28 @@ var PerScopeBreakdownSchema = object({
30743
30939
  /** Total tracked objects in this scope (frame / zone / unzoned). */
30744
30940
  totalObjects: number().int().nonnegative(),
30745
30941
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
30746
- byClass: record(string(), number().int().nonnegative())
30942
+ byClass: record(string(), number().int().nonnegative()),
30943
+ /**
30944
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
30945
+ * present but not going anywhere (a parked car, a bin, a statue).
30946
+ *
30947
+ * The operator's question about a scene has two halves and they answer
30948
+ * different things: "what is parked here" is stable for hours and must not
30949
+ * flap, while "who is walking through" is the thing an alert is about. One
30950
+ * number could only serve one of them, and `totalObjects` served the first
30951
+ * badly — a passer-by moved it and every occupancy rule saw a change.
30952
+ *
30953
+ * `standing + transient === totalObjects`, always. The total keeps its old
30954
+ * meaning exactly, so no rule written against it changes behaviour.
30955
+ *
30956
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
30957
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
30958
+ * parked objects here" about a camera whose lot is full.
30959
+ */
30960
+ standingObjects: number().int().nonnegative().optional(),
30961
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
30962
+ * same absence rule. */
30963
+ transientObjects: number().int().nonnegative().optional()
30747
30964
  });
30748
30965
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
30749
30966
  zoneId: string(),
@@ -33682,12 +33899,24 @@ Object.freeze({
33682
33899
  addonId: null,
33683
33900
  access: "create"
33684
33901
  },
33902
+ "nativeObjectDetection.getOptions": {
33903
+ capName: "native-object-detection",
33904
+ capScope: "device",
33905
+ addonId: null,
33906
+ access: "view"
33907
+ },
33685
33908
  "nativeObjectDetection.setEnabled": {
33686
33909
  capName: "native-object-detection",
33687
33910
  capScope: "device",
33688
33911
  addonId: null,
33689
33912
  access: "create"
33690
33913
  },
33914
+ "nativeObjectDetection.setSettings": {
33915
+ capName: "native-object-detection",
33916
+ capScope: "device",
33917
+ addonId: null,
33918
+ access: "create"
33919
+ },
33691
33920
  "navigation.getFeatures": {
33692
33921
  capName: "navigation",
33693
33922
  capScope: "device",
@@ -33952,6 +34181,12 @@ Object.freeze({
33952
34181
  addonId: null,
33953
34182
  access: "view"
33954
34183
  },
34184
+ "notificationRules.getClipRetentionAsks": {
34185
+ capName: "notification-rules",
34186
+ capScope: "system",
34187
+ addonId: null,
34188
+ access: "view"
34189
+ },
33955
34190
  "notificationRules.getConditionCatalog": {
33956
34191
  capName: "notification-rules",
33957
34192
  capScope: "system",
@@ -34462,6 +34697,12 @@ Object.freeze({
34462
34697
  addonId: null,
34463
34698
  access: "create"
34464
34699
  },
34700
+ "pipelineAnalytics.readLongTermSeries": {
34701
+ capName: "pipeline-analytics",
34702
+ capScope: "device",
34703
+ addonId: null,
34704
+ access: "view"
34705
+ },
34465
34706
  "pipelineAnalytics.rebuildObjectEmbeddings": {
34466
34707
  capName: "pipeline-analytics",
34467
34708
  capScope: "device",
@@ -35134,6 +35375,12 @@ Object.freeze({
35134
35375
  addonId: null,
35135
35376
  access: "create"
35136
35377
  },
35378
+ "pipelineRunner.requestOccupancyBurst": {
35379
+ capName: "pipeline-runner",
35380
+ capScope: "system",
35381
+ addonId: null,
35382
+ access: "create"
35383
+ },
35137
35384
  "pipelineRunner.runDetailSubtree": {
35138
35385
  capName: "pipeline-runner",
35139
35386
  capScope: "system",
@@ -37914,11 +38161,21 @@ Object.freeze({
37914
38161
  form: "single",
37915
38162
  optional: false
37916
38163
  }],
38164
+ "nativeObjectDetection.getOptions": [{
38165
+ name: "deviceId",
38166
+ form: "single",
38167
+ optional: false
38168
+ }],
37917
38169
  "nativeObjectDetection.setEnabled": [{
37918
38170
  name: "deviceId",
37919
38171
  form: "single",
37920
38172
  optional: false
37921
38173
  }],
38174
+ "nativeObjectDetection.setSettings": [{
38175
+ name: "deviceId",
38176
+ form: "single",
38177
+ optional: false
38178
+ }],
37922
38179
  "navigation.getFeatures": [{
37923
38180
  name: "deviceId",
37924
38181
  form: "single",
@@ -38268,6 +38525,11 @@ Object.freeze({
38268
38525
  form: "single",
38269
38526
  optional: false
38270
38527
  }],
38528
+ "pipelineAnalytics.readLongTermSeries": [{
38529
+ name: "deviceId",
38530
+ form: "single",
38531
+ optional: false
38532
+ }],
38271
38533
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
38272
38534
  name: "deviceId",
38273
38535
  form: "single",
@@ -38458,6 +38720,11 @@ Object.freeze({
38458
38720
  form: "single",
38459
38721
  optional: false
38460
38722
  }],
38723
+ "pipelineRunner.requestOccupancyBurst": [{
38724
+ name: "deviceId",
38725
+ form: "single",
38726
+ optional: false
38727
+ }],
38461
38728
  "pipelineRunner.runDetailSubtree": [{
38462
38729
  name: "deviceId",
38463
38730
  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-SgmN8tGm.js");
5
+ const require_shared = require("./shared-b3T91scO.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-C0LzFm0z.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-DBRkf9F0.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-SgmN8tGm.js");
5
+ const require_shared = require("./shared-b3T91scO.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-C0LzFm0z.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-DBRkf9F0.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.101",
3
+ "version": "1.2.102",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV, SMB) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",