@camstack/addon-provider-rademacher 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
@@ -16767,7 +16767,23 @@ var NcHistoryEntrySchema = object({
16767
16767
  updatedAt: number(),
16768
16768
  /** Failure detail — present on a `dead` row. */
16769
16769
  error: string().optional(),
16770
- subject: NcHistorySubjectSchema
16770
+ subject: NcHistorySubjectSchema,
16771
+ /**
16772
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16773
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16774
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16775
+ * every delivery attempt). Absent on a row still pending/dead, a row
16776
+ * delivered before this field shipped, or a wiring with no artefact index.
16777
+ *
16778
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16779
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16780
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16781
+ * also answers `null` for an id whose artefact has since expired past the
16782
+ * retained shelf's own age bound — the degrade a caller (the Home
16783
+ * Assistant export) must render as "no image right now", never as a
16784
+ * broken link.
16785
+ */
16786
+ artifactIds: array(string().min(1)).optional()
16771
16787
  });
16772
16788
  /**
16773
16789
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16994,7 +17010,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16994
17010
  }), method(object({}), object({
16995
17011
  catalog: array(NcConditionDescriptorSchema),
16996
17012
  taxonomy: NcTaxonomySchema.optional()
16997
- })), 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 }), {
17013
+ })), 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 }), {
16998
17014
  kind: "mutation",
16999
17015
  caller: "required"
17000
17016
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -28014,6 +28030,39 @@ var ReadGopBytesResultSchema = object({
28014
28030
  /** Media ms the returned fragment covers. */
28015
28031
  gopDurMs: number()
28016
28032
  });
