@camstack/addon-provider-petkit 0.2.119 → 0.2.120
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 +999 -532
- package/dist/addon.mjs +999 -532
- package/package.json +1 -1
package/dist/addon.mjs
CHANGED
|
@@ -1100,7 +1100,7 @@ var Nodepetkit = class {
|
|
|
1100
1100
|
}
|
|
1101
1101
|
};
|
|
1102
1102
|
//#endregion
|
|
1103
|
-
//#region ../types/dist/event-category-
|
|
1103
|
+
//#region ../types/dist/event-category-B_0XEcLF.mjs
|
|
1104
1104
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
1105
1105
|
EventCategory["SystemBoot"] = "system.boot";
|
|
1106
1106
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -1601,15 +1601,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
1601
1601
|
EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
|
|
1602
1602
|
EventCategory["AgentBackupActivated"] = "agent.backup.activated";
|
|
1603
1603
|
EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
|
|
1604
|
-
/**
|
|
1605
|
-
* Per-agent hwaccel preference changed (user override set, cleared, or
|
|
1606
|
-
* re-probed). Observability event — decoders pull the current pref at
|
|
1607
|
-
* `createSession`, so running sessions keep their current backend until
|
|
1608
|
-
* they rotate naturally (camera add/remove, stream restart). Future
|
|
1609
|
-
* work can wire a listener in stream-broker that force-rotates live
|
|
1610
|
-
* sessions; for now this event powers logs + admin-UI toast feedback.
|
|
1611
|
-
*/
|
|
1612
|
-
EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
|
|
1613
1604
|
EventCategory["MotionAnalysis"] = "detection.motion-analysis";
|
|
1614
1605
|
/** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
|
|
1615
1606
|
EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
|
|
@@ -6480,7 +6471,7 @@ var ZodIssueCode = {
|
|
|
6480
6471
|
var ZodFirstPartyTypeKind;
|
|
6481
6472
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
6482
6473
|
//#endregion
|
|
6483
|
-
//#region ../types/dist/sleep-
|
|
6474
|
+
//#region ../types/dist/sleep-BNeXenvr.mjs
|
|
6484
6475
|
/**
|
|
6485
6476
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
6486
6477
|
* window to float samples (D455).
|
|
@@ -7846,32 +7837,12 @@ object({
|
|
|
7846
7837
|
audioCodec: string().optional(),
|
|
7847
7838
|
metadata: record(string(), unknown()).readonly().optional()
|
|
7848
7839
|
});
|
|
7849
|
-
var EncodedPacketSchema = object({
|
|
7850
|
-
type: _enum(["video", "audio"]),
|
|
7851
|
-
data: _instanceof(Uint8Array),
|
|
7852
|
-
pts: number(),
|
|
7853
|
-
dts: number(),
|
|
7854
|
-
keyframe: boolean(),
|
|
7855
|
-
codec: string()
|
|
7856
|
-
});
|
|
7857
|
-
var DecodedFrameSchema = object({
|
|
7858
|
-
data: _instanceof(Uint8Array),
|
|
7859
|
-
width: number(),
|
|
7860
|
-
height: number(),
|
|
7861
|
-
format: _enum([
|
|
7862
|
-
"jpeg",
|
|
7863
|
-
"rgb",
|
|
7864
|
-
"bgr",
|
|
7865
|
-
"yuv420",
|
|
7866
|
-
"gray"
|
|
7867
|
-
]),
|
|
7868
|
-
timestamp: number()
|
|
7869
|
-
});
|
|
7870
7840
|
/**
|
|
7871
7841
|
* Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
|
|
7872
7842
|
* frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
|
|
7873
|
-
* interface in `interfaces/frame-handle.ts` field-for-field so a
|
|
7874
|
-
*
|
|
7843
|
+
* interface in `interfaces/frame-handle.ts` field-for-field so a cap method
|
|
7844
|
+
* (the runner's native-crop and pipeline-executor inputs) can carry handles
|
|
7845
|
+
* over tRPC / Moleculer.
|
|
7875
7846
|
*
|
|
7876
7847
|
* The `satisfies` assertion below pins this schema to the interface: if a
|
|
7877
7848
|
* field is added to / removed from `FrameHandle` without a matching schema
|
|
@@ -7897,50 +7868,6 @@ var FrameHandleSchema = object({
|
|
|
7897
7868
|
slotCount: number().int().positive()
|
|
7898
7869
|
});
|
|
7899
7870
|
/**
|
|
7900
|
-
* Pixel format a frame-handle subscriber can request from the broker
|
|
7901
|
-
* (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
|
|
7902
|
-
* `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
|
|
7903
|
-
* `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
|
|
7904
|
-
* payload, and no decoded-frame consumer requests it over the shm plane.
|
|
7905
|
-
*/
|
|
7906
|
-
var FrameHandleFormatSchema = _enum([
|
|
7907
|
-
"rgb",
|
|
7908
|
-
"bgr",
|
|
7909
|
-
"yuv420",
|
|
7910
|
-
"gray"
|
|
7911
|
-
]);
|
|
7912
|
-
/**
|
|
7913
|
-
* Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
|
|
7914
|
-
* broker for a `FrameHandle` stream of one `format`; the broker maintains one
|
|
7915
|
-
* shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
|
|
7916
|
-
* subscriber (motion) and an `rgb` subscriber (detection) each read the format
|
|
7917
|
-
* they asked for with no broker-side conversion.
|
|
7918
|
-
*/
|
|
7919
|
-
var SubscribeFramesInputSchema = object({
|
|
7920
|
-
brokerId: string(),
|
|
7921
|
-
format: FrameHandleFormatSchema,
|
|
7922
|
-
/**
|
|
7923
|
-
* Optional reader-side cadence hint in frames per second. The broker does
|
|
7924
|
-
* NOT throttle — latest-wins ring reads drop frames implicitly for a slow
|
|
7925
|
-
* consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
|
|
7926
|
-
* the consumer can pace its own `pullFrameHandles` polling.
|
|
7927
|
-
*/
|
|
7928
|
-
maxFps: number().positive().optional(),
|
|
7929
|
-
/** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
|
|
7930
|
-
tag: string().optional()
|
|
7931
|
-
});
|
|
7932
|
-
/**
|
|
7933
|
-
* Result of `stream-broker.subscribeFrames`. The consumer then polls
|
|
7934
|
-
* `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
|
|
7935
|
-
* `FrameHandle` to a `FrameRingReader`.
|
|
7936
|
-
*/
|
|
7937
|
-
var SubscribeFramesResultSchema = object({
|
|
7938
|
-
/** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
|
|
7939
|
-
subscriptionId: string(),
|
|
7940
|
-
/** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
|
|
7941
|
-
maxFps: number().nonnegative()
|
|
7942
|
-
});
|
|
7943
|
-
/**
|
|
7944
7871
|
* Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
|
|
7945
7872
|
* `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
|
|
7946
7873
|
* sample bytes plus the track parameters a consumer needs to interpret them.
|
|
@@ -7948,8 +7875,8 @@ var SubscribeFramesResultSchema = object({
|
|
|
7948
7875
|
* Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
|
|
7949
7876
|
* Float32 PCM), so unlike video frames they ship their bytes INLINE over
|
|
7950
7877
|
* tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
|
|
7951
|
-
* (the wire-serialisable supertype of `Buffer`)
|
|
7952
|
-
*
|
|
7878
|
+
* (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
|
|
7879
|
+
* it.
|
|
7953
7880
|
*/
|
|
7954
7881
|
var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
|
|
7955
7882
|
var DecodedAudioChunkSchema = object({
|
|
@@ -7967,11 +7894,10 @@ var DecodedAudioChunkSchema = object({
|
|
|
7967
7894
|
format: AudioChunkFormatSchema.optional()
|
|
7968
7895
|
});
|
|
7969
7896
|
/**
|
|
7970
|
-
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9).
|
|
7971
|
-
*
|
|
7972
|
-
*
|
|
7973
|
-
*
|
|
7974
|
-
* `pullAudioChunks`.
|
|
7897
|
+
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
|
|
7898
|
+
* its bytes inline: a consumer asks the broker for the decoded audio-chunk
|
|
7899
|
+
* stream of one broker; the broker keeps a per-subscription bounded FIFO queue
|
|
7900
|
+
* the consumer drains via `pullAudioChunks`.
|
|
7975
7901
|
*/
|
|
7976
7902
|
var SubscribeAudioChunksInputSchema = object({
|
|
7977
7903
|
brokerId: string(),
|
|
@@ -8002,9 +7928,7 @@ var BrokerStatsSchema = object({
|
|
|
8002
7928
|
"stopped"
|
|
8003
7929
|
]),
|
|
8004
7930
|
inputFps: number(),
|
|
8005
|
-
decodeFps: number(),
|
|
8006
7931
|
encodedSubscribers: number(),
|
|
8007
|
-
decodedSubscribers: number(),
|
|
8008
7932
|
uptimeMs: number(),
|
|
8009
7933
|
bitrateKbps: number(),
|
|
8010
7934
|
idrIntervalMs: number(),
|
|
@@ -8017,14 +7941,6 @@ var BrokerStatsSchema = object({
|
|
|
8017
7941
|
preBufferMs: number(),
|
|
8018
7942
|
preBufferPackets: number(),
|
|
8019
7943
|
/**
|
|
8020
|
-
* Moleculer node id of the decoder provider currently servicing this
|
|
8021
|
-
* stream's decoded subscribers. `null` until the deferred decoder is
|
|
8022
|
-
* created (no decoded clients yet, or codec not detected). Surfaces the
|
|
8023
|
-
* runtime decoder placement so the UI can show "Decoder: <agent>" without
|
|
8024
|
-
* a separate cap call per broker.
|
|
8025
|
-
*/
|
|
8026
|
-
decoderNodeId: string().nullable(),
|
|
8027
|
-
/**
|
|
8028
7944
|
* Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
|
|
8029
7945
|
* when the stream has no audio track or the broker is in cold start.
|
|
8030
7946
|
* `supported = false` means the codec was detected but the local
|
|
@@ -11360,70 +11276,6 @@ var StorageLocationDeclarationSchema = object({
|
|
|
11360
11276
|
"backup"
|
|
11361
11277
|
]).optional()
|
|
11362
11278
|
});
|
|
11363
|
-
var DecoderStatsSchema = object({
|
|
11364
|
-
inputFps: number(),
|
|
11365
|
-
outputFps: number(),
|
|
11366
|
-
avgDecodeTimeMs: number(),
|
|
11367
|
-
droppedFrames: number(),
|
|
11368
|
-
/**
|
|
11369
|
-
* Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
|
|
11370
|
-
* lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
|
|
11371
|
-
* the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
|
|
11372
|
-
* is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
|
|
11373
|
-
*/
|
|
11374
|
-
lagMs: number().optional(),
|
|
11375
|
-
effectiveFps: number().optional(),
|
|
11376
|
-
adaptiveFps: number().optional()
|
|
11377
|
-
});
|
|
11378
|
-
var DecoderSessionConfigSchema = object({
|
|
11379
|
-
codec: string(),
|
|
11380
|
-
maxFps: number().default(0),
|
|
11381
|
-
outputFormat: _enum([
|
|
11382
|
-
"jpeg",
|
|
11383
|
-
"rgb",
|
|
11384
|
-
"bgr",
|
|
11385
|
-
"yuv420",
|
|
11386
|
-
"gray"
|
|
11387
|
-
]).default("jpeg"),
|
|
11388
|
-
scale: number().default(1),
|
|
11389
|
-
width: number().optional(),
|
|
11390
|
-
height: number().optional(),
|
|
11391
|
-
/**
|
|
11392
|
-
* Identifier of the camera this decoder session serves. Optional
|
|
11393
|
-
* because the cap is generic (any caller could request decode), but
|
|
11394
|
-
* stream-broker passes it so decoder logs include `deviceId` for
|
|
11395
|
-
* per-camera filtering when diagnosing failures (e.g. node-av
|
|
11396
|
-
* sendPacket errors on a single hung camera).
|
|
11397
|
-
*/
|
|
11398
|
-
deviceId: number().int().nonnegative().optional(),
|
|
11399
|
-
/**
|
|
11400
|
-
* Free-form tag for log scoping. Stream-broker uses
|
|
11401
|
-
* `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
|
|
11402
|
-
* on every line so `grep tag=broker:5/high` filters one camera
|
|
11403
|
-
* profile cleanly.
|
|
11404
|
-
*/
|
|
11405
|
-
tag: string().optional(),
|
|
11406
|
-
/**
|
|
11407
|
-
* Where the session delivers decoded frames (Phase 5 / D9):
|
|
11408
|
-
*
|
|
11409
|
-
* - `'callback'` (default) — the legacy pixel path: decoded frames are
|
|
11410
|
-
* buffered as `DecodedFrame`s and drained via `pullFrames`.
|
|
11411
|
-
* - `'shm'` — the shared-memory frame plane: decoded frames are written
|
|
11412
|
-
* into an OS shared-memory ring and drained as zero-pixel
|
|
11413
|
-
* `FrameHandle`s via `pullHandles`. A session is one mode or the
|
|
11414
|
-
* other — `pullFrames` returns nothing for an `'shm'` session and
|
|
11415
|
-
* `pullHandles` returns nothing for a `'callback'` session.
|
|
11416
|
-
*/
|
|
11417
|
-
frameSink: _enum(["callback", "shm"]).default("callback"),
|
|
11418
|
-
/**
|
|
11419
|
-
* Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
|
|
11420
|
-
* a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
|
|
11421
|
-
* real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
|
|
11422
|
-
* stream-broker's `streamingDebug` gate — off by default so production logs
|
|
11423
|
-
* stay quiet and the emit path pays zero per-frame cost when disabled.
|
|
11424
|
-
*/
|
|
11425
|
-
debug: boolean().optional()
|
|
11426
|
-
});
|
|
11427
11279
|
/**
|
|
11428
11280
|
* Per-component log CHANNELS — the gate a hot path consults, and the registry
|
|
11429
11281
|
* an addon declares its channels in.
|
|
@@ -11566,6 +11418,26 @@ var ClipSearchStrictnessSchema = _enum([
|
|
|
11566
11418
|
"balanced",
|
|
11567
11419
|
"strict"
|
|
11568
11420
|
]);
|
|
11421
|
+
/** Steps whose effect a root label can BE. */
|
|
11422
|
+
var LABEL_SUPPLY_STEP_IDS = [
|
|
11423
|
+
"animal-classifier",
|
|
11424
|
+
"vehicle-classifier",
|
|
11425
|
+
"package-detection"
|
|
11426
|
+
];
|
|
11427
|
+
/** Steps whose box a root detection can BE. */
|
|
11428
|
+
var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
|
|
11429
|
+
/**
|
|
11430
|
+
* Steps whose per-detection MASK a root detection can carry (D737). The live
|
|
11431
|
+
* mask step is `segmentation` — a frame-plane refiner that runs its own model
|
|
11432
|
+
* once per detection crop. (`instance-segmentation` is a dormant step id that
|
|
11433
|
+
* no camera tree carries.)
|
|
11434
|
+
*/
|
|
11435
|
+
var MASK_SUPPLY_STEP_IDS = ["segmentation"];
|
|
11436
|
+
[
|
|
11437
|
+
...LABEL_SUPPLY_STEP_IDS,
|
|
11438
|
+
...CROP_SUPPLY_STEP_IDS,
|
|
11439
|
+
...MASK_SUPPLY_STEP_IDS
|
|
11440
|
+
];
|
|
11569
11441
|
var MODEL_FORMATS = [
|
|
11570
11442
|
"onnx",
|
|
11571
11443
|
"coreml",
|
|
@@ -11594,7 +11466,53 @@ var ModelFormatEntrySchema = object({
|
|
|
11594
11466
|
/** Multi-file payload (directory members or sibling files). */
|
|
11595
11467
|
files: array(string()).readonly().optional(),
|
|
11596
11468
|
/** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
|
|
11597
|
-
runtimes: array(_enum(["python"])).readonly().optional()
|
|
11469
|
+
runtimes: array(_enum(["python"])).readonly().optional(),
|
|
11470
|
+
/**
|
|
11471
|
+
* Content revision of the artefact, for one hosted OFF the CamStack mirror.
|
|
11472
|
+
* A format on the mirror leaves it unset: its revision (the sha256 of its
|
|
11473
|
+
* weight file) comes from the downloader's generated table, kept in step
|
|
11474
|
+
* with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
|
|
11475
|
+
* node records the revision it downloaded next to the file
|
|
11476
|
+
* (`<file>.revision`); a copy with no record or a different one is stale
|
|
11477
|
+
* unless its weight file hashes to the revision, and a stale copy is
|
|
11478
|
+
* downloaded again, the old one serving until the new one is complete. No
|
|
11479
|
+
* revision at all ⇒ a file on disk is current, whatever it holds (D743).
|
|
11480
|
+
*/
|
|
11481
|
+
revision: string().min(1).optional()
|
|
11482
|
+
});
|
|
11483
|
+
/**
|
|
11484
|
+
* What a node holds for one (model, format) (D746). `current` is a complete
|
|
11485
|
+
* copy at its catalog revision — exactly what `downloaded: true` means.
|
|
11486
|
+
* `stale` is bytes on disk that are not (yet) proven current under D743/D744:
|
|
11487
|
+
* no or a different revision record, or a missing sibling. `missing` is no
|
|
11488
|
+
* copy. `downloaded` alone folds `stale` into "not downloaded", which hid
|
|
11489
|
+
* reclaimable bytes and a copy about to be replaced.
|
|
11490
|
+
*/
|
|
11491
|
+
var ModelOnDiskStateSchema = _enum([
|
|
11492
|
+
"current",
|
|
11493
|
+
"stale",
|
|
11494
|
+
"missing"
|
|
11495
|
+
]);
|
|
11496
|
+
/**
|
|
11497
|
+
* The numeric precision of one format's BUILD (D746) — reported only when the
|
|
11498
|
+
* build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
|
|
11499
|
+
* CamStack Core ML export). Absent means "not stated", never "fp32".
|
|
11500
|
+
*/
|
|
11501
|
+
var ModelFormatPrecisionSchema = _enum([
|
|
11502
|
+
"fp32",
|
|
11503
|
+
"fp16",
|
|
11504
|
+
"int8"
|
|
11505
|
+
]);
|
|
11506
|
+
/**
|
|
11507
|
+
* One format of one model as a node's `pipelineExecutor.getSchema` reports it.
|
|
11508
|
+
* `onDisk` / `precision` are optional for version skew: a runner that predates
|
|
11509
|
+
* them omits them, and a reader falls back to `downloaded`.
|
|
11510
|
+
*/
|
|
11511
|
+
var PipelineModelFormatStatusSchema = object({
|
|
11512
|
+
downloaded: boolean(),
|
|
11513
|
+
sizeMB: number(),
|
|
11514
|
+
onDisk: ModelOnDiskStateSchema.optional(),
|
|
11515
|
+
precision: ModelFormatPrecisionSchema.optional()
|
|
11598
11516
|
});
|
|
11599
11517
|
/**
|
|
11600
11518
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
@@ -11635,11 +11553,11 @@ var ModelVariantGroupSchema = object({
|
|
|
11635
11553
|
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
11636
11554
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
11637
11555
|
/**
|
|
11638
|
-
*
|
|
11639
|
-
*
|
|
11640
|
-
*
|
|
11556
|
+
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
11557
|
+
* an alternate training of the same family (Scrypted `relu_test`); chip
|
|
11558
|
+
* label is "Test".
|
|
11641
11559
|
*/
|
|
11642
|
-
optimization: _enum(["standard", "
|
|
11560
|
+
optimization: _enum(["standard", "test"]).optional(),
|
|
11643
11561
|
/**
|
|
11644
11562
|
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
11645
11563
|
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
@@ -11662,9 +11580,10 @@ var ModelProviderIdSchema = _enum([
|
|
|
11662
11580
|
* are per upstream. A persisted custom-model row written when this field was a
|
|
11663
11581
|
* string still parses — the string is lifted into `{ weights }`.
|
|
11664
11582
|
*
|
|
11665
|
-
* Every licence surface (the
|
|
11666
|
-
*
|
|
11667
|
-
*
|
|
11583
|
+
* Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
|
|
11584
|
+
* model table) is GENERATED from these records by
|
|
11585
|
+
* `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
|
|
11586
|
+
* `camstack/docs` → `/docs/detection/models`.
|
|
11668
11587
|
*/
|
|
11669
11588
|
var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
|
|
11670
11589
|
/** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
|
|
@@ -11697,6 +11616,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
|
|
|
11697
11616
|
/** True when the weights or their data forbid commercial use. */
|
|
11698
11617
|
nonCommercial: boolean().optional()
|
|
11699
11618
|
}));
|
|
11619
|
+
/**
|
|
11620
|
+
* One step a ROOT detector can supply from its own output (D730) — see
|
|
11621
|
+
* `ModelCatalogEntry.suppliesSteps`.
|
|
11622
|
+
*
|
|
11623
|
+
* - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
|
|
11624
|
+
* the root's label to the step's vocabulary; `uncovered` is the vocabulary
|
|
11625
|
+
* the root cannot produce (shown as unavailable, never a blocker).
|
|
11626
|
+
* - `crop`: the root draws the box the step would have found (`license_plate`
|
|
11627
|
+
* for plate-detection, `face` for face-detection). The box becomes a detail
|
|
11628
|
+
* child of the `parentMacro` detection that contains it — never a track.
|
|
11629
|
+
* - `mask`: the root's decode emits an instance mask with every detection (a
|
|
11630
|
+
* YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
|
|
11631
|
+
* detection in the shape that step produces. Derived from the model's
|
|
11632
|
+
* postprocessor on read, never stored by an import.
|
|
11633
|
+
*/
|
|
11634
|
+
var RootStepSupplySchema = discriminatedUnion("kind", [
|
|
11635
|
+
object({
|
|
11636
|
+
kind: literal("label"),
|
|
11637
|
+
stepId: _enum(LABEL_SUPPLY_STEP_IDS),
|
|
11638
|
+
labelToEffect: record(string(), string()),
|
|
11639
|
+
uncovered: array(string()).readonly()
|
|
11640
|
+
}),
|
|
11641
|
+
object({
|
|
11642
|
+
kind: literal("crop"),
|
|
11643
|
+
stepId: _enum(CROP_SUPPLY_STEP_IDS),
|
|
11644
|
+
rootLabels: array(string()).readonly(),
|
|
11645
|
+
parentMacro: _enum(["vehicle", "person"]),
|
|
11646
|
+
childClass: _enum(["plate", "face"]),
|
|
11647
|
+
/**
|
|
11648
|
+
* The root's smaller input side, stamped on read by `rootSuppliesOf` from
|
|
11649
|
+
* the model entry — what a step's `minRootInputPx` gate judges. Never
|
|
11650
|
+
* stored by an import.
|
|
11651
|
+
*/
|
|
11652
|
+
rootInputPx: number().int().positive().optional()
|
|
11653
|
+
}),
|
|
11654
|
+
object({
|
|
11655
|
+
kind: literal("mask"),
|
|
11656
|
+
stepId: _enum(MASK_SUPPLY_STEP_IDS)
|
|
11657
|
+
})
|
|
11658
|
+
]);
|
|
11700
11659
|
var ModelCatalogEntrySchema = object({
|
|
11701
11660
|
id: string(),
|
|
11702
11661
|
name: string(),
|
|
@@ -11762,6 +11721,35 @@ var ModelCatalogEntrySchema = object({
|
|
|
11762
11721
|
*/
|
|
11763
11722
|
defaultConfidence: number().min(0).max(1).optional(),
|
|
11764
11723
|
/**
|
|
11724
|
+
* Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
|
|
11725
|
+
* on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
|
|
11726
|
+
* absent here runs at the step slider's global default. The same row shape
|
|
11727
|
+
* the floor measurement produces (`model-floors.json`: modelId → floors), so
|
|
11728
|
+
* a measured table is copied in as-is. An operator override is bound to the
|
|
11729
|
+
* model it was made for and does not survive a model change (D738). A custom
|
|
11730
|
+
* / imported model may declare it; without it, the global defaults apply.
|
|
11731
|
+
*/
|
|
11732
|
+
defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
|
|
11733
|
+
/**
|
|
11734
|
+
* The inference precision this model's OpenVINO IR needs on an Intel GPU.
|
|
11735
|
+
* Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
|
|
11736
|
+
* that produces invalid output at f16 — measured 2026-10-07 for YOLO26
|
|
11737
|
+
* base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
|
|
11738
|
+
* scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
|
|
11739
|
+
* `PoolModelConfig.gpuInferencePrecision`; the pool sets
|
|
11740
|
+
* INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
|
|
11741
|
+
*/
|
|
11742
|
+
gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
|
|
11743
|
+
/**
|
|
11744
|
+
* ROOT detectors only: per supplied step (`animal-classifier`, …), the
|
|
11745
|
+
* minimum DETECTION score from which this root's own fine label (species,
|
|
11746
|
+
* vehicle type — D736 root supply) is taken (D741). Below it the detection
|
|
11747
|
+
* keeps its macro class without the fine label. `1` = never take it from
|
|
11748
|
+
* this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
|
|
11749
|
+
* `minConfidence` slider, bound to the ROOT model, overrides it.
|
|
11750
|
+
*/
|
|
11751
|
+
suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
|
|
11752
|
+
/**
|
|
11765
11753
|
* When true, the executor produces a landmark-aligned crop (similarity warp
|
|
11766
11754
|
* onto the canonical template) before this step runs, instead of a plain
|
|
11767
11755
|
* axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
|
|
@@ -11823,6 +11811,16 @@ var ModelCatalogEntrySchema = object({
|
|
|
11823
11811
|
*/
|
|
11824
11812
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
11825
11813
|
/**
|
|
11814
|
+
* The pipeline steps this ROOT detector can supply from its own output
|
|
11815
|
+
* (D730): its labels name a step's effect (`deer` for `animal-classifier`)
|
|
11816
|
+
* or draw a step's box (`license_plate` for `plate-detection`). Computed at
|
|
11817
|
+
* import from THIS model's labelmap by `deriveRootSupplies`, never written
|
|
11818
|
+
* by hand and never assumed per family; a row without it is derived on read
|
|
11819
|
+
* (`rootSuppliesOf`). Whether a camera uses it is the step's own
|
|
11820
|
+
* `useRootModel` flag (`resolveRootSupply`).
|
|
11821
|
+
*/
|
|
11822
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
|
|
11823
|
+
/**
|
|
11826
11824
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
11827
11825
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
11828
11826
|
* CLIP image encoder; its absence is what "not a CLIP model" means to the
|
|
@@ -13424,13 +13422,6 @@ var BrokerRtspClientSchema = object({
|
|
|
13424
13422
|
lastRtpAt: number(),
|
|
13425
13423
|
bytesSent: number()
|
|
13426
13424
|
});
|
|
13427
|
-
var BrokerDecodedClientSchema = object({
|
|
13428
|
-
tag: string(),
|
|
13429
|
-
subscribedAt: number(),
|
|
13430
|
-
maxFps: number(),
|
|
13431
|
-
framesDelivered: number(),
|
|
13432
|
-
framesDropped: number()
|
|
13433
|
-
});
|
|
13434
13425
|
var BrokerAudioClientSchema = object({
|
|
13435
13426
|
tag: string(),
|
|
13436
13427
|
subscribedAt: number(),
|
|
@@ -13522,7 +13513,6 @@ var BrokerEncodedClientSchema = object({
|
|
|
13522
13513
|
});
|
|
13523
13514
|
var BrokerClientsSchema = object({
|
|
13524
13515
|
rtsp: array(BrokerRtspClientSchema).readonly(),
|
|
13525
|
-
decoded: array(BrokerDecodedClientSchema).readonly(),
|
|
13526
13516
|
audio: array(BrokerAudioClientSchema).readonly(),
|
|
13527
13517
|
encoded: array(BrokerEncodedClientSchema).readonly(),
|
|
13528
13518
|
pipeClients: number(),
|
|
@@ -13891,11 +13881,7 @@ method(object({
|
|
|
13891
13881
|
auth: "admin"
|
|
13892
13882
|
}), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
|
|
13893
13883
|
brokerId: string(),
|
|
13894
|
-
channel: _enum([
|
|
13895
|
-
"rtsp",
|
|
13896
|
-
"decoded",
|
|
13897
|
-
"audio"
|
|
13898
|
-
]),
|
|
13884
|
+
channel: _enum(["rtsp", "audio"]),
|
|
13899
13885
|
handle: string()
|
|
13900
13886
|
}), object({ killed: boolean() }), {
|
|
13901
13887
|
kind: "mutation",
|
|
@@ -13930,10 +13916,7 @@ method(object({
|
|
|
13930
13916
|
}), method(SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, { kind: "mutation" }), method(object({
|
|
13931
13917
|
subscriptionId: string(),
|
|
13932
13918
|
maxCount: number().int().positive().default(8)
|
|
13933
|
-
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(
|
|
13934
|
-
subscriptionId: string(),
|
|
13935
|
-
maxCount: number().int().positive().default(4)
|
|
13936
|
-
}), array(FrameHandleSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
13919
|
+
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
13937
13920
|
brokerId: string(),
|
|
13938
13921
|
seconds: number().min(0).max(30)
|
|
13939
13922
|
}), _void(), {
|
|
@@ -15192,54 +15175,12 @@ id: union([string(), number()]) }), {
|
|
|
15192
15175
|
kind: "mutation",
|
|
15193
15176
|
auth: "admin"
|
|
15194
15177
|
});
|
|
15195
|
-
|
|
15196
|
-
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
15197
|
-
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
15198
|
-
* observe ring pressure (slot count, byte budget, hit/miss ratio).
|
|
15199
|
-
*/
|
|
15200
|
-
var ShmRingStatsSchema = object({
|
|
15201
|
-
sessionId: string(),
|
|
15202
|
-
slotCount: number().int(),
|
|
15203
|
-
slotByteLength: number().int(),
|
|
15204
|
-
segmentBytes: number().int(),
|
|
15205
|
-
budgetMb: number().int(),
|
|
15206
|
-
framesWritten: number().int(),
|
|
15207
|
-
getFrameHits: number().int(),
|
|
15208
|
-
getFrameMisses: number().int()
|
|
15209
|
-
});
|
|
15210
|
-
method(object({ codec: string() }), boolean()), method(_void(), object({
|
|
15178
|
+
method(_void(), object({
|
|
15211
15179
|
id: string(),
|
|
15212
15180
|
name: string(),
|
|
15213
|
-
isPullMode: boolean().optional(),
|
|
15214
|
-
priority: number().optional(),
|
|
15215
15181
|
hwaccel: string().optional(),
|
|
15216
15182
|
probedBestHwaccel: string().optional()
|
|
15217
|
-
})), method(
|
|
15218
|
-
sessionId: string(),
|
|
15219
|
-
nodeId: string()
|
|
15220
|
-
})), method(object({ sessionId: string() }), _void()), method(object({
|
|
15221
|
-
sessionId: string(),
|
|
15222
|
-
packet: EncodedPacketSchema
|
|
15223
|
-
}), _void()), method(object({
|
|
15224
|
-
sessionId: string(),
|
|
15225
|
-
url: string()
|
|
15226
|
-
}), _void()), method(object({
|
|
15227
|
-
sessionId: string(),
|
|
15228
|
-
maxCount: number().default(1),
|
|
15229
|
-
waitMs: number().optional()
|
|
15230
|
-
}), array(DecodedFrameSchema)), method(object({
|
|
15231
|
-
sessionId: string(),
|
|
15232
|
-
maxCount: number().default(1),
|
|
15233
|
-
waitMs: number().optional()
|
|
15234
|
-
}), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
|
|
15235
|
-
sessionId: string(),
|
|
15236
|
-
config: DecoderSessionConfigSchema.partial()
|
|
15237
|
-
}), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
|
|
15238
|
-
sessionId: string(),
|
|
15239
|
-
codec: string(),
|
|
15240
|
-
outputFormat: string(),
|
|
15241
|
-
createdAtMs: number()
|
|
15242
|
-
})).readonly()), method(_void(), object({ backend: string() }), {
|
|
15183
|
+
})), method(_void(), object({ backend: string() }), {
|
|
15243
15184
|
kind: "mutation",
|
|
15244
15185
|
auth: "admin"
|
|
15245
15186
|
});
|
|
@@ -15295,7 +15236,7 @@ DeviceType.Camera;
|
|
|
15295
15236
|
* This matters here more than anywhere else in the repo, because every provider
|
|
15296
15237
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
15297
15238
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
15298
|
-
* and `http://admin:hunter2@192.168.
|
|
15239
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
15299
15240
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
15300
15241
|
* filling it is the operator's business, not ours.
|
|
15301
15242
|
*
|
|
@@ -17288,6 +17229,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
|
17288
17229
|
kind: "mutation",
|
|
17289
17230
|
auth: "admin"
|
|
17290
17231
|
});
|
|
17232
|
+
var HUB_ADDRESS_ROLES = [
|
|
17233
|
+
"appConnections",
|
|
17234
|
+
"notificationTaps",
|
|
17235
|
+
"internal",
|
|
17236
|
+
"publicEndpoint"
|
|
17237
|
+
];
|
|
17291
17238
|
/**
|
|
17292
17239
|
* Transport bounds for AI capability methods.
|
|
17293
17240
|
*
|
|
@@ -18484,7 +18431,7 @@ method(object({
|
|
|
18484
18431
|
timeoutMs: 6e5
|
|
18485
18432
|
});
|
|
18486
18433
|
method(object({
|
|
18487
|
-
|
|
18434
|
+
targetNodeId: string(),
|
|
18488
18435
|
modelId: string(),
|
|
18489
18436
|
format: _enum(MODEL_FORMATS),
|
|
18490
18437
|
entry: ModelCatalogEntrySchema
|
|
@@ -19890,6 +19837,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
19890
19837
|
"stream-offline",
|
|
19891
19838
|
"node-online",
|
|
19892
19839
|
"node-offline",
|
|
19840
|
+
"node-restarting",
|
|
19841
|
+
"node-updating",
|
|
19893
19842
|
"node-inference-unavailable",
|
|
19894
19843
|
"detection-blind",
|
|
19895
19844
|
"addon-crash-loop",
|
|
@@ -20988,8 +20937,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
20988
20937
|
disabledTargetIds: array(string()).default([])
|
|
20989
20938
|
});
|
|
20990
20939
|
/**
|
|
20991
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
20992
|
-
* still-true state. `
|
|
20940
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
20941
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
20942
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
20993
20943
|
* job is not an open state, and the alarm stays instant.
|
|
20994
20944
|
*/
|
|
20995
20945
|
var NcStateSummarySectionIdSchema = _enum([
|
|
@@ -21001,6 +20951,7 @@ var NcStateSummarySectionIdSchema = _enum([
|
|
|
21001
20951
|
"detection-blind",
|
|
21002
20952
|
"nodes",
|
|
21003
20953
|
"addons",
|
|
20954
|
+
"addon-updates",
|
|
21004
20955
|
"updates"
|
|
21005
20956
|
]);
|
|
21006
20957
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -21481,7 +21432,25 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
21481
21432
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21482
21433
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21483
21434
|
*/
|
|
21484
|
-
schedule: NcScheduleSchema.optional()
|
|
21435
|
+
schedule: NcScheduleSchema.optional(),
|
|
21436
|
+
/**
|
|
21437
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
21438
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
21439
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
21440
|
+
*/
|
|
21441
|
+
notifyDuringEntryDelay: boolean().optional(),
|
|
21442
|
+
/**
|
|
21443
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
21444
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
21445
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
21446
|
+
*/
|
|
21447
|
+
notifySensorRewatched: boolean().optional(),
|
|
21448
|
+
/**
|
|
21449
|
+
* D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
|
|
21450
|
+
* change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
|
|
21451
|
+
* re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
|
|
21452
|
+
*/
|
|
21453
|
+
notifySensorIgnored: boolean().optional()
|
|
21485
21454
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21486
21455
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
21487
21456
|
mode: AlarmArmModeSchema,
|
|
@@ -21490,7 +21459,13 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
21490
21459
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21491
21460
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21492
21461
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21493
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
21462
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
21463
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21464
|
+
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
21465
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21466
|
+
notifySensorRewatched: boolean().nullable().optional(),
|
|
21467
|
+
/** D735: set the switch, or `null` to clear it (back to the default, false). */
|
|
21468
|
+
notifySensorIgnored: boolean().nullable().optional()
|
|
21494
21469
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21495
21470
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
21496
21471
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -22451,45 +22426,25 @@ Object.freeze(Object.fromEntries([{
|
|
|
22451
22426
|
label: "Face recognition model",
|
|
22452
22427
|
defaultModelId: "auraface-r100",
|
|
22453
22428
|
indexName: "the enrolled face gallery",
|
|
22454
|
-
options: [
|
|
22455
|
-
|
|
22456
|
-
|
|
22457
|
-
|
|
22458
|
-
},
|
|
22459
|
-
{
|
|
22460
|
-
id: "arcface-r100",
|
|
22461
|
-
label: "ArcFace (ResNet34)"
|
|
22462
|
-
},
|
|
22463
|
-
{
|
|
22464
|
-
id: "inception-resnet-v1",
|
|
22465
|
-
label: "Inception ResNet V1"
|
|
22466
|
-
}
|
|
22467
|
-
]
|
|
22429
|
+
options: [{
|
|
22430
|
+
id: "auraface-r100",
|
|
22431
|
+
label: "AuraFace R100"
|
|
22432
|
+
}]
|
|
22468
22433
|
}, {
|
|
22469
22434
|
stepId: "clip-embedding",
|
|
22470
22435
|
label: "Semantic search model",
|
|
22471
|
-
defaultModelId: "
|
|
22436
|
+
defaultModelId: "siglip2-b16-224",
|
|
22472
22437
|
indexName: "the object semantic-search index",
|
|
22473
|
-
options: [
|
|
22474
|
-
|
|
22475
|
-
|
|
22476
|
-
|
|
22477
|
-
},
|
|
22478
|
-
{
|
|
22479
|
-
id: "mobileclip-s2",
|
|
22480
|
-
label: "MobileCLIP S2"
|
|
22481
|
-
},
|
|
22482
|
-
{
|
|
22483
|
-
id: "siglip2-b16-224",
|
|
22484
|
-
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
22485
|
-
}
|
|
22486
|
-
]
|
|
22438
|
+
options: [{
|
|
22439
|
+
id: "siglip2-b16-224",
|
|
22440
|
+
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
22441
|
+
}]
|
|
22487
22442
|
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
22488
22443
|
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
22489
22444
|
stepId: "face-embedding",
|
|
22490
22445
|
key: "minLandmarkFaceSize",
|
|
22491
|
-
label: "Min face size
|
|
22492
|
-
description: "
|
|
22446
|
+
label: "Min face size to embed (detection-frame px)",
|
|
22447
|
+
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.",
|
|
22493
22448
|
type: "slider",
|
|
22494
22449
|
min: 0,
|
|
22495
22450
|
max: 64,
|
|
@@ -24409,6 +24364,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
24409
24364
|
timestamp: number()
|
|
24410
24365
|
});
|
|
24411
24366
|
/**
|
|
24367
|
+
* A root model's boxes standing in for one crop-kind step's own inference
|
|
24368
|
+
* (D730) — see `runPipeline.suppliedRoot`.
|
|
24369
|
+
*/
|
|
24370
|
+
var SuppliedRootOutputSchema = object({
|
|
24371
|
+
stepId: string(),
|
|
24372
|
+
/** The root model that drew the boxes — stamped on the result. */
|
|
24373
|
+
modelId: string(),
|
|
24374
|
+
detections: array(object({
|
|
24375
|
+
/** `[x1, y1, x2, y2]` in the pixels of the call's image. */
|
|
24376
|
+
bbox: tuple([
|
|
24377
|
+
number(),
|
|
24378
|
+
number(),
|
|
24379
|
+
number(),
|
|
24380
|
+
number()
|
|
24381
|
+
]),
|
|
24382
|
+
score: number(),
|
|
24383
|
+
/**
|
|
24384
|
+
* Five facial landmarks in the same pixels — a face the step's own
|
|
24385
|
+
* detector already re-found inside a root face box (D730), so its
|
|
24386
|
+
* embedder child aligns it exactly as it aligns any detected face.
|
|
24387
|
+
*/
|
|
24388
|
+
landmarks: array(object({
|
|
24389
|
+
x: number(),
|
|
24390
|
+
y: number()
|
|
24391
|
+
})).optional()
|
|
24392
|
+
})).min(1)
|
|
24393
|
+
});
|
|
24394
|
+
/**
|
|
24412
24395
|
* Reference to the frame's retained NATIVE surface + the parent crop's placement
|
|
24413
24396
|
* within the frame, so the executor can re-cut a leaf child ROI at native
|
|
24414
24397
|
* resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
|
|
@@ -24456,7 +24439,7 @@ var FrameRefSchema = object({
|
|
|
24456
24439
|
timestamp: number(),
|
|
24457
24440
|
capturedAt: number().optional()
|
|
24458
24441
|
});
|
|
24459
|
-
var ModelFormatSchema$
|
|
24442
|
+
var ModelFormatSchema$2 = _enum([
|
|
24460
24443
|
"onnx",
|
|
24461
24444
|
"coreml",
|
|
24462
24445
|
"openvino",
|
|
@@ -24474,7 +24457,7 @@ var PipelineSlotSchema = _enum([
|
|
|
24474
24457
|
var PipelineEngineChoiceSchema = object({
|
|
24475
24458
|
runtime: literal("python"),
|
|
24476
24459
|
backend: string(),
|
|
24477
|
-
format: ModelFormatSchema$
|
|
24460
|
+
format: ModelFormatSchema$2,
|
|
24478
24461
|
device: string().optional()
|
|
24479
24462
|
});
|
|
24480
24463
|
/**
|
|
@@ -24513,32 +24496,15 @@ var PipelineDefaultStepSchema = lazy(() => object({
|
|
|
24513
24496
|
group: string().optional(),
|
|
24514
24497
|
settings: record(string(), unknown()).optional()
|
|
24515
24498
|
}));
|
|
24516
|
-
var PipelineTemplateStepSchema = lazy(() => object({
|
|
24517
|
-
addonId: string(),
|
|
24518
|
-
enabled: boolean(),
|
|
24519
|
-
modelId: string(),
|
|
24520
|
-
children: array(PipelineTemplateStepSchema).readonly(),
|
|
24521
|
-
settings: record(string(), unknown()).optional()
|
|
24522
|
-
}));
|
|
24523
|
-
var PipelineTemplateSchema$1 = object({
|
|
24524
|
-
id: string(),
|
|
24525
|
-
name: string(),
|
|
24526
|
-
createdAt: string(),
|
|
24527
|
-
updatedAt: string(),
|
|
24528
|
-
engine: PipelineEngineChoiceSchema,
|
|
24529
|
-
steps: array(PipelineTemplateStepSchema).readonly()
|
|
24530
|
-
});
|
|
24531
24499
|
var PipelineModelOptionSchema = object({
|
|
24532
24500
|
id: string(),
|
|
24533
24501
|
name: string(),
|
|
24534
|
-
formats: record(string(),
|
|
24535
|
-
downloaded: boolean(),
|
|
24536
|
-
sizeMB: number()
|
|
24537
|
-
})),
|
|
24502
|
+
formats: record(string(), PipelineModelFormatStatusSchema),
|
|
24538
24503
|
group: ModelVariantGroupSchema.optional(),
|
|
24539
24504
|
legacy: boolean().optional(),
|
|
24540
24505
|
provider: ModelProviderIdSchema.optional(),
|
|
24541
|
-
defaultConfidence: number().optional()
|
|
24506
|
+
defaultConfidence: number().optional(),
|
|
24507
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional()
|
|
24542
24508
|
});
|
|
24543
24509
|
var ConfigFieldBridge = custom();
|
|
24544
24510
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -24700,6 +24666,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
24700
24666
|
}), {
|
|
24701
24667
|
kind: "mutation",
|
|
24702
24668
|
auth: "admin"
|
|
24669
|
+
}), method(object({
|
|
24670
|
+
nodeId: string(),
|
|
24671
|
+
deviceIds: array(number()).readonly().optional(),
|
|
24672
|
+
dryRun: boolean()
|
|
24673
|
+
}), object({
|
|
24674
|
+
entries: array(object({
|
|
24675
|
+
deviceId: number(),
|
|
24676
|
+
keys: array(string()).readonly()
|
|
24677
|
+
})).readonly(),
|
|
24678
|
+
refused: array(object({
|
|
24679
|
+
deviceId: number(),
|
|
24680
|
+
reason: string()
|
|
24681
|
+
})).readonly()
|
|
24682
|
+
}), {
|
|
24683
|
+
kind: "mutation",
|
|
24684
|
+
auth: "admin"
|
|
24703
24685
|
}), method(object({ nodeId: string() }), object({ unhealthy: array(object({
|
|
24704
24686
|
/** `<backend>:<device>`, e.g. `openvino:gpu`. */
|
|
24705
24687
|
deviceKey: string(),
|
|
@@ -24725,22 +24707,14 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
24725
24707
|
}), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({
|
|
24726
24708
|
steps: array(PipelineStepInputSchema),
|
|
24727
24709
|
deviceKey: string().optional()
|
|
24728
|
-
}), PipelineValidationResultSchema), method(_void(),
|
|
24729
|
-
name: string(),
|
|
24730
|
-
steps: array(PipelineTemplateStepSchema).readonly(),
|
|
24731
|
-
engine: PipelineEngineChoiceSchema
|
|
24732
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({
|
|
24733
|
-
id: string(),
|
|
24734
|
-
name: string().optional(),
|
|
24735
|
-
steps: array(PipelineTemplateStepSchema).readonly().optional()
|
|
24736
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
24710
|
+
}), PipelineValidationResultSchema), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
24737
24711
|
addonId: string(),
|
|
24738
24712
|
modelId: string(),
|
|
24739
|
-
format: ModelFormatSchema$
|
|
24713
|
+
format: ModelFormatSchema$2
|
|
24740
24714
|
}), DownloadModelResultSchema, { kind: "mutation" }), method(object({
|
|
24741
24715
|
addonId: string(),
|
|
24742
24716
|
modelId: string(),
|
|
24743
|
-
format: ModelFormatSchema$
|
|
24717
|
+
format: ModelFormatSchema$2
|
|
24744
24718
|
}), object({ success: literal(true) }), { kind: "mutation" }), method(object({
|
|
24745
24719
|
steps: array(PipelineStepInputSchema).min(1),
|
|
24746
24720
|
frame: FrameInputSchema.optional(),
|
|
@@ -24806,7 +24780,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
24806
24780
|
* `device-not-servable`), and nothing reaches the camera's live
|
|
24807
24781
|
* trace stream. Absent ⇒ unchanged behaviour.
|
|
24808
24782
|
*/
|
|
24809
|
-
replay: literal(true).optional()
|
|
24783
|
+
replay: literal(true).optional(),
|
|
24784
|
+
/**
|
|
24785
|
+
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
24786
|
+
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
24787
|
+
* step (a Frigate+ `license_plate` for `plate-detection`): the step is
|
|
24788
|
+
* NOT inferred, these boxes are its output, and its children (the plate
|
|
24789
|
+
* reader) run on them through their own crop policy. Boxes are in the
|
|
24790
|
+
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
24791
|
+
*/
|
|
24792
|
+
suppliedRoot: SuppliedRootOutputSchema.optional()
|
|
24810
24793
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
24811
24794
|
steps: array(PipelineStepInputSchema).min(1),
|
|
24812
24795
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
@@ -24888,6 +24871,375 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
24888
24871
|
filename: string().optional(),
|
|
24889
24872
|
settings: record(string(), unknown()).optional()
|
|
24890
24873
|
}), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
|
|
24874
|
+
/**
|
|
24875
|
+
* The wire shapes of the Auto tune plan and apply (D745), used by the
|
|
24876
|
+
* `pipeline-orchestrator` cap. The recommender's own types
|
|
24877
|
+
* (`recommend.ts`) are the TS face of the same data; these
|
|
24878
|
+
* schemas are what crosses the cap boundary.
|
|
24879
|
+
*/
|
|
24880
|
+
var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
|
|
24881
|
+
/** The operator's range for it. */
|
|
24882
|
+
var MIN_SESSIONS_PER_DEVICE_RANGE = {
|
|
24883
|
+
min: 1,
|
|
24884
|
+
max: 8
|
|
24885
|
+
};
|
|
24886
|
+
var HardwareClassIdSchema = _enum([
|
|
24887
|
+
"intel-core-ultra",
|
|
24888
|
+
"intel-n-series",
|
|
24889
|
+
"apple-m-base",
|
|
24890
|
+
"apple-m-pro",
|
|
24891
|
+
"unknown"
|
|
24892
|
+
]);
|
|
24893
|
+
var AcceleratorKindSchema = _enum([
|
|
24894
|
+
"intel-npu",
|
|
24895
|
+
"intel-igpu",
|
|
24896
|
+
"x86-cpu",
|
|
24897
|
+
"arm-cpu",
|
|
24898
|
+
"apple-ane",
|
|
24899
|
+
"coral"
|
|
24900
|
+
]);
|
|
24901
|
+
var RecommendationReasonSchema = discriminatedUnion("kind", [
|
|
24902
|
+
object({
|
|
24903
|
+
kind: literal("capacity"),
|
|
24904
|
+
sessions: number(),
|
|
24905
|
+
minSessions: number()
|
|
24906
|
+
}),
|
|
24907
|
+
object({
|
|
24908
|
+
kind: literal("tie-faster"),
|
|
24909
|
+
over: string(),
|
|
24910
|
+
recallDelta: number()
|
|
24911
|
+
}),
|
|
24912
|
+
object({
|
|
24913
|
+
kind: literal("stepped-down"),
|
|
24914
|
+
from: string(),
|
|
24915
|
+
to: string(),
|
|
24916
|
+
limitedBy: string()
|
|
24917
|
+
}),
|
|
24918
|
+
object({
|
|
24919
|
+
kind: literal("no-fit-lightest"),
|
|
24920
|
+
sessions: number(),
|
|
24921
|
+
minSessions: number()
|
|
24922
|
+
}),
|
|
24923
|
+
object({
|
|
24924
|
+
kind: literal("derived-latency"),
|
|
24925
|
+
modelId: string()
|
|
24926
|
+
}),
|
|
24927
|
+
object({ kind: literal("cpu-device") }),
|
|
24928
|
+
object({ kind: literal("coral-untouched") }),
|
|
24929
|
+
object({ kind: literal("device-disabled") }),
|
|
24930
|
+
object({ kind: literal("device-unavailable") }),
|
|
24931
|
+
object({ kind: literal("node-offline") }),
|
|
24932
|
+
object({ kind: literal("no-hardware-facts") }),
|
|
24933
|
+
object({
|
|
24934
|
+
kind: literal("no-measured-data"),
|
|
24935
|
+
hardwareClass: HardwareClassIdSchema
|
|
24936
|
+
}),
|
|
24937
|
+
object({
|
|
24938
|
+
kind: literal("no-family-build"),
|
|
24939
|
+
format: ModelFormatSchema$1
|
|
24940
|
+
})
|
|
24941
|
+
]);
|
|
24942
|
+
var DeviceModelChoiceSchema = object({
|
|
24943
|
+
modelId: string(),
|
|
24944
|
+
p50Ms: number(),
|
|
24945
|
+
fps: number(),
|
|
24946
|
+
measured: boolean(),
|
|
24947
|
+
/** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
|
|
24948
|
+
capacitySessions: number(),
|
|
24949
|
+
personRecall: number()
|
|
24950
|
+
});
|
|
24951
|
+
var DeviceRecommendationSchema = object({
|
|
24952
|
+
deviceKey: string(),
|
|
24953
|
+
accelerator: AcceleratorKindSchema.nullable(),
|
|
24954
|
+
enabled: boolean(),
|
|
24955
|
+
available: boolean(),
|
|
24956
|
+
chosen: DeviceModelChoiceSchema.nullable(),
|
|
24957
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
24958
|
+
});
|
|
24959
|
+
var NodeRecommendationSchema = object({
|
|
24960
|
+
nodeId: string(),
|
|
24961
|
+
reachable: boolean(),
|
|
24962
|
+
hardwareClass: HardwareClassIdSchema.nullable(),
|
|
24963
|
+
cpuModel: string().nullable(),
|
|
24964
|
+
skipped: boolean(),
|
|
24965
|
+
acceleratorModelId: string().nullable(),
|
|
24966
|
+
devices: array(DeviceRecommendationSchema).readonly(),
|
|
24967
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
24968
|
+
});
|
|
24969
|
+
var ModelPinChangeSchema = object({
|
|
24970
|
+
stepId: string(),
|
|
24971
|
+
before: string().nullable(),
|
|
24972
|
+
after: string().nullable()
|
|
24973
|
+
});
|
|
24974
|
+
var NodeDeviceChangeSchema = object({
|
|
24975
|
+
nodeId: string(),
|
|
24976
|
+
deviceKey: string(),
|
|
24977
|
+
madeExplicit: boolean(),
|
|
24978
|
+
modelPins: array(ModelPinChangeSchema).readonly(),
|
|
24979
|
+
thresholds: array(object({
|
|
24980
|
+
stepId: string(),
|
|
24981
|
+
keys: array(string()).readonly()
|
|
24982
|
+
})).readonly()
|
|
24983
|
+
});
|
|
24984
|
+
var CameraOverrideClearSchema = object({
|
|
24985
|
+
deviceId: number(),
|
|
24986
|
+
source: _enum(["step-override", "wholesale"]),
|
|
24987
|
+
nodeId: string(),
|
|
24988
|
+
deviceKey: string().nullable(),
|
|
24989
|
+
stepId: string(),
|
|
24990
|
+
modelIdBefore: string().nullable(),
|
|
24991
|
+
keys: array(string()).readonly()
|
|
24992
|
+
});
|
|
24993
|
+
var DetectorStoreClearSchema = object({
|
|
24994
|
+
deviceId: number(),
|
|
24995
|
+
keys: array(string()).readonly()
|
|
24996
|
+
});
|
|
24997
|
+
var AutoTuneWarningSchema = discriminatedUnion("kind", [
|
|
24998
|
+
object({
|
|
24999
|
+
kind: literal("detector-store-cluster-wide"),
|
|
25000
|
+
skippedNodes: array(string()).readonly()
|
|
25001
|
+
}),
|
|
25002
|
+
object({
|
|
25003
|
+
kind: literal("detector-store-unreadable"),
|
|
25004
|
+
error: string()
|
|
25005
|
+
}),
|
|
25006
|
+
object({
|
|
25007
|
+
kind: literal("coral-enabled"),
|
|
25008
|
+
nodeId: string(),
|
|
25009
|
+
deviceKey: string()
|
|
25010
|
+
})
|
|
25011
|
+
]);
|
|
25012
|
+
var AutoTuneOptionsSchema = object({
|
|
25013
|
+
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
25014
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
25015
|
+
/**
|
|
25016
|
+
* The least number of parallel sessions every device must sustain at the
|
|
25017
|
+
* camera rate with the headroom kept free (D755). The most accurate model
|
|
25018
|
+
* that reaches it wins.
|
|
25019
|
+
*/
|
|
25020
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
25021
|
+
});
|
|
25022
|
+
var AutoTunePlanSchema = object({
|
|
25023
|
+
/** Hash of everything the apply will write — the apply refuses a different one. */
|
|
25024
|
+
planHash: string(),
|
|
25025
|
+
family: literal("yolov9"),
|
|
25026
|
+
headroom: number(),
|
|
25027
|
+
minSessionsPerDevice: number(),
|
|
25028
|
+
/** The detection rate a session is counted at (the fastest camera running the pipeline root). */
|
|
25029
|
+
cameraFps: number(),
|
|
25030
|
+
generatedAt: number(),
|
|
25031
|
+
nodes: array(NodeRecommendationSchema).readonly(),
|
|
25032
|
+
nodeChanges: array(NodeDeviceChangeSchema).readonly(),
|
|
25033
|
+
cameraClears: array(CameraOverrideClearSchema).readonly(),
|
|
25034
|
+
detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
|
|
25035
|
+
warnings: array(AutoTuneWarningSchema).readonly()
|
|
25036
|
+
});
|
|
25037
|
+
var AutoTuneApplyInputSchema = object({
|
|
25038
|
+
planHash: string(),
|
|
25039
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
25040
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
25041
|
+
});
|
|
25042
|
+
var AutoTunePhaseResultSchema = object({
|
|
25043
|
+
phase: _enum([
|
|
25044
|
+
"download",
|
|
25045
|
+
"camera-overrides",
|
|
25046
|
+
"detector-thresholds",
|
|
25047
|
+
"node-models",
|
|
25048
|
+
"redispatch"
|
|
25049
|
+
]),
|
|
25050
|
+
ok: boolean(),
|
|
25051
|
+
detail: string()
|
|
25052
|
+
});
|
|
25053
|
+
var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
|
|
25054
|
+
object({
|
|
25055
|
+
kind: literal("applied"),
|
|
25056
|
+
planHash: string(),
|
|
25057
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
25058
|
+
}),
|
|
25059
|
+
object({
|
|
25060
|
+
kind: literal("aborted"),
|
|
25061
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
25062
|
+
}),
|
|
25063
|
+
object({
|
|
25064
|
+
kind: literal("stale"),
|
|
25065
|
+
plan: AutoTunePlanSchema
|
|
25066
|
+
}),
|
|
25067
|
+
object({
|
|
25068
|
+
kind: literal("refused"),
|
|
25069
|
+
reason: _enum(["apply-in-progress"])
|
|
25070
|
+
})
|
|
25071
|
+
]);
|
|
25072
|
+
/**
|
|
25073
|
+
* Wire shapes of the Load balancing surface (D748): the session placement
|
|
25074
|
+
* policy, the atomic share write, the observed placement statistics, the
|
|
25075
|
+
* hardware share suggestion and the stale device pins.
|
|
25076
|
+
*/
|
|
25077
|
+
/**
|
|
25078
|
+
* How a new detection session picks its node and device.
|
|
25079
|
+
* - `least-loaded` — the historical rule: lowest `attached / weight`, a
|
|
25080
|
+
* constant node order at a tie (D37). An idle node always ties at 0, so a
|
|
25081
|
+
* weight only bites once a node already holds a session.
|
|
25082
|
+
* - `share` — the share of PARALLEL sessions is held to the weights, and a
|
|
25083
|
+
* full or drowning node yields to a free one (D748).
|
|
25084
|
+
*/
|
|
25085
|
+
var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
|
|
25086
|
+
var LoadBalancingSharesInputSchema = object({
|
|
25087
|
+
/** nodeId → share (> 0). A node left out keeps its weight. */
|
|
25088
|
+
nodes: record(string(), number().positive()).default({}),
|
|
25089
|
+
/** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
|
|
25090
|
+
devices: record(string(), record(string(), number().positive())).default({})
|
|
25091
|
+
});
|
|
25092
|
+
var PlacementStatsInputSchema = object({
|
|
25093
|
+
/** Window the observed shares are averaged over (default 1 h, max 24 h). */
|
|
25094
|
+
windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
|
|
25095
|
+
var PlacementDeviceStatsSchema = object({
|
|
25096
|
+
deviceKey: string(),
|
|
25097
|
+
/** Sessions running on this device now. */
|
|
25098
|
+
sessionsNow: number(),
|
|
25099
|
+
/** Sessions started on this device inside the window. */
|
|
25100
|
+
sessionsStarted: number(),
|
|
25101
|
+
/** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
|
|
25102
|
+
observedShare: number().nullable()
|
|
25103
|
+
});
|
|
25104
|
+
var PlacementNodeStatsSchema = object({
|
|
25105
|
+
nodeId: string(),
|
|
25106
|
+
sessionsNow: number(),
|
|
25107
|
+
sessionsStarted: number(),
|
|
25108
|
+
/** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
|
|
25109
|
+
observedShare: number().nullable(),
|
|
25110
|
+
/** Most sessions this node ran at once inside the window. */
|
|
25111
|
+
peakSessions: number(),
|
|
25112
|
+
/** Sessions a share election handed elsewhere because this node was full or drowning. */
|
|
25113
|
+
yieldsAway: number(),
|
|
25114
|
+
devices: array(PlacementDeviceStatsSchema).readonly()
|
|
25115
|
+
});
|
|
25116
|
+
/** A camera's device pin that the session path cannot honour. */
|
|
25117
|
+
var StaleDevicePinSchema = object({
|
|
25118
|
+
deviceId: number(),
|
|
25119
|
+
deviceKey: string(),
|
|
25120
|
+
/** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
|
|
25121
|
+
reason: _enum(["disabled", "absent"])
|
|
25122
|
+
});
|
|
25123
|
+
var PlacementStatsSchema = object({
|
|
25124
|
+
policy: SessionPlacementPolicySchema,
|
|
25125
|
+
windowMs: number(),
|
|
25126
|
+
/** How much of the window was actually observed (the hub keeps it in memory). */
|
|
25127
|
+
observedForMs: number(),
|
|
25128
|
+
sessionsNow: number(),
|
|
25129
|
+
/** Most parallel sessions across the cluster inside the window. */
|
|
25130
|
+
clusterPeakSessions: number(),
|
|
25131
|
+
nodes: array(PlacementNodeStatsSchema).readonly(),
|
|
25132
|
+
stalePins: array(StaleDevicePinSchema).readonly()
|
|
25133
|
+
});
|
|
25134
|
+
/**
|
|
25135
|
+
* Where an automatic share's capacity comes from (D755).
|
|
25136
|
+
* - `hardware` — the static capacity of each device at its Auto tune model:
|
|
25137
|
+
* the measured latency table for the node's hardware class.
|
|
25138
|
+
* - `benchmark` — the node's own measured capacity (node benchmark results).
|
|
25139
|
+
* A node with no results falls back to `hardware`, and says so.
|
|
25140
|
+
*/
|
|
25141
|
+
var CapacitySourceSchema = _enum(["hardware", "benchmark"]);
|
|
25142
|
+
/** Why a node under the `benchmark` source was sized from hardware instead. */
|
|
25143
|
+
var CapacityFallbackSchema = _enum(["no-benchmark-results", "partial-benchmark-results"]);
|
|
25144
|
+
var SuggestSharesInputSchema = object({
|
|
25145
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
25146
|
+
/** Default `hardware`. */
|
|
25147
|
+
source: CapacitySourceSchema.default("hardware")
|
|
25148
|
+
});
|
|
25149
|
+
var SuggestedDeviceShareSchema = object({
|
|
25150
|
+
deviceKey: string(),
|
|
25151
|
+
/** Share of the node (0–100, rounded). */
|
|
25152
|
+
share: number(),
|
|
25153
|
+
modelId: string().nullable(),
|
|
25154
|
+
/** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
|
|
25155
|
+
fps: number().nullable(),
|
|
25156
|
+
/** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
|
|
25157
|
+
measured: boolean(),
|
|
25158
|
+
/**
|
|
25159
|
+
* Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
|
|
25160
|
+
* or the benchmark's measured max sessions. Never enforced.
|
|
25161
|
+
*/
|
|
25162
|
+
suggestedMaxSessions: number().nullable()
|
|
25163
|
+
});
|
|
25164
|
+
var SuggestedNodeShareSchema = object({
|
|
25165
|
+
nodeId: string(),
|
|
25166
|
+
/** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
|
|
25167
|
+
share: number().nullable(),
|
|
25168
|
+
/** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
|
|
25169
|
+
capacitySessions: number(),
|
|
25170
|
+
devices: array(SuggestedDeviceShareSchema).readonly(),
|
|
25171
|
+
skippedReason: string().nullable(),
|
|
25172
|
+
/** What this node's capacity was read from; null when the node is skipped. */
|
|
25173
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
25174
|
+
/** Set when the `benchmark` source was asked for and this node used `hardware`. */
|
|
25175
|
+
capacityFallback: CapacityFallbackSchema.nullable()
|
|
25176
|
+
});
|
|
25177
|
+
var SuggestSharesResultSchema = object({
|
|
25178
|
+
headroom: number(),
|
|
25179
|
+
/** The source asked for; each node says what it actually used. */
|
|
25180
|
+
source: CapacitySourceSchema,
|
|
25181
|
+
/** Camera detection rate the capacity is counted in (the fastest camera's fps). */
|
|
25182
|
+
cameraFps: number(),
|
|
25183
|
+
/** The Auto tune capacity floor the models were picked at. */
|
|
25184
|
+
minSessionsPerDevice: number(),
|
|
25185
|
+
nodes: array(SuggestedNodeShareSchema).readonly()
|
|
25186
|
+
});
|
|
25187
|
+
/**
|
|
25188
|
+
* Where the node and device shares come from (D750, D755).
|
|
25189
|
+
* - `hardware` (default) — computed by the system from each node's static
|
|
25190
|
+
* capacity (its accelerators at their Auto tune models, from the measured
|
|
25191
|
+
* latency table), recomputed whenever a node or device joins, leaves, is
|
|
25192
|
+
* switched on or off, or changes model. No load input.
|
|
25193
|
+
* - `benchmark` — the same, from each node's measured capacity (node
|
|
25194
|
+
* benchmark results); a node without results falls back to `hardware`.
|
|
25195
|
+
* - `manual` — the operator's stored sliders.
|
|
25196
|
+
* Either way a node or device that cannot take sessions gives its share to
|
|
25197
|
+
* the others in proportion; the stored values are never rewritten for that.
|
|
25198
|
+
*/
|
|
25199
|
+
var ShareSourceSchema = _enum([
|
|
25200
|
+
"hardware",
|
|
25201
|
+
"benchmark",
|
|
25202
|
+
"manual"
|
|
25203
|
+
]);
|
|
25204
|
+
var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
|
|
25205
|
+
object({
|
|
25206
|
+
nodes: record(string(), number()),
|
|
25207
|
+
devices: record(string(), record(string(), number()))
|
|
25208
|
+
});
|
|
25209
|
+
var EffectiveDeviceShareSchema = object({
|
|
25210
|
+
deviceKey: string(),
|
|
25211
|
+
/** Can take sessions now (enabled, available, can run the root). */
|
|
25212
|
+
eligible: boolean(),
|
|
25213
|
+
/** The share the source assigns, as a percentage of the node's devices. */
|
|
25214
|
+
configuredPct: number(),
|
|
25215
|
+
/** The share actually used, after an ineligible device's share went to the others. */
|
|
25216
|
+
effectivePct: number()
|
|
25217
|
+
});
|
|
25218
|
+
var EffectiveNodeShareSchema = object({
|
|
25219
|
+
nodeId: string(),
|
|
25220
|
+
eligible: boolean(),
|
|
25221
|
+
configuredPct: number(),
|
|
25222
|
+
effectivePct: number(),
|
|
25223
|
+
/** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
|
|
25224
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
25225
|
+
/** Automatic `benchmark`: why this node used `hardware` instead. */
|
|
25226
|
+
capacityFallback: CapacityFallbackSchema.nullable(),
|
|
25227
|
+
devices: array(EffectiveDeviceShareSchema).readonly()
|
|
25228
|
+
});
|
|
25229
|
+
var EffectiveSharesSchema = object({
|
|
25230
|
+
source: ShareSourceSchema,
|
|
25231
|
+
policy: SessionPlacementPolicySchema,
|
|
25232
|
+
/** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
|
|
25233
|
+
autoPending: boolean(),
|
|
25234
|
+
/** When the automatic shares were last computed (ms epoch); null = never. */
|
|
25235
|
+
computedAt: number().nullable(),
|
|
25236
|
+
/** What made the system recompute them last. */
|
|
25237
|
+
trigger: string().nullable(),
|
|
25238
|
+
nodes: array(EffectiveNodeShareSchema).readonly(),
|
|
25239
|
+
/** The relative weights the election reads (before eligibility). */
|
|
25240
|
+
nodeWeights: record(string(), number()),
|
|
25241
|
+
deviceWeights: record(string(), record(string(), number()))
|
|
25242
|
+
});
|
|
24891
25243
|
object({
|
|
24892
25244
|
activeCameras: number(),
|
|
24893
25245
|
throttledCameras: number(),
|
|
@@ -25371,6 +25723,22 @@ var MotionSourceEnum = _enum([
|
|
|
25371
25723
|
"device-activity"
|
|
25372
25724
|
]);
|
|
25373
25725
|
/**
|
|
25726
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
25727
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
25728
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
25729
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
25730
|
+
* absent when unknown or when the camera itself triggered.
|
|
25731
|
+
*
|
|
25732
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
25733
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
25734
|
+
* runner never decides anything on it.
|
|
25735
|
+
*/
|
|
25736
|
+
var SessionTriggerSchema = object({
|
|
25737
|
+
source: MotionSourceEnum,
|
|
25738
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
25739
|
+
sensorName: string().optional()
|
|
25740
|
+
});
|
|
25741
|
+
/**
|
|
25374
25742
|
* List of motion sources active on a camera. Empty array is valid:
|
|
25375
25743
|
* "no source" — happens for battery cams without firmware motion when
|
|
25376
25744
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -25622,6 +25990,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
25622
25990
|
*/
|
|
25623
25991
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
25624
25992
|
/**
|
|
25993
|
+
* What opened this attach, on a SESSION attach only (see
|
|
25994
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
25995
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
25996
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
25997
|
+
* runner then names no source on the phase event.
|
|
25998
|
+
*/
|
|
25999
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
26000
|
+
/**
|
|
25625
26001
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
25626
26002
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
25627
26003
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -25781,14 +26157,15 @@ var RunnerLocalLoadSchema = object({
|
|
|
25781
26157
|
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
25782
26158
|
* this runner currently has attached cameras on, so the orchestrator's second
|
|
25783
26159
|
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
25784
|
-
* counts. Empty on single-device / pre-multi-device runners.
|
|
25785
|
-
* per
|
|
26160
|
+
* counts. Empty on single-device / pre-multi-device runners. There is no
|
|
26161
|
+
* per-device queue depth: the inference pool's backlog has no accessor, and
|
|
26162
|
+
* a field that always read 0 was removed rather than shown as a measurement
|
|
26163
|
+
* (D762).
|
|
25786
26164
|
*/
|
|
25787
26165
|
devices: array(object({
|
|
25788
26166
|
deviceKey: string(),
|
|
25789
26167
|
backend: string(),
|
|
25790
|
-
attachedCameras: number()
|
|
25791
|
-
queueDepthTotal: number()
|
|
26168
|
+
attachedCameras: number()
|
|
25792
26169
|
})).default([]),
|
|
25793
26170
|
/** Hardware capability flags reported by this node. */
|
|
25794
26171
|
hardware: object({
|
|
@@ -25924,7 +26301,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
|
|
|
25924
26301
|
*/
|
|
25925
26302
|
cropJpeg: string().optional(),
|
|
25926
26303
|
parent: DetailParentSchema,
|
|
25927
|
-
steps: array(string()).optional()
|
|
26304
|
+
steps: array(string()).optional(),
|
|
26305
|
+
/**
|
|
26306
|
+
* The camera's root model already drew this step's boxes (D730): a
|
|
26307
|
+
* `license_plate` inside the parent vehicle. The named step is NOT
|
|
26308
|
+
* inferred — these FRAME-space boxes are its output — and its
|
|
26309
|
+
* requested children (the plate reader) run on them. Absent ⇒ every
|
|
26310
|
+
* requested step infers as before.
|
|
26311
|
+
*/
|
|
26312
|
+
supplied: object({
|
|
26313
|
+
stepId: string(),
|
|
26314
|
+
modelId: string(),
|
|
26315
|
+
boxes: array(object({
|
|
26316
|
+
bbox: NativeCropBboxSchema,
|
|
26317
|
+
score: number()
|
|
26318
|
+
})).min(1)
|
|
26319
|
+
}).optional()
|
|
25928
26320
|
}), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
|
|
25929
26321
|
/** Catalog step id, e.g. `clip-embedding`. */
|
|
25930
26322
|
stepId: string(),
|
|
@@ -25987,14 +26379,6 @@ var CameraPipelineConfigSchema = object({
|
|
|
25987
26379
|
settings: record(string(), unknown()).readonly().optional()
|
|
25988
26380
|
}).nullable().optional()
|
|
25989
26381
|
});
|
|
25990
|
-
var PipelineTemplateSchema = object({
|
|
25991
|
-
id: string(),
|
|
25992
|
-
name: string(),
|
|
25993
|
-
description: string().optional(),
|
|
25994
|
-
config: CameraPipelineConfigSchema,
|
|
25995
|
-
createdAt: string(),
|
|
25996
|
-
updatedAt: string()
|
|
25997
|
-
});
|
|
25998
26382
|
var DeviceStepConfigSchema = object({
|
|
25999
26383
|
modelId: string().optional(),
|
|
26000
26384
|
settings: record(string(), unknown()).optional(),
|
|
@@ -26068,9 +26452,10 @@ var CameraStepOverridePatchSchema = object({
|
|
|
26068
26452
|
modelId: string().optional(),
|
|
26069
26453
|
settings: record(string(), unknown()).readonly().optional()
|
|
26070
26454
|
});
|
|
26455
|
+
var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
|
|
26071
26456
|
var CameraPipelineSettingsSchema = object({
|
|
26072
|
-
pinnedAgentNodeId: string().optional(),
|
|
26073
26457
|
stepToggles: record(string(), boolean()).optional(),
|
|
26458
|
+
stepSettings: CameraStepSettingsSchema.optional(),
|
|
26074
26459
|
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
26075
26460
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
26076
26461
|
});
|
|
@@ -26103,7 +26488,10 @@ var PipelineAssignmentSchema = object({
|
|
|
26103
26488
|
});
|
|
26104
26489
|
/**
|
|
26105
26490
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
26106
|
-
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
26491
|
+
* Aggregated from each runner's `getLocalLoad` cap call. In the
|
|
26492
|
+
* `getAgentLoad` report, a single-device node's default-pool sessions (no
|
|
26493
|
+
* `deviceKey`) are credited to its one eligible device in `load.devices` —
|
|
26494
|
+
* the default pool IS that device (D745); the balancer's census stays raw.
|
|
26107
26495
|
*/
|
|
26108
26496
|
var AgentLoadSummarySchema = object({
|
|
26109
26497
|
nodeId: string(),
|
|
@@ -26192,26 +26580,27 @@ var CameraBrokerStatusSchema = object({
|
|
|
26192
26580
|
width: number(),
|
|
26193
26581
|
height: number(),
|
|
26194
26582
|
subscribers: number(),
|
|
26195
|
-
|
|
26196
|
-
|
|
26583
|
+
/**
|
|
26584
|
+
* Encoded packets/s the broker receives from the camera. null when the
|
|
26585
|
+
* broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
|
|
26586
|
+
* There is no output rate: decoding runs in the session decode workers, not
|
|
26587
|
+
* in the broker, so the broker's own decoded-frame rate is 0 on every live
|
|
26588
|
+
* camera and is not served (D758).
|
|
26589
|
+
*/
|
|
26590
|
+
inFps: number().nullable()
|
|
26197
26591
|
})).readonly(),
|
|
26198
26592
|
webrtcSessions: number(),
|
|
26199
26593
|
rtspRestream: boolean()
|
|
26200
26594
|
});
|
|
26201
|
-
/**
|
|
26202
|
-
|
|
26203
|
-
|
|
26204
|
-
|
|
26205
|
-
|
|
26206
|
-
|
|
26207
|
-
|
|
26208
|
-
|
|
26209
|
-
var CameraDecoderStatusSchema = object({
|
|
26210
|
-
nodeId: string(),
|
|
26211
|
-
formats: array(string()).readonly(),
|
|
26212
|
-
sessionCount: number(),
|
|
26213
|
-
shm: CameraDecoderShmSchema
|
|
26214
|
-
});
|
|
26595
|
+
/**
|
|
26596
|
+
* Decoder block — WHERE decode runs (co-located with the detection node by
|
|
26597
|
+
* construction); null when the camera has no detection node. It carries no
|
|
26598
|
+
* frame counter: the shared-memory plane whose counters it used to serve is
|
|
26599
|
+
* gone, and those fields read 0 forever. Whether frames actually flow is read
|
|
26600
|
+
* from `detection.actualFps` (frames delivered to and processed by the
|
|
26601
|
+
* detector), never from a counter nothing feeds.
|
|
26602
|
+
*/
|
|
26603
|
+
var CameraDecoderStatusSchema = object({ nodeId: string() });
|
|
26215
26604
|
/** Motion block — null when motion detection is not active for this device. */
|
|
26216
26605
|
var CameraMotionStatusSchema = object({
|
|
26217
26606
|
enabled: boolean(),
|
|
@@ -26568,12 +26957,6 @@ method(object({
|
|
|
26568
26957
|
}), object({ success: literal(true) }), {
|
|
26569
26958
|
kind: "mutation",
|
|
26570
26959
|
auth: "admin"
|
|
26571
|
-
}), method(object({
|
|
26572
|
-
agentNodeId: string(),
|
|
26573
|
-
detectWeight: number().positive().nullable()
|
|
26574
|
-
}), object({ success: literal(true) }), {
|
|
26575
|
-
kind: "mutation",
|
|
26576
|
-
auth: "admin"
|
|
26577
26960
|
}), method(object({
|
|
26578
26961
|
agentNodeId: string(),
|
|
26579
26962
|
detect: boolean().nullable().optional(),
|
|
@@ -26615,6 +26998,15 @@ method(object({
|
|
|
26615
26998
|
}), {
|
|
26616
26999
|
kind: "mutation",
|
|
26617
27000
|
auth: "admin"
|
|
27001
|
+
}), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
|
|
27002
|
+
kind: "mutation",
|
|
27003
|
+
auth: "admin"
|
|
27004
|
+
}), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
|
|
27005
|
+
kind: "mutation",
|
|
27006
|
+
auth: "admin"
|
|
27007
|
+
}), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
|
|
27008
|
+
kind: "mutation",
|
|
27009
|
+
auth: "admin"
|
|
26618
27010
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
26619
27011
|
deviceId: number(),
|
|
26620
27012
|
addonId: string(),
|
|
@@ -26631,6 +27023,13 @@ method(object({
|
|
|
26631
27023
|
}), object({ success: literal(true) }), {
|
|
26632
27024
|
kind: "mutation",
|
|
26633
27025
|
auth: "admin"
|
|
27026
|
+
}), method(object({
|
|
27027
|
+
deviceId: number(),
|
|
27028
|
+
addonId: string(),
|
|
27029
|
+
settings: record(string(), unknown()).nullable()
|
|
27030
|
+
}), object({ success: literal(true) }), {
|
|
27031
|
+
kind: "mutation",
|
|
27032
|
+
auth: "admin"
|
|
26634
27033
|
}), method(object({
|
|
26635
27034
|
deviceId: number(),
|
|
26636
27035
|
agentNodeId: string(),
|
|
@@ -26654,25 +27053,7 @@ method(object({
|
|
|
26654
27053
|
}), method(_void(), DiskReconcileJobSchema, {
|
|
26655
27054
|
kind: "mutation",
|
|
26656
27055
|
auth: "admin"
|
|
26657
|
-
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" })
|
|
26658
|
-
name: string(),
|
|
26659
|
-
description: string().optional(),
|
|
26660
|
-
config: CameraPipelineConfigSchema
|
|
26661
|
-
}), PipelineTemplateSchema, {
|
|
26662
|
-
kind: "mutation",
|
|
26663
|
-
auth: "admin"
|
|
26664
|
-
}), method(object({
|
|
26665
|
-
id: string(),
|
|
26666
|
-
name: string().optional(),
|
|
26667
|
-
description: string().optional(),
|
|
26668
|
-
config: CameraPipelineConfigSchema.optional()
|
|
26669
|
-
}), PipelineTemplateSchema, {
|
|
26670
|
-
kind: "mutation",
|
|
26671
|
-
auth: "admin"
|
|
26672
|
-
}), method(object({ id: string() }), object({ success: literal(true) }), {
|
|
26673
|
-
kind: "mutation",
|
|
26674
|
-
auth: "admin"
|
|
26675
|
-
});
|
|
27056
|
+
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" });
|
|
26676
27057
|
/**
|
|
26677
27058
|
* Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
|
|
26678
27059
|
* `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
|
|
@@ -28921,8 +29302,6 @@ var WebrtcStreamChoiceSchema = object({
|
|
|
28921
29302
|
]).nullable(),
|
|
28922
29303
|
/** Input FPS from the camera (null for adaptive). */
|
|
28923
29304
|
inputFps: number().nullable(),
|
|
28924
|
-
/** Decoded FPS (null for adaptive). */
|
|
28925
|
-
decodeFps: number().nullable(),
|
|
28926
29305
|
/** Bitrate in kbps (null for adaptive). */
|
|
28927
29306
|
bitrateKbps: number().nullable()
|
|
28928
29307
|
});
|
|
@@ -29254,6 +29633,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
29254
29633
|
*/
|
|
29255
29634
|
alive: boolean()
|
|
29256
29635
|
})), method(object({
|
|
29636
|
+
deviceId: number().int().nonnegative(),
|
|
29637
|
+
sessionId: string(),
|
|
29638
|
+
downlinkMbps: number().nonnegative()
|
|
29639
|
+
}), object({
|
|
29640
|
+
outcome: _enum(["switching", "held"]),
|
|
29641
|
+
tier: CamProfileSchema.nullable(),
|
|
29642
|
+
reason: string()
|
|
29643
|
+
}), { kind: "mutation" }), method(object({
|
|
29257
29644
|
deviceId: number().int().nonnegative(),
|
|
29258
29645
|
sessionId: string()
|
|
29259
29646
|
}), WebrtcSessionDebugSchema, { kind: "query" });
|
|
@@ -33018,7 +33405,7 @@ var LocalInterfaceSchema = object({
|
|
|
33018
33405
|
name: string(),
|
|
33019
33406
|
family: _enum(["IPv4", "IPv6"]),
|
|
33020
33407
|
address: string(),
|
|
33021
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
33408
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
33022
33409
|
cidr: string(),
|
|
33023
33410
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
33024
33411
|
netmask: string(),
|
|
@@ -33072,7 +33459,9 @@ var ConnectionEndpointSchema = object({
|
|
|
33072
33459
|
"lan-ipv4",
|
|
33073
33460
|
"lan-ipv6",
|
|
33074
33461
|
"public",
|
|
33075
|
-
"loopback"
|
|
33462
|
+
"loopback",
|
|
33463
|
+
"app-link",
|
|
33464
|
+
"custom"
|
|
33076
33465
|
]),
|
|
33077
33466
|
/**
|
|
33078
33467
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -33141,15 +33530,27 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
33141
33530
|
localPort: AdvertisedLocalPortSchema
|
|
33142
33531
|
});
|
|
33143
33532
|
/**
|
|
33144
|
-
* The
|
|
33145
|
-
*
|
|
33146
|
-
*
|
|
33533
|
+
* The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
|
|
33534
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
33535
|
+
* so the UI can show it either way.
|
|
33147
33536
|
*/
|
|
33148
33537
|
var NotificationEndpointSchema = object({
|
|
33149
33538
|
/** The operator's explicit choice, or null for AUTO. */
|
|
33150
33539
|
baseUrl: string().nullable(),
|
|
33151
|
-
/**
|
|
33152
|
-
|
|
33540
|
+
/**
|
|
33541
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
33542
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
33543
|
+
* answered the public tunnel / mesh here, or null.
|
|
33544
|
+
*/
|
|
33545
|
+
resolved: string().nullable(),
|
|
33546
|
+
/**
|
|
33547
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
33548
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
33549
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
33550
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
33551
|
+
* Absent on a pre-D709 hub.
|
|
33552
|
+
*/
|
|
33553
|
+
appLinkHub: string().nullable()
|
|
33153
33554
|
});
|
|
33154
33555
|
/**
|
|
33155
33556
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -33162,6 +33563,72 @@ var ViewerEndpointsSchema = object({
|
|
|
33162
33563
|
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
33163
33564
|
resolved: array(string()).readonly()
|
|
33164
33565
|
});
|
|
33566
|
+
/**
|
|
33567
|
+
* DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
|
|
33568
|
+
* for addons built against it): `cluster` is the `internal` role, `browser`
|
|
33569
|
+
* the `publicEndpoint` role; `override` is the flagged address.
|
|
33570
|
+
*/
|
|
33571
|
+
var HubAddressSnapshotSchema = object({
|
|
33572
|
+
override: string().nullable(),
|
|
33573
|
+
resolved: string().nullable(),
|
|
33574
|
+
source: _enum([
|
|
33575
|
+
"override",
|
|
33576
|
+
"auto",
|
|
33577
|
+
"none"
|
|
33578
|
+
])
|
|
33579
|
+
});
|
|
33580
|
+
var HubAddressesSchema = object({
|
|
33581
|
+
cluster: HubAddressSnapshotSchema,
|
|
33582
|
+
browser: HubAddressSnapshotSchema
|
|
33583
|
+
});
|
|
33584
|
+
/**
|
|
33585
|
+
* What an address is used for (`hub-address.ts`, D734). `appConnections` is
|
|
33586
|
+
* many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
|
|
33587
|
+
* by at most one address.
|
|
33588
|
+
*/
|
|
33589
|
+
var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
|
|
33590
|
+
var RoleSourceSchema = _enum([
|
|
33591
|
+
"flagged",
|
|
33592
|
+
"auto",
|
|
33593
|
+
"none"
|
|
33594
|
+
]);
|
|
33595
|
+
/** One single-valued role: the flagged address, the one in use, and why. */
|
|
33596
|
+
var HubAddressRoleResolutionSchema = object({
|
|
33597
|
+
/** The address carrying the flag, or null = automatic. */
|
|
33598
|
+
flagged: string().nullable(),
|
|
33599
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
33600
|
+
resolved: string().nullable(),
|
|
33601
|
+
source: RoleSourceSchema
|
|
33602
|
+
});
|
|
33603
|
+
var HubAppConnectionsResolutionSchema = object({
|
|
33604
|
+
/** The addresses flagged `appConnections`, or empty = automatic. */
|
|
33605
|
+
flagged: array(string()).readonly(),
|
|
33606
|
+
/** What the apps race right now. */
|
|
33607
|
+
resolved: array(string()).readonly(),
|
|
33608
|
+
source: RoleSourceSchema
|
|
33609
|
+
});
|
|
33610
|
+
var HubAddressBookSchema = object({
|
|
33611
|
+
rows: array(ConnectionEndpointSchema.extend({
|
|
33612
|
+
/** In the hub's detected palette right now. */
|
|
33613
|
+
detected: boolean(),
|
|
33614
|
+
/** Entered by the operator (removable). */
|
|
33615
|
+
custom: boolean(),
|
|
33616
|
+
/** The roles explicitly flagged on this address. */
|
|
33617
|
+
flags: array(HubAddressRoleSchema).readonly(),
|
|
33618
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
33619
|
+
inUse: array(HubAddressRoleSchema).readonly(),
|
|
33620
|
+
/** The roles this address may be flagged with. */
|
|
33621
|
+
eligible: array(HubAddressRoleSchema).readonly()
|
|
33622
|
+
})).readonly(),
|
|
33623
|
+
roles: object({
|
|
33624
|
+
appConnections: HubAppConnectionsResolutionSchema,
|
|
33625
|
+
notificationTaps: HubAddressRoleResolutionSchema,
|
|
33626
|
+
internal: HubAddressRoleResolutionSchema,
|
|
33627
|
+
publicEndpoint: HubAddressRoleResolutionSchema
|
|
33628
|
+
}),
|
|
33629
|
+
/** The `hub=` an app link carries (D709), or null. */
|
|
33630
|
+
appLinkHub: string().nullable()
|
|
33631
|
+
});
|
|
33165
33632
|
var AllowedAddressesSchema = object({
|
|
33166
33633
|
/**
|
|
33167
33634
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -33203,8 +33670,29 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
33203
33670
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
33204
33671
|
* to avoid mixed-content blocks in the browser. The public
|
|
33205
33672
|
* tunnel always emits `https://` regardless. */
|
|
33206
|
-
scheme: _enum(["http", "https"]).optional()
|
|
33207
|
-
|
|
33673
|
+
scheme: _enum(["http", "https"]).optional(),
|
|
33674
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
33675
|
+
* an address notification taps can be flagged with, not a hub
|
|
33676
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
33677
|
+
includeAppLink: boolean().optional()
|
|
33678
|
+
}), 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({
|
|
33679
|
+
baseUrl: string(),
|
|
33680
|
+
label: string().max(80)
|
|
33681
|
+
}), HubAddressBookSchema, {
|
|
33682
|
+
kind: "mutation",
|
|
33683
|
+
auth: "admin"
|
|
33684
|
+
}), method(object({ baseUrl: string() }), HubAddressBookSchema, {
|
|
33685
|
+
kind: "mutation",
|
|
33686
|
+
auth: "admin"
|
|
33687
|
+
}), method(object({
|
|
33688
|
+
role: HubAddressRoleSchema,
|
|
33689
|
+
baseUrl: string().nullable(),
|
|
33690
|
+
enabled: boolean(),
|
|
33691
|
+
acceptInsecureHttp: boolean().optional()
|
|
33692
|
+
}), HubAddressBookSchema, {
|
|
33693
|
+
kind: "mutation",
|
|
33694
|
+
auth: "admin"
|
|
33695
|
+
}), 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, {
|
|
33208
33696
|
kind: "mutation",
|
|
33209
33697
|
auth: "admin"
|
|
33210
33698
|
}), method(object({
|
|
@@ -33532,7 +34020,7 @@ var MeshPeerSchema = object({
|
|
|
33532
34020
|
tags: array(string()).readonly(),
|
|
33533
34021
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
33534
34022
|
exitNodeOption: boolean(),
|
|
33535
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
34023
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
33536
34024
|
advertisedRoutes: array(string()).readonly(),
|
|
33537
34025
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
33538
34026
|
userLogin: string().nullable(),
|
|
@@ -33662,7 +34150,8 @@ var MotionStatusSchema = object({
|
|
|
33662
34150
|
* writes this slice (not even a boot seed), and neither does the runner's
|
|
33663
34151
|
* phase machine: its phase is "a session is attached" for every on-motion
|
|
33664
34152
|
* session, not motion, and it now has its own `DetectionPhaseTransition`.
|
|
33665
|
-
* A provider's `isDetected`
|
|
34153
|
+
* A provider's `isDetected` and `getStatus` answer from the hub's slice
|
|
34154
|
+
* (`hubMotionNativeProvider`).
|
|
33666
34155
|
* - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
|
|
33667
34156
|
* imports) — the provider pushes both edges itself, from the upstream
|
|
33668
34157
|
* system's own state change. That is the sensor's own fact.
|
|
@@ -34860,7 +35349,13 @@ var OsdStatusSchema = object({ overlays: array(object({
|
|
|
34860
35349
|
*/
|
|
34861
35350
|
availablePositions: array(OsdPositionEnum).readonly(),
|
|
34862
35351
|
/** Firmware does not allow editing the `text` field (e.g. timestamp). */
|
|
34863
|
-
readOnly: boolean().optional()
|
|
35352
|
+
readOnly: boolean().optional(),
|
|
35353
|
+
/**
|
|
35354
|
+
* Firmware text ceiling for this overlay. Absent = no known limit.
|
|
35355
|
+
* The OSD manager truncates here on every write — never stores its own
|
|
35356
|
+
* copy on the binding.
|
|
35357
|
+
*/
|
|
35358
|
+
maxCharacters: number().int().positive().optional()
|
|
34864
35359
|
})).readonly() });
|
|
34865
35360
|
var OsdOverlayPatchSchema = object({
|
|
34866
35361
|
enabled: boolean().optional(),
|
|
@@ -34911,7 +35406,9 @@ var OsdTemplateBindingSchema = object({
|
|
|
34911
35406
|
valuePath: string().min(1).max(64),
|
|
34912
35407
|
/** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
|
|
34913
35408
|
displayUnit: string().max(16).optional(),
|
|
34914
|
-
maxDecimals: number().int().min(0).max(4).default(1)
|
|
35409
|
+
maxDecimals: number().int().min(0).max(4).default(1),
|
|
35410
|
+
/** Raw value → display text (same shape as slot binding). Empty string hides. */
|
|
35411
|
+
valueMap: record(string(), string()).optional()
|
|
34915
35412
|
});
|
|
34916
35413
|
/**
|
|
34917
35414
|
* A named template: bindings (alias → leaf field) + a parser that
|
|
@@ -34961,18 +35458,11 @@ var OsdSlotBindingSchema = object({
|
|
|
34961
35458
|
source: OsdSourceSchema,
|
|
34962
35459
|
/** `${value}` and `${unit}` are substituted; every occurrence. */
|
|
34963
35460
|
template: string().max(96).default("${value}"),
|
|
34964
|
-
/** Truncate with an ellipsis past this length. Absent = no limit. */
|
|
34965
|
-
maxCharacters: number().int().min(4).max(64).optional(),
|
|
34966
35461
|
/**
|
|
34967
35462
|
* Decimal places for a numeric value. `0` yields an integer — the
|
|
34968
35463
|
* documented workaround for firmwares that reject `.` in overlay text.
|
|
34969
35464
|
*/
|
|
34970
35465
|
maxDecimals: number().int().min(0).max(4).default(1),
|
|
34971
|
-
/**
|
|
34972
|
-
* Appended via `${unit}` when no unit conversion produces a label.
|
|
34973
|
-
* Prefer `source.displayUnit` for converted device-state values.
|
|
34974
|
-
*/
|
|
34975
|
-
unitLabel: string().max(8).optional(),
|
|
34976
35466
|
/** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
|
|
34977
35467
|
valueMap: record(string(), string()).optional(),
|
|
34978
35468
|
/** Time windows in which the slot is shown. Absent = always. */
|
|
@@ -34981,9 +35471,7 @@ var OsdSlotBindingSchema = object({
|
|
|
34981
35471
|
* Display gate, in the notification centre's condition vocabulary.
|
|
34982
35472
|
* Only the keys reported by `getConditionSupport` are accepted.
|
|
34983
35473
|
*/
|
|
34984
|
-
conditions: NcConditionsSchema.optional()
|
|
34985
|
-
/** Rendered when the gate is closed or the value unreadable. Empty = hide. */
|
|
34986
|
-
fallbackText: string().max(64).default("")
|
|
35474
|
+
conditions: NcConditionsSchema.optional()
|
|
34987
35475
|
});
|
|
34988
35476
|
/** One camera slot, as the operator sees it: firmware truth + our binding. */
|
|
34989
35477
|
var OsdSlotViewSchema = object({
|
|
@@ -40210,6 +40698,16 @@ var zoneRulesCapability = {
|
|
|
40210
40698
|
durability: "restored"
|
|
40211
40699
|
};
|
|
40212
40700
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
40701
|
+
Object.freeze({
|
|
40702
|
+
person: .5,
|
|
40703
|
+
vehicle: .5,
|
|
40704
|
+
animal: .5
|
|
40705
|
+
});
|
|
40706
|
+
Object.freeze({
|
|
40707
|
+
person: .65,
|
|
40708
|
+
vehicle: .65,
|
|
40709
|
+
animal: .65
|
|
40710
|
+
});
|
|
40213
40711
|
/**
|
|
40214
40712
|
* Accessory device helpers — shared across drivers.
|
|
40215
40713
|
*
|
|
@@ -43090,90 +43588,18 @@ Object.freeze({
|
|
|
43090
43588
|
addonId: null,
|
|
43091
43589
|
access: "create"
|
|
43092
43590
|
},
|
|
43093
|
-
"decoder.createSession": {
|
|
43094
|
-
capName: "decoder",
|
|
43095
|
-
capScope: "system",
|
|
43096
|
-
addonId: null,
|
|
43097
|
-
access: "view"
|
|
43098
|
-
},
|
|
43099
|
-
"decoder.destroySession": {
|
|
43100
|
-
capName: "decoder",
|
|
43101
|
-
capScope: "system",
|
|
43102
|
-
addonId: null,
|
|
43103
|
-
access: "delete"
|
|
43104
|
-
},
|
|
43105
|
-
"decoder.getFrame": {
|
|
43106
|
-
capName: "decoder",
|
|
43107
|
-
capScope: "system",
|
|
43108
|
-
addonId: null,
|
|
43109
|
-
access: "view"
|
|
43110
|
-
},
|
|
43111
43591
|
"decoder.getInfo": {
|
|
43112
43592
|
capName: "decoder",
|
|
43113
43593
|
capScope: "system",
|
|
43114
43594
|
addonId: null,
|
|
43115
43595
|
access: "view"
|
|
43116
43596
|
},
|
|
43117
|
-
"decoder.getShmStats": {
|
|
43118
|
-
capName: "decoder",
|
|
43119
|
-
capScope: "system",
|
|
43120
|
-
addonId: null,
|
|
43121
|
-
access: "view"
|
|
43122
|
-
},
|
|
43123
|
-
"decoder.getStats": {
|
|
43124
|
-
capName: "decoder",
|
|
43125
|
-
capScope: "system",
|
|
43126
|
-
addonId: null,
|
|
43127
|
-
access: "view"
|
|
43128
|
-
},
|
|
43129
|
-
"decoder.listActiveSessions": {
|
|
43130
|
-
capName: "decoder",
|
|
43131
|
-
capScope: "system",
|
|
43132
|
-
addonId: null,
|
|
43133
|
-
access: "view"
|
|
43134
|
-
},
|
|
43135
|
-
"decoder.openStream": {
|
|
43136
|
-
capName: "decoder",
|
|
43137
|
-
capScope: "system",
|
|
43138
|
-
addonId: null,
|
|
43139
|
-
access: "view"
|
|
43140
|
-
},
|
|
43141
|
-
"decoder.pullFrames": {
|
|
43142
|
-
capName: "decoder",
|
|
43143
|
-
capScope: "system",
|
|
43144
|
-
addonId: null,
|
|
43145
|
-
access: "view"
|
|
43146
|
-
},
|
|
43147
|
-
"decoder.pullHandles": {
|
|
43148
|
-
capName: "decoder",
|
|
43149
|
-
capScope: "system",
|
|
43150
|
-
addonId: null,
|
|
43151
|
-
access: "view"
|
|
43152
|
-
},
|
|
43153
|
-
"decoder.pushPacket": {
|
|
43154
|
-
capName: "decoder",
|
|
43155
|
-
capScope: "system",
|
|
43156
|
-
addonId: null,
|
|
43157
|
-
access: "view"
|
|
43158
|
-
},
|
|
43159
43597
|
"decoder.reprobeHwaccel": {
|
|
43160
43598
|
capName: "decoder",
|
|
43161
43599
|
capScope: "system",
|
|
43162
43600
|
addonId: null,
|
|
43163
43601
|
access: "create"
|
|
43164
43602
|
},
|
|
43165
|
-
"decoder.supportsCodec": {
|
|
43166
|
-
capName: "decoder",
|
|
43167
|
-
capScope: "system",
|
|
43168
|
-
addonId: null,
|
|
43169
|
-
access: "view"
|
|
43170
|
-
},
|
|
43171
|
-
"decoder.updateConfig": {
|
|
43172
|
-
capName: "decoder",
|
|
43173
|
-
capScope: "system",
|
|
43174
|
-
addonId: null,
|
|
43175
|
-
access: "view"
|
|
43176
|
-
},
|
|
43177
43603
|
"detectionPipeline.applyDeviceSettingsPatch": {
|
|
43178
43604
|
capName: "detection-pipeline",
|
|
43179
43605
|
capScope: "device",
|
|
@@ -44662,12 +45088,24 @@ Object.freeze({
|
|
|
44662
45088
|
addonId: null,
|
|
44663
45089
|
access: "view"
|
|
44664
45090
|
},
|
|
45091
|
+
"localNetwork.addCustomAddress": {
|
|
45092
|
+
capName: "local-network",
|
|
45093
|
+
capScope: "system",
|
|
45094
|
+
addonId: null,
|
|
45095
|
+
access: "create"
|
|
45096
|
+
},
|
|
44665
45097
|
"localNetwork.downloadCa": {
|
|
44666
45098
|
capName: "local-network",
|
|
44667
45099
|
capScope: "system",
|
|
44668
45100
|
addonId: null,
|
|
44669
45101
|
access: "view"
|
|
44670
45102
|
},
|
|
45103
|
+
"localNetwork.getAddresses": {
|
|
45104
|
+
capName: "local-network",
|
|
45105
|
+
capScope: "system",
|
|
45106
|
+
addonId: null,
|
|
45107
|
+
access: "view"
|
|
45108
|
+
},
|
|
44671
45109
|
"localNetwork.getAllowedAddresses": {
|
|
44672
45110
|
capName: "local-network",
|
|
44673
45111
|
capScope: "system",
|
|
@@ -44680,6 +45118,12 @@ Object.freeze({
|
|
|
44680
45118
|
addonId: null,
|
|
44681
45119
|
access: "view"
|
|
44682
45120
|
},
|
|
45121
|
+
"localNetwork.getHubAddresses": {
|
|
45122
|
+
capName: "local-network",
|
|
45123
|
+
capScope: "system",
|
|
45124
|
+
addonId: null,
|
|
45125
|
+
access: "view"
|
|
45126
|
+
},
|
|
44683
45127
|
"localNetwork.getNotificationEndpoint": {
|
|
44684
45128
|
capName: "local-network",
|
|
44685
45129
|
capScope: "system",
|
|
@@ -44716,6 +45160,12 @@ Object.freeze({
|
|
|
44716
45160
|
addonId: null,
|
|
44717
45161
|
access: "create"
|
|
44718
45162
|
},
|
|
45163
|
+
"localNetwork.removeCustomAddress": {
|
|
45164
|
+
capName: "local-network",
|
|
45165
|
+
capScope: "system",
|
|
45166
|
+
addonId: null,
|
|
45167
|
+
access: "delete"
|
|
45168
|
+
},
|
|
44719
45169
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
44720
45170
|
capName: "local-network",
|
|
44721
45171
|
capScope: "system",
|
|
@@ -44728,6 +45178,12 @@ Object.freeze({
|
|
|
44728
45178
|
addonId: null,
|
|
44729
45179
|
access: "create"
|
|
44730
45180
|
},
|
|
45181
|
+
"localNetwork.setAddressRole": {
|
|
45182
|
+
capName: "local-network",
|
|
45183
|
+
capScope: "system",
|
|
45184
|
+
addonId: null,
|
|
45185
|
+
access: "create"
|
|
45186
|
+
},
|
|
44731
45187
|
"localNetwork.setAllowedAddresses": {
|
|
44732
45188
|
capName: "local-network",
|
|
44733
45189
|
capScope: "system",
|
|
@@ -46222,13 +46678,13 @@ Object.freeze({
|
|
|
46222
46678
|
addonId: null,
|
|
46223
46679
|
access: "delete"
|
|
46224
46680
|
},
|
|
46225
|
-
"pipelineExecutor.
|
|
46681
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
46226
46682
|
capName: "pipeline-executor",
|
|
46227
46683
|
capScope: "system",
|
|
46228
46684
|
addonId: null,
|
|
46229
46685
|
access: "delete"
|
|
46230
46686
|
},
|
|
46231
|
-
"pipelineExecutor.
|
|
46687
|
+
"pipelineExecutor.deleteModel": {
|
|
46232
46688
|
capName: "pipeline-executor",
|
|
46233
46689
|
capScope: "system",
|
|
46234
46690
|
addonId: null,
|
|
@@ -46372,12 +46828,6 @@ Object.freeze({
|
|
|
46372
46828
|
addonId: null,
|
|
46373
46829
|
access: "view"
|
|
46374
46830
|
},
|
|
46375
|
-
"pipelineExecutor.listTemplates": {
|
|
46376
|
-
capName: "pipeline-executor",
|
|
46377
|
-
capScope: "system",
|
|
46378
|
-
addonId: null,
|
|
46379
|
-
access: "view"
|
|
46380
|
-
},
|
|
46381
46831
|
"pipelineExecutor.rearmInferenceDevice": {
|
|
46382
46832
|
capName: "pipeline-executor",
|
|
46383
46833
|
capScope: "system",
|
|
@@ -46402,12 +46852,6 @@ Object.freeze({
|
|
|
46402
46852
|
addonId: null,
|
|
46403
46853
|
access: "create"
|
|
46404
46854
|
},
|
|
46405
|
-
"pipelineExecutor.saveTemplate": {
|
|
46406
|
-
capName: "pipeline-executor",
|
|
46407
|
-
capScope: "system",
|
|
46408
|
-
addonId: null,
|
|
46409
|
-
access: "create"
|
|
46410
|
-
},
|
|
46411
46855
|
"pipelineExecutor.setVideoPipelineSteps": {
|
|
46412
46856
|
capName: "pipeline-executor",
|
|
46413
46857
|
capScope: "system",
|
|
@@ -46426,41 +46870,35 @@ Object.freeze({
|
|
|
46426
46870
|
addonId: null,
|
|
46427
46871
|
access: "create"
|
|
46428
46872
|
},
|
|
46429
|
-
"pipelineExecutor.updateTemplate": {
|
|
46430
|
-
capName: "pipeline-executor",
|
|
46431
|
-
capScope: "system",
|
|
46432
|
-
addonId: null,
|
|
46433
|
-
access: "create"
|
|
46434
|
-
},
|
|
46435
46873
|
"pipelineExecutor.validatePipeline": {
|
|
46436
46874
|
capName: "pipeline-executor",
|
|
46437
46875
|
capScope: "system",
|
|
46438
46876
|
addonId: null,
|
|
46439
46877
|
access: "view"
|
|
46440
46878
|
},
|
|
46441
|
-
"pipelineOrchestrator.
|
|
46879
|
+
"pipelineOrchestrator.applyAutoTune": {
|
|
46442
46880
|
capName: "pipeline-orchestrator",
|
|
46443
46881
|
capScope: "system",
|
|
46444
46882
|
addonId: null,
|
|
46445
46883
|
access: "create"
|
|
46446
46884
|
},
|
|
46447
|
-
"pipelineOrchestrator.
|
|
46885
|
+
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
46448
46886
|
capName: "pipeline-orchestrator",
|
|
46449
46887
|
capScope: "system",
|
|
46450
46888
|
addonId: null,
|
|
46451
46889
|
access: "create"
|
|
46452
46890
|
},
|
|
46453
|
-
"pipelineOrchestrator.
|
|
46891
|
+
"pipelineOrchestrator.assignAudio": {
|
|
46454
46892
|
capName: "pipeline-orchestrator",
|
|
46455
46893
|
capScope: "system",
|
|
46456
46894
|
addonId: null,
|
|
46457
46895
|
access: "create"
|
|
46458
46896
|
},
|
|
46459
|
-
"pipelineOrchestrator.
|
|
46897
|
+
"pipelineOrchestrator.assignPipeline": {
|
|
46460
46898
|
capName: "pipeline-orchestrator",
|
|
46461
46899
|
capScope: "system",
|
|
46462
46900
|
addonId: null,
|
|
46463
|
-
access: "
|
|
46901
|
+
access: "create"
|
|
46464
46902
|
},
|
|
46465
46903
|
"pipelineOrchestrator.getAgentLoad": {
|
|
46466
46904
|
capName: "pipeline-orchestrator",
|
|
@@ -46552,6 +46990,12 @@ Object.freeze({
|
|
|
46552
46990
|
addonId: null,
|
|
46553
46991
|
access: "view"
|
|
46554
46992
|
},
|
|
46993
|
+
"pipelineOrchestrator.getEffectiveShares": {
|
|
46994
|
+
capName: "pipeline-orchestrator",
|
|
46995
|
+
capScope: "system",
|
|
46996
|
+
addonId: null,
|
|
46997
|
+
access: "view"
|
|
46998
|
+
},
|
|
46555
46999
|
"pipelineOrchestrator.getGlobalMetrics": {
|
|
46556
47000
|
capName: "pipeline-orchestrator",
|
|
46557
47001
|
capScope: "system",
|
|
@@ -46588,19 +47032,19 @@ Object.freeze({
|
|
|
46588
47032
|
addonId: null,
|
|
46589
47033
|
access: "view"
|
|
46590
47034
|
},
|
|
46591
|
-
"pipelineOrchestrator.
|
|
47035
|
+
"pipelineOrchestrator.getPlacementStats": {
|
|
46592
47036
|
capName: "pipeline-orchestrator",
|
|
46593
47037
|
capScope: "system",
|
|
46594
47038
|
addonId: null,
|
|
46595
47039
|
access: "view"
|
|
46596
47040
|
},
|
|
46597
|
-
"pipelineOrchestrator.
|
|
47041
|
+
"pipelineOrchestrator.getReconcileFromDiskStatus": {
|
|
46598
47042
|
capName: "pipeline-orchestrator",
|
|
46599
47043
|
capScope: "system",
|
|
46600
47044
|
addonId: null,
|
|
46601
47045
|
access: "view"
|
|
46602
47046
|
},
|
|
46603
|
-
"pipelineOrchestrator.
|
|
47047
|
+
"pipelineOrchestrator.listAgentSettings": {
|
|
46604
47048
|
capName: "pipeline-orchestrator",
|
|
46605
47049
|
capScope: "system",
|
|
46606
47050
|
addonId: null,
|
|
@@ -46612,6 +47056,12 @@ Object.freeze({
|
|
|
46612
47056
|
addonId: null,
|
|
46613
47057
|
access: "create"
|
|
46614
47058
|
},
|
|
47059
|
+
"pipelineOrchestrator.planAutoTune": {
|
|
47060
|
+
capName: "pipeline-orchestrator",
|
|
47061
|
+
capScope: "system",
|
|
47062
|
+
addonId: null,
|
|
47063
|
+
access: "view"
|
|
47064
|
+
},
|
|
46615
47065
|
"pipelineOrchestrator.rebalance": {
|
|
46616
47066
|
capName: "pipeline-orchestrator",
|
|
46617
47067
|
capScope: "system",
|
|
@@ -46654,12 +47104,6 @@ Object.freeze({
|
|
|
46654
47104
|
addonId: null,
|
|
46655
47105
|
access: "create"
|
|
46656
47106
|
},
|
|
46657
|
-
"pipelineOrchestrator.saveTemplate": {
|
|
46658
|
-
capName: "pipeline-orchestrator",
|
|
46659
|
-
capScope: "system",
|
|
46660
|
-
addonId: null,
|
|
46661
|
-
access: "create"
|
|
46662
|
-
},
|
|
46663
47107
|
"pipelineOrchestrator.setAgentCapabilities": {
|
|
46664
47108
|
capName: "pipeline-orchestrator",
|
|
46665
47109
|
capScope: "system",
|
|
@@ -46672,12 +47116,6 @@ Object.freeze({
|
|
|
46672
47116
|
addonId: null,
|
|
46673
47117
|
access: "create"
|
|
46674
47118
|
},
|
|
46675
|
-
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
46676
|
-
capName: "pipeline-orchestrator",
|
|
46677
|
-
capScope: "system",
|
|
46678
|
-
addonId: null,
|
|
46679
|
-
access: "create"
|
|
46680
|
-
},
|
|
46681
47119
|
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
46682
47120
|
capName: "pipeline-orchestrator",
|
|
46683
47121
|
capScope: "system",
|
|
@@ -46714,6 +47152,12 @@ Object.freeze({
|
|
|
46714
47152
|
addonId: null,
|
|
46715
47153
|
access: "create"
|
|
46716
47154
|
},
|
|
47155
|
+
"pipelineOrchestrator.setCameraStepSettings": {
|
|
47156
|
+
capName: "pipeline-orchestrator",
|
|
47157
|
+
capScope: "system",
|
|
47158
|
+
addonId: null,
|
|
47159
|
+
access: "create"
|
|
47160
|
+
},
|
|
46717
47161
|
"pipelineOrchestrator.setCameraStepToggle": {
|
|
46718
47162
|
capName: "pipeline-orchestrator",
|
|
46719
47163
|
capScope: "system",
|
|
@@ -46732,25 +47176,37 @@ Object.freeze({
|
|
|
46732
47176
|
addonId: null,
|
|
46733
47177
|
access: "create"
|
|
46734
47178
|
},
|
|
47179
|
+
"pipelineOrchestrator.setLoadBalancingShares": {
|
|
47180
|
+
capName: "pipeline-orchestrator",
|
|
47181
|
+
capScope: "system",
|
|
47182
|
+
addonId: null,
|
|
47183
|
+
access: "create"
|
|
47184
|
+
},
|
|
46735
47185
|
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
46736
47186
|
capName: "pipeline-orchestrator",
|
|
46737
47187
|
capScope: "system",
|
|
46738
47188
|
addonId: null,
|
|
46739
47189
|
access: "create"
|
|
46740
47190
|
},
|
|
46741
|
-
"pipelineOrchestrator.
|
|
47191
|
+
"pipelineOrchestrator.setShareSource": {
|
|
46742
47192
|
capName: "pipeline-orchestrator",
|
|
46743
47193
|
capScope: "system",
|
|
46744
47194
|
addonId: null,
|
|
46745
47195
|
access: "create"
|
|
46746
47196
|
},
|
|
46747
|
-
"pipelineOrchestrator.
|
|
47197
|
+
"pipelineOrchestrator.suggestShares": {
|
|
47198
|
+
capName: "pipeline-orchestrator",
|
|
47199
|
+
capScope: "system",
|
|
47200
|
+
addonId: null,
|
|
47201
|
+
access: "view"
|
|
47202
|
+
},
|
|
47203
|
+
"pipelineOrchestrator.unassignAudio": {
|
|
46748
47204
|
capName: "pipeline-orchestrator",
|
|
46749
47205
|
capScope: "system",
|
|
46750
47206
|
addonId: null,
|
|
46751
47207
|
access: "create"
|
|
46752
47208
|
},
|
|
46753
|
-
"pipelineOrchestrator.
|
|
47209
|
+
"pipelineOrchestrator.unassignPipeline": {
|
|
46754
47210
|
capName: "pipeline-orchestrator",
|
|
46755
47211
|
capScope: "system",
|
|
46756
47212
|
addonId: null,
|
|
@@ -48190,12 +48646,6 @@ Object.freeze({
|
|
|
48190
48646
|
addonId: null,
|
|
48191
48647
|
access: "view"
|
|
48192
48648
|
},
|
|
48193
|
-
"streamBroker.pullFrameHandles": {
|
|
48194
|
-
capName: "stream-broker",
|
|
48195
|
-
capScope: "system",
|
|
48196
|
-
addonId: null,
|
|
48197
|
-
access: "view"
|
|
48198
|
-
},
|
|
48199
48649
|
"streamBroker.regenerateRtspToken": {
|
|
48200
48650
|
capName: "stream-broker",
|
|
48201
48651
|
capScope: "system",
|
|
@@ -48262,12 +48712,6 @@ Object.freeze({
|
|
|
48262
48712
|
addonId: null,
|
|
48263
48713
|
access: "create"
|
|
48264
48714
|
},
|
|
48265
|
-
"streamBroker.subscribeFrames": {
|
|
48266
|
-
capName: "stream-broker",
|
|
48267
|
-
capScope: "system",
|
|
48268
|
-
addonId: null,
|
|
48269
|
-
access: "create"
|
|
48270
|
-
},
|
|
48271
48715
|
"streamBroker.unassignProfile": {
|
|
48272
48716
|
capName: "stream-broker",
|
|
48273
48717
|
capScope: "system",
|
|
@@ -48280,12 +48724,6 @@ Object.freeze({
|
|
|
48280
48724
|
addonId: null,
|
|
48281
48725
|
access: "create"
|
|
48282
48726
|
},
|
|
48283
|
-
"streamBroker.unsubscribeFrames": {
|
|
48284
|
-
capName: "stream-broker",
|
|
48285
|
-
capScope: "system",
|
|
48286
|
-
addonId: null,
|
|
48287
|
-
access: "create"
|
|
48288
|
-
},
|
|
48289
48727
|
"streamCatalog.getCatalog": {
|
|
48290
48728
|
capName: "stream-catalog",
|
|
48291
48729
|
capScope: "device",
|
|
@@ -48982,6 +49420,12 @@ Object.freeze({
|
|
|
48982
49420
|
addonId: null,
|
|
48983
49421
|
access: "create"
|
|
48984
49422
|
},
|
|
49423
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
49424
|
+
capName: "webrtc-session",
|
|
49425
|
+
capScope: "device",
|
|
49426
|
+
addonId: null,
|
|
49427
|
+
access: "create"
|
|
49428
|
+
},
|
|
48985
49429
|
"webrtcSession.closeSession": {
|
|
48986
49430
|
capName: "webrtc-session",
|
|
48987
49431
|
capScope: "device",
|
|
@@ -50793,11 +51237,6 @@ Object.freeze({
|
|
|
50793
51237
|
form: "single",
|
|
50794
51238
|
optional: false
|
|
50795
51239
|
}],
|
|
50796
|
-
"decoder.createSession": [{
|
|
50797
|
-
name: "deviceId",
|
|
50798
|
-
form: "single",
|
|
50799
|
-
optional: true
|
|
50800
|
-
}],
|
|
50801
51240
|
"detectionPipeline.applyDeviceSettingsPatch": [{
|
|
50802
51241
|
name: "deviceId",
|
|
50803
51242
|
form: "single",
|
|
@@ -52028,6 +52467,11 @@ Object.freeze({
|
|
|
52028
52467
|
form: "single",
|
|
52029
52468
|
optional: false
|
|
52030
52469
|
}],
|
|
52470
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
52471
|
+
name: "deviceIds",
|
|
52472
|
+
form: "array",
|
|
52473
|
+
optional: true
|
|
52474
|
+
}],
|
|
52031
52475
|
"pipelineExecutor.runPipeline": [{
|
|
52032
52476
|
name: "deviceId",
|
|
52033
52477
|
form: "single",
|
|
@@ -52133,6 +52577,11 @@ Object.freeze({
|
|
|
52133
52577
|
form: "single",
|
|
52134
52578
|
optional: false
|
|
52135
52579
|
}],
|
|
52580
|
+
"pipelineOrchestrator.setCameraStepSettings": [{
|
|
52581
|
+
name: "deviceId",
|
|
52582
|
+
form: "single",
|
|
52583
|
+
optional: false
|
|
52584
|
+
}],
|
|
52136
52585
|
"pipelineOrchestrator.setCameraStepToggle": [{
|
|
52137
52586
|
name: "deviceId",
|
|
52138
52587
|
form: "single",
|
|
@@ -52904,6 +53353,11 @@ Object.freeze({
|
|
|
52904
53353
|
form: "single",
|
|
52905
53354
|
optional: false
|
|
52906
53355
|
}],
|
|
53356
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
53357
|
+
name: "deviceId",
|
|
53358
|
+
form: "single",
|
|
53359
|
+
optional: false
|
|
53360
|
+
}],
|
|
52907
53361
|
"webrtcSession.closeSession": [{
|
|
52908
53362
|
name: "deviceId",
|
|
52909
53363
|
form: "single",
|
|
@@ -53133,6 +53587,8 @@ new Map(Object.entries({
|
|
|
53133
53587
|
"detection-blind": "device-events",
|
|
53134
53588
|
"node-online": "system",
|
|
53135
53589
|
"node-offline": "system",
|
|
53590
|
+
"node-restarting": "system",
|
|
53591
|
+
"node-updating": "system",
|
|
53136
53592
|
"node-inference-unavailable": "system",
|
|
53137
53593
|
"addon-crash-loop": "system",
|
|
53138
53594
|
"addon-update-available": "system",
|
|
@@ -53210,18 +53666,21 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
53210
53666
|
kinds: [
|
|
53211
53667
|
"node-offline",
|
|
53212
53668
|
"node-online",
|
|
53669
|
+
"node-restarting",
|
|
53213
53670
|
"node-inference-unavailable"
|
|
53214
53671
|
]
|
|
53215
53672
|
},
|
|
53216
53673
|
{
|
|
53217
53674
|
id: "addons",
|
|
53218
53675
|
family: "system",
|
|
53219
|
-
label: "Addons",
|
|
53220
|
-
kinds: [
|
|
53221
|
-
|
|
53222
|
-
|
|
53223
|
-
|
|
53224
|
-
|
|
53676
|
+
label: "Addons stopped",
|
|
53677
|
+
kinds: ["addon-crash-loop"]
|
|
53678
|
+
},
|
|
53679
|
+
{
|
|
53680
|
+
id: "addon-updates",
|
|
53681
|
+
family: "system",
|
|
53682
|
+
label: "Addon updates",
|
|
53683
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
53225
53684
|
},
|
|
53226
53685
|
{
|
|
53227
53686
|
id: "updates",
|
|
@@ -53229,6 +53688,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
53229
53688
|
label: "Server & container updates",
|
|
53230
53689
|
kinds: [
|
|
53231
53690
|
"server-update-available",
|
|
53691
|
+
"node-updating",
|
|
53232
53692
|
"server-updated",
|
|
53233
53693
|
"wrapper-update-available"
|
|
53234
53694
|
]
|
|
@@ -53376,18 +53836,21 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53376
53836
|
kinds: [
|
|
53377
53837
|
"node-offline",
|
|
53378
53838
|
"node-online",
|
|
53839
|
+
"node-restarting",
|
|
53379
53840
|
"node-inference-unavailable"
|
|
53380
53841
|
]
|
|
53381
53842
|
},
|
|
53382
53843
|
{
|
|
53383
53844
|
name: "summaryAddons",
|
|
53384
|
-
label: "Summary: addons",
|
|
53385
|
-
example: "
|
|
53386
|
-
kinds: [
|
|
53387
|
-
|
|
53388
|
-
|
|
53389
|
-
|
|
53390
|
-
|
|
53845
|
+
label: "Summary: addons stopped",
|
|
53846
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
53847
|
+
kinds: ["addon-crash-loop"]
|
|
53848
|
+
},
|
|
53849
|
+
{
|
|
53850
|
+
name: "summaryAddonUpdates",
|
|
53851
|
+
label: "Summary: addon updates",
|
|
53852
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
53853
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
53391
53854
|
},
|
|
53392
53855
|
{
|
|
53393
53856
|
name: "summaryUpdates",
|
|
@@ -53395,6 +53858,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53395
53858
|
example: "server 1.2.377 → 1.2.378",
|
|
53396
53859
|
kinds: [
|
|
53397
53860
|
"server-update-available",
|
|
53861
|
+
"node-updating",
|
|
53398
53862
|
"server-updated",
|
|
53399
53863
|
"wrapper-update-available"
|
|
53400
53864
|
]
|
|
@@ -53427,7 +53891,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
53427
53891
|
{
|
|
53428
53892
|
name: "summarySection",
|
|
53429
53893
|
label: "Summary: this section",
|
|
53430
|
-
description: "The section a per-section summary row is about
|
|
53894
|
+
description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
|
|
53431
53895
|
example: "Batterie scariche",
|
|
53432
53896
|
group: "system",
|
|
53433
53897
|
families: ["rule"],
|
|
@@ -53471,6 +53935,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
53471
53935
|
[...RULE_BODY_ONLY],
|
|
53472
53936
|
[...RULE_TEXT],
|
|
53473
53937
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53938
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
53474
53939
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
53475
53940
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
53476
53941
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -53511,6 +53976,8 @@ var STATE_SUMMARY_VARS = [
|
|
|
53511
53976
|
[...RULE_TEXT],
|
|
53512
53977
|
[...RULE_TEXT],
|
|
53513
53978
|
[...RULE_TEXT],
|
|
53979
|
+
[...RULE_TEXT],
|
|
53980
|
+
[...RULE_TEXT],
|
|
53514
53981
|
...STATE_SUMMARY_VARS
|
|
53515
53982
|
];
|
|
53516
53983
|
new Set([
|