@camstack/addon-provider-dreo 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
@@ -15835,7 +15835,23 @@ var NcHistoryEntrySchema = object({
15835
15835
  updatedAt: number(),
15836
15836
  /** Failure detail — present on a `dead` row. */
15837
15837
  error: string().optional(),
15838
- subject: NcHistorySubjectSchema
15838
+ subject: NcHistorySubjectSchema,
15839
+ /**
15840
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15841
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15842
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15843
+ * every delivery attempt). Absent on a row still pending/dead, a row
15844
+ * delivered before this field shipped, or a wiring with no artefact index.
15845
+ *
15846
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15847
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15848
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15849
+ * also answers `null` for an id whose artefact has since expired past the
15850
+ * retained shelf's own age bound — the degrade a caller (the Home
15851
+ * Assistant export) must render as "no image right now", never as a
15852
+ * broken link.
15853
+ */
15854
+ artifactIds: array(string().min(1)).optional()
15839
15855
  });
15840
15856
  /**
15841
15857
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16062,7 +16078,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16062
16078
  }), method(object({}), object({
16063
16079
  catalog: array(NcConditionDescriptorSchema),
16064
16080
  taxonomy: NcTaxonomySchema.optional()
16065
- })), 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 }), {
16081
+ })), 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 }), {
16066
16082
  kind: "mutation",
16067
16083
  caller: "required"
16068
16084
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27090,6 +27106,39 @@ var ReadGopBytesResultSchema = object({
27090
27106
  /** Media ms the returned fragment covers. */
27091
27107
  gopDurMs: number()
27092
27108
  });
