@camstack/addon-matter-broker 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
@@ -15862,7 +15862,23 @@ var NcHistoryEntrySchema = object({
15862
15862
  updatedAt: number(),
15863
15863
  /** Failure detail — present on a `dead` row. */
15864
15864
  error: string$2().optional(),
15865
- subject: NcHistorySubjectSchema
15865
+ subject: NcHistorySubjectSchema,
15866
+ /**
15867
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15868
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15869
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15870
+ * every delivery attempt). Absent on a row still pending/dead, a row
15871
+ * delivered before this field shipped, or a wiring with no artefact index.
15872
+ *
15873
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15874
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15875
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15876
+ * also answers `null` for an id whose artefact has since expired past the
15877
+ * retained shelf's own age bound — the degrade a caller (the Home
15878
+ * Assistant export) must render as "no image right now", never as a
15879
+ * broken link.
15880
+ */
15881
+ artifactIds: array(string$2().min(1)).optional()
15866
15882
  });
15867
15883
  /**
15868
15884
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16089,7 +16105,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16089
16105
  }), method(object({}), object({
16090
16106
  catalog: array(NcConditionDescriptorSchema),
16091
16107
  taxonomy: NcTaxonomySchema.optional()
16092
- })), 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 }), {
16108
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string$2().min(1) }), object({ url: string$2().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16093
16109
  kind: "mutation",
16094
16110
  caller: "required"
16095
16111
  }), method(object({ snoozeId: string$2() }), object({ success: literal(true) }), {
@@ -27126,6 +27142,39 @@ var ReadGopBytesResultSchema = object({
27126
27142
  /** Media ms the returned fragment covers. */
27127
27143
  gopDurMs: number()
27128
27144
  });
