@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 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.29",
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",