@camstack/addon-post-analysis 1.2.153 → 1.2.155
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-DeMgxNFC.js → dist-CXY233l4.js} +332 -1
- package/dist/{dist-DDIu0Q1W.mjs → dist-DqNo8CCq.mjs} +332 -1
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +1 -1
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cil5ur25.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-rrVQlXbu.mjs} +3 -3
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C8CZ3hb-.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-I37PqSoI.mjs → hostInit-Bfr4wfpP.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +1329 -231
- package/dist/pipeline-analytics/index.mjs +1327 -249
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -8
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CG8y8a6j.mjs +0 -26
|
@@ -8288,6 +8288,20 @@ var RelocateJobSchema = object({
|
|
|
8288
8288
|
* in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
|
|
8289
8289
|
*/
|
|
8290
8290
|
rowsReconciled: number().int().nonnegative().optional(),
|
|
8291
|
+
/**
|
|
8292
|
+
* Rows this run FORGOT because the file they name is not on disk.
|
|
8293
|
+
*
|
|
8294
|
+
* The mover derived the path from the row's own fields and `stat`ed it; an
|
|
8295
|
+
* ENOENT there is a per-path confirmation that the segment is gone (D296),
|
|
8296
|
+
* and the durable row is dropped through the same channel eviction uses. It
|
|
8297
|
+
* is reported for the same reason `rowsReconciled` is: this is a durable
|
|
8298
|
+
* mutation nobody asked for, and a migration that quietly erases hour rows is
|
|
8299
|
+
* the same failure as one that quietly skips them (D295).
|
|
8300
|
+
*
|
|
8301
|
+
* The production drain of 2026-08-30 would have reported 11 074 here — the
|
|
8302
|
+
* ledger claimed 5.65 GB of footage that no longer existed.
|
|
8303
|
+
*/
|
|
8304
|
+
rowsForgotten: number().int().nonnegative().optional(),
|
|
8291
8305
|
startedAt: number(),
|
|
8292
8306
|
finishedAt: number().nullable(),
|
|
8293
8307
|
error: string().nullable()
|
|
@@ -8651,6 +8665,91 @@ var RelocateResidueSchema = object({
|
|
|
8651
8665
|
segments: number().int().nonnegative(),
|
|
8652
8666
|
bytes: number().int().nonnegative()
|
|
8653
8667
|
}).nullable();
|
|
8668
|
+
/**
|
|
8669
|
+
* Ask one location whether its durable hour rows describe the disk — the walk
|
|
8670
|
+
* (D319).
|
|
8671
|
+
*
|
|
8672
|
+
* `apply` DEFAULTS TO FALSE and that default is the product: the operator's
|
|
8673
|
+
* missing tool is the question, and the dry run is how they sanity-check the
|
|
8674
|
+
* destructive run before authorising it.
|
|
8675
|
+
*/
|
|
8676
|
+
var LedgerWalkInputSchema = object({
|
|
8677
|
+
locationId: string().min(1),
|
|
8678
|
+
/** Forget the confirmed-absent rows, rather than only counting them. */
|
|
8679
|
+
apply: boolean().optional(),
|
|
8680
|
+
/** Narrow to one camera. */
|
|
8681
|
+
deviceId: number().int().positive().optional(),
|
|
8682
|
+
/** Narrow to these recording profiles; empty/absent = every profile. */
|
|
8683
|
+
profiles: array(string().min(1)).optional()
|
|
8684
|
+
});
|
|
8685
|
+
/** Why a whole walk did nothing. Every one leaves the ledger untouched. */
|
|
8686
|
+
var LedgerWalkRefusalSchema = _enum([
|
|
8687
|
+
"location-unknown",
|
|
8688
|
+
"source-writable",
|
|
8689
|
+
"no-ledger",
|
|
8690
|
+
"archive-unreadable",
|
|
8691
|
+
"anchor-absent",
|
|
8692
|
+
"anchor-unreadable",
|
|
8693
|
+
"anchor-moved"
|
|
8694
|
+
]);
|
|
8695
|
+
_enum([
|
|
8696
|
+
"live-tail",
|
|
8697
|
+
"listing-error",
|
|
8698
|
+
"path-mismatch",
|
|
8699
|
+
"durable-refused"
|
|
8700
|
+
]);
|
|
8701
|
+
/** Every skip reason, always present, always a number — so a reason that never
|
|
8702
|
+
* fired reports as zero rather than absent and the report shape is constant
|
|
8703
|
+
* between passes. Spelled out rather than `z.record` for exactly that. */
|
|
8704
|
+
var LedgerWalkSkipCountsSchema = object({
|
|
8705
|
+
"live-tail": number().int().nonnegative(),
|
|
8706
|
+
"listing-error": number().int().nonnegative(),
|
|
8707
|
+
"path-mismatch": number().int().nonnegative(),
|
|
8708
|
+
"durable-refused": number().int().nonnegative()
|
|
8709
|
+
});
|
|
8710
|
+
/** One camera's share of a walk, so a report names cameras and not rows. */
|
|
8711
|
+
var LedgerWalkDeviceReportSchema = object({
|
|
8712
|
+
deviceId: number().int(),
|
|
8713
|
+
hoursWalked: number().int().nonnegative(),
|
|
8714
|
+
hoursMissing: number().int().nonnegative(),
|
|
8715
|
+
ghostSegments: number().int().nonnegative(),
|
|
8716
|
+
ghostBytes: number().int().nonnegative(),
|
|
8717
|
+
forgottenSegments: number().int().nonnegative(),
|
|
8718
|
+
orphanFiles: number().int().nonnegative()
|
|
8719
|
+
});
|
|
8720
|
+
/**
|
|
8721
|
+
* What one walk claimed, listed, found and (only when armed) forgot.
|
|
8722
|
+
*
|
|
8723
|
+
* `archiveSegments` is the **M** and `segmentsClaimed` the **N** (D295), so a
|
|
8724
|
+
* walk that saw a fraction of the location is visible in its own report rather
|
|
8725
|
+
* than in the absence of one.
|
|
8726
|
+
*/
|
|
8727
|
+
var LedgerWalkReportSchema = object({
|
|
8728
|
+
locationId: string(),
|
|
8729
|
+
applied: boolean(),
|
|
8730
|
+
refused: LedgerWalkRefusalSchema.nullable(),
|
|
8731
|
+
archiveSegments: number().int().nonnegative().nullable(),
|
|
8732
|
+
archiveBytes: number().int().nonnegative().nullable(),
|
|
8733
|
+
hoursClaimed: number().int().nonnegative(),
|
|
8734
|
+
hoursWalked: number().int().nonnegative(),
|
|
8735
|
+
hoursMissing: number().int().nonnegative(),
|
|
8736
|
+
/** `readdir` calls issued — the cost, stated in the unit that is paid. */
|
|
8737
|
+
listings: number().int().nonnegative(),
|
|
8738
|
+
segmentsClaimed: number().int().nonnegative(),
|
|
8739
|
+
ghostSegments: number().int().nonnegative(),
|
|
8740
|
+
ghostBytes: number().int().nonnegative(),
|
|
8741
|
+
ghostHoursWhole: number().int().nonnegative(),
|
|
8742
|
+
forgottenSegments: number().int().nonnegative(),
|
|
8743
|
+
forgottenBytes: number().int().nonnegative(),
|
|
8744
|
+
/** Files under a claimed hour that no durable row names. Never deleted. */
|
|
8745
|
+
orphanFiles: number().int().nonnegative(),
|
|
8746
|
+
orphanSample: array(string()).readonly(),
|
|
8747
|
+
hoursSkipped: number().int().nonnegative(),
|
|
8748
|
+
skippedByReason: LedgerWalkSkipCountsSchema,
|
|
8749
|
+
/** The walk stopped at its per-pass hour bound with claims unwalked. */
|
|
8750
|
+
bounded: boolean(),
|
|
8751
|
+
byDevice: array(LedgerWalkDeviceReportSchema).readonly()
|
|
8752
|
+
});
|
|
8654
8753
|
/** How many rows a media pass would still act on against a given target — the
|
|
8655
8754
|
* media lane's denominator AND its residue, from ONE derivation so the two can
|
|
8656
8755
|
* never disagree. `null` = the count could not be taken. */
|
|
@@ -20026,13 +20125,15 @@ var ListGroupsPageSchema = object({
|
|
|
20026
20125
|
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
20027
20126
|
nextCursor: string().nullable()
|
|
20028
20127
|
});
|
|
20128
|
+
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
20129
|
+
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
20029
20130
|
var KeyEventQueryInput = object({
|
|
20030
20131
|
deviceId: number(),
|
|
20031
20132
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
20032
20133
|
since: number(),
|
|
20033
20134
|
/** Window upper bound (track firstSeen ≤ until). */
|
|
20034
20135
|
until: number(),
|
|
20035
|
-
limit: number().int().min(1).max(
|
|
20136
|
+
limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
|
|
20036
20137
|
/** Drop tracks scoring below this importance. */
|
|
20037
20138
|
minImportance: number().min(0).max(1).optional(),
|
|
20038
20139
|
/** Restrict to a single class (e.g. 'person'). */
|
|
@@ -20054,6 +20155,32 @@ var KeyEventSchema = object({
|
|
|
20054
20155
|
...TrackFlagFields,
|
|
20055
20156
|
...TrackRetrainFields
|
|
20056
20157
|
});
|
|
20158
|
+
/** `getKeyEvents`' window and filters, asked of a SET of cameras at once. */
|
|
20159
|
+
var KeyEventBatchQueryInput = object({
|
|
20160
|
+
deviceIds: array(number()).min(1).max(200),
|
|
20161
|
+
since: number(),
|
|
20162
|
+
until: number(),
|
|
20163
|
+
/** Applied PER CAMERA, exactly as `getKeyEvents.limit` is — never a total
|
|
20164
|
+
* across the set, which would let a busy camera starve a quiet one of its
|
|
20165
|
+
* rows and change what the merged feed contains. */
|
|
20166
|
+
limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
|
|
20167
|
+
minImportance: number().min(0).max(1).optional(),
|
|
20168
|
+
classFilter: string().optional()
|
|
20169
|
+
});
|
|
20170
|
+
/**
|
|
20171
|
+
* One camera's key events in a batch answer.
|
|
20172
|
+
*
|
|
20173
|
+
* The row exists for every requested id. `getKeyEvents` degrades to `[]` on
|
|
20174
|
+
* error rather than throwing, so a camera whose store read failed and one with
|
|
20175
|
+
* no events in the window were ALREADY indistinguishable per camera — the
|
|
20176
|
+
* batch does not make that worse, and the row keeps the deviceId the single
|
|
20177
|
+
* method's output never carried (the caller used to stamp it from the fan-out
|
|
20178
|
+
* key, which only worked because there was one query per camera).
|
|
20179
|
+
*/
|
|
20180
|
+
var KeyEventsForDeviceSchema = object({
|
|
20181
|
+
deviceId: number(),
|
|
20182
|
+
events: array(KeyEventSchema).readonly()
|
|
20183
|
+
});
|
|
20057
20184
|
object({
|
|
20058
20185
|
trackId: string(),
|
|
20059
20186
|
className: string(),
|
|
@@ -20273,6 +20400,47 @@ var RebuildStatusSchema = object({
|
|
|
20273
20400
|
/** Present when the pass ended by throwing. */
|
|
20274
20401
|
error: string().nullable()
|
|
20275
20402
|
});
|
|
20403
|
+
/**
|
|
20404
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20405
|
+
*
|
|
20406
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20407
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20408
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20409
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20410
|
+
*/
|
|
20411
|
+
var MediaReclaimStartResultSchema = object({
|
|
20412
|
+
started: boolean(),
|
|
20413
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20414
|
+
alreadyRunning: boolean()
|
|
20415
|
+
});
|
|
20416
|
+
var MediaReclaimInputSchema = object({
|
|
20417
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20418
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20419
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20420
|
+
restart: boolean().optional(),
|
|
20421
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20422
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20423
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20424
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20425
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20426
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20427
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20428
|
+
});
|
|
20429
|
+
var MediaReclaimStatusSchema = object({
|
|
20430
|
+
running: boolean(),
|
|
20431
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20432
|
+
totalExamined: number(),
|
|
20433
|
+
totalEligible: number(),
|
|
20434
|
+
totalReclaimed: number(),
|
|
20435
|
+
totalBytesReclaimed: number(),
|
|
20436
|
+
totalRefused: number(),
|
|
20437
|
+
/** Device+scope windows finished in this pass. */
|
|
20438
|
+
devicesDone: number(),
|
|
20439
|
+
complete: boolean().nullable(),
|
|
20440
|
+
startedAtMs: number().nullable(),
|
|
20441
|
+
finishedAtMs: number().nullable(),
|
|
20442
|
+
error: string().nullable()
|
|
20443
|
+
});
|
|
20276
20444
|
var ReplayFrameInputSchema = object({
|
|
20277
20445
|
timestamp: number(),
|
|
20278
20446
|
frame: PipelineRunResultBridge
|
|
@@ -20402,6 +20570,21 @@ var pipelineAnalyticsCapability = {
|
|
|
20402
20570
|
* scored on-read (no write). Degrades to `[]` on error.
|
|
20403
20571
|
*/
|
|
20404
20572
|
getKeyEvents: method(KeyEventQueryInput, array(KeyEventSchema).readonly()),
|
|
20573
|
+
/**
|
|
20574
|
+
* The same ranking, for a SET of cameras, in one round trip.
|
|
20575
|
+
*
|
|
20576
|
+
* The Detection Intelligence events feed asks this of every selected
|
|
20577
|
+
* camera and re-asks on a 30s timer. Fanned out client-side that is N
|
|
20578
|
+
* round trips — browser → hub → post-analysis — for N independent,
|
|
20579
|
+
* already-indexed store queries. Batched, the queries are unchanged and
|
|
20580
|
+
* run concurrently INSIDE the owner; only the transport collapses.
|
|
20581
|
+
*
|
|
20582
|
+
* Deliberately per-device rather than pre-merged: `limit` stays per
|
|
20583
|
+
* camera (a total would let a busy camera starve a quiet one), and a
|
|
20584
|
+
* caller that renders one camera's lane needs to know which camera a row
|
|
20585
|
+
* came from. `getKeyEvents` stays for single-device callers.
|
|
20586
|
+
*/
|
|
20587
|
+
getKeyEventsBatch: method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()),
|
|
20405
20588
|
/** Server-side bucketed event counts for the 24-hour timeline.
|
|
20406
20589
|
* Returns one entry per non-empty bucket; empty buckets are omitted. */
|
|
20407
20590
|
getEventDensity: method(object({
|
|
@@ -20680,6 +20863,20 @@ var pipelineAnalyticsCapability = {
|
|
|
20680
20863
|
auth: "admin"
|
|
20681
20864
|
}),
|
|
20682
20865
|
/**
|
|
20866
|
+
* Reclaim the standing debug-media backlog (motion-visit stills + track
|
|
20867
|
+
* filmstrips). DETACHED: returns `{ started }` immediately. The pass is
|
|
20868
|
+
* tens of minutes; awaiting it is a timeout, not a verdict. Dry-run unless
|
|
20869
|
+
* `mode: 'reclaim'`. Poll `getMediaReclaimStatus`.
|
|
20870
|
+
*/
|
|
20871
|
+
reclaimDebugMedia: method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20872
|
+
kind: "mutation",
|
|
20873
|
+
auth: "admin"
|
|
20874
|
+
}),
|
|
20875
|
+
getMediaReclaimStatus: method(object({}), MediaReclaimStatusSchema, {
|
|
20876
|
+
kind: "query",
|
|
20877
|
+
auth: "admin"
|
|
20878
|
+
}),
|
|
20879
|
+
/**
|
|
20683
20880
|
* The CHEAP QUESTION, asked before any media moves: how big is the dataset
|
|
20684
20881
|
* the marked (`markForTrain`) tracks would produce?
|
|
20685
20882
|
*
|
|
@@ -30296,6 +30493,9 @@ method(object({
|
|
|
30296
30493
|
}), method(RelocateResidueInputSchema, RelocateResidueSchema, {
|
|
30297
30494
|
kind: "query",
|
|
30298
30495
|
auth: "admin"
|
|
30496
|
+
}), method(LedgerWalkInputSchema, LedgerWalkReportSchema, {
|
|
30497
|
+
kind: "mutation",
|
|
30498
|
+
auth: "admin"
|
|
30299
30499
|
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
30300
30500
|
kind: "mutation",
|
|
30301
30501
|
auth: "admin"
|
|
@@ -30712,6 +30912,25 @@ var SceneMonitorStatusSchema = object({
|
|
|
30712
30912
|
monitors: array(SceneMonitorSchema),
|
|
30713
30913
|
lastFetchedAt: number()
|
|
30714
30914
|
});
|
|
30915
|
+
/**
|
|
30916
|
+
* One camera's row in a `listScenesBatch` answer.
|
|
30917
|
+
*
|
|
30918
|
+
* `status` is NULLABLE and the nullability is the whole point. `scene-monitor`
|
|
30919
|
+
* is a `defaultActive` wrapper, so every camera is asked; a camera whose
|
|
30920
|
+
* provider is absent (pipeline-analytics not deployed, the post-processing node
|
|
30921
|
+
* down) cannot answer, and that is not the same fact as a camera with no scenes
|
|
30922
|
+
* configured. Fanned out per camera the difference was visible — one query
|
|
30923
|
+
* errored while the others resolved — and a batch that returned only the rows
|
|
30924
|
+
* it managed would have destroyed it, silently, by making an unreachable camera
|
|
30925
|
+
* indistinguishable from one that answered `monitors: []`.
|
|
30926
|
+
*
|
|
30927
|
+
* So: EVERY requested deviceId gets a row. `status: null` means "this camera
|
|
30928
|
+
* could not be read"; `status.monitors: []` means "read, and it has none".
|
|
30929
|
+
*/
|
|
30930
|
+
var SceneMonitorStatusForDeviceSchema = object({
|
|
30931
|
+
deviceId: number(),
|
|
30932
|
+
status: SceneMonitorStatusSchema.nullable()
|
|
30933
|
+
});
|
|
30715
30934
|
var sceneMonitorCapability = {
|
|
30716
30935
|
name: "scene-monitor",
|
|
30717
30936
|
scope: "device",
|
|
@@ -30721,6 +30940,22 @@ var sceneMonitorCapability = {
|
|
|
30721
30940
|
deviceTypes: [DeviceType.Camera],
|
|
30722
30941
|
methods: {
|
|
30723
30942
|
listScenes: method(object({ deviceId: number() }), SceneMonitorStatusSchema),
|
|
30943
|
+
/**
|
|
30944
|
+
* The same answer, for a SET of cameras, in one round trip.
|
|
30945
|
+
*
|
|
30946
|
+
* `/scenes` renders every camera and re-reads them on a 30s safety-net
|
|
30947
|
+
* poll behind the push slice. Fanned out client-side that was one query
|
|
30948
|
+
* per camera — 29 round trips through the browser, the hub and the
|
|
30949
|
+
* post-analysis runner every 30 seconds to read an in-memory map the
|
|
30950
|
+
* owner had already merged. The work is unchanged (`statusFor` per
|
|
30951
|
+
* device, all in-process at the owner); what collapses is the transport.
|
|
30952
|
+
*
|
|
30953
|
+
* A camera that cannot answer still gets a row, with `status: null` —
|
|
30954
|
+
* see {@link SceneMonitorStatusForDeviceSchema}. Never fewer rows than
|
|
30955
|
+
* ids: a caller that asked for twenty-nine and got twenty-seven cannot
|
|
30956
|
+
* tell which two are missing, or that any are.
|
|
30957
|
+
*/
|
|
30958
|
+
listScenesBatch: method(object({ deviceIds: array(number()).min(1).max(200) }), array(SceneMonitorStatusForDeviceSchema).readonly()),
|
|
30724
30959
|
createScene: method(object({
|
|
30725
30960
|
deviceId: number(),
|
|
30726
30961
|
label: string(),
|
|
@@ -32556,6 +32791,27 @@ var CameraOccupancySnapshotSchema = object({
|
|
|
32556
32791
|
stationaryObjects: array(StationaryObjectSchema).readonly().optional()
|
|
32557
32792
|
});
|
|
32558
32793
|
/**
|
|
32794
|
+
* One camera's row in a `getCurrentSnapshotBatch` answer.
|
|
32795
|
+
*
|
|
32796
|
+
* THREE outcomes, and the single-camera method could only express two of them
|
|
32797
|
+
* because `snapshot: null` was already spoken for:
|
|
32798
|
+
*
|
|
32799
|
+
* - `read: 'read'`, `snapshot` present — the live occupancy reading.
|
|
32800
|
+
* - `read: 'read'`, `snapshot: null` — read, and this camera has no reading
|
|
32801
|
+
* yet: no frame since boot, and no parked-object registry to hydrate from.
|
|
32802
|
+
* - `read: 'unreadable'` — the owner could not answer for this
|
|
32803
|
+
* camera. `snapshot` is null, and it does NOT mean "nothing parked here".
|
|
32804
|
+
*
|
|
32805
|
+
* Collapsing the last two is the failure this field exists to prevent: a
|
|
32806
|
+
* hydration that threw would otherwise render as an empty Stationary section,
|
|
32807
|
+
* which is a definite claim about a camera nobody could read.
|
|
32808
|
+
*/
|
|
32809
|
+
var CameraOccupancySnapshotForDeviceSchema = object({
|
|
32810
|
+
deviceId: number(),
|
|
32811
|
+
read: _enum(["read", "unreadable"]),
|
|
32812
|
+
snapshot: CameraOccupancySnapshotSchema.nullable()
|
|
32813
|
+
});
|
|
32814
|
+
/**
|
|
32559
32815
|
* Time-series resolution. The history methods return one bucket per
|
|
32560
32816
|
* step over the requested range. Smaller resolutions cost more
|
|
32561
32817
|
* memory + bandwidth; bound to discrete steps so caller cannot ask
|
|
@@ -32612,6 +32868,20 @@ var zoneAnalyticsCapability = {
|
|
|
32612
32868
|
* (no inference result emitted since boot or since binding was
|
|
32613
32869
|
* activated). */
|
|
32614
32870
|
getCurrentSnapshot: method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()),
|
|
32871
|
+
/**
|
|
32872
|
+
* The same snapshot, for a SET of cameras, in one round trip.
|
|
32873
|
+
*
|
|
32874
|
+
* The Events page's Stationary section polls this every 15s for every
|
|
32875
|
+
* selected camera. Fanned out client-side that is one query per camera to
|
|
32876
|
+
* read a `Map.get` at the owner — the answer costs nothing, the round trip
|
|
32877
|
+
* costs everything. Batched, N transports become one and the per-device
|
|
32878
|
+
* work is unchanged.
|
|
32879
|
+
*
|
|
32880
|
+
* Every requested deviceId gets a row, tagged `read` — see
|
|
32881
|
+
* {@link CameraOccupancySnapshotForDeviceSchema}. A camera the owner could
|
|
32882
|
+
* not answer for is `'unreadable'`, never an empty reading.
|
|
32883
|
+
*/
|
|
32884
|
+
getCurrentSnapshotBatch: method(object({ deviceIds: array(number()).min(1).max(200) }), array(CameraOccupancySnapshotForDeviceSchema).readonly()),
|
|
32615
32885
|
/** Time-series object count inside one zone. `className` optional —
|
|
32616
32886
|
* omit to count every class in the zone. */
|
|
32617
32887
|
getZoneHistory: method(object({
|
|
@@ -37225,6 +37495,18 @@ Object.freeze({
|
|
|
37225
37495
|
addonId: null,
|
|
37226
37496
|
access: "view"
|
|
37227
37497
|
},
|
|
37498
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
37499
|
+
capName: "pipeline-analytics",
|
|
37500
|
+
capScope: "device",
|
|
37501
|
+
addonId: null,
|
|
37502
|
+
access: "view"
|
|
37503
|
+
},
|
|
37504
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
37505
|
+
capName: "pipeline-analytics",
|
|
37506
|
+
capScope: "device",
|
|
37507
|
+
addonId: null,
|
|
37508
|
+
access: "view"
|
|
37509
|
+
},
|
|
37228
37510
|
"pipelineAnalytics.getMotionEvents": {
|
|
37229
37511
|
capName: "pipeline-analytics",
|
|
37230
37512
|
capScope: "device",
|
|
@@ -37399,6 +37681,12 @@ Object.freeze({
|
|
|
37399
37681
|
addonId: null,
|
|
37400
37682
|
access: "create"
|
|
37401
37683
|
},
|
|
37684
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
37685
|
+
capName: "pipeline-analytics",
|
|
37686
|
+
capScope: "device",
|
|
37687
|
+
addonId: null,
|
|
37688
|
+
access: "create"
|
|
37689
|
+
},
|
|
37402
37690
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
37403
37691
|
capName: "pipeline-analytics",
|
|
37404
37692
|
capScope: "device",
|
|
@@ -38401,6 +38689,12 @@ Object.freeze({
|
|
|
38401
38689
|
addonId: null,
|
|
38402
38690
|
access: "view"
|
|
38403
38691
|
},
|
|
38692
|
+
"recording.reconcileLedgerAgainstDisk": {
|
|
38693
|
+
capName: "recording",
|
|
38694
|
+
capScope: "system",
|
|
38695
|
+
addonId: null,
|
|
38696
|
+
access: "create"
|
|
38697
|
+
},
|
|
38404
38698
|
"recording.refreshStorageLocationsForMigration": {
|
|
38405
38699
|
capName: "recording",
|
|
38406
38700
|
capScope: "system",
|
|
@@ -38527,6 +38821,12 @@ Object.freeze({
|
|
|
38527
38821
|
addonId: null,
|
|
38528
38822
|
access: "view"
|
|
38529
38823
|
},
|
|
38824
|
+
"sceneMonitor.listScenesBatch": {
|
|
38825
|
+
capName: "scene-monitor",
|
|
38826
|
+
capScope: "device",
|
|
38827
|
+
addonId: null,
|
|
38828
|
+
access: "view"
|
|
38829
|
+
},
|
|
38530
38830
|
"sceneMonitor.recheckNow": {
|
|
38531
38831
|
capName: "scene-monitor",
|
|
38532
38832
|
capScope: "device",
|
|
@@ -39883,6 +40183,12 @@ Object.freeze({
|
|
|
39883
40183
|
addonId: null,
|
|
39884
40184
|
access: "view"
|
|
39885
40185
|
},
|
|
40186
|
+
"zoneAnalytics.getCurrentSnapshotBatch": {
|
|
40187
|
+
capName: "zone-analytics",
|
|
40188
|
+
capScope: "device",
|
|
40189
|
+
addonId: null,
|
|
40190
|
+
access: "view"
|
|
40191
|
+
},
|
|
39886
40192
|
"zoneAnalytics.getUnzonedHistory": {
|
|
39887
40193
|
capName: "zone-analytics",
|
|
39888
40194
|
capScope: "device",
|
|
@@ -40887,6 +41193,11 @@ Object.freeze({
|
|
|
40887
41193
|
form: "single",
|
|
40888
41194
|
optional: false
|
|
40889
41195
|
}],
|
|
41196
|
+
"pipelineAnalytics.getKeyEventsBatch": [{
|
|
41197
|
+
name: "deviceIds",
|
|
41198
|
+
form: "array",
|
|
41199
|
+
optional: false
|
|
41200
|
+
}],
|
|
40890
41201
|
"pipelineAnalytics.getMotionEvents": [{
|
|
40891
41202
|
name: "deviceId",
|
|
40892
41203
|
form: "single",
|
|
@@ -40992,6 +41303,11 @@ Object.freeze({
|
|
|
40992
41303
|
form: "single",
|
|
40993
41304
|
optional: true
|
|
40994
41305
|
}],
|
|
41306
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
41307
|
+
name: "deviceIds",
|
|
41308
|
+
form: "array",
|
|
41309
|
+
optional: true
|
|
41310
|
+
}],
|
|
40995
41311
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40996
41312
|
name: "deviceId",
|
|
40997
41313
|
form: "single",
|
|
@@ -41327,6 +41643,11 @@ Object.freeze({
|
|
|
41327
41643
|
form: "single",
|
|
41328
41644
|
optional: false
|
|
41329
41645
|
}],
|
|
41646
|
+
"recording.reconcileLedgerAgainstDisk": [{
|
|
41647
|
+
name: "deviceId",
|
|
41648
|
+
form: "single",
|
|
41649
|
+
optional: true
|
|
41650
|
+
}],
|
|
41330
41651
|
"recording.relocateFootage": [{
|
|
41331
41652
|
name: "deviceId",
|
|
41332
41653
|
form: "single",
|
|
@@ -41392,6 +41713,11 @@ Object.freeze({
|
|
|
41392
41713
|
form: "single",
|
|
41393
41714
|
optional: false
|
|
41394
41715
|
}],
|
|
41716
|
+
"sceneMonitor.listScenesBatch": [{
|
|
41717
|
+
name: "deviceIds",
|
|
41718
|
+
form: "array",
|
|
41719
|
+
optional: false
|
|
41720
|
+
}],
|
|
41395
41721
|
"sceneMonitor.recheckNow": [{
|
|
41396
41722
|
name: "deviceId",
|
|
41397
41723
|
form: "single",
|
|
@@ -41653,6 +41979,11 @@ Object.freeze({
|
|
|
41653
41979
|
form: "single",
|
|
41654
41980
|
optional: false
|
|
41655
41981
|
}],
|
|
41982
|
+
"zoneAnalytics.getCurrentSnapshotBatch": [{
|
|
41983
|
+
name: "deviceIds",
|
|
41984
|
+
form: "array",
|
|
41985
|
+
optional: false
|
|
41986
|
+
}],
|
|
41656
41987
|
"zoneAnalytics.getUnzonedHistory": [{
|
|
41657
41988
|
name: "deviceId",
|
|
41658
41989
|
form: "single",
|