@camstack/addon-provider-rademacher 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
|
@@ -16767,7 +16767,23 @@ var NcHistoryEntrySchema = object({
|
|
|
16767
16767
|
updatedAt: number(),
|
|
16768
16768
|
/** Failure detail — present on a `dead` row. */
|
|
16769
16769
|
error: string().optional(),
|
|
16770
|
-
subject: NcHistorySubjectSchema
|
|
16770
|
+
subject: NcHistorySubjectSchema,
|
|
16771
|
+
/**
|
|
16772
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
16773
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
16774
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
16775
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
16776
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
16777
|
+
*
|
|
16778
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
16779
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
16780
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
16781
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
16782
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
16783
|
+
* Assistant export) must render as "no image right now", never as a
|
|
16784
|
+
* broken link.
|
|
16785
|
+
*/
|
|
16786
|
+
artifactIds: array(string().min(1)).optional()
|
|
16771
16787
|
});
|
|
16772
16788
|
/**
|
|
16773
16789
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -16994,7 +17010,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
16994
17010
|
}), method(object({}), object({
|
|
16995
17011
|
catalog: array(NcConditionDescriptorSchema),
|
|
16996
17012
|
taxonomy: NcTaxonomySchema.optional()
|
|
16997
|
-
})), 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 }), {
|
|
17013
|
+
})), 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 }), {
|
|
16998
17014
|
kind: "mutation",
|
|
16999
17015
|
caller: "required"
|
|
17000
17016
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -28014,6 +28030,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
28014
28030
|
/** Media ms the returned fragment covers. */
|
|
28015
28031
|
gopDurMs: number()
|
|
28016
28032
|
});
|
|
28033
|
+
/**
|
|
28034
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
28035
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
28036
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
28037
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
28038
|
+
*
|
|
28039
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
28040
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
28041
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
28042
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
28043
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
28044
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
28045
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
28046
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
28047
|
+
* bytes nothing has proven decodable.
|
|
28048
|
+
*/
|
|
28049
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
28050
|
+
kind: literal("ok"),
|
|
28051
|
+
data: _instanceof(Uint8Array),
|
|
28052
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
28053
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
28054
|
+
gopStartMs: number(),
|
|
28055
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
28056
|
+
gopDurMs: number(),
|
|
28057
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
28058
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
28059
|
+
reachesRequestedEnd: boolean()
|
|
28060
|
+
}), object({
|
|
28061
|
+
kind: literal("spans-multiple-segments"),
|
|
28062
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
28063
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
28064
|
+
segmentEndMs: number()
|
|
28065
|
+
})]);
|
|
28017
28066
|
method(object({
|
|
28018
28067
|
deviceId: number(),
|
|
28019
28068
|
fromMs: number(),
|
|
@@ -28064,6 +28113,15 @@ method(object({
|
|
|
28064
28113
|
}), ReadGopBytesResultSchema, {
|
|
28065
28114
|
kind: "query",
|
|
28066
28115
|
auth: "admin"
|
|
28116
|
+
}), method(object({
|
|
28117
|
+
deviceId: number(),
|
|
28118
|
+
profile: string(),
|
|
28119
|
+
startMs: number(),
|
|
28120
|
+
fromMs: number(),
|
|
28121
|
+
toMs: number()
|
|
28122
|
+
}), ReadWindowBytesResultSchema, {
|
|
28123
|
+
kind: "query",
|
|
28124
|
+
auth: "admin"
|
|
28067
28125
|
}), method(object({
|
|
28068
28126
|
deviceId: number(),
|
|
28069
28127
|
config: RecordingConfigSchema
|
|
@@ -34151,6 +34209,12 @@ Object.freeze({
|
|
|
34151
34209
|
addonId: null,
|
|
34152
34210
|
access: "view"
|
|
34153
34211
|
},
|
|
34212
|
+
"notificationRules.resolveArtifactUrl": {
|
|
34213
|
+
capName: "notification-rules",
|
|
34214
|
+
capScope: "system",
|
|
34215
|
+
addonId: null,
|
|
34216
|
+
access: "view"
|
|
34217
|
+
},
|
|
34154
34218
|
"notificationRules.setAlarmConfig": {
|
|
34155
34219
|
capName: "notification-rules",
|
|
34156
34220
|
capScope: "system",
|
|
@@ -35555,6 +35619,12 @@ Object.freeze({
|
|
|
35555
35619
|
addonId: null,
|
|
35556
35620
|
access: "view"
|
|
35557
35621
|
},
|
|
35622
|
+
"recording.readWindowBytes": {
|
|
35623
|
+
capName: "recording",
|
|
35624
|
+
capScope: "system",
|
|
35625
|
+
addonId: null,
|
|
35626
|
+
access: "view"
|
|
35627
|
+
},
|
|
35558
35628
|
"recording.refreshStorageLocationsForMigration": {
|
|
35559
35629
|
capName: "recording",
|
|
35560
35630
|
capScope: "system",
|
|
@@ -38385,6 +38455,11 @@ Object.freeze({
|
|
|
38385
38455
|
form: "single",
|
|
38386
38456
|
optional: false
|
|
38387
38457
|
}],
|
|
38458
|
+
"recording.readWindowBytes": [{
|
|
38459
|
+
name: "deviceId",
|
|
38460
|
+
form: "single",
|
|
38461
|
+
optional: false
|
|
38462
|
+
}],
|
|
38388
38463
|
"recording.relocateFootage": [{
|
|
38389
38464
|
name: "deviceId",
|
|
38390
38465
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -16766,7 +16766,23 @@ var NcHistoryEntrySchema = object({
|
|
|
16766
16766
|
updatedAt: number(),
|
|
16767
16767
|
/** Failure detail — present on a `dead` row. */
|
|
16768
16768
|
error: string().optional(),
|
|
16769
|
-
subject: NcHistorySubjectSchema
|
|
16769
|
+
subject: NcHistorySubjectSchema,
|
|
16770
|
+
/**
|
|
16771
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
16772
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
16773
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
16774
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
16775
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
16776
|
+
*
|
|
16777
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
16778
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
16779
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
16780
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
16781
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
16782
|
+
* Assistant export) must render as "no image right now", never as a
|
|
16783
|
+
* broken link.
|
|
16784
|
+
*/
|
|
16785
|
+
artifactIds: array(string().min(1)).optional()
|
|
16770
16786
|
});
|
|
16771
16787
|
/**
|
|
16772
16788
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -16993,7 +17009,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
16993
17009
|
}), method(object({}), object({
|
|
16994
17010
|
catalog: array(NcConditionDescriptorSchema),
|
|
16995
17011
|
taxonomy: NcTaxonomySchema.optional()
|
|
16996
|
-
})), 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 }), {
|
|
17012
|
+
})), 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 }), {
|
|
16997
17013
|
kind: "mutation",
|
|
16998
17014
|
caller: "required"
|
|
16999
17015
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -28013,6 +28029,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
28013
28029
|
/** Media ms the returned fragment covers. */
|
|
28014
28030
|
gopDurMs: number()
|
|
28015
28031
|
});
|
|
28032
|
+
/**
|
|
28033
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
28034
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
28035
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
28036
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
28037
|
+
*
|
|
28038
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
28039
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
28040
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
28041
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
28042
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
28043
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
28044
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
28045
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
28046
|
+
* bytes nothing has proven decodable.
|
|
28047
|
+
*/
|
|
28048
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
28049
|
+
kind: literal("ok"),
|
|
28050
|
+
data: _instanceof(Uint8Array),
|
|
28051
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
28052
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
28053
|
+
gopStartMs: number(),
|
|
28054
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
28055
|
+
gopDurMs: number(),
|
|
28056
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
28057
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
28058
|
+
reachesRequestedEnd: boolean()
|
|
28059
|
+
}), object({
|
|
28060
|
+
kind: literal("spans-multiple-segments"),
|
|
28061
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
28062
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
28063
|
+
segmentEndMs: number()
|
|
28064
|
+
})]);
|
|
28016
28065
|
method(object({
|
|
28017
28066
|
deviceId: number(),
|
|
28018
28067
|
fromMs: number(),
|
|
@@ -28063,6 +28112,15 @@ method(object({
|
|
|
28063
28112
|
}), ReadGopBytesResultSchema, {
|
|
28064
28113
|
kind: "query",
|
|
28065
28114
|
auth: "admin"
|
|
28115
|
+
}), method(object({
|
|
28116
|
+
deviceId: number(),
|
|
28117
|
+
profile: string(),
|
|
28118
|
+
startMs: number(),
|
|
28119
|
+
fromMs: number(),
|
|
28120
|
+
toMs: number()
|
|
28121
|
+
}), ReadWindowBytesResultSchema, {
|
|
28122
|
+
kind: "query",
|
|
28123
|
+
auth: "admin"
|
|
28066
28124
|
}), method(object({
|
|
28067
28125
|
deviceId: number(),
|
|
28068
28126
|
config: RecordingConfigSchema
|
|
@@ -34150,6 +34208,12 @@ Object.freeze({
|
|
|
34150
34208
|
addonId: null,
|
|
34151
34209
|
access: "view"
|
|
34152
34210
|
},
|
|
34211
|
+
"notificationRules.resolveArtifactUrl": {
|
|
34212
|
+
capName: "notification-rules",
|
|
34213
|
+
capScope: "system",
|
|
34214
|
+
addonId: null,
|
|
34215
|
+
access: "view"
|
|
34216
|
+
},
|
|
34153
34217
|
"notificationRules.setAlarmConfig": {
|
|
34154
34218
|
capName: "notification-rules",
|
|
34155
34219
|
capScope: "system",
|
|
@@ -35554,6 +35618,12 @@ Object.freeze({
|
|
|
35554
35618
|
addonId: null,
|
|
35555
35619
|
access: "view"
|
|
35556
35620
|
},
|
|
35621
|
+
"recording.readWindowBytes": {
|
|
35622
|
+
capName: "recording",
|
|
35623
|
+
capScope: "system",
|
|
35624
|
+
addonId: null,
|
|
35625
|
+
access: "view"
|
|
35626
|
+
},
|
|
35557
35627
|
"recording.refreshStorageLocationsForMigration": {
|
|
35558
35628
|
capName: "recording",
|
|
35559
35629
|
capScope: "system",
|
|
@@ -38384,6 +38454,11 @@ Object.freeze({
|
|
|
38384
38454
|
form: "single",
|
|
38385
38455
|
optional: false
|
|
38386
38456
|
}],
|
|
38457
|
+
"recording.readWindowBytes": [{
|
|
38458
|
+
name: "deviceId",
|
|
38459
|
+
form: "single",
|
|
38460
|
+
optional: false
|
|
38461
|
+
}],
|
|
38387
38462
|
"recording.relocateFootage": [{
|
|
38388
38463
|
name: "deviceId",
|
|
38389
38464
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-rademacher",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.30",
|
|
4
4
|
"description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|