@camstack/addon-provider-amcrest 0.2.31 → 0.2.32

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
@@ -15775,7 +15775,23 @@ var NcHistoryEntrySchema = object({
15775
15775
  updatedAt: number(),
15776
15776
  /** Failure detail — present on a `dead` row. */
15777
15777
  error: string().optional(),
15778
- subject: NcHistorySubjectSchema
15778
+ subject: NcHistorySubjectSchema,
15779
+ /**
15780
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15781
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15782
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15783
+ * every delivery attempt). Absent on a row still pending/dead, a row
15784
+ * delivered before this field shipped, or a wiring with no artefact index.
15785
+ *
15786
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15787
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15788
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15789
+ * also answers `null` for an id whose artefact has since expired past the
15790
+ * retained shelf's own age bound — the degrade a caller (the Home
15791
+ * Assistant export) must render as "no image right now", never as a
15792
+ * broken link.
15793
+ */
15794
+ artifactIds: array(string().min(1)).optional()
15779
15795
  });
15780
15796
  /**
15781
15797
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16002,7 +16018,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16002
16018
  }), method(object({}), object({
16003
16019
  catalog: array(NcConditionDescriptorSchema),
16004
16020
  taxonomy: NcTaxonomySchema.optional()
16005
- })), 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 }), {
16021
+ })), 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 }), {
16006
16022
  kind: "mutation",
16007
16023
  caller: "required"
16008
16024
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27214,6 +27230,39 @@ var ReadGopBytesResultSchema = object({
27214
27230
  /** Media ms the returned fragment covers. */
27215
27231
  gopDurMs: number()
27216
27232
  });
