@camstack/addon-provider-hikvision 1.2.37 → 1.2.38

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
@@ -15964,7 +15964,23 @@ var NcHistoryEntrySchema = object({
15964
15964
  updatedAt: number(),
15965
15965
  /** Failure detail — present on a `dead` row. */
15966
15966
  error: string().optional(),
15967
- subject: NcHistorySubjectSchema
15967
+ subject: NcHistorySubjectSchema,
15968
+ /**
15969
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15970
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15971
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15972
+ * every delivery attempt). Absent on a row still pending/dead, a row
15973
+ * delivered before this field shipped, or a wiring with no artefact index.
15974
+ *
15975
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15976
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15977
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15978
+ * also answers `null` for an id whose artefact has since expired past the
15979
+ * retained shelf's own age bound — the degrade a caller (the Home
15980
+ * Assistant export) must render as "no image right now", never as a
15981
+ * broken link.
15982
+ */
15983
+ artifactIds: array(string().min(1)).optional()
15968
15984
  });
15969
15985
  /**
15970
15986
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16191,7 +16207,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16191
16207
  }), method(object({}), object({
16192
16208
  catalog: array(NcConditionDescriptorSchema),
16193
16209
  taxonomy: NcTaxonomySchema.optional()
16194
- })), 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 }), {
16210
+ })), 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 }), {
16195
16211
  kind: "mutation",
16196
16212
  caller: "required"
16197
16213
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27448,6 +27464,39 @@ var ReadGopBytesResultSchema = object({
27448
27464
  /** Media ms the returned fragment covers. */
27449
27465
  gopDurMs: number()
27450
27466
  });
