@camstack/addon-provider-petkit 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
@@ -16901,7 +16901,23 @@ var NcHistoryEntrySchema = object({
16901
16901
  updatedAt: number(),
16902
16902
  /** Failure detail — present on a `dead` row. */
16903
16903
  error: string().optional(),
16904
- subject: NcHistorySubjectSchema
16904
+ subject: NcHistorySubjectSchema,
16905
+ /**
16906
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16907
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16908
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16909
+ * every delivery attempt). Absent on a row still pending/dead, a row
16910
+ * delivered before this field shipped, or a wiring with no artefact index.
16911
+ *
16912
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16913
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16914
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16915
+ * also answers `null` for an id whose artefact has since expired past the
16916
+ * retained shelf's own age bound — the degrade a caller (the Home
16917
+ * Assistant export) must render as "no image right now", never as a
16918
+ * broken link.
16919
+ */
16920
+ artifactIds: array(string().min(1)).optional()
16905
16921
  });
16906
16922
  /**
16907
16923
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -17128,7 +17144,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
17128
17144
  }), method(object({}), object({
17129
17145
  catalog: array(NcConditionDescriptorSchema),
17130
17146
  taxonomy: NcTaxonomySchema.optional()
17131
- })), 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 }), {
17147
+ })), 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 }), {
17132
17148
  kind: "mutation",
17133
17149
  caller: "required"
17134
17150
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -28156,6 +28172,39 @@ var ReadGopBytesResultSchema = object({
28156
28172
  /** Media ms the returned fragment covers. */
28157
28173
  gopDurMs: number()
28158
28174
  });
