@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 +77 -2
- package/dist/addon.mjs +77 -2
- package/package.json +1 -1
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.
|
|
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",
|