@camstack/addon-export-alexa 1.2.36 → 1.2.37

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.
@@ -15775,7 +15775,23 @@ var NcHistoryEntrySchema = object({
15775
15775
  updatedAt: number(),
15776
15776
  /** Failure detail — present on a `dead` row. */
15777
15777
  error: string().optional(),
15778
- subject: NcHistorySubjectSchema
15778
+ subject: NcHistorySubjectSchema,
15779
+ /**
15780
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15781
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15782
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15783
+ * every delivery attempt). Absent on a row still pending/dead, a row
15784
+ * delivered before this field shipped, or a wiring with no artefact index.
15785
+ *
15786
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15787
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15788
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15789
+ * also answers `null` for an id whose artefact has since expired past the
15790
+ * retained shelf's own age bound — the degrade a caller (the Home
15791
+ * Assistant export) must render as "no image right now", never as a
15792
+ * broken link.
15793
+ */
15794
+ artifactIds: array(string().min(1)).optional()
15779
15795
  });
15780
15796
  /**
15781
15797
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16002,7 +16018,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16002
16018
  }), method(object({}), object({
16003
16019
  catalog: array(NcConditionDescriptorSchema),
16004
16020
  taxonomy: NcTaxonomySchema.optional()
16005
- })), 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 }), {
16021
+ })), 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 }), {
16006
16022
  kind: "mutation",
16007
16023
  caller: "required"
16008
16024
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25310,6 +25326,39 @@ var ReadGopBytesResultSchema = object({
25310
25326
  /** Media ms the returned fragment covers. */
25311
25327
  gopDurMs: number()
25312
25328
  });
