@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.
|
|
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",
|