27467
+ /**
27468
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27469
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27470
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27471
+ * a replay needs several seconds of native pixels, not one frame.
27472
+ *
27473
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27474
+ * is `false` when the returned bytes were cut short by the read's own safety
27475
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27476
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27477
+ * degradation: a window whose end falls past the covering segment would need
27478
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27479
+ * not one standalone-demuxable stream — the caller's answer is to request a
27480
+ * shorter window or one aligned to a single segment, not to receive spliced
27481
+ * bytes nothing has proven decodable.
27482
+ */
27483
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27484
+ kind: literal("ok"),
27485
+ data: _instanceof(Uint8Array),
27486
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27487
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27488
+ gopStartMs: number(),
27489
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27490
+ gopDurMs: number(),
27491
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27492
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27493
+ reachesRequestedEnd: boolean()
27494
+ }), object({
27495
+ kind: literal("spans-multiple-segments"),
27496
+ /** Where the covering segment's own footage runs out — informational,
27497
+ * not a retry hint (retrying the same window would refuse again). */
27498
+ segmentEndMs: number()
27499
+ })]);
27451
27500
  method(object({
27452
27501
  deviceId: number(),
27453
27502
  fromMs: number(),
@@ -27498,6 +27547,15 @@ method(object({
27498
27547
  }), ReadGopBytesResultSchema, {
27499
27548
  kind: "query",
27500
27549
  auth: "admin"
27550
+ }), method(object({
27551
+ deviceId: number(),
27552
+ profile: string(),
27553
+ startMs: number(),
27554
+ fromMs: number(),
27555
+ toMs: number()
27556
+ }), ReadWindowBytesResultSchema, {
27557
+ kind: "query",
27558
+ auth: "admin"
27501
27559
  }), method(object({
27502
27560
  deviceId: number(),
27503
27561
  config: RecordingConfigSchema
@@ -34016,6 +34074,12 @@ Object.freeze({
34016
34074
  addonId: null,
34017
34075
  access: "view"
34018
34076
  },
34077
+ "notificationRules.resolveArtifactUrl": {
34078
+ capName: "notification-rules",
34079
+ capScope: "system",
34080
+ addonId: null,
34081
+ access: "view"
34082
+ },
34019
34083
  "notificationRules.setAlarmConfig": {
34020
34084
  capName: "notification-rules",
34021
34085
  capScope: "system",
@@ -35420,6 +35484,12 @@ Object.freeze({
35420
35484
  addonId: null,
35421
35485
  access: "view"
35422
35486
  },
35487
+ "recording.readWindowBytes": {
35488
+ capName: "recording",
35489
+ capScope: "system",
35490
+ addonId: null,
35491
+ access: "view"
35492
+ },
35423
35493
  "recording.refreshStorageLocationsForMigration": {
35424
35494
  capName: "recording",
35425
35495
  capScope: "system",
@@ -38250,6 +38320,11 @@ Object.freeze({
38250
38320
  form: "single",
38251
38321
  optional: false
38252
38322
  }],
38323
+ "recording.readWindowBytes": [{
38324
+ name: "deviceId",
38325
+ form: "single",
38326
+ optional: false
38327
+ }],
38253
38328
  "recording.relocateFootage": [{
38254
38329
  name: "deviceId",
38255
38330
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15965,7 +15965,23 @@ var NcHistoryEntrySchema = object({
15965
15965
  updatedAt: number(),
15966
15966
  /** Failure detail — present on a `dead` row. */
15967
15967
  error: string().optional(),
15968
- subject: NcHistorySubjectSchema
15968
+ subject: NcHistorySubjectSchema,
15969
+ /**
15970
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15971
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15972
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15973
+ * every delivery attempt). Absent on a row still pending/dead, a row
15974
+ * delivered before this field shipped, or a wiring with no artefact index.
15975
+ *
15976
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15977
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15978
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15979
+ * also answers `null` for an id whose artefact has since expired past the
15980
+ * retained shelf's own age bound — the degrade a caller (the Home
15981
+ * Assistant export) must render as "no image right now", never as a
15982
+ * broken link.
15983
+ */
15984
+ artifactIds: array(string().min(1)).optional()
15969
15985
  });
15970
15986
  /**
15971
15987
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16192,7 +16208,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16192
16208
  }), method(object({}), object({
16193
16209
  catalog: array(NcConditionDescriptorSchema),
16194
16210
  taxonomy: NcTaxonomySchema.optional()
16195
- })), 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 }), {
16211
+ })), 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 }), {
16196
16212
  kind: "mutation",
16197
16213
  caller: "required"
16198
16214
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27449,6 +27465,39 @@ var ReadGopBytesResultSchema = object({
27449
27465
  /** Media ms the returned fragment covers. */
27450
27466
  gopDurMs: number()
27451
27467
  });
27468
+ /**
27469
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27470
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27471
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27472
+ * a replay needs several seconds of native pixels, not one frame.
27473
+ *
27474
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27475
+ * is `false` when the returned bytes were cut short by the read's own safety
27476
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27477
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27478
+ * degradation: a window whose end falls past the covering segment would need
27479
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27480
+ * not one standalone-demuxable stream — the caller's answer is to request a
27481
+ * shorter window or one aligned to a single segment, not to receive spliced
27482
+ * bytes nothing has proven decodable.
27483
+ */
27484
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27485
+ kind: literal("ok"),
27486
+ data: _instanceof(Uint8Array),
27487
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27488
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27489
+ gopStartMs: number(),
27490
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27491
+ gopDurMs: number(),
27492
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27493
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27494
+ reachesRequestedEnd: boolean()
27495
+ }), object({
27496
+ kind: literal("spans-multiple-segments"),
27497
+ /** Where the covering segment's own footage runs out — informational,
27498
+ * not a retry hint (retrying the same window would refuse again). */
27499
+ segmentEndMs: number()
27500
+ })]);
27452
27501
  method(object({
27453
27502
  deviceId: number(),
27454
27503
  fromMs: number(),
@@ -27499,6 +27548,15 @@ method(object({
27499
27548
  }), ReadGopBytesResultSchema, {
27500
27549
  kind: "query",
27501
27550
  auth: "admin"
27551
+ }), method(object({
27552
+ deviceId: number(),
27553
+ profile: string(),
27554
+ startMs: number(),
27555
+ fromMs: number(),
27556
+ toMs: number()
27557
+ }), ReadWindowBytesResultSchema, {
27558
+ kind: "query",
27559
+ auth: "admin"
27502
27560
  }), method(object({
27503
27561
  deviceId: number(),
27504
27562
  config: RecordingConfigSchema
@@ -34017,6 +34075,12 @@ Object.freeze({
34017
34075
  addonId: null,
34018
34076
  access: "view"
34019
34077
  },
34078
+ "notificationRules.resolveArtifactUrl": {
34079
+ capName: "notification-rules",
34080
+ capScope: "system",
34081
+ addonId: null,
34082
+ access: "view"
34083
+ },
34020
34084
  "notificationRules.setAlarmConfig": {
34021
34085
  capName: "notification-rules",
34022
34086
  capScope: "system",
@@ -35421,6 +35485,12 @@ Object.freeze({
35421
35485
  addonId: null,
35422
35486
  access: "view"
35423
35487
  },
35488
+ "recording.readWindowBytes": {
35489
+ capName: "recording",
35490
+ capScope: "system",
35491
+ addonId: null,
35492
+ access: "view"
35493
+ },
35424
35494
  "recording.refreshStorageLocationsForMigration": {
35425
35495
  capName: "recording",
35426
35496
  capScope: "system",
@@ -38251,6 +38321,11 @@ Object.freeze({
38251
38321
  form: "single",
38252
38322
  optional: false
38253
38323
  }],
38324
+ "recording.readWindowBytes": [{
38325
+ name: "deviceId",
38326
+ form: "single",
38327
+ optional: false
38328
+ }],
38254
38329
  "recording.relocateFootage": [{
38255
38330
  name: "deviceId",
38256
38331
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-hikvision",
3
- "version": "1.2.37",
3
+ "version": "1.2.38",
4
4
  "description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
5
5
  "keywords": [
6
6
  "camstack",