@camstack/addon-provider-homematic 1.2.31 → 1.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
@@ -15857,7 +15857,23 @@ var NcHistoryEntrySchema = object({
15857
15857
  updatedAt: number(),
15858
15858
  /** Failure detail — present on a `dead` row. */
15859
15859
  error: string().optional(),
15860
- subject: NcHistorySubjectSchema
15860
+ subject: NcHistorySubjectSchema,
15861
+ /**
15862
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15863
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15864
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15865
+ * every delivery attempt). Absent on a row still pending/dead, a row
15866
+ * delivered before this field shipped, or a wiring with no artefact index.
15867
+ *
15868
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15869
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15870
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15871
+ * also answers `null` for an id whose artefact has since expired past the
15872
+ * retained shelf's own age bound — the degrade a caller (the Home
15873
+ * Assistant export) must render as "no image right now", never as a
15874
+ * broken link.
15875
+ */
15876
+ artifactIds: array(string().min(1)).optional()
15861
15877
  });
15862
15878
  /**
15863
15879
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16084,7 +16100,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16084
16100
  }), method(object({}), object({
16085
16101
  catalog: array(NcConditionDescriptorSchema),
16086
16102
  taxonomy: NcTaxonomySchema.optional()
16087
- })), 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 }), {
16103
+ })), 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 }), {
16088
16104
  kind: "mutation",
16089
16105
  caller: "required"
16090
16106
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27104,6 +27120,39 @@ var ReadGopBytesResultSchema = object({
27104
27120
  /** Media ms the returned fragment covers. */
27105
27121
  gopDurMs: number()
27106
27122
  });
