@camstack/addon-provider-reolink 1.2.52 → 1.2.53

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
@@ -16008,7 +16008,23 @@ var NcHistoryEntrySchema = object({
16008
16008
  updatedAt: number(),
16009
16009
  /** Failure detail — present on a `dead` row. */
16010
16010
  error: string().optional(),
16011
- subject: NcHistorySubjectSchema
16011
+ subject: NcHistorySubjectSchema,
16012
+ /**
16013
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16014
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16015
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16016
+ * every delivery attempt). Absent on a row still pending/dead, a row
16017
+ * delivered before this field shipped, or a wiring with no artefact index.
16018
+ *
16019
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16020
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16021
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16022
+ * also answers `null` for an id whose artefact has since expired past the
16023
+ * retained shelf's own age bound — the degrade a caller (the Home
16024
+ * Assistant export) must render as "no image right now", never as a
16025
+ * broken link.
16026
+ */
16027
+ artifactIds: array(string().min(1)).optional()
16012
16028
  });
16013
16029
  /**
16014
16030
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16235,7 +16251,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16235
16251
  }), method(object({}), object({
16236
16252
  catalog: array(NcConditionDescriptorSchema),
16237
16253
  taxonomy: NcTaxonomySchema.optional()
16238
- })), 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 }), {
16254
+ })), 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 }), {
16239
16255
  kind: "mutation",
16240
16256
  caller: "required"
16241
16257
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27446,6 +27462,39 @@ var ReadGopBytesResultSchema = object({
27446
27462
  /** Media ms the returned fragment covers. */
27447
27463
  gopDurMs: number()
27448
27464
  });
