@camstack/addon-provider-amcrest 0.2.130 → 0.2.132
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 +1191 -483
- package/dist/addon.mjs +1191 -483
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -34,7 +34,7 @@ let node_stream = require("node:stream");
|
|
|
34
34
|
let node_stream_promises = require("node:stream/promises");
|
|
35
35
|
let node_child_process = require("node:child_process");
|
|
36
36
|
let node_os = require("node:os");
|
|
37
|
-
//#region ../types/dist/event-category-
|
|
37
|
+
//#region ../types/dist/event-category-B_0XEcLF.mjs
|
|
38
38
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
39
39
|
EventCategory["SystemBoot"] = "system.boot";
|
|
40
40
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -535,15 +535,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
535
535
|
EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
|
|
536
536
|
EventCategory["AgentBackupActivated"] = "agent.backup.activated";
|
|
537
537
|
EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
|
|
538
|
-
/**
|
|
539
|
-
* Per-agent hwaccel preference changed (user override set, cleared, or
|
|
540
|
-
* re-probed). Observability event — decoders pull the current pref at
|
|
541
|
-
* `createSession`, so running sessions keep their current backend until
|
|
542
|
-
* they rotate naturally (camera add/remove, stream restart). Future
|
|
543
|
-
* work can wire a listener in stream-broker that force-rotates live
|
|
544
|
-
* sessions; for now this event powers logs + admin-UI toast feedback.
|
|
545
|
-
*/
|
|
546
|
-
EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
|
|
547
538
|
EventCategory["MotionAnalysis"] = "detection.motion-analysis";
|
|
548
539
|
/** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
|
|
549
540
|
EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
|
|
@@ -5414,7 +5405,7 @@ var ZodIssueCode = {
|
|
|
5414
5405
|
var ZodFirstPartyTypeKind;
|
|
5415
5406
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5416
5407
|
//#endregion
|
|
5417
|
-
//#region ../types/dist/sleep-
|
|
5408
|
+
//#region ../types/dist/sleep-B0JG7-_F.mjs
|
|
5418
5409
|
/**
|
|
5419
5410
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5420
5411
|
* window to float samples (D455).
|
|
@@ -6780,32 +6771,12 @@ object({
|
|
|
6780
6771
|
audioCodec: string().optional(),
|
|
6781
6772
|
metadata: record(string(), unknown()).readonly().optional()
|
|
6782
6773
|
});
|
|
6783
|
-
var EncodedPacketSchema = object({
|
|
6784
|
-
type: _enum(["video", "audio"]),
|
|
6785
|
-
data: _instanceof(Uint8Array),
|
|
6786
|
-
pts: number(),
|
|
6787
|
-
dts: number(),
|
|
6788
|
-
keyframe: boolean(),
|
|
6789
|
-
codec: string()
|
|
6790
|
-
});
|
|
6791
|
-
var DecodedFrameSchema = object({
|
|
6792
|
-
data: _instanceof(Uint8Array),
|
|
6793
|
-
width: number(),
|
|
6794
|
-
height: number(),
|
|
6795
|
-
format: _enum([
|
|
6796
|
-
"jpeg",
|
|
6797
|
-
"rgb",
|
|
6798
|
-
"bgr",
|
|
6799
|
-
"yuv420",
|
|
6800
|
-
"gray"
|
|
6801
|
-
]),
|
|
6802
|
-
timestamp: number()
|
|
6803
|
-
});
|
|
6804
6774
|
/**
|
|
6805
6775
|
* Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
|
|
6806
6776
|
* frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
|
|
6807
|
-
* interface in `interfaces/frame-handle.ts` field-for-field so a
|
|
6808
|
-
*
|
|
6777
|
+
* interface in `interfaces/frame-handle.ts` field-for-field so a cap method
|
|
6778
|
+
* (the runner's native-crop and pipeline-executor inputs) can carry handles
|
|
6779
|
+
* over tRPC / Moleculer.
|
|
6809
6780
|
*
|
|
6810
6781
|
* The `satisfies` assertion below pins this schema to the interface: if a
|
|
6811
6782
|
* field is added to / removed from `FrameHandle` without a matching schema
|
|
@@ -6831,50 +6802,6 @@ var FrameHandleSchema = object({
|
|
|
6831
6802
|
slotCount: number().int().positive()
|
|
6832
6803
|
});
|
|
6833
6804
|
/**
|
|
6834
|
-
* Pixel format a frame-handle subscriber can request from the broker
|
|
6835
|
-
* (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
|
|
6836
|
-
* `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
|
|
6837
|
-
* `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
|
|
6838
|
-
* payload, and no decoded-frame consumer requests it over the shm plane.
|
|
6839
|
-
*/
|
|
6840
|
-
var FrameHandleFormatSchema = _enum([
|
|
6841
|
-
"rgb",
|
|
6842
|
-
"bgr",
|
|
6843
|
-
"yuv420",
|
|
6844
|
-
"gray"
|
|
6845
|
-
]);
|
|
6846
|
-
/**
|
|
6847
|
-
* Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
|
|
6848
|
-
* broker for a `FrameHandle` stream of one `format`; the broker maintains one
|
|
6849
|
-
* shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
|
|
6850
|
-
* subscriber (motion) and an `rgb` subscriber (detection) each read the format
|
|
6851
|
-
* they asked for with no broker-side conversion.
|
|
6852
|
-
*/
|
|
6853
|
-
var SubscribeFramesInputSchema = object({
|
|
6854
|
-
brokerId: string(),
|
|
6855
|
-
format: FrameHandleFormatSchema,
|
|
6856
|
-
/**
|
|
6857
|
-
* Optional reader-side cadence hint in frames per second. The broker does
|
|
6858
|
-
* NOT throttle — latest-wins ring reads drop frames implicitly for a slow
|
|
6859
|
-
* consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
|
|
6860
|
-
* the consumer can pace its own `pullFrameHandles` polling.
|
|
6861
|
-
*/
|
|
6862
|
-
maxFps: number().positive().optional(),
|
|
6863
|
-
/** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
|
|
6864
|
-
tag: string().optional()
|
|
6865
|
-
});
|
|
6866
|
-
/**
|
|
6867
|
-
* Result of `stream-broker.subscribeFrames`. The consumer then polls
|
|
6868
|
-
* `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
|
|
6869
|
-
* `FrameHandle` to a `FrameRingReader`.
|
|
6870
|
-
*/
|
|
6871
|
-
var SubscribeFramesResultSchema = object({
|
|
6872
|
-
/** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
|
|
6873
|
-
subscriptionId: string(),
|
|
6874
|
-
/** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
|
|
6875
|
-
maxFps: number().nonnegative()
|
|
6876
|
-
});
|
|
6877
|
-
/**
|
|
6878
6805
|
* Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
|
|
6879
6806
|
* `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
|
|
6880
6807
|
* sample bytes plus the track parameters a consumer needs to interpret them.
|
|
@@ -6882,8 +6809,8 @@ var SubscribeFramesResultSchema = object({
|
|
|
6882
6809
|
* Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
|
|
6883
6810
|
* Float32 PCM), so unlike video frames they ship their bytes INLINE over
|
|
6884
6811
|
* tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
|
|
6885
|
-
* (the wire-serialisable supertype of `Buffer`)
|
|
6886
|
-
*
|
|
6812
|
+
* (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
|
|
6813
|
+
* it.
|
|
6887
6814
|
*/
|
|
6888
6815
|
var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
|
|
6889
6816
|
var DecodedAudioChunkSchema = object({
|
|
@@ -6901,11 +6828,10 @@ var DecodedAudioChunkSchema = object({
|
|
|
6901
6828
|
format: AudioChunkFormatSchema.optional()
|
|
6902
6829
|
});
|
|
6903
6830
|
/**
|
|
6904
|
-
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9).
|
|
6905
|
-
*
|
|
6906
|
-
*
|
|
6907
|
-
*
|
|
6908
|
-
* `pullAudioChunks`.
|
|
6831
|
+
* Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
|
|
6832
|
+
* its bytes inline: a consumer asks the broker for the decoded audio-chunk
|
|
6833
|
+
* stream of one broker; the broker keeps a per-subscription bounded FIFO queue
|
|
6834
|
+
* the consumer drains via `pullAudioChunks`.
|
|
6909
6835
|
*/
|
|
6910
6836
|
var SubscribeAudioChunksInputSchema = object({
|
|
6911
6837
|
brokerId: string(),
|
|
@@ -6936,9 +6862,7 @@ var BrokerStatsSchema = object({
|
|
|
6936
6862
|
"stopped"
|
|
6937
6863
|
]),
|
|
6938
6864
|
inputFps: number(),
|
|
6939
|
-
decodeFps: number(),
|
|
6940
6865
|
encodedSubscribers: number(),
|
|
6941
|
-
decodedSubscribers: number(),
|
|
6942
6866
|
uptimeMs: number(),
|
|
6943
6867
|
bitrateKbps: number(),
|
|
6944
6868
|
idrIntervalMs: number(),
|
|
@@ -6951,14 +6875,6 @@ var BrokerStatsSchema = object({
|
|
|
6951
6875
|
preBufferMs: number(),
|
|
6952
6876
|
preBufferPackets: number(),
|
|
6953
6877
|
/**
|
|
6954
|
-
* Moleculer node id of the decoder provider currently servicing this
|
|
6955
|
-
* stream's decoded subscribers. `null` until the deferred decoder is
|
|
6956
|
-
* created (no decoded clients yet, or codec not detected). Surfaces the
|
|
6957
|
-
* runtime decoder placement so the UI can show "Decoder: <agent>" without
|
|
6958
|
-
* a separate cap call per broker.
|
|
6959
|
-
*/
|
|
6960
|
-
decoderNodeId: string().nullable(),
|
|
6961
|
-
/**
|
|
6962
6878
|
* Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
|
|
6963
6879
|
* when the stream has no audio track or the broker is in cold start.
|
|
6964
6880
|
* `supported = false` means the codec was detected but the local
|
|
@@ -10304,70 +10220,6 @@ var StorageLocationDeclarationSchema = object({
|
|
|
10304
10220
|
"backup"
|
|
10305
10221
|
]).optional()
|
|
10306
10222
|
});
|
|
10307
|
-
var DecoderStatsSchema = object({
|
|
10308
|
-
inputFps: number(),
|
|
10309
|
-
outputFps: number(),
|
|
10310
|
-
avgDecodeTimeMs: number(),
|
|
10311
|
-
droppedFrames: number(),
|
|
10312
|
-
/**
|
|
10313
|
-
* Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
|
|
10314
|
-
* lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
|
|
10315
|
-
* the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
|
|
10316
|
-
* is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
|
|
10317
|
-
*/
|
|
10318
|
-
lagMs: number().optional(),
|
|
10319
|
-
effectiveFps: number().optional(),
|
|
10320
|
-
adaptiveFps: number().optional()
|
|
10321
|
-
});
|
|
10322
|
-
var DecoderSessionConfigSchema = object({
|
|
10323
|
-
codec: string(),
|
|
10324
|
-
maxFps: number().default(0),
|
|
10325
|
-
outputFormat: _enum([
|
|
10326
|
-
"jpeg",
|
|
10327
|
-
"rgb",
|
|
10328
|
-
"bgr",
|
|
10329
|
-
"yuv420",
|
|
10330
|
-
"gray"
|
|
10331
|
-
]).default("jpeg"),
|
|
10332
|
-
scale: number().default(1),
|
|
10333
|
-
width: number().optional(),
|
|
10334
|
-
height: number().optional(),
|
|
10335
|
-
/**
|
|
10336
|
-
* Identifier of the camera this decoder session serves. Optional
|
|
10337
|
-
* because the cap is generic (any caller could request decode), but
|
|
10338
|
-
* stream-broker passes it so decoder logs include `deviceId` for
|
|
10339
|
-
* per-camera filtering when diagnosing failures (e.g. node-av
|
|
10340
|
-
* sendPacket errors on a single hung camera).
|
|
10341
|
-
*/
|
|
10342
|
-
deviceId: number().int().nonnegative().optional(),
|
|
10343
|
-
/**
|
|
10344
|
-
* Free-form tag for log scoping. Stream-broker uses
|
|
10345
|
-
* `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
|
|
10346
|
-
* on every line so `grep tag=broker:5/high` filters one camera
|
|
10347
|
-
* profile cleanly.
|
|
10348
|
-
*/
|
|
10349
|
-
tag: string().optional(),
|
|
10350
|
-
/**
|
|
10351
|
-
* Where the session delivers decoded frames (Phase 5 / D9):
|
|
10352
|
-
*
|
|
10353
|
-
* - `'callback'` (default) — the legacy pixel path: decoded frames are
|
|
10354
|
-
* buffered as `DecodedFrame`s and drained via `pullFrames`.
|
|
10355
|
-
* - `'shm'` — the shared-memory frame plane: decoded frames are written
|
|
10356
|
-
* into an OS shared-memory ring and drained as zero-pixel
|
|
10357
|
-
* `FrameHandle`s via `pullHandles`. A session is one mode or the
|
|
10358
|
-
* other — `pullFrames` returns nothing for an `'shm'` session and
|
|
10359
|
-
* `pullHandles` returns nothing for a `'callback'` session.
|
|
10360
|
-
*/
|
|
10361
|
-
frameSink: _enum(["callback", "shm"]).default("callback"),
|
|
10362
|
-
/**
|
|
10363
|
-
* Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
|
|
10364
|
-
* a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
|
|
10365
|
-
* real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
|
|
10366
|
-
* stream-broker's `streamingDebug` gate — off by default so production logs
|
|
10367
|
-
* stay quiet and the emit path pays zero per-frame cost when disabled.
|
|
10368
|
-
*/
|
|
10369
|
-
debug: boolean().optional()
|
|
10370
|
-
});
|
|
10371
10223
|
/**
|
|
10372
10224
|
* Per-component log CHANNELS — the gate a hot path consults, and the registry
|
|
10373
10225
|
* an addon declares its channels in.
|
|
@@ -10510,6 +10362,26 @@ var ClipSearchStrictnessSchema = _enum([
|
|
|
10510
10362
|
"balanced",
|
|
10511
10363
|
"strict"
|
|
10512
10364
|
]);
|
|
10365
|
+
/** Steps whose effect a root label can BE. */
|
|
10366
|
+
var LABEL_SUPPLY_STEP_IDS = [
|
|
10367
|
+
"animal-classifier",
|
|
10368
|
+
"vehicle-classifier",
|
|
10369
|
+
"package-detection"
|
|
10370
|
+
];
|
|
10371
|
+
/** Steps whose box a root detection can BE. */
|
|
10372
|
+
var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
|
|
10373
|
+
/**
|
|
10374
|
+
* Steps whose per-detection MASK a root detection can carry (D737). The live
|
|
10375
|
+
* mask step is `segmentation` — a frame-plane refiner that runs its own model
|
|
10376
|
+
* once per detection crop. (`instance-segmentation` is a dormant step id that
|
|
10377
|
+
* no camera tree carries.)
|
|
10378
|
+
*/
|
|
10379
|
+
var MASK_SUPPLY_STEP_IDS = ["segmentation"];
|
|
10380
|
+
[
|
|
10381
|
+
...LABEL_SUPPLY_STEP_IDS,
|
|
10382
|
+
...CROP_SUPPLY_STEP_IDS,
|
|
10383
|
+
...MASK_SUPPLY_STEP_IDS
|
|
10384
|
+
];
|
|
10513
10385
|
var MODEL_FORMATS = [
|
|
10514
10386
|
"onnx",
|
|
10515
10387
|
"coreml",
|
|
@@ -10538,7 +10410,53 @@ var ModelFormatEntrySchema = object({
|
|
|
10538
10410
|
/** Multi-file payload (directory members or sibling files). */
|
|
10539
10411
|
files: array(string()).readonly().optional(),
|
|
10540
10412
|
/** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
|
|
10541
|
-
runtimes: array(_enum(["python"])).readonly().optional()
|
|
10413
|
+
runtimes: array(_enum(["python"])).readonly().optional(),
|
|
10414
|
+
/**
|
|
10415
|
+
* Content revision of the artefact, for one hosted OFF the CamStack mirror.
|
|
10416
|
+
* A format on the mirror leaves it unset: its revision (the sha256 of its
|
|
10417
|
+
* weight file) comes from the downloader's generated table, kept in step
|
|
10418
|
+
* with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
|
|
10419
|
+
* node records the revision it downloaded next to the file
|
|
10420
|
+
* (`<file>.revision`); a copy with no record or a different one is stale
|
|
10421
|
+
* unless its weight file hashes to the revision, and a stale copy is
|
|
10422
|
+
* downloaded again, the old one serving until the new one is complete. No
|
|
10423
|
+
* revision at all ⇒ a file on disk is current, whatever it holds (D743).
|
|
10424
|
+
*/
|
|
10425
|
+
revision: string().min(1).optional()
|
|
10426
|
+
});
|
|
10427
|
+
/**
|
|
10428
|
+
* What a node holds for one (model, format) (D746). `current` is a complete
|
|
10429
|
+
* copy at its catalog revision — exactly what `downloaded: true` means.
|
|
10430
|
+
* `stale` is bytes on disk that are not (yet) proven current under D743/D744:
|
|
10431
|
+
* no or a different revision record, or a missing sibling. `missing` is no
|
|
10432
|
+
* copy. `downloaded` alone folds `stale` into "not downloaded", which hid
|
|
10433
|
+
* reclaimable bytes and a copy about to be replaced.
|
|
10434
|
+
*/
|
|
10435
|
+
var ModelOnDiskStateSchema = _enum([
|
|
10436
|
+
"current",
|
|
10437
|
+
"stale",
|
|
10438
|
+
"missing"
|
|
10439
|
+
]);
|
|
10440
|
+
/**
|
|
10441
|
+
* The numeric precision of one format's BUILD (D746) — reported only when the
|
|
10442
|
+
* build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
|
|
10443
|
+
* CamStack Core ML export). Absent means "not stated", never "fp32".
|
|
10444
|
+
*/
|
|
10445
|
+
var ModelFormatPrecisionSchema = _enum([
|
|
10446
|
+
"fp32",
|
|
10447
|
+
"fp16",
|
|
10448
|
+
"int8"
|
|
10449
|
+
]);
|
|
10450
|
+
/**
|
|
10451
|
+
* One format of one model as a node's `pipelineExecutor.getSchema` reports it.
|
|
10452
|
+
* `onDisk` / `precision` are optional for version skew: a runner that predates
|
|
10453
|
+
* them omits them, and a reader falls back to `downloaded`.
|
|
10454
|
+
*/
|
|
10455
|
+
var PipelineModelFormatStatusSchema = object({
|
|
10456
|
+
downloaded: boolean(),
|
|
10457
|
+
sizeMB: number(),
|
|
10458
|
+
onDisk: ModelOnDiskStateSchema.optional(),
|
|
10459
|
+
precision: ModelFormatPrecisionSchema.optional()
|
|
10542
10460
|
});
|
|
10543
10461
|
/**
|
|
10544
10462
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
@@ -10642,6 +10560,46 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
|
|
|
10642
10560
|
/** True when the weights or their data forbid commercial use. */
|
|
10643
10561
|
nonCommercial: boolean().optional()
|
|
10644
10562
|
}));
|
|
10563
|
+
/**
|
|
10564
|
+
* One step a ROOT detector can supply from its own output (D730) — see
|
|
10565
|
+
* `ModelCatalogEntry.suppliesSteps`.
|
|
10566
|
+
*
|
|
10567
|
+
* - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
|
|
10568
|
+
* the root's label to the step's vocabulary; `uncovered` is the vocabulary
|
|
10569
|
+
* the root cannot produce (shown as unavailable, never a blocker).
|
|
10570
|
+
* - `crop`: the root draws the box the step would have found (`license_plate`
|
|
10571
|
+
* for plate-detection, `face` for face-detection). The box becomes a detail
|
|
10572
|
+
* child of the `parentMacro` detection that contains it — never a track.
|
|
10573
|
+
* - `mask`: the root's decode emits an instance mask with every detection (a
|
|
10574
|
+
* YOLO26-seg root, D737) — the `segmentation` step's result, carried on the
|
|
10575
|
+
* detection in the shape that step produces. Derived from the model's
|
|
10576
|
+
* postprocessor on read, never stored by an import.
|
|
10577
|
+
*/
|
|
10578
|
+
var RootStepSupplySchema = discriminatedUnion("kind", [
|
|
10579
|
+
object({
|
|
10580
|
+
kind: literal("label"),
|
|
10581
|
+
stepId: _enum(LABEL_SUPPLY_STEP_IDS),
|
|
10582
|
+
labelToEffect: record(string(), string()),
|
|
10583
|
+
uncovered: array(string()).readonly()
|
|
10584
|
+
}),
|
|
10585
|
+
object({
|
|
10586
|
+
kind: literal("crop"),
|
|
10587
|
+
stepId: _enum(CROP_SUPPLY_STEP_IDS),
|
|
10588
|
+
rootLabels: array(string()).readonly(),
|
|
10589
|
+
parentMacro: _enum(["vehicle", "person"]),
|
|
10590
|
+
childClass: _enum(["plate", "face"]),
|
|
10591
|
+
/**
|
|
10592
|
+
* The root's smaller input side, stamped on read by `rootSuppliesOf` from
|
|
10593
|
+
* the model entry — what a step's `minRootInputPx` gate judges. Never
|
|
10594
|
+
* stored by an import.
|
|
10595
|
+
*/
|
|
10596
|
+
rootInputPx: number().int().positive().optional()
|
|
10597
|
+
}),
|
|
10598
|
+
object({
|
|
10599
|
+
kind: literal("mask"),
|
|
10600
|
+
stepId: _enum(MASK_SUPPLY_STEP_IDS)
|
|
10601
|
+
})
|
|
10602
|
+
]);
|
|
10645
10603
|
var ModelCatalogEntrySchema = object({
|
|
10646
10604
|
id: string(),
|
|
10647
10605
|
name: string(),
|
|
@@ -10707,6 +10665,35 @@ var ModelCatalogEntrySchema = object({
|
|
|
10707
10665
|
*/
|
|
10708
10666
|
defaultConfidence: number().min(0).max(1).optional(),
|
|
10709
10667
|
/**
|
|
10668
|
+
* Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
|
|
10669
|
+
* on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
|
|
10670
|
+
* absent here runs at the step slider's global default. The same row shape
|
|
10671
|
+
* the floor measurement produces (`model-floors.json`: modelId → floors), so
|
|
10672
|
+
* a measured table is copied in as-is. An operator override is bound to the
|
|
10673
|
+
* model it was made for and does not survive a model change (D738). A custom
|
|
10674
|
+
* / imported model may declare it; without it, the global defaults apply.
|
|
10675
|
+
*/
|
|
10676
|
+
defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
|
|
10677
|
+
/**
|
|
10678
|
+
* The inference precision this model's OpenVINO IR needs on an Intel GPU.
|
|
10679
|
+
* Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
|
|
10680
|
+
* that produces invalid output at f16 — measured 2026-10-07 for YOLO26
|
|
10681
|
+
* base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
|
|
10682
|
+
* scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
|
|
10683
|
+
* `PoolModelConfig.gpuInferencePrecision`; the pool sets
|
|
10684
|
+
* INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
|
|
10685
|
+
*/
|
|
10686
|
+
gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
|
|
10687
|
+
/**
|
|
10688
|
+
* ROOT detectors only: per supplied step (`animal-classifier`, …), the
|
|
10689
|
+
* minimum DETECTION score from which this root's own fine label (species,
|
|
10690
|
+
* vehicle type — D736 root supply) is taken (D741). Below it the detection
|
|
10691
|
+
* keeps its macro class without the fine label. `1` = never take it from
|
|
10692
|
+
* this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
|
|
10693
|
+
* `minConfidence` slider, bound to the ROOT model, overrides it.
|
|
10694
|
+
*/
|
|
10695
|
+
suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
|
|
10696
|
+
/**
|
|
10710
10697
|
* When true, the executor produces a landmark-aligned crop (similarity warp
|
|
10711
10698
|
* onto the canonical template) before this step runs, instead of a plain
|
|
10712
10699
|
* axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
|
|
@@ -10768,6 +10755,16 @@ var ModelCatalogEntrySchema = object({
|
|
|
10768
10755
|
*/
|
|
10769
10756
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
10770
10757
|
/**
|
|
10758
|
+
* The pipeline steps this ROOT detector can supply from its own output
|
|
10759
|
+
* (D730): its labels name a step's effect (`deer` for `animal-classifier`)
|
|
10760
|
+
* or draw a step's box (`license_plate` for `plate-detection`). Computed at
|
|
10761
|
+
* import from THIS model's labelmap by `deriveRootSupplies`, never written
|
|
10762
|
+
* by hand and never assumed per family; a row without it is derived on read
|
|
10763
|
+
* (`rootSuppliesOf`). Whether a camera uses it is the step's own
|
|
10764
|
+
* `useRootModel` flag (`resolveRootSupply`).
|
|
10765
|
+
*/
|
|
10766
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
|
|
10767
|
+
/**
|
|
10771
10768
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
10772
10769
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
10773
10770
|
* CLIP image encoder; its absence is what "not a CLIP model" means to the
|
|
@@ -12369,13 +12366,6 @@ var BrokerRtspClientSchema = object({
|
|
|
12369
12366
|
lastRtpAt: number(),
|
|
12370
12367
|
bytesSent: number()
|
|
12371
12368
|
});
|
|
12372
|
-
var BrokerDecodedClientSchema = object({
|
|
12373
|
-
tag: string(),
|
|
12374
|
-
subscribedAt: number(),
|
|
12375
|
-
maxFps: number(),
|
|
12376
|
-
framesDelivered: number(),
|
|
12377
|
-
framesDropped: number()
|
|
12378
|
-
});
|
|
12379
12369
|
var BrokerAudioClientSchema = object({
|
|
12380
12370
|
tag: string(),
|
|
12381
12371
|
subscribedAt: number(),
|
|
@@ -12467,7 +12457,6 @@ var BrokerEncodedClientSchema = object({
|
|
|
12467
12457
|
});
|
|
12468
12458
|
var BrokerClientsSchema = object({
|
|
12469
12459
|
rtsp: array(BrokerRtspClientSchema).readonly(),
|
|
12470
|
-
decoded: array(BrokerDecodedClientSchema).readonly(),
|
|
12471
12460
|
audio: array(BrokerAudioClientSchema).readonly(),
|
|
12472
12461
|
encoded: array(BrokerEncodedClientSchema).readonly(),
|
|
12473
12462
|
pipeClients: number(),
|
|
@@ -12836,11 +12825,7 @@ method(object({
|
|
|
12836
12825
|
auth: "admin"
|
|
12837
12826
|
}), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
|
|
12838
12827
|
brokerId: string(),
|
|
12839
|
-
channel: _enum([
|
|
12840
|
-
"rtsp",
|
|
12841
|
-
"decoded",
|
|
12842
|
-
"audio"
|
|
12843
|
-
]),
|
|
12828
|
+
channel: _enum(["rtsp", "audio"]),
|
|
12844
12829
|
handle: string()
|
|
12845
12830
|
}), object({ killed: boolean() }), {
|
|
12846
12831
|
kind: "mutation",
|
|
@@ -12875,10 +12860,7 @@ method(object({
|
|
|
12875
12860
|
}), method(SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, { kind: "mutation" }), method(object({
|
|
12876
12861
|
subscriptionId: string(),
|
|
12877
12862
|
maxCount: number().int().positive().default(8)
|
|
12878
|
-
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(
|
|
12879
|
-
subscriptionId: string(),
|
|
12880
|
-
maxCount: number().int().positive().default(4)
|
|
12881
|
-
}), array(FrameHandleSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
12863
|
+
}), array(DecodedAudioChunkSchema).readonly()), method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }), method(object({
|
|
12882
12864
|
brokerId: string(),
|
|
12883
12865
|
seconds: number().min(0).max(30)
|
|
12884
12866
|
}), _void(), {
|
|
@@ -14137,54 +14119,12 @@ id: union([string(), number()]) }), {
|
|
|
14137
14119
|
kind: "mutation",
|
|
14138
14120
|
auth: "admin"
|
|
14139
14121
|
});
|
|
14140
|
-
|
|
14141
|
-
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
14142
|
-
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
14143
|
-
* observe ring pressure (slot count, byte budget, hit/miss ratio).
|
|
14144
|
-
*/
|
|
14145
|
-
var ShmRingStatsSchema = object({
|
|
14146
|
-
sessionId: string(),
|
|
14147
|
-
slotCount: number().int(),
|
|
14148
|
-
slotByteLength: number().int(),
|
|
14149
|
-
segmentBytes: number().int(),
|
|
14150
|
-
budgetMb: number().int(),
|
|
14151
|
-
framesWritten: number().int(),
|
|
14152
|
-
getFrameHits: number().int(),
|
|
14153
|
-
getFrameMisses: number().int()
|
|
14154
|
-
});
|
|
14155
|
-
method(object({ codec: string() }), boolean()), method(_void(), object({
|
|
14122
|
+
method(_void(), object({
|
|
14156
14123
|
id: string(),
|
|
14157
14124
|
name: string(),
|
|
14158
|
-
isPullMode: boolean().optional(),
|
|
14159
|
-
priority: number().optional(),
|
|
14160
14125
|
hwaccel: string().optional(),
|
|
14161
14126
|
probedBestHwaccel: string().optional()
|
|
14162
|
-
})), method(
|
|
14163
|
-
sessionId: string(),
|
|
14164
|
-
nodeId: string()
|
|
14165
|
-
})), method(object({ sessionId: string() }), _void()), method(object({
|
|
14166
|
-
sessionId: string(),
|
|
14167
|
-
packet: EncodedPacketSchema
|
|
14168
|
-
}), _void()), method(object({
|
|
14169
|
-
sessionId: string(),
|
|
14170
|
-
url: string()
|
|
14171
|
-
}), _void()), method(object({
|
|
14172
|
-
sessionId: string(),
|
|
14173
|
-
maxCount: number().default(1),
|
|
14174
|
-
waitMs: number().optional()
|
|
14175
|
-
}), array(DecodedFrameSchema)), method(object({
|
|
14176
|
-
sessionId: string(),
|
|
14177
|
-
maxCount: number().default(1),
|
|
14178
|
-
waitMs: number().optional()
|
|
14179
|
-
}), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
|
|
14180
|
-
sessionId: string(),
|
|
14181
|
-
config: DecoderSessionConfigSchema.partial()
|
|
14182
|
-
}), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
|
|
14183
|
-
sessionId: string(),
|
|
14184
|
-
codec: string(),
|
|
14185
|
-
outputFormat: string(),
|
|
14186
|
-
createdAtMs: number()
|
|
14187
|
-
})).readonly()), method(_void(), object({ backend: string() }), {
|
|
14127
|
+
})), method(_void(), object({ backend: string() }), {
|
|
14188
14128
|
kind: "mutation",
|
|
14189
14129
|
auth: "admin"
|
|
14190
14130
|
});
|
|
@@ -15297,6 +15237,10 @@ var DeviceInfoSchema = object({
|
|
|
15297
15237
|
isCamera: boolean(),
|
|
15298
15238
|
/** Current config values — serializable snapshot */
|
|
15299
15239
|
config: record(string(), unknown()),
|
|
15240
|
+
/** Paths inside `config` the device's schema declares secret (D783) —
|
|
15241
|
+
* what the non-admin redaction withholds. Paths, never values. Absent
|
|
15242
|
+
* when the owning runner has not reported them. */
|
|
15243
|
+
secretConfigPaths: array(string()).optional(),
|
|
15300
15244
|
/** Hardware + identity blob (manufacturer / model / firmware / sn /
|
|
15301
15245
|
* uid / mac / …). Populated by drivers; editable via setMetadata. */
|
|
15302
15246
|
metadata: record(string(), unknown()).nullable().optional(),
|
|
@@ -15502,7 +15446,13 @@ var DeviceRegisterPayloadSchema = object({
|
|
|
15502
15446
|
* call (workers re-register on init), so probe-driven updates
|
|
15503
15447
|
* (e.g. PTZ flag flipping after the abilities probe) propagate. */
|
|
15504
15448
|
features: array(string()).optional(),
|
|
15505
|
-
config: record(string(), unknown())
|
|
15449
|
+
config: record(string(), unknown()),
|
|
15450
|
+
/** Config paths the device's own schema DECLARES secret
|
|
15451
|
+
* (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
|
|
15452
|
+
* `connection.password`). Re-published on every register; the non-admin
|
|
15453
|
+
* redaction withholds them at any depth (D783). Optional: an older runner
|
|
15454
|
+
* omits it and the keyword backstop applies. */
|
|
15455
|
+
secretConfigPaths: array(string()).optional()
|
|
15506
15456
|
});
|
|
15507
15457
|
var DeviceRemovePayloadSchema = object({ deviceId: number() });
|
|
15508
15458
|
var DevicePersistConfigPayloadSchema = object({
|
|
@@ -16329,6 +16279,12 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
|
16329
16279
|
kind: "mutation",
|
|
16330
16280
|
auth: "admin"
|
|
16331
16281
|
});
|
|
16282
|
+
var HUB_ADDRESS_ROLES = [
|
|
16283
|
+
"appConnections",
|
|
16284
|
+
"notificationTaps",
|
|
16285
|
+
"internal",
|
|
16286
|
+
"publicEndpoint"
|
|
16287
|
+
];
|
|
16332
16288
|
/**
|
|
16333
16289
|
* Transport bounds for AI capability methods.
|
|
16334
16290
|
*
|
|
@@ -17155,7 +17111,14 @@ var LoginMethodContributionSchema = discriminatedUnion("kind", [
|
|
|
17155
17111
|
icon: string().optional(),
|
|
17156
17112
|
/** Addon-owned HTTP route the button navigates to (GET). */
|
|
17157
17113
|
startUrl: string(),
|
|
17158
|
-
stage: LoginStageEnum
|
|
17114
|
+
stage: LoginStageEnum,
|
|
17115
|
+
/**
|
|
17116
|
+
* The provider names an external identity a signed-in user can link to
|
|
17117
|
+
* their own account (D782): `auth.listLinkableProviders` /
|
|
17118
|
+
* `beginExternalLink` offer exactly the redirect methods that set this,
|
|
17119
|
+
* whatever their id. Absent / false — a login button only (magic-link).
|
|
17120
|
+
*/
|
|
17121
|
+
linkable: boolean().optional()
|
|
17159
17122
|
}),
|
|
17160
17123
|
object({
|
|
17161
17124
|
kind: literal("widget"),
|
|
@@ -18931,6 +18894,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
18931
18894
|
"stream-offline",
|
|
18932
18895
|
"node-online",
|
|
18933
18896
|
"node-offline",
|
|
18897
|
+
"node-restarting",
|
|
18898
|
+
"node-updating",
|
|
18934
18899
|
"node-inference-unavailable",
|
|
18935
18900
|
"detection-blind",
|
|
18936
18901
|
"addon-crash-loop",
|
|
@@ -20536,7 +20501,13 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
20536
20501
|
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
20537
20502
|
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
20538
20503
|
*/
|
|
20539
|
-
notifySensorRewatched: boolean().optional()
|
|
20504
|
+
notifySensorRewatched: boolean().optional(),
|
|
20505
|
+
/**
|
|
20506
|
+
* D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
|
|
20507
|
+
* change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
|
|
20508
|
+
* re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
|
|
20509
|
+
*/
|
|
20510
|
+
notifySensorIgnored: boolean().optional()
|
|
20540
20511
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20541
20512
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20542
20513
|
mode: AlarmArmModeSchema,
|
|
@@ -20549,7 +20520,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
20549
20520
|
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20550
20521
|
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
20551
20522
|
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
20552
|
-
notifySensorRewatched: boolean().nullable().optional()
|
|
20523
|
+
notifySensorRewatched: boolean().nullable().optional(),
|
|
20524
|
+
/** D735: set the switch, or `null` to clear it (back to the default, false). */
|
|
20525
|
+
notifySensorIgnored: boolean().nullable().optional()
|
|
20553
20526
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20554
20527
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20555
20528
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -21527,8 +21500,8 @@ Object.freeze(Object.fromEntries([{
|
|
|
21527
21500
|
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
21528
21501
|
stepId: "face-embedding",
|
|
21529
21502
|
key: "minLandmarkFaceSize",
|
|
21530
|
-
label: "Min face size
|
|
21531
|
-
description: "
|
|
21503
|
+
label: "Min face size to embed (detection-frame px)",
|
|
21504
|
+
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.",
|
|
21532
21505
|
type: "slider",
|
|
21533
21506
|
min: 0,
|
|
21534
21507
|
max: 64,
|
|
@@ -22580,7 +22553,13 @@ var RetrainFrameSchema = object({
|
|
|
22580
22553
|
sizeBytes: number().int(),
|
|
22581
22554
|
width: number().int(),
|
|
22582
22555
|
height: number().int(),
|
|
22583
|
-
copiedAt: number()
|
|
22556
|
+
copiedAt: number(),
|
|
22557
|
+
/** When the CAMERA captured the frame. Absent on a copy taken before D785. */
|
|
22558
|
+
capturedAt: number().optional(),
|
|
22559
|
+
/** The operator's "every subject in this frame is boxed". Detector
|
|
22560
|
+
* evaluation keeps only complete frames: an unboxed subject would count as
|
|
22561
|
+
* a false positive. */
|
|
22562
|
+
complete: boolean()
|
|
22584
22563
|
});
|
|
22585
22564
|
/** Why a copy-on-select could not be honoured — named, never a silent skip. */
|
|
22586
22565
|
var RetrainCopyRefusalSchema = _enum([
|
|
@@ -22601,6 +22580,51 @@ var RetrainFrameListSchema = object({
|
|
|
22601
22580
|
/** What the page pre-selects — the native key frame when one survives. */
|
|
22602
22581
|
autoPickMediaId: number().int().optional()
|
|
22603
22582
|
});
|
|
22583
|
+
/**
|
|
22584
|
+
* Which frames an annotated export carries. Every field narrows; an empty
|
|
22585
|
+
* filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
|
|
22586
|
+
* list owned by whoever trains (the training orchestrator), so `frameIds` is
|
|
22587
|
+
* the primitive a version export uses; `batchId` re-selects what an earlier
|
|
22588
|
+
* export carried (`exportedInBatch`).
|
|
22589
|
+
*/
|
|
22590
|
+
var RetrainExportFilterSchema = object({
|
|
22591
|
+
deviceIds: array(number()).optional(),
|
|
22592
|
+
frameIds: array(string()).max(2e4).optional(),
|
|
22593
|
+
batchId: string().optional(),
|
|
22594
|
+
/** Only frames the operator marked complete (all subjects boxed). */
|
|
22595
|
+
completeOnly: boolean().optional()
|
|
22596
|
+
});
|
|
22597
|
+
/**
|
|
22598
|
+
* `frames`: the full frame copies, boxes in `annotations.json`.
|
|
22599
|
+
* `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
|
|
22600
|
+
* convention — the classifier layout.
|
|
22601
|
+
*/
|
|
22602
|
+
var RetrainExportLayoutSchema = _enum(["frames", "crops"]);
|
|
22603
|
+
/**
|
|
22604
|
+
* Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
|
|
22605
|
+
* the archive, sent chunk by chunk. Covers a presigned PUT and a provider
|
|
22606
|
+
* addon's data-plane upload route alike. Headers are sent verbatim and never
|
|
22607
|
+
* logged.
|
|
22608
|
+
*/
|
|
22609
|
+
var RetrainArchiveTargetSchema = object({
|
|
22610
|
+
kind: literal("http"),
|
|
22611
|
+
method: _enum(["PUT", "POST"]),
|
|
22612
|
+
url: string().url(),
|
|
22613
|
+
headers: record(string(), string()).optional()
|
|
22614
|
+
});
|
|
22615
|
+
var RetrainArchiveResultSchema = object({
|
|
22616
|
+
batchId: string(),
|
|
22617
|
+
frames: number().int(),
|
|
22618
|
+
crops: number().int(),
|
|
22619
|
+
annotations: number().int(),
|
|
22620
|
+
/** Frames planned but not shipped (unreadable copy, path too long). */
|
|
22621
|
+
missing: number().int(),
|
|
22622
|
+
bytes: number().int(),
|
|
22623
|
+
/** sha256 of the exact bytes sent. */
|
|
22624
|
+
sha256: string(),
|
|
22625
|
+
/** The target's HTTP status. */
|
|
22626
|
+
status: number().int()
|
|
22627
|
+
});
|
|
22604
22628
|
/** What the operator asked the assist to look for. */
|
|
22605
22629
|
var RetrainAssistSubjectSchema = discriminatedUnion("kind", [object({
|
|
22606
22630
|
kind: literal("package"),
|
|
@@ -23395,9 +23419,25 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
23395
23419
|
}), RetrainTransitionResultSchema, {
|
|
23396
23420
|
kind: "mutation",
|
|
23397
23421
|
auth: "admin"
|
|
23398
|
-
}), method(
|
|
23422
|
+
}), method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), object({ url: string() }), {
|
|
23399
23423
|
kind: "query",
|
|
23400
23424
|
auth: "admin"
|
|
23425
|
+
}), method(object({
|
|
23426
|
+
deviceId: number(),
|
|
23427
|
+
trackId: string(),
|
|
23428
|
+
frameId: string(),
|
|
23429
|
+
complete: boolean()
|
|
23430
|
+
}), RetrainFrameSchema, {
|
|
23431
|
+
kind: "mutation",
|
|
23432
|
+
auth: "admin"
|
|
23433
|
+
}), method(object({
|
|
23434
|
+
filter: RetrainExportFilterSchema,
|
|
23435
|
+
layout: RetrainExportLayoutSchema,
|
|
23436
|
+
target: RetrainArchiveTargetSchema
|
|
23437
|
+
}), RetrainArchiveResultSchema, {
|
|
23438
|
+
kind: "mutation",
|
|
23439
|
+
auth: "admin",
|
|
23440
|
+
timeoutMs: 60 * 6e4
|
|
23401
23441
|
}), method(object({
|
|
23402
23442
|
/** Which of the three event tables owns the row. */
|
|
23403
23443
|
ownerType: EventOwnerTypeSchema,
|
|
@@ -23448,6 +23488,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
23448
23488
|
timestamp: number()
|
|
23449
23489
|
});
|
|
23450
23490
|
/**
|
|
23491
|
+
* A root model's boxes standing in for one crop-kind step's own inference
|
|
23492
|
+
* (D730) — see `runPipeline.suppliedRoot`.
|
|
23493
|
+
*/
|
|
23494
|
+
var SuppliedRootOutputSchema = object({
|
|
23495
|
+
stepId: string(),
|
|
23496
|
+
/** The root model that drew the boxes — stamped on the result. */
|
|
23497
|
+
modelId: string(),
|
|
23498
|
+
detections: array(object({
|
|
23499
|
+
/** `[x1, y1, x2, y2]` in the pixels of the call's image. */
|
|
23500
|
+
bbox: tuple([
|
|
23501
|
+
number(),
|
|
23502
|
+
number(),
|
|
23503
|
+
number(),
|
|
23504
|
+
number()
|
|
23505
|
+
]),
|
|
23506
|
+
score: number(),
|
|
23507
|
+
/**
|
|
23508
|
+
* Five facial landmarks in the same pixels — a face the step's own
|
|
23509
|
+
* detector already re-found inside a root face box (D730), so its
|
|
23510
|
+
* embedder child aligns it exactly as it aligns any detected face.
|
|
23511
|
+
*/
|
|
23512
|
+
landmarks: array(object({
|
|
23513
|
+
x: number(),
|
|
23514
|
+
y: number()
|
|
23515
|
+
})).optional()
|
|
23516
|
+
})).min(1)
|
|
23517
|
+
});
|
|
23518
|
+
/**
|
|
23451
23519
|
* Reference to the frame's retained NATIVE surface + the parent crop's placement
|
|
23452
23520
|
* within the frame, so the executor can re-cut a leaf child ROI at native
|
|
23453
23521
|
* resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
|
|
@@ -23495,7 +23563,7 @@ var FrameRefSchema = object({
|
|
|
23495
23563
|
timestamp: number(),
|
|
23496
23564
|
capturedAt: number().optional()
|
|
23497
23565
|
});
|
|
23498
|
-
var ModelFormatSchema$
|
|
23566
|
+
var ModelFormatSchema$2 = _enum([
|
|
23499
23567
|
"onnx",
|
|
23500
23568
|
"coreml",
|
|
23501
23569
|
"openvino",
|
|
@@ -23513,7 +23581,7 @@ var PipelineSlotSchema = _enum([
|
|
|
23513
23581
|
var PipelineEngineChoiceSchema = object({
|
|
23514
23582
|
runtime: literal("python"),
|
|
23515
23583
|
backend: string(),
|
|
23516
|
-
format: ModelFormatSchema$
|
|
23584
|
+
format: ModelFormatSchema$2,
|
|
23517
23585
|
device: string().optional()
|
|
23518
23586
|
});
|
|
23519
23587
|
/**
|
|
@@ -23552,32 +23620,15 @@ var PipelineDefaultStepSchema = lazy(() => object({
|
|
|
23552
23620
|
group: string().optional(),
|
|
23553
23621
|
settings: record(string(), unknown()).optional()
|
|
23554
23622
|
}));
|
|
23555
|
-
var PipelineTemplateStepSchema = lazy(() => object({
|
|
23556
|
-
addonId: string(),
|
|
23557
|
-
enabled: boolean(),
|
|
23558
|
-
modelId: string(),
|
|
23559
|
-
children: array(PipelineTemplateStepSchema).readonly(),
|
|
23560
|
-
settings: record(string(), unknown()).optional()
|
|
23561
|
-
}));
|
|
23562
|
-
var PipelineTemplateSchema$1 = object({
|
|
23563
|
-
id: string(),
|
|
23564
|
-
name: string(),
|
|
23565
|
-
createdAt: string(),
|
|
23566
|
-
updatedAt: string(),
|
|
23567
|
-
engine: PipelineEngineChoiceSchema,
|
|
23568
|
-
steps: array(PipelineTemplateStepSchema).readonly()
|
|
23569
|
-
});
|
|
23570
23623
|
var PipelineModelOptionSchema = object({
|
|
23571
23624
|
id: string(),
|
|
23572
23625
|
name: string(),
|
|
23573
|
-
formats: record(string(),
|
|
23574
|
-
downloaded: boolean(),
|
|
23575
|
-
sizeMB: number()
|
|
23576
|
-
})),
|
|
23626
|
+
formats: record(string(), PipelineModelFormatStatusSchema),
|
|
23577
23627
|
group: ModelVariantGroupSchema.optional(),
|
|
23578
23628
|
legacy: boolean().optional(),
|
|
23579
23629
|
provider: ModelProviderIdSchema.optional(),
|
|
23580
|
-
defaultConfidence: number().optional()
|
|
23630
|
+
defaultConfidence: number().optional(),
|
|
23631
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional()
|
|
23581
23632
|
});
|
|
23582
23633
|
var ConfigFieldBridge = custom();
|
|
23583
23634
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -23739,6 +23790,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23739
23790
|
}), {
|
|
23740
23791
|
kind: "mutation",
|
|
23741
23792
|
auth: "admin"
|
|
23793
|
+
}), method(object({
|
|
23794
|
+
nodeId: string(),
|
|
23795
|
+
deviceIds: array(number()).readonly().optional(),
|
|
23796
|
+
dryRun: boolean()
|
|
23797
|
+
}), object({
|
|
23798
|
+
entries: array(object({
|
|
23799
|
+
deviceId: number(),
|
|
23800
|
+
keys: array(string()).readonly()
|
|
23801
|
+
})).readonly(),
|
|
23802
|
+
refused: array(object({
|
|
23803
|
+
deviceId: number(),
|
|
23804
|
+
reason: string()
|
|
23805
|
+
})).readonly()
|
|
23806
|
+
}), {
|
|
23807
|
+
kind: "mutation",
|
|
23808
|
+
auth: "admin"
|
|
23742
23809
|
}), method(object({ nodeId: string() }), object({ unhealthy: array(object({
|
|
23743
23810
|
/** `<backend>:<device>`, e.g. `openvino:gpu`. */
|
|
23744
23811
|
deviceKey: string(),
|
|
@@ -23764,22 +23831,14 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23764
23831
|
}), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({
|
|
23765
23832
|
steps: array(PipelineStepInputSchema),
|
|
23766
23833
|
deviceKey: string().optional()
|
|
23767
|
-
}), PipelineValidationResultSchema), method(_void(),
|
|
23768
|
-
name: string(),
|
|
23769
|
-
steps: array(PipelineTemplateStepSchema).readonly(),
|
|
23770
|
-
engine: PipelineEngineChoiceSchema
|
|
23771
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({
|
|
23772
|
-
id: string(),
|
|
23773
|
-
name: string().optional(),
|
|
23774
|
-
steps: array(PipelineTemplateStepSchema).readonly().optional()
|
|
23775
|
-
}), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
23834
|
+
}), PipelineValidationResultSchema), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
|
|
23776
23835
|
addonId: string(),
|
|
23777
23836
|
modelId: string(),
|
|
23778
|
-
format: ModelFormatSchema$
|
|
23837
|
+
format: ModelFormatSchema$2
|
|
23779
23838
|
}), DownloadModelResultSchema, { kind: "mutation" }), method(object({
|
|
23780
23839
|
addonId: string(),
|
|
23781
23840
|
modelId: string(),
|
|
23782
|
-
format: ModelFormatSchema$
|
|
23841
|
+
format: ModelFormatSchema$2
|
|
23783
23842
|
}), object({ success: literal(true) }), { kind: "mutation" }), method(object({
|
|
23784
23843
|
steps: array(PipelineStepInputSchema).min(1),
|
|
23785
23844
|
frame: FrameInputSchema.optional(),
|
|
@@ -23845,7 +23904,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23845
23904
|
* `device-not-servable`), and nothing reaches the camera's live
|
|
23846
23905
|
* trace stream. Absent ⇒ unchanged behaviour.
|
|
23847
23906
|
*/
|
|
23848
|
-
replay: literal(true).optional()
|
|
23907
|
+
replay: literal(true).optional(),
|
|
23908
|
+
/**
|
|
23909
|
+
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
23910
|
+
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
23911
|
+
* step (a Frigate+ `license_plate` for `plate-detection`): the step is
|
|
23912
|
+
* NOT inferred, these boxes are its output, and its children (the plate
|
|
23913
|
+
* reader) run on them through their own crop policy. Boxes are in the
|
|
23914
|
+
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
23915
|
+
*/
|
|
23916
|
+
suppliedRoot: SuppliedRootOutputSchema.optional()
|
|
23849
23917
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
23850
23918
|
steps: array(PipelineStepInputSchema).min(1),
|
|
23851
23919
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
@@ -23927,6 +23995,375 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
23927
23995
|
filename: string().optional(),
|
|
23928
23996
|
settings: record(string(), unknown()).optional()
|
|
23929
23997
|
}), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
|
|
23998
|
+
/**
|
|
23999
|
+
* The wire shapes of the Auto tune plan and apply (D745), used by the
|
|
24000
|
+
* `pipeline-orchestrator` cap. The recommender's own types
|
|
24001
|
+
* (`recommend.ts`) are the TS face of the same data; these
|
|
24002
|
+
* schemas are what crosses the cap boundary.
|
|
24003
|
+
*/
|
|
24004
|
+
var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
|
|
24005
|
+
/** The operator's range for it. */
|
|
24006
|
+
var MIN_SESSIONS_PER_DEVICE_RANGE = {
|
|
24007
|
+
min: 1,
|
|
24008
|
+
max: 8
|
|
24009
|
+
};
|
|
24010
|
+
var HardwareClassIdSchema = _enum([
|
|
24011
|
+
"intel-core-ultra",
|
|
24012
|
+
"intel-n-series",
|
|
24013
|
+
"apple-m-base",
|
|
24014
|
+
"apple-m-pro",
|
|
24015
|
+
"unknown"
|
|
24016
|
+
]);
|
|
24017
|
+
var AcceleratorKindSchema = _enum([
|
|
24018
|
+
"intel-npu",
|
|
24019
|
+
"intel-igpu",
|
|
24020
|
+
"x86-cpu",
|
|
24021
|
+
"arm-cpu",
|
|
24022
|
+
"apple-ane",
|
|
24023
|
+
"coral"
|
|
24024
|
+
]);
|
|
24025
|
+
var RecommendationReasonSchema = discriminatedUnion("kind", [
|
|
24026
|
+
object({
|
|
24027
|
+
kind: literal("capacity"),
|
|
24028
|
+
sessions: number(),
|
|
24029
|
+
minSessions: number()
|
|
24030
|
+
}),
|
|
24031
|
+
object({
|
|
24032
|
+
kind: literal("tie-faster"),
|
|
24033
|
+
over: string(),
|
|
24034
|
+
recallDelta: number()
|
|
24035
|
+
}),
|
|
24036
|
+
object({
|
|
24037
|
+
kind: literal("stepped-down"),
|
|
24038
|
+
from: string(),
|
|
24039
|
+
to: string(),
|
|
24040
|
+
limitedBy: string()
|
|
24041
|
+
}),
|
|
24042
|
+
object({
|
|
24043
|
+
kind: literal("no-fit-lightest"),
|
|
24044
|
+
sessions: number(),
|
|
24045
|
+
minSessions: number()
|
|
24046
|
+
}),
|
|
24047
|
+
object({
|
|
24048
|
+
kind: literal("derived-latency"),
|
|
24049
|
+
modelId: string()
|
|
24050
|
+
}),
|
|
24051
|
+
object({ kind: literal("cpu-device") }),
|
|
24052
|
+
object({ kind: literal("coral-untouched") }),
|
|
24053
|
+
object({ kind: literal("device-disabled") }),
|
|
24054
|
+
object({ kind: literal("device-unavailable") }),
|
|
24055
|
+
object({ kind: literal("node-offline") }),
|
|
24056
|
+
object({ kind: literal("no-hardware-facts") }),
|
|
24057
|
+
object({
|
|
24058
|
+
kind: literal("no-measured-data"),
|
|
24059
|
+
hardwareClass: HardwareClassIdSchema
|
|
24060
|
+
}),
|
|
24061
|
+
object({
|
|
24062
|
+
kind: literal("no-family-build"),
|
|
24063
|
+
format: ModelFormatSchema$1
|
|
24064
|
+
})
|
|
24065
|
+
]);
|
|
24066
|
+
var DeviceModelChoiceSchema = object({
|
|
24067
|
+
modelId: string(),
|
|
24068
|
+
p50Ms: number(),
|
|
24069
|
+
fps: number(),
|
|
24070
|
+
measured: boolean(),
|
|
24071
|
+
/** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
|
|
24072
|
+
capacitySessions: number(),
|
|
24073
|
+
personRecall: number()
|
|
24074
|
+
});
|
|
24075
|
+
var DeviceRecommendationSchema = object({
|
|
24076
|
+
deviceKey: string(),
|
|
24077
|
+
accelerator: AcceleratorKindSchema.nullable(),
|
|
24078
|
+
enabled: boolean(),
|
|
24079
|
+
available: boolean(),
|
|
24080
|
+
chosen: DeviceModelChoiceSchema.nullable(),
|
|
24081
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
24082
|
+
});
|
|
24083
|
+
var NodeRecommendationSchema = object({
|
|
24084
|
+
nodeId: string(),
|
|
24085
|
+
reachable: boolean(),
|
|
24086
|
+
hardwareClass: HardwareClassIdSchema.nullable(),
|
|
24087
|
+
cpuModel: string().nullable(),
|
|
24088
|
+
skipped: boolean(),
|
|
24089
|
+
acceleratorModelId: string().nullable(),
|
|
24090
|
+
devices: array(DeviceRecommendationSchema).readonly(),
|
|
24091
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
24092
|
+
});
|
|
24093
|
+
var ModelPinChangeSchema = object({
|
|
24094
|
+
stepId: string(),
|
|
24095
|
+
before: string().nullable(),
|
|
24096
|
+
after: string().nullable()
|
|
24097
|
+
});
|
|
24098
|
+
var NodeDeviceChangeSchema = object({
|
|
24099
|
+
nodeId: string(),
|
|
24100
|
+
deviceKey: string(),
|
|
24101
|
+
madeExplicit: boolean(),
|
|
24102
|
+
modelPins: array(ModelPinChangeSchema).readonly(),
|
|
24103
|
+
thresholds: array(object({
|
|
24104
|
+
stepId: string(),
|
|
24105
|
+
keys: array(string()).readonly()
|
|
24106
|
+
})).readonly()
|
|
24107
|
+
});
|
|
24108
|
+
var CameraOverrideClearSchema = object({
|
|
24109
|
+
deviceId: number(),
|
|
24110
|
+
source: _enum(["step-override", "wholesale"]),
|
|
24111
|
+
nodeId: string(),
|
|
24112
|
+
deviceKey: string().nullable(),
|
|
24113
|
+
stepId: string(),
|
|
24114
|
+
modelIdBefore: string().nullable(),
|
|
24115
|
+
keys: array(string()).readonly()
|
|
24116
|
+
});
|
|
24117
|
+
var DetectorStoreClearSchema = object({
|
|
24118
|
+
deviceId: number(),
|
|
24119
|
+
keys: array(string()).readonly()
|
|
24120
|
+
});
|
|
24121
|
+
var AutoTuneWarningSchema = discriminatedUnion("kind", [
|
|
24122
|
+
object({
|
|
24123
|
+
kind: literal("detector-store-cluster-wide"),
|
|
24124
|
+
skippedNodes: array(string()).readonly()
|
|
24125
|
+
}),
|
|
24126
|
+
object({
|
|
24127
|
+
kind: literal("detector-store-unreadable"),
|
|
24128
|
+
error: string()
|
|
24129
|
+
}),
|
|
24130
|
+
object({
|
|
24131
|
+
kind: literal("coral-enabled"),
|
|
24132
|
+
nodeId: string(),
|
|
24133
|
+
deviceKey: string()
|
|
24134
|
+
})
|
|
24135
|
+
]);
|
|
24136
|
+
var AutoTuneOptionsSchema = object({
|
|
24137
|
+
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
24138
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
24139
|
+
/**
|
|
24140
|
+
* The least number of parallel sessions every device must sustain at the
|
|
24141
|
+
* camera rate with the headroom kept free (D755). The most accurate model
|
|
24142
|
+
* that reaches it wins.
|
|
24143
|
+
*/
|
|
24144
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
24145
|
+
});
|
|
24146
|
+
var AutoTunePlanSchema = object({
|
|
24147
|
+
/** Hash of everything the apply will write — the apply refuses a different one. */
|
|
24148
|
+
planHash: string(),
|
|
24149
|
+
family: literal("yolov9"),
|
|
24150
|
+
headroom: number(),
|
|
24151
|
+
minSessionsPerDevice: number(),
|
|
24152
|
+
/** The detection rate a session is counted at (the fastest camera running the pipeline root). */
|
|
24153
|
+
cameraFps: number(),
|
|
24154
|
+
generatedAt: number(),
|
|
24155
|
+
nodes: array(NodeRecommendationSchema).readonly(),
|
|
24156
|
+
nodeChanges: array(NodeDeviceChangeSchema).readonly(),
|
|
24157
|
+
cameraClears: array(CameraOverrideClearSchema).readonly(),
|
|
24158
|
+
detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
|
|
24159
|
+
warnings: array(AutoTuneWarningSchema).readonly()
|
|
24160
|
+
});
|
|
24161
|
+
var AutoTuneApplyInputSchema = object({
|
|
24162
|
+
planHash: string(),
|
|
24163
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
24164
|
+
minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
|
|
24165
|
+
});
|
|
24166
|
+
var AutoTunePhaseResultSchema = object({
|
|
24167
|
+
phase: _enum([
|
|
24168
|
+
"download",
|
|
24169
|
+
"camera-overrides",
|
|
24170
|
+
"detector-thresholds",
|
|
24171
|
+
"node-models",
|
|
24172
|
+
"redispatch"
|
|
24173
|
+
]),
|
|
24174
|
+
ok: boolean(),
|
|
24175
|
+
detail: string()
|
|
24176
|
+
});
|
|
24177
|
+
var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
|
|
24178
|
+
object({
|
|
24179
|
+
kind: literal("applied"),
|
|
24180
|
+
planHash: string(),
|
|
24181
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
24182
|
+
}),
|
|
24183
|
+
object({
|
|
24184
|
+
kind: literal("aborted"),
|
|
24185
|
+
phases: array(AutoTunePhaseResultSchema).readonly()
|
|
24186
|
+
}),
|
|
24187
|
+
object({
|
|
24188
|
+
kind: literal("stale"),
|
|
24189
|
+
plan: AutoTunePlanSchema
|
|
24190
|
+
}),
|
|
24191
|
+
object({
|
|
24192
|
+
kind: literal("refused"),
|
|
24193
|
+
reason: _enum(["apply-in-progress"])
|
|
24194
|
+
})
|
|
24195
|
+
]);
|
|
24196
|
+
/**
|
|
24197
|
+
* Wire shapes of the Load balancing surface (D748): the session placement
|
|
24198
|
+
* policy, the atomic share write, the observed placement statistics, the
|
|
24199
|
+
* hardware share suggestion and the stale device pins.
|
|
24200
|
+
*/
|
|
24201
|
+
/**
|
|
24202
|
+
* How a new detection session picks its node and device.
|
|
24203
|
+
* - `least-loaded` — the historical rule: lowest `attached / weight`, a
|
|
24204
|
+
* constant node order at a tie (D37). An idle node always ties at 0, so a
|
|
24205
|
+
* weight only bites once a node already holds a session.
|
|
24206
|
+
* - `share` — the share of PARALLEL sessions is held to the weights, and a
|
|
24207
|
+
* full or drowning node yields to a free one (D748).
|
|
24208
|
+
*/
|
|
24209
|
+
var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
|
|
24210
|
+
var LoadBalancingSharesInputSchema = object({
|
|
24211
|
+
/** nodeId → share (> 0). A node left out keeps its weight. */
|
|
24212
|
+
nodes: record(string(), number().positive()).default({}),
|
|
24213
|
+
/** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
|
|
24214
|
+
devices: record(string(), record(string(), number().positive())).default({})
|
|
24215
|
+
});
|
|
24216
|
+
var PlacementStatsInputSchema = object({
|
|
24217
|
+
/** Window the observed shares are averaged over (default 1 h, max 24 h). */
|
|
24218
|
+
windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
|
|
24219
|
+
var PlacementDeviceStatsSchema = object({
|
|
24220
|
+
deviceKey: string(),
|
|
24221
|
+
/** Sessions running on this device now. */
|
|
24222
|
+
sessionsNow: number(),
|
|
24223
|
+
/** Sessions started on this device inside the window. */
|
|
24224
|
+
sessionsStarted: number(),
|
|
24225
|
+
/** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
|
|
24226
|
+
observedShare: number().nullable()
|
|
24227
|
+
});
|
|
24228
|
+
var PlacementNodeStatsSchema = object({
|
|
24229
|
+
nodeId: string(),
|
|
24230
|
+
sessionsNow: number(),
|
|
24231
|
+
sessionsStarted: number(),
|
|
24232
|
+
/** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
|
|
24233
|
+
observedShare: number().nullable(),
|
|
24234
|
+
/** Most sessions this node ran at once inside the window. */
|
|
24235
|
+
peakSessions: number(),
|
|
24236
|
+
/** Sessions a share election handed elsewhere because this node was full or drowning. */
|
|
24237
|
+
yieldsAway: number(),
|
|
24238
|
+
devices: array(PlacementDeviceStatsSchema).readonly()
|
|
24239
|
+
});
|
|
24240
|
+
/** A camera's device pin that the session path cannot honour. */
|
|
24241
|
+
var StaleDevicePinSchema = object({
|
|
24242
|
+
deviceId: number(),
|
|
24243
|
+
deviceKey: string(),
|
|
24244
|
+
/** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
|
|
24245
|
+
reason: _enum(["disabled", "absent"])
|
|
24246
|
+
});
|
|
24247
|
+
var PlacementStatsSchema = object({
|
|
24248
|
+
policy: SessionPlacementPolicySchema,
|
|
24249
|
+
windowMs: number(),
|
|
24250
|
+
/** How much of the window was actually observed (the hub keeps it in memory). */
|
|
24251
|
+
observedForMs: number(),
|
|
24252
|
+
sessionsNow: number(),
|
|
24253
|
+
/** Most parallel sessions across the cluster inside the window. */
|
|
24254
|
+
clusterPeakSessions: number(),
|
|
24255
|
+
nodes: array(PlacementNodeStatsSchema).readonly(),
|
|
24256
|
+
stalePins: array(StaleDevicePinSchema).readonly()
|
|
24257
|
+
});
|
|
24258
|
+
/**
|
|
24259
|
+
* Where an automatic share's capacity comes from (D755).
|
|
24260
|
+
* - `hardware` — the static capacity of each device at its Auto tune model:
|
|
24261
|
+
* the measured latency table for the node's hardware class.
|
|
24262
|
+
* - `benchmark` — the node's own measured capacity (node benchmark results).
|
|
24263
|
+
* A node with no results falls back to `hardware`, and says so.
|
|
24264
|
+
*/
|
|
24265
|
+
var CapacitySourceSchema = _enum(["hardware", "benchmark"]);
|
|
24266
|
+
/** Why a node under the `benchmark` source was sized from hardware instead. */
|
|
24267
|
+
var CapacityFallbackSchema = _enum(["no-benchmark-results", "partial-benchmark-results"]);
|
|
24268
|
+
var SuggestSharesInputSchema = object({
|
|
24269
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
24270
|
+
/** Default `hardware`. */
|
|
24271
|
+
source: CapacitySourceSchema.default("hardware")
|
|
24272
|
+
});
|
|
24273
|
+
var SuggestedDeviceShareSchema = object({
|
|
24274
|
+
deviceKey: string(),
|
|
24275
|
+
/** Share of the node (0–100, rounded). */
|
|
24276
|
+
share: number(),
|
|
24277
|
+
modelId: string().nullable(),
|
|
24278
|
+
/** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
|
|
24279
|
+
fps: number().nullable(),
|
|
24280
|
+
/** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
|
|
24281
|
+
measured: boolean(),
|
|
24282
|
+
/**
|
|
24283
|
+
* Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
|
|
24284
|
+
* or the benchmark's measured max sessions. Never enforced.
|
|
24285
|
+
*/
|
|
24286
|
+
suggestedMaxSessions: number().nullable()
|
|
24287
|
+
});
|
|
24288
|
+
var SuggestedNodeShareSchema = object({
|
|
24289
|
+
nodeId: string(),
|
|
24290
|
+
/** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
|
|
24291
|
+
share: number().nullable(),
|
|
24292
|
+
/** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
|
|
24293
|
+
capacitySessions: number(),
|
|
24294
|
+
devices: array(SuggestedDeviceShareSchema).readonly(),
|
|
24295
|
+
skippedReason: string().nullable(),
|
|
24296
|
+
/** What this node's capacity was read from; null when the node is skipped. */
|
|
24297
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
24298
|
+
/** Set when the `benchmark` source was asked for and this node used `hardware`. */
|
|
24299
|
+
capacityFallback: CapacityFallbackSchema.nullable()
|
|
24300
|
+
});
|
|
24301
|
+
var SuggestSharesResultSchema = object({
|
|
24302
|
+
headroom: number(),
|
|
24303
|
+
/** The source asked for; each node says what it actually used. */
|
|
24304
|
+
source: CapacitySourceSchema,
|
|
24305
|
+
/** Camera detection rate the capacity is counted in (the fastest camera's fps). */
|
|
24306
|
+
cameraFps: number(),
|
|
24307
|
+
/** The Auto tune capacity floor the models were picked at. */
|
|
24308
|
+
minSessionsPerDevice: number(),
|
|
24309
|
+
nodes: array(SuggestedNodeShareSchema).readonly()
|
|
24310
|
+
});
|
|
24311
|
+
/**
|
|
24312
|
+
* Where the node and device shares come from (D750, D755).
|
|
24313
|
+
* - `hardware` (default) — computed by the system from each node's static
|
|
24314
|
+
* capacity (its accelerators at their Auto tune models, from the measured
|
|
24315
|
+
* latency table), recomputed whenever a node or device joins, leaves, is
|
|
24316
|
+
* switched on or off, or changes model. No load input.
|
|
24317
|
+
* - `benchmark` — the same, from each node's measured capacity (node
|
|
24318
|
+
* benchmark results); a node without results falls back to `hardware`.
|
|
24319
|
+
* - `manual` — the operator's stored sliders.
|
|
24320
|
+
* Either way a node or device that cannot take sessions gives its share to
|
|
24321
|
+
* the others in proportion; the stored values are never rewritten for that.
|
|
24322
|
+
*/
|
|
24323
|
+
var ShareSourceSchema = _enum([
|
|
24324
|
+
"hardware",
|
|
24325
|
+
"benchmark",
|
|
24326
|
+
"manual"
|
|
24327
|
+
]);
|
|
24328
|
+
var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
|
|
24329
|
+
object({
|
|
24330
|
+
nodes: record(string(), number()),
|
|
24331
|
+
devices: record(string(), record(string(), number()))
|
|
24332
|
+
});
|
|
24333
|
+
var EffectiveDeviceShareSchema = object({
|
|
24334
|
+
deviceKey: string(),
|
|
24335
|
+
/** Can take sessions now (enabled, available, can run the root). */
|
|
24336
|
+
eligible: boolean(),
|
|
24337
|
+
/** The share the source assigns, as a percentage of the node's devices. */
|
|
24338
|
+
configuredPct: number(),
|
|
24339
|
+
/** The share actually used, after an ineligible device's share went to the others. */
|
|
24340
|
+
effectivePct: number()
|
|
24341
|
+
});
|
|
24342
|
+
var EffectiveNodeShareSchema = object({
|
|
24343
|
+
nodeId: string(),
|
|
24344
|
+
eligible: boolean(),
|
|
24345
|
+
configuredPct: number(),
|
|
24346
|
+
effectivePct: number(),
|
|
24347
|
+
/** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
|
|
24348
|
+
capacitySource: CapacitySourceSchema.nullable(),
|
|
24349
|
+
/** Automatic `benchmark`: why this node used `hardware` instead. */
|
|
24350
|
+
capacityFallback: CapacityFallbackSchema.nullable(),
|
|
24351
|
+
devices: array(EffectiveDeviceShareSchema).readonly()
|
|
24352
|
+
});
|
|
24353
|
+
var EffectiveSharesSchema = object({
|
|
24354
|
+
source: ShareSourceSchema,
|
|
24355
|
+
policy: SessionPlacementPolicySchema,
|
|
24356
|
+
/** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
|
|
24357
|
+
autoPending: boolean(),
|
|
24358
|
+
/** When the automatic shares were last computed (ms epoch); null = never. */
|
|
24359
|
+
computedAt: number().nullable(),
|
|
24360
|
+
/** What made the system recompute them last. */
|
|
24361
|
+
trigger: string().nullable(),
|
|
24362
|
+
nodes: array(EffectiveNodeShareSchema).readonly(),
|
|
24363
|
+
/** The relative weights the election reads (before eligibility). */
|
|
24364
|
+
nodeWeights: record(string(), number()),
|
|
24365
|
+
deviceWeights: record(string(), record(string(), number()))
|
|
24366
|
+
});
|
|
23930
24367
|
object({
|
|
23931
24368
|
activeCameras: number(),
|
|
23932
24369
|
throttledCameras: number(),
|
|
@@ -24844,14 +25281,15 @@ var RunnerLocalLoadSchema = object({
|
|
|
24844
25281
|
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
24845
25282
|
* this runner currently has attached cameras on, so the orchestrator's second
|
|
24846
25283
|
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
24847
|
-
* counts. Empty on single-device / pre-multi-device runners.
|
|
24848
|
-
* per
|
|
25284
|
+
* counts. Empty on single-device / pre-multi-device runners. There is no
|
|
25285
|
+
* per-device queue depth: the inference pool's backlog has no accessor, and
|
|
25286
|
+
* a field that always read 0 was removed rather than shown as a measurement
|
|
25287
|
+
* (D762).
|
|
24849
25288
|
*/
|
|
24850
25289
|
devices: array(object({
|
|
24851
25290
|
deviceKey: string(),
|
|
24852
25291
|
backend: string(),
|
|
24853
|
-
attachedCameras: number()
|
|
24854
|
-
queueDepthTotal: number()
|
|
25292
|
+
attachedCameras: number()
|
|
24855
25293
|
})).default([]),
|
|
24856
25294
|
/** Hardware capability flags reported by this node. */
|
|
24857
25295
|
hardware: object({
|
|
@@ -24987,7 +25425,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
|
|
|
24987
25425
|
*/
|
|
24988
25426
|
cropJpeg: string().optional(),
|
|
24989
25427
|
parent: DetailParentSchema,
|
|
24990
|
-
steps: array(string()).optional()
|
|
25428
|
+
steps: array(string()).optional(),
|
|
25429
|
+
/**
|
|
25430
|
+
* The camera's root model already drew this step's boxes (D730): a
|
|
25431
|
+
* `license_plate` inside the parent vehicle. The named step is NOT
|
|
25432
|
+
* inferred — these FRAME-space boxes are its output — and its
|
|
25433
|
+
* requested children (the plate reader) run on them. Absent ⇒ every
|
|
25434
|
+
* requested step infers as before.
|
|
25435
|
+
*/
|
|
25436
|
+
supplied: object({
|
|
25437
|
+
stepId: string(),
|
|
25438
|
+
modelId: string(),
|
|
25439
|
+
boxes: array(object({
|
|
25440
|
+
bbox: NativeCropBboxSchema,
|
|
25441
|
+
score: number()
|
|
25442
|
+
})).min(1)
|
|
25443
|
+
}).optional()
|
|
24991
25444
|
}), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
|
|
24992
25445
|
/** Catalog step id, e.g. `clip-embedding`. */
|
|
24993
25446
|
stepId: string(),
|
|
@@ -25050,14 +25503,6 @@ var CameraPipelineConfigSchema = object({
|
|
|
25050
25503
|
settings: record(string(), unknown()).readonly().optional()
|
|
25051
25504
|
}).nullable().optional()
|
|
25052
25505
|
});
|
|
25053
|
-
var PipelineTemplateSchema = object({
|
|
25054
|
-
id: string(),
|
|
25055
|
-
name: string(),
|
|
25056
|
-
description: string().optional(),
|
|
25057
|
-
config: CameraPipelineConfigSchema,
|
|
25058
|
-
createdAt: string(),
|
|
25059
|
-
updatedAt: string()
|
|
25060
|
-
});
|
|
25061
25506
|
var DeviceStepConfigSchema = object({
|
|
25062
25507
|
modelId: string().optional(),
|
|
25063
25508
|
settings: record(string(), unknown()).optional(),
|
|
@@ -25131,9 +25576,10 @@ var CameraStepOverridePatchSchema = object({
|
|
|
25131
25576
|
modelId: string().optional(),
|
|
25132
25577
|
settings: record(string(), unknown()).readonly().optional()
|
|
25133
25578
|
});
|
|
25579
|
+
var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
|
|
25134
25580
|
var CameraPipelineSettingsSchema = object({
|
|
25135
|
-
pinnedAgentNodeId: string().optional(),
|
|
25136
25581
|
stepToggles: record(string(), boolean()).optional(),
|
|
25582
|
+
stepSettings: CameraStepSettingsSchema.optional(),
|
|
25137
25583
|
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
25138
25584
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
25139
25585
|
});
|
|
@@ -25166,7 +25612,10 @@ var PipelineAssignmentSchema = object({
|
|
|
25166
25612
|
});
|
|
25167
25613
|
/**
|
|
25168
25614
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
25169
|
-
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
25615
|
+
* Aggregated from each runner's `getLocalLoad` cap call. In the
|
|
25616
|
+
* `getAgentLoad` report, a single-device node's default-pool sessions (no
|
|
25617
|
+
* `deviceKey`) are credited to its one eligible device in `load.devices` —
|
|
25618
|
+
* the default pool IS that device (D745); the balancer's census stays raw.
|
|
25170
25619
|
*/
|
|
25171
25620
|
var AgentLoadSummarySchema = object({
|
|
25172
25621
|
nodeId: string(),
|
|
@@ -25255,26 +25704,27 @@ var CameraBrokerStatusSchema = object({
|
|
|
25255
25704
|
width: number(),
|
|
25256
25705
|
height: number(),
|
|
25257
25706
|
subscribers: number(),
|
|
25258
|
-
|
|
25259
|
-
|
|
25707
|
+
/**
|
|
25708
|
+
* Encoded packets/s the broker receives from the camera. null when the
|
|
25709
|
+
* broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
|
|
25710
|
+
* There is no output rate: decoding runs in the session decode workers, not
|
|
25711
|
+
* in the broker, so the broker's own decoded-frame rate is 0 on every live
|
|
25712
|
+
* camera and is not served (D758).
|
|
25713
|
+
*/
|
|
25714
|
+
inFps: number().nullable()
|
|
25260
25715
|
})).readonly(),
|
|
25261
25716
|
webrtcSessions: number(),
|
|
25262
25717
|
rtspRestream: boolean()
|
|
25263
25718
|
});
|
|
25264
|
-
/**
|
|
25265
|
-
|
|
25266
|
-
|
|
25267
|
-
|
|
25268
|
-
|
|
25269
|
-
|
|
25270
|
-
|
|
25271
|
-
|
|
25272
|
-
var CameraDecoderStatusSchema = object({
|
|
25273
|
-
nodeId: string(),
|
|
25274
|
-
formats: array(string()).readonly(),
|
|
25275
|
-
sessionCount: number(),
|
|
25276
|
-
shm: CameraDecoderShmSchema
|
|
25277
|
-
});
|
|
25719
|
+
/**
|
|
25720
|
+
* Decoder block — WHERE decode runs (co-located with the detection node by
|
|
25721
|
+
* construction); null when the camera has no detection node. It carries no
|
|
25722
|
+
* frame counter: the shared-memory plane whose counters it used to serve is
|
|
25723
|
+
* gone, and those fields read 0 forever. Whether frames actually flow is read
|
|
25724
|
+
* from `detection.actualFps` (frames delivered to and processed by the
|
|
25725
|
+
* detector), never from a counter nothing feeds.
|
|
25726
|
+
*/
|
|
25727
|
+
var CameraDecoderStatusSchema = object({ nodeId: string() });
|
|
25278
25728
|
/** Motion block — null when motion detection is not active for this device. */
|
|
25279
25729
|
var CameraMotionStatusSchema = object({
|
|
25280
25730
|
enabled: boolean(),
|
|
@@ -25631,12 +26081,6 @@ method(object({
|
|
|
25631
26081
|
}), object({ success: literal(true) }), {
|
|
25632
26082
|
kind: "mutation",
|
|
25633
26083
|
auth: "admin"
|
|
25634
|
-
}), method(object({
|
|
25635
|
-
agentNodeId: string(),
|
|
25636
|
-
detectWeight: number().positive().nullable()
|
|
25637
|
-
}), object({ success: literal(true) }), {
|
|
25638
|
-
kind: "mutation",
|
|
25639
|
-
auth: "admin"
|
|
25640
26084
|
}), method(object({
|
|
25641
26085
|
agentNodeId: string(),
|
|
25642
26086
|
detect: boolean().nullable().optional(),
|
|
@@ -25678,6 +26122,15 @@ method(object({
|
|
|
25678
26122
|
}), {
|
|
25679
26123
|
kind: "mutation",
|
|
25680
26124
|
auth: "admin"
|
|
26125
|
+
}), method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }), method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
|
|
26126
|
+
kind: "mutation",
|
|
26127
|
+
auth: "admin"
|
|
26128
|
+
}), method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
|
|
26129
|
+
kind: "mutation",
|
|
26130
|
+
auth: "admin"
|
|
26131
|
+
}), method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }), method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }), method(_void(), EffectiveSharesSchema, { auth: "admin" }), method(SetShareSourceInputSchema, object({ success: literal(true) }), {
|
|
26132
|
+
kind: "mutation",
|
|
26133
|
+
auth: "admin"
|
|
25681
26134
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
25682
26135
|
deviceId: number(),
|
|
25683
26136
|
addonId: string(),
|
|
@@ -25694,6 +26147,13 @@ method(object({
|
|
|
25694
26147
|
}), object({ success: literal(true) }), {
|
|
25695
26148
|
kind: "mutation",
|
|
25696
26149
|
auth: "admin"
|
|
26150
|
+
}), method(object({
|
|
26151
|
+
deviceId: number(),
|
|
26152
|
+
addonId: string(),
|
|
26153
|
+
settings: record(string(), unknown()).nullable()
|
|
26154
|
+
}), object({ success: literal(true) }), {
|
|
26155
|
+
kind: "mutation",
|
|
26156
|
+
auth: "admin"
|
|
25697
26157
|
}), method(object({
|
|
25698
26158
|
deviceId: number(),
|
|
25699
26159
|
agentNodeId: string(),
|
|
@@ -25717,25 +26177,7 @@ method(object({
|
|
|
25717
26177
|
}), method(_void(), DiskReconcileJobSchema, {
|
|
25718
26178
|
kind: "mutation",
|
|
25719
26179
|
auth: "admin"
|
|
25720
|
-
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" })
|
|
25721
|
-
name: string(),
|
|
25722
|
-
description: string().optional(),
|
|
25723
|
-
config: CameraPipelineConfigSchema
|
|
25724
|
-
}), PipelineTemplateSchema, {
|
|
25725
|
-
kind: "mutation",
|
|
25726
|
-
auth: "admin"
|
|
25727
|
-
}), method(object({
|
|
25728
|
-
id: string(),
|
|
25729
|
-
name: string().optional(),
|
|
25730
|
-
description: string().optional(),
|
|
25731
|
-
config: CameraPipelineConfigSchema.optional()
|
|
25732
|
-
}), PipelineTemplateSchema, {
|
|
25733
|
-
kind: "mutation",
|
|
25734
|
-
auth: "admin"
|
|
25735
|
-
}), method(object({ id: string() }), object({ success: literal(true) }), {
|
|
25736
|
-
kind: "mutation",
|
|
25737
|
-
auth: "admin"
|
|
25738
|
-
});
|
|
26180
|
+
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" });
|
|
25739
26181
|
/**
|
|
25740
26182
|
* Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
|
|
25741
26183
|
* `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
|
|
@@ -26429,7 +26871,19 @@ var SsoBridgeClaimsSchema = object({
|
|
|
26429
26871
|
* editing a descriptor must not retroactively extend or shorten a link the
|
|
26430
26872
|
* operator already consented to.
|
|
26431
26873
|
*/
|
|
26432
|
-
refreshTtl: union([number().int().positive(), literal("never")]).optional()
|
|
26874
|
+
refreshTtl: union([number().int().positive(), literal("never")]).optional(),
|
|
26875
|
+
/**
|
|
26876
|
+
* Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
|
|
26877
|
+
* that was started from a signed-in user's "Link" button: the finish then
|
|
26878
|
+
* links this identity to the intent's user instead of signing anyone in.
|
|
26879
|
+
* The handle carries no user id — the hub resolves it, single-use.
|
|
26880
|
+
*/
|
|
26881
|
+
linkIntent: string().optional(),
|
|
26882
|
+
/**
|
|
26883
|
+
* Verified `iss` of the id_token behind an OIDC login bridge (D782). A
|
|
26884
|
+
* subject is unique only per issuer, so a link is bound to it.
|
|
26885
|
+
*/
|
|
26886
|
+
issuer: string().optional()
|
|
26433
26887
|
});
|
|
26434
26888
|
method(object({
|
|
26435
26889
|
claims: SsoBridgeClaimsSchema,
|
|
@@ -28497,8 +28951,6 @@ var WebrtcStreamChoiceSchema = object({
|
|
|
28497
28951
|
]).nullable(),
|
|
28498
28952
|
/** Input FPS from the camera (null for adaptive). */
|
|
28499
28953
|
inputFps: number().nullable(),
|
|
28500
|
-
/** Decoded FPS (null for adaptive). */
|
|
28501
|
-
decodeFps: number().nullable(),
|
|
28502
28954
|
/** Bitrate in kbps (null for adaptive). */
|
|
28503
28955
|
bitrateKbps: number().nullable()
|
|
28504
28956
|
});
|
|
@@ -28775,7 +29227,22 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
28775
29227
|
* field their hints were silently stripped by the schema and the
|
|
28776
29228
|
* adaptive ladder started blind on the client's display size.
|
|
28777
29229
|
*/
|
|
28778
|
-
hints: webrtcClientHintsSchema.optional()
|
|
29230
|
+
hints: webrtcClientHintsSchema.optional(),
|
|
29231
|
+
/**
|
|
29232
|
+
* Talk-back (D771): relay the PEER's audio to the device's speaker
|
|
29233
|
+
* through the `intercom` cap's push-talk triple. When `true` and the
|
|
29234
|
+
* offer lets the peer send audio, the answer's audio is `sendrecv`
|
|
29235
|
+
* and every inbound frame goes to `intercom.pushTalkAudio` for this
|
|
29236
|
+
* `deviceId`; absent/false answers `sendonly`, as for every viewer.
|
|
29237
|
+
*
|
|
29238
|
+
* TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
|
|
29239
|
+
* with `intercom`, when the linked user may control that camera. The
|
|
29240
|
+
* hub STRIPS it from every request-bound call (a browser), exactly as
|
|
29241
|
+
* it overwrites `relayOnly` — a viewer's talk permission is the
|
|
29242
|
+
* intercom cap's own surface (share tokens gate it there), and this
|
|
29243
|
+
* flag must not become a second door to the camera's speaker.
|
|
29244
|
+
*/
|
|
29245
|
+
talkback: boolean().optional()
|
|
28779
29246
|
}), object({
|
|
28780
29247
|
sessionId: string(),
|
|
28781
29248
|
sdpAnswer: string()
|
|
@@ -28830,6 +29297,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
28830
29297
|
*/
|
|
28831
29298
|
alive: boolean()
|
|
28832
29299
|
})), method(object({
|
|
29300
|
+
deviceId: number().int().nonnegative(),
|
|
29301
|
+
sessionId: string(),
|
|
29302
|
+
downlinkMbps: number().nonnegative()
|
|
29303
|
+
}), object({
|
|
29304
|
+
outcome: _enum(["switching", "held"]),
|
|
29305
|
+
tier: CamProfileSchema.nullable(),
|
|
29306
|
+
reason: string()
|
|
29307
|
+
}), { kind: "mutation" }), method(object({
|
|
28833
29308
|
deviceId: number().int().nonnegative(),
|
|
28834
29309
|
sessionId: string()
|
|
28835
29310
|
}), WebrtcSessionDebugSchema, { kind: "query" });
|
|
@@ -29069,6 +29544,59 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
|
|
|
29069
29544
|
var RestartAddonResultSchema = unknown();
|
|
29070
29545
|
var InstallPackageResultSchema = unknown();
|
|
29071
29546
|
var ReloadPackagesResultSchema = unknown();
|
|
29547
|
+
/**
|
|
29548
|
+
* What an uninstall did on ONE node.
|
|
29549
|
+
* - `uninstalled` — removed: runner(s) stopped, caps gone, code deleted.
|
|
29550
|
+
* - `not-installed` — the node did not have it (nothing to do).
|
|
29551
|
+
* - `refused` — protected / bootstrap package; nothing touched.
|
|
29552
|
+
* - `failed` — attempted and did not complete; `error` says why.
|
|
29553
|
+
* - `pending-reconnect` — the node is OFFLINE: its record was pruned so the
|
|
29554
|
+
* back-fill never returns the package, and the stale-addon sweep removes the
|
|
29555
|
+
* copy when the node registers again (only once the hub no longer has it).
|
|
29556
|
+
*/
|
|
29557
|
+
var UninstallNodeOutcomeSchema = _enum([
|
|
29558
|
+
"uninstalled",
|
|
29559
|
+
"not-installed",
|
|
29560
|
+
"refused",
|
|
29561
|
+
"failed",
|
|
29562
|
+
"pending-reconnect"
|
|
29563
|
+
]);
|
|
29564
|
+
var UninstallNodeResultSchema = object({
|
|
29565
|
+
nodeId: string(),
|
|
29566
|
+
outcome: UninstallNodeOutcomeSchema,
|
|
29567
|
+
error: string().optional(),
|
|
29568
|
+
addonIds: array(string()).readonly(),
|
|
29569
|
+
runnersStopped: array(string()).readonly(),
|
|
29570
|
+
warnings: array(string()).readonly()
|
|
29571
|
+
});
|
|
29572
|
+
var UninstallPackageResultSchema = object({
|
|
29573
|
+
/** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
|
|
29574
|
+
success: boolean(),
|
|
29575
|
+
packageName: string(),
|
|
29576
|
+
results: array(UninstallNodeResultSchema).readonly()
|
|
29577
|
+
});
|
|
29578
|
+
/**
|
|
29579
|
+
* `unreachable` lists online agents whose status read FAILED — absence from
|
|
29580
|
+
* `installations` is only "not installed" for a node that answered (D315).
|
|
29581
|
+
*/
|
|
29582
|
+
var PackageInstallationsSchema = object({
|
|
29583
|
+
installations: array(object({
|
|
29584
|
+
packageName: string(),
|
|
29585
|
+
nodeId: string(),
|
|
29586
|
+
nodeName: string(),
|
|
29587
|
+
isHub: boolean(),
|
|
29588
|
+
isOnline: boolean(),
|
|
29589
|
+
version: string().nullable(),
|
|
29590
|
+
addonIds: array(string()).readonly(),
|
|
29591
|
+
source: _enum(["live", "recorded"]),
|
|
29592
|
+
/** The hub installs this package too. `false` on an agent row = an orphan. */
|
|
29593
|
+
onHub: boolean()
|
|
29594
|
+
})).readonly(),
|
|
29595
|
+
unreachable: array(object({
|
|
29596
|
+
nodeId: string(),
|
|
29597
|
+
error: string()
|
|
29598
|
+
})).readonly()
|
|
29599
|
+
});
|
|
29072
29600
|
var BulkUpdateItemStatusSchema = _enum([
|
|
29073
29601
|
"queued",
|
|
29074
29602
|
"updating",
|
|
@@ -29151,10 +29679,14 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
|
|
|
29151
29679
|
}), method(object({ packageName: string() }), InstallPackageResultSchema, {
|
|
29152
29680
|
kind: "mutation",
|
|
29153
29681
|
auth: "admin"
|
|
29154
|
-
}), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
|
|
29682
|
+
}), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
|
|
29683
|
+
packageName: string().min(1),
|
|
29684
|
+
nodeId: string().optional(),
|
|
29685
|
+
everywhere: boolean().optional()
|
|
29686
|
+
}), UninstallPackageResultSchema, {
|
|
29155
29687
|
kind: "mutation",
|
|
29156
29688
|
auth: "admin"
|
|
29157
|
-
}), method(_void(), ReloadPackagesResultSchema, {
|
|
29689
|
+
}), method(object({ packageName: string().optional() }), PackageInstallationsSchema, { auth: "admin" }), method(_void(), ReloadPackagesResultSchema, {
|
|
29158
29690
|
kind: "mutation",
|
|
29159
29691
|
auth: "admin"
|
|
29160
29692
|
}), method(object({ query: string().optional() }), array(SearchResultSchema)), method(object({ nodeId: string().optional() }), array(PackageUpdateSchema).readonly(), { auth: "admin" }), method(object({
|
|
@@ -32641,7 +33173,8 @@ var ConnectionEndpointSchema = object({
|
|
|
32641
33173
|
"lan-ipv6",
|
|
32642
33174
|
"public",
|
|
32643
33175
|
"loopback",
|
|
32644
|
-
"app-link"
|
|
33176
|
+
"app-link",
|
|
33177
|
+
"custom"
|
|
32645
33178
|
]),
|
|
32646
33179
|
/**
|
|
32647
33180
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -32710,7 +33243,7 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
32710
33243
|
localPort: AdvertisedLocalPortSchema
|
|
32711
33244
|
});
|
|
32712
33245
|
/**
|
|
32713
|
-
* The address flagged for notification
|
|
33246
|
+
* The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
|
|
32714
33247
|
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
32715
33248
|
* so the UI can show it either way.
|
|
32716
33249
|
*/
|
|
@@ -32743,6 +33276,72 @@ var ViewerEndpointsSchema = object({
|
|
|
32743
33276
|
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
32744
33277
|
resolved: array(string()).readonly()
|
|
32745
33278
|
});
|
|
33279
|
+
/**
|
|
33280
|
+
* DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
|
|
33281
|
+
* for addons built against it): `cluster` is the `internal` role, `browser`
|
|
33282
|
+
* the `publicEndpoint` role; `override` is the flagged address.
|
|
33283
|
+
*/
|
|
33284
|
+
var HubAddressSnapshotSchema = object({
|
|
33285
|
+
override: string().nullable(),
|
|
33286
|
+
resolved: string().nullable(),
|
|
33287
|
+
source: _enum([
|
|
33288
|
+
"override",
|
|
33289
|
+
"auto",
|
|
33290
|
+
"none"
|
|
33291
|
+
])
|
|
33292
|
+
});
|
|
33293
|
+
var HubAddressesSchema = object({
|
|
33294
|
+
cluster: HubAddressSnapshotSchema,
|
|
33295
|
+
browser: HubAddressSnapshotSchema
|
|
33296
|
+
});
|
|
33297
|
+
/**
|
|
33298
|
+
* What an address is used for (`hub-address.ts`, D734). `appConnections` is
|
|
33299
|
+
* many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
|
|
33300
|
+
* by at most one address.
|
|
33301
|
+
*/
|
|
33302
|
+
var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
|
|
33303
|
+
var RoleSourceSchema = _enum([
|
|
33304
|
+
"flagged",
|
|
33305
|
+
"auto",
|
|
33306
|
+
"none"
|
|
33307
|
+
]);
|
|
33308
|
+
/** One single-valued role: the flagged address, the one in use, and why. */
|
|
33309
|
+
var HubAddressRoleResolutionSchema = object({
|
|
33310
|
+
/** The address carrying the flag, or null = automatic. */
|
|
33311
|
+
flagged: string().nullable(),
|
|
33312
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
33313
|
+
resolved: string().nullable(),
|
|
33314
|
+
source: RoleSourceSchema
|
|
33315
|
+
});
|
|
33316
|
+
var HubAppConnectionsResolutionSchema = object({
|
|
33317
|
+
/** The addresses flagged `appConnections`, or empty = automatic. */
|
|
33318
|
+
flagged: array(string()).readonly(),
|
|
33319
|
+
/** What the apps race right now. */
|
|
33320
|
+
resolved: array(string()).readonly(),
|
|
33321
|
+
source: RoleSourceSchema
|
|
33322
|
+
});
|
|
33323
|
+
var HubAddressBookSchema = object({
|
|
33324
|
+
rows: array(ConnectionEndpointSchema.extend({
|
|
33325
|
+
/** In the hub's detected palette right now. */
|
|
33326
|
+
detected: boolean(),
|
|
33327
|
+
/** Entered by the operator (removable). */
|
|
33328
|
+
custom: boolean(),
|
|
33329
|
+
/** The roles explicitly flagged on this address. */
|
|
33330
|
+
flags: array(HubAddressRoleSchema).readonly(),
|
|
33331
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
33332
|
+
inUse: array(HubAddressRoleSchema).readonly(),
|
|
33333
|
+
/** The roles this address may be flagged with. */
|
|
33334
|
+
eligible: array(HubAddressRoleSchema).readonly()
|
|
33335
|
+
})).readonly(),
|
|
33336
|
+
roles: object({
|
|
33337
|
+
appConnections: HubAppConnectionsResolutionSchema,
|
|
33338
|
+
notificationTaps: HubAddressRoleResolutionSchema,
|
|
33339
|
+
internal: HubAddressRoleResolutionSchema,
|
|
33340
|
+
publicEndpoint: HubAddressRoleResolutionSchema
|
|
33341
|
+
}),
|
|
33342
|
+
/** The `hub=` an app link carries (D709), or null. */
|
|
33343
|
+
appLinkHub: string().nullable()
|
|
33344
|
+
});
|
|
32746
33345
|
var AllowedAddressesSchema = object({
|
|
32747
33346
|
/**
|
|
32748
33347
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -32786,10 +33385,27 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
32786
33385
|
* tunnel always emits `https://` regardless. */
|
|
32787
33386
|
scheme: _enum(["http", "https"]).optional(),
|
|
32788
33387
|
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
32789
|
-
* an address notification
|
|
33388
|
+
* an address notification taps can be flagged with, not a hub
|
|
32790
33389
|
* route. Default `false`: racers and rankers never see it. */
|
|
32791
33390
|
includeAppLink: boolean().optional()
|
|
32792
|
-
}), 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(
|
|
33391
|
+
}), 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({
|
|
33392
|
+
baseUrl: string(),
|
|
33393
|
+
label: string().max(80)
|
|
33394
|
+
}), HubAddressBookSchema, {
|
|
33395
|
+
kind: "mutation",
|
|
33396
|
+
auth: "admin"
|
|
33397
|
+
}), method(object({ baseUrl: string() }), HubAddressBookSchema, {
|
|
33398
|
+
kind: "mutation",
|
|
33399
|
+
auth: "admin"
|
|
33400
|
+
}), method(object({
|
|
33401
|
+
role: HubAddressRoleSchema,
|
|
33402
|
+
baseUrl: string().nullable(),
|
|
33403
|
+
enabled: boolean(),
|
|
33404
|
+
acceptInsecureHttp: boolean().optional()
|
|
33405
|
+
}), HubAddressBookSchema, {
|
|
33406
|
+
kind: "mutation",
|
|
33407
|
+
auth: "admin"
|
|
33408
|
+
}), 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, {
|
|
32793
33409
|
kind: "mutation",
|
|
32794
33410
|
auth: "admin"
|
|
32795
33411
|
}), method(object({
|
|
@@ -33247,7 +33863,8 @@ var MotionStatusSchema = object({
|
|
|
33247
33863
|
* writes this slice (not even a boot seed), and neither does the runner's
|
|
33248
33864
|
* phase machine: its phase is "a session is attached" for every on-motion
|
|
33249
33865
|
* session, not motion, and it now has its own `DetectionPhaseTransition`.
|
|
33250
|
-
* A provider's `isDetected`
|
|
33866
|
+
* A provider's `isDetected` and `getStatus` answer from the hub's slice
|
|
33867
|
+
* (`hubMotionNativeProvider`).
|
|
33251
33868
|
* - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
|
|
33252
33869
|
* imports) — the provider pushes both edges itself, from the upstream
|
|
33253
33870
|
* system's own state change. That is the sensor's own fact.
|
|
@@ -39441,6 +40058,32 @@ var TotpStatusSchema = object({
|
|
|
39441
40058
|
/** Null when no row exists OR the row is still pending confirmation. */
|
|
39442
40059
|
confirmedAt: number().nullable()
|
|
39443
40060
|
});
|
|
40061
|
+
/**
|
|
40062
|
+
* user-management — singleton capability for user accounts, API keys,
|
|
40063
|
+
* and scoped tokens.
|
|
40064
|
+
*
|
|
40065
|
+
* v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
|
|
40066
|
+
* — the subset check on `setUserScopes` / `createScopedToken` is moot
|
|
40067
|
+
* because non-admins never reach these. If/when we open non-admin
|
|
40068
|
+
* delegation, structural caller-scope subset check goes inside the
|
|
40069
|
+
* provider.
|
|
40070
|
+
*/
|
|
40071
|
+
var ExternalIdentitySchema = object({
|
|
40072
|
+
/** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
|
|
40073
|
+
provider: string(),
|
|
40074
|
+
/** The IdP's stable subject (`sub`) for this account. */
|
|
40075
|
+
subject: string(),
|
|
40076
|
+
/** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
|
|
40077
|
+
issuer: string(),
|
|
40078
|
+
userId: string(),
|
|
40079
|
+
/** What the IdP called the account at link time (username / email) — display only. */
|
|
40080
|
+
label: string().optional(),
|
|
40081
|
+
linkedAt: number()
|
|
40082
|
+
});
|
|
40083
|
+
var ExternalIdentityKeySchema = object({
|
|
40084
|
+
provider: string().min(1),
|
|
40085
|
+
subject: string().min(1)
|
|
40086
|
+
});
|
|
39444
40087
|
method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserInputSchema, UserSummarySchema, {
|
|
39445
40088
|
kind: "mutation",
|
|
39446
40089
|
auth: "admin",
|
|
@@ -39554,7 +40197,22 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
|
|
|
39554
40197
|
userId: string(),
|
|
39555
40198
|
username: string(),
|
|
39556
40199
|
scopes: array(TokenScopeSchema)
|
|
39557
|
-
}).nullable(), { access: "view" }), method(
|
|
40200
|
+
}).nullable(), { access: "view" }), method(object({ userId: string() }), array(ExternalIdentitySchema), { auth: "admin" }), method(ExternalIdentityKeySchema, object({
|
|
40201
|
+
userId: string(),
|
|
40202
|
+
issuer: string()
|
|
40203
|
+
}).nullable(), { auth: "admin" }), method(ExternalIdentityKeySchema.extend({
|
|
40204
|
+
userId: string(),
|
|
40205
|
+
issuer: string().min(1),
|
|
40206
|
+
label: string().optional()
|
|
40207
|
+
}), object({ success: literal(true) }), {
|
|
40208
|
+
kind: "mutation",
|
|
40209
|
+
auth: "admin",
|
|
40210
|
+
access: "create"
|
|
40211
|
+
}), method(ExternalIdentityKeySchema.extend({ userId: string() }), object({ success: boolean() }), {
|
|
40212
|
+
kind: "mutation",
|
|
40213
|
+
auth: "admin",
|
|
40214
|
+
access: "delete"
|
|
40215
|
+
}), method(_void(), array(OauthSessionSummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: boolean() }), {
|
|
39558
40216
|
kind: "mutation",
|
|
39559
40217
|
auth: "admin",
|
|
39560
40218
|
access: "delete"
|
|
@@ -40256,6 +40914,16 @@ var zoneRulesCapability = {
|
|
|
40256
40914
|
durability: "restored"
|
|
40257
40915
|
};
|
|
40258
40916
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
40917
|
+
Object.freeze({
|
|
40918
|
+
person: .5,
|
|
40919
|
+
vehicle: .5,
|
|
40920
|
+
animal: .5
|
|
40921
|
+
});
|
|
40922
|
+
Object.freeze({
|
|
40923
|
+
person: .65,
|
|
40924
|
+
vehicle: .65,
|
|
40925
|
+
animal: .65
|
|
40926
|
+
});
|
|
40259
40927
|
/**
|
|
40260
40928
|
* Accessory device helpers — shared across drivers.
|
|
40261
40929
|
*
|
|
@@ -41954,6 +42622,12 @@ Object.freeze({
|
|
|
41954
42622
|
addonId: null,
|
|
41955
42623
|
access: "view"
|
|
41956
42624
|
},
|
|
42625
|
+
"addons.listInstallations": {
|
|
42626
|
+
capName: "addons",
|
|
42627
|
+
capScope: "system",
|
|
42628
|
+
addonId: null,
|
|
42629
|
+
access: "view"
|
|
42630
|
+
},
|
|
41957
42631
|
"addons.listJobs": {
|
|
41958
42632
|
capName: "addons",
|
|
41959
42633
|
capScope: "system",
|
|
@@ -43136,90 +43810,18 @@ Object.freeze({
|
|
|
43136
43810
|
addonId: null,
|
|
43137
43811
|
access: "create"
|
|
43138
43812
|
},
|
|
43139
|
-
"decoder.createSession": {
|
|
43140
|
-
capName: "decoder",
|
|
43141
|
-
capScope: "system",
|
|
43142
|
-
addonId: null,
|
|
43143
|
-
access: "view"
|
|
43144
|
-
},
|
|
43145
|
-
"decoder.destroySession": {
|
|
43146
|
-
capName: "decoder",
|
|
43147
|
-
capScope: "system",
|
|
43148
|
-
addonId: null,
|
|
43149
|
-
access: "delete"
|
|
43150
|
-
},
|
|
43151
|
-
"decoder.getFrame": {
|
|
43152
|
-
capName: "decoder",
|
|
43153
|
-
capScope: "system",
|
|
43154
|
-
addonId: null,
|
|
43155
|
-
access: "view"
|
|
43156
|
-
},
|
|
43157
43813
|
"decoder.getInfo": {
|
|
43158
43814
|
capName: "decoder",
|
|
43159
43815
|
capScope: "system",
|
|
43160
43816
|
addonId: null,
|
|
43161
43817
|
access: "view"
|
|
43162
43818
|
},
|
|
43163
|
-
"decoder.getShmStats": {
|
|
43164
|
-
capName: "decoder",
|
|
43165
|
-
capScope: "system",
|
|
43166
|
-
addonId: null,
|
|
43167
|
-
access: "view"
|
|
43168
|
-
},
|
|
43169
|
-
"decoder.getStats": {
|
|
43170
|
-
capName: "decoder",
|
|
43171
|
-
capScope: "system",
|
|
43172
|
-
addonId: null,
|
|
43173
|
-
access: "view"
|
|
43174
|
-
},
|
|
43175
|
-
"decoder.listActiveSessions": {
|
|
43176
|
-
capName: "decoder",
|
|
43177
|
-
capScope: "system",
|
|
43178
|
-
addonId: null,
|
|
43179
|
-
access: "view"
|
|
43180
|
-
},
|
|
43181
|
-
"decoder.openStream": {
|
|
43182
|
-
capName: "decoder",
|
|
43183
|
-
capScope: "system",
|
|
43184
|
-
addonId: null,
|
|
43185
|
-
access: "view"
|
|
43186
|
-
},
|
|
43187
|
-
"decoder.pullFrames": {
|
|
43188
|
-
capName: "decoder",
|
|
43189
|
-
capScope: "system",
|
|
43190
|
-
addonId: null,
|
|
43191
|
-
access: "view"
|
|
43192
|
-
},
|
|
43193
|
-
"decoder.pullHandles": {
|
|
43194
|
-
capName: "decoder",
|
|
43195
|
-
capScope: "system",
|
|
43196
|
-
addonId: null,
|
|
43197
|
-
access: "view"
|
|
43198
|
-
},
|
|
43199
|
-
"decoder.pushPacket": {
|
|
43200
|
-
capName: "decoder",
|
|
43201
|
-
capScope: "system",
|
|
43202
|
-
addonId: null,
|
|
43203
|
-
access: "view"
|
|
43204
|
-
},
|
|
43205
43819
|
"decoder.reprobeHwaccel": {
|
|
43206
43820
|
capName: "decoder",
|
|
43207
43821
|
capScope: "system",
|
|
43208
43822
|
addonId: null,
|
|
43209
43823
|
access: "create"
|
|
43210
43824
|
},
|
|
43211
|
-
"decoder.supportsCodec": {
|
|
43212
|
-
capName: "decoder",
|
|
43213
|
-
capScope: "system",
|
|
43214
|
-
addonId: null,
|
|
43215
|
-
access: "view"
|
|
43216
|
-
},
|
|
43217
|
-
"decoder.updateConfig": {
|
|
43218
|
-
capName: "decoder",
|
|
43219
|
-
capScope: "system",
|
|
43220
|
-
addonId: null,
|
|
43221
|
-
access: "view"
|
|
43222
|
-
},
|
|
43223
43825
|
"detectionPipeline.applyDeviceSettingsPatch": {
|
|
43224
43826
|
capName: "detection-pipeline",
|
|
43225
43827
|
capScope: "device",
|
|
@@ -44708,12 +45310,24 @@ Object.freeze({
|
|
|
44708
45310
|
addonId: null,
|
|
44709
45311
|
access: "view"
|
|
44710
45312
|
},
|
|
45313
|
+
"localNetwork.addCustomAddress": {
|
|
45314
|
+
capName: "local-network",
|
|
45315
|
+
capScope: "system",
|
|
45316
|
+
addonId: null,
|
|
45317
|
+
access: "create"
|
|
45318
|
+
},
|
|
44711
45319
|
"localNetwork.downloadCa": {
|
|
44712
45320
|
capName: "local-network",
|
|
44713
45321
|
capScope: "system",
|
|
44714
45322
|
addonId: null,
|
|
44715
45323
|
access: "view"
|
|
44716
45324
|
},
|
|
45325
|
+
"localNetwork.getAddresses": {
|
|
45326
|
+
capName: "local-network",
|
|
45327
|
+
capScope: "system",
|
|
45328
|
+
addonId: null,
|
|
45329
|
+
access: "view"
|
|
45330
|
+
},
|
|
44717
45331
|
"localNetwork.getAllowedAddresses": {
|
|
44718
45332
|
capName: "local-network",
|
|
44719
45333
|
capScope: "system",
|
|
@@ -44726,6 +45340,12 @@ Object.freeze({
|
|
|
44726
45340
|
addonId: null,
|
|
44727
45341
|
access: "view"
|
|
44728
45342
|
},
|
|
45343
|
+
"localNetwork.getHubAddresses": {
|
|
45344
|
+
capName: "local-network",
|
|
45345
|
+
capScope: "system",
|
|
45346
|
+
addonId: null,
|
|
45347
|
+
access: "view"
|
|
45348
|
+
},
|
|
44729
45349
|
"localNetwork.getNotificationEndpoint": {
|
|
44730
45350
|
capName: "local-network",
|
|
44731
45351
|
capScope: "system",
|
|
@@ -44762,6 +45382,12 @@ Object.freeze({
|
|
|
44762
45382
|
addonId: null,
|
|
44763
45383
|
access: "create"
|
|
44764
45384
|
},
|
|
45385
|
+
"localNetwork.removeCustomAddress": {
|
|
45386
|
+
capName: "local-network",
|
|
45387
|
+
capScope: "system",
|
|
45388
|
+
addonId: null,
|
|
45389
|
+
access: "delete"
|
|
45390
|
+
},
|
|
44765
45391
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
44766
45392
|
capName: "local-network",
|
|
44767
45393
|
capScope: "system",
|
|
@@ -44774,6 +45400,12 @@ Object.freeze({
|
|
|
44774
45400
|
addonId: null,
|
|
44775
45401
|
access: "create"
|
|
44776
45402
|
},
|
|
45403
|
+
"localNetwork.setAddressRole": {
|
|
45404
|
+
capName: "local-network",
|
|
45405
|
+
capScope: "system",
|
|
45406
|
+
addonId: null,
|
|
45407
|
+
access: "create"
|
|
45408
|
+
},
|
|
44777
45409
|
"localNetwork.setAllowedAddresses": {
|
|
44778
45410
|
capName: "local-network",
|
|
44779
45411
|
capScope: "system",
|
|
@@ -46220,6 +46852,12 @@ Object.freeze({
|
|
|
46220
46852
|
addonId: null,
|
|
46221
46853
|
access: "create"
|
|
46222
46854
|
},
|
|
46855
|
+
"pipelineAnalytics.setRetrainFrameComplete": {
|
|
46856
|
+
capName: "pipeline-analytics",
|
|
46857
|
+
capScope: "device",
|
|
46858
|
+
addonId: null,
|
|
46859
|
+
access: "create"
|
|
46860
|
+
},
|
|
46223
46861
|
"pipelineAnalytics.setTrackFlags": {
|
|
46224
46862
|
capName: "pipeline-analytics",
|
|
46225
46863
|
capScope: "device",
|
|
@@ -46256,6 +46894,12 @@ Object.freeze({
|
|
|
46256
46894
|
addonId: null,
|
|
46257
46895
|
access: "delete"
|
|
46258
46896
|
},
|
|
46897
|
+
"pipelineAnalytics.writeRetrainArchive": {
|
|
46898
|
+
capName: "pipeline-analytics",
|
|
46899
|
+
capScope: "device",
|
|
46900
|
+
addonId: null,
|
|
46901
|
+
access: "create"
|
|
46902
|
+
},
|
|
46259
46903
|
"pipelineExecutor.cacheFrameInPool": {
|
|
46260
46904
|
capName: "pipeline-executor",
|
|
46261
46905
|
capScope: "system",
|
|
@@ -46268,13 +46912,13 @@ Object.freeze({
|
|
|
46268
46912
|
addonId: null,
|
|
46269
46913
|
access: "delete"
|
|
46270
46914
|
},
|
|
46271
|
-
"pipelineExecutor.
|
|
46915
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
46272
46916
|
capName: "pipeline-executor",
|
|
46273
46917
|
capScope: "system",
|
|
46274
46918
|
addonId: null,
|
|
46275
46919
|
access: "delete"
|
|
46276
46920
|
},
|
|
46277
|
-
"pipelineExecutor.
|
|
46921
|
+
"pipelineExecutor.deleteModel": {
|
|
46278
46922
|
capName: "pipeline-executor",
|
|
46279
46923
|
capScope: "system",
|
|
46280
46924
|
addonId: null,
|
|
@@ -46418,12 +47062,6 @@ Object.freeze({
|
|
|
46418
47062
|
addonId: null,
|
|
46419
47063
|
access: "view"
|
|
46420
47064
|
},
|
|
46421
|
-
"pipelineExecutor.listTemplates": {
|
|
46422
|
-
capName: "pipeline-executor",
|
|
46423
|
-
capScope: "system",
|
|
46424
|
-
addonId: null,
|
|
46425
|
-
access: "view"
|
|
46426
|
-
},
|
|
46427
47065
|
"pipelineExecutor.rearmInferenceDevice": {
|
|
46428
47066
|
capName: "pipeline-executor",
|
|
46429
47067
|
capScope: "system",
|
|
@@ -46448,12 +47086,6 @@ Object.freeze({
|
|
|
46448
47086
|
addonId: null,
|
|
46449
47087
|
access: "create"
|
|
46450
47088
|
},
|
|
46451
|
-
"pipelineExecutor.saveTemplate": {
|
|
46452
|
-
capName: "pipeline-executor",
|
|
46453
|
-
capScope: "system",
|
|
46454
|
-
addonId: null,
|
|
46455
|
-
access: "create"
|
|
46456
|
-
},
|
|
46457
47089
|
"pipelineExecutor.setVideoPipelineSteps": {
|
|
46458
47090
|
capName: "pipeline-executor",
|
|
46459
47091
|
capScope: "system",
|
|
@@ -46472,41 +47104,35 @@ Object.freeze({
|
|
|
46472
47104
|
addonId: null,
|
|
46473
47105
|
access: "create"
|
|
46474
47106
|
},
|
|
46475
|
-
"pipelineExecutor.updateTemplate": {
|
|
46476
|
-
capName: "pipeline-executor",
|
|
46477
|
-
capScope: "system",
|
|
46478
|
-
addonId: null,
|
|
46479
|
-
access: "create"
|
|
46480
|
-
},
|
|
46481
47107
|
"pipelineExecutor.validatePipeline": {
|
|
46482
47108
|
capName: "pipeline-executor",
|
|
46483
47109
|
capScope: "system",
|
|
46484
47110
|
addonId: null,
|
|
46485
47111
|
access: "view"
|
|
46486
47112
|
},
|
|
46487
|
-
"pipelineOrchestrator.
|
|
47113
|
+
"pipelineOrchestrator.applyAutoTune": {
|
|
46488
47114
|
capName: "pipeline-orchestrator",
|
|
46489
47115
|
capScope: "system",
|
|
46490
47116
|
addonId: null,
|
|
46491
47117
|
access: "create"
|
|
46492
47118
|
},
|
|
46493
|
-
"pipelineOrchestrator.
|
|
47119
|
+
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
46494
47120
|
capName: "pipeline-orchestrator",
|
|
46495
47121
|
capScope: "system",
|
|
46496
47122
|
addonId: null,
|
|
46497
47123
|
access: "create"
|
|
46498
47124
|
},
|
|
46499
|
-
"pipelineOrchestrator.
|
|
47125
|
+
"pipelineOrchestrator.assignAudio": {
|
|
46500
47126
|
capName: "pipeline-orchestrator",
|
|
46501
47127
|
capScope: "system",
|
|
46502
47128
|
addonId: null,
|
|
46503
47129
|
access: "create"
|
|
46504
47130
|
},
|
|
46505
|
-
"pipelineOrchestrator.
|
|
47131
|
+
"pipelineOrchestrator.assignPipeline": {
|
|
46506
47132
|
capName: "pipeline-orchestrator",
|
|
46507
47133
|
capScope: "system",
|
|
46508
47134
|
addonId: null,
|
|
46509
|
-
access: "
|
|
47135
|
+
access: "create"
|
|
46510
47136
|
},
|
|
46511
47137
|
"pipelineOrchestrator.getAgentLoad": {
|
|
46512
47138
|
capName: "pipeline-orchestrator",
|
|
@@ -46598,6 +47224,12 @@ Object.freeze({
|
|
|
46598
47224
|
addonId: null,
|
|
46599
47225
|
access: "view"
|
|
46600
47226
|
},
|
|
47227
|
+
"pipelineOrchestrator.getEffectiveShares": {
|
|
47228
|
+
capName: "pipeline-orchestrator",
|
|
47229
|
+
capScope: "system",
|
|
47230
|
+
addonId: null,
|
|
47231
|
+
access: "view"
|
|
47232
|
+
},
|
|
46601
47233
|
"pipelineOrchestrator.getGlobalMetrics": {
|
|
46602
47234
|
capName: "pipeline-orchestrator",
|
|
46603
47235
|
capScope: "system",
|
|
@@ -46634,19 +47266,19 @@ Object.freeze({
|
|
|
46634
47266
|
addonId: null,
|
|
46635
47267
|
access: "view"
|
|
46636
47268
|
},
|
|
46637
|
-
"pipelineOrchestrator.
|
|
47269
|
+
"pipelineOrchestrator.getPlacementStats": {
|
|
46638
47270
|
capName: "pipeline-orchestrator",
|
|
46639
47271
|
capScope: "system",
|
|
46640
47272
|
addonId: null,
|
|
46641
47273
|
access: "view"
|
|
46642
47274
|
},
|
|
46643
|
-
"pipelineOrchestrator.
|
|
47275
|
+
"pipelineOrchestrator.getReconcileFromDiskStatus": {
|
|
46644
47276
|
capName: "pipeline-orchestrator",
|
|
46645
47277
|
capScope: "system",
|
|
46646
47278
|
addonId: null,
|
|
46647
47279
|
access: "view"
|
|
46648
47280
|
},
|
|
46649
|
-
"pipelineOrchestrator.
|
|
47281
|
+
"pipelineOrchestrator.listAgentSettings": {
|
|
46650
47282
|
capName: "pipeline-orchestrator",
|
|
46651
47283
|
capScope: "system",
|
|
46652
47284
|
addonId: null,
|
|
@@ -46658,6 +47290,12 @@ Object.freeze({
|
|
|
46658
47290
|
addonId: null,
|
|
46659
47291
|
access: "create"
|
|
46660
47292
|
},
|
|
47293
|
+
"pipelineOrchestrator.planAutoTune": {
|
|
47294
|
+
capName: "pipeline-orchestrator",
|
|
47295
|
+
capScope: "system",
|
|
47296
|
+
addonId: null,
|
|
47297
|
+
access: "view"
|
|
47298
|
+
},
|
|
46661
47299
|
"pipelineOrchestrator.rebalance": {
|
|
46662
47300
|
capName: "pipeline-orchestrator",
|
|
46663
47301
|
capScope: "system",
|
|
@@ -46700,12 +47338,6 @@ Object.freeze({
|
|
|
46700
47338
|
addonId: null,
|
|
46701
47339
|
access: "create"
|
|
46702
47340
|
},
|
|
46703
|
-
"pipelineOrchestrator.saveTemplate": {
|
|
46704
|
-
capName: "pipeline-orchestrator",
|
|
46705
|
-
capScope: "system",
|
|
46706
|
-
addonId: null,
|
|
46707
|
-
access: "create"
|
|
46708
|
-
},
|
|
46709
47341
|
"pipelineOrchestrator.setAgentCapabilities": {
|
|
46710
47342
|
capName: "pipeline-orchestrator",
|
|
46711
47343
|
capScope: "system",
|
|
@@ -46718,12 +47350,6 @@ Object.freeze({
|
|
|
46718
47350
|
addonId: null,
|
|
46719
47351
|
access: "create"
|
|
46720
47352
|
},
|
|
46721
|
-
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
46722
|
-
capName: "pipeline-orchestrator",
|
|
46723
|
-
capScope: "system",
|
|
46724
|
-
addonId: null,
|
|
46725
|
-
access: "create"
|
|
46726
|
-
},
|
|
46727
47353
|
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
46728
47354
|
capName: "pipeline-orchestrator",
|
|
46729
47355
|
capScope: "system",
|
|
@@ -46760,6 +47386,12 @@ Object.freeze({
|
|
|
46760
47386
|
addonId: null,
|
|
46761
47387
|
access: "create"
|
|
46762
47388
|
},
|
|
47389
|
+
"pipelineOrchestrator.setCameraStepSettings": {
|
|
47390
|
+
capName: "pipeline-orchestrator",
|
|
47391
|
+
capScope: "system",
|
|
47392
|
+
addonId: null,
|
|
47393
|
+
access: "create"
|
|
47394
|
+
},
|
|
46763
47395
|
"pipelineOrchestrator.setCameraStepToggle": {
|
|
46764
47396
|
capName: "pipeline-orchestrator",
|
|
46765
47397
|
capScope: "system",
|
|
@@ -46778,25 +47410,37 @@ Object.freeze({
|
|
|
46778
47410
|
addonId: null,
|
|
46779
47411
|
access: "create"
|
|
46780
47412
|
},
|
|
47413
|
+
"pipelineOrchestrator.setLoadBalancingShares": {
|
|
47414
|
+
capName: "pipeline-orchestrator",
|
|
47415
|
+
capScope: "system",
|
|
47416
|
+
addonId: null,
|
|
47417
|
+
access: "create"
|
|
47418
|
+
},
|
|
46781
47419
|
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
46782
47420
|
capName: "pipeline-orchestrator",
|
|
46783
47421
|
capScope: "system",
|
|
46784
47422
|
addonId: null,
|
|
46785
47423
|
access: "create"
|
|
46786
47424
|
},
|
|
46787
|
-
"pipelineOrchestrator.
|
|
47425
|
+
"pipelineOrchestrator.setShareSource": {
|
|
46788
47426
|
capName: "pipeline-orchestrator",
|
|
46789
47427
|
capScope: "system",
|
|
46790
47428
|
addonId: null,
|
|
46791
47429
|
access: "create"
|
|
46792
47430
|
},
|
|
46793
|
-
"pipelineOrchestrator.
|
|
47431
|
+
"pipelineOrchestrator.suggestShares": {
|
|
47432
|
+
capName: "pipeline-orchestrator",
|
|
47433
|
+
capScope: "system",
|
|
47434
|
+
addonId: null,
|
|
47435
|
+
access: "view"
|
|
47436
|
+
},
|
|
47437
|
+
"pipelineOrchestrator.unassignAudio": {
|
|
46794
47438
|
capName: "pipeline-orchestrator",
|
|
46795
47439
|
capScope: "system",
|
|
46796
47440
|
addonId: null,
|
|
46797
47441
|
access: "create"
|
|
46798
47442
|
},
|
|
46799
|
-
"pipelineOrchestrator.
|
|
47443
|
+
"pipelineOrchestrator.unassignPipeline": {
|
|
46800
47444
|
capName: "pipeline-orchestrator",
|
|
46801
47445
|
capScope: "system",
|
|
46802
47446
|
addonId: null,
|
|
@@ -48236,12 +48880,6 @@ Object.freeze({
|
|
|
48236
48880
|
addonId: null,
|
|
48237
48881
|
access: "view"
|
|
48238
48882
|
},
|
|
48239
|
-
"streamBroker.pullFrameHandles": {
|
|
48240
|
-
capName: "stream-broker",
|
|
48241
|
-
capScope: "system",
|
|
48242
|
-
addonId: null,
|
|
48243
|
-
access: "view"
|
|
48244
|
-
},
|
|
48245
48883
|
"streamBroker.regenerateRtspToken": {
|
|
48246
48884
|
capName: "stream-broker",
|
|
48247
48885
|
capScope: "system",
|
|
@@ -48308,12 +48946,6 @@ Object.freeze({
|
|
|
48308
48946
|
addonId: null,
|
|
48309
48947
|
access: "create"
|
|
48310
48948
|
},
|
|
48311
|
-
"streamBroker.subscribeFrames": {
|
|
48312
|
-
capName: "stream-broker",
|
|
48313
|
-
capScope: "system",
|
|
48314
|
-
addonId: null,
|
|
48315
|
-
access: "create"
|
|
48316
|
-
},
|
|
48317
48949
|
"streamBroker.unassignProfile": {
|
|
48318
48950
|
capName: "stream-broker",
|
|
48319
48951
|
capScope: "system",
|
|
@@ -48326,12 +48958,6 @@ Object.freeze({
|
|
|
48326
48958
|
addonId: null,
|
|
48327
48959
|
access: "create"
|
|
48328
48960
|
},
|
|
48329
|
-
"streamBroker.unsubscribeFrames": {
|
|
48330
|
-
capName: "stream-broker",
|
|
48331
|
-
capScope: "system",
|
|
48332
|
-
addonId: null,
|
|
48333
|
-
access: "create"
|
|
48334
|
-
},
|
|
48335
48961
|
"streamCatalog.getCatalog": {
|
|
48336
48962
|
capName: "stream-catalog",
|
|
48337
48963
|
capScope: "device",
|
|
@@ -48626,18 +49252,36 @@ Object.freeze({
|
|
|
48626
49252
|
addonId: null,
|
|
48627
49253
|
access: "delete"
|
|
48628
49254
|
},
|
|
49255
|
+
"userManagement.findUserByExternalIdentity": {
|
|
49256
|
+
capName: "user-management",
|
|
49257
|
+
capScope: "system",
|
|
49258
|
+
addonId: null,
|
|
49259
|
+
access: "view"
|
|
49260
|
+
},
|
|
48629
49261
|
"userManagement.getTotpStatus": {
|
|
48630
49262
|
capName: "user-management",
|
|
48631
49263
|
capScope: "system",
|
|
48632
49264
|
addonId: null,
|
|
48633
49265
|
access: "view"
|
|
48634
49266
|
},
|
|
49267
|
+
"userManagement.linkExternalIdentity": {
|
|
49268
|
+
capName: "user-management",
|
|
49269
|
+
capScope: "system",
|
|
49270
|
+
addonId: null,
|
|
49271
|
+
access: "create"
|
|
49272
|
+
},
|
|
48635
49273
|
"userManagement.listApiKeys": {
|
|
48636
49274
|
capName: "user-management",
|
|
48637
49275
|
capScope: "system",
|
|
48638
49276
|
addonId: null,
|
|
48639
49277
|
access: "view"
|
|
48640
49278
|
},
|
|
49279
|
+
"userManagement.listExternalIdentities": {
|
|
49280
|
+
capName: "user-management",
|
|
49281
|
+
capScope: "system",
|
|
49282
|
+
addonId: null,
|
|
49283
|
+
access: "view"
|
|
49284
|
+
},
|
|
48641
49285
|
"userManagement.listOauthSessions": {
|
|
48642
49286
|
capName: "user-management",
|
|
48643
49287
|
capScope: "system",
|
|
@@ -48716,6 +49360,12 @@ Object.freeze({
|
|
|
48716
49360
|
addonId: null,
|
|
48717
49361
|
access: "create"
|
|
48718
49362
|
},
|
|
49363
|
+
"userManagement.unlinkExternalIdentity": {
|
|
49364
|
+
capName: "user-management",
|
|
49365
|
+
capScope: "system",
|
|
49366
|
+
addonId: null,
|
|
49367
|
+
access: "delete"
|
|
49368
|
+
},
|
|
48719
49369
|
"userManagement.updateUser": {
|
|
48720
49370
|
capName: "user-management",
|
|
48721
49371
|
capScope: "system",
|
|
@@ -49028,6 +49678,12 @@ Object.freeze({
|
|
|
49028
49678
|
addonId: null,
|
|
49029
49679
|
access: "create"
|
|
49030
49680
|
},
|
|
49681
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
49682
|
+
capName: "webrtc-session",
|
|
49683
|
+
capScope: "device",
|
|
49684
|
+
addonId: null,
|
|
49685
|
+
access: "create"
|
|
49686
|
+
},
|
|
49031
49687
|
"webrtcSession.closeSession": {
|
|
49032
49688
|
capName: "webrtc-session",
|
|
49033
49689
|
capScope: "device",
|
|
@@ -51045,11 +51701,6 @@ Object.freeze({
|
|
|
51045
51701
|
form: "single",
|
|
51046
51702
|
optional: false
|
|
51047
51703
|
}],
|
|
51048
|
-
"decoder.createSession": [{
|
|
51049
|
-
name: "deviceId",
|
|
51050
|
-
form: "single",
|
|
51051
|
-
optional: true
|
|
51052
|
-
}],
|
|
51053
51704
|
"detectionPipeline.applyDeviceSettingsPatch": [{
|
|
51054
51705
|
name: "deviceId",
|
|
51055
51706
|
form: "single",
|
|
@@ -52260,6 +52911,11 @@ Object.freeze({
|
|
|
52260
52911
|
form: "single",
|
|
52261
52912
|
optional: false
|
|
52262
52913
|
}],
|
|
52914
|
+
"pipelineAnalytics.setRetrainFrameComplete": [{
|
|
52915
|
+
name: "deviceId",
|
|
52916
|
+
form: "single",
|
|
52917
|
+
optional: false
|
|
52918
|
+
}],
|
|
52263
52919
|
"pipelineAnalytics.setTrackFlags": [{
|
|
52264
52920
|
name: "deviceId",
|
|
52265
52921
|
form: "single",
|
|
@@ -52280,6 +52936,11 @@ Object.freeze({
|
|
|
52280
52936
|
form: "single",
|
|
52281
52937
|
optional: false
|
|
52282
52938
|
}],
|
|
52939
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
52940
|
+
name: "deviceIds",
|
|
52941
|
+
form: "array",
|
|
52942
|
+
optional: true
|
|
52943
|
+
}],
|
|
52283
52944
|
"pipelineExecutor.runPipeline": [{
|
|
52284
52945
|
name: "deviceId",
|
|
52285
52946
|
form: "single",
|
|
@@ -52385,6 +53046,11 @@ Object.freeze({
|
|
|
52385
53046
|
form: "single",
|
|
52386
53047
|
optional: false
|
|
52387
53048
|
}],
|
|
53049
|
+
"pipelineOrchestrator.setCameraStepSettings": [{
|
|
53050
|
+
name: "deviceId",
|
|
53051
|
+
form: "single",
|
|
53052
|
+
optional: false
|
|
53053
|
+
}],
|
|
52388
53054
|
"pipelineOrchestrator.setCameraStepToggle": [{
|
|
52389
53055
|
name: "deviceId",
|
|
52390
53056
|
form: "single",
|
|
@@ -53156,6 +53822,11 @@ Object.freeze({
|
|
|
53156
53822
|
form: "single",
|
|
53157
53823
|
optional: false
|
|
53158
53824
|
}],
|
|
53825
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
53826
|
+
name: "deviceId",
|
|
53827
|
+
form: "single",
|
|
53828
|
+
optional: false
|
|
53829
|
+
}],
|
|
53159
53830
|
"webrtcSession.closeSession": [{
|
|
53160
53831
|
name: "deviceId",
|
|
53161
53832
|
form: "single",
|
|
@@ -53385,6 +54056,8 @@ new Map(Object.entries({
|
|
|
53385
54056
|
"detection-blind": "device-events",
|
|
53386
54057
|
"node-online": "system",
|
|
53387
54058
|
"node-offline": "system",
|
|
54059
|
+
"node-restarting": "system",
|
|
54060
|
+
"node-updating": "system",
|
|
53388
54061
|
"node-inference-unavailable": "system",
|
|
53389
54062
|
"addon-crash-loop": "system",
|
|
53390
54063
|
"addon-update-available": "system",
|
|
@@ -53462,6 +54135,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
53462
54135
|
kinds: [
|
|
53463
54136
|
"node-offline",
|
|
53464
54137
|
"node-online",
|
|
54138
|
+
"node-restarting",
|
|
53465
54139
|
"node-inference-unavailable"
|
|
53466
54140
|
]
|
|
53467
54141
|
},
|
|
@@ -53483,6 +54157,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
53483
54157
|
label: "Server & container updates",
|
|
53484
54158
|
kinds: [
|
|
53485
54159
|
"server-update-available",
|
|
54160
|
+
"node-updating",
|
|
53486
54161
|
"server-updated",
|
|
53487
54162
|
"wrapper-update-available"
|
|
53488
54163
|
]
|
|
@@ -53630,6 +54305,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53630
54305
|
kinds: [
|
|
53631
54306
|
"node-offline",
|
|
53632
54307
|
"node-online",
|
|
54308
|
+
"node-restarting",
|
|
53633
54309
|
"node-inference-unavailable"
|
|
53634
54310
|
]
|
|
53635
54311
|
},
|
|
@@ -53651,6 +54327,7 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
53651
54327
|
example: "server 1.2.377 → 1.2.378",
|
|
53652
54328
|
kinds: [
|
|
53653
54329
|
"server-update-available",
|
|
54330
|
+
"node-updating",
|
|
53654
54331
|
"server-updated",
|
|
53655
54332
|
"wrapper-update-available"
|
|
53656
54333
|
]
|
|
@@ -53683,7 +54360,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
53683
54360
|
{
|
|
53684
54361
|
name: "summarySection",
|
|
53685
54362
|
label: "Summary: this section",
|
|
53686
|
-
description: "The section a per-section summary row is about
|
|
54363
|
+
description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
|
|
53687
54364
|
example: "Batterie scariche",
|
|
53688
54365
|
group: "system",
|
|
53689
54366
|
families: ["rule"],
|
|
@@ -54106,10 +54783,9 @@ TimelapseRuleInputSchema.extend({
|
|
|
54106
54783
|
createdAt: number(),
|
|
54107
54784
|
updatedAt: number()
|
|
54108
54785
|
});
|
|
54109
|
-
async function
|
|
54110
|
-
let slice;
|
|
54786
|
+
async function readSlice(deviceState, deviceId) {
|
|
54111
54787
|
try {
|
|
54112
|
-
|
|
54788
|
+
return await deviceState.getCapSlice.query({
|
|
54113
54789
|
deviceId,
|
|
54114
54790
|
capName: "motion"
|
|
54115
54791
|
});
|
|
@@ -54117,10 +54793,44 @@ async function readHubMotionDetected(deviceState, deviceId) {
|
|
|
54117
54793
|
const reason = err instanceof Error ? err.message : String(err);
|
|
54118
54794
|
throw new Error(`motion state of device ${deviceId} is unreadable: ${reason}`, { cause: err });
|
|
54119
54795
|
}
|
|
54120
|
-
|
|
54796
|
+
}
|
|
54797
|
+
/**
|
|
54798
|
+
* The hub's `motion` slice as a `MotionStatus`, or `null` when nobody has
|
|
54799
|
+
* published it since the hub started. Throws when the hub does not answer or
|
|
54800
|
+
* the slice is malformed — never a made-up "no motion".
|
|
54801
|
+
*/
|
|
54802
|
+
async function readHubMotionStatus(deviceState, deviceId) {
|
|
54803
|
+
const slice = await readSlice(deviceState, deviceId);
|
|
54804
|
+
if (slice === null) return null;
|
|
54805
|
+
const parsed = MotionStatusSchema.safeParse(slice);
|
|
54806
|
+
if (!parsed.success) throw new Error(`motion state of device ${deviceId} is malformed on the hub: ${parsed.error.message}`);
|
|
54807
|
+
return parsed.data;
|
|
54808
|
+
}
|
|
54809
|
+
async function readHubMotionDetected(deviceState, deviceId) {
|
|
54810
|
+
const detected = (await readSlice(deviceState, deviceId))?.["detected"];
|
|
54121
54811
|
if (typeof detected !== "boolean") throw new Error(`motion state of device ${deviceId} is not published yet (unknown)`);
|
|
54122
54812
|
return detected;
|
|
54123
54813
|
}
|
|
54814
|
+
/**
|
|
54815
|
+
* The native `motion` provider of a camera whose slice the orchestrator writes
|
|
54816
|
+
* (D696): `isDetected` AND `getStatus`, both from the hub. `owner` names the
|
|
54817
|
+
* provider class in the deviceId-mismatch error.
|
|
54818
|
+
*/
|
|
54819
|
+
function hubMotionNativeProvider(deviceState, deviceId, owner) {
|
|
54820
|
+
const ownDevice = (asked) => {
|
|
54821
|
+
if (asked !== deviceId) throw new Error(`${owner}: motion deviceId mismatch, expected ${deviceId}, got ${asked}`);
|
|
54822
|
+
};
|
|
54823
|
+
return {
|
|
54824
|
+
isDetected: async ({ deviceId: asked }) => {
|
|
54825
|
+
ownDevice(asked);
|
|
54826
|
+
return readHubMotionDetected(deviceState, deviceId);
|
|
54827
|
+
},
|
|
54828
|
+
getStatus: async ({ deviceId: asked }) => {
|
|
54829
|
+
ownDevice(asked);
|
|
54830
|
+
return readHubMotionStatus(deviceState, deviceId);
|
|
54831
|
+
}
|
|
54832
|
+
};
|
|
54833
|
+
}
|
|
54124
54834
|
MotionOnMotionChangedDataSchema.omit({ triggeredBy: true });
|
|
54125
54835
|
function providerMotionEvent(source, data) {
|
|
54126
54836
|
return createEvent(EventCategory.ProviderMotion, source, data);
|
|
@@ -56248,7 +56958,7 @@ var amcrestCameraSchema = object({
|
|
|
56248
56958
|
port: number().int().min(1).max(65535).default(80).describe("HTTP CGI port"),
|
|
56249
56959
|
https: boolean().default(false).describe("Use HTTPS for CGI"),
|
|
56250
56960
|
username: string().default("admin").describe("Username"),
|
|
56251
|
-
password: string().default("").describe("Password"),
|
|
56961
|
+
password: string().default("").describe("Password").meta({ secret: true }),
|
|
56252
56962
|
channel: number().int().min(1).default(1).describe("Camera channel (1-based)"),
|
|
56253
56963
|
deviceCache: amcrestDeviceCacheSchema.optional()
|
|
56254
56964
|
});
|
|
@@ -56494,14 +57204,12 @@ var AmcrestCamera = class AmcrestCamera extends BaseDevice {
|
|
|
56494
57204
|
}
|
|
56495
57205
|
/** Register the native `motion` cap. Its mere presence (a `kind:'native'`
|
|
56496
57206
|
* `motion` binding) is what the orchestrator reads to default a
|
|
56497
|
-
* freshly-adopted camera to `motionSources:['onboard']`. `isDetected`
|
|
56498
|
-
*
|
|
56499
|
-
*
|
|
57207
|
+
* freshly-adopted camera to `motionSources:['onboard']`. `isDetected` and
|
|
57208
|
+
* `getStatus` answer from the HUB's slice (`hubMotionNativeProvider`); an
|
|
57209
|
+
* unreadable hub fails both — never `false` for unknown (D49, D393). */
|
|
56500
57210
|
registerMotionCap() {
|
|
56501
|
-
this.ctx.
|
|
56502
|
-
|
|
56503
|
-
return readHubMotionDetected(this.ctx.api.deviceState, this.id);
|
|
56504
|
-
} });
|
|
57211
|
+
const provider = hubMotionNativeProvider(this.ctx.api.deviceState, this.id, "AmcrestCamera");
|
|
57212
|
+
this.ctx.registerNativeCap(motionCapability, provider);
|
|
56505
57213
|
this.ctx.logger.info("amcrest: motion cap registered", { tags: { deviceId: this.id } });
|
|
56506
57214
|
}
|
|
56507
57215
|
/** Reusable event-source identity for every emit on this device. */
|
|
@@ -59422,7 +60130,7 @@ function writeJpeg(res, bytes, headOnly) {
|
|
|
59422
60130
|
* Node-only (`node:child_process`), so it lives under `@camstack/types/node`.
|
|
59423
60131
|
*/
|
|
59424
60132
|
/** The detail a site refusing for want of a binary puts in its refusal. */
|
|
59425
|
-
var NO_PINNED_FFMPEG_DETAIL = "no pinned ffmpeg on this node
|
|
60133
|
+
var NO_PINNED_FFMPEG_DETAIL = "no pinned ffmpeg on this node";
|
|
59426
60134
|
/**
|
|
59427
60135
|
* {@link pinnedFfmpegSpawner}, asked at the point of use through the node's
|
|
59428
60136
|
* resolver (`memoizePinnedFfmpeg`). A site that keeps the RESOLVER rather than
|