27145
+ /**
27146
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27147
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27148
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27149
+ * a replay needs several seconds of native pixels, not one frame.
27150
+ *
27151
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27152
+ * is `false` when the returned bytes were cut short by the read's own safety
27153
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27154
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27155
+ * degradation: a window whose end falls past the covering segment would need
27156
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27157
+ * not one standalone-demuxable stream — the caller's answer is to request a
27158
+ * shorter window or one aligned to a single segment, not to receive spliced
27159
+ * bytes nothing has proven decodable.
27160
+ */
27161
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27162
+ kind: literal("ok"),
27163
+ data: _instanceof(Uint8Array),
27164
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27165
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27166
+ gopStartMs: number(),
27167
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27168
+ gopDurMs: number(),
27169
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27170
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27171
+ reachesRequestedEnd: boolean()
27172
+ }), object({
27173
+ kind: literal("spans-multiple-segments"),
27174
+ /** Where the covering segment's own footage runs out — informational,
27175
+ * not a retry hint (retrying the same window would refuse again). */
27176
+ segmentEndMs: number()
27177
+ })]);
27129
27178
  method(object({
27130
27179
  deviceId: number(),
27131
27180
  fromMs: number(),
@@ -27176,6 +27225,15 @@ method(object({
27176
27225
  }), ReadGopBytesResultSchema, {
27177
27226
  kind: "query",
27178
27227
  auth: "admin"
27228
+ }), method(object({
27229
+ deviceId: number(),
27230
+ profile: string$2(),
27231
+ startMs: number(),
27232
+ fromMs: number(),
27233
+ toMs: number()
27234
+ }), ReadWindowBytesResultSchema, {
27235
+ kind: "query",
27236
+ auth: "admin"
27179
27237
  }), method(object({
27180
27238
  deviceId: number(),
27181
27239
  config: RecordingConfigSchema
@@ -33263,6 +33321,12 @@ Object.freeze({
33263
33321
  addonId: null,
33264
33322
  access: "view"
33265
33323
  },
33324
+ "notificationRules.resolveArtifactUrl": {
33325
+ capName: "notification-rules",
33326
+ capScope: "system",
33327
+ addonId: null,
33328
+ access: "view"
33329
+ },
33266
33330
  "notificationRules.setAlarmConfig": {
33267
33331
  capName: "notification-rules",
33268
33332
  capScope: "system",
@@ -34667,6 +34731,12 @@ Object.freeze({
34667
34731
  addonId: null,
34668
34732
  access: "view"
34669
34733
  },
34734
+ "recording.readWindowBytes": {
34735
+ capName: "recording",
34736
+ capScope: "system",
34737
+ addonId: null,
34738
+ access: "view"
34739
+ },
34670
34740
  "recording.refreshStorageLocationsForMigration": {
34671
34741
  capName: "recording",
34672
34742
  capScope: "system",
@@ -37497,6 +37567,11 @@ Object.freeze({
37497
37567
  form: "single",
37498
37568
  optional: false
37499
37569
  }],
37570
+ "recording.readWindowBytes": [{
37571
+ name: "deviceId",
37572
+ form: "single",
37573
+ optional: false
37574
+ }],
37500
37575
  "recording.relocateFootage": [{
37501
37576
  name: "deviceId",
37502
37577
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15860,7 +15860,23 @@ var NcHistoryEntrySchema = object({
15860
15860
  updatedAt: number(),
15861
15861
  /** Failure detail — present on a `dead` row. */
15862
15862
  error: string$2().optional(),
15863
- subject: NcHistorySubjectSchema
15863
+ subject: NcHistorySubjectSchema,
15864
+ /**
15865
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15866
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15867
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15868
+ * every delivery attempt). Absent on a row still pending/dead, a row
15869
+ * delivered before this field shipped, or a wiring with no artefact index.
15870
+ *
15871
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15872
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15873
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15874
+ * also answers `null` for an id whose artefact has since expired past the
15875
+ * retained shelf's own age bound — the degrade a caller (the Home
15876
+ * Assistant export) must render as "no image right now", never as a
15877
+ * broken link.
15878
+ */
15879
+ artifactIds: array(string$2().min(1)).optional()
15864
15880
  });
15865
15881
  /**
15866
15882
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16087,7 +16103,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16087
16103
  }), method(object({}), object({
16088
16104
  catalog: array(NcConditionDescriptorSchema),
16089
16105
  taxonomy: NcTaxonomySchema.optional()
16090
- })), 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 }), {
16106
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string$2().min(1) }), object({ url: string$2().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16091
16107
  kind: "mutation",
16092
16108
  caller: "required"
16093
16109
  }), method(object({ snoozeId: string$2() }), object({ success: literal(true) }), {
@@ -27124,6 +27140,39 @@ var ReadGopBytesResultSchema = object({
27124
27140
  /** Media ms the returned fragment covers. */
27125
27141
  gopDurMs: number()
27126
27142
  });
27143
+ /**
27144
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27145
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27146
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27147
+ * a replay needs several seconds of native pixels, not one frame.
27148
+ *
27149
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27150
+ * is `false` when the returned bytes were cut short by the read's own safety
27151
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27152
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27153
+ * degradation: a window whose end falls past the covering segment would need
27154
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27155
+ * not one standalone-demuxable stream — the caller's answer is to request a
27156
+ * shorter window or one aligned to a single segment, not to receive spliced
27157
+ * bytes nothing has proven decodable.
27158
+ */
27159
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27160
+ kind: literal("ok"),
27161
+ data: _instanceof(Uint8Array),
27162
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27163
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27164
+ gopStartMs: number(),
27165
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27166
+ gopDurMs: number(),
27167
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27168
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27169
+ reachesRequestedEnd: boolean()
27170
+ }), object({
27171
+ kind: literal("spans-multiple-segments"),
27172
+ /** Where the covering segment's own footage runs out — informational,
27173
+ * not a retry hint (retrying the same window would refuse again). */
27174
+ segmentEndMs: number()
27175
+ })]);
27127
27176
  method(object({
27128
27177
  deviceId: number(),
27129
27178
  fromMs: number(),
@@ -27174,6 +27223,15 @@ method(object({
27174
27223
  }), ReadGopBytesResultSchema, {
27175
27224
  kind: "query",
27176
27225
  auth: "admin"
27226
+ }), method(object({
27227
+ deviceId: number(),
27228
+ profile: string$2(),
27229
+ startMs: number(),
27230
+ fromMs: number(),
27231
+ toMs: number()
27232
+ }), ReadWindowBytesResultSchema, {
27233
+ kind: "query",
27234
+ auth: "admin"
27177
27235
  }), method(object({
27178
27236
  deviceId: number(),
27179
27237
  config: RecordingConfigSchema
@@ -33261,6 +33319,12 @@ Object.freeze({
33261
33319
  addonId: null,
33262
33320
  access: "view"
33263
33321
  },
33322
+ "notificationRules.resolveArtifactUrl": {
33323
+ capName: "notification-rules",
33324
+ capScope: "system",
33325
+ addonId: null,
33326
+ access: "view"
33327
+ },
33264
33328
  "notificationRules.setAlarmConfig": {
33265
33329
  capName: "notification-rules",
33266
33330
  capScope: "system",
@@ -34665,6 +34729,12 @@ Object.freeze({
34665
34729
  addonId: null,
34666
34730
  access: "view"
34667
34731
  },
34732
+ "recording.readWindowBytes": {
34733
+ capName: "recording",
34734
+ capScope: "system",
34735
+ addonId: null,
34736
+ access: "view"
34737
+ },
34668
34738
  "recording.refreshStorageLocationsForMigration": {
34669
34739
  capName: "recording",
34670
34740
  capScope: "system",
@@ -37495,6 +37565,11 @@ Object.freeze({
37495
37565
  form: "single",
37496
37566
  optional: false
37497
37567
  }],
37568
+ "recording.readWindowBytes": [{
37569
+ name: "deviceId",
37570
+ form: "single",
37571
+ optional: false
37572
+ }],
37498
37573
  "recording.relocateFootage": [{
37499
37574
  name: "deviceId",
37500
37575
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",