@camstack/addon-import-alexa 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
@@ -16025,7 +16025,23 @@ var NcHistoryEntrySchema = object({
16025
16025
  updatedAt: number(),
16026
16026
  /** Failure detail — present on a `dead` row. */
16027
16027
  error: string().optional(),
16028
- subject: NcHistorySubjectSchema
16028
+ subject: NcHistorySubjectSchema,
16029
+ /**
16030
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16031
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16032
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16033
+ * every delivery attempt). Absent on a row still pending/dead, a row
16034
+ * delivered before this field shipped, or a wiring with no artefact index.
16035
+ *
16036
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16037
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16038
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16039
+ * also answers `null` for an id whose artefact has since expired past the
16040
+ * retained shelf's own age bound — the degrade a caller (the Home
16041
+ * Assistant export) must render as "no image right now", never as a
16042
+ * broken link.
16043
+ */
16044
+ artifactIds: array(string().min(1)).optional()
16029
16045
  });
16030
16046
  /**
16031
16047
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16252,7 +16268,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16252
16268
  }), method(object({}), object({
16253
16269
  catalog: array(NcConditionDescriptorSchema),
16254
16270
  taxonomy: NcTaxonomySchema.optional()
16255
- })), 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 }), {
16271
+ })), 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 }), {
16256
16272
  kind: "mutation",
16257
16273
  caller: "required"
16258
16274
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27289,6 +27305,39 @@ var ReadGopBytesResultSchema = object({
27289
27305
  /** Media ms the returned fragment covers. */
27290
27306
  gopDurMs: number()
27291
27307
  });