27233
+ /**
27234
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27235
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27236
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27237
+ * a replay needs several seconds of native pixels, not one frame.
27238
+ *
27239
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27240
+ * is `false` when the returned bytes were cut short by the read's own safety
27241
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27242
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27243
+ * degradation: a window whose end falls past the covering segment would need
27244
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27245
+ * not one standalone-demuxable stream — the caller's answer is to request a
27246
+ * shorter window or one aligned to a single segment, not to receive spliced
27247
+ * bytes nothing has proven decodable.
27248
+ */
27249
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27250
+ kind: literal("ok"),
27251
+ data: _instanceof(Uint8Array),
27252
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27253
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27254
+ gopStartMs: number(),
27255
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27256
+ gopDurMs: number(),
27257
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27258
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27259
+ reachesRequestedEnd: boolean()
27260
+ }), object({
27261
+ kind: literal("spans-multiple-segments"),
27262
+ /** Where the covering segment's own footage runs out — informational,
27263
+ * not a retry hint (retrying the same window would refuse again). */
27264
+ segmentEndMs: number()
27265
+ })]);
27217
27266
  method(object({
27218
27267
  deviceId: number(),
27219
27268
  fromMs: number(),
@@ -27264,6 +27313,15 @@ method(object({
27264
27313
  }), ReadGopBytesResultSchema, {
27265
27314
  kind: "query",
27266
27315
  auth: "admin"
27316
+ }), method(object({
27317
+ deviceId: number(),
27318
+ profile: string(),
27319
+ startMs: number(),
27320
+ fromMs: number(),
27321
+ toMs: number()
27322
+ }), ReadWindowBytesResultSchema, {
27323
+ kind: "query",
27324
+ auth: "admin"
27267
27325
  }), method(object({
27268
27326
  deviceId: number(),
27269
27327
  config: RecordingConfigSchema
@@ -33755,6 +33813,12 @@ Object.freeze({
33755
33813
  addonId: null,
33756
33814
  access: "view"
33757
33815
  },
33816
+ "notificationRules.resolveArtifactUrl": {
33817
+ capName: "notification-rules",
33818
+ capScope: "system",
33819
+ addonId: null,
33820
+ access: "view"
33821
+ },
33758
33822
  "notificationRules.setAlarmConfig": {
33759
33823
  capName: "notification-rules",
33760
33824
  capScope: "system",
@@ -35159,6 +35223,12 @@ Object.freeze({
35159
35223
  addonId: null,
35160
35224
  access: "view"
35161
35225
  },
35226
+ "recording.readWindowBytes": {
35227
+ capName: "recording",
35228
+ capScope: "system",
35229
+ addonId: null,
35230
+ access: "view"
35231
+ },
35162
35232
  "recording.refreshStorageLocationsForMigration": {
35163
35233
  capName: "recording",
35164
35234
  capScope: "system",
@@ -37989,6 +38059,11 @@ Object.freeze({
37989
38059
  form: "single",
37990
38060
  optional: false
37991
38061
  }],
38062
+ "recording.readWindowBytes": [{
38063
+ name: "deviceId",
38064
+ form: "single",
38065
+ optional: false
38066
+ }],
37992
38067
  "recording.relocateFootage": [{
37993
38068
  name: "deviceId",
37994
38069
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15776,7 +15776,23 @@ var NcHistoryEntrySchema = object({
15776
15776
  updatedAt: number(),
15777
15777
  /** Failure detail — present on a `dead` row. */
15778
15778
  error: string().optional(),
15779
- subject: NcHistorySubjectSchema
15779
+ subject: NcHistorySubjectSchema,
15780
+ /**
15781
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15782
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15783
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15784
+ * every delivery attempt). Absent on a row still pending/dead, a row
15785
+ * delivered before this field shipped, or a wiring with no artefact index.
15786
+ *
15787
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15788
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15789
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15790
+ * also answers `null` for an id whose artefact has since expired past the
15791
+ * retained shelf's own age bound — the degrade a caller (the Home
15792
+ * Assistant export) must render as "no image right now", never as a
15793
+ * broken link.
15794
+ */
15795
+ artifactIds: array(string().min(1)).optional()
15780
15796
  });
15781
15797
  /**
15782
15798
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16003,7 +16019,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16003
16019
  }), method(object({}), object({
16004
16020
  catalog: array(NcConditionDescriptorSchema),
16005
16021
  taxonomy: NcTaxonomySchema.optional()
16006
- })), 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 }), {
16022
+ })), 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 }), {
16007
16023
  kind: "mutation",
16008
16024
  caller: "required"
16009
16025
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27215,6 +27231,39 @@ var ReadGopBytesResultSchema = object({
27215
27231
  /** Media ms the returned fragment covers. */
27216
27232
  gopDurMs: number()
27217
27233
  });
27234
+ /**
27235
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27236
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27237
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27238
+ * a replay needs several seconds of native pixels, not one frame.
27239
+ *
27240
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27241
+ * is `false` when the returned bytes were cut short by the read's own safety
27242
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27243
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27244
+ * degradation: a window whose end falls past the covering segment would need
27245
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27246
+ * not one standalone-demuxable stream — the caller's answer is to request a
27247
+ * shorter window or one aligned to a single segment, not to receive spliced
27248
+ * bytes nothing has proven decodable.
27249
+ */
27250
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27251
+ kind: literal("ok"),
27252
+ data: _instanceof(Uint8Array),
27253
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27254
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27255
+ gopStartMs: number(),
27256
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27257
+ gopDurMs: number(),
27258
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27259
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27260
+ reachesRequestedEnd: boolean()
27261
+ }), object({
27262
+ kind: literal("spans-multiple-segments"),
27263
+ /** Where the covering segment's own footage runs out — informational,
27264
+ * not a retry hint (retrying the same window would refuse again). */
27265
+ segmentEndMs: number()
27266
+ })]);
27218
27267
  method(object({
27219
27268
  deviceId: number(),
27220
27269
  fromMs: number(),
@@ -27265,6 +27314,15 @@ method(object({
27265
27314
  }), ReadGopBytesResultSchema, {
27266
27315
  kind: "query",
27267
27316
  auth: "admin"
27317
+ }), method(object({
27318
+ deviceId: number(),
27319
+ profile: string(),
27320
+ startMs: number(),
27321
+ fromMs: number(),
27322
+ toMs: number()
27323
+ }), ReadWindowBytesResultSchema, {
27324
+ kind: "query",
27325
+ auth: "admin"
27268
27326
  }), method(object({
27269
27327
  deviceId: number(),
27270
27328
  config: RecordingConfigSchema
@@ -33756,6 +33814,12 @@ Object.freeze({
33756
33814
  addonId: null,
33757
33815
  access: "view"
33758
33816
  },
33817
+ "notificationRules.resolveArtifactUrl": {
33818
+ capName: "notification-rules",
33819
+ capScope: "system",
33820
+ addonId: null,
33821
+ access: "view"
33822
+ },
33759
33823
  "notificationRules.setAlarmConfig": {
33760
33824
  capName: "notification-rules",
33761
33825
  capScope: "system",
@@ -35160,6 +35224,12 @@ Object.freeze({
35160
35224
  addonId: null,
35161
35225
  access: "view"
35162
35226
  },
35227
+ "recording.readWindowBytes": {
35228
+ capName: "recording",
35229
+ capScope: "system",
35230
+ addonId: null,
35231
+ access: "view"
35232
+ },
35163
35233
  "recording.refreshStorageLocationsForMigration": {
35164
35234
  capName: "recording",
35165
35235
  capScope: "system",
@@ -37990,6 +38060,11 @@ Object.freeze({
37990
38060
  form: "single",
37991
38061
  optional: false
37992
38062
  }],
38063
+ "recording.readWindowBytes": [{
38064
+ name: "deviceId",
38065
+ form: "single",
38066
+ optional: false
38067
+ }],
37993
38068
  "recording.relocateFootage": [{
37994
38069
  name: "deviceId",
37995
38070
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.31",
3
+ "version": "0.2.32",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",