@camstack/addon-provider-velux 0.2.30 → 0.2.31

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
@@ -15782,7 +15782,23 @@ var NcHistoryEntrySchema = object({
15782
15782
  updatedAt: number(),
15783
15783
  /** Failure detail — present on a `dead` row. */
15784
15784
  error: string().optional(),
15785
- subject: NcHistorySubjectSchema
15785
+ subject: NcHistorySubjectSchema,
15786
+ /**
15787
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15788
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15789
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15790
+ * every delivery attempt). Absent on a row still pending/dead, a row
15791
+ * delivered before this field shipped, or a wiring with no artefact index.
15792
+ *
15793
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15794
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15795
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15796
+ * also answers `null` for an id whose artefact has since expired past the
15797
+ * retained shelf's own age bound — the degrade a caller (the Home
15798
+ * Assistant export) must render as "no image right now", never as a
15799
+ * broken link.
15800
+ */
15801
+ artifactIds: array(string().min(1)).optional()
15786
15802
  });
15787
15803
  /**
15788
15804
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16009,7 +16025,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16009
16025
  }), method(object({}), object({
16010
16026
  catalog: array(NcConditionDescriptorSchema),
16011
16027
  taxonomy: NcTaxonomySchema.optional()
16012
- })), 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 }), {
16028
+ })), 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 }), {
16013
16029
  kind: "mutation",
16014
16030
  caller: "required"
16015
16031
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27029,6 +27045,39 @@ var ReadGopBytesResultSchema = object({
27029
27045
  /** Media ms the returned fragment covers. */
27030
27046
  gopDurMs: number()
27031
27047
  });
