@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 +77 -2
- package/dist/addon.mjs +77 -2
- package/package.json +1 -1
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.
|
|
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",
|