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