28175
+ /**
28176
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
28177
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
28178
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
28179
+ * a replay needs several seconds of native pixels, not one frame.
28180
+ *
28181
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
28182
+ * is `false` when the returned bytes were cut short by the read's own safety
28183
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
28184
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
28185
+ * degradation: a window whose end falls past the covering segment would need
28186
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
28187
+ * not one standalone-demuxable stream — the caller's answer is to request a
28188
+ * shorter window or one aligned to a single segment, not to receive spliced
28189
+ * bytes nothing has proven decodable.
28190
+ */
28191
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28192
+ kind: literal("ok"),
28193
+ data: _instanceof(Uint8Array),
28194
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
28195
+ * the requested `fromMs` (anchored on the nearest keyframe). */
28196
+ gopStartMs: number(),
28197
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
28198
+ gopDurMs: number(),
28199
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
28200
+ * the requested `toMs`; the caller got fewer frames than asked for. */
28201
+ reachesRequestedEnd: boolean()
28202
+ }), object({
28203
+ kind: literal("spans-multiple-segments"),
28204
+ /** Where the covering segment's own footage runs out — informational,
28205
+ * not a retry hint (retrying the same window would refuse again). */
28206
+ segmentEndMs: number()
28207
+ })]);
28159
28208
  method(object({
28160
28209
  deviceId: number(),
28161
28210
  fromMs: number(),
@@ -28206,6 +28255,15 @@ method(object({
28206
28255
  }), ReadGopBytesResultSchema, {
28207
28256
  kind: "query",
28208
28257
  auth: "admin"
28258
+ }), method(object({
28259
+ deviceId: number(),
28260
+ profile: string(),
28261
+ startMs: number(),
28262
+ fromMs: number(),
28263
+ toMs: number()
28264
+ }), ReadWindowBytesResultSchema, {
28265
+ kind: "query",
28266
+ auth: "admin"
28209
28267
  }), method(object({
28210
28268
  deviceId: number(),
28211
28269
  config: RecordingConfigSchema
@@ -34293,6 +34351,12 @@ Object.freeze({
34293
34351
  addonId: null,
34294
34352
  access: "view"
34295
34353
  },
34354
+ "notificationRules.resolveArtifactUrl": {
34355
+ capName: "notification-rules",
34356
+ capScope: "system",
34357
+ addonId: null,
34358
+ access: "view"
34359
+ },
34296
34360
  "notificationRules.setAlarmConfig": {
34297
34361
  capName: "notification-rules",
34298
34362
  capScope: "system",
@@ -35697,6 +35761,12 @@ Object.freeze({
35697
35761
  addonId: null,
35698
35762
  access: "view"
35699
35763
  },
35764
+ "recording.readWindowBytes": {
35765
+ capName: "recording",
35766
+ capScope: "system",
35767
+ addonId: null,
35768
+ access: "view"
35769
+ },
35700
35770
  "recording.refreshStorageLocationsForMigration": {
35701
35771
  capName: "recording",
35702
35772
  capScope: "system",
@@ -38527,6 +38597,11 @@ Object.freeze({
38527
38597
  form: "single",
38528
38598
  optional: false
38529
38599
  }],
38600
+ "recording.readWindowBytes": [{
38601
+ name: "deviceId",
38602
+ form: "single",
38603
+ optional: false
38604
+ }],
38530
38605
  "recording.relocateFootage": [{
38531
38606
  name: "deviceId",
38532
38607
  form: "single",
package/dist/addon.mjs CHANGED
@@ -16900,7 +16900,23 @@ var NcHistoryEntrySchema = object({
16900
16900
  updatedAt: number(),
16901
16901
  /** Failure detail — present on a `dead` row. */
16902
16902
  error: string().optional(),
16903
- subject: NcHistorySubjectSchema
16903
+ subject: NcHistorySubjectSchema,
16904
+ /**
16905
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16906
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16907
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16908
+ * every delivery attempt). Absent on a row still pending/dead, a row
16909
+ * delivered before this field shipped, or a wiring with no artefact index.
16910
+ *
16911
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16912
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16913
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16914
+ * also answers `null` for an id whose artefact has since expired past the
16915
+ * retained shelf's own age bound — the degrade a caller (the Home
16916
+ * Assistant export) must render as "no image right now", never as a
16917
+ * broken link.
16918
+ */
16919
+ artifactIds: array(string().min(1)).optional()
16904
16920
  });
16905
16921
  /**
16906
16922
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -17127,7 +17143,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
17127
17143
  }), method(object({}), object({
17128
17144
  catalog: array(NcConditionDescriptorSchema),
17129
17145
  taxonomy: NcTaxonomySchema.optional()
17130
- })), 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 }), {
17146
+ })), 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 }), {
17131
17147
  kind: "mutation",
17132
17148
  caller: "required"
17133
17149
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -28155,6 +28171,39 @@ var ReadGopBytesResultSchema = object({
28155
28171
  /** Media ms the returned fragment covers. */
28156
28172
  gopDurMs: number()
28157
28173
  });
28174
+ /**
28175
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
28176
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
28177
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
28178
+ * a replay needs several seconds of native pixels, not one frame.
28179
+ *
28180
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
28181
+ * is `false` when the returned bytes were cut short by the read's own safety
28182
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
28183
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
28184
+ * degradation: a window whose end falls past the covering segment would need
28185
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
28186
+ * not one standalone-demuxable stream — the caller's answer is to request a
28187
+ * shorter window or one aligned to a single segment, not to receive spliced
28188
+ * bytes nothing has proven decodable.
28189
+ */
28190
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28191
+ kind: literal("ok"),
28192
+ data: _instanceof(Uint8Array),
28193
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
28194
+ * the requested `fromMs` (anchored on the nearest keyframe). */
28195
+ gopStartMs: number(),
28196
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
28197
+ gopDurMs: number(),
28198
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
28199
+ * the requested `toMs`; the caller got fewer frames than asked for. */
28200
+ reachesRequestedEnd: boolean()
28201
+ }), object({
28202
+ kind: literal("spans-multiple-segments"),
28203
+ /** Where the covering segment's own footage runs out — informational,
28204
+ * not a retry hint (retrying the same window would refuse again). */
28205
+ segmentEndMs: number()
28206
+ })]);
28158
28207
  method(object({
28159
28208
  deviceId: number(),
28160
28209
  fromMs: number(),
@@ -28205,6 +28254,15 @@ method(object({
28205
28254
  }), ReadGopBytesResultSchema, {
28206
28255
  kind: "query",
28207
28256
  auth: "admin"
28257
+ }), method(object({
28258
+ deviceId: number(),
28259
+ profile: string(),
28260
+ startMs: number(),
28261
+ fromMs: number(),
28262
+ toMs: number()
28263
+ }), ReadWindowBytesResultSchema, {
28264
+ kind: "query",
28265
+ auth: "admin"
28208
28266
  }), method(object({
28209
28267
  deviceId: number(),
28210
28268
  config: RecordingConfigSchema
@@ -34292,6 +34350,12 @@ Object.freeze({
34292
34350
  addonId: null,
34293
34351
  access: "view"
34294
34352
  },
34353
+ "notificationRules.resolveArtifactUrl": {
34354
+ capName: "notification-rules",
34355
+ capScope: "system",
34356
+ addonId: null,
34357
+ access: "view"
34358
+ },
34295
34359
  "notificationRules.setAlarmConfig": {
34296
34360
  capName: "notification-rules",
34297
34361
  capScope: "system",
@@ -35696,6 +35760,12 @@ Object.freeze({
35696
35760
  addonId: null,
35697
35761
  access: "view"
35698
35762
  },
35763
+ "recording.readWindowBytes": {
35764
+ capName: "recording",
35765
+ capScope: "system",
35766
+ addonId: null,
35767
+ access: "view"
35768
+ },
35699
35769
  "recording.refreshStorageLocationsForMigration": {
35700
35770
  capName: "recording",
35701
35771
  capScope: "system",
@@ -38526,6 +38596,11 @@ Object.freeze({
38526
38596
  form: "single",
38527
38597
  optional: false
38528
38598
  }],
38599
+ "recording.readWindowBytes": [{
38600
+ name: "deviceId",
38601
+ form: "single",
38602
+ optional: false
38603
+ }],
38529
38604
  "recording.relocateFootage": [{
38530
38605
  name: "deviceId",
38531
38606
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-petkit",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",