@camstack/addon-post-analysis 1.2.271 → 1.2.273
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/{dist-K6zDULiD.mjs → dist-PZVHV70g.mjs} +299 -65
- package/dist/{dist-DTeAk1Ce.js → dist-m5QdWXqR.js} +298 -82
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Bs8m-J-O.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-FrVPrAXW.mjs} +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BhgGVqqB.mjs +26 -0
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mG9AoIzw.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-jMBJBSqj.mjs → hostInit-jsytt0xF.mjs} +2 -2
- package/dist/pipeline-analytics/index.js +21 -433
- package/dist/pipeline-analytics/index.mjs +21 -433
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -4
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B0sS9pCe.mjs +0 -26
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C5WB_ysd.mjs +0 -26
|
@@ -5359,7 +5359,7 @@ var ZodIssueCode = {
|
|
|
5359
5359
|
var ZodFirstPartyTypeKind;
|
|
5360
5360
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5361
5361
|
//#endregion
|
|
5362
|
-
//#region ../types/dist/sleep-
|
|
5362
|
+
//#region ../types/dist/sleep-CaB_hL5g.mjs
|
|
5363
5363
|
/**
|
|
5364
5364
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5365
5365
|
* window to float samples (D455).
|
|
@@ -7585,6 +7585,8 @@ var EVENT_OWNER_TYPES = [
|
|
|
7585
7585
|
* nothing failing until a caller asked.
|
|
7586
7586
|
*/
|
|
7587
7587
|
var EventOwnerTypeSchema = _enum(EVENT_OWNER_TYPES);
|
|
7588
|
+
/** The same list as a Zod enum, for the cap input that carries it. */
|
|
7589
|
+
var MediaPresenceOwnerKindSchema = _enum([...EVENT_OWNER_TYPES, "track"]);
|
|
7588
7590
|
var EVENT_OWNER_TYPE_SET = new Set(EVENT_OWNER_TYPES);
|
|
7589
7591
|
/** True when this key's owner is one of the three event tables. */
|
|
7590
7592
|
function isEventOwnerType(ownerType) {
|
|
@@ -8457,24 +8459,6 @@ var DetectionCatalogClassMapSchema = object({
|
|
|
8457
8459
|
preserveOriginal: boolean()
|
|
8458
8460
|
});
|
|
8459
8461
|
/**
|
|
8460
|
-
* THE canonical event-clip pad: the time window a single-timestamp analytics
|
|
8461
|
-
* event expands to when joined with footage (clip window = `[timestamp - preMs,
|
|
8462
|
-
* timestamp + postMs]`). Matches the admin-ui clip window (−5s/+10s).
|
|
8463
|
-
*
|
|
8464
|
-
* Every consumer derives from this ONE constant so event↔footage boundaries
|
|
8465
|
-
* agree everywhere (C1): today that is the `videoclips` default provider
|
|
8466
|
-
* (addon-post-analysis), which pads its clip windows with it. The recorder used
|
|
8467
|
-
* to pad in-RAM playback markers with it too; those markers had no reader
|
|
8468
|
-
* anywhere in the repo and were deleted on 2026-08-29.
|
|
8469
|
-
*
|
|
8470
|
-
* NOTE: this is a UI/JOIN convention, NOT the `events`-band keep/discard gate —
|
|
8471
|
-
* that uses the per-device `preBufferSec`/`postBufferSec` config.
|
|
8472
|
-
*/
|
|
8473
|
-
var EVENT_PAD_MS = {
|
|
8474
|
-
preMs: 5e3,
|
|
8475
|
-
postMs: 1e4
|
|
8476
|
-
};
|
|
8477
|
-
/**
|
|
8478
8462
|
* Numeric day-of-week: 0 = Sunday … 6 = Saturday (matches `Date.getDay`).
|
|
8479
8463
|
* Named `RecordingWeekday` to avoid collision with the string-union
|
|
8480
8464
|
* `Weekday` exported from `interfaces/timezones.ts`.
|
|
@@ -8627,20 +8611,7 @@ var RecordingBandSchema = object({
|
|
|
8627
8611
|
preBufferSec: number().min(0).optional(),
|
|
8628
8612
|
postBufferSec: number().min(0).optional()
|
|
8629
8613
|
});
|
|
8630
|
-
|
|
8631
|
-
* Adjacent recorded ranges closer than this belong to the SAME videoclip visit.
|
|
8632
|
-
*
|
|
8633
|
-
* This is NOT the recorder calendar merge (`RANGE_MERGE_GAP_MS = 5s`). That
|
|
8634
|
-
* threshold is for the timeline bar, which must show exact holes — including
|
|
8635
|
-
* the ~8s GOP/keyframe rolls measured on events-mode cameras (dispensa 1438,
|
|
8636
|
-
* 2026-08-16). A videoclip is the events-mode keep-window (writer session),
|
|
8637
|
-
* whose idle bound is `postBufferSec`. Using that default (30s) glues those
|
|
8638
|
-
* intra-visit holes without joining visits hours apart.
|
|
8639
|
-
*
|
|
8640
|
-
* Segments stay the source of truth on disk (`startMs-durMs-bytes.m4s`); a
|
|
8641
|
-
* visit is derived, not a second copy of the files.
|
|
8642
|
-
*/
|
|
8643
|
-
var VISIT_MERGE_GAP_MS = { postBufferSec: 30 }.postBufferSec * 1e3;
|
|
8614
|
+
({ postBufferSec: 30 }).postBufferSec * 1e3;
|
|
8644
8615
|
/**
|
|
8645
8616
|
* Per-device retention overrides. Every field is optional; an unset or `0`
|
|
8646
8617
|
* value inherits the node-wide recorder default. Only footage-lifetime limits
|
|
@@ -23210,6 +23181,35 @@ var pipelineAnalyticsCapability = {
|
|
|
23210
23181
|
deviceId: number()
|
|
23211
23182
|
}), array(MediaFileInfoSchema).readonly()),
|
|
23212
23183
|
/**
|
|
23184
|
+
* Which of `ownerIds` hold at least ONE media row — an INDEX read, never a
|
|
23185
|
+
* blob read, and the LICENCE `videoclips` needs to publish a `thumbnail`.
|
|
23186
|
+
*
|
|
23187
|
+
* The event-media URL is stamped from a template for every event in the
|
|
23188
|
+
* system, so "the plane is up" was being served as "there are bytes": 64 of
|
|
23189
|
+
* one camera's 179 clips pointed at a 404 (device 3836, 2026-08-17). This
|
|
23190
|
+
* is the question that turns the stamp into a claim.
|
|
23191
|
+
*
|
|
23192
|
+
* It is on the WIRE because the clip source is registered by the addon that
|
|
23193
|
+
* owns the FOOTAGE, not by this one (D560) — the probe used to be an
|
|
23194
|
+
* in-process `MediaStore` read. One call per OWNER KIND, never one per
|
|
23195
|
+
* owner: that N+1 is what `MediaStore.ownersWithMedia` was written to
|
|
23196
|
+
* prevent, and crossing a process boundary makes it worse, not better.
|
|
23197
|
+
* `ownerIds` is bounded at the same 5 000 the annotation fetch is bounded
|
|
23198
|
+
* at, so one pathological camera-day cannot mint an unbounded request.
|
|
23199
|
+
*
|
|
23200
|
+
* THROWS rather than answering partially. A probe that quietly
|
|
23201
|
+
* under-reports reads as "these owners have nothing" and the caller drops
|
|
23202
|
+
* thumbnails that exist — the opposite failure to the one above, and
|
|
23203
|
+
* equally invisible.
|
|
23204
|
+
*
|
|
23205
|
+
* `deviceId` is the authorization subject, exactly as on `getEventMedia`.
|
|
23206
|
+
*/
|
|
23207
|
+
ownersWithMedia: method(object({
|
|
23208
|
+
deviceId: number(),
|
|
23209
|
+
ownerKind: MediaPresenceOwnerKindSchema,
|
|
23210
|
+
ownerIds: array(string()).max(5e3)
|
|
23211
|
+
}), array(string()).readonly()),
|
|
23212
|
+
/**
|
|
23213
23213
|
* Search object events by text query using CLIP cosine similarity.
|
|
23214
23214
|
* Encodes `text` via the `embedding-encoder` cap, queries the
|
|
23215
23215
|
* `ObjectEmbeddingStore` with optional prefilters, ranks all matching
|
|
@@ -26283,6 +26283,18 @@ method(VectorDeclareIndexInputSchema, _void(), {
|
|
|
26283
26283
|
kind: "mutation",
|
|
26284
26284
|
auth: "admin"
|
|
26285
26285
|
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
26286
|
+
_enum([
|
|
26287
|
+
"queue-full",
|
|
26288
|
+
"camera-backoff",
|
|
26289
|
+
"sleeping",
|
|
26290
|
+
"camera-refused",
|
|
26291
|
+
"no-keyframe",
|
|
26292
|
+
"no-catalog-row",
|
|
26293
|
+
"unsupported",
|
|
26294
|
+
"unknown-device",
|
|
26295
|
+
"uid-missing"
|
|
26296
|
+
]);
|
|
26297
|
+
_enum(["deferred", "final"]);
|
|
26286
26298
|
var ClipSchema = object({
|
|
26287
26299
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
26288
26300
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -26357,44 +26369,244 @@ var ClipSchema = object({
|
|
|
26357
26369
|
holes: array(object({
|
|
26358
26370
|
startMs: number(),
|
|
26359
26371
|
endMs: number()
|
|
26360
|
-
})).optional()
|
|
26372
|
+
})).optional(),
|
|
26373
|
+
/**
|
|
26374
|
+
* A URL that MAY produce this clip's still, asked only for rows actually on
|
|
26375
|
+
* screen. The opposite of {@link ClipSchema.thumbnail}: that one is VOUCHED
|
|
26376
|
+
* (a JPEG is already on disk), this one is an offer. The route answers 200
|
|
26377
|
+
* with the image, or 204 with `x-camstack-reason` when it could not mint one
|
|
26378
|
+
* — a surface latches that refusal to the instant rather than retrying.
|
|
26379
|
+
*
|
|
26380
|
+
* Never both: a clip with a vouched `thumbnail` needs no mint.
|
|
26381
|
+
*/
|
|
26382
|
+
thumbnailMint: string().optional(),
|
|
26383
|
+
/**
|
|
26384
|
+
* Why no still will be produced for this clip RIGHT NOW — set when the
|
|
26385
|
+
* provider already knows, so the surface draws the glyph and the reason
|
|
26386
|
+
* instead of firing a mint that cannot succeed.
|
|
26387
|
+
*
|
|
26388
|
+
* `sleeping` — a standalone battery camera; a read would be a wake (D549 4).
|
|
26389
|
+
* `camera-refused` — the camera answered the CoverPreview with a refusal.
|
|
26390
|
+
* `no-keyframe` — the window holds no decodable I-frame (an event that sits
|
|
26391
|
+
* inside no file is the measured case).
|
|
26392
|
+
* `unsupported` — this source cannot mint stills at all.
|
|
26393
|
+
*/
|
|
26394
|
+
thumbnailUnavailable: object({ reason: _enum([
|
|
26395
|
+
"sleeping",
|
|
26396
|
+
"camera-refused",
|
|
26397
|
+
"no-keyframe",
|
|
26398
|
+
"unsupported"
|
|
26399
|
+
]) }).optional(),
|
|
26400
|
+
/**
|
|
26401
|
+
* When the catalog this row came from was last CONFIRMED against the device.
|
|
26402
|
+
* Absent means "this row was read live". A persisted catalog served while a
|
|
26403
|
+
* camera sleeps carries the age it really has — a cached list is never drawn
|
|
26404
|
+
* as current (D549 13).
|
|
26405
|
+
*/
|
|
26406
|
+
catalogAsOf: number().optional(),
|
|
26407
|
+
/**
|
|
26408
|
+
* The camera's OWN type strings for this clip, all of them, unmapped
|
|
26409
|
+
* (`md`, `people`, `dog_cat`, `sched`, …). Kept beside {@link labels}
|
|
26410
|
+
* because a firmware inventing a type must not vanish: the mapping into our
|
|
26411
|
+
* filter vocabulary is lossy on purpose and this is the lossless copy
|
|
26412
|
+
* (D549 20).
|
|
26413
|
+
*/
|
|
26414
|
+
nativeTypes: array(string()).optional(),
|
|
26415
|
+
/**
|
|
26416
|
+
* What the subject DID — `crossline`, `intrude`, `loitering`. A behaviour
|
|
26417
|
+
* travels BESIDE a class, never instead of one, and the class filter ignores
|
|
26418
|
+
* it: "a person crossed a line" is still a person (D549 20).
|
|
26419
|
+
*/
|
|
26420
|
+
behaviours: array(string()).optional(),
|
|
26421
|
+
/**
|
|
26422
|
+
* The same recording as two files — the sub twin (what the row and its
|
|
26423
|
+
* thumbnail are) and its main twin, matched at listing time so a quality
|
|
26424
|
+
* change never re-searches the camera (D549 15). `getClipPlayback`'s
|
|
26425
|
+
* `profile` picks between them: `low | mid` → sub, `high` → main.
|
|
26426
|
+
*/
|
|
26427
|
+
streams: object({
|
|
26428
|
+
sub: object({
|
|
26429
|
+
id: string(),
|
|
26430
|
+
bytes: number().optional()
|
|
26431
|
+
}).optional(),
|
|
26432
|
+
main: object({
|
|
26433
|
+
id: string(),
|
|
26434
|
+
bytes: number().optional()
|
|
26435
|
+
}).optional()
|
|
26436
|
+
}).optional(),
|
|
26437
|
+
/** The camera says it holds a sub-stream copy of this recording. */
|
|
26438
|
+
supportSub: boolean().optional(),
|
|
26439
|
+
/**
|
|
26440
|
+
* Whether this row has bytes behind it. ABSENT means yes — every clip that
|
|
26441
|
+
* IS a file is playable, and only a source that lists EVENTS can produce a
|
|
26442
|
+
* row with nothing to play (the measured case: 1 of 29 hub events on 3628
|
|
26443
|
+
* fell inside no file). Such a row is shown, never dropped and never offered
|
|
26444
|
+
* as playable-then-failing (D549 19).
|
|
26445
|
+
*/
|
|
26446
|
+
playable: boolean().optional(),
|
|
26447
|
+
/** Why {@link playable} is false, verbatim (`no-file-for-window`). */
|
|
26448
|
+
unplayableReason: string().optional(),
|
|
26449
|
+
/**
|
|
26450
|
+
* This clip is STILL BEING WRITTEN, so {@link ClipSchema.timeRange}`.endMs`
|
|
26451
|
+
* is not its end.
|
|
26452
|
+
*
|
|
26453
|
+
* Absent — the common case — means the row is closed and its `endMs` is the
|
|
26454
|
+
* end of the recording. Present and `true` means the source told us the file
|
|
26455
|
+
* has no end yet, and the `endMs` we carry is whatever the camera's index
|
|
26456
|
+
* entry happened to hold: on a Reolink E1 Outdoor PoE (592, measured
|
|
26457
|
+
* 2026-09-20) the newest file `…_192927_000000_…_0.mp4` reported an `endTime`
|
|
26458
|
+
* of 19:29:56 and STILL reported it eight minutes later, while the file went
|
|
26459
|
+
* on growing. A surface that drew 29 s there was lying about a clip that
|
|
26460
|
+
* plays for minutes, on the one row the operator looks at first.
|
|
26461
|
+
*
|
|
26462
|
+
* `endMs` is deliberately still a number: it is the best bound anything has
|
|
26463
|
+
* for a mint window or a byte fetch, and every consumer already requires it.
|
|
26464
|
+
* This flag says what it is WORTH, and a duration is not drawn from it.
|
|
26465
|
+
*/
|
|
26466
|
+
inProgress: boolean().optional()
|
|
26361
26467
|
});
|
|
26362
26468
|
var ClipPlaybackSchema = object({
|
|
26363
|
-
/**
|
|
26469
|
+
/**
|
|
26470
|
+
* A media URL through the hub data-plane. {@link ClipPlaybackSchema.format}
|
|
26471
|
+
* says what kind — an HLS master playlist for a recording-derived clip, a
|
|
26472
|
+
* progressive MP4 for a native file the vendor addon muxed and serves with
|
|
26473
|
+
* `Range`. The URL is NOT a credential: both planes are registered
|
|
26474
|
+
* `access: 'authenticated'` and the hub's `/addon/<id>/<prefix>` proxy takes
|
|
26475
|
+
* the session cookie, so nothing is appended to it (D549 22).
|
|
26476
|
+
*/
|
|
26364
26477
|
playbackUrl: string(),
|
|
26478
|
+
/**
|
|
26479
|
+
* How to play {@link playbackUrl}. Absent means `hls` — the shape every
|
|
26480
|
+
* existing consumer already assumes. A player that branches on this is the
|
|
26481
|
+
* one change a native clip needs; a player that ignores it will hand an MP4
|
|
26482
|
+
* to hls.js and fail parsing it as a manifest.
|
|
26483
|
+
*/
|
|
26484
|
+
format: _enum(["hls", "mp4"]).optional(),
|
|
26485
|
+
/**
|
|
26486
|
+
* Which twin was actually served. A clip that holds only one stream answers
|
|
26487
|
+
* with the one it has, and the surface SAYS so — a missing main twin is
|
|
26488
|
+
* never served silently as if it were the asked-for quality (D549 15).
|
|
26489
|
+
*/
|
|
26490
|
+
served: CamProfileSchema.optional(),
|
|
26365
26491
|
/** Optional LAN/remote alternates for the same clip. */
|
|
26366
26492
|
playbackEndpoints: array(string()).optional(),
|
|
26367
26493
|
token: string().optional()
|
|
26368
26494
|
});
|
|
26369
|
-
|
|
26370
|
-
|
|
26371
|
-
|
|
26372
|
-
|
|
26373
|
-
|
|
26374
|
-
|
|
26375
|
-
|
|
26376
|
-
|
|
26377
|
-
|
|
26378
|
-
|
|
26379
|
-
|
|
26380
|
-
|
|
26381
|
-
|
|
26382
|
-
|
|
26383
|
-
|
|
26384
|
-
|
|
26385
|
-
|
|
26386
|
-
|
|
26387
|
-
|
|
26388
|
-
|
|
26389
|
-
|
|
26390
|
-
|
|
26391
|
-
|
|
26392
|
-
|
|
26393
|
-
|
|
26394
|
-
|
|
26395
|
-
|
|
26396
|
-
|
|
26397
|
-
|
|
26495
|
+
/**
|
|
26496
|
+
* Why a source cannot answer right now — per SOURCE, never fleet-wide.
|
|
26497
|
+
*
|
|
26498
|
+
* `ok` is the only state whose clip list may be read as complete. The other
|
|
26499
|
+
* three exist because an empty list from a sleeping camera reads as "this
|
|
26500
|
+
* camera has no recordings", which is the defect this whole line of work is
|
|
26501
|
+
* about: a battery camera nobody woke (`sleeping`), a camera that could not be
|
|
26502
|
+
* reached at all (`unreachable`, also what a provider that THREW reports), a
|
|
26503
|
+
* camera whose SD card is not mounted (`no-storage`, measured on 640 —
|
|
26504
|
+
* `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
|
|
26505
|
+
* camera whose OWN index disagrees with its OWN calendar (`index-empty`,
|
|
26506
|
+
* measured on 618: the calendar marks 3–20 September, days 6–20 list zero
|
|
26507
|
+
* files on both streams and both filters, with 177 GB free). That last one is
|
|
26508
|
+
* a defect ON THE CAMERA, and the only honest thing a provider can do is say
|
|
26509
|
+
* which days it asked for and got nothing — "no clips" would be a lie about a
|
|
26510
|
+
* card that is full of them.
|
|
26511
|
+
*/
|
|
26512
|
+
var ClipSourceAvailabilitySchema = object({
|
|
26513
|
+
state: _enum([
|
|
26514
|
+
"ok",
|
|
26515
|
+
"sleeping",
|
|
26516
|
+
"unreachable",
|
|
26517
|
+
"no-storage",
|
|
26518
|
+
"index-empty"
|
|
26519
|
+
]),
|
|
26520
|
+
/** Free text, shown verbatim. Names the camera's own refusal when there is one. */
|
|
26521
|
+
reason: string().optional(),
|
|
26522
|
+
/** When this source's catalog was last CONFIRMED. A cached list is never
|
|
26523
|
+
* drawn as current: the surface shows the age whenever it is older than the
|
|
26524
|
+
* refresh interval. */
|
|
26525
|
+
catalogAsOf: number().optional()
|
|
26526
|
+
});
|
|
26527
|
+
/**
|
|
26528
|
+
* One SOURCE of clips for a camera — a row of the picker, and the namespace
|
|
26529
|
+
* every clip id from it is prefixed with (`analytics`,
|
|
26530
|
+
* `native:reolink:onboard`, `hksv`, …).
|
|
26531
|
+
*
|
|
26532
|
+
* A provider lists the sources IT serves for that device, and answers for each
|
|
26533
|
+
* of them whether it can answer at all. A provider with nothing to offer on a
|
|
26534
|
+
* camera returns `[]` — it is not that camera's business.
|
|
26535
|
+
*/
|
|
26536
|
+
var ClipSourceSchema = object({
|
|
26537
|
+
/** The value this source stamps on {@link ClipSchema.source}, and the prefix
|
|
26538
|
+
* of every clip id it mints. `getClipPlayback` routes on it. */
|
|
26539
|
+
source: string(),
|
|
26540
|
+
/** Operator-facing name of the source ("CamStack recordings", "SD card"). */
|
|
26541
|
+
label: string(),
|
|
26542
|
+
/**
|
|
26543
|
+
* The addon that SERVES this row.
|
|
26544
|
+
*
|
|
26545
|
+
* A surface cannot otherwise resolve a source to who answers it, and the
|
|
26546
|
+
* alternative — a `native:reolink:* → provider-reolink` table inside the
|
|
26547
|
+
* widget — is a second authority on provider identity living in the one
|
|
26548
|
+
* package with no business knowing it, wrong the day a third source appears
|
|
26549
|
+
* (D557). One addon may serve SEVERAL sources, which is why the per-device
|
|
26550
|
+
* switch is keyed by SOURCE and not by this (D555) — `addon-provider-reolink`
|
|
26551
|
+
* served a hub child two of them until the two views were measured to be one
|
|
26552
|
+
* store read twice (D555) and then read ONE way (D565).
|
|
26553
|
+
*
|
|
26554
|
+
* Optional for version skew only. The collection dispatcher stamps it from
|
|
26555
|
+
* the registry, so a row that travelled through the fan-out carries the
|
|
26556
|
+
* authoritative id whatever the provider filled in.
|
|
26557
|
+
*/
|
|
26558
|
+
addonId: string().optional(),
|
|
26559
|
+
availability: ClipSourceAvailabilitySchema
|
|
26560
|
+
});
|
|
26561
|
+
DeviceType.Camera, method(object({
|
|
26562
|
+
deviceId: number(),
|
|
26563
|
+
since: number(),
|
|
26564
|
+
until: number(),
|
|
26565
|
+
limit: number().int().positive().optional(),
|
|
26566
|
+
/**
|
|
26567
|
+
* WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
|
|
26568
|
+
* carries, never a source id and never a list.
|
|
26569
|
+
*
|
|
26570
|
+
* Absent means the device's BOUND provider, which is CamStack on every
|
|
26571
|
+
* camera today because that is what `deviceManager.getBindings`
|
|
26572
|
+
* answers with. A provider the device is not bound to is refused by
|
|
26573
|
+
* name rather than answered by another one (D552's
|
|
26574
|
+
* `rejectUnresolvedAddonPin` rule).
|
|
26575
|
+
*
|
|
26576
|
+
* It replaced `sources?: string[]`, a VIEW filter over source ids that
|
|
26577
|
+
* assumed the answer was a fan-out over everything a camera has. The
|
|
26578
|
+
* operator settled otherwise on 2026-09-20 — *"il get videoclips
|
|
26579
|
+
* prendere un provider opzionale, di default va su camstack"*,
|
|
26580
|
+
* *"l'utilizzatore è uno solo"* — so the list is asked of one provider
|
|
26581
|
+
* at a time and there is nothing to filter out of it.
|
|
26582
|
+
*/
|
|
26583
|
+
provider: string().optional()
|
|
26584
|
+
}), array(ClipSchema).readonly(), {
|
|
26585
|
+
kind: "query",
|
|
26586
|
+
auth: "protected"
|
|
26587
|
+
}), method(object({ deviceId: number() }), array(ClipSourceSchema).readonly(), {
|
|
26588
|
+
kind: "query",
|
|
26589
|
+
auth: "protected"
|
|
26590
|
+
}), method(object({
|
|
26591
|
+
deviceId: number(),
|
|
26592
|
+
clipId: string(),
|
|
26593
|
+
/**
|
|
26594
|
+
* Which twin to serve, on the ONE quality scale the system already has
|
|
26595
|
+
* (`CamProfileSchema`). `low | mid` → the sub file, `high` → the main
|
|
26596
|
+
* twin; both ids are already on the row so this never re-searches the
|
|
26597
|
+
* camera. Absent means the provider's own default (the sub file, which
|
|
26598
|
+
* every source is measured to hold).
|
|
26599
|
+
*
|
|
26600
|
+
* `auto` is deliberately NOT accepted here: a stored file has no
|
|
26601
|
+
* broker session, so the adaptive tier cannot be resolved for it. The
|
|
26602
|
+
* viewer resolves `auto` to a profile the same way live does, before
|
|
26603
|
+
* it calls (D549 15).
|
|
26604
|
+
*/
|
|
26605
|
+
profile: CamProfileSchema.optional()
|
|
26606
|
+
}), ClipPlaybackSchema, {
|
|
26607
|
+
kind: "query",
|
|
26608
|
+
auth: "protected"
|
|
26609
|
+
});
|
|
26398
26610
|
/**
|
|
26399
26611
|
* Optional client-side hints sent at session creation to help the provider
|
|
26400
26612
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -41699,6 +41911,12 @@ Object.freeze({
|
|
|
41699
41911
|
addonId: null,
|
|
41700
41912
|
access: "view"
|
|
41701
41913
|
},
|
|
41914
|
+
"pipelineAnalytics.ownersWithMedia": {
|
|
41915
|
+
capName: "pipeline-analytics",
|
|
41916
|
+
capScope: "device",
|
|
41917
|
+
addonId: null,
|
|
41918
|
+
access: "view"
|
|
41919
|
+
},
|
|
41702
41920
|
"pipelineAnalytics.pauseForStorageMigration": {
|
|
41703
41921
|
capName: "pipeline-analytics",
|
|
41704
41922
|
capScope: "device",
|
|
@@ -44291,6 +44509,12 @@ Object.freeze({
|
|
|
44291
44509
|
addonId: null,
|
|
44292
44510
|
access: "view"
|
|
44293
44511
|
},
|
|
44512
|
+
"videoclips.listSources": {
|
|
44513
|
+
capName: "videoclips",
|
|
44514
|
+
capScope: "device",
|
|
44515
|
+
addonId: null,
|
|
44516
|
+
access: "view"
|
|
44517
|
+
},
|
|
44294
44518
|
"viewerUi.getStaticDir": {
|
|
44295
44519
|
capName: "viewer-ui",
|
|
44296
44520
|
capScope: "system",
|
|
@@ -45593,6 +45817,11 @@ Object.freeze({
|
|
|
45593
45817
|
form: "single",
|
|
45594
45818
|
optional: false
|
|
45595
45819
|
}],
|
|
45820
|
+
"pipelineAnalytics.ownersWithMedia": [{
|
|
45821
|
+
name: "deviceId",
|
|
45822
|
+
form: "single",
|
|
45823
|
+
optional: false
|
|
45824
|
+
}],
|
|
45596
45825
|
"pipelineAnalytics.proposeRetrainAnnotations": [{
|
|
45597
45826
|
name: "deviceId",
|
|
45598
45827
|
form: "single",
|
|
@@ -46299,6 +46528,11 @@ Object.freeze({
|
|
|
46299
46528
|
form: "single",
|
|
46300
46529
|
optional: false
|
|
46301
46530
|
}],
|
|
46531
|
+
"videoclips.listSources": [{
|
|
46532
|
+
name: "deviceId",
|
|
46533
|
+
form: "single",
|
|
46534
|
+
optional: false
|
|
46535
|
+
}],
|
|
46302
46536
|
"waterHeater.setAway": [{
|
|
46303
46537
|
name: "deviceId",
|
|
46304
46538
|
form: "single",
|
|
@@ -47580,4 +47814,4 @@ function vectorDimFromBase64(encoded) {
|
|
|
47580
47814
|
return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
|
|
47581
47815
|
}
|
|
47582
47816
|
//#endregion
|
|
47583
|
-
export {
|
|
47817
|
+
export { TrackSourceSchema as $, literal as $t, NcRuleInputSchema as A, resolveLocationMode as At, OpsLogEntrySchema as B, CamProfileSchema as Bt, MediaFileKindEnum as C, occupancyScope as Ct, NC_SNOOZE_MAX_MINUTES as D, plateGalleryCapability as Dt, NC_DEFAULT_SNOOZE_MINUTES as E, pipelineAnalyticsCapability as Et, NcSnoozeInputSchema as F, systemEventFilterApplies as Ft, SCENE_DEFAULT_ANCHOR_THRESHOLD as G, hydrateSchema as Gt, RECORDING_EXPORT_MAX_READ_BYTES as H, createEvent as Ht, NcSnoozeSchema as I, vectorDimFromBase64 as It, SceneMonitorSchema as J, sleep as Jt, SCENE_DEFAULT_UNCOVERED_POLICY as K, isDeviceScopedCap as Kt, NcSnoozeSuppressedSchema as L, zoneAnalyticsCapability as Lt, NcRuleSchema as M, sceneMonitorCapability as Mt, NcRuleTargetSchema as N, storageOccupancyCapability as Nt, NC_TAXONOMY as O, readDeviceStateFrom as Ot, NcScheduleSchema as P, subKindsOf as Pt, TimelapseRuleSchema as Q, discriminatedUnion as Qt, NcSystemEventKindSchema as R, errMsg as Rt, MOTION_CLOSE_AFTER_MS as S, notificationRulesCapability as St, NC_CONDITION_CATALOG as T, pickClusterStepModels as Tt, RetrainStatusSchema as U, customAction as Ut, PoolMemoryWatchdog as V, DeviceType as Vt, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as W, defineCustomActions as Wt, TimelapseRuleInputSchema as X, array as Xt, TIMELAPSE_DENSE_FLOOR_SEC as Y, _enum as Yt, TimelapseRulePatchSchema as Z, boolean as Zt, FailureCounters as _, isMediaOwnerType as _t, CLUSTER_MODEL_SCOPED_STEPS as a, unknown as an, buildEventKindDescriptor as at, MAX_BIRTH_DECISION_RECORDS as b, kebabToCamel as bt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as c, embeddingEncoderCapability as ct, DETECTION_PIPELINE_CAP_NAME as d, evictionPolicyOfLocation as dt, number as en, addonWidgetsSourceCapability as et, DeclaredDevices as f, faceGalleryCapability as ft, FULL_IMAGE_BBOX as g, isEventOwnerType as gt, FIRST_LEVEL_MACRO_CLASSES as h, isDetectionMacroClass as ht, BirthDecisionRecordSchema as i, string as in, audioModeOf as it, NcRulePatchSchema as j, resolvePoolMemoryPolicy as jt, NcConditionDescriptorSchema as k, readTimelapseGeneratedAt as kt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as l, encodeVectorBase64 as lt, EVENT_OWNER_TYPES as m, hfModelUrl as mt, ArchivedDebugNoteSchema as n, partialRecord as nn, assertTimelapseCadences as nt, COCO_TO_MACRO as o, EventCategory as on, cosineSimilarity as ot, EVENT_KIND_BY_CAP as p, failureContributionCapability as pt, SCENE_DIVERGED as q, nodePin as qt, BaseDevice as r, record as rn, audioMetricsCapability as rt, DEFAULT_EVENT_COLOR as s, deriveRecordingMode as st, AUDIO_MACRO_LABELS as t, object as tn, alarmPanelCapability as tt, DETECTION_MACRO_CLASSES as u, evaluateSensorEdge as ut, LabelAttributionSchema as v, isScheduleActive as vt, NC_ALARM_SYSTEM_EVENT_KINDS as w, parseProcStatus as wt, MAX_BIRTH_LATENCY_PROXY_MS as x, mayWriteToLocation as xt, MAX_ARCHIVED_DEBUG_NOTES as y, isSourceCap as yt, NcTaxonomySchema as z, BaseAddon as zt };
|