27109
+ /**
27110
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27111
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27112
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27113
+ * a replay needs several seconds of native pixels, not one frame.
27114
+ *
27115
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27116
+ * is `false` when the returned bytes were cut short by the read's own safety
27117
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27118
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27119
+ * degradation: a window whose end falls past the covering segment would need
27120
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27121
+ * not one standalone-demuxable stream — the caller's answer is to request a
27122
+ * shorter window or one aligned to a single segment, not to receive spliced
27123
+ * bytes nothing has proven decodable.
27124
+ */
27125
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27126
+ kind: literal("ok"),
27127
+ data: _instanceof(Uint8Array),
27128
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27129
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27130
+ gopStartMs: number(),
27131
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27132
+ gopDurMs: number(),
27133
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27134
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27135
+ reachesRequestedEnd: boolean()
27136
+ }), object({
27137
+ kind: literal("spans-multiple-segments"),
27138
+ /** Where the covering segment's own footage runs out — informational,
27139
+ * not a retry hint (retrying the same window would refuse again). */
27140
+ segmentEndMs: number()
27141
+ })]);
27093
27142
  method(object({
27094
27143
  deviceId: number(),
27095
27144
  fromMs: number(),
@@ -27140,6 +27189,15 @@ method(object({
27140
27189
  }), ReadGopBytesResultSchema, {
27141
27190
  kind: "query",
27142
27191
  auth: "admin"
27192
+ }), method(object({
27193
+ deviceId: number(),
27194
+ profile: string(),
27195
+ startMs: number(),
27196
+ fromMs: number(),
27197
+ toMs: number()
27198
+ }), ReadWindowBytesResultSchema, {
27199
+ kind: "query",
27200
+ auth: "admin"
27143
27201
  }), method(object({
27144
27202
  deviceId: number(),
27145
27203
  config: RecordingConfigSchema
@@ -33227,6 +33285,12 @@ Object.freeze({
33227
33285
  addonId: null,
33228
33286
  access: "view"
33229
33287
  },
33288
+ "notificationRules.resolveArtifactUrl": {
33289
+ capName: "notification-rules",
33290
+ capScope: "system",
33291
+ addonId: null,
33292
+ access: "view"
33293
+ },
33230
33294
  "notificationRules.setAlarmConfig": {
33231
33295
  capName: "notification-rules",
33232
33296
  capScope: "system",
@@ -34631,6 +34695,12 @@ Object.freeze({
34631
34695
  addonId: null,
34632
34696
  access: "view"
34633
34697
  },
34698
+ "recording.readWindowBytes": {
34699
+ capName: "recording",
34700
+ capScope: "system",
34701
+ addonId: null,
34702
+ access: "view"
34703
+ },
34634
34704
  "recording.refreshStorageLocationsForMigration": {
34635
34705
  capName: "recording",
34636
34706
  capScope: "system",
@@ -37461,6 +37531,11 @@ Object.freeze({
37461
37531
  form: "single",
37462
37532
  optional: false
37463
37533
  }],
37534
+ "recording.readWindowBytes": [{
37535
+ name: "deviceId",
37536
+ form: "single",
37537
+ optional: false
37538
+ }],
37464
37539
  "recording.relocateFootage": [{
37465
37540
  name: "deviceId",
37466
37541
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15836,7 +15836,23 @@ var NcHistoryEntrySchema = object({
15836
15836
  updatedAt: number(),
15837
15837
  /** Failure detail — present on a `dead` row. */
15838
15838
  error: string().optional(),
15839
- subject: NcHistorySubjectSchema
15839
+ subject: NcHistorySubjectSchema,
15840
+ /**
15841
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15842
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15843
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15844
+ * every delivery attempt). Absent on a row still pending/dead, a row
15845
+ * delivered before this field shipped, or a wiring with no artefact index.
15846
+ *
15847
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15848
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15849
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15850
+ * also answers `null` for an id whose artefact has since expired past the
15851
+ * retained shelf's own age bound — the degrade a caller (the Home
15852
+ * Assistant export) must render as "no image right now", never as a
15853
+ * broken link.
15854
+ */
15855
+ artifactIds: array(string().min(1)).optional()
15840
15856
  });
15841
15857
  /**
15842
15858
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16063,7 +16079,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16063
16079
  }), method(object({}), object({
16064
16080
  catalog: array(NcConditionDescriptorSchema),
16065
16081
  taxonomy: NcTaxonomySchema.optional()
16066
- })), 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 }), {
16082
+ })), 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 }), {
16067
16083
  kind: "mutation",
16068
16084
  caller: "required"
16069
16085
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27091,6 +27107,39 @@ var ReadGopBytesResultSchema = object({
27091
27107
  /** Media ms the returned fragment covers. */
27092
27108
  gopDurMs: number()
27093
27109
  });
27110
+ /**
27111
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27112
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27113
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27114
+ * a replay needs several seconds of native pixels, not one frame.
27115
+ *
27116
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27117
+ * is `false` when the returned bytes were cut short by the read's own safety
27118
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27119
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27120
+ * degradation: a window whose end falls past the covering segment would need
27121
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27122
+ * not one standalone-demuxable stream — the caller's answer is to request a
27123
+ * shorter window or one aligned to a single segment, not to receive spliced
27124
+ * bytes nothing has proven decodable.
27125
+ */
27126
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27127
+ kind: literal("ok"),
27128
+ data: _instanceof(Uint8Array),
27129
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27130
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27131
+ gopStartMs: number(),
27132
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27133
+ gopDurMs: number(),
27134
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27135
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27136
+ reachesRequestedEnd: boolean()
27137
+ }), object({
27138
+ kind: literal("spans-multiple-segments"),
27139
+ /** Where the covering segment's own footage runs out — informational,
27140
+ * not a retry hint (retrying the same window would refuse again). */
27141
+ segmentEndMs: number()
27142
+ })]);
27094
27143
  method(object({
27095
27144
  deviceId: number(),
27096
27145
  fromMs: number(),
@@ -27141,6 +27190,15 @@ method(object({
27141
27190
  }), ReadGopBytesResultSchema, {
27142
27191
  kind: "query",
27143
27192
  auth: "admin"
27193
+ }), method(object({
27194
+ deviceId: number(),
27195
+ profile: string(),
27196
+ startMs: number(),
27197
+ fromMs: number(),
27198
+ toMs: number()
27199
+ }), ReadWindowBytesResultSchema, {
27200
+ kind: "query",
27201
+ auth: "admin"
27144
27202
  }), method(object({
27145
27203
  deviceId: number(),
27146
27204
  config: RecordingConfigSchema
@@ -33228,6 +33286,12 @@ Object.freeze({
33228
33286
  addonId: null,
33229
33287
  access: "view"
33230
33288
  },
33289
+ "notificationRules.resolveArtifactUrl": {
33290
+ capName: "notification-rules",
33291
+ capScope: "system",
33292
+ addonId: null,
33293
+ access: "view"
33294
+ },
33231
33295
  "notificationRules.setAlarmConfig": {
33232
33296
  capName: "notification-rules",
33233
33297
  capScope: "system",
@@ -34632,6 +34696,12 @@ Object.freeze({
34632
34696
  addonId: null,
34633
34697
  access: "view"
34634
34698
  },
34699
+ "recording.readWindowBytes": {
34700
+ capName: "recording",
34701
+ capScope: "system",
34702
+ addonId: null,
34703
+ access: "view"
34704
+ },
34635
34705
  "recording.refreshStorageLocationsForMigration": {
34636
34706
  capName: "recording",
34637
34707
  capScope: "system",
@@ -37462,6 +37532,11 @@ Object.freeze({
37462
37532
  form: "single",
37463
37533
  optional: false
37464
37534
  }],
37535
+ "recording.readWindowBytes": [{
37536
+ name: "deviceId",
37537
+ form: "single",
37538
+ optional: false
37539
+ }],
37465
37540
  "recording.relocateFootage": [{
37466
37541
  name: "deviceId",
37467
37542
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",