@camstack/addon-provider-unraid 0.1.9 → 0.1.11
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 +220 -15
- package/dist/addon.mjs +220 -15
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
//#region ../types/dist/event-category-
|
|
2
|
+
//#region ../types/dist/event-category-H4AVePnn.mjs
|
|
3
3
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4
4
|
EventCategory["SystemBoot"] = "system.boot";
|
|
5
5
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -149,6 +149,9 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
149
149
|
EventCategory["RecordingSegmentWritten"] = "recording.segment.written";
|
|
150
150
|
EventCategory["RecordingPolicyFallback"] = "recording.policy.fallback";
|
|
151
151
|
EventCategory["RecordingRetentionCompleted"] = "recording.retention.completed";
|
|
152
|
+
/** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
|
|
153
|
+
* thumb is a scrub gap the recorder's keyframe backfill covers. */
|
|
154
|
+
EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
|
|
152
155
|
EventCategory["DetectionEvent"] = "detection.event";
|
|
153
156
|
EventCategory["SessionTrackNew"] = "session.track.new";
|
|
154
157
|
EventCategory["SessionTrackExpired"] = "session.track.expired";
|
|
@@ -7248,6 +7251,24 @@ var RecordingRetentionSchema = object({
|
|
|
7248
7251
|
maxSizeGb: number().min(0).optional()
|
|
7249
7252
|
});
|
|
7250
7253
|
/**
|
|
7254
|
+
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7255
|
+
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7256
|
+
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7257
|
+
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7258
|
+
*
|
|
7259
|
+
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7260
|
+
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7261
|
+
* preset changed over time renders every historical window at the dims it was
|
|
7262
|
+
* written with.
|
|
7263
|
+
*/
|
|
7264
|
+
var ScrubThumbnailPresetSchema = _enum([
|
|
7265
|
+
"minimal",
|
|
7266
|
+
"low",
|
|
7267
|
+
"standard",
|
|
7268
|
+
"high",
|
|
7269
|
+
"max"
|
|
7270
|
+
]);
|
|
7271
|
+
/**
|
|
7251
7272
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7252
7273
|
*
|
|
7253
7274
|
* `mode` is the authoritative storage choice; `schedule`/`triggers`/`pre`/`post`
|
|
@@ -7284,7 +7305,14 @@ var RecordingConfigSchema = object({
|
|
|
7284
7305
|
* derived into bands once via `migrateConfigToBands`.
|
|
7285
7306
|
*/
|
|
7286
7307
|
bands: array(RecordingBandSchema).optional(),
|
|
7287
|
-
retention: RecordingRetentionSchema.optional()
|
|
7308
|
+
retention: RecordingRetentionSchema.optional(),
|
|
7309
|
+
/**
|
|
7310
|
+
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7311
|
+
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7312
|
+
* windows only — existing sheets are immutable, and each window's index
|
|
7313
|
+
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7314
|
+
*/
|
|
7315
|
+
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7288
7316
|
});
|
|
7289
7317
|
/**
|
|
7290
7318
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -10796,10 +10824,23 @@ var deviceDiscoveryCapability = {
|
|
|
10796
10824
|
}
|
|
10797
10825
|
};
|
|
10798
10826
|
/**
|
|
10799
|
-
* Doorbell button cap.
|
|
10800
|
-
*
|
|
10801
|
-
*
|
|
10802
|
-
*
|
|
10827
|
+
* Doorbell button cap. Two kinds of providers coexist behind this cap
|
|
10828
|
+
* name (same pattern as `snapshot`):
|
|
10829
|
+
*
|
|
10830
|
+
* - **Native** providers: registered per-device by device-driver
|
|
10831
|
+
* addons via `ctx.registerNativeCap` — either on a
|
|
10832
|
+
* `DeviceType.Button` accessory with `role: DeviceRole.Doorbell`,
|
|
10833
|
+
* or directly on the camera (Reolink registers at camera level).
|
|
10834
|
+
* Emits an `onPressed` event every time the firmware pushes a
|
|
10835
|
+
* ring; status tracks the last press and a pressCount since start
|
|
10836
|
+
* (diagnostic).
|
|
10837
|
+
*
|
|
10838
|
+
* - **Wrapper** provider: the `virtual-doorbell` system builtin
|
|
10839
|
+
* (`@camstack/system/builtins/doorbell`). Turns ANY binary-ish
|
|
10840
|
+
* device (contact / switch / event-emitter …) into a doorbell for
|
|
10841
|
+
* a camera. `defaultActive: false` — the operator explicitly binds
|
|
10842
|
+
* it per camera in the device-bindings UI, then picks the source
|
|
10843
|
+
* device + trigger in the per-device settings.
|
|
10803
10844
|
*
|
|
10804
10845
|
* The DeviceEventPropagator re-emits `onPressed` on the camera parent
|
|
10805
10846
|
* — subscribers listening at the camera level receive ring events
|
|
@@ -10820,7 +10861,10 @@ var doorbellCapability = {
|
|
|
10820
10861
|
scope: "device",
|
|
10821
10862
|
deviceNative: true,
|
|
10822
10863
|
mode: "singleton",
|
|
10823
|
-
|
|
10864
|
+
kind: "wrapper",
|
|
10865
|
+
defaultActive: false,
|
|
10866
|
+
deviceTypes: [DeviceType.Button, DeviceType.Camera],
|
|
10867
|
+
exposesDeviceSettings: true,
|
|
10824
10868
|
methods: {},
|
|
10825
10869
|
events: {
|
|
10826
10870
|
/**
|
|
@@ -17172,6 +17216,14 @@ var ConfigEntrySchema = object({
|
|
|
17172
17216
|
value: unknown(),
|
|
17173
17217
|
description: string().optional()
|
|
17174
17218
|
});
|
|
17219
|
+
var DeviceLinkModeSchema = _enum(["auto", "manual"]);
|
|
17220
|
+
/** One resolved linked device — the compact projection consumers need. */
|
|
17221
|
+
var LinkedDeviceSchema = object({
|
|
17222
|
+
deviceId: number(),
|
|
17223
|
+
name: string(),
|
|
17224
|
+
location: string().nullable(),
|
|
17225
|
+
features: array(string())
|
|
17226
|
+
});
|
|
17175
17227
|
var SavedDeviceRowSchema = object({
|
|
17176
17228
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
17177
17229
|
id: number(),
|
|
@@ -17393,7 +17445,10 @@ method(object({
|
|
|
17393
17445
|
}), _void(), {
|
|
17394
17446
|
kind: "mutation",
|
|
17395
17447
|
auth: "admin"
|
|
17396
|
-
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }),
|
|
17448
|
+
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
17449
|
+
mode: DeviceLinkModeSchema,
|
|
17450
|
+
devices: array(LinkedDeviceSchema)
|
|
17451
|
+
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
17397
17452
|
deviceId: number(),
|
|
17398
17453
|
values: record(string(), unknown())
|
|
17399
17454
|
}), object({ success: literal(true) }), {
|
|
@@ -18662,6 +18717,61 @@ var EventKindSchema = _enum([
|
|
|
18662
18717
|
"object",
|
|
18663
18718
|
"audio"
|
|
18664
18719
|
]);
|
|
18720
|
+
/**
|
|
18721
|
+
* Spatial filter for `listTracks` — the rect + polygon variants of the shared
|
|
18722
|
+
* MaskShape vocabulary (see `mask-shape.ts`). Coordinates are NORMALIZED 0..1
|
|
18723
|
+
* of the camera frame (top-left origin), matching the drawing-plane editor.
|
|
18724
|
+
*/
|
|
18725
|
+
var TrackZoneFilterSchema = discriminatedUnion("kind", [MaskRectShapeSchema, MaskPolygonShapeSchema]);
|
|
18726
|
+
/** Closed icon vocabulary so clients render a known glyph per kind. */
|
|
18727
|
+
var EventKindIconSchema = _enum([
|
|
18728
|
+
"motion",
|
|
18729
|
+
"audio",
|
|
18730
|
+
"person",
|
|
18731
|
+
"vehicle",
|
|
18732
|
+
"animal",
|
|
18733
|
+
"door",
|
|
18734
|
+
"pir",
|
|
18735
|
+
"smoke",
|
|
18736
|
+
"water",
|
|
18737
|
+
"button",
|
|
18738
|
+
"generic"
|
|
18739
|
+
]);
|
|
18740
|
+
var EventKindCategorySchema = _enum([
|
|
18741
|
+
"motion",
|
|
18742
|
+
"audio",
|
|
18743
|
+
"detection",
|
|
18744
|
+
"sensor",
|
|
18745
|
+
"custom"
|
|
18746
|
+
]);
|
|
18747
|
+
var EventKindDescriptorSchema = object({
|
|
18748
|
+
/** Stable kind id (e.g. 'motion', 'person', 'contact'). */
|
|
18749
|
+
kind: string(),
|
|
18750
|
+
label: string(),
|
|
18751
|
+
/** Hex color for timeline/legend rendering. */
|
|
18752
|
+
color: string(),
|
|
18753
|
+
icon: EventKindIconSchema,
|
|
18754
|
+
category: EventKindCategorySchema,
|
|
18755
|
+
/** Which cap + device contributes this kind. For built-ins the camera
|
|
18756
|
+
* itself; for sensor kinds the LINKED source device. */
|
|
18757
|
+
source: object({
|
|
18758
|
+
capName: string(),
|
|
18759
|
+
deviceId: number()
|
|
18760
|
+
})
|
|
18761
|
+
});
|
|
18762
|
+
var SensorEventSchema = object({
|
|
18763
|
+
id: string(),
|
|
18764
|
+
/** The CAMERA the event is attributed to (a sensor linked to N cameras
|
|
18765
|
+
* yields N rows, one per camera). */
|
|
18766
|
+
deviceId: number(),
|
|
18767
|
+
/** The linked sensor device whose state changed. */
|
|
18768
|
+
sourceDeviceId: number(),
|
|
18769
|
+
/** Event kind id — matches an `EventKindDescriptor.kind`. */
|
|
18770
|
+
kind: string(),
|
|
18771
|
+
/** Snapshot of the sensor cap's runtime-state slice at the change. */
|
|
18772
|
+
value: record(string(), unknown()).nullable(),
|
|
18773
|
+
timestamp: number()
|
|
18774
|
+
});
|
|
18665
18775
|
var TrackPositionSchema = object({
|
|
18666
18776
|
x: number(),
|
|
18667
18777
|
y: number(),
|
|
@@ -18675,6 +18785,30 @@ var TrackSnapshotSchema = object({
|
|
|
18675
18785
|
mediaKey: string()
|
|
18676
18786
|
});
|
|
18677
18787
|
/**
|
|
18788
|
+
* Normalized 0..1 trajectory envelope (min/max over every position bbox,
|
|
18789
|
+
* divided by the track's detection-frame dims), computed at persist time.
|
|
18790
|
+
* Absent when the frame dims were unknown when the track was persisted
|
|
18791
|
+
* (legacy rows / dims-less sources) and on active (in-RAM) tracks.
|
|
18792
|
+
*/
|
|
18793
|
+
var TrackEnvelopeSchema = object({
|
|
18794
|
+
minX: number(),
|
|
18795
|
+
minY: number(),
|
|
18796
|
+
maxX: number(),
|
|
18797
|
+
maxY: number()
|
|
18798
|
+
});
|
|
18799
|
+
/**
|
|
18800
|
+
* Row projection for track list queries. `full` (default) returns the
|
|
18801
|
+
* complete Track including the frame-rate `positions[]` history and the
|
|
18802
|
+
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
18803
|
+
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
18804
|
+
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
18805
|
+
* zonesVisited, bestEventId, envelope) and returns `positions` /
|
|
18806
|
+
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
18807
|
+
* `getTrack`. Mirrors the event-store `projection` convention
|
|
18808
|
+
* (`getObjectEvents` et al.).
|
|
18809
|
+
*/
|
|
18810
|
+
var TrackProjectionSchema = _enum(["full", "slim"]);
|
|
18811
|
+
/**
|
|
18678
18812
|
* One audio-classification label heard on the track's camera while the
|
|
18679
18813
|
* track was alive, aggregated per label. An "episode" is one persisted
|
|
18680
18814
|
* audio event (the confident-classification path: score ≥ the device's
|
|
@@ -18725,7 +18859,11 @@ var TrackSchema = object({
|
|
|
18725
18859
|
/** Audio-classification labels heard on the camera during the track's
|
|
18726
18860
|
* life (score ≥ device `classificationMinScore`), aggregated per label.
|
|
18727
18861
|
* Absent on legacy rows / tracks with no confident audio. */
|
|
18728
|
-
audioLabels: array(TrackAudioLabelSchema).readonly().optional()
|
|
18862
|
+
audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
|
|
18863
|
+
/** Normalized 0..1 trajectory envelope (see {@link TrackEnvelopeSchema}).
|
|
18864
|
+
* Populated from the persisted envelope columns on historical reads;
|
|
18865
|
+
* absent on legacy rows, dims-less tracks and active (in-RAM) tracks. */
|
|
18866
|
+
envelope: TrackEnvelopeSchema.optional()
|
|
18729
18867
|
});
|
|
18730
18868
|
var BaseEventFields = {
|
|
18731
18869
|
id: string(),
|
|
@@ -18835,11 +18973,13 @@ var MediaFileSchema = object({
|
|
|
18835
18973
|
sizeBytes: number(),
|
|
18836
18974
|
timestamp: number()
|
|
18837
18975
|
});
|
|
18976
|
+
var DEFAULT_EVENT_QUERY_LIMIT = 1e3;
|
|
18977
|
+
var MAX_EVENT_QUERY_LIMIT = 5e3;
|
|
18838
18978
|
var DeviceEventQueryInput = object({
|
|
18839
18979
|
deviceId: number(),
|
|
18840
18980
|
since: number().optional(),
|
|
18841
18981
|
until: number().optional(),
|
|
18842
|
-
limit: number().int().min(1).max(
|
|
18982
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT),
|
|
18843
18983
|
/** `slim` drops heavy JSON fields (regions/bbox/zones) and carries an
|
|
18844
18984
|
* optional `mediaUrl` (populated by B5). `full` (default) keeps today's
|
|
18845
18985
|
* exact behaviour. Callers may omit this field — the store defaults to
|
|
@@ -18847,6 +18987,27 @@ var DeviceEventQueryInput = object({
|
|
|
18847
18987
|
projection: _enum(["full", "slim"]).optional()
|
|
18848
18988
|
});
|
|
18849
18989
|
var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
|
|
18990
|
+
var RecentTracksQueryInput = object({
|
|
18991
|
+
/** Devices to merge. An empty array yields `{ tracks: [], nextCursor: null }`. */
|
|
18992
|
+
deviceIds: array(number()),
|
|
18993
|
+
/** Window lower bound on `lastSeen` (inclusive). */
|
|
18994
|
+
since: number().optional(),
|
|
18995
|
+
/** Window upper bound on `lastSeen` (inclusive). */
|
|
18996
|
+
until: number().optional(),
|
|
18997
|
+
/** Page size. Default 200, max 1000. */
|
|
18998
|
+
limit: number().int().min(1).max(1e3).default(200),
|
|
18999
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`.
|
|
19000
|
+
* Encodes the (lastSeen, trackId) sort position — treat as opaque. */
|
|
19001
|
+
cursor: string().optional(),
|
|
19002
|
+
/** See {@link TrackProjectionSchema}. Default `full`. */
|
|
19003
|
+
projection: TrackProjectionSchema.optional()
|
|
19004
|
+
});
|
|
19005
|
+
var RecentTracksPageSchema = object({
|
|
19006
|
+
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
19007
|
+
tracks: array(TrackSchema).readonly(),
|
|
19008
|
+
/** Cursor for the next page, or null when this page is the last. */
|
|
19009
|
+
nextCursor: string().nullable()
|
|
19010
|
+
});
|
|
18850
19011
|
var KeyEventQueryInput = object({
|
|
18851
19012
|
deviceId: number(),
|
|
18852
19013
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -18929,11 +19090,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18929
19090
|
deviceId: number(),
|
|
18930
19091
|
since: number().optional(),
|
|
18931
19092
|
until: number().optional(),
|
|
18932
|
-
limit: number().optional()
|
|
18933
|
-
|
|
19093
|
+
limit: number().optional(),
|
|
19094
|
+
/** Spatial filter — only tracks whose trajectory intersects the zone
|
|
19095
|
+
* (normalized 0..1 rect or polygon). SQL-prefiltered on the persisted
|
|
19096
|
+
* envelope columns, then precisely tested per position. Tracks with
|
|
19097
|
+
* an unknown envelope (no frame dims at persist time) always match. */
|
|
19098
|
+
zone: TrackZoneFilterSchema.optional(),
|
|
19099
|
+
/** See {@link TrackProjectionSchema}. Default `full` (backward
|
|
19100
|
+
* compatible — omitting the field keeps today's exact behaviour). */
|
|
19101
|
+
projection: TrackProjectionSchema.optional()
|
|
19102
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
18934
19103
|
kind: "mutation",
|
|
18935
19104
|
auth: "admin"
|
|
18936
|
-
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(
|
|
19105
|
+
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({
|
|
19106
|
+
deviceId: number(),
|
|
19107
|
+
since: number().optional(),
|
|
19108
|
+
until: number().optional(),
|
|
19109
|
+
kinds: array(string()).optional(),
|
|
19110
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
|
|
19111
|
+
}), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
|
|
18937
19112
|
deviceId: number(),
|
|
18938
19113
|
since: number(),
|
|
18939
19114
|
until: number(),
|
|
@@ -22151,7 +22326,12 @@ var RecordingStorageUsageSchema = object({
|
|
|
22151
22326
|
/**
|
|
22152
22327
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
22153
22328
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
22154
|
-
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
22329
|
+
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
22330
|
+
* and the backward covered edge `prevEndMs` (exclusive end of the nearest
|
|
22331
|
+
* footage behind the epoch; `null` when none — optional so older providers
|
|
22332
|
+
* that omit it stay valid). `prevEndMs` lets a backward frame-step hop the
|
|
22333
|
+
* small inter-segment cracks (durMs under-covers the span to the next
|
|
22334
|
+
* startMs by ~11-17 ms) instead of no-opping at a segment head.
|
|
22155
22335
|
*/
|
|
22156
22336
|
var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
22157
22337
|
kind: literal("segment"),
|
|
@@ -22160,7 +22340,8 @@ var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
|
22160
22340
|
bytes: number()
|
|
22161
22341
|
}), object({
|
|
22162
22342
|
kind: literal("gap"),
|
|
22163
|
-
nearestEdgeMs: number().nullable()
|
|
22343
|
+
nearestEdgeMs: number().nullable(),
|
|
22344
|
+
prevEndMs: number().nullable().optional()
|
|
22164
22345
|
})]);
|
|
22165
22346
|
/** Raw bytes of one finalized footage segment (read off disk on the recording node). */
|
|
22166
22347
|
var ReadSegmentBytesResultSchema = object({ data: _instanceof(Uint8Array) });
|
|
@@ -23729,6 +23910,12 @@ Object.freeze({
|
|
|
23729
23910
|
addonId: null,
|
|
23730
23911
|
access: "view"
|
|
23731
23912
|
},
|
|
23913
|
+
"deviceManager.getLinkedDevices": {
|
|
23914
|
+
capName: "device-manager",
|
|
23915
|
+
capScope: "system",
|
|
23916
|
+
addonId: null,
|
|
23917
|
+
access: "view"
|
|
23918
|
+
},
|
|
23732
23919
|
"deviceManager.getRoleDisplayDefaults": {
|
|
23733
23920
|
capName: "device-manager",
|
|
23734
23921
|
capScope: "system",
|
|
@@ -25283,6 +25470,12 @@ Object.freeze({
|
|
|
25283
25470
|
addonId: null,
|
|
25284
25471
|
access: "view"
|
|
25285
25472
|
},
|
|
25473
|
+
"pipelineAnalytics.getSensorEvents": {
|
|
25474
|
+
capName: "pipeline-analytics",
|
|
25475
|
+
capScope: "device",
|
|
25476
|
+
addonId: null,
|
|
25477
|
+
access: "view"
|
|
25478
|
+
},
|
|
25286
25479
|
"pipelineAnalytics.getTrack": {
|
|
25287
25480
|
capName: "pipeline-analytics",
|
|
25288
25481
|
capScope: "device",
|
|
@@ -25295,6 +25488,18 @@ Object.freeze({
|
|
|
25295
25488
|
addonId: null,
|
|
25296
25489
|
access: "view"
|
|
25297
25490
|
},
|
|
25491
|
+
"pipelineAnalytics.listEventKinds": {
|
|
25492
|
+
capName: "pipeline-analytics",
|
|
25493
|
+
capScope: "device",
|
|
25494
|
+
addonId: null,
|
|
25495
|
+
access: "view"
|
|
25496
|
+
},
|
|
25497
|
+
"pipelineAnalytics.listRecentTracks": {
|
|
25498
|
+
capName: "pipeline-analytics",
|
|
25499
|
+
capScope: "device",
|
|
25500
|
+
addonId: null,
|
|
25501
|
+
access: "view"
|
|
25502
|
+
},
|
|
25298
25503
|
"pipelineAnalytics.listTracks": {
|
|
25299
25504
|
capName: "pipeline-analytics",
|
|
25300
25505
|
capScope: "device",
|
package/dist/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../types/dist/event-category-
|
|
1
|
+
//#region ../types/dist/event-category-H4AVePnn.mjs
|
|
2
2
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
3
3
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4
4
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -148,6 +148,9 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
148
148
|
EventCategory["RecordingSegmentWritten"] = "recording.segment.written";
|
|
149
149
|
EventCategory["RecordingPolicyFallback"] = "recording.policy.fallback";
|
|
150
150
|
EventCategory["RecordingRetentionCompleted"] = "recording.retention.completed";
|
|
151
|
+
/** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
|
|
152
|
+
* thumb is a scrub gap the recorder's keyframe backfill covers. */
|
|
153
|
+
EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
|
|
151
154
|
EventCategory["DetectionEvent"] = "detection.event";
|
|
152
155
|
EventCategory["SessionTrackNew"] = "session.track.new";
|
|
153
156
|
EventCategory["SessionTrackExpired"] = "session.track.expired";
|
|
@@ -7247,6 +7250,24 @@ var RecordingRetentionSchema = object({
|
|
|
7247
7250
|
maxSizeGb: number().min(0).optional()
|
|
7248
7251
|
});
|
|
7249
7252
|
/**
|
|
7253
|
+
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7254
|
+
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7255
|
+
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7256
|
+
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7257
|
+
*
|
|
7258
|
+
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7259
|
+
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7260
|
+
* preset changed over time renders every historical window at the dims it was
|
|
7261
|
+
* written with.
|
|
7262
|
+
*/
|
|
7263
|
+
var ScrubThumbnailPresetSchema = _enum([
|
|
7264
|
+
"minimal",
|
|
7265
|
+
"low",
|
|
7266
|
+
"standard",
|
|
7267
|
+
"high",
|
|
7268
|
+
"max"
|
|
7269
|
+
]);
|
|
7270
|
+
/**
|
|
7250
7271
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7251
7272
|
*
|
|
7252
7273
|
* `mode` is the authoritative storage choice; `schedule`/`triggers`/`pre`/`post`
|
|
@@ -7283,7 +7304,14 @@ var RecordingConfigSchema = object({
|
|
|
7283
7304
|
* derived into bands once via `migrateConfigToBands`.
|
|
7284
7305
|
*/
|
|
7285
7306
|
bands: array(RecordingBandSchema).optional(),
|
|
7286
|
-
retention: RecordingRetentionSchema.optional()
|
|
7307
|
+
retention: RecordingRetentionSchema.optional(),
|
|
7308
|
+
/**
|
|
7309
|
+
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7310
|
+
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7311
|
+
* windows only — existing sheets are immutable, and each window's index
|
|
7312
|
+
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7313
|
+
*/
|
|
7314
|
+
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7287
7315
|
});
|
|
7288
7316
|
/**
|
|
7289
7317
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -10795,10 +10823,23 @@ var deviceDiscoveryCapability = {
|
|
|
10795
10823
|
}
|
|
10796
10824
|
};
|
|
10797
10825
|
/**
|
|
10798
|
-
* Doorbell button cap.
|
|
10799
|
-
*
|
|
10800
|
-
*
|
|
10801
|
-
*
|
|
10826
|
+
* Doorbell button cap. Two kinds of providers coexist behind this cap
|
|
10827
|
+
* name (same pattern as `snapshot`):
|
|
10828
|
+
*
|
|
10829
|
+
* - **Native** providers: registered per-device by device-driver
|
|
10830
|
+
* addons via `ctx.registerNativeCap` — either on a
|
|
10831
|
+
* `DeviceType.Button` accessory with `role: DeviceRole.Doorbell`,
|
|
10832
|
+
* or directly on the camera (Reolink registers at camera level).
|
|
10833
|
+
* Emits an `onPressed` event every time the firmware pushes a
|
|
10834
|
+
* ring; status tracks the last press and a pressCount since start
|
|
10835
|
+
* (diagnostic).
|
|
10836
|
+
*
|
|
10837
|
+
* - **Wrapper** provider: the `virtual-doorbell` system builtin
|
|
10838
|
+
* (`@camstack/system/builtins/doorbell`). Turns ANY binary-ish
|
|
10839
|
+
* device (contact / switch / event-emitter …) into a doorbell for
|
|
10840
|
+
* a camera. `defaultActive: false` — the operator explicitly binds
|
|
10841
|
+
* it per camera in the device-bindings UI, then picks the source
|
|
10842
|
+
* device + trigger in the per-device settings.
|
|
10802
10843
|
*
|
|
10803
10844
|
* The DeviceEventPropagator re-emits `onPressed` on the camera parent
|
|
10804
10845
|
* — subscribers listening at the camera level receive ring events
|
|
@@ -10819,7 +10860,10 @@ var doorbellCapability = {
|
|
|
10819
10860
|
scope: "device",
|
|
10820
10861
|
deviceNative: true,
|
|
10821
10862
|
mode: "singleton",
|
|
10822
|
-
|
|
10863
|
+
kind: "wrapper",
|
|
10864
|
+
defaultActive: false,
|
|
10865
|
+
deviceTypes: [DeviceType.Button, DeviceType.Camera],
|
|
10866
|
+
exposesDeviceSettings: true,
|
|
10823
10867
|
methods: {},
|
|
10824
10868
|
events: {
|
|
10825
10869
|
/**
|
|
@@ -17171,6 +17215,14 @@ var ConfigEntrySchema = object({
|
|
|
17171
17215
|
value: unknown(),
|
|
17172
17216
|
description: string().optional()
|
|
17173
17217
|
});
|
|
17218
|
+
var DeviceLinkModeSchema = _enum(["auto", "manual"]);
|
|
17219
|
+
/** One resolved linked device — the compact projection consumers need. */
|
|
17220
|
+
var LinkedDeviceSchema = object({
|
|
17221
|
+
deviceId: number(),
|
|
17222
|
+
name: string(),
|
|
17223
|
+
location: string().nullable(),
|
|
17224
|
+
features: array(string())
|
|
17225
|
+
});
|
|
17174
17226
|
var SavedDeviceRowSchema = object({
|
|
17175
17227
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
17176
17228
|
id: number(),
|
|
@@ -17392,7 +17444,10 @@ method(object({
|
|
|
17392
17444
|
}), _void(), {
|
|
17393
17445
|
kind: "mutation",
|
|
17394
17446
|
auth: "admin"
|
|
17395
|
-
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }),
|
|
17447
|
+
}), method(object({ addonId: string() }), array(SavedDeviceRowSchema)), method(object({ addonId: string().optional() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
17448
|
+
mode: DeviceLinkModeSchema,
|
|
17449
|
+
devices: array(LinkedDeviceSchema)
|
|
17450
|
+
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
17396
17451
|
deviceId: number(),
|
|
17397
17452
|
values: record(string(), unknown())
|
|
17398
17453
|
}), object({ success: literal(true) }), {
|
|
@@ -18661,6 +18716,61 @@ var EventKindSchema = _enum([
|
|
|
18661
18716
|
"object",
|
|
18662
18717
|
"audio"
|
|
18663
18718
|
]);
|
|
18719
|
+
/**
|
|
18720
|
+
* Spatial filter for `listTracks` — the rect + polygon variants of the shared
|
|
18721
|
+
* MaskShape vocabulary (see `mask-shape.ts`). Coordinates are NORMALIZED 0..1
|
|
18722
|
+
* of the camera frame (top-left origin), matching the drawing-plane editor.
|
|
18723
|
+
*/
|
|
18724
|
+
var TrackZoneFilterSchema = discriminatedUnion("kind", [MaskRectShapeSchema, MaskPolygonShapeSchema]);
|
|
18725
|
+
/** Closed icon vocabulary so clients render a known glyph per kind. */
|
|
18726
|
+
var EventKindIconSchema = _enum([
|
|
18727
|
+
"motion",
|
|
18728
|
+
"audio",
|
|
18729
|
+
"person",
|
|
18730
|
+
"vehicle",
|
|
18731
|
+
"animal",
|
|
18732
|
+
"door",
|
|
18733
|
+
"pir",
|
|
18734
|
+
"smoke",
|
|
18735
|
+
"water",
|
|
18736
|
+
"button",
|
|
18737
|
+
"generic"
|
|
18738
|
+
]);
|
|
18739
|
+
var EventKindCategorySchema = _enum([
|
|
18740
|
+
"motion",
|
|
18741
|
+
"audio",
|
|
18742
|
+
"detection",
|
|
18743
|
+
"sensor",
|
|
18744
|
+
"custom"
|
|
18745
|
+
]);
|
|
18746
|
+
var EventKindDescriptorSchema = object({
|
|
18747
|
+
/** Stable kind id (e.g. 'motion', 'person', 'contact'). */
|
|
18748
|
+
kind: string(),
|
|
18749
|
+
label: string(),
|
|
18750
|
+
/** Hex color for timeline/legend rendering. */
|
|
18751
|
+
color: string(),
|
|
18752
|
+
icon: EventKindIconSchema,
|
|
18753
|
+
category: EventKindCategorySchema,
|
|
18754
|
+
/** Which cap + device contributes this kind. For built-ins the camera
|
|
18755
|
+
* itself; for sensor kinds the LINKED source device. */
|
|
18756
|
+
source: object({
|
|
18757
|
+
capName: string(),
|
|
18758
|
+
deviceId: number()
|
|
18759
|
+
})
|
|
18760
|
+
});
|
|
18761
|
+
var SensorEventSchema = object({
|
|
18762
|
+
id: string(),
|
|
18763
|
+
/** The CAMERA the event is attributed to (a sensor linked to N cameras
|
|
18764
|
+
* yields N rows, one per camera). */
|
|
18765
|
+
deviceId: number(),
|
|
18766
|
+
/** The linked sensor device whose state changed. */
|
|
18767
|
+
sourceDeviceId: number(),
|
|
18768
|
+
/** Event kind id — matches an `EventKindDescriptor.kind`. */
|
|
18769
|
+
kind: string(),
|
|
18770
|
+
/** Snapshot of the sensor cap's runtime-state slice at the change. */
|
|
18771
|
+
value: record(string(), unknown()).nullable(),
|
|
18772
|
+
timestamp: number()
|
|
18773
|
+
});
|
|
18664
18774
|
var TrackPositionSchema = object({
|
|
18665
18775
|
x: number(),
|
|
18666
18776
|
y: number(),
|
|
@@ -18674,6 +18784,30 @@ var TrackSnapshotSchema = object({
|
|
|
18674
18784
|
mediaKey: string()
|
|
18675
18785
|
});
|
|
18676
18786
|
/**
|
|
18787
|
+
* Normalized 0..1 trajectory envelope (min/max over every position bbox,
|
|
18788
|
+
* divided by the track's detection-frame dims), computed at persist time.
|
|
18789
|
+
* Absent when the frame dims were unknown when the track was persisted
|
|
18790
|
+
* (legacy rows / dims-less sources) and on active (in-RAM) tracks.
|
|
18791
|
+
*/
|
|
18792
|
+
var TrackEnvelopeSchema = object({
|
|
18793
|
+
minX: number(),
|
|
18794
|
+
minY: number(),
|
|
18795
|
+
maxX: number(),
|
|
18796
|
+
maxY: number()
|
|
18797
|
+
});
|
|
18798
|
+
/**
|
|
18799
|
+
* Row projection for track list queries. `full` (default) returns the
|
|
18800
|
+
* complete Track including the frame-rate `positions[]` history and the
|
|
18801
|
+
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
18802
|
+
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
18803
|
+
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
18804
|
+
* zonesVisited, bestEventId, envelope) and returns `positions` /
|
|
18805
|
+
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
18806
|
+
* `getTrack`. Mirrors the event-store `projection` convention
|
|
18807
|
+
* (`getObjectEvents` et al.).
|
|
18808
|
+
*/
|
|
18809
|
+
var TrackProjectionSchema = _enum(["full", "slim"]);
|
|
18810
|
+
/**
|
|
18677
18811
|
* One audio-classification label heard on the track's camera while the
|
|
18678
18812
|
* track was alive, aggregated per label. An "episode" is one persisted
|
|
18679
18813
|
* audio event (the confident-classification path: score ≥ the device's
|
|
@@ -18724,7 +18858,11 @@ var TrackSchema = object({
|
|
|
18724
18858
|
/** Audio-classification labels heard on the camera during the track's
|
|
18725
18859
|
* life (score ≥ device `classificationMinScore`), aggregated per label.
|
|
18726
18860
|
* Absent on legacy rows / tracks with no confident audio. */
|
|
18727
|
-
audioLabels: array(TrackAudioLabelSchema).readonly().optional()
|
|
18861
|
+
audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
|
|
18862
|
+
/** Normalized 0..1 trajectory envelope (see {@link TrackEnvelopeSchema}).
|
|
18863
|
+
* Populated from the persisted envelope columns on historical reads;
|
|
18864
|
+
* absent on legacy rows, dims-less tracks and active (in-RAM) tracks. */
|
|
18865
|
+
envelope: TrackEnvelopeSchema.optional()
|
|
18728
18866
|
});
|
|
18729
18867
|
var BaseEventFields = {
|
|
18730
18868
|
id: string(),
|
|
@@ -18834,11 +18972,13 @@ var MediaFileSchema = object({
|
|
|
18834
18972
|
sizeBytes: number(),
|
|
18835
18973
|
timestamp: number()
|
|
18836
18974
|
});
|
|
18975
|
+
var DEFAULT_EVENT_QUERY_LIMIT = 1e3;
|
|
18976
|
+
var MAX_EVENT_QUERY_LIMIT = 5e3;
|
|
18837
18977
|
var DeviceEventQueryInput = object({
|
|
18838
18978
|
deviceId: number(),
|
|
18839
18979
|
since: number().optional(),
|
|
18840
18980
|
until: number().optional(),
|
|
18841
|
-
limit: number().int().min(1).max(
|
|
18981
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT),
|
|
18842
18982
|
/** `slim` drops heavy JSON fields (regions/bbox/zones) and carries an
|
|
18843
18983
|
* optional `mediaUrl` (populated by B5). `full` (default) keeps today's
|
|
18844
18984
|
* exact behaviour. Callers may omit this field — the store defaults to
|
|
@@ -18846,6 +18986,27 @@ var DeviceEventQueryInput = object({
|
|
|
18846
18986
|
projection: _enum(["full", "slim"]).optional()
|
|
18847
18987
|
});
|
|
18848
18988
|
var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: string().optional() });
|
|
18989
|
+
var RecentTracksQueryInput = object({
|
|
18990
|
+
/** Devices to merge. An empty array yields `{ tracks: [], nextCursor: null }`. */
|
|
18991
|
+
deviceIds: array(number()),
|
|
18992
|
+
/** Window lower bound on `lastSeen` (inclusive). */
|
|
18993
|
+
since: number().optional(),
|
|
18994
|
+
/** Window upper bound on `lastSeen` (inclusive). */
|
|
18995
|
+
until: number().optional(),
|
|
18996
|
+
/** Page size. Default 200, max 1000. */
|
|
18997
|
+
limit: number().int().min(1).max(1e3).default(200),
|
|
18998
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`.
|
|
18999
|
+
* Encodes the (lastSeen, trackId) sort position — treat as opaque. */
|
|
19000
|
+
cursor: string().optional(),
|
|
19001
|
+
/** See {@link TrackProjectionSchema}. Default `full`. */
|
|
19002
|
+
projection: TrackProjectionSchema.optional()
|
|
19003
|
+
});
|
|
19004
|
+
var RecentTracksPageSchema = object({
|
|
19005
|
+
/** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
|
|
19006
|
+
tracks: array(TrackSchema).readonly(),
|
|
19007
|
+
/** Cursor for the next page, or null when this page is the last. */
|
|
19008
|
+
nextCursor: string().nullable()
|
|
19009
|
+
});
|
|
18849
19010
|
var KeyEventQueryInput = object({
|
|
18850
19011
|
deviceId: number(),
|
|
18851
19012
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -18928,11 +19089,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18928
19089
|
deviceId: number(),
|
|
18929
19090
|
since: number().optional(),
|
|
18930
19091
|
until: number().optional(),
|
|
18931
|
-
limit: number().optional()
|
|
18932
|
-
|
|
19092
|
+
limit: number().optional(),
|
|
19093
|
+
/** Spatial filter — only tracks whose trajectory intersects the zone
|
|
19094
|
+
* (normalized 0..1 rect or polygon). SQL-prefiltered on the persisted
|
|
19095
|
+
* envelope columns, then precisely tested per position. Tracks with
|
|
19096
|
+
* an unknown envelope (no frame dims at persist time) always match. */
|
|
19097
|
+
zone: TrackZoneFilterSchema.optional(),
|
|
19098
|
+
/** See {@link TrackProjectionSchema}. Default `full` (backward
|
|
19099
|
+
* compatible — omitting the field keeps today's exact behaviour). */
|
|
19100
|
+
projection: TrackProjectionSchema.optional()
|
|
19101
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
18933
19102
|
kind: "mutation",
|
|
18934
19103
|
auth: "admin"
|
|
18935
|
-
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(
|
|
19104
|
+
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({
|
|
19105
|
+
deviceId: number(),
|
|
19106
|
+
since: number().optional(),
|
|
19107
|
+
until: number().optional(),
|
|
19108
|
+
kinds: array(string()).optional(),
|
|
19109
|
+
limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
|
|
19110
|
+
}), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
|
|
18936
19111
|
deviceId: number(),
|
|
18937
19112
|
since: number(),
|
|
18938
19113
|
until: number(),
|
|
@@ -22150,7 +22325,12 @@ var RecordingStorageUsageSchema = object({
|
|
|
22150
22325
|
/**
|
|
22151
22326
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
22152
22327
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
22153
|
-
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
22328
|
+
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
22329
|
+
* and the backward covered edge `prevEndMs` (exclusive end of the nearest
|
|
22330
|
+
* footage behind the epoch; `null` when none — optional so older providers
|
|
22331
|
+
* that omit it stay valid). `prevEndMs` lets a backward frame-step hop the
|
|
22332
|
+
* small inter-segment cracks (durMs under-covers the span to the next
|
|
22333
|
+
* startMs by ~11-17 ms) instead of no-opping at a segment head.
|
|
22154
22334
|
*/
|
|
22155
22335
|
var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
22156
22336
|
kind: literal("segment"),
|
|
@@ -22159,7 +22339,8 @@ var LocateSegmentResultSchema = discriminatedUnion("kind", [object({
|
|
|
22159
22339
|
bytes: number()
|
|
22160
22340
|
}), object({
|
|
22161
22341
|
kind: literal("gap"),
|
|
22162
|
-
nearestEdgeMs: number().nullable()
|
|
22342
|
+
nearestEdgeMs: number().nullable(),
|
|
22343
|
+
prevEndMs: number().nullable().optional()
|
|
22163
22344
|
})]);
|
|
22164
22345
|
/** Raw bytes of one finalized footage segment (read off disk on the recording node). */
|
|
22165
22346
|
var ReadSegmentBytesResultSchema = object({ data: _instanceof(Uint8Array) });
|
|
@@ -23728,6 +23909,12 @@ Object.freeze({
|
|
|
23728
23909
|
addonId: null,
|
|
23729
23910
|
access: "view"
|
|
23730
23911
|
},
|
|
23912
|
+
"deviceManager.getLinkedDevices": {
|
|
23913
|
+
capName: "device-manager",
|
|
23914
|
+
capScope: "system",
|
|
23915
|
+
addonId: null,
|
|
23916
|
+
access: "view"
|
|
23917
|
+
},
|
|
23731
23918
|
"deviceManager.getRoleDisplayDefaults": {
|
|
23732
23919
|
capName: "device-manager",
|
|
23733
23920
|
capScope: "system",
|
|
@@ -25282,6 +25469,12 @@ Object.freeze({
|
|
|
25282
25469
|
addonId: null,
|
|
25283
25470
|
access: "view"
|
|
25284
25471
|
},
|
|
25472
|
+
"pipelineAnalytics.getSensorEvents": {
|
|
25473
|
+
capName: "pipeline-analytics",
|
|
25474
|
+
capScope: "device",
|
|
25475
|
+
addonId: null,
|
|
25476
|
+
access: "view"
|
|
25477
|
+
},
|
|
25285
25478
|
"pipelineAnalytics.getTrack": {
|
|
25286
25479
|
capName: "pipeline-analytics",
|
|
25287
25480
|
capScope: "device",
|
|
@@ -25294,6 +25487,18 @@ Object.freeze({
|
|
|
25294
25487
|
addonId: null,
|
|
25295
25488
|
access: "view"
|
|
25296
25489
|
},
|
|
25490
|
+
"pipelineAnalytics.listEventKinds": {
|
|
25491
|
+
capName: "pipeline-analytics",
|
|
25492
|
+
capScope: "device",
|
|
25493
|
+
addonId: null,
|
|
25494
|
+
access: "view"
|
|
25495
|
+
},
|
|
25496
|
+
"pipelineAnalytics.listRecentTracks": {
|
|
25497
|
+
capName: "pipeline-analytics",
|
|
25498
|
+
capScope: "device",
|
|
25499
|
+
addonId: null,
|
|
25500
|
+
access: "view"
|
|
25501
|
+
},
|
|
25297
25502
|
"pipelineAnalytics.listTracks": {
|
|
25298
25503
|
capName: "pipeline-analytics",
|
|
25299
25504
|
capScope: "device",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-unraid",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "Unraid device-provider addon for CamStack — one Container per Unraid instance fanning out array, disk, docker and notification entities",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|