27048
+ /**
27049
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27050
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27051
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27052
+ * a replay needs several seconds of native pixels, not one frame.
27053
+ *
27054
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27055
+ * is `false` when the returned bytes were cut short by the read's own safety
27056
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27057
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27058
+ * degradation: a window whose end falls past the covering segment would need
27059
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27060
+ * not one standalone-demuxable stream — the caller's answer is to request a
27061
+ * shorter window or one aligned to a single segment, not to receive spliced
27062
+ * bytes nothing has proven decodable.
27063
+ */
27064
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27065
+ kind: literal("ok"),
27066
+ data: _instanceof(Uint8Array),
27067
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27068
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27069
+ gopStartMs: number(),
27070
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27071
+ gopDurMs: number(),
27072
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27073
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27074
+ reachesRequestedEnd: boolean()
27075
+ }), object({
27076
+ kind: literal("spans-multiple-segments"),
27077
+ /** Where the covering segment's own footage runs out — informational,
27078
+ * not a retry hint (retrying the same window would refuse again). */
27079
+ segmentEndMs: number()
27080
+ })]);
27032
27081
  method(object({
27033
27082
  deviceId: number(),
27034
27083
  fromMs: number(),
@@ -27079,6 +27128,15 @@ method(object({
27079
27128
  }), ReadGopBytesResultSchema, {
27080
27129
  kind: "query",
27081
27130
  auth: "admin"
27131
+ }), method(object({
27132
+ deviceId: number(),
27133
+ profile: string(),
27134
+ startMs: number(),
27135
+ fromMs: number(),
27136
+ toMs: number()
27137
+ }), ReadWindowBytesResultSchema, {
27138
+ kind: "query",
27139
+ auth: "admin"
27082
27140
  }), method(object({
27083
27141
  deviceId: number(),
27084
27142
  config: RecordingConfigSchema
@@ -33166,6 +33224,12 @@ Object.freeze({
33166
33224
  addonId: null,
33167
33225
  access: "view"
33168
33226
  },
33227
+ "notificationRules.resolveArtifactUrl": {
33228
+ capName: "notification-rules",
33229
+ capScope: "system",
33230
+ addonId: null,
33231
+ access: "view"
33232
+ },
33169
33233
  "notificationRules.setAlarmConfig": {
33170
33234
  capName: "notification-rules",
33171
33235
  capScope: "system",
@@ -34570,6 +34634,12 @@ Object.freeze({
34570
34634
  addonId: null,
34571
34635
  access: "view"
34572
34636
  },
34637
+ "recording.readWindowBytes": {
34638
+ capName: "recording",
34639
+ capScope: "system",
34640
+ addonId: null,
34641
+ access: "view"
34642
+ },
34573
34643
  "recording.refreshStorageLocationsForMigration": {
34574
34644
  capName: "recording",
34575
34645
  capScope: "system",
@@ -37400,6 +37470,11 @@ Object.freeze({
37400
37470
  form: "single",
37401
37471
  optional: false
37402
37472
  }],
37473
+ "recording.readWindowBytes": [{
37474
+ name: "deviceId",
37475
+ form: "single",
37476
+ optional: false
37477
+ }],
37403
37478
  "recording.relocateFootage": [{
37404
37479
  name: "deviceId",
37405
37480
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15781,7 +15781,23 @@ var NcHistoryEntrySchema = object({
15781
15781
  updatedAt: number(),
15782
15782
  /** Failure detail — present on a `dead` row. */
15783
15783
  error: string().optional(),
15784
- subject: NcHistorySubjectSchema
15784
+ subject: NcHistorySubjectSchema,
15785
+ /**
15786
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15787
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15788
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15789
+ * every delivery attempt). Absent on a row still pending/dead, a row
15790
+ * delivered before this field shipped, or a wiring with no artefact index.
15791
+ *
15792
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15793
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15794
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15795
+ * also answers `null` for an id whose artefact has since expired past the
15796
+ * retained shelf's own age bound — the degrade a caller (the Home
15797
+ * Assistant export) must render as "no image right now", never as a
15798
+ * broken link.
15799
+ */
15800
+ artifactIds: array(string().min(1)).optional()
15785
15801
  });
15786
15802
  /**
15787
15803
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16008,7 +16024,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16008
16024
  }), method(object({}), object({
16009
16025
  catalog: array(NcConditionDescriptorSchema),
16010
16026
  taxonomy: NcTaxonomySchema.optional()
16011
- })), 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 }), {
16027
+ })), 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 }), {
16012
16028
  kind: "mutation",
16013
16029
  caller: "required"
16014
16030
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27028,6 +27044,39 @@ var ReadGopBytesResultSchema = object({
27028
27044
  /** Media ms the returned fragment covers. */
27029
27045
  gopDurMs: number()
27030
27046
  });
27047
+ /**
27048
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27049
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27050
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27051
+ * a replay needs several seconds of native pixels, not one frame.
27052
+ *
27053
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27054
+ * is `false` when the returned bytes were cut short by the read's own safety
27055
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27056
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27057
+ * degradation: a window whose end falls past the covering segment would need
27058
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27059
+ * not one standalone-demuxable stream — the caller's answer is to request a
27060
+ * shorter window or one aligned to a single segment, not to receive spliced
27061
+ * bytes nothing has proven decodable.
27062
+ */
27063
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27064
+ kind: literal("ok"),
27065
+ data: _instanceof(Uint8Array),
27066
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27067
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27068
+ gopStartMs: number(),
27069
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27070
+ gopDurMs: number(),
27071
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27072
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27073
+ reachesRequestedEnd: boolean()
27074
+ }), object({
27075
+ kind: literal("spans-multiple-segments"),
27076
+ /** Where the covering segment's own footage runs out — informational,
27077
+ * not a retry hint (retrying the same window would refuse again). */
27078
+ segmentEndMs: number()
27079
+ })]);
27031
27080
  method(object({
27032
27081
  deviceId: number(),
27033
27082
  fromMs: number(),
@@ -27078,6 +27127,15 @@ method(object({
27078
27127
  }), ReadGopBytesResultSchema, {
27079
27128
  kind: "query",
27080
27129
  auth: "admin"
27130
+ }), method(object({
27131
+ deviceId: number(),
27132
+ profile: string(),
27133
+ startMs: number(),
27134
+ fromMs: number(),
27135
+ toMs: number()
27136
+ }), ReadWindowBytesResultSchema, {
27137
+ kind: "query",
27138
+ auth: "admin"
27081
27139
  }), method(object({
27082
27140
  deviceId: number(),
27083
27141
  config: RecordingConfigSchema
@@ -33165,6 +33223,12 @@ Object.freeze({
33165
33223
  addonId: null,
33166
33224
  access: "view"
33167
33225
  },
33226
+ "notificationRules.resolveArtifactUrl": {
33227
+ capName: "notification-rules",
33228
+ capScope: "system",
33229
+ addonId: null,
33230
+ access: "view"
33231
+ },
33168
33232
  "notificationRules.setAlarmConfig": {
33169
33233
  capName: "notification-rules",
33170
33234
  capScope: "system",
@@ -34569,6 +34633,12 @@ Object.freeze({
34569
34633
  addonId: null,
34570
34634
  access: "view"
34571
34635
  },
34636
+ "recording.readWindowBytes": {
34637
+ capName: "recording",
34638
+ capScope: "system",
34639
+ addonId: null,
34640
+ access: "view"
34641
+ },
34572
34642
  "recording.refreshStorageLocationsForMigration": {
34573
34643
  capName: "recording",
34574
34644
  capScope: "system",
@@ -37399,6 +37469,11 @@ Object.freeze({
37399
37469
  form: "single",
37400
37470
  optional: false
37401
37471
  }],
37472
+ "recording.readWindowBytes": [{
37473
+ name: "deviceId",
37474
+ form: "single",
37475
+ optional: false
37476
+ }],
37402
37477
  "recording.relocateFootage": [{
37403
37478
  name: "deviceId",
37404
37479
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-velux",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
4
4
  "description": "Velux KLF-200 device-provider addon for CamStack — local-gateway window + shutter covers (positional, no tilt)",
5
5
  "keywords": [
6
6
  "camstack",