25329
+ /**
25330
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25331
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25332
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25333
+ * a replay needs several seconds of native pixels, not one frame.
25334
+ *
25335
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25336
+ * is `false` when the returned bytes were cut short by the read's own safety
25337
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25338
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25339
+ * degradation: a window whose end falls past the covering segment would need
25340
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25341
+ * not one standalone-demuxable stream — the caller's answer is to request a
25342
+ * shorter window or one aligned to a single segment, not to receive spliced
25343
+ * bytes nothing has proven decodable.
25344
+ */
25345
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25346
+ kind: literal("ok"),
25347
+ data: _instanceof(Uint8Array),
25348
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25349
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25350
+ gopStartMs: number(),
25351
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25352
+ gopDurMs: number(),
25353
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25354
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25355
+ reachesRequestedEnd: boolean()
25356
+ }), object({
25357
+ kind: literal("spans-multiple-segments"),
25358
+ /** Where the covering segment's own footage runs out — informational,
25359
+ * not a retry hint (retrying the same window would refuse again). */
25360
+ segmentEndMs: number()
25361
+ })]);
25313
25362
  method(object({
25314
25363
  deviceId: number(),
25315
25364
  fromMs: number(),
@@ -25360,6 +25409,15 @@ method(object({
25360
25409
  }), ReadGopBytesResultSchema, {
25361
25410
  kind: "query",
25362
25411
  auth: "admin"
25412
+ }), method(object({
25413
+ deviceId: number(),
25414
+ profile: string(),
25415
+ startMs: number(),
25416
+ fromMs: number(),
25417
+ toMs: number()
25418
+ }), ReadWindowBytesResultSchema, {
25419
+ kind: "query",
25420
+ auth: "admin"
25363
25421
  }), method(object({
25364
25422
  deviceId: number(),
25365
25423
  config: RecordingConfigSchema
@@ -29778,6 +29836,12 @@ Object.freeze({
29778
29836
  addonId: null,
29779
29837
  access: "view"
29780
29838
  },
29839
+ "notificationRules.resolveArtifactUrl": {
29840
+ capName: "notification-rules",
29841
+ capScope: "system",
29842
+ addonId: null,
29843
+ access: "view"
29844
+ },
29781
29845
  "notificationRules.setAlarmConfig": {
29782
29846
  capName: "notification-rules",
29783
29847
  capScope: "system",
@@ -31182,6 +31246,12 @@ Object.freeze({
31182
31246
  addonId: null,
31183
31247
  access: "view"
31184
31248
  },
31249
+ "recording.readWindowBytes": {
31250
+ capName: "recording",
31251
+ capScope: "system",
31252
+ addonId: null,
31253
+ access: "view"
31254
+ },
31185
31255
  "recording.refreshStorageLocationsForMigration": {
31186
31256
  capName: "recording",
31187
31257
  capScope: "system",
@@ -34012,6 +34082,11 @@ Object.freeze({
34012
34082
  form: "single",
34013
34083
  optional: false
34014
34084
  }],
34085
+ "recording.readWindowBytes": [{
34086
+ name: "deviceId",
34087
+ form: "single",
34088
+ optional: false
34089
+ }],
34015
34090
  "recording.relocateFootage": [{
34016
34091
  name: "deviceId",
34017
34092
  form: "single",
@@ -15748,7 +15748,23 @@ var NcHistoryEntrySchema = object({
15748
15748
  updatedAt: number(),
15749
15749
  /** Failure detail — present on a `dead` row. */
15750
15750
  error: string().optional(),
15751
- subject: NcHistorySubjectSchema
15751
+ subject: NcHistorySubjectSchema,
15752
+ /**
15753
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15754
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15755
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15756
+ * every delivery attempt). Absent on a row still pending/dead, a row
15757
+ * delivered before this field shipped, or a wiring with no artefact index.
15758
+ *
15759
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15760
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15761
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15762
+ * also answers `null` for an id whose artefact has since expired past the
15763
+ * retained shelf's own age bound — the degrade a caller (the Home
15764
+ * Assistant export) must render as "no image right now", never as a
15765
+ * broken link.
15766
+ */
15767
+ artifactIds: array(string().min(1)).optional()
15752
15768
  });
15753
15769
  /**
15754
15770
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15975,7 +15991,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15975
15991
  }), method(object({}), object({
15976
15992
  catalog: array(NcConditionDescriptorSchema),
15977
15993
  taxonomy: NcTaxonomySchema.optional()
15978
- })), 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 }), {
15994
+ })), 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 }), {
15979
15995
  kind: "mutation",
15980
15996
  caller: "required"
15981
15997
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25283,6 +25299,39 @@ var ReadGopBytesResultSchema = object({
25283
25299
  /** Media ms the returned fragment covers. */
25284
25300
  gopDurMs: number()
25285
25301
  });
25302
+ /**
25303
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25304
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25305
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25306
+ * a replay needs several seconds of native pixels, not one frame.
25307
+ *
25308
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25309
+ * is `false` when the returned bytes were cut short by the read's own safety
25310
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25311
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25312
+ * degradation: a window whose end falls past the covering segment would need
25313
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25314
+ * not one standalone-demuxable stream — the caller's answer is to request a
25315
+ * shorter window or one aligned to a single segment, not to receive spliced
25316
+ * bytes nothing has proven decodable.
25317
+ */
25318
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25319
+ kind: literal("ok"),
25320
+ data: _instanceof(Uint8Array),
25321
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25322
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25323
+ gopStartMs: number(),
25324
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25325
+ gopDurMs: number(),
25326
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25327
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25328
+ reachesRequestedEnd: boolean()
25329
+ }), object({
25330
+ kind: literal("spans-multiple-segments"),
25331
+ /** Where the covering segment's own footage runs out — informational,
25332
+ * not a retry hint (retrying the same window would refuse again). */
25333
+ segmentEndMs: number()
25334
+ })]);
25286
25335
  method(object({
25287
25336
  deviceId: number(),
25288
25337
  fromMs: number(),
@@ -25333,6 +25382,15 @@ method(object({
25333
25382
  }), ReadGopBytesResultSchema, {
25334
25383
  kind: "query",
25335
25384
  auth: "admin"
25385
+ }), method(object({
25386
+ deviceId: number(),
25387
+ profile: string(),
25388
+ startMs: number(),
25389
+ fromMs: number(),
25390
+ toMs: number()
25391
+ }), ReadWindowBytesResultSchema, {
25392
+ kind: "query",
25393
+ auth: "admin"
25336
25394
  }), method(object({
25337
25395
  deviceId: number(),
25338
25396
  config: RecordingConfigSchema
@@ -29751,6 +29809,12 @@ Object.freeze({
29751
29809
  addonId: null,
29752
29810
  access: "view"
29753
29811
  },
29812
+ "notificationRules.resolveArtifactUrl": {
29813
+ capName: "notification-rules",
29814
+ capScope: "system",
29815
+ addonId: null,
29816
+ access: "view"
29817
+ },
29754
29818
  "notificationRules.setAlarmConfig": {
29755
29819
  capName: "notification-rules",
29756
29820
  capScope: "system",
@@ -31155,6 +31219,12 @@ Object.freeze({
31155
31219
  addonId: null,
31156
31220
  access: "view"
31157
31221
  },
31222
+ "recording.readWindowBytes": {
31223
+ capName: "recording",
31224
+ capScope: "system",
31225
+ addonId: null,
31226
+ access: "view"
31227
+ },
31158
31228
  "recording.refreshStorageLocationsForMigration": {
31159
31229
  capName: "recording",
31160
31230
  capScope: "system",
@@ -33985,6 +34055,11 @@ Object.freeze({
33985
34055
  form: "single",
33986
34056
  optional: false
33987
34057
  }],
34058
+ "recording.readWindowBytes": [{
34059
+ name: "deviceId",
34060
+ form: "single",
34061
+ optional: false
34062
+ }],
33988
34063
  "recording.relocateFootage": [{
33989
34064
  name: "deviceId",
33990
34065
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.36",
3
+ "version": "1.2.37",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",