27308
+ /**
27309
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27310
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27311
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27312
+ * a replay needs several seconds of native pixels, not one frame.
27313
+ *
27314
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27315
+ * is `false` when the returned bytes were cut short by the read's own safety
27316
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27317
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27318
+ * degradation: a window whose end falls past the covering segment would need
27319
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27320
+ * not one standalone-demuxable stream — the caller's answer is to request a
27321
+ * shorter window or one aligned to a single segment, not to receive spliced
27322
+ * bytes nothing has proven decodable.
27323
+ */
27324
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27325
+ kind: literal("ok"),
27326
+ data: _instanceof(Uint8Array),
27327
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27328
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27329
+ gopStartMs: number(),
27330
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27331
+ gopDurMs: number(),
27332
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27333
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27334
+ reachesRequestedEnd: boolean()
27335
+ }), object({
27336
+ kind: literal("spans-multiple-segments"),
27337
+ /** Where the covering segment's own footage runs out — informational,
27338
+ * not a retry hint (retrying the same window would refuse again). */
27339
+ segmentEndMs: number()
27340
+ })]);
27292
27341
  method(object({
27293
27342
  deviceId: number(),
27294
27343
  fromMs: number(),
@@ -27339,6 +27388,15 @@ method(object({
27339
27388
  }), ReadGopBytesResultSchema, {
27340
27389
  kind: "query",
27341
27390
  auth: "admin"
27391
+ }), method(object({
27392
+ deviceId: number(),
27393
+ profile: string(),
27394
+ startMs: number(),
27395
+ fromMs: number(),
27396
+ toMs: number()
27397
+ }), ReadWindowBytesResultSchema, {
27398
+ kind: "query",
27399
+ auth: "admin"
27342
27400
  }), method(object({
27343
27401
  deviceId: number(),
27344
27402
  config: RecordingConfigSchema
@@ -33426,6 +33484,12 @@ Object.freeze({
33426
33484
  addonId: null,
33427
33485
  access: "view"
33428
33486
  },
33487
+ "notificationRules.resolveArtifactUrl": {
33488
+ capName: "notification-rules",
33489
+ capScope: "system",
33490
+ addonId: null,
33491
+ access: "view"
33492
+ },
33429
33493
  "notificationRules.setAlarmConfig": {
33430
33494
  capName: "notification-rules",
33431
33495
  capScope: "system",
@@ -34830,6 +34894,12 @@ Object.freeze({
34830
34894
  addonId: null,
34831
34895
  access: "view"
34832
34896
  },
34897
+ "recording.readWindowBytes": {
34898
+ capName: "recording",
34899
+ capScope: "system",
34900
+ addonId: null,
34901
+ access: "view"
34902
+ },
34833
34903
  "recording.refreshStorageLocationsForMigration": {
34834
34904
  capName: "recording",
34835
34905
  capScope: "system",
@@ -37660,6 +37730,11 @@ Object.freeze({
37660
37730
  form: "single",
37661
37731
  optional: false
37662
37732
  }],
37733
+ "recording.readWindowBytes": [{
37734
+ name: "deviceId",
37735
+ form: "single",
37736
+ optional: false
37737
+ }],
37663
37738
  "recording.relocateFootage": [{
37664
37739
  name: "deviceId",
37665
37740
  form: "single",
package/dist/addon.mjs CHANGED
@@ -16025,7 +16025,23 @@ var NcHistoryEntrySchema = object({
16025
16025
  updatedAt: number(),
16026
16026
  /** Failure detail — present on a `dead` row. */
16027
16027
  error: string().optional(),
16028
- subject: NcHistorySubjectSchema
16028
+ subject: NcHistorySubjectSchema,
16029
+ /**
16030
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
16031
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
16032
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
16033
+ * every delivery attempt). Absent on a row still pending/dead, a row
16034
+ * delivered before this field shipped, or a wiring with no artefact index.
16035
+ *
16036
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
16037
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
16038
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
16039
+ * also answers `null` for an id whose artefact has since expired past the
16040
+ * retained shelf's own age bound — the degrade a caller (the Home
16041
+ * Assistant export) must render as "no image right now", never as a
16042
+ * broken link.
16043
+ */
16044
+ artifactIds: array(string().min(1)).optional()
16029
16045
  });
16030
16046
  /**
16031
16047
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16252,7 +16268,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16252
16268
  }), method(object({}), object({
16253
16269
  catalog: array(NcConditionDescriptorSchema),
16254
16270
  taxonomy: NcTaxonomySchema.optional()
16255
- })), 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 }), {
16271
+ })), 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 }), {
16256
16272
  kind: "mutation",
16257
16273
  caller: "required"
16258
16274
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27289,6 +27305,39 @@ var ReadGopBytesResultSchema = object({
27289
27305
  /** Media ms the returned fragment covers. */
27290
27306
  gopDurMs: number()
27291
27307
  });
27308
+ /**
27309
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27310
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27311
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27312
+ * a replay needs several seconds of native pixels, not one frame.
27313
+ *
27314
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27315
+ * is `false` when the returned bytes were cut short by the read's own safety
27316
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27317
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27318
+ * degradation: a window whose end falls past the covering segment would need
27319
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27320
+ * not one standalone-demuxable stream — the caller's answer is to request a
27321
+ * shorter window or one aligned to a single segment, not to receive spliced
27322
+ * bytes nothing has proven decodable.
27323
+ */
27324
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27325
+ kind: literal("ok"),
27326
+ data: _instanceof(Uint8Array),
27327
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27328
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27329
+ gopStartMs: number(),
27330
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27331
+ gopDurMs: number(),
27332
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27333
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27334
+ reachesRequestedEnd: boolean()
27335
+ }), object({
27336
+ kind: literal("spans-multiple-segments"),
27337
+ /** Where the covering segment's own footage runs out — informational,
27338
+ * not a retry hint (retrying the same window would refuse again). */
27339
+ segmentEndMs: number()
27340
+ })]);
27292
27341
  method(object({
27293
27342
  deviceId: number(),
27294
27343
  fromMs: number(),
@@ -27339,6 +27388,15 @@ method(object({
27339
27388
  }), ReadGopBytesResultSchema, {
27340
27389
  kind: "query",
27341
27390
  auth: "admin"
27391
+ }), method(object({
27392
+ deviceId: number(),
27393
+ profile: string(),
27394
+ startMs: number(),
27395
+ fromMs: number(),
27396
+ toMs: number()
27397
+ }), ReadWindowBytesResultSchema, {
27398
+ kind: "query",
27399
+ auth: "admin"
27342
27400
  }), method(object({
27343
27401
  deviceId: number(),
27344
27402
  config: RecordingConfigSchema
@@ -33426,6 +33484,12 @@ Object.freeze({
33426
33484
  addonId: null,
33427
33485
  access: "view"
33428
33486
  },
33487
+ "notificationRules.resolveArtifactUrl": {
33488
+ capName: "notification-rules",
33489
+ capScope: "system",
33490
+ addonId: null,
33491
+ access: "view"
33492
+ },
33429
33493
  "notificationRules.setAlarmConfig": {
33430
33494
  capName: "notification-rules",
33431
33495
  capScope: "system",
@@ -34830,6 +34894,12 @@ Object.freeze({
34830
34894
  addonId: null,
34831
34895
  access: "view"
34832
34896
  },
34897
+ "recording.readWindowBytes": {
34898
+ capName: "recording",
34899
+ capScope: "system",
34900
+ addonId: null,
34901
+ access: "view"
34902
+ },
34833
34903
  "recording.refreshStorageLocationsForMigration": {
34834
34904
  capName: "recording",
34835
34905
  capScope: "system",
@@ -37660,6 +37730,11 @@ Object.freeze({
37660
37730
  form: "single",
37661
37731
  optional: false
37662
37732
  }],
37733
+ "recording.readWindowBytes": [{
37734
+ name: "deviceId",
37735
+ form: "single",
37736
+ optional: false
37737
+ }],
37663
37738
  "recording.relocateFootage": [{
37664
37739
  name: "deviceId",
37665
37740
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-import-alexa",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",