27123
+ /**
27124
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27125
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27126
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27127
+ * a replay needs several seconds of native pixels, not one frame.
27128
+ *
27129
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27130
+ * is `false` when the returned bytes were cut short by the read's own safety
27131
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27132
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27133
+ * degradation: a window whose end falls past the covering segment would need
27134
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27135
+ * not one standalone-demuxable stream — the caller's answer is to request a
27136
+ * shorter window or one aligned to a single segment, not to receive spliced
27137
+ * bytes nothing has proven decodable.
27138
+ */
27139
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27140
+ kind: literal("ok"),
27141
+ data: _instanceof(Uint8Array),
27142
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27143
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27144
+ gopStartMs: number(),
27145
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27146
+ gopDurMs: number(),
27147
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27148
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27149
+ reachesRequestedEnd: boolean()
27150
+ }), object({
27151
+ kind: literal("spans-multiple-segments"),
27152
+ /** Where the covering segment's own footage runs out — informational,
27153
+ * not a retry hint (retrying the same window would refuse again). */
27154
+ segmentEndMs: number()
27155
+ })]);
27107
27156
  method(object({
27108
27157
  deviceId: number(),
27109
27158
  fromMs: number(),
@@ -27154,6 +27203,15 @@ method(object({
27154
27203
  }), ReadGopBytesResultSchema, {
27155
27204
  kind: "query",
27156
27205
  auth: "admin"
27206
+ }), method(object({
27207
+ deviceId: number(),
27208
+ profile: string(),
27209
+ startMs: number(),
27210
+ fromMs: number(),
27211
+ toMs: number()
27212
+ }), ReadWindowBytesResultSchema, {
27213
+ kind: "query",
27214
+ auth: "admin"
27157
27215
  }), method(object({
27158
27216
  deviceId: number(),
27159
27217
  config: RecordingConfigSchema
@@ -33241,6 +33299,12 @@ Object.freeze({
33241
33299
  addonId: null,
33242
33300
  access: "view"
33243
33301
  },
33302
+ "notificationRules.resolveArtifactUrl": {
33303
+ capName: "notification-rules",
33304
+ capScope: "system",
33305
+ addonId: null,
33306
+ access: "view"
33307
+ },
33244
33308
  "notificationRules.setAlarmConfig": {
33245
33309
  capName: "notification-rules",
33246
33310
  capScope: "system",
@@ -34645,6 +34709,12 @@ Object.freeze({
34645
34709
  addonId: null,
34646
34710
  access: "view"
34647
34711
  },
34712
+ "recording.readWindowBytes": {
34713
+ capName: "recording",
34714
+ capScope: "system",
34715
+ addonId: null,
34716
+ access: "view"
34717
+ },
34648
34718
  "recording.refreshStorageLocationsForMigration": {
34649
34719
  capName: "recording",
34650
34720
  capScope: "system",
@@ -37475,6 +37545,11 @@ Object.freeze({
37475
37545
  form: "single",
37476
37546
  optional: false
37477
37547
  }],
37548
+ "recording.readWindowBytes": [{
37549
+ name: "deviceId",
37550
+ form: "single",
37551
+ optional: false
37552
+ }],
37478
37553
  "recording.relocateFootage": [{
37479
37554
  name: "deviceId",
37480
37555
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15858,7 +15858,23 @@ var NcHistoryEntrySchema = object({
15858
15858
  updatedAt: number(),
15859
15859
  /** Failure detail — present on a `dead` row. */
15860
15860
  error: string().optional(),
15861
- subject: NcHistorySubjectSchema
15861
+ subject: NcHistorySubjectSchema,
15862
+ /**
15863
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15864
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15865
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15866
+ * every delivery attempt). Absent on a row still pending/dead, a row
15867
+ * delivered before this field shipped, or a wiring with no artefact index.
15868
+ *
15869
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15870
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15871
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15872
+ * also answers `null` for an id whose artefact has since expired past the
15873
+ * retained shelf's own age bound — the degrade a caller (the Home
15874
+ * Assistant export) must render as "no image right now", never as a
15875
+ * broken link.
15876
+ */
15877
+ artifactIds: array(string().min(1)).optional()
15862
15878
  });
15863
15879
  /**
15864
15880
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16085,7 +16101,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16085
16101
  }), method(object({}), object({
16086
16102
  catalog: array(NcConditionDescriptorSchema),
16087
16103
  taxonomy: NcTaxonomySchema.optional()
16088
- })), 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 }), {
16104
+ })), 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 }), {
16089
16105
  kind: "mutation",
16090
16106
  caller: "required"
16091
16107
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27105,6 +27121,39 @@ var ReadGopBytesResultSchema = object({
27105
27121
  /** Media ms the returned fragment covers. */
27106
27122
  gopDurMs: number()
27107
27123
  });
27124
+ /**
27125
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27126
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27127
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27128
+ * a replay needs several seconds of native pixels, not one frame.
27129
+ *
27130
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27131
+ * is `false` when the returned bytes were cut short by the read's own safety
27132
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27133
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27134
+ * degradation: a window whose end falls past the covering segment would need
27135
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27136
+ * not one standalone-demuxable stream — the caller's answer is to request a
27137
+ * shorter window or one aligned to a single segment, not to receive spliced
27138
+ * bytes nothing has proven decodable.
27139
+ */
27140
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27141
+ kind: literal("ok"),
27142
+ data: _instanceof(Uint8Array),
27143
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27144
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27145
+ gopStartMs: number(),
27146
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27147
+ gopDurMs: number(),
27148
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27149
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27150
+ reachesRequestedEnd: boolean()
27151
+ }), object({
27152
+ kind: literal("spans-multiple-segments"),
27153
+ /** Where the covering segment's own footage runs out — informational,
27154
+ * not a retry hint (retrying the same window would refuse again). */
27155
+ segmentEndMs: number()
27156
+ })]);
27108
27157
  method(object({
27109
27158
  deviceId: number(),
27110
27159
  fromMs: number(),
@@ -27155,6 +27204,15 @@ method(object({
27155
27204
  }), ReadGopBytesResultSchema, {
27156
27205
  kind: "query",
27157
27206
  auth: "admin"
27207
+ }), method(object({
27208
+ deviceId: number(),
27209
+ profile: string(),
27210
+ startMs: number(),
27211
+ fromMs: number(),
27212
+ toMs: number()
27213
+ }), ReadWindowBytesResultSchema, {
27214
+ kind: "query",
27215
+ auth: "admin"
27158
27216
  }), method(object({
27159
27217
  deviceId: number(),
27160
27218
  config: RecordingConfigSchema
@@ -33242,6 +33300,12 @@ Object.freeze({
33242
33300
  addonId: null,
33243
33301
  access: "view"
33244
33302
  },
33303
+ "notificationRules.resolveArtifactUrl": {
33304
+ capName: "notification-rules",
33305
+ capScope: "system",
33306
+ addonId: null,
33307
+ access: "view"
33308
+ },
33245
33309
  "notificationRules.setAlarmConfig": {
33246
33310
  capName: "notification-rules",
33247
33311
  capScope: "system",
@@ -34646,6 +34710,12 @@ Object.freeze({
34646
34710
  addonId: null,
34647
34711
  access: "view"
34648
34712
  },
34713
+ "recording.readWindowBytes": {
34714
+ capName: "recording",
34715
+ capScope: "system",
34716
+ addonId: null,
34717
+ access: "view"
34718
+ },
34649
34719
  "recording.refreshStorageLocationsForMigration": {
34650
34720
  capName: "recording",
34651
34721
  capScope: "system",
@@ -37476,6 +37546,11 @@ Object.freeze({
37476
37546
  form: "single",
37477
37547
  optional: false
37478
37548
  }],
37549
+ "recording.readWindowBytes": [{
37550
+ name: "deviceId",
37551
+ form: "single",
37552
+ optional: false
37553
+ }],
37479
37554
  "recording.relocateFootage": [{
37480
37555
  name: "deviceId",
37481
37556
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.31",
3
+ "version": "1.2.32",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",