27465
+ /**
27466
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27467
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27468
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27469
+ * a replay needs several seconds of native pixels, not one frame.
27470
+ *
27471
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27472
+ * is `false` when the returned bytes were cut short by the read's own safety
27473
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27474
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27475
+ * degradation: a window whose end falls past the covering segment would need
27476
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27477
+ * not one standalone-demuxable stream — the caller's answer is to request a
27478
+ * shorter window or one aligned to a single segment, not to receive spliced
27479
+ * bytes nothing has proven decodable.
27480
+ */
27481
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27482
+ kind: literal("ok"),
27483
+ data: _instanceof(Uint8Array),
27484
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27485
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27486
+ gopStartMs: number(),
27487
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27488
+ gopDurMs: number(),
27489
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27490
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27491
+ reachesRequestedEnd: boolean()
27492
+ }), object({
27493
+ kind: literal("spans-multiple-segments"),
27494
+ /** Where the covering segment's own footage runs out — informational,
27495
+ * not a retry hint (retrying the same window would refuse again). */
27496
+ segmentEndMs: number()
27497
+ })]);
27449
27498
  method(object({
27450
27499
  deviceId: number(),
27451
27500
  fromMs: number(),
@@ -27496,6 +27545,15 @@ method(object({
27496
27545
  }), ReadGopBytesResultSchema, {
27497
27546
  kind: "query",
27498
27547
  auth: "admin"
27548
+ }), method(object({
27549
+ deviceId: number(),
27550
+ profile: string(),
27551
+ startMs: number(),
27552
+ fromMs: number(),
27553
+ toMs: number()
27554
+ }), ReadWindowBytesResultSchema, {
27555
+ kind: "query",
27556
+ auth: "admin"
27499
27557
  }), method(object({
27500
27558
  deviceId: number(),
27501
27559
  config: RecordingConfigSchema
@@ -33948,6 +34006,12 @@ Object.freeze({
33948
34006
  addonId: null,
33949
34007
  access: "view"
33950
34008
  },
34009
+ "notificationRules.resolveArtifactUrl": {
34010
+ capName: "notification-rules",
34011
+ capScope: "system",
34012
+ addonId: null,
34013
+ access: "view"
34014
+ },
33951
34015
  "notificationRules.setAlarmConfig": {
33952
34016
  capName: "notification-rules",
33953
34017
  capScope: "system",
@@ -35352,6 +35416,12 @@ Object.freeze({
35352
35416
  addonId: null,
35353
35417
  access: "view"
35354
35418
  },
35419
+ "recording.readWindowBytes": {
35420
+ capName: "recording",
35421
+ capScope: "system",
35422
+ addonId: null,
35423
+ access: "view"
35424
+ },
35355
35425
  "recording.refreshStorageLocationsForMigration": {
35356
35426
  capName: "recording",
35357
35427
  capScope: "system",
@@ -38182,6 +38252,11 @@ Object.freeze({
38182
38252
  form: "single",
38183
38253
  optional: false
38184
38254
  }],
38255
+ "recording.readWindowBytes": [{
38256
+ name: "deviceId",
38257
+ form: "single",
38258
+ optional: false
38259
+ }],
38185
38260
  "recording.relocateFootage": [{
38186
38261
  name: "deviceId",
38187
38262
  form: "single",
package/dist/addon.mjs CHANGED
@@ -16003,7 +16003,23 @@ var NcHistoryEntrySchema = object({
16003
16003
  updatedAt: number(),
16004
16004
  /** Failure detail — present on a `dead` row. */
16005
16005
  error: string().optional(),
16006
- subject: NcHistorySubjectSchema
16006
+ subject: NcHistorySubjectSchema,
16007
+ /**
16008
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16009
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16010
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16011
+ * every delivery attempt). Absent on a row still pending/dead, a row
16012
+ * delivered before this field shipped, or a wiring with no artefact index.
16013
+ *
16014
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16015
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16016
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16017
+ * also answers `null` for an id whose artefact has since expired past the
16018
+ * retained shelf's own age bound — the degrade a caller (the Home
16019
+ * Assistant export) must render as "no image right now", never as a
16020
+ * broken link.
16021
+ */
16022
+ artifactIds: array(string().min(1)).optional()
16007
16023
  });
16008
16024
  /**
16009
16025
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16230,7 +16246,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16230
16246
  }), method(object({}), object({
16231
16247
  catalog: array(NcConditionDescriptorSchema),
16232
16248
  taxonomy: NcTaxonomySchema.optional()
16233
- })), 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 }), {
16249
+ })), 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 }), {
16234
16250
  kind: "mutation",
16235
16251
  caller: "required"
16236
16252
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27441,6 +27457,39 @@ var ReadGopBytesResultSchema = object({
27441
27457
  /** Media ms the returned fragment covers. */
27442
27458
  gopDurMs: number()
27443
27459
  });
27460
+ /**
27461
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27462
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27463
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27464
+ * a replay needs several seconds of native pixels, not one frame.
27465
+ *
27466
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27467
+ * is `false` when the returned bytes were cut short by the read's own safety
27468
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27469
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27470
+ * degradation: a window whose end falls past the covering segment would need
27471
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27472
+ * not one standalone-demuxable stream — the caller's answer is to request a
27473
+ * shorter window or one aligned to a single segment, not to receive spliced
27474
+ * bytes nothing has proven decodable.
27475
+ */
27476
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27477
+ kind: literal("ok"),
27478
+ data: _instanceof(Uint8Array),
27479
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27480
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27481
+ gopStartMs: number(),
27482
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27483
+ gopDurMs: number(),
27484
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27485
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27486
+ reachesRequestedEnd: boolean()
27487
+ }), object({
27488
+ kind: literal("spans-multiple-segments"),
27489
+ /** Where the covering segment's own footage runs out — informational,
27490
+ * not a retry hint (retrying the same window would refuse again). */
27491
+ segmentEndMs: number()
27492
+ })]);
27444
27493
  method(object({
27445
27494
  deviceId: number(),
27446
27495
  fromMs: number(),
@@ -27491,6 +27540,15 @@ method(object({
27491
27540
  }), ReadGopBytesResultSchema, {
27492
27541
  kind: "query",
27493
27542
  auth: "admin"
27543
+ }), method(object({
27544
+ deviceId: number(),
27545
+ profile: string(),
27546
+ startMs: number(),
27547
+ fromMs: number(),
27548
+ toMs: number()
27549
+ }), ReadWindowBytesResultSchema, {
27550
+ kind: "query",
27551
+ auth: "admin"
27494
27552
  }), method(object({
27495
27553
  deviceId: number(),
27496
27554
  config: RecordingConfigSchema
@@ -33943,6 +34001,12 @@ Object.freeze({
33943
34001
  addonId: null,
33944
34002
  access: "view"
33945
34003
  },
34004
+ "notificationRules.resolveArtifactUrl": {
34005
+ capName: "notification-rules",
34006
+ capScope: "system",
34007
+ addonId: null,
34008
+ access: "view"
34009
+ },
33946
34010
  "notificationRules.setAlarmConfig": {
33947
34011
  capName: "notification-rules",
33948
34012
  capScope: "system",
@@ -35347,6 +35411,12 @@ Object.freeze({
35347
35411
  addonId: null,
35348
35412
  access: "view"
35349
35413
  },
35414
+ "recording.readWindowBytes": {
35415
+ capName: "recording",
35416
+ capScope: "system",
35417
+ addonId: null,
35418
+ access: "view"
35419
+ },
35350
35420
  "recording.refreshStorageLocationsForMigration": {
35351
35421
  capName: "recording",
35352
35422
  capScope: "system",
@@ -38177,6 +38247,11 @@ Object.freeze({
38177
38247
  form: "single",
38178
38248
  optional: false
38179
38249
  }],
38250
+ "recording.readWindowBytes": [{
38251
+ name: "deviceId",
38252
+ form: "single",
38253
+ optional: false
38254
+ }],
38180
38255
  "recording.relocateFootage": [{
38181
38256
  name: "deviceId",
38182
38257
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.52",
3
+ "version": "1.2.53",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",