28033
+ /**
28034
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
28035
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
28036
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
28037
+ * a replay needs several seconds of native pixels, not one frame.
28038
+ *
28039
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
28040
+ * is `false` when the returned bytes were cut short by the read's own safety
28041
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
28042
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
28043
+ * degradation: a window whose end falls past the covering segment would need
28044
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
28045
+ * not one standalone-demuxable stream — the caller's answer is to request a
28046
+ * shorter window or one aligned to a single segment, not to receive spliced
28047
+ * bytes nothing has proven decodable.
28048
+ */
28049
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28050
+ kind: literal("ok"),
28051
+ data: _instanceof(Uint8Array),
28052
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
28053
+ * the requested `fromMs` (anchored on the nearest keyframe). */
28054
+ gopStartMs: number(),
28055
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
28056
+ gopDurMs: number(),
28057
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
28058
+ * the requested `toMs`; the caller got fewer frames than asked for. */
28059
+ reachesRequestedEnd: boolean()
28060
+ }), object({
28061
+ kind: literal("spans-multiple-segments"),
28062
+ /** Where the covering segment's own footage runs out — informational,
28063
+ * not a retry hint (retrying the same window would refuse again). */
28064
+ segmentEndMs: number()
28065
+ })]);
28017
28066
  method(object({
28018
28067
  deviceId: number(),
28019
28068
  fromMs: number(),
@@ -28064,6 +28113,15 @@ method(object({
28064
28113
  }), ReadGopBytesResultSchema, {
28065
28114
  kind: "query",
28066
28115
  auth: "admin"
28116
+ }), method(object({
28117
+ deviceId: number(),
28118
+ profile: string(),
28119
+ startMs: number(),
28120
+ fromMs: number(),
28121
+ toMs: number()
28122
+ }), ReadWindowBytesResultSchema, {
28123
+ kind: "query",
28124
+ auth: "admin"
28067
28125
  }), method(object({
28068
28126
  deviceId: number(),
28069
28127
  config: RecordingConfigSchema
@@ -34151,6 +34209,12 @@ Object.freeze({
34151
34209
  addonId: null,
34152
34210
  access: "view"
34153
34211
  },
34212
+ "notificationRules.resolveArtifactUrl": {
34213
+ capName: "notification-rules",
34214
+ capScope: "system",
34215
+ addonId: null,
34216
+ access: "view"
34217
+ },
34154
34218
  "notificationRules.setAlarmConfig": {
34155
34219
  capName: "notification-rules",
34156
34220
  capScope: "system",
@@ -35555,6 +35619,12 @@ Object.freeze({
35555
35619
  addonId: null,
35556
35620
  access: "view"
35557
35621
  },
35622
+ "recording.readWindowBytes": {
35623
+ capName: "recording",
35624
+ capScope: "system",
35625
+ addonId: null,
35626
+ access: "view"
35627
+ },
35558
35628
  "recording.refreshStorageLocationsForMigration": {
35559
35629
  capName: "recording",
35560
35630
  capScope: "system",
@@ -38385,6 +38455,11 @@ Object.freeze({
38385
38455
  form: "single",
38386
38456
  optional: false
38387
38457
  }],
38458
+ "recording.readWindowBytes": [{
38459
+ name: "deviceId",
38460
+ form: "single",
38461
+ optional: false
38462
+ }],
38388
38463
  "recording.relocateFootage": [{
38389
38464
  name: "deviceId",
38390
38465
  form: "single",
package/dist/addon.mjs CHANGED
@@ -16766,7 +16766,23 @@ var NcHistoryEntrySchema = object({
16766
16766
  updatedAt: number(),
16767
16767
  /** Failure detail — present on a `dead` row. */
16768
16768
  error: string().optional(),
16769
- subject: NcHistorySubjectSchema
16769
+ subject: NcHistorySubjectSchema,
16770
+ /**
16771
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16772
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16773
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16774
+ * every delivery attempt). Absent on a row still pending/dead, a row
16775
+ * delivered before this field shipped, or a wiring with no artefact index.
16776
+ *
16777
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16778
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16779
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16780
+ * also answers `null` for an id whose artefact has since expired past the
16781
+ * retained shelf's own age bound — the degrade a caller (the Home
16782
+ * Assistant export) must render as "no image right now", never as a
16783
+ * broken link.
16784
+ */
16785
+ artifactIds: array(string().min(1)).optional()
16770
16786
  });
16771
16787
  /**
16772
16788
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16993,7 +17009,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16993
17009
  }), method(object({}), object({
16994
17010
  catalog: array(NcConditionDescriptorSchema),
16995
17011
  taxonomy: NcTaxonomySchema.optional()
16996
- })), 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 }), {
17012
+ })), 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 }), {
16997
17013
  kind: "mutation",
16998
17014
  caller: "required"
16999
17015
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -28013,6 +28029,39 @@ var ReadGopBytesResultSchema = object({
28013
28029
  /** Media ms the returned fragment covers. */
28014
28030
  gopDurMs: number()
28015
28031
  });
28032
+ /**
28033
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
28034
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
28035
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
28036
+ * a replay needs several seconds of native pixels, not one frame.
28037
+ *
28038
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
28039
+ * is `false` when the returned bytes were cut short by the read's own safety
28040
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
28041
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
28042
+ * degradation: a window whose end falls past the covering segment would need
28043
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
28044
+ * not one standalone-demuxable stream — the caller's answer is to request a
28045
+ * shorter window or one aligned to a single segment, not to receive spliced
28046
+ * bytes nothing has proven decodable.
28047
+ */
28048
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28049
+ kind: literal("ok"),
28050
+ data: _instanceof(Uint8Array),
28051
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
28052
+ * the requested `fromMs` (anchored on the nearest keyframe). */
28053
+ gopStartMs: number(),
28054
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
28055
+ gopDurMs: number(),
28056
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
28057
+ * the requested `toMs`; the caller got fewer frames than asked for. */
28058
+ reachesRequestedEnd: boolean()
28059
+ }), object({
28060
+ kind: literal("spans-multiple-segments"),
28061
+ /** Where the covering segment's own footage runs out — informational,
28062
+ * not a retry hint (retrying the same window would refuse again). */
28063
+ segmentEndMs: number()
28064
+ })]);
28016
28065
  method(object({
28017
28066
  deviceId: number(),
28018
28067
  fromMs: number(),
@@ -28063,6 +28112,15 @@ method(object({
28063
28112
  }), ReadGopBytesResultSchema, {
28064
28113
  kind: "query",
28065
28114
  auth: "admin"
28115
+ }), method(object({
28116
+ deviceId: number(),
28117
+ profile: string(),
28118
+ startMs: number(),
28119
+ fromMs: number(),
28120
+ toMs: number()
28121
+ }), ReadWindowBytesResultSchema, {
28122
+ kind: "query",
28123
+ auth: "admin"
28066
28124
  }), method(object({
28067
28125
  deviceId: number(),
28068
28126
  config: RecordingConfigSchema
@@ -34150,6 +34208,12 @@ Object.freeze({
34150
34208
  addonId: null,
34151
34209
  access: "view"
34152
34210
  },
34211
+ "notificationRules.resolveArtifactUrl": {
34212
+ capName: "notification-rules",
34213
+ capScope: "system",
34214
+ addonId: null,
34215
+ access: "view"
34216
+ },
34153
34217
  "notificationRules.setAlarmConfig": {
34154
34218
  capName: "notification-rules",
34155
34219
  capScope: "system",
@@ -35554,6 +35618,12 @@ Object.freeze({
35554
35618
  addonId: null,
35555
35619
  access: "view"
35556
35620
  },
35621
+ "recording.readWindowBytes": {
35622
+ capName: "recording",
35623
+ capScope: "system",
35624
+ addonId: null,
35625
+ access: "view"
35626
+ },
35557
35627
  "recording.refreshStorageLocationsForMigration": {
35558
35628
  capName: "recording",
35559
35629
  capScope: "system",
@@ -38384,6 +38454,11 @@ Object.freeze({
38384
38454
  form: "single",
38385
38455
  optional: false
38386
38456
  }],
38457
+ "recording.readWindowBytes": [{
38458
+ name: "deviceId",
38459
+ form: "single",
38460
+ optional: false
38461
+ }],
38387
38462
  "recording.relocateFootage": [{
38388
38463
  name: "deviceId",
38389
38464
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",