@camstack/addon-provider-wyze 0.2.127 → 0.2.129
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 +924 -472
- package/dist/addon.mjs +924 -472
- package/package.json +1 -1
package/dist/addon.mjs
CHANGED
|
@@ -10,7 +10,7 @@ import { getCACertificates, setDefaultCACertificates } from "node:tls";
|
|
|
10
10
|
//#region \0rolldown/runtime.js
|
|
11
11
|
var __require$1 = /* @__PURE__ */ createRequire(import.meta.url);
|
|
12
12
|
//#endregion
|
|
13
|
-
//#region ../types/dist/event-category-
|
|
13
|
+
//#region ../types/dist/event-category-B_0XEcLF.mjs
|
|
14
14
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
15
15
|
EventCategory["SystemBoot"] = "system.boot";
|
|
16
16
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -511,15 +511,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
511
511
|
EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
|
|
512
512
|
EventCategory["AgentBackupActivated"] = "agent.backup.activated";
|
|
513
513
|
EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
|
|
514
|
-
/**
|
|
515
|
-
* Per-agent hwaccel preference changed (user override set, cleared, or
|
|
516
|
-
* re-probed). Observability event — decoders pull the current pref at
|
|
517
|
-
* `createSession`, so running sessions keep their current backend until
|
|
518
|
-
* they rotate naturally (camera add/remove, stream restart). Future
|
|
519
|
-
* work can wire a listener in stream-broker that force-rotates live
|
|
520
|
-
* sessions; for now this event powers logs + admin-UI toast feedback.
|
|
521
|
-
*/
|
|
522
|
-
EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
|
|
523
514
|
EventCategory["MotionAnalysis"] = "detection.motion-analysis";
|
|
524
515
|
/** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
|
|
525
516
|
EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
|
|
@@ -5390,7 +5381,7 @@ var ZodIssueCode = {
|
|
|
5390
5381
|
var ZodFirstPartyTypeKind;
|
|
5391
5382
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5392
5383
|
//#endregion
|
|
5393
|
-
//#region ../types/dist/sleep-
|
|
5384
|
+
//#region ../types/dist/sleep-BNeXenvr.mjs
|
|
5394
5385
|
/**
|
|
5395
5386
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5396
5387
|
* window to float samples (D455).
|
|
@@ -6756,32 +6747,12 @@ object({
|
|
|
6756
6747
|
audioCodec: string().optional(),
|
|
6757
6748
|
metadata: record(string(), unknown()).readonly().optional()
|
|
6758
6749
|
});
|
|
6759
|
-
var EncodedPacketSchema = object({
|
|
6760
|
-
type: _enum(["video", "audio"]),
|
|
6761
|
-
data: _instanceof(Uint8Array),
|
|
6762
|
-
pts: number(),
|
|
6763
|
-
dts: number(),
|
|
6764
|
-
keyframe: boolean(),
|
|
6765
|
-
codec: string()
|
|
6766
|
-
});
|
|
6767
|
-
var DecodedFrameSchema = object({
|
|
6768
|
-
data: _instanceof(Uint8Array),
|
|
6769
|
-
width: number(),
|
|
6770
|
-
height: number(),
|
|
6771
|
-
format: _enum([
|
|
6772
|
-
"jpeg",
|
|
6773
|
-
"rgb",
|
|
6774
|
-
"bgr",
|
|
6775
|
-
"yuv420",
|
|
6776
|
-
"gray"
|
|
6777
|
-
]),
|
|
6778
|
-
timestamp: number()
|
|
6779
|
-
});
|
|
6780
6750
|
/**
|
|
6781
6751
|
* Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
|
|
6782
6752
|
* frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
|
|
6783
|
-
* interface in `interfaces/frame-handle.ts` field-for-field so a
|
|
6784
|
-
*
|
|
6753
|
+
* interface in `interfaces/frame-handle.ts` field-for-field so a cap method
|
|
6754
|
+
* (the runner's native-crop and pipeline-executor inputs) can carry handles
|
|
6755
|
+
* over tRPC / Moleculer.
|
|
6785
6756
|
*
|
|
6786
6757
|
* The `satisfies` assertion below pins this schema to the interface: if a
|
|
6787
6758
|
* field is added to / removed from `FrameHandle` without a matching schema
|
|
@@ -6807,50 +6778,6 @@ var FrameHandleSchema = object({
|
|
|
6807
6778
|
slotCount: number().int().positive()
|
|
6808
6779
|
});
|
|
6809
6780
|
/**
|
|
6810
|
-
* Pixel format a frame-handle subscriber can request from the broker
|
|
6811
|
-
* (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
|
|
6812
|
-
* `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
|
|
6813
|
-
* `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
|
|
6814
|
-
* payload, and no decoded-frame consumer requests it over the shm plane.
|
|
6815
|
-
*/
|
|
6816
|
-
var FrameHandleFormatSchema = _enum([
|
|
6817
|
-
"rgb",
|
|
6818
|
-
"bgr",
|
|
6819
|
-
"yuv420",
|
|
6820
|
-
"gray"
|
|
6821
|
-
]);
|
|
6822
|
-
/**
|
|
6823
|
-
* Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
|
|
6824
|
-
* broker for a `FrameHandle` stream of one `format`; the broker maintains one
|
|
6825
|
-
* shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
|
|
6826
|
-
* subscriber (motion) and an `rgb` subscriber (detection) each read the format
|
|
6827
|
-
* they asked for with no broker-side conversion.
|
|
6828
|
-
*/
|
|
6829
|
-
var SubscribeFramesInputSchema = object({
|
|
6830
|
-
brokerId: string(),
|
|
6831
|
-
format: FrameHandleFormatSchema,
|
|
6832
|
-
/**
|
|
6833
|
-
* Optional reader-side cadence hint in frames per second. The broker does
|
|
6834
|
-
* NOT throttle — latest-wins ring reads drop frames implicitly for a slow
|
|
6835
|
-
* consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
|
|
6836
|
-
* the consumer can pace its own `pullFrameHandles` polling.
|
|
6837
|
-
*/
|
|
6838
|
-
maxFps: number().positive().optional(),
|
|
6839
|
-
/** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
|
|
6840
|
-
tag: string().optional()
|
|
6841
|
-
});
|
|
6842
|
-
/**
|
|
6843
|
-
* Result of `stream-broker.subscribeFrames`. The consumer then polls
|
|
6844
|
-
* `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
|
|
6845
|
-
* `FrameHandle` to a `FrameRingReader`.
|
|
6846
|
-
*/
|
|
6847
|
-
var SubscribeFramesResultSchema = object({
|
|
6848
|
-
/** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
|
|
6849
|
-
subscriptionId: string(),
|
|
6850
|
-
/** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
|
|
6851
|
-
maxFps: number().nonnegative()
|
|
6852
|
-
});
|
|
6853
|
-
/**
|
|
6854
6781
|
* Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
|
|
6855
6782
|
* `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
|
|
6856
6783
|
* sample bytes plus the track parameters a consumer needs to interpret them.
|
|
@@ -6858,8 +6785,8 @@ var SubscribeFramesResultSchema = object({
|
|
|
6858
6785
|
* Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
|
|
6859
6786
|
* Float32 PCM), so unlike video frames they ship their bytes INLINE over
|
|
6860
6787
|
* tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
|
|
6861
|
-
* (the wire-serialisable supertype of `Buffer`)
|
|
6862
|
-
*
|
|
6788
|
+
* (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
|
|
6789
|
+
* it.
|
|
6863
6790
|
*/
|
|
6864
6791
|
var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
|
|
6865
6792
|
var DecodedAudioChunkSchema = object({
|
|
@@ -6877,11 +6804,10 @@ var DecodedAudioChunkSchema = object({
|
|
|
6877
6804
|
format: AudioChunkFormatSchema.optional()
|
|
6878
6805
|
});
|
|
6879
6806
|
/**
|
|
6880
|
-
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9).
|
|
6881
|
-
*
|
|
6882
|
-
*
|
|
6883
|
-
*
|
|
6884
|
-
* `pullAudioChunks`.
|
|
6807
|
+
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
|
|
6808
|
+
* its bytes inline: a consumer asks the broker for the decoded audio-chunk
|
|
6809
|
+
* stream of one broker; the broker keeps a per-subscription bounded FIFO queue
|
|
6810
|
+
* the consumer drains via `pullAudioChunks`.
|
|
6885
6811
|
*/
|
|
6886
6812
|
var SubscribeAudioChunksInputSchema = object({
|
|
6887
6813
|
brokerId: string(),
|
|
@@ -6912,9 +6838,7 @@ var BrokerStatsSchema = object({
|
|
|
6912
6838
|
"stopped"
|
|
6913
6839
|
]),
|
|
6914
6840
|
inputFps: number(),
|
|
6915
|
-
decodeFps: number(),
|
|
6916
6841
|
encodedSubscribers: number(),
|
|
6917
|
-
decodedSubscribers: number(),
|
|
6918
6842
|
uptimeMs: number(),
|
|
6919
6843
|
bitrateKbps: number(),
|
|
6920
6844
|
idrIntervalMs: number(),
|
|
@@ -6927,14 +6851,6 @@ var BrokerStatsSchema = object({
|
|
|
6927
6851
|
preBufferMs: number(),
|
|
6928
6852
|
preBufferPackets: number(),
|
|
6929
6853
|
/**
|
|
6930
|
-
* Moleculer node id of the decoder provider currently servicing this
|
|
6931
|
-
* stream's decoded subscribers. `null` until the deferred decoder is
|
|
6932
|
-
* created (no decoded clients yet, or codec not detected). Surfaces the
|
|
6933
|
-
* runtime decoder placement so the UI can show "Decoder: <agent>" without
|
|
6934
|
-
* a separate cap call per broker.
|
|
6935
|
-
*/
|
|
6936
|
-
decoderNodeId: string().nullable(),
|
|
6937
|
-
/**
|
|
6938
6854
|
* Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
|
|
6939
6855
|
* when the stream has no audio track or the broker is in cold start.
|
|
6940
6856
|
* `supported = false` means the codec was detected but the local
|
|
@@ -10290,70 +10206,6 @@ var StorageLocationDeclarationSchema = object({
|
|
|
10290
10206
|
"backup"
|
|
10291
10207
|
]).optional()
|
|
10292
10208
|
});
|
|
10293
|
-
var DecoderStatsSchema = object({
|
|
10294
|
-
inputFps: number(),
|
|
10295
|
-
outputFps: number(),
|
|
10296
|
-
avgDecodeTimeMs: number(),
|
|
10297
|
-
droppedFrames: number(),
|
|
10298
|
-
/**
|
|
10299
|
-
* Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
|
|
10300
|
-
* lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
|
|
10301
|
-
* the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
|
|
10302
|
-
* is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
|
|
10303
|
-
*/
|
|
10304
|
-
lagMs: number().optional(),
|
|
10305
|
-
effectiveFps: number().optional(),
|
|
10306
|
-
adaptiveFps: number().optional()
|
|
10307
|
-
});
|
|
10308
|
-
var DecoderSessionConfigSchema = object({
|
|
10309
|
-
codec: string(),
|
|
10310
|
-
maxFps: number().default(0),
|
|
10311
|
-
outputFormat: _enum([
|
|
10312
|
-
"jpeg",
|
|
10313
|
-
"rgb",
|
|
10314
|
-
"bgr",
|
|
10315
|
-
"yuv420",
|
|
10316
|
-
"gray"
|
|
10317
|
-
]).default("jpeg"),
|
|
10318
|
-
scale: number().default(1),
|
|
10319
|
-
width: number().optional(),
|
|
10320
|
-
height: number().optional(),
|
|
10321
|
-
/**
|
|
10322
|
-
* Identifier of the camera this decoder session serves. Optional
|
|
10323
|
-
* because the cap is generic (any caller could request decode), but
|
|
10324
|
-
* stream-broker passes it so decoder logs include `deviceId` for
|
|
10325
|
-
* per-camera filtering when diagnosing failures (e.g. node-av
|
|
10326
|
-
* sendPacket errors on a single hung camera).
|
|
10327
|
-
*/
|
|
10328
|
-
deviceId: number().int().nonnegative().optional(),
|
|
10329
|
-
/**
|
|
10330
|
-
* Free-form tag for log scoping. Stream-broker uses
|
|
10331
|
-
* `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
|
|
10332
|
-
* on every line so `grep tag=broker:5/high` filters one camera
|
|
10333
|
-
* profile cleanly.
|
|
10334
|
-
*/
|
|
10335
|
-
tag: string().optional(),
|
|
10336
|
-
/**
|
|
10337
|
-
* Where the session delivers decoded frames (Phase 5 / D9):
|
|
10338
|
-
*
|
|
10339
|
-
* - `'callback'` (default) — the legacy pixel path: decoded frames are
|
|
10340
|
-
* buffered as `DecodedFrame`s and drained via `pullFrames`.
|
|
10341
|
-
* - `'shm'` — the shared-memory frame plane: decoded frames are written
|
|
10342
|
-
* into an OS shared-memory ring and drained as zero-pixel
|
|
10343
|
-
* `FrameHandle`s via `pullHandles`. A session is one mode or the
|
|
10344
|
-
* other — `pullFrames` returns nothing for an `'shm'` session and
|
|
10345
|
-
* `pullHandles` returns nothing for a `'callback'` session.
|
|
10346
|
-
*/
|
|
10347
|
-
frameSink: _enum(["callback", "shm"]).default("callback"),
|
|
10348
|
-
/**
|
|
10349
|
-
* Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
|
|
10350
|
-
* a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
|
|
10351
|
-
* real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
|
|
10352
|
-
* stream-broker's `streamingDebug` gate — off by default so production logs
|
|
10353
|
-
* stay quiet and the emit path pays zero per-frame cost when disabled.
|
|
10354
|
-
*/
|
|
10355
|
-
debug: boolean().optional()
|
|
10356
|
-
});
|
|
10357
10209
|
/**
|
|
10358
10210
|
* Per-component log CHANNELS — the gate a hot path consults, and the registry
|
|
10359
10211
|
* an addon declares its channels in.
|
|
@@ -10496,6 +10348,26 @@ var ClipSearchStrictnessSchema = _enum([
|
|
|
10496
10348
|
"balanced",
|
|
10497
10349
|
"strict"
|
|
10498
10350
|
]);
|
|
10351
|
+
/** Steps whose effect a root label can BE. */
|
|
10352
|
+
var LABEL_SUPPLY_STEP_IDS = [
|
|
10353
|
+
"animal-classifier",
|
|
10354
|
+
"vehicle-classifier",
|
|
10355
|
+
"package-detection"
|
|
10356
|
+
];
|
|
10357
|
+
/** Steps whose box a root detection can BE. */
|
|
10358
|
+
var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
|
|
10359
|
+
/**
|
|
10360
|
+
* Steps whose per-detection MASK a root detection can carry (D737). The live
|
|
10361
|
+
* mask step is `segmentation` — a frame-plane refiner that runs its own model
|
|
10362
|
+
* once per detection crop. (`instance-segmentation` is a dormant step id that
|
|
10363
|
+
* no camera tree carries.)
|
|
10364
|
+
*/
|
|
10365
|
+
var MASK_SUPPLY_STEP_IDS = ["segmentation"];
|
|
10366
|
+
[
|
|
10367
|
+
...LABEL_SUPPLY_STEP_IDS,
|
|
10368
|
+
...CROP_SUPPLY_STEP_IDS,
|
|
10369
|
+
...MASK_SUPPLY_STEP_IDS
|
|
10370
|
+
];
|
|
10499
10371
|
var MODEL_FORMATS = [
|
|
10500
10372
|
"onnx",
|
|
10501
10373
|
"coreml",
|
|
@@ -10524,7 +10396,53 @@ var ModelFormatEntrySchema = object({
|
|
|
10524
10396
|
/** Multi-file payload (directory members or sibling files). */
|
|
10525
10397
|
files: array(string()).readonly().optional(),
|
|
10526
10398
|
/** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
|
|
10527
|
-
runtimes: array(_enum(["python"])).readonly().optional()
|
|
10399
|
+
runtimes: array(_enum(["python"])).readonly().optional(),
|
|
10400
|
+
/**
|
|
10401
|
+
* Content revision of the artefact, for one hosted OFF the CamStack mirror.
|
|
10402
|
+
* A format on the mirror leaves it unset: its revision (the sha256 of its
|
|
10403
|
+
* weight file) comes from the downloader's generated table, kept in step
|
|
10404
|
+
* with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
|
|
10405
|
+
* node records the revision it downloaded next to the file
|
|
10406
|
+
* (`<file>.revision`); a copy with no record or a different one is stale
|
|
10407
|
+
* unless its weight file hashes to the revision, and a stale copy is
|
|
10408
|
+
* downloaded again, the old one serving until the new one is complete. No
|
|
10409
|
+
* revision at all ⇒ a file on disk is current, whatever it holds (D743).
|
|
10410
|
+
*/
|
|
10411
|
+
revision: string().min(1).optional()
|
|
10412
|
+
});
|
|
10413
|
+
/**
|
|
10414
|
+
* What a node holds for one (model, format) (D746). `current` is a complete
|
|
10415
|
+
* copy at its catalog revision — exactly what `downloaded: true` means.
|
|
10416
|
+
* `stale` is bytes on disk that are not (yet) proven current under D743/D744:
|
|
10417
|
+
* no or a different revision record, or a missing sibling. `missing` is no
|
|
10418
|
+
* copy. `downloaded` alone folds `stale` into "not downloaded", which hid
|
|
10419
|
+
* reclaimable bytes and a copy about to be replaced.
|
|
10420
|
+
*/
|
|
10421
|
+
var ModelOnDiskStateSchema = _enum([
|
|
10422
|
+
"current",
|
|
10423
|
+
"stale",
|
|
10424
|
+
"missing"
|
|
10425
|
+
]);
|
|
10426
|
+
/**
|
|
10427
|
+
* The numeric precision of one format's BUILD (D746) — reported only when the
|
|
10428
|
+
* build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
|
|
10429
|
+
* CamStack Core ML export). Absent means "not stated", never "fp32".
|
|
10430
|
+
*/
|
|
10431
|
+
var ModelFormatPrecisionSchema = _enum([
|
|
10432
|
+
"fp32",
|
|
10433
|
+
"fp16",
|
|
10434
|
+
"int8"
|
|
10435
|
+
]);
|
|
10436
|
+
/**
|
|
10437
|
+
* One format of one model as a node's `pipelineExecutor.getSchema` reports it.
|
|
10438
|
+
* `onDisk` / `precision` are optional for version skew: a runner that predates
|
|
10439
|
+
* them omits them, and a reader falls back to `downloaded`.
|
|
10440
|
+
*/
|
|
10441
|
+
var PipelineModelFormatStatusSchema = object({
|
|
10442
|
+
downloaded: boolean(),
|
|
10443
|
+
sizeMB: number(),
|
|
10444
|
+
onDisk: ModelOnDiskStateSchema.optional(),
|
|
10445
|
+
precision: ModelFormatPrecisionSchema.optional()
|
|
10528
10446
|
});
|
|
10529
10447
|
/**
|
|
10530
10448
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
@@ -10628,6 +10546,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
|
|
|
10628
10546
|
/** True when the weights or their data forbid commercial use. */
|
|
10629
10547
|
nonCommercial: boolean().optional()
|
|
10630
10548
|
}));
|
|
10549
|
+
/**
|
|
10550
|
+
* One step a ROOT detector can supply from its own output (D730) — see
|
|
10551
|
+
* `ModelCatalogEntry.suppliesSteps`.
|
|
10552
|
+
*
|
|
10553
|
+
* - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
|
|
10554
|
+
* the root's label to the step's vocabulary; `uncovered` is the vocabulary
|
|
10555
|
+
* the root cannot produce (shown as unavailable, never a blocker).
|
|
10556
|
+
* - `crop`: the root draws the box the step would have found (`license_plate`
|
|
10557
|
+
* for plate-detection, `face` for face-detection). The box becomes a detail
|
|
10558
|
+
* child of the `parentMacro` detection that contains it — never a track.
|
|
10559
|
+
* - `mask`: the root's decode emits an instance mask with every detection (a
|
|
10560
|
+
* YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
|
|
10561
|
+
* detection in the shape that step produces. Derived from the model's
|
|
10562
|
+
* postprocessor on read, never stored by an import.
|
|
10563
|
+
*/
|
|
10564
|
+
var RootStepSupplySchema = discriminatedUnion("kind", [
|
|
10565
|
+
object({
|
|
10566
|
+
kind: literal("label"),
|
|
10567
|
+
stepId: _enum(LABEL_SUPPLY_STEP_IDS),
|
|
10568
|
+
labelToEffect: record(string(), string()),
|
|
10569
|
+
uncovered: array(string()).readonly()
|
|
10570
|
+
}),
|
|
10571
|
+
object({
|
|
10572
|
+
kind: literal("crop"),
|
|
10573
|
+
stepId: _enum(CROP_SUPPLY_STEP_IDS),
|
|
10574
|
+
rootLabels: array(string()).readonly(),
|
|
10575
|
+
parentMacro: _enum(["vehicle", "person"]),
|
|
10576
|
+
childClass: _enum(["plate", "face"]),
|
|
10577
|
+
/**
|
|
10578
|
+
* The root's smaller input side, stamped on read by `rootSuppliesOf` from
|
|
10579
|
+
* the model entry — what a step's `minRootInputPx` gate judges. Never
|
|
10580
|
+
* stored by an import.
|
|
10581
|
+
*/
|
|
10582
|
+
rootInputPx: number().int().positive().optional()
|
|
10583
|
+
}),
|
|
10584
|
+
object({
|
|
10585
|
+
kind: literal("mask"),
|
|
10586
|
+
stepId: _enum(MASK_SUPPLY_STEP_IDS)
|
|
10587
|
+
})
|
|
10588
|
+
]);
|
|
10631
10589
|
var ModelCatalogEntrySchema = object({
|
|
10632
10590
|
id: string(),
|
|
10633
10591
|
name: string(),
|
|
@@ -10693,6 +10651,35 @@ var ModelCatalogEntrySchema = object({
|
|
|
10693
10651
|
*/
|
|
10694
10652
|
defaultConfidence: number().min(0).max(1).optional(),
|
|
10695
10653
|
/**
|
|
10654
|
+
* Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
|
|
10655
|
+
* on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
|
|
10656
|
+
* absent here runs at the step slider's global default. The same row shape
|
|
10657
|
+
* the floor measurement produces (`model-floors.json`: modelId → floors), so
|
|
10658
|
+
* a measured table is copied in as-is. An operator override is bound to the
|
|
10659
|
+
* model it was made for and does not survive a model change (D738). A custom
|
|
10660
|
+
* / imported model may declare it; without it, the global defaults apply.
|
|
10661
|
+
*/
|
|
10662
|
+
defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
|
|
10663
|
+
/**
|
|
10664
|
+
* The inference precision this model's OpenVINO IR needs on an Intel GPU.
|
|
10665
|
+
* Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
|
|
10666
|
+
* that produces invalid output at f16 — measured 2026-10-07 for YOLO26
|
|
10667
|
+
* base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
|
|
10668
|
+
* scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
|
|
10669
|
+
* `PoolModelConfig.gpuInferencePrecision`; the pool sets
|
|
10670
|
+
* INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
|
|
10671
|
+
*/
|
|
10672
|
+
gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
|
|
10673
|
+
/**
|
|
10674
|
+
* ROOT detectors only: per supplied step (`animal-classifier`, …), the
|
|
10675
|
+
* minimum DETECTION score from which this root's own fine label (species,
|
|
10676
|
+
* vehicle type — D736 root supply) is taken (D741). Below it the detection
|
|
10677
|
+
* keeps its macro class without the fine label. `1` = never take it from
|
|
10678
|
+
* this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
|
|
10679
|
+
* `minConfidence` slider, bound to the ROOT model, overrides it.
|
|
10680
|
+
*/
|
|
10681
|
+
suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
|
|
10682
|
+
/**
|
|
10696
10683
|
* When true, the executor produces a landmark-aligned crop (similarity warp
|
|
10697
10684
|
* onto the canonical template) before this step runs, instead of a plain
|
|
10698
10685
|
* axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
|
|
@@ -10754,6 +10741,16 @@ var ModelCatalogEntrySchema = object({
|
|
|
10754
10741
|
*/
|
|
10755
10742
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
10756
10743
|
/**
|
|
10744
|
+
* The pipeline steps this ROOT detector can supply from its own output
|
|
10745
|
+
* (D730): its labels name a step's effect (`deer` for `animal-classifier`)
|
|
10746
|
+
* or draw a step's box (`license_plate` for `plate-detection`). Computed at
|
|
10747
|
+
* import from THIS model's labelmap by `deriveRootSupplies`, never written
|
|
10748
|
+
* by hand and never assumed per family; a row without it is derived on read
|
|
10749
|
+
* (`rootSuppliesOf`). Whether a camera uses it is the step's own
|
|
10750
|
+
* `useRootModel` flag (`resolveRootSupply`).
|
|
10751
|
+
*/
|
|
10752
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
|
|
10753
|
+
/**
|
|
10757
10754
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
10758
10755
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
10759
10756
|
* CLIP image encoder; its absence is what "not a CLIP model" means to the
|
|
@@ -12355,13 +12352,6 @@ var BrokerRtspClientSchema = object({
|
|
|
12355
12352
|
lastRtpAt: number(),
|
|
12356
12353
|
bytesSent: number()
|
|
12357
12354
|
});
|
|
12358
|
-
var BrokerDecodedClientSchema = object({
|
|
12359
|
-
tag: string(),
|
|
12360
|
-
subscribedAt: number(),
|
|
12361
|
-
maxFps: number(),
|
|
12362
|
-
framesDelivered: number(),
|
|
12363
|
-
framesDropped: number()
|
|
12364
|
-
});
|
|
12365
12355
|
var BrokerAudioClientSchema = object({
|
|
12366
12356
|
tag: string(),
|
|
12367
12357
|
subscribedAt: number(),
|
|
@@ -12453,7 +12443,6 @@ var BrokerEncodedClientSchema = object({
|
|
|
12453
12443
|
});
|
|
12454
12444
|
var BrokerClientsSchema = object({
|
|
12455
12445
|
rtsp: array(BrokerRtspClientSchema).readonly(),
|
|
12456
|
-
decoded: array(BrokerDecodedClientSchema).readonly(),
|
|
12457
12446
|
audio: array(BrokerAudioClientSchema).readonly(),
|
|
12458
12447
|
encoded: array(BrokerEncodedClientSchema).readonly(),
|
|
12459
12448
|
pipeClients: number(),
|
|
@@ -12822,11 +12811,7 @@ method(object({
|
|
|
12822
12811
|
auth: "admin"
|
|
12823
12812
|
}), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
|
|
12824
12813
|
brokerId: string(),
|
|
12825
|
-
channel: _enum([
|
|
12826
|
-
"rtsp",
|
|
12827
|
-
"decoded",
|
|
12828
|
-
"audio"
|
|
12829
|
-
]),
|
|
12814
|
+
channel: _enum(["rtsp", "audio"]),
|
|
12830
12815
|
handle: string()
|
|
12831
12816
|
}), object({ killed: boolean() }), {
|
|
12832
12817
|
kind: "mutation",
|
|
@@ -12861,10 +12846,7 @@ method(object({
|
|
|
12861
12846
|
}), method(SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, { kind: "mutation" }), method(object({
|
|
12862
12847
|
subscriptionId: string(),
|
|
12863
12848
|
maxCount: number().int().positive().default(8)
|
|
12864
|
-
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(
|
|
12865
|
-
subscriptionId: string(),
|
|
12866
|
-
maxCount: number().int().positive().default(4)
|
|
12867
|
-
}), array(FrameHandleSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
12849
|
+
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
12868
12850
|
brokerId: string(),
|
|
12869
12851
|
seconds: number().min(0).max(30)
|
|
12870
12852
|
}), _void(), {
|
|
@@ -14123,54 +14105,12 @@ id: union([string(), number()]) }), {
|
|
|
14123
14105
|
kind: "mutation",
|
|
14124
14106
|
auth: "admin"
|
|
14125
14107
|
});
|
|
14126
|
-
|
|
14127
|
-
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
14128
|
-
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
14129
|
-
* observe ring pressure (slot count, byte budget, hit/miss ratio).
|
|
14130
|
-
*/
|
|
14131
|
-
var ShmRingStatsSchema = object({
|
|
14132
|
-
sessionId: string(),
|
|
14133
|
-
slotCount: number().int(),
|
|
14134
|
-
slotByteLength: number().int(),
|
|
14135
|
-
segmentBytes: number().int(),
|
|
14136
|
-
budgetMb: number().int(),
|
|
14137
|
-
framesWritten: number().int(),
|
|
14138
|
-
getFrameHits: number().int(),
|
|
14139
|
-
getFrameMisses: number().int()
|
|
14140
|
-
});
|
|
14141
|
-
method(object({ codec: string() }), boolean()), method(_void(), object({
|
|
14108
|
+
method(_void(), object({
|
|
14142
14109
|
id: string(),
|
|
14143
14110
|
name: string(),
|
|
14144
|
-
isPullMode: boolean().optional(),
|
|
14145
|
-
priority: number().optional(),
|
|
14146
14111
|
hwaccel: string().optional(),
|
|
14147
14112
|
probedBestHwaccel: string().optional()
|
|
14148
|
-
})), method(
|
|
14149
|
-
sessionId: string(),
|
|
14150
|
-
nodeId: string()
|
|
14151
|
-
})), method(object({ sessionId: string() }), _void()), method(object({
|
|
14152
|
-
sessionId: string(),
|
|
14153
|
-
packet: EncodedPacketSchema
|
|
14154
|
-
}), _void()), method(object({
|
|
14155
|
-
sessionId: string(),
|
|
14156
|
-
url: string()
|
|
14157
|
-
}), _void()), method(object({
|
|
14158
|
-
sessionId: string(),
|
|
14159
|
-
maxCount: number().default(1),
|
|
14160
|
-
waitMs: number().optional()
|
|
14161
|
-
}), array(DecodedFrameSchema)), method(object({
|
|
14162
|
-
sessionId: string(),
|
|
14163
|
-
maxCount: number().default(1),
|
|
14164
|
-
waitMs: number().optional()
|
|
14165
|
-
}), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
|
|
14166
|
-
sessionId: string(),
|
|
14167
|
-
config: DecoderSessionConfigSchema.partial()
|
|
14168
|
-
}), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
|
|
14169
|
-
sessionId: string(),
|
|
14170
|
-
codec: string(),
|
|
14171
|
-
outputFormat: string(),
|
|
14172
|
-
createdAtMs: number()
|
|
14173
|
-
})).readonly()), method(_void(), object({ backend: string() }), {
|
|
14113
|
+
})), method(_void(), object({ backend: string() }), {
|
|
14174
14114
|
kind: "mutation",
|
|
14175
14115
|
auth: "admin"
|
|
14176
14116
|
});
|
|
@@ -16219,6 +16159,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
|
16219
16159
|
kind: "mutation",
|
|
16220
16160
|
auth: "admin"
|
|
16221
16161
|
});
|
|
16162
|
+
var HUB_ADDRESS_ROLES = [
|
|
16163
|
+
"appConnections",
|
|
16164
|
+
"notificationTaps",
|
|
16165
|
+
"internal",
|
|
16166
|
+
"publicEndpoint"
|
|
16167
|
+
];
|
|
16222
16168
|
/**
|
|
16223
16169
|
* Transport bounds for AI capability methods.
|
|
16224
16170
|
*
|
|
@@ -18821,6 +18767,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
18821
18767
|
"stream-offline",
|
|
18822
18768
|
"node-online",
|
|
18823
18769
|
"node-offline",
|
|
18770
|
+
"node-restarting",
|
|
18771
|
+
"node-updating",
|
|
18824
18772
|
"node-inference-unavailable",
|
|
18825
18773
|
"detection-blind",
|
|
18826
18774
|
"addon-crash-loop",
|
|
@@ -20426,7 +20374,13 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
20426
20374
|
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
20427
20375
|
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
20428
20376
|
*/
|
|
20429
|
-
notifySensorRewatched: boolean().optional()
|
|
20377
|
+
notifySensorRewatched: boolean().optional(),
|
|
20378
|
+
/**
|
|
20379
|
+
* D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
|
|
20380
|
+
* change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
|
|
20381
|
+
* re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
|
|
20382
|
+
*/
|
|
20383
|
+
notifySensorIgnored: boolean().optional()
|
|
20430
20384
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20431
20385
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20432
20386
|
mode: AlarmArmModeSchema,
|
|
@@ -20439,7 +20393,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
20439
20393
|
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20440
20394
|
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
20441
20395
|
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20442
|
-
notifySensorRewatched: boolean().nullable().optional()
|
|
20396
|
+
notifySensorRewatched: boolean().nullable().optional(),
|
|
20397
|
+
/** D735: set the switch, or `null` to clear it (back to the default, false). */
|
|
20398
|
+
notifySensorIgnored: boolean().nullable().optional()
|
|
20443
20399
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20444
20400
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20445
20401
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21417,8 +21373,8 @@ Object.freeze(Object.fromEntries([{
|
|
|
21417
21373
|
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
21418
21374
|
stepId: "face-embedding",
|
|
21419
21375
|
key: "minLandmarkFaceSize",
|
|
21420
|
-
label: "Min face size
|
|
21421
|
-
description: "
|
|
21376
|
+
label: "Min face size to embed (detection-frame px)",
|
|
21377
|
+
description: "Faces smaller than this in the small frame the detector sees are not embedded, so they can never be recognised. Below it the face cannot be aligned reliably and a bad embedding matches everyone. Same value on every node. 0 = no limit.",
|
|
21422
21378
|
type: "slider",
|
|
21423
21379
|
min: 0,
|
|
21424
21380
|
max: 64,
|
|
@@ -23338,6 +23294,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
23338
23294
|
timestamp: number()
|
|
23339
23295
|
});
|
|
23340
23296
|
/**
|
|
23297
|
+
* A root model's boxes standing in for one crop-kind step's own inference
|
|
23298
|
+
* (D730) — see `runPipeline.suppliedRoot`.
|
|
23299
|
+
*/
|
|
23300
|
+
var SuppliedRootOutputSchema = object({
|
|
23301
|
+
stepId: string(),
|
|
23302
|
+
/** The root model that drew the boxes — stamped on the result. */
|
|
23303
|
+
modelId: string(),
|
|
23304
|
+
detections: array(object({
|
|
23305
|
+
/** `[x1, y1, x2, y2]` in the pixels of the call's image. */
|
|
23306
|
+
bbox: tuple([
|
|
23307
|
+
number(),
|
|
23308
|
+
number(),
|
|
23309
|
+
number(),
|
|
23310
|
+
number()
|
|
23311
|
+
]),
|
|
23312
|
+
score: number(),
|
|
23313
|
+
/**
|
|
23314
|
+
* Five facial landmarks in the same pixels — a face the step's own
|
|
23315
|
+
* detector already re-found inside a root face box (D730), so its
|
|
23316
|
+
* embedder child aligns it exactly as it aligns any detected face.
|
|
23317
|
+
*/
|
|
23318
|
+
landmarks: array(object({
|
|
23319
|
+
x: number(),
|
|
23320
|
+
y: number()
|
|
23321
|
+
})).optional()
|
|
23322
|
+
})).min(1)
|
|
23323
|
+
});
|
|
23324
|
+
/**
|
|
23341
23325
|
* Reference to the frame's retained NATIVE surface + the parent crop's placement
|
|
23342
23326
|
* within the frame, so the executor can re-cut a leaf child ROI at native
|
|
23343
23327
|
* resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
|
|
@@ -23385,7 +23369,7 @@ var FrameRefSchema = object({
|
|
|
23385
23369
|
timestamp: number(),
|
|
23386
23370
|
capturedAt: number().optional()
|
|
23387
23371
|
});
|
|
23388
|
-
var ModelFormatSchema$
|
|
23372
|
+
var ModelFormatSchema$2 = _enum([
|
|
23389
23373
|
"onnx",
|
|
23390
23374
|
"coreml",
|
|
23391
23375
|
"openvino",
|
|
@@ -23403,7 +23387,7 @@ var PipelineSlotSchema = _enum([
|
|
|
23403
23387
|
var PipelineEngineChoiceSchema = object({
|
|
23404
23388
|
runtime: literal("python"),
|
|
23405
23389
|
backend: string(),
|
|
23406
|
-
format: ModelFormatSchema$
|
|
23390
|
+
format: ModelFormatSchema$2,
|
|
23407
23391
|
device: string().optional()
|
|
23408
23392
|
});
|
|
23409
23393
|
/**
|
|
@@ -23442,32 +23426,15 @@ var PipelineDefaultStepSchema = lazy(() => object({
|
|
|
23442
23426
|
group: string().optional(),
|
|
23443
23427
|
settings: record(string(), unknown()).optional()
|
|
23444
23428
|
}));
|
|
23445
|
-
var PipelineTemplateStepSchema = lazy(() => object({
|
|
23446
|
-
addonId: string(),
|
|
23447
|
-
enabled: boolean(),
|
|
23448
|
-
modelId: string(),
|
|
23449
|
-
children: array(PipelineTemplateStepSchema).readonly(),
|
|
23450
|
-
settings: record(string(), unknown()).optional()
|
|
23451
|
-
}));
|
|
23452
|
-
var PipelineTemplateSchema$1 = object({
|
|
23453
|
-
id: string(),
|
|
23454
|
-
name: string(),
|
|
23455
|
-
createdAt: string(),
|
|
23456
|
-
updatedAt: string(),
|
|
23457
|
-
engine: PipelineEngineChoiceSchema,
|
|
23458
|
-
steps: array(PipelineTemplateStepSchema).readonly()
|
|
23459
|
-
});
|
|
23460
23429
|
var PipelineModelOptionSchema = object({
|
|
23461
23430
|
id: string(),
|
|
23462
23431
|
name: string(),
|
|
23463
|
-
formats: record(string(),
|
|
23464
|
-
downloaded: boolean(),
|
|
23465
|
-
sizeMB: number()
|
|
23466
|
-
})),
|
|
23432
|
+
formats: record(string(), PipelineModelFormatStatusSchema),
|
|
23467
23433
|
group: ModelVariantGroupSchema.optional(),
|
|
23468
23434
|
legacy: boolean().optional(),
|
|
23469
23435
|
provider: ModelProviderIdSchema.optional(),
|
|
23470
|
-
defaultConfidence: number().optional()
|
|
23436
|
+
defaultConfidence: number().optional(),
|
|
23437
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional()
|
|
23471
23438
|
});
|
|
23472
23439
|
var ConfigFieldBridge = custom();
|
|
23473
23440
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -23629,6 +23596,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23629
23596
|
}), {
|
|
23630
23597
|
kind: "mutation",
|
|
23631
23598
|
auth: "admin"
|
|
23599
|
+
}), method(object({
|
|
23600
|
+
nodeId: string(),
|
|
23601
|
+
deviceIds: array(number()).readonly().optional(),
|
|
23602
|
+
dryRun: boolean()
|
|
23603
|
+
}), object({
|
|
23604
|
+
entries: array(object({
|
|
23605
|
+
deviceId: number(),
|
|
23606
|
+
keys: array(string()).readonly()
|
|
23607
|
+
})).readonly(),
|
|
23608
|
+
refused: array(object({
|
|
23609
|
+
deviceId: number(),
|
|
23610
|
+
reason: string()
|
|
23611
|
+
})).readonly()
|
|
23612
|
+
}), {
|
|
23613
|
+
kind: "mutation",
|
|
23614
|
+
auth: "admin"
|
|
23632
23615
|
}), method(object({ nodeId: string() }), object({ unhealthy: array(object({
|
|
23633
23616
|
/** `<backend>:<device>`, e.g. `openvino:gpu`. */
|
|
23634
23617
|
deviceKey: string(),
|
|
@@ -23654,22 +23637,14 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23654
23637
|
}), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({
|
|
23655
23638
|
steps: array(PipelineStepInputSchema),
|
|
23656
23639
|
deviceKey: string().optional()
|
|
23657
|
-
}), PipelineValidationResultSchema), method(_void(),
|
|
23658
|
-
name: string(),
|
|
23659
|
-
steps: array(PipelineTemplateStepSchema).readonly(),
|
|
23660
|
-
engine: PipelineEngineChoiceSchema
|
|
23661
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({
|
|
23662
|
-
id: string(),
|
|
23663
|
-
name: string().optional(),
|
|
23664
|
-
steps: array(PipelineTemplateStepSchema).readonly().optional()
|
|
23665
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
23640
|
+
}), PipelineValidationResultSchema), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
23666
23641
|
addonId: string(),
|
|
23667
23642
|
modelId: string(),
|
|
23668
|
-
format: ModelFormatSchema$
|
|
23643
|
+
format: ModelFormatSchema$2
|
|
23669
23644
|
}), DownloadModelResultSchema, { kind: "mutation" }), method(object({
|
|
23670
23645
|
addonId: string(),
|
|
23671
23646
|
modelId: string(),
|
|
23672
|
-
format: ModelFormatSchema$
|
|
23647
|
+
format: ModelFormatSchema$2
|
|
23673
23648
|
}), object({ success: literal(true) }), { kind: "mutation" }), method(object({
|
|
23674
23649
|
steps: array(PipelineStepInputSchema).min(1),
|
|
23675
23650
|
frame: FrameInputSchema.optional(),
|
|
@@ -23735,7 +23710,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23735
23710
|
* `device-not-servable`), and nothing reaches the camera's live
|
|
23736
23711
|
* trace stream. Absent ⇒ unchanged behaviour.
|
|
23737
23712
|
*/
|
|
23738
|
-
replay: literal(true).optional()
|
|
23713
|
+
replay: literal(true).optional(),
|
|
23714
|
+
/**
|
|
23715
|
+
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
23716
|
+
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
23717
|
+
* step (a Frigate+ `license_plate` for `plate-detection`): the step is
|
|
23718
|
+
* NOT inferred, these boxes are its output, and its children (the plate
|
|
23719
|
+
* reader) run on them through their own crop policy. Boxes are in the
|
|
23720
|
+
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
23721
|
+
*/
|
|
23722
|
+
suppliedRoot: SuppliedRootOutputSchema.optional()
|
|
23739
23723
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
23740
23724
|
steps: array(PipelineStepInputSchema).min(1),
|
|
23741
23725
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
@@ -23817,6 +23801,375 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23817
23801
|
filename: string().optional(),
|
|
23818
23802
|
settings: record(string(), unknown()).optional()
|
|
23819
23803
|
}), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
|
|
23804
|
+
/**
|
|
23805
|
+
* The wire shapes of the Auto tune plan and apply (D745), used by the
|
|
23806
|
+
* `pipeline-orchestrator` cap. The recommender's own types
|
|
23807
|
+
* (`recommend.ts`) are the TS face of the same data; these
|
|
23808
|
+
* schemas are what crosses the cap boundary.
|
|
23809
|
+
*/
|
|
23810
|
+
var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
|
|
23811
|
+
/** The operator's range for it. */
|
|
23812
|
+
var MIN_SESSIONS_PER_DEVICE_RANGE = {
|
|
23813
|
+
min: 1,
|
|
23814
|
+
max: 8
|
|
23815
|
+
};
|
|
23816
|
+
var HardwareClassIdSchema = _enum([
|
|
23817
|
+
"intel-core-ultra",
|
|
23818
|
+
"intel-n-series",
|
|
23819
|
+
"apple-m-base",
|
|
23820
|
+
"apple-m-pro",
|
|
23821
|
+
"unknown"
|
|
23822
|
+
]);
|
|
23823
|
+
var AcceleratorKindSchema = _enum([
|
|
23824
|
+
"intel-npu",
|
|
23825
|
+
"intel-igpu",
|
|
23826
|
+
"x86-cpu",
|
|
23827
|
+
"arm-cpu",
|
|
23828
|
+
"apple-ane",
|
|
23829
|
+
"coral"
|
|
23830
|
+
]);
|
|
23831
|
+
var RecommendationReasonSchema = discriminatedUnion("kind", [
|
|
23832
|
+
object({
|
|
23833
|
+
kind: literal("capacity"),
|
|
23834
|
+
sessions: number(),
|
|
23835
|
+
minSessions: number()
|
|
23836
|
+
}),
|
|
23837
|
+
object({
|
|
23838
|
+
kind: literal("tie-faster"),
|
|
23839
|
+
over: string(),
|
|
23840
|
+
recallDelta: number()
|
|
23841
|
+
}),
|
|
23842
|
+
object({
|
|
23843
|
+
kind: literal("stepped-down"),
|
|
23844
|
+
from: string(),
|
|
23845
|
+
to: string(),
|
|
23846
|
+
limitedBy: string()
|
|
23847
|
+
}),
|
|
23848
|
+
object({
|
|
23849
|
+
kind: literal("no-fit-lightest"),
|
|
23850
|
+
sessions: number(),
|
|
23851
|
+
minSessions: number()
|
|
23852
|
+
}),
|
|
23853
|
+
object({
|
|
23854
|
+
kind: literal("derived-latency"),
|
|
23855
|
+
modelId: string()
|
|
23856
|
+
}),
|
|
23857
|
+
object({ kind: literal("cpu-device") }),
|
|
23858
|
+
object({ kind: literal("coral-untouched") }),
|
|
23859
|
+
object({ kind: literal("device-disabled") }),
|
|
23860
|
+
object({ kind: literal("device-unavailable") }),
|
|
23861
|
+
object({ kind: literal("node-offline") }),
|
|
23862
|
+
object({ kind: literal("no-hardware-facts") }),
|
|
23863
|
+
object({
|
|
23864
|
+
kind: literal("no-measured-data"),
|
|
23865
|
+
hardwareClass: HardwareClassIdSchema
|
|
23866
|
+
}),
|
|
23867
|
+
object({
|
|
23868
|
+
kind: literal("no-family-build"),
|
|
23869
|
+
format: ModelFormatSchema$1
|
|
23870
|
+
})
|
|
23871
|
+
]);
|
|
23872
|
+
var DeviceModelChoiceSchema = object({
|
|
23873
|
+
modelId: string(),
|
|
23874
|
+
p50Ms: number(),
|
|
23875
|
+
fps: number(),
|
|
23876
|
+
measured: boolean(),
|
|
23877
|
+
/** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
|
|
23878
|
+
capacitySessions: number(),
|
|
23879
|
+
personRecall: number()
|
|
23880
|
+
});
|
|
23881
|
+
var DeviceRecommendationSchema = object({
|
|
23882
|
+
deviceKey: string(),
|
|
23883
|
+
accelerator: AcceleratorKindSchema.nullable(),
|
|
23884
|
+
enabled: boolean(),
|
|
23885
|
+
available: boolean(),
|
|
23886
|
+
chosen: DeviceModelChoiceSchema.nullable(),
|
|
23887
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
23888
|
+
});
|
|
23889
|
+
var NodeRecommendationSchema = object({
|
|
23890
|
+
nodeId: string(),
|
|
23891
|
+
reachable: boolean(),
|
|
23892
|
+
hardwareClass: HardwareClassIdSchema.nullable(),
|
|
23893
|
+
cpuModel: string().nullable(),
|
|
23894
|
+
skipped: boolean(),
|
|
23895
|
+
acceleratorModelId: string().nullable(),
|
|
23896
|
+
devices: array(DeviceRecommendationSchema).readonly(),
|
|
23897
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
23898
|
+
});
|
|
23899
|
+
var ModelPinChangeSchema = object({
|
|
23900
|
+
stepId: string(),
|
|
23901
|
+
before: string().nullable(),
|
|
23902
|
+
after: string().nullable()
|
|
23903
|
+
});
|
|
23904
|
+
var NodeDeviceChangeSchema = object({
|
|
23905
|
+
nodeId: string(),
|
|
23906
|
+
deviceKey: string(),
|
|
23907
|
+
madeExplicit: boolean(),
|
|
23908
|
+
modelPins: array(ModelPinChangeSchema).readonly(),
|
|
23909
|
+
thresholds: array(object({
|
|
23910
|
+
stepId: string(),
|
|
23911
|
+
keys: array(string()).readonly()
|
|
23912
|
+
})).readonly()
|
|
23913
|
+
});
|
|
23914
|
+
var CameraOverrideClearSchema = object({
|
|
23915
|
+
deviceId: number(),
|
|
23916
|
+
source: _enum(["step-override", "wholesale"]),
|
|
23917
|
+
nodeId: string(),
|
|
23918
|
+
deviceKey: string().nullable(),
|
|
23919
|
+
stepId: string(),
|
|
23920
|
+
modelIdBefore: string().nullable(),
|
|
23921
|
+
keys: array(string()).readonly()
|
|
23922
|
+
});
|
|
23923
|
+
var DetectorStoreClearSchema = object({
|
|
23924
|
+
deviceId: number(),
|
|
23925
|
+
keys: array(string()).readonly()
|
|
23926
|
+
});
|
|
23927
|
+
var AutoTuneWarningSchema = discriminatedUnion("kind", [
|
|
23928
|
+
object({
|
|
23929
|
+
kind: literal("detector-store-cluster-wide"),
|
|
23930
|
+
skippedNodes: array(string()).readonly()
|
|
23931
|
+
}),
|
|
23932
|
+
object({
|
|
23933
|
+
kind: literal("detector-store-unreadable"),
|
|
23934
|
+
error: string()
|
|
23935
|
+
}),
|
|
23936
|
+
object({
|
|
23937
|
+
kind: literal("coral-enabled"),
|
|
23938
|
+
nodeId: string(),
|
|
23939
|
+
deviceKey: string()
|
|
23940
|
+
})
|
|
23941
|
+
]);
|
|
23942
|
+
var AutoTuneOptionsSchema = object({
|
|
23943
|
+
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
23944
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
23945
|
+
/**
|
|
23946
|
+
* The least number of parallel sessions every device must sustain at the
|
|
23947
|
+
* camera rate with the headroom kept free (D755). The most accurate model
|
|
23948
|
+
* that reaches it wins.
|
|
23949
|
+
*/
|
|
23950
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
23951
|
+
});
|
|
23952
|
+
var AutoTunePlanSchema = object({
|
|
23953
|
+
/** Hash of everything the apply will write — the apply refuses a different one. */
|
|
23954
|
+
planHash: string(),
|
|
23955
|
+
family: literal("yolov9"),
|
|
23956
|
+
headroom: number(),
|
|
23957
|
+
minSessionsPerDevice: number(),
|
|
23958
|
+
/** The detection rate a session is counted at (the fastest camera running the pipeline root). */
|
|
23959
|
+
cameraFps: number(),
|
|
23960
|
+
generatedAt: number(),
|
|
23961
|
+
nodes: array(NodeRecommendationSchema).readonly(),
|
|
23962
|
+
nodeChanges: array(NodeDeviceChangeSchema).readonly(),
|
|
23963
|
+
cameraClears: array(CameraOverrideClearSchema).readonly(),
|
|
23964
|
+
detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
|
|
23965
|
+
warnings: array(AutoTuneWarningSchema).readonly()
|
|
23966
|
+
});
|
|
23967
|
+
var AutoTuneApplyInputSchema = object({
|
|
23968
|
+
planHash: string(),
|
|
23969
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
23970
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
23971
|
+
});
|
|
23972
|
+
var AutoTunePhaseResultSchema = object({
|
|
23973
|
+
phase: _enum([
|
|
23974
|
+
"download",
|
|
23975
|
+
"camera-overrides",
|
|
23976
|
+
"detector-thresholds",
|
|
23977
|
+
"node-models",
|
|
23978
|
+
"redispatch"
|
|
23979
|
+
]),
|
|
23980
|
+
ok: boolean(),
|
|
23981
|
+
detail: string()
|
|
23982
|
+
});
|
|
23983
|
+
var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
|
|
23984
|
+
object({
|
|
23985
|
+
kind: literal("applied"),
|
|
23986
|
+
planHash: string(),
|
|
23987
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
23988
|
+
}),
|
|
23989
|
+
object({
|
|
23990
|
+
kind: literal("aborted"),
|
|
23991
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
23992
|
+
}),
|
|
23993
|
+
object({
|
|
23994
|
+
kind: literal("stale"),
|
|
23995
|
+
plan: AutoTunePlanSchema
|
|
23996
|
+
}),
|
|
23997
|
+
object({
|
|
23998
|
+
kind: literal("refused"),
|
|
23999
|
+
reason: _enum(["apply-in-progress"])
|
|
24000
|
+
})
|
|
24001
|
+
]);
|
|
24002
|
+
/**
|
|
24003
|
+
* Wire shapes of the Load balancing surface (D748): the session placement
|
|
24004
|
+
* policy, the atomic share write, the observed placement statistics, the
|
|
24005
|
+
* hardware share suggestion and the stale device pins.
|
|
24006
|
+
*/
|
|
24007
|
+
/**
|
|
24008
|
+
* How a new detection session picks its node and device.
|
|
24009
|
+
* - `least-loaded` — the historical rule: lowest `attached / weight`, a
|
|
24010
|
+
* constant node order at a tie (D37). An idle node always ties at 0, so a
|
|
24011
|
+
* weight only bites once a node already holds a session.
|
|
24012
|
+
* - `share` — the share of PARALLEL sessions is held to the weights, and a
|
|
24013
|
+
* full or drowning node yields to a free one (D748).
|
|
24014
|
+
*/
|
|
24015
|
+
var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
|
|
24016
|
+
var LoadBalancingSharesInputSchema = object({
|
|
24017
|
+
/** nodeId → share (> 0). A node left out keeps its weight. */
|
|
24018
|
+
nodes: record(string(), number().positive()).default({}),
|
|
24019
|
+
/** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
|
|
24020
|
+
devices: record(string(), record(string(), number().positive())).default({})
|
|
24021
|
+
});
|
|
24022
|
+
var PlacementStatsInputSchema = object({
|
|
24023
|
+
/** Window the observed shares are averaged over (default 1 h, max 24 h). */
|
|
24024
|
+
windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
|
|
24025
|
+
var PlacementDeviceStatsSchema = object({
|
|
24026
|
+
deviceKey: string(),
|
|
24027
|
+
/** Sessions running on this device now. */
|
|
24028
|
+
sessionsNow: number(),
|
|
24029
|
+
/** Sessions started on this device inside the window. */
|
|
24030
|
+
sessionsStarted: number(),
|
|
24031
|
+
/** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
|
|
24032
|
+
observedShare: number().nullable()
|
|
24033
|
+
});
|
|
24034
|
+
var PlacementNodeStatsSchema = object({
|
|
24035
|
+
nodeId: string(),
|
|
24036
|
+
sessionsNow: number(),
|
|
24037
|
+
sessionsStarted: number(),
|
|
24038
|
+
/** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
|
|
24039
|
+
observedShare: number().nullable(),
|
|
24040
|
+
/** Most sessions this node ran at once inside the window. */
|
|
24041
|
+
peakSessions: number(),
|
|
24042
|
+
/** Sessions a share election handed elsewhere because this node was full or drowning. */
|
|
24043
|
+
yieldsAway: number(),
|
|
24044
|
+
devices: array(PlacementDeviceStatsSchema).readonly()
|
|
24045
|
+
});
|
|
24046
|
+
/** A camera's device pin that the session path cannot honour. */
|
|
24047
|
+
var StaleDevicePinSchema = object({
|
|
24048
|
+
deviceId: number(),
|
|
24049
|
+
deviceKey: string(),
|
|
24050
|
+
/** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
|
|
24051
|
+
reason: _enum(["disabled", "absent"])
|
|
24052
|
+
});
|
|
24053
|
+
var PlacementStatsSchema = object({
|
|
24054
|
+
policy: SessionPlacementPolicySchema,
|
|
24055
|
+
windowMs: number(),
|
|
24056
|
+
/** How much of the window was actually observed (the hub keeps it in memory). */
|
|
24057
|
+
observedForMs: number(),
|
|
24058
|
+
sessionsNow: number(),
|
|
24059
|
+
/** Most parallel sessions across the cluster inside the window. */
|
|
24060
|
+
clusterPeakSessions: number(),
|
|
24061
|
+
nodes: array(PlacementNodeStatsSchema).readonly(),
|
|
24062
|
+
stalePins: array(StaleDevicePinSchema).readonly()
|
|
24063
|
+
});
|
|
24064
|
+
/**
|
|
24065
|
+
* Where an automatic share's capacity comes from (D755).
|
|
24066
|
+
* - `hardware` — the static capacity of each device at its Auto tune model:
|
|
24067
|
+
* the measured latency table for the node's hardware class.
|
|
24068
|
+
* - `benchmark` — the node's own measured capacity (node benchmark results).
|
|
24069
|
+
* A node with no results falls back to `hardware`, and says so.
|
|
24070
|
+
*/
|
|
24071
|
+
var CapacitySourceSchema = _enum(["hardware", "benchmark"]);
|
|
24072
|
+
/** Why a node under the `benchmark` source was sized from hardware instead. */
|
|
24073
|
+
var CapacityFallbackSchema = _enum(["no-benchmark-results", "partial-benchmark-results"]);
|
|
24074
|
+
var SuggestSharesInputSchema = object({
|
|
24075
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
24076
|
+
/** Default `hardware`. */
|
|
24077
|
+
source: CapacitySourceSchema.default("hardware")
|
|
24078
|
+
});
|
|
24079
|
+
var SuggestedDeviceShareSchema = object({
|
|
24080
|
+
deviceKey: string(),
|
|
24081
|
+
/** Share of the node (0–100, rounded). */
|
|
24082
|
+
share: number(),
|
|
24083
|
+
modelId: string().nullable(),
|
|
24084
|
+
/** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
|
|
24085
|
+
fps: number().nullable(),
|
|
24086
|
+
/** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
|
|
24087
|
+
measured: boolean(),
|
|
24088
|
+
/**
|
|
24089
|
+
* Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
|
|
24090
|
+
* or the benchmark's measured max sessions. Never enforced.
|
|
24091
|
+
*/
|
|
24092
|
+
suggestedMaxSessions: number().nullable()
|
|
24093
|
+
});
|
|
24094
|
+
var SuggestedNodeShareSchema = object({
|
|
24095
|
+
nodeId: string(),
|
|
24096
|
+
/** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
|
|
24097
|
+
share: number().nullable(),
|
|
24098
|
+
/** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
|
|
24099
|
+
capacitySessions: number(),
|
|
24100
|
+
devices: array(SuggestedDeviceShareSchema).readonly(),
|
|
24101
|
+
skippedReason: string().nullable(),
|
|
24102
|
+
/** What this node's capacity was read from; null when the node is skipped. */
|
|
24103
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
24104
|
+
/** Set when the `benchmark` source was asked for and this node used `hardware`. */
|
|
24105
|
+
capacityFallback: CapacityFallbackSchema.nullable()
|
|
24106
|
+
});
|
|
24107
|
+
var SuggestSharesResultSchema = object({
|
|
24108
|
+
headroom: number(),
|
|
24109
|
+
/** The source asked for; each node says what it actually used. */
|
|
24110
|
+
source: CapacitySourceSchema,
|
|
24111
|
+
/** Camera detection rate the capacity is counted in (the fastest camera's fps). */
|
|
24112
|
+
cameraFps: number(),
|
|
24113
|
+
/** The Auto tune capacity floor the models were picked at. */
|
|
24114
|
+
minSessionsPerDevice: number(),
|
|
24115
|
+
nodes: array(SuggestedNodeShareSchema).readonly()
|
|
24116
|
+
});
|
|
24117
|
+
/**
|
|
24118
|
+
* Where the node and device shares come from (D750, D755).
|
|
24119
|
+
* - `hardware` (default) — computed by the system from each node's static
|
|
24120
|
+
* capacity (its accelerators at their Auto tune models, from the measured
|
|
24121
|
+
* latency table), recomputed whenever a node or device joins, leaves, is
|
|
24122
|
+
* switched on or off, or changes model. No load input.
|
|
24123
|
+
* - `benchmark` — the same, from each node's measured capacity (node
|
|
24124
|
+
* benchmark results); a node without results falls back to `hardware`.
|
|
24125
|
+
* - `manual` — the operator's stored sliders.
|
|
24126
|
+
* Either way a node or device that cannot take sessions gives its share to
|
|
24127
|
+
* the others in proportion; the stored values are never rewritten for that.
|
|
24128
|
+
*/
|
|
24129
|
+
var ShareSourceSchema = _enum([
|
|
24130
|
+
"hardware",
|
|
24131
|
+
"benchmark",
|
|
24132
|
+
"manual"
|
|
24133
|
+
]);
|
|
24134
|
+
var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
|
|
24135
|
+
object({
|
|
24136
|
+
nodes: record(string(), number()),
|
|
24137
|
+
devices: record(string(), record(string(), number()))
|
|
24138
|
+
});
|
|
24139
|
+
var EffectiveDeviceShareSchema = object({
|
|
24140
|
+
deviceKey: string(),
|
|
24141
|
+
/** Can take sessions now (enabled, available, can run the root). */
|
|
24142
|
+
eligible: boolean(),
|
|
24143
|
+
/** The share the source assigns, as a percentage of the node's devices. */
|
|
24144
|
+
configuredPct: number(),
|
|
24145
|
+
/** The share actually used, after an ineligible device's share went to the others. */
|
|
24146
|
+
effectivePct: number()
|
|
24147
|
+
});
|
|
24148
|
+
var EffectiveNodeShareSchema = object({
|
|
24149
|
+
nodeId: string(),
|
|
24150
|
+
eligible: boolean(),
|
|
24151
|
+
configuredPct: number(),
|
|
24152
|
+
effectivePct: number(),
|
|
24153
|
+
/** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
|
|
24154
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
24155
|
+
/** Automatic `benchmark`: why this node used `hardware` instead. */
|
|
24156
|
+
capacityFallback: CapacityFallbackSchema.nullable(),
|
|
24157
|
+
devices: array(EffectiveDeviceShareSchema).readonly()
|
|
24158
|
+
});
|
|
24159
|
+
var EffectiveSharesSchema = object({
|
|
24160
|
+
source: ShareSourceSchema,
|
|
24161
|
+
policy: SessionPlacementPolicySchema,
|
|
24162
|
+
/** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
|
|
24163
|
+
autoPending: boolean(),
|
|
24164
|
+
/** When the automatic shares were last computed (ms epoch); null = never. */
|
|
24165
|
+
computedAt: number().nullable(),
|
|
24166
|
+
/** What made the system recompute them last. */
|
|
24167
|
+
trigger: string().nullable(),
|
|
24168
|
+
nodes: array(EffectiveNodeShareSchema).readonly(),
|
|
24169
|
+
/** The relative weights the election reads (before eligibility). */
|
|
24170
|
+
nodeWeights: record(string(), number()),
|
|
24171
|
+
deviceWeights: record(string(), record(string(), number()))
|
|
24172
|
+
});
|
|
23820
24173
|
object({
|
|
23821
24174
|
activeCameras: number(),
|
|
23822
24175
|
throttledCameras: number(),
|
|
@@ -24734,14 +25087,15 @@ var RunnerLocalLoadSchema = object({
|
|
|
24734
25087
|
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
24735
25088
|
* this runner currently has attached cameras on, so the orchestrator's second
|
|
24736
25089
|
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
24737
|
-
* counts. Empty on single-device / pre-multi-device runners.
|
|
24738
|
-
* per
|
|
25090
|
+
* counts. Empty on single-device / pre-multi-device runners. There is no
|
|
25091
|
+
* per-device queue depth: the inference pool's backlog has no accessor, and
|
|
25092
|
+
* a field that always read 0 was removed rather than shown as a measurement
|
|
25093
|
+
* (D762).
|
|
24739
25094
|
*/
|
|
24740
25095
|
devices: array(object({
|
|
24741
25096
|
deviceKey: string(),
|
|
24742
25097
|
backend: string(),
|
|
24743
|
-
attachedCameras: number()
|
|
24744
|
-
queueDepthTotal: number()
|
|
25098
|
+
attachedCameras: number()
|
|
24745
25099
|
})).default([]),
|
|
24746
25100
|
/** Hardware capability flags reported by this node. */
|
|
24747
25101
|
hardware: object({
|
|
@@ -24877,7 +25231,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
|
|
|
24877
25231
|
*/
|
|
24878
25232
|
cropJpeg: string().optional(),
|
|
24879
25233
|
parent: DetailParentSchema,
|
|
24880
|
-
steps: array(string()).optional()
|
|
25234
|
+
steps: array(string()).optional(),
|
|
25235
|
+
/**
|
|
25236
|
+
* The camera's root model already drew this step's boxes (D730): a
|
|
25237
|
+
* `license_plate` inside the parent vehicle. The named step is NOT
|
|
25238
|
+
* inferred — these FRAME-space boxes are its output — and its
|
|
25239
|
+
* requested children (the plate reader) run on them. Absent ⇒ every
|
|
25240
|
+
* requested step infers as before.
|
|
25241
|
+
*/
|
|
25242
|
+
supplied: object({
|
|
25243
|
+
stepId: string(),
|
|
25244
|
+
modelId: string(),
|
|
25245
|
+
boxes: array(object({
|
|
25246
|
+
bbox: NativeCropBboxSchema,
|
|
25247
|
+
score: number()
|
|
25248
|
+
})).min(1)
|
|
25249
|
+
}).optional()
|
|
24881
25250
|
}), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
|
|
24882
25251
|
/** Catalog step id, e.g. `clip-embedding`. */
|
|
24883
25252
|
stepId: string(),
|
|
@@ -24940,14 +25309,6 @@ var CameraPipelineConfigSchema = object({
|
|
|
24940
25309
|
settings: record(string(), unknown()).readonly().optional()
|
|
24941
25310
|
}).nullable().optional()
|
|
24942
25311
|
});
|
|
24943
|
-
var PipelineTemplateSchema = object({
|
|
24944
|
-
id: string(),
|
|
24945
|
-
name: string(),
|
|
24946
|
-
description: string().optional(),
|
|
24947
|
-
config: CameraPipelineConfigSchema,
|
|
24948
|
-
createdAt: string(),
|
|
24949
|
-
updatedAt: string()
|
|
24950
|
-
});
|
|
24951
25312
|
var DeviceStepConfigSchema = object({
|
|
24952
25313
|
modelId: string().optional(),
|
|
24953
25314
|
settings: record(string(), unknown()).optional(),
|
|
@@ -25021,9 +25382,10 @@ var CameraStepOverridePatchSchema = object({
|
|
|
25021
25382
|
modelId: string().optional(),
|
|
25022
25383
|
settings: record(string(), unknown()).readonly().optional()
|
|
25023
25384
|
});
|
|
25385
|
+
var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
|
|
25024
25386
|
var CameraPipelineSettingsSchema = object({
|
|
25025
|
-
pinnedAgentNodeId: string().optional(),
|
|
25026
25387
|
stepToggles: record(string(), boolean()).optional(),
|
|
25388
|
+
stepSettings: CameraStepSettingsSchema.optional(),
|
|
25027
25389
|
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
25028
25390
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
25029
25391
|
});
|
|
@@ -25056,7 +25418,10 @@ var PipelineAssignmentSchema = object({
|
|
|
25056
25418
|
});
|
|
25057
25419
|
/**
|
|
25058
25420
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
25059
|
-
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
25421
|
+
* Aggregated from each runner's `getLocalLoad` cap call. In the
|
|
25422
|
+
* `getAgentLoad` report, a single-device node's default-pool sessions (no
|
|
25423
|
+
* `deviceKey`) are credited to its one eligible device in `load.devices` —
|
|
25424
|
+
* the default pool IS that device (D745); the balancer's census stays raw.
|
|
25060
25425
|
*/
|
|
25061
25426
|
var AgentLoadSummarySchema = object({
|
|
25062
25427
|
nodeId: string(),
|
|
@@ -25145,26 +25510,27 @@ var CameraBrokerStatusSchema = object({
|
|
|
25145
25510
|
width: number(),
|
|
25146
25511
|
height: number(),
|
|
25147
25512
|
subscribers: number(),
|
|
25148
|
-
|
|
25149
|
-
|
|
25513
|
+
/**
|
|
25514
|
+
* Encoded packets/s the broker receives from the camera. null when the
|
|
25515
|
+
* broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
|
|
25516
|
+
* There is no output rate: decoding runs in the session decode workers, not
|
|
25517
|
+
* in the broker, so the broker's own decoded-frame rate is 0 on every live
|
|
25518
|
+
* camera and is not served (D758).
|
|
25519
|
+
*/
|
|
25520
|
+
inFps: number().nullable()
|
|
25150
25521
|
})).readonly(),
|
|
25151
25522
|
webrtcSessions: number(),
|
|
25152
25523
|
rtspRestream: boolean()
|
|
25153
25524
|
});
|
|
25154
|
-
/**
|
|
25155
|
-
|
|
25156
|
-
|
|
25157
|
-
|
|
25158
|
-
|
|
25159
|
-
|
|
25160
|
-
|
|
25161
|
-
|
|
25162
|
-
var CameraDecoderStatusSchema = object({
|
|
25163
|
-
nodeId: string(),
|
|
25164
|
-
formats: array(string()).readonly(),
|
|
25165
|
-
sessionCount: number(),
|
|
25166
|
-
shm: CameraDecoderShmSchema
|
|
25167
|
-
});
|
|
25525
|
+
/**
|
|
25526
|
+
* Decoder block — WHERE decode runs (co-located with the detection node by
|
|
25527
|
+
* construction); null when the camera has no detection node. It carries no
|
|
25528
|
+
* frame counter: the shared-memory plane whose counters it used to serve is
|
|
25529
|
+
* gone, and those fields read 0 forever. Whether frames actually flow is read
|
|
25530
|
+
* from `detection.actualFps` (frames delivered to and processed by the
|
|
25531
|
+
* detector), never from a counter nothing feeds.
|
|
25532
|
+
*/
|
|
25533
|
+
var CameraDecoderStatusSchema = object({ nodeId: string() });
|
|
25168
25534
|
/** Motion block — null when motion detection is not active for this device. */
|
|
25169
25535
|
var CameraMotionStatusSchema = object({
|
|
25170
25536
|
enabled: boolean(),
|
|
@@ -25521,12 +25887,6 @@ method(object({
|
|
|
25521
25887
|
}), object({ success: literal(true) }), {
|
|
25522
25888
|
kind: "mutation",
|
|
25523
25889
|
auth: "admin"
|
|
25524
|
-
}), method(object({
|
|
25525
|
-
agentNodeId: string(),
|
|
25526
|
-
detectWeight: number().positive().nullable()
|
|
25527
|
-
}), object({ success: literal(true) }), {
|
|
25528
|
-
kind: "mutation",
|
|
25529
|
-
auth: "admin"
|
|
25530
25890
|
}), method(object({
|
|
25531
25891
|
agentNodeId: string(),
|
|
25532
25892
|
detect: boolean().nullable().optional(),
|
|
@@ -25568,6 +25928,15 @@ method(object({
|
|
|
25568
25928
|
}), {
|
|
25569
25929
|
kind: "mutation",
|
|
25570
25930
|
auth: "admin"
|
|
25931
|
+
}), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
|
|
25932
|
+
kind: "mutation",
|
|
25933
|
+
auth: "admin"
|
|
25934
|
+
}), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
|
|
25935
|
+
kind: "mutation",
|
|
25936
|
+
auth: "admin"
|
|
25937
|
+
}), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
|
|
25938
|
+
kind: "mutation",
|
|
25939
|
+
auth: "admin"
|
|
25571
25940
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
25572
25941
|
deviceId: number(),
|
|
25573
25942
|
addonId: string(),
|
|
@@ -25584,6 +25953,13 @@ method(object({
|
|
|
25584
25953
|
}), object({ success: literal(true) }), {
|
|
25585
25954
|
kind: "mutation",
|
|
25586
25955
|
auth: "admin"
|
|
25956
|
+
}), method(object({
|
|
25957
|
+
deviceId: number(),
|
|
25958
|
+
addonId: string(),
|
|
25959
|
+
settings: record(string(), unknown()).nullable()
|
|
25960
|
+
}), object({ success: literal(true) }), {
|
|
25961
|
+
kind: "mutation",
|
|
25962
|
+
auth: "admin"
|
|
25587
25963
|
}), method(object({
|
|
25588
25964
|
deviceId: number(),
|
|
25589
25965
|
agentNodeId: string(),
|
|
@@ -25607,25 +25983,7 @@ method(object({
|
|
|
25607
25983
|
}), method(_void(), DiskReconcileJobSchema, {
|
|
25608
25984
|
kind: "mutation",
|
|
25609
25985
|
auth: "admin"
|
|
25610
|
-
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" })
|
|
25611
|
-
name: string(),
|
|
25612
|
-
description: string().optional(),
|
|
25613
|
-
config: CameraPipelineConfigSchema
|
|
25614
|
-
}), PipelineTemplateSchema, {
|
|
25615
|
-
kind: "mutation",
|
|
25616
|
-
auth: "admin"
|
|
25617
|
-
}), method(object({
|
|
25618
|
-
id: string(),
|
|
25619
|
-
name: string().optional(),
|
|
25620
|
-
description: string().optional(),
|
|
25621
|
-
config: CameraPipelineConfigSchema.optional()
|
|
25622
|
-
}), PipelineTemplateSchema, {
|
|
25623
|
-
kind: "mutation",
|
|
25624
|
-
auth: "admin"
|
|
25625
|
-
}), method(object({ id: string() }), object({ success: literal(true) }), {
|
|
25626
|
-
kind: "mutation",
|
|
25627
|
-
auth: "admin"
|
|
25628
|
-
});
|
|
25986
|
+
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" });
|
|
25629
25987
|
/**
|
|
25630
25988
|
* Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
|
|
25631
25989
|
* `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
|
|
@@ -27978,8 +28336,6 @@ var WebrtcStreamChoiceSchema = object({
|
|
|
27978
28336
|
]).nullable(),
|
|
27979
28337
|
/** Input FPS from the camera (null for adaptive). */
|
|
27980
28338
|
inputFps: number().nullable(),
|
|
27981
|
-
/** Decoded FPS (null for adaptive). */
|
|
27982
|
-
decodeFps: number().nullable(),
|
|
27983
28339
|
/** Bitrate in kbps (null for adaptive). */
|
|
27984
28340
|
bitrateKbps: number().nullable()
|
|
27985
28341
|
});
|
|
@@ -28311,6 +28667,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
28311
28667
|
*/
|
|
28312
28668
|
alive: boolean()
|
|
28313
28669
|
})), method(object({
|
|
28670
|
+
deviceId: number().int().nonnegative(),
|
|
28671
|
+
sessionId: string(),
|
|
28672
|
+
downlinkMbps: number().nonnegative()
|
|
28673
|
+
}), object({
|
|
28674
|
+
outcome: _enum(["switching", "held"]),
|
|
28675
|
+
tier: CamProfileSchema.nullable(),
|
|
28676
|
+
reason: string()
|
|
28677
|
+
}), { kind: "mutation" }), method(object({
|
|
28314
28678
|
deviceId: number().int().nonnegative(),
|
|
28315
28679
|
sessionId: string()
|
|
28316
28680
|
}), WebrtcSessionDebugSchema, { kind: "query" });
|
|
@@ -32130,7 +32494,8 @@ var ConnectionEndpointSchema = object({
|
|
|
32130
32494
|
"lan-ipv6",
|
|
32131
32495
|
"public",
|
|
32132
32496
|
"loopback",
|
|
32133
|
-
"app-link"
|
|
32497
|
+
"app-link",
|
|
32498
|
+
"custom"
|
|
32134
32499
|
]),
|
|
32135
32500
|
/**
|
|
32136
32501
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -32199,7 +32564,7 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
32199
32564
|
localPort: AdvertisedLocalPortSchema
|
|
32200
32565
|
});
|
|
32201
32566
|
/**
|
|
32202
|
-
* The address flagged for notification
|
|
32567
|
+
* The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
|
|
32203
32568
|
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
32204
32569
|
* so the UI can show it either way.
|
|
32205
32570
|
*/
|
|
@@ -32232,6 +32597,72 @@ var ViewerEndpointsSchema = object({
|
|
|
32232
32597
|
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
32233
32598
|
resolved: array(string()).readonly()
|
|
32234
32599
|
});
|
|
32600
|
+
/**
|
|
32601
|
+
* DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
|
|
32602
|
+
* for addons built against it): `cluster` is the `internal` role, `browser`
|
|
32603
|
+
* the `publicEndpoint` role; `override` is the flagged address.
|
|
32604
|
+
*/
|
|
32605
|
+
var HubAddressSnapshotSchema = object({
|
|
32606
|
+
override: string().nullable(),
|
|
32607
|
+
resolved: string().nullable(),
|
|
32608
|
+
source: _enum([
|
|
32609
|
+
"override",
|
|
32610
|
+
"auto",
|
|
32611
|
+
"none"
|
|
32612
|
+
])
|
|
32613
|
+
});
|
|
32614
|
+
var HubAddressesSchema = object({
|
|
32615
|
+
cluster: HubAddressSnapshotSchema,
|
|
32616
|
+
browser: HubAddressSnapshotSchema
|
|
32617
|
+
});
|
|
32618
|
+
/**
|
|
32619
|
+
* What an address is used for (`hub-address.ts`, D734). `appConnections` is
|
|
32620
|
+
* many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
|
|
32621
|
+
* by at most one address.
|
|
32622
|
+
*/
|
|
32623
|
+
var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
|
|
32624
|
+
var RoleSourceSchema = _enum([
|
|
32625
|
+
"flagged",
|
|
32626
|
+
"auto",
|
|
32627
|
+
"none"
|
|
32628
|
+
]);
|
|
32629
|
+
/** One single-valued role: the flagged address, the one in use, and why. */
|
|
32630
|
+
var HubAddressRoleResolutionSchema = object({
|
|
32631
|
+
/** The address carrying the flag, or null = automatic. */
|
|
32632
|
+
flagged: string().nullable(),
|
|
32633
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
32634
|
+
resolved: string().nullable(),
|
|
32635
|
+
source: RoleSourceSchema
|
|
32636
|
+
});
|
|
32637
|
+
var HubAppConnectionsResolutionSchema = object({
|
|
32638
|
+
/** The addresses flagged `appConnections`, or empty = automatic. */
|
|
32639
|
+
flagged: array(string()).readonly(),
|
|
32640
|
+
/** What the apps race right now. */
|
|
32641
|
+
resolved: array(string()).readonly(),
|
|
32642
|
+
source: RoleSourceSchema
|
|
32643
|
+
});
|
|
32644
|
+
var HubAddressBookSchema = object({
|
|
32645
|
+
rows: array(ConnectionEndpointSchema.extend({
|
|
32646
|
+
/** In the hub's detected palette right now. */
|
|
32647
|
+
detected: boolean(),
|
|
32648
|
+
/** Entered by the operator (removable). */
|
|
32649
|
+
custom: boolean(),
|
|
32650
|
+
/** The roles explicitly flagged on this address. */
|
|
32651
|
+
flags: array(HubAddressRoleSchema).readonly(),
|
|
32652
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
32653
|
+
inUse: array(HubAddressRoleSchema).readonly(),
|
|
32654
|
+
/** The roles this address may be flagged with. */
|
|
32655
|
+
eligible: array(HubAddressRoleSchema).readonly()
|
|
32656
|
+
})).readonly(),
|
|
32657
|
+
roles: object({
|
|
32658
|
+
appConnections: HubAppConnectionsResolutionSchema,
|
|
32659
|
+
notificationTaps: HubAddressRoleResolutionSchema,
|
|
32660
|
+
internal: HubAddressRoleResolutionSchema,
|
|
32661
|
+
publicEndpoint: HubAddressRoleResolutionSchema
|
|
32662
|
+
}),
|
|
32663
|
+
/** The `hub=` an app link carries (D709), or null. */
|
|
32664
|
+
appLinkHub: string().nullable()
|
|
32665
|
+
});
|
|
32235
32666
|
var AllowedAddressesSchema = object({
|
|
32236
32667
|
/**
|
|
32237
32668
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -32275,10 +32706,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
32275
32706
|
* tunnel always emits `https://` regardless. */
|
|
32276
32707
|
scheme: _enum(["http", "https"]).optional(),
|
|
32277
32708
|
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
32278
|
-
* an address notification
|
|
32709
|
+
* an address notification taps can be flagged with, not a hub
|
|
32279
32710
|
* route. Default `false`: racers and rankers never see it. */
|
|
32280
32711
|
includeAppLink: boolean().optional()
|
|
32281
|
-
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(
|
|
32712
|
+
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema), method(object({
|
|
32713
|
+
baseUrl: string(),
|
|
32714
|
+
label: string().max(80)
|
|
32715
|
+
}), HubAddressBookSchema, {
|
|
32716
|
+
kind: "mutation",
|
|
32717
|
+
auth: "admin"
|
|
32718
|
+
}), method(object({ baseUrl: string() }), HubAddressBookSchema, {
|
|
32719
|
+
kind: "mutation",
|
|
32720
|
+
auth: "admin"
|
|
32721
|
+
}), method(object({
|
|
32722
|
+
role: HubAddressRoleSchema,
|
|
32723
|
+
baseUrl: string().nullable(),
|
|
32724
|
+
enabled: boolean(),
|
|
32725
|
+
acceptInsecureHttp: boolean().optional()
|
|
32726
|
+
}), HubAddressBookSchema, {
|
|
32727
|
+
kind: "mutation",
|
|
32728
|
+
auth: "admin"
|
|
32729
|
+
}), method(_void(), HubAddressesSchema), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
|
|
32282
32730
|
kind: "mutation",
|
|
32283
32731
|
auth: "admin"
|
|
32284
32732
|
}), method(object({
|
|
@@ -32736,7 +33184,8 @@ var MotionStatusSchema = object({
|
|
|
32736
33184
|
* writes this slice (not even a boot seed), and neither does the runner's
|
|
32737
33185
|
* phase machine: its phase is "a session is attached" for every on-motion
|
|
32738
33186
|
* session, not motion, and it now has its own `DetectionPhaseTransition`.
|
|
32739
|
-
* A provider's `isDetected`
|
|
33187
|
+
* A provider's `isDetected` and `getStatus` answer from the hub's slice
|
|
33188
|
+
* (`hubMotionNativeProvider`).
|
|
32740
33189
|
* - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
|
|
32741
33190
|
* imports) — the provider pushes both edges itself, from the upstream
|
|
32742
33191
|
* system's own state change. That is the sensor's own fact.
|
|
@@ -39283,6 +39732,16 @@ var zoneRulesCapability = {
|
|
|
39283
39732
|
durability: "restored"
|
|
39284
39733
|
};
|
|
39285
39734
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
39735
|
+
Object.freeze({
|
|
39736
|
+
person: .5,
|
|
39737
|
+
vehicle: .5,
|
|
39738
|
+
animal: .5
|
|
39739
|
+
});
|
|
39740
|
+
Object.freeze({
|
|
39741
|
+
person: .65,
|
|
39742
|
+
vehicle: .65,
|
|
39743
|
+
animal: .65
|
|
39744
|
+
});
|
|
39286
39745
|
/**
|
|
39287
39746
|
* Accessory device helpers — shared across drivers.
|
|
39288
39747
|
*
|
|
@@ -42163,90 +42622,18 @@ Object.freeze({
|
|
|
42163
42622
|
addonId: null,
|
|
42164
42623
|
access: "create"
|
|
42165
42624
|
},
|
|
42166
|
-
"decoder.createSession": {
|
|
42167
|
-
capName: "decoder",
|
|
42168
|
-
capScope: "system",
|
|
42169
|
-
addonId: null,
|
|
42170
|
-
access: "view"
|
|
42171
|
-
},
|
|
42172
|
-
"decoder.destroySession": {
|
|
42173
|
-
capName: "decoder",
|
|
42174
|
-
capScope: "system",
|
|
42175
|
-
addonId: null,
|
|
42176
|
-
access: "delete"
|
|
42177
|
-
},
|
|
42178
|
-
"decoder.getFrame": {
|
|
42179
|
-
capName: "decoder",
|
|
42180
|
-
capScope: "system",
|
|
42181
|
-
addonId: null,
|
|
42182
|
-
access: "view"
|
|
42183
|
-
},
|
|
42184
42625
|
"decoder.getInfo": {
|
|
42185
42626
|
capName: "decoder",
|
|
42186
42627
|
capScope: "system",
|
|
42187
42628
|
addonId: null,
|
|
42188
42629
|
access: "view"
|
|
42189
42630
|
},
|
|
42190
|
-
"decoder.getShmStats": {
|
|
42191
|
-
capName: "decoder",
|
|
42192
|
-
capScope: "system",
|
|
42193
|
-
addonId: null,
|
|
42194
|
-
access: "view"
|
|
42195
|
-
},
|
|
42196
|
-
"decoder.getStats": {
|
|
42197
|
-
capName: "decoder",
|
|
42198
|
-
capScope: "system",
|
|
42199
|
-
addonId: null,
|
|
42200
|
-
access: "view"
|
|
42201
|
-
},
|
|
42202
|
-
"decoder.listActiveSessions": {
|
|
42203
|
-
capName: "decoder",
|
|
42204
|
-
capScope: "system",
|
|
42205
|
-
addonId: null,
|
|
42206
|
-
access: "view"
|
|
42207
|
-
},
|
|
42208
|
-
"decoder.openStream": {
|
|
42209
|
-
capName: "decoder",
|
|
42210
|
-
capScope: "system",
|
|
42211
|
-
addonId: null,
|
|
42212
|
-
access: "view"
|
|
42213
|
-
},
|
|
42214
|
-
"decoder.pullFrames": {
|
|
42215
|
-
capName: "decoder",
|
|
42216
|
-
capScope: "system",
|
|
42217
|
-
addonId: null,
|
|
42218
|
-
access: "view"
|
|
42219
|
-
},
|
|
42220
|
-
"decoder.pullHandles": {
|
|
42221
|
-
capName: "decoder",
|
|
42222
|
-
capScope: "system",
|
|
42223
|
-
addonId: null,
|
|
42224
|
-
access: "view"
|
|
42225
|
-
},
|
|
42226
|
-
"decoder.pushPacket": {
|
|
42227
|
-
capName: "decoder",
|
|
42228
|
-
capScope: "system",
|
|
42229
|
-
addonId: null,
|
|
42230
|
-
access: "view"
|
|
42231
|
-
},
|
|
42232
42631
|
"decoder.reprobeHwaccel": {
|
|
42233
42632
|
capName: "decoder",
|
|
42234
42633
|
capScope: "system",
|
|
42235
42634
|
addonId: null,
|
|
42236
42635
|
access: "create"
|
|
42237
42636
|
},
|
|
42238
|
-
"decoder.supportsCodec": {
|
|
42239
|
-
capName: "decoder",
|
|
42240
|
-
capScope: "system",
|
|
42241
|
-
addonId: null,
|
|
42242
|
-
access: "view"
|
|
42243
|
-
},
|
|
42244
|
-
"decoder.updateConfig": {
|
|
42245
|
-
capName: "decoder",
|
|
42246
|
-
capScope: "system",
|
|
42247
|
-
addonId: null,
|
|
42248
|
-
access: "view"
|
|
42249
|
-
},
|
|
42250
42637
|
"detectionPipeline.applyDeviceSettingsPatch": {
|
|
42251
42638
|
capName: "detection-pipeline",
|
|
42252
42639
|
capScope: "device",
|
|
@@ -43735,12 +44122,24 @@ Object.freeze({
|
|
|
43735
44122
|
addonId: null,
|
|
43736
44123
|
access: "view"
|
|
43737
44124
|
},
|
|
44125
|
+
"localNetwork.addCustomAddress": {
|
|
44126
|
+
capName: "local-network",
|
|
44127
|
+
capScope: "system",
|
|
44128
|
+
addonId: null,
|
|
44129
|
+
access: "create"
|
|
44130
|
+
},
|
|
43738
44131
|
"localNetwork.downloadCa": {
|
|
43739
44132
|
capName: "local-network",
|
|
43740
44133
|
capScope: "system",
|
|
43741
44134
|
addonId: null,
|
|
43742
44135
|
access: "view"
|
|
43743
44136
|
},
|
|
44137
|
+
"localNetwork.getAddresses": {
|
|
44138
|
+
capName: "local-network",
|
|
44139
|
+
capScope: "system",
|
|
44140
|
+
addonId: null,
|
|
44141
|
+
access: "view"
|
|
44142
|
+
},
|
|
43744
44143
|
"localNetwork.getAllowedAddresses": {
|
|
43745
44144
|
capName: "local-network",
|
|
43746
44145
|
capScope: "system",
|
|
@@ -43753,6 +44152,12 @@ Object.freeze({
|
|
|
43753
44152
|
addonId: null,
|
|
43754
44153
|
access: "view"
|
|
43755
44154
|
},
|
|
44155
|
+
"localNetwork.getHubAddresses": {
|
|
44156
|
+
capName: "local-network",
|
|
44157
|
+
capScope: "system",
|
|
44158
|
+
addonId: null,
|
|
44159
|
+
access: "view"
|
|
44160
|
+
},
|
|
43756
44161
|
"localNetwork.getNotificationEndpoint": {
|
|
43757
44162
|
capName: "local-network",
|
|
43758
44163
|
capScope: "system",
|
|
@@ -43789,6 +44194,12 @@ Object.freeze({
|
|
|
43789
44194
|
addonId: null,
|
|
43790
44195
|
access: "create"
|
|
43791
44196
|
},
|
|
44197
|
+
"localNetwork.removeCustomAddress": {
|
|
44198
|
+
capName: "local-network",
|
|
44199
|
+
capScope: "system",
|
|
44200
|
+
addonId: null,
|
|
44201
|
+
access: "delete"
|
|
44202
|
+
},
|
|
43792
44203
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
43793
44204
|
capName: "local-network",
|
|
43794
44205
|
capScope: "system",
|
|
@@ -43801,6 +44212,12 @@ Object.freeze({
|
|
|
43801
44212
|
addonId: null,
|
|
43802
44213
|
access: "create"
|
|
43803
44214
|
},
|
|
44215
|
+
"localNetwork.setAddressRole": {
|
|
44216
|
+
capName: "local-network",
|
|
44217
|
+
capScope: "system",
|
|
44218
|
+
addonId: null,
|
|
44219
|
+
access: "create"
|
|
44220
|
+
},
|
|
43804
44221
|
"localNetwork.setAllowedAddresses": {
|
|
43805
44222
|
capName: "local-network",
|
|
43806
44223
|
capScope: "system",
|
|
@@ -45295,13 +45712,13 @@ Object.freeze({
|
|
|
45295
45712
|
addonId: null,
|
|
45296
45713
|
access: "delete"
|
|
45297
45714
|
},
|
|
45298
|
-
"pipelineExecutor.
|
|
45715
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
45299
45716
|
capName: "pipeline-executor",
|
|
45300
45717
|
capScope: "system",
|
|
45301
45718
|
addonId: null,
|
|
45302
45719
|
access: "delete"
|
|
45303
45720
|
},
|
|
45304
|
-
"pipelineExecutor.
|
|
45721
|
+
"pipelineExecutor.deleteModel": {
|
|
45305
45722
|
capName: "pipeline-executor",
|
|
45306
45723
|
capScope: "system",
|
|
45307
45724
|
addonId: null,
|
|
@@ -45445,12 +45862,6 @@ Object.freeze({
|
|
|
45445
45862
|
addonId: null,
|
|
45446
45863
|
access: "view"
|
|
45447
45864
|
},
|
|
45448
|
-
"pipelineExecutor.listTemplates": {
|
|
45449
|
-
capName: "pipeline-executor",
|
|
45450
|
-
capScope: "system",
|
|
45451
|
-
addonId: null,
|
|
45452
|
-
access: "view"
|
|
45453
|
-
},
|
|
45454
45865
|
"pipelineExecutor.rearmInferenceDevice": {
|
|
45455
45866
|
capName: "pipeline-executor",
|
|
45456
45867
|
capScope: "system",
|
|
@@ -45475,12 +45886,6 @@ Object.freeze({
|
|
|
45475
45886
|
addonId: null,
|
|
45476
45887
|
access: "create"
|
|
45477
45888
|
},
|
|
45478
|
-
"pipelineExecutor.saveTemplate": {
|
|
45479
|
-
capName: "pipeline-executor",
|
|
45480
|
-
capScope: "system",
|
|
45481
|
-
addonId: null,
|
|
45482
|
-
access: "create"
|
|
45483
|
-
},
|
|
45484
45889
|
"pipelineExecutor.setVideoPipelineSteps": {
|
|
45485
45890
|
capName: "pipeline-executor",
|
|
45486
45891
|
capScope: "system",
|
|
@@ -45499,41 +45904,35 @@ Object.freeze({
|
|
|
45499
45904
|
addonId: null,
|
|
45500
45905
|
access: "create"
|
|
45501
45906
|
},
|
|
45502
|
-
"pipelineExecutor.updateTemplate": {
|
|
45503
|
-
capName: "pipeline-executor",
|
|
45504
|
-
capScope: "system",
|
|
45505
|
-
addonId: null,
|
|
45506
|
-
access: "create"
|
|
45507
|
-
},
|
|
45508
45907
|
"pipelineExecutor.validatePipeline": {
|
|
45509
45908
|
capName: "pipeline-executor",
|
|
45510
45909
|
capScope: "system",
|
|
45511
45910
|
addonId: null,
|
|
45512
45911
|
access: "view"
|
|
45513
45912
|
},
|
|
45514
|
-
"pipelineOrchestrator.
|
|
45913
|
+
"pipelineOrchestrator.applyAutoTune": {
|
|
45515
45914
|
capName: "pipeline-orchestrator",
|
|
45516
45915
|
capScope: "system",
|
|
45517
45916
|
addonId: null,
|
|
45518
45917
|
access: "create"
|
|
45519
45918
|
},
|
|
45520
|
-
"pipelineOrchestrator.
|
|
45919
|
+
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
45521
45920
|
capName: "pipeline-orchestrator",
|
|
45522
45921
|
capScope: "system",
|
|
45523
45922
|
addonId: null,
|
|
45524
45923
|
access: "create"
|
|
45525
45924
|
},
|
|
45526
|
-
"pipelineOrchestrator.
|
|
45925
|
+
"pipelineOrchestrator.assignAudio": {
|
|
45527
45926
|
capName: "pipeline-orchestrator",
|
|
45528
45927
|
capScope: "system",
|
|
45529
45928
|
addonId: null,
|
|
45530
45929
|
access: "create"
|
|
45531
45930
|
},
|
|
45532
|
-
"pipelineOrchestrator.
|
|
45931
|
+
"pipelineOrchestrator.assignPipeline": {
|
|
45533
45932
|
capName: "pipeline-orchestrator",
|
|
45534
45933
|
capScope: "system",
|
|
45535
45934
|
addonId: null,
|
|
45536
|
-
access: "
|
|
45935
|
+
access: "create"
|
|
45537
45936
|
},
|
|
45538
45937
|
"pipelineOrchestrator.getAgentLoad": {
|
|
45539
45938
|
capName: "pipeline-orchestrator",
|
|
@@ -45625,6 +46024,12 @@ Object.freeze({
|
|
|
45625
46024
|
addonId: null,
|
|
45626
46025
|
access: "view"
|
|
45627
46026
|
},
|
|
46027
|
+
"pipelineOrchestrator.getEffectiveShares": {
|
|
46028
|
+
capName: "pipeline-orchestrator",
|
|
46029
|
+
capScope: "system",
|
|
46030
|
+
addonId: null,
|
|
46031
|
+
access: "view"
|
|
46032
|
+
},
|
|
45628
46033
|
"pipelineOrchestrator.getGlobalMetrics": {
|
|
45629
46034
|
capName: "pipeline-orchestrator",
|
|
45630
46035
|
capScope: "system",
|
|
@@ -45661,19 +46066,19 @@ Object.freeze({
|
|
|
45661
46066
|
addonId: null,
|
|
45662
46067
|
access: "view"
|
|
45663
46068
|
},
|
|
45664
|
-
"pipelineOrchestrator.
|
|
46069
|
+
"pipelineOrchestrator.getPlacementStats": {
|
|
45665
46070
|
capName: "pipeline-orchestrator",
|
|
45666
46071
|
capScope: "system",
|
|
45667
46072
|
addonId: null,
|
|
45668
46073
|
access: "view"
|
|
45669
46074
|
},
|
|
45670
|
-
"pipelineOrchestrator.
|
|
46075
|
+
"pipelineOrchestrator.getReconcileFromDiskStatus": {
|
|
45671
46076
|
capName: "pipeline-orchestrator",
|
|
45672
46077
|
capScope: "system",
|
|
45673
46078
|
addonId: null,
|
|
45674
46079
|
access: "view"
|
|
45675
46080
|
},
|
|
45676
|
-
"pipelineOrchestrator.
|
|
46081
|
+
"pipelineOrchestrator.listAgentSettings": {
|
|
45677
46082
|
capName: "pipeline-orchestrator",
|
|
45678
46083
|
capScope: "system",
|
|
45679
46084
|
addonId: null,
|
|
@@ -45685,6 +46090,12 @@ Object.freeze({
|
|
|
45685
46090
|
addonId: null,
|
|
45686
46091
|
access: "create"
|
|
45687
46092
|
},
|
|
46093
|
+
"pipelineOrchestrator.planAutoTune": {
|
|
46094
|
+
capName: "pipeline-orchestrator",
|
|
46095
|
+
capScope: "system",
|
|
46096
|
+
addonId: null,
|
|
46097
|
+
access: "view"
|
|
46098
|
+
},
|
|
45688
46099
|
"pipelineOrchestrator.rebalance": {
|
|
45689
46100
|
capName: "pipeline-orchestrator",
|
|
45690
46101
|
capScope: "system",
|
|
@@ -45727,12 +46138,6 @@ Object.freeze({
|
|
|
45727
46138
|
addonId: null,
|
|
45728
46139
|
access: "create"
|
|
45729
46140
|
},
|
|
45730
|
-
"pipelineOrchestrator.saveTemplate": {
|
|
45731
|
-
capName: "pipeline-orchestrator",
|
|
45732
|
-
capScope: "system",
|
|
45733
|
-
addonId: null,
|
|
45734
|
-
access: "create"
|
|
45735
|
-
},
|
|
45736
46141
|
"pipelineOrchestrator.setAgentCapabilities": {
|
|
45737
46142
|
capName: "pipeline-orchestrator",
|
|
45738
46143
|
capScope: "system",
|
|
@@ -45745,12 +46150,6 @@ Object.freeze({
|
|
|
45745
46150
|
addonId: null,
|
|
45746
46151
|
access: "create"
|
|
45747
46152
|
},
|
|
45748
|
-
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
45749
|
-
capName: "pipeline-orchestrator",
|
|
45750
|
-
capScope: "system",
|
|
45751
|
-
addonId: null,
|
|
45752
|
-
access: "create"
|
|
45753
|
-
},
|
|
45754
46153
|
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
45755
46154
|
capName: "pipeline-orchestrator",
|
|
45756
46155
|
capScope: "system",
|
|
@@ -45787,6 +46186,12 @@ Object.freeze({
|
|
|
45787
46186
|
addonId: null,
|
|
45788
46187
|
access: "create"
|
|
45789
46188
|
},
|
|
46189
|
+
"pipelineOrchestrator.setCameraStepSettings": {
|
|
46190
|
+
capName: "pipeline-orchestrator",
|
|
46191
|
+
capScope: "system",
|
|
46192
|
+
addonId: null,
|
|
46193
|
+
access: "create"
|
|
46194
|
+
},
|
|
45790
46195
|
"pipelineOrchestrator.setCameraStepToggle": {
|
|
45791
46196
|
capName: "pipeline-orchestrator",
|
|
45792
46197
|
capScope: "system",
|
|
@@ -45805,25 +46210,37 @@ Object.freeze({
|
|
|
45805
46210
|
addonId: null,
|
|
45806
46211
|
access: "create"
|
|
45807
46212
|
},
|
|
46213
|
+
"pipelineOrchestrator.setLoadBalancingShares": {
|
|
46214
|
+
capName: "pipeline-orchestrator",
|
|
46215
|
+
capScope: "system",
|
|
46216
|
+
addonId: null,
|
|
46217
|
+
access: "create"
|
|
46218
|
+
},
|
|
45808
46219
|
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
45809
46220
|
capName: "pipeline-orchestrator",
|
|
45810
46221
|
capScope: "system",
|
|
45811
46222
|
addonId: null,
|
|
45812
46223
|
access: "create"
|
|
45813
46224
|
},
|
|
45814
|
-
"pipelineOrchestrator.
|
|
46225
|
+
"pipelineOrchestrator.setShareSource": {
|
|
45815
46226
|
capName: "pipeline-orchestrator",
|
|
45816
46227
|
capScope: "system",
|
|
45817
46228
|
addonId: null,
|
|
45818
46229
|
access: "create"
|
|
45819
46230
|
},
|
|
45820
|
-
"pipelineOrchestrator.
|
|
46231
|
+
"pipelineOrchestrator.suggestShares": {
|
|
46232
|
+
capName: "pipeline-orchestrator",
|
|
46233
|
+
capScope: "system",
|
|
46234
|
+
addonId: null,
|
|
46235
|
+
access: "view"
|
|
46236
|
+
},
|
|
46237
|
+
"pipelineOrchestrator.unassignAudio": {
|
|
45821
46238
|
capName: "pipeline-orchestrator",
|
|
45822
46239
|
capScope: "system",
|
|
45823
46240
|
addonId: null,
|
|
45824
46241
|
access: "create"
|
|
45825
46242
|
},
|
|
45826
|
-
"pipelineOrchestrator.
|
|
46243
|
+
"pipelineOrchestrator.unassignPipeline": {
|
|
45827
46244
|
capName: "pipeline-orchestrator",
|
|
45828
46245
|
capScope: "system",
|
|
45829
46246
|
addonId: null,
|
|
@@ -47263,12 +47680,6 @@ Object.freeze({
|
|
|
47263
47680
|
addonId: null,
|
|
47264
47681
|
access: "view"
|
|
47265
47682
|
},
|
|
47266
|
-
"streamBroker.pullFrameHandles": {
|
|
47267
|
-
capName: "stream-broker",
|
|
47268
|
-
capScope: "system",
|
|
47269
|
-
addonId: null,
|
|
47270
|
-
access: "view"
|
|
47271
|
-
},
|
|
47272
47683
|
"streamBroker.regenerateRtspToken": {
|
|
47273
47684
|
capName: "stream-broker",
|
|
47274
47685
|
capScope: "system",
|
|
@@ -47335,12 +47746,6 @@ Object.freeze({
|
|
|
47335
47746
|
addonId: null,
|
|
47336
47747
|
access: "create"
|
|
47337
47748
|
},
|
|
47338
|
-
"streamBroker.subscribeFrames": {
|
|
47339
|
-
capName: "stream-broker",
|
|
47340
|
-
capScope: "system",
|
|
47341
|
-
addonId: null,
|
|
47342
|
-
access: "create"
|
|
47343
|
-
},
|
|
47344
47749
|
"streamBroker.unassignProfile": {
|
|
47345
47750
|
capName: "stream-broker",
|
|
47346
47751
|
capScope: "system",
|
|
@@ -47353,12 +47758,6 @@ Object.freeze({
|
|
|
47353
47758
|
addonId: null,
|
|
47354
47759
|
access: "create"
|
|
47355
47760
|
},
|
|
47356
|
-
"streamBroker.unsubscribeFrames": {
|
|
47357
|
-
capName: "stream-broker",
|
|
47358
|
-
capScope: "system",
|
|
47359
|
-
addonId: null,
|
|
47360
|
-
access: "create"
|
|
47361
|
-
},
|
|
47362
47761
|
"streamCatalog.getCatalog": {
|
|
47363
47762
|
capName: "stream-catalog",
|
|
47364
47763
|
capScope: "device",
|
|
@@ -48055,6 +48454,12 @@ Object.freeze({
|
|
|
48055
48454
|
addonId: null,
|
|
48056
48455
|
access: "create"
|
|
48057
48456
|
},
|
|
48457
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
48458
|
+
capName: "webrtc-session",
|
|
48459
|
+
capScope: "device",
|
|
48460
|
+
addonId: null,
|
|
48461
|
+
access: "create"
|
|
48462
|
+
},
|
|
48058
48463
|
"webrtcSession.closeSession": {
|
|
48059
48464
|
capName: "webrtc-session",
|
|
48060
48465
|
capScope: "device",
|
|
@@ -49866,11 +50271,6 @@ Object.freeze({
|
|
|
49866
50271
|
form: "single",
|
|
49867
50272
|
optional: false
|
|
49868
50273
|
}],
|
|
49869
|
-
"decoder.createSession": [{
|
|
49870
|
-
name: "deviceId",
|
|
49871
|
-
form: "single",
|
|
49872
|
-
optional: true
|
|
49873
|
-
}],
|
|
49874
50274
|
"detectionPipeline.applyDeviceSettingsPatch": [{
|
|
49875
50275
|
name: "deviceId",
|
|
49876
50276
|
form: "single",
|
|
@@ -51101,6 +51501,11 @@ Object.freeze({
|
|
|
51101
51501
|
form: "single",
|
|
51102
51502
|
optional: false
|
|
51103
51503
|
}],
|
|
51504
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
51505
|
+
name: "deviceIds",
|
|
51506
|
+
form: "array",
|
|
51507
|
+
optional: true
|
|
51508
|
+
}],
|
|
51104
51509
|
"pipelineExecutor.runPipeline": [{
|
|
51105
51510
|
name: "deviceId",
|
|
51106
51511
|
form: "single",
|
|
@@ -51206,6 +51611,11 @@ Object.freeze({
|
|
|
51206
51611
|
form: "single",
|
|
51207
51612
|
optional: false
|
|
51208
51613
|
}],
|
|
51614
|
+
"pipelineOrchestrator.setCameraStepSettings": [{
|
|
51615
|
+
name: "deviceId",
|
|
51616
|
+
form: "single",
|
|
51617
|
+
optional: false
|
|
51618
|
+
}],
|
|
51209
51619
|
"pipelineOrchestrator.setCameraStepToggle": [{
|
|
51210
51620
|
name: "deviceId",
|
|
51211
51621
|
form: "single",
|
|
@@ -51977,6 +52387,11 @@ Object.freeze({
|
|
|
51977
52387
|
form: "single",
|
|
51978
52388
|
optional: false
|
|
51979
52389
|
}],
|
|
52390
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
52391
|
+
name: "deviceId",
|
|
52392
|
+
form: "single",
|
|
52393
|
+
optional: false
|
|
52394
|
+
}],
|
|
51980
52395
|
"webrtcSession.closeSession": [{
|
|
51981
52396
|
name: "deviceId",
|
|
51982
52397
|
form: "single",
|
|
@@ -52206,6 +52621,8 @@ new Map(Object.entries({
|
|
|
52206
52621
|
"detection-blind": "device-events",
|
|
52207
52622
|
"node-online": "system",
|
|
52208
52623
|
"node-offline": "system",
|
|
52624
|
+
"node-restarting": "system",
|
|
52625
|
+
"node-updating": "system",
|
|
52209
52626
|
"node-inference-unavailable": "system",
|
|
52210
52627
|
"addon-crash-loop": "system",
|
|
52211
52628
|
"addon-update-available": "system",
|
|
@@ -52283,6 +52700,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
52283
52700
|
kinds: [
|
|
52284
52701
|
"node-offline",
|
|
52285
52702
|
"node-online",
|
|
52703
|
+
"node-restarting",
|
|
52286
52704
|
"node-inference-unavailable"
|
|
52287
52705
|
]
|
|
52288
52706
|
},
|
|
@@ -52304,6 +52722,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
52304
52722
|
label: "Server & container updates",
|
|
52305
52723
|
kinds: [
|
|
52306
52724
|
"server-update-available",
|
|
52725
|
+
"node-updating",
|
|
52307
52726
|
"server-updated",
|
|
52308
52727
|
"wrapper-update-available"
|
|
52309
52728
|
]
|
|
@@ -52451,6 +52870,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
52451
52870
|
kinds: [
|
|
52452
52871
|
"node-offline",
|
|
52453
52872
|
"node-online",
|
|
52873
|
+
"node-restarting",
|
|
52454
52874
|
"node-inference-unavailable"
|
|
52455
52875
|
]
|
|
52456
52876
|
},
|
|
@@ -52472,6 +52892,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
52472
52892
|
example: "server 1.2.377 → 1.2.378",
|
|
52473
52893
|
kinds: [
|
|
52474
52894
|
"server-update-available",
|
|
52895
|
+
"node-updating",
|
|
52475
52896
|
"server-updated",
|
|
52476
52897
|
"wrapper-update-available"
|
|
52477
52898
|
]
|
|
@@ -52504,7 +52925,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
52504
52925
|
{
|
|
52505
52926
|
name: "summarySection",
|
|
52506
52927
|
label: "Summary: this section",
|
|
52507
|
-
description: "The section a per-section summary row is about
|
|
52928
|
+
description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
|
|
52508
52929
|
example: "Batterie scariche",
|
|
52509
52930
|
group: "system",
|
|
52510
52931
|
families: ["rule"],
|
|
@@ -52927,10 +53348,9 @@ TimelapseRuleInputSchema.extend({
|
|
|
52927
53348
|
createdAt: number(),
|
|
52928
53349
|
updatedAt: number()
|
|
52929
53350
|
});
|
|
52930
|
-
async function
|
|
52931
|
-
let slice;
|
|
53351
|
+
async function readSlice(deviceState, deviceId) {
|
|
52932
53352
|
try {
|
|
52933
|
-
|
|
53353
|
+
return await deviceState.getCapSlice.query({
|
|
52934
53354
|
deviceId,
|
|
52935
53355
|
capName: "motion"
|
|
52936
53356
|
});
|
|
@@ -52938,10 +53358,44 @@ async function readHubMotionDetected(deviceState, deviceId) {
|
|
|
52938
53358
|
const reason = err instanceof Error ? err.message : String(err);
|
|
52939
53359
|
throw new Error(`motion state of device ${deviceId} is unreadable: ${reason}`, { cause: err });
|
|
52940
53360
|
}
|
|
52941
|
-
|
|
53361
|
+
}
|
|
53362
|
+
/**
|
|
53363
|
+
* The hub's `motion` slice as a `MotionStatus`, or `null` when nobody has
|
|
53364
|
+
* published it since the hub started. Throws when the hub does not answer or
|
|
53365
|
+
* the slice is malformed — never a made-up "no motion".
|
|
53366
|
+
*/
|
|
53367
|
+
async function readHubMotionStatus(deviceState, deviceId) {
|
|
53368
|
+
const slice = await readSlice(deviceState, deviceId);
|
|
53369
|
+
if (slice === null) return null;
|
|
53370
|
+
const parsed = MotionStatusSchema.safeParse(slice);
|
|
53371
|
+
if (!parsed.success) throw new Error(`motion state of device ${deviceId} is malformed on the hub: ${parsed.error.message}`);
|
|
53372
|
+
return parsed.data;
|
|
53373
|
+
}
|
|
53374
|
+
async function readHubMotionDetected(deviceState, deviceId) {
|
|
53375
|
+
const detected = (await readSlice(deviceState, deviceId))?.["detected"];
|
|
52942
53376
|
if (typeof detected !== "boolean") throw new Error(`motion state of device ${deviceId} is not published yet (unknown)`);
|
|
52943
53377
|
return detected;
|
|
52944
53378
|
}
|
|
53379
|
+
/**
|
|
53380
|
+
* The native `motion` provider of a camera whose slice the orchestrator writes
|
|
53381
|
+
* (D696): `isDetected` AND `getStatus`, both from the hub. `owner` names the
|
|
53382
|
+
* provider class in the deviceId-mismatch error.
|
|
53383
|
+
*/
|
|
53384
|
+
function hubMotionNativeProvider(deviceState, deviceId, owner) {
|
|
53385
|
+
const ownDevice = (asked) => {
|
|
53386
|
+
if (asked !== deviceId) throw new Error(`${owner}: motion deviceId mismatch, expected ${deviceId}, got ${asked}`);
|
|
53387
|
+
};
|
|
53388
|
+
return {
|
|
53389
|
+
isDetected: async ({ deviceId: asked }) => {
|
|
53390
|
+
ownDevice(asked);
|
|
53391
|
+
return readHubMotionDetected(deviceState, deviceId);
|
|
53392
|
+
},
|
|
53393
|
+
getStatus: async ({ deviceId: asked }) => {
|
|
53394
|
+
ownDevice(asked);
|
|
53395
|
+
return readHubMotionStatus(deviceState, deviceId);
|
|
53396
|
+
}
|
|
53397
|
+
};
|
|
53398
|
+
}
|
|
52945
53399
|
MotionOnMotionChangedDataSchema.omit({ triggeredBy: true });
|
|
52946
53400
|
function providerMotionEvent(source, data) {
|
|
52947
53401
|
return createEvent(EventCategory.ProviderMotion, source, data);
|
|
@@ -57417,15 +57871,13 @@ var WyzeCamera = class extends BaseDevice {
|
|
|
57417
57871
|
/**
|
|
57418
57872
|
* The native `motion` cap. This provider writes NO `motion` slice (D696): the
|
|
57419
57873
|
* orchestrator is its only writer, with the EFFECTIVE motion, on the hub.
|
|
57420
|
-
* `isDetected`
|
|
57421
|
-
*
|
|
57422
|
-
* (D49, D393).
|
|
57874
|
+
* `isDetected` and `getStatus` answer from the HUB's slice
|
|
57875
|
+
* (`hubMotionNativeProvider`); an unreadable hub fails both — never `false`
|
|
57876
|
+
* for unknown (D49, D393).
|
|
57423
57877
|
*/
|
|
57424
57878
|
registerMotionProvider() {
|
|
57425
|
-
this.ctx.
|
|
57426
|
-
|
|
57427
|
-
return readHubMotionDetected(this.ctx.api.deviceState, this.id);
|
|
57428
|
-
} });
|
|
57879
|
+
const provider = hubMotionNativeProvider(this.ctx.api.deviceState, this.id, "WyzeCamera");
|
|
57880
|
+
this.ctx.registerNativeCap(motionCapability, provider);
|
|
57429
57881
|
}
|
|
57430
57882
|
/**
|
|
57431
57883
|
* Start the configured motion source. `cloud` polls the Wyze events API
|