@camstack/addon-remote-storage 1.2.29 → 1.2.30

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-DNv3D9pu.js");
5
+ const require_shared = require("./shared-CjXJLI0c.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-bMDvPUOr.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-C7DW_fGa.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-DNv3D9pu.js");
5
+ const require_shared = require("./shared-CjXJLI0c.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-bMDvPUOr.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-C7DW_fGa.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
@@ -15465,7 +15465,23 @@ var NcHistoryEntrySchema = object({
15465
15465
  updatedAt: number(),
15466
15466
  /** Failure detail — present on a `dead` row. */
15467
15467
  error: string().optional(),
15468
- subject: NcHistorySubjectSchema
15468
+ subject: NcHistorySubjectSchema,
15469
+ /**
15470
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15471
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15472
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15473
+ * every delivery attempt). Absent on a row still pending/dead, a row
15474
+ * delivered before this field shipped, or a wiring with no artefact index.
15475
+ *
15476
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15477
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15478
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15479
+ * also answers `null` for an id whose artefact has since expired past the
15480
+ * retained shelf's own age bound — the degrade a caller (the Home
15481
+ * Assistant export) must render as "no image right now", never as a
15482
+ * broken link.
15483
+ */
15484
+ artifactIds: array(string().min(1)).optional()
15469
15485
  });
15470
15486
  /**
15471
15487
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15692,7 +15708,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15692
15708
  }), method(object({}), object({
15693
15709
  catalog: array(NcConditionDescriptorSchema),
15694
15710
  taxonomy: NcTaxonomySchema.optional()
15695
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15711
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15696
15712
  kind: "mutation",
15697
15713
  caller: "required"
15698
15714
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25044,6 +25060,39 @@ var ReadGopBytesResultSchema = object({
25044
25060
  /** Media ms the returned fragment covers. */
25045
25061
  gopDurMs: number()
25046
25062
  });
25063
+ /**
25064
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25065
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25066
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25067
+ * a replay needs several seconds of native pixels, not one frame.
25068
+ *
25069
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25070
+ * is `false` when the returned bytes were cut short by the read's own safety
25071
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25072
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25073
+ * degradation: a window whose end falls past the covering segment would need
25074
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25075
+ * not one standalone-demuxable stream — the caller's answer is to request a
25076
+ * shorter window or one aligned to a single segment, not to receive spliced
25077
+ * bytes nothing has proven decodable.
25078
+ */
25079
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25080
+ kind: literal("ok"),
25081
+ data: _instanceof(Uint8Array),
25082
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25083
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25084
+ gopStartMs: number(),
25085
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25086
+ gopDurMs: number(),
25087
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25088
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25089
+ reachesRequestedEnd: boolean()
25090
+ }), object({
25091
+ kind: literal("spans-multiple-segments"),
25092
+ /** Where the covering segment's own footage runs out — informational,
25093
+ * not a retry hint (retrying the same window would refuse again). */
25094
+ segmentEndMs: number()
25095
+ })]);
25047
25096
  method(object({
25048
25097
  deviceId: number(),
25049
25098
  fromMs: number(),
@@ -25094,6 +25143,15 @@ method(object({
25094
25143
  }), ReadGopBytesResultSchema, {
25095
25144
  kind: "query",
25096
25145
  auth: "admin"
25146
+ }), method(object({
25147
+ deviceId: number(),
25148
+ profile: string(),
25149
+ startMs: number(),
25150
+ fromMs: number(),
25151
+ toMs: number()
25152
+ }), ReadWindowBytesResultSchema, {
25153
+ kind: "query",
25154
+ auth: "admin"
25097
25155
  }), method(object({
25098
25156
  deviceId: number(),
25099
25157
  config: RecordingConfigSchema
@@ -29512,6 +29570,12 @@ Object.freeze({
29512
29570
  addonId: null,
29513
29571
  access: "view"
29514
29572
  },
29573
+ "notificationRules.resolveArtifactUrl": {
29574
+ capName: "notification-rules",
29575
+ capScope: "system",
29576
+ addonId: null,
29577
+ access: "view"
29578
+ },
29515
29579
  "notificationRules.setAlarmConfig": {
29516
29580
  capName: "notification-rules",
29517
29581
  capScope: "system",
@@ -30916,6 +30980,12 @@ Object.freeze({
30916
30980
  addonId: null,
30917
30981
  access: "view"
30918
30982
  },
30983
+ "recording.readWindowBytes": {
30984
+ capName: "recording",
30985
+ capScope: "system",
30986
+ addonId: null,
30987
+ access: "view"
30988
+ },
30919
30989
  "recording.refreshStorageLocationsForMigration": {
30920
30990
  capName: "recording",
30921
30991
  capScope: "system",
@@ -33746,6 +33816,11 @@ Object.freeze({
33746
33816
  form: "single",
33747
33817
  optional: false
33748
33818
  }],
33819
+ "recording.readWindowBytes": [{
33820
+ name: "deviceId",
33821
+ form: "single",
33822
+ optional: false
33823
+ }],
33749
33824
  "recording.relocateFootage": [{
33750
33825
  name: "deviceId",
33751
33826
  form: "single",
@@ -15488,7 +15488,23 @@ var NcHistoryEntrySchema = object({
15488
15488
  updatedAt: number(),
15489
15489
  /** Failure detail — present on a `dead` row. */
15490
15490
  error: string().optional(),
15491
- subject: NcHistorySubjectSchema
15491
+ subject: NcHistorySubjectSchema,
15492
+ /**
15493
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15494
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15495
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15496
+ * every delivery attempt). Absent on a row still pending/dead, a row
15497
+ * delivered before this field shipped, or a wiring with no artefact index.
15498
+ *
15499
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15500
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15501
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15502
+ * also answers `null` for an id whose artefact has since expired past the
15503
+ * retained shelf's own age bound — the degrade a caller (the Home
15504
+ * Assistant export) must render as "no image right now", never as a
15505
+ * broken link.
15506
+ */
15507
+ artifactIds: array(string().min(1)).optional()
15492
15508
  });
15493
15509
  /**
15494
15510
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15715,7 +15731,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15715
15731
  }), method(object({}), object({
15716
15732
  catalog: array(NcConditionDescriptorSchema),
15717
15733
  taxonomy: NcTaxonomySchema.optional()
15718
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15734
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15719
15735
  kind: "mutation",
15720
15736
  caller: "required"
15721
15737
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25067,6 +25083,39 @@ var ReadGopBytesResultSchema = object({
25067
25083
  /** Media ms the returned fragment covers. */
25068
25084
  gopDurMs: number()
25069
25085
  });
25086
+ /**
25087
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25088
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25089
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25090
+ * a replay needs several seconds of native pixels, not one frame.
25091
+ *
25092
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25093
+ * is `false` when the returned bytes were cut short by the read's own safety
25094
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25095
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25096
+ * degradation: a window whose end falls past the covering segment would need
25097
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25098
+ * not one standalone-demuxable stream — the caller's answer is to request a
25099
+ * shorter window or one aligned to a single segment, not to receive spliced
25100
+ * bytes nothing has proven decodable.
25101
+ */
25102
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25103
+ kind: literal("ok"),
25104
+ data: _instanceof(Uint8Array),
25105
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25106
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25107
+ gopStartMs: number(),
25108
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25109
+ gopDurMs: number(),
25110
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25111
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25112
+ reachesRequestedEnd: boolean()
25113
+ }), object({
25114
+ kind: literal("spans-multiple-segments"),
25115
+ /** Where the covering segment's own footage runs out — informational,
25116
+ * not a retry hint (retrying the same window would refuse again). */
25117
+ segmentEndMs: number()
25118
+ })]);
25070
25119
  method(object({
25071
25120
  deviceId: number(),
25072
25121
  fromMs: number(),
@@ -25117,6 +25166,15 @@ method(object({
25117
25166
  }), ReadGopBytesResultSchema, {
25118
25167
  kind: "query",
25119
25168
  auth: "admin"
25169
+ }), method(object({
25170
+ deviceId: number(),
25171
+ profile: string(),
25172
+ startMs: number(),
25173
+ fromMs: number(),
25174
+ toMs: number()
25175
+ }), ReadWindowBytesResultSchema, {
25176
+ kind: "query",
25177
+ auth: "admin"
25120
25178
  }), method(object({
25121
25179
  deviceId: number(),
25122
25180
  config: RecordingConfigSchema
@@ -29535,6 +29593,12 @@ Object.freeze({
29535
29593
  addonId: null,
29536
29594
  access: "view"
29537
29595
  },
29596
+ "notificationRules.resolveArtifactUrl": {
29597
+ capName: "notification-rules",
29598
+ capScope: "system",
29599
+ addonId: null,
29600
+ access: "view"
29601
+ },
29538
29602
  "notificationRules.setAlarmConfig": {
29539
29603
  capName: "notification-rules",
29540
29604
  capScope: "system",
@@ -30939,6 +31003,12 @@ Object.freeze({
30939
31003
  addonId: null,
30940
31004
  access: "view"
30941
31005
  },
31006
+ "recording.readWindowBytes": {
31007
+ capName: "recording",
31008
+ capScope: "system",
31009
+ addonId: null,
31010
+ access: "view"
31011
+ },
30942
31012
  "recording.refreshStorageLocationsForMigration": {
30943
31013
  capName: "recording",
30944
31014
  capScope: "system",
@@ -33769,6 +33839,11 @@ Object.freeze({
33769
33839
  form: "single",
33770
33840
  optional: false
33771
33841
  }],
33842
+ "recording.readWindowBytes": [{
33843
+ name: "deviceId",
33844
+ form: "single",
33845
+ optional: false
33846
+ }],
33772
33847
  "recording.relocateFootage": [{
33773
33848
  name: "deviceId",
33774
33849
  form: "single",
@@ -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-DNv3D9pu.js");
5
+ const require_shared = require("./shared-CjXJLI0c.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-bMDvPUOr.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-C7DW_fGa.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.29",
3
+ "version": "1.2.30",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",