@camstack/addon-pipeline 1.2.341 → 1.2.343

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.
Files changed (35) hide show
  1. package/dist/audio-analyzer/index.js +5 -4
  2. package/dist/audio-analyzer/index.mjs +5 -4
  3. package/dist/{custom-model-catalog-CoJEC8nz.js → custom-model-catalog-CC8vgYZ8.js} +3 -3
  4. package/dist/{custom-model-catalog-DNSmyZTT.mjs → custom-model-catalog-m7EBV9wu.mjs} +3 -3
  5. package/dist/detection-pipeline/index.js +4 -118
  6. package/dist/detection-pipeline/index.mjs +4 -118
  7. package/dist/{dist-B8oPeJDI.mjs → dist-BAHBDujp.mjs} +257 -654
  8. package/dist/{dist-PiNPe8uQ.js → dist-BwipY6K1.js} +256 -659
  9. package/dist/{model-catalogs-RM3pkuZm.mjs → model-catalogs-CUU_L1ec.mjs} +1 -1
  10. package/dist/{model-catalogs-CEphd9Va.js → model-catalogs-Dotb1OFs.js} +1 -1
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-CMTBIa3-.js → node-BHYEkNaS.js} +1 -1
  14. package/dist/{node-DFUmMJ_f.mjs → node-BPwelwyj.mjs} +1 -1
  15. package/dist/pipeline-runner/index.js +11 -13
  16. package/dist/pipeline-runner/index.mjs +11 -13
  17. package/dist/{process-memory-CzAfDP9P.js → process-memory-BRCKXa-P.js} +1 -1
  18. package/dist/{process-memory-C4v8DBKn.mjs → process-memory-_8o1iZnL.mjs} +1 -1
  19. package/dist/recorder/index.js +14 -16
  20. package/dist/recorder/index.mjs +14 -16
  21. package/dist/{segment-demux-js-CIpCdbx4.mjs → segment-demux-js-DK8jbZy6.mjs} +1 -1
  22. package/dist/{segment-demux-js-C-n_ZsMK.js → segment-demux-js-DveVPFl9.js} +1 -1
  23. package/dist/stream-broker/_stub.js +48 -130
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CIDS0Tr9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CF-T-9YU.mjs} +3 -3
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BUfCTcDV.mjs +26 -0
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-uAQqU5lv.mjs +26 -0
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-CW_cmeNQ.mjs → hostInit-C6jr8fSt.mjs} +3 -3
  30. package/dist/stream-broker/index.js +49 -1693
  31. package/dist/stream-broker/index.mjs +54 -1696
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -6
  34. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BvfT5BVP.mjs +0 -26
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-LU_e-xJm.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  let node_crypto = require("node:crypto");
2
- //#region ../types/dist/event-category-BGmz_oxW.mjs
2
+ //#region ../types/dist/event-category-B_0XEcLF.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -500,15 +500,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
500
500
  EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
501
501
  EventCategory["AgentBackupActivated"] = "agent.backup.activated";
502
502
  EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
503
- /**
504
- * Per-agent hwaccel preference changed (user override set, cleared, or
505
- * re-probed). Observability event — decoders pull the current pref at
506
- * `createSession`, so running sessions keep their current backend until
507
- * they rotate naturally (camera add/remove, stream restart). Future
508
- * work can wire a listener in stream-broker that force-rotates live
509
- * sessions; for now this event powers logs + admin-UI toast feedback.
510
- */
511
- EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
512
503
  EventCategory["MotionAnalysis"] = "detection.motion-analysis";
513
504
  /** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
514
505
  EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
@@ -5379,7 +5370,7 @@ var ZodIssueCode = {
5379
5370
  var ZodFirstPartyTypeKind;
5380
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5372
  //#endregion
5382
- //#region ../types/dist/sleep-C16NCZR2.mjs
5373
+ //#region ../types/dist/sleep-BNeXenvr.mjs
5383
5374
  /**
5384
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5376
  * window to float samples (D455).
@@ -6857,32 +6848,12 @@ object({
6857
6848
  audioCodec: string().optional(),
6858
6849
  metadata: record(string(), unknown()).readonly().optional()
6859
6850
  });
6860
- var EncodedPacketSchema = object({
6861
- type: _enum(["video", "audio"]),
6862
- data: _instanceof(Uint8Array),
6863
- pts: number(),
6864
- dts: number(),
6865
- keyframe: boolean(),
6866
- codec: string()
6867
- });
6868
- var DecodedFrameSchema = object({
6869
- data: _instanceof(Uint8Array),
6870
- width: number(),
6871
- height: number(),
6872
- format: _enum([
6873
- "jpeg",
6874
- "rgb",
6875
- "bgr",
6876
- "yuv420",
6877
- "gray"
6878
- ]),
6879
- timestamp: number()
6880
- });
6881
6851
  /**
6882
6852
  * Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
6883
6853
  * frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
6884
- * interface in `interfaces/frame-handle.ts` field-for-field so a decoder cap
6885
- * method (`pullHandles`) can carry handles over tRPC / Moleculer.
6854
+ * interface in `interfaces/frame-handle.ts` field-for-field so a cap method
6855
+ * (the runner's native-crop and pipeline-executor inputs) can carry handles
6856
+ * over tRPC / Moleculer.
6886
6857
  *
6887
6858
  * The `satisfies` assertion below pins this schema to the interface: if a
6888
6859
  * field is added to / removed from `FrameHandle` without a matching schema
@@ -6908,50 +6879,6 @@ var FrameHandleSchema = object({
6908
6879
  slotCount: number().int().positive()
6909
6880
  });
6910
6881
  /**
6911
- * Pixel format a frame-handle subscriber can request from the broker
6912
- * (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
6913
- * `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
6914
- * `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
6915
- * payload, and no decoded-frame consumer requests it over the shm plane.
6916
- */
6917
- var FrameHandleFormatSchema = _enum([
6918
- "rgb",
6919
- "bgr",
6920
- "yuv420",
6921
- "gray"
6922
- ]);
6923
- /**
6924
- * Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
6925
- * broker for a `FrameHandle` stream of one `format`; the broker maintains one
6926
- * shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
6927
- * subscriber (motion) and an `rgb` subscriber (detection) each read the format
6928
- * they asked for with no broker-side conversion.
6929
- */
6930
- var SubscribeFramesInputSchema = object({
6931
- brokerId: string(),
6932
- format: FrameHandleFormatSchema,
6933
- /**
6934
- * Optional reader-side cadence hint in frames per second. The broker does
6935
- * NOT throttle — latest-wins ring reads drop frames implicitly for a slow
6936
- * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
6937
- * the consumer can pace its own `pullFrameHandles` polling.
6938
- */
6939
- maxFps: number().positive().optional(),
6940
- /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
6941
- tag: string().optional()
6942
- });
6943
- /**
6944
- * Result of `stream-broker.subscribeFrames`. The consumer then polls
6945
- * `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
6946
- * `FrameHandle` to a `FrameRingReader`.
6947
- */
6948
- var SubscribeFramesResultSchema = object({
6949
- /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
6950
- subscriptionId: string(),
6951
- /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
6952
- maxFps: number().nonnegative()
6953
- });
6954
- /**
6955
6882
  * Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
6956
6883
  * `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
6957
6884
  * sample bytes plus the track parameters a consumer needs to interpret them.
@@ -6959,8 +6886,8 @@ var SubscribeFramesResultSchema = object({
6959
6886
  * Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
6960
6887
  * Float32 PCM), so unlike video frames they ship their bytes INLINE over
6961
6888
  * tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
6962
- * (the wire-serialisable supertype of `Buffer`) to match `DecodedFrameSchema`
6963
- * / `EncodedPacketSchema`'s precedent; a `Buffer` is assignable to it.
6889
+ * (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
6890
+ * it.
6964
6891
  */
6965
6892
  var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
6966
6893
  var DecodedAudioChunkSchema = object({
@@ -6978,11 +6905,10 @@ var DecodedAudioChunkSchema = object({
6978
6905
  format: AudioChunkFormatSchema.optional()
6979
6906
  });
6980
6907
  /**
6981
- * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). The
6982
- * handle-free, ship-bytes-inline analogue of `subscribeFrames`: a consumer
6983
- * asks the broker for the decoded audio-chunk stream of one broker; the
6984
- * broker keeps a per-subscription bounded FIFO queue the consumer drains via
6985
- * `pullAudioChunks`.
6908
+ * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
6909
+ * its bytes inline: a consumer asks the broker for the decoded audio-chunk
6910
+ * stream of one broker; the broker keeps a per-subscription bounded FIFO queue
6911
+ * the consumer drains via `pullAudioChunks`.
6986
6912
  */
6987
6913
  var SubscribeAudioChunksInputSchema = object({
6988
6914
  brokerId: string(),
@@ -7013,9 +6939,7 @@ var BrokerStatsSchema = object({
7013
6939
  "stopped"
7014
6940
  ]),
7015
6941
  inputFps: number(),
7016
- decodeFps: number(),
7017
6942
  encodedSubscribers: number(),
7018
- decodedSubscribers: number(),
7019
6943
  uptimeMs: number(),
7020
6944
  bitrateKbps: number(),
7021
6945
  idrIntervalMs: number(),
@@ -7028,14 +6952,6 @@ var BrokerStatsSchema = object({
7028
6952
  preBufferMs: number(),
7029
6953
  preBufferPackets: number(),
7030
6954
  /**
7031
- * Moleculer node id of the decoder provider currently servicing this
7032
- * stream's decoded subscribers. `null` until the deferred decoder is
7033
- * created (no decoded clients yet, or codec not detected). Surfaces the
7034
- * runtime decoder placement so the UI can show "Decoder: <agent>" without
7035
- * a separate cap call per broker.
7036
- */
7037
- decoderNodeId: string().nullable(),
7038
- /**
7039
6955
  * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
7040
6956
  * when the stream has no audio track or the broker is in cold start.
7041
6957
  * `supported = false` means the codec was detected but the local
@@ -7356,26 +7272,6 @@ var BOOT_RECOVERY_BACKOFF_MS = [
7356
7272
  90 * 6e4
7357
7273
  ];
7358
7274
  /**
7359
- * Type-safe JSON parsing helpers.
7360
- *
7361
- * `JSON.parse` is typed as `any` in lib.es5.d.ts, which triggers
7362
- * `no-unsafe-*` ESLint rules and destroys downstream inference. These
7363
- * wrappers return `unknown` — callers narrow structurally via type
7364
- * guards, `typeof` checks, or helpers like `asRecord`/`asString`.
7365
- */
7366
- /**
7367
- * Parse JSON and return it as `unknown` — the only entry point for untrusted JSON.
7368
- *
7369
- * The optional generic overload `parseJsonUnknown<T>(text)` returns `T` for
7370
- * call sites that know the shape at parse time (e.g. MQTT payloads with a
7371
- * known protocol schema). This is a **type-level bridge only** — no runtime
7372
- * validation is performed. Callers that need runtime validation should parse
7373
- * as `unknown` and narrow via Zod or structural guards.
7374
- */
7375
- function parseJsonUnknown(text) {
7376
- return JSON.parse(text);
7377
- }
7378
- /**
7379
7275
  * Promise-based timer helpers — used everywhere the codebase needs to
7380
7276
  * wait, back off, or schedule a retry. Before these helpers landed, each
7381
7277
  * call site re-implemented `new Promise(r => setTimeout(r, ms))` inline,
@@ -12029,70 +11925,6 @@ var StorageLocationDeclarationSchema = object({
12029
11925
  "backup"
12030
11926
  ]).optional()
12031
11927
  });
12032
- var DecoderStatsSchema = object({
12033
- inputFps: number(),
12034
- outputFps: number(),
12035
- avgDecodeTimeMs: number(),
12036
- droppedFrames: number(),
12037
- /**
12038
- * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
12039
- * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
12040
- * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
12041
- * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
12042
- */
12043
- lagMs: number().optional(),
12044
- effectiveFps: number().optional(),
12045
- adaptiveFps: number().optional()
12046
- });
12047
- var DecoderSessionConfigSchema = object({
12048
- codec: string(),
12049
- maxFps: number().default(0),
12050
- outputFormat: _enum([
12051
- "jpeg",
12052
- "rgb",
12053
- "bgr",
12054
- "yuv420",
12055
- "gray"
12056
- ]).default("jpeg"),
12057
- scale: number().default(1),
12058
- width: number().optional(),
12059
- height: number().optional(),
12060
- /**
12061
- * Identifier of the camera this decoder session serves. Optional
12062
- * because the cap is generic (any caller could request decode), but
12063
- * stream-broker passes it so decoder logs include `deviceId` for
12064
- * per-camera filtering when diagnosing failures (e.g. node-av
12065
- * sendPacket errors on a single hung camera).
12066
- */
12067
- deviceId: number().int().nonnegative().optional(),
12068
- /**
12069
- * Free-form tag for log scoping. Stream-broker uses
12070
- * `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
12071
- * on every line so `grep tag=broker:5/high` filters one camera
12072
- * profile cleanly.
12073
- */
12074
- tag: string().optional(),
12075
- /**
12076
- * Where the session delivers decoded frames (Phase 5 / D9):
12077
- *
12078
- * - `'callback'` (default) — the legacy pixel path: decoded frames are
12079
- * buffered as `DecodedFrame`s and drained via `pullFrames`.
12080
- * - `'shm'` — the shared-memory frame plane: decoded frames are written
12081
- * into an OS shared-memory ring and drained as zero-pixel
12082
- * `FrameHandle`s via `pullHandles`. A session is one mode or the
12083
- * other — `pullFrames` returns nothing for an `'shm'` session and
12084
- * `pullHandles` returns nothing for a `'callback'` session.
12085
- */
12086
- frameSink: _enum(["callback", "shm"]).default("callback"),
12087
- /**
12088
- * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
12089
- * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
12090
- * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
12091
- * stream-broker's `streamingDebug` gate — off by default so production logs
12092
- * stay quiet and the emit path pays zero per-frame cost when disabled.
12093
- */
12094
- debug: boolean().optional()
12095
- });
12096
11928
  /**
12097
11929
  * Per-component log CHANNELS — the gate a hot path consults, and the registry
12098
11930
  * an addon declares its channels in.
@@ -15015,13 +14847,6 @@ var BrokerRtspClientSchema = object({
15015
14847
  lastRtpAt: number(),
15016
14848
  bytesSent: number()
15017
14849
  });
15018
- var BrokerDecodedClientSchema = object({
15019
- tag: string(),
15020
- subscribedAt: number(),
15021
- maxFps: number(),
15022
- framesDelivered: number(),
15023
- framesDropped: number()
15024
- });
15025
14850
  var BrokerAudioClientSchema = object({
15026
14851
  tag: string(),
15027
14852
  subscribedAt: number(),
@@ -15113,7 +14938,6 @@ var BrokerEncodedClientSchema = object({
15113
14938
  });
15114
14939
  var BrokerClientsSchema = object({
15115
14940
  rtsp: array(BrokerRtspClientSchema).readonly(),
15116
- decoded: array(BrokerDecodedClientSchema).readonly(),
15117
14941
  audio: array(BrokerAudioClientSchema).readonly(),
15118
14942
  encoded: array(BrokerEncodedClientSchema).readonly(),
15119
14943
  pipeClients: number(),
@@ -15605,11 +15429,7 @@ var streamBrokerCapability = {
15605
15429
  listClients: method(object({ brokerId: string() }), BrokerClientsSchema),
15606
15430
  killClient: method(object({
15607
15431
  brokerId: string(),
15608
- channel: _enum([
15609
- "rtsp",
15610
- "decoded",
15611
- "audio"
15612
- ]),
15432
+ channel: _enum(["rtsp", "audio"]),
15613
15433
  handle: string()
15614
15434
  }), object({ killed: boolean() }), {
15615
15435
  kind: "mutation",
@@ -15708,31 +15528,6 @@ var streamBrokerCapability = {
15708
15528
  maxCount: number().int().positive().default(8)
15709
15529
  }), array(DecodedAudioChunkSchema).readonly()),
15710
15530
  unsubscribeAudioChunks: method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }),
15711
- /**
15712
- * ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────
15713
- *
15714
- * The handle-based replacement for the live-object `IStreamBroker.
15715
- * onDecodedFrame` callback path. A consumer:
15716
- *
15717
- * 1. `subscribeFrames({ brokerId, format })` — the broker spins up
15718
- * (or reuses) a `frameSink: 'shm'` decoder session producing that
15719
- * `format` and returns a `subscriptionId`.
15720
- * 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains
15721
- * zero-pixel `FrameHandle[]`; each handle is fed to a
15722
- * `FrameRingReader` that opens the named shm segment and reads the
15723
- * pixels back zero-copy.
15724
- * 3. `unsubscribeFrames({ subscriptionId })` on teardown.
15725
- *
15726
- * The broker keeps one shm ring per `(brokerId, format)` actually
15727
- * requested — no broker-side `sharp` conversion. fps throttling is
15728
- * implicit (latest-wins ring reads drop frames for a slow consumer).
15729
- */
15730
- subscribeFrames: method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }),
15731
- pullFrameHandles: method(object({
15732
- subscriptionId: string(),
15733
- maxCount: number().int().positive().default(4)
15734
- }), array(FrameHandleSchema).readonly()),
15735
- unsubscribeFrames: method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }),
15736
15531
  setPreBufferDuration: method(object({
15737
15532
  brokerId: string(),
15738
15533
  seconds: number().min(0).max(30)
@@ -17035,54 +16830,12 @@ id: union([string(), number()]) }), {
17035
16830
  kind: "mutation",
17036
16831
  auth: "admin"
17037
16832
  });
17038
- /**
17039
- * shm ring usage stats for a `frameSink: 'shm'` decoder session —
17040
- * exposed via `decoder.getShmStats` so downstream consumers can
17041
- * observe ring pressure (slot count, byte budget, hit/miss ratio).
17042
- */
17043
- var ShmRingStatsSchema = object({
17044
- sessionId: string(),
17045
- slotCount: number().int(),
17046
- slotByteLength: number().int(),
17047
- segmentBytes: number().int(),
17048
- budgetMb: number().int(),
17049
- framesWritten: number().int(),
17050
- getFrameHits: number().int(),
17051
- getFrameMisses: number().int()
17052
- });
17053
- method(object({ codec: string() }), boolean()), method(_void(), object({
16833
+ method(_void(), object({
17054
16834
  id: string(),
17055
16835
  name: string(),
17056
- isPullMode: boolean().optional(),
17057
- priority: number().optional(),
17058
16836
  hwaccel: string().optional(),
17059
16837
  probedBestHwaccel: string().optional()
17060
- })), method(DecoderSessionConfigSchema, object({
17061
- sessionId: string(),
17062
- nodeId: string()
17063
- })), method(object({ sessionId: string() }), _void()), method(object({
17064
- sessionId: string(),
17065
- packet: EncodedPacketSchema
17066
- }), _void()), method(object({
17067
- sessionId: string(),
17068
- url: string()
17069
- }), _void()), method(object({
17070
- sessionId: string(),
17071
- maxCount: number().default(1),
17072
- waitMs: number().optional()
17073
- }), array(DecodedFrameSchema)), method(object({
17074
- sessionId: string(),
17075
- maxCount: number().default(1),
17076
- waitMs: number().optional()
17077
- }), array(FrameHandleSchema)), method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()), method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()), method(object({
17078
- sessionId: string(),
17079
- config: DecoderSessionConfigSchema.partial()
17080
- }), _void()), method(object({ sessionId: string() }), DecoderStatsSchema), method(_void(), array(object({
17081
- sessionId: string(),
17082
- codec: string(),
17083
- outputFormat: string(),
17084
- createdAtMs: number()
17085
- })).readonly()), method(_void(), object({ backend: string() }), {
16838
+ })), method(_void(), object({ backend: string() }), {
17086
16839
  kind: "mutation",
17087
16840
  auth: "admin"
17088
16841
  });
@@ -24560,8 +24313,8 @@ function resolveClusterStepModelId(stepId, models) {
24560
24313
  var CLUSTER_STEP_SETTING_FIELDS = [{
24561
24314
  stepId: "face-embedding",
24562
24315
  key: "minLandmarkFaceSize",
24563
- label: "Min face size for recognition (detection px)",
24564
- description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
24316
+ label: "Min face size to embed (detection-frame px)",
24317
+ 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.",
24565
24318
  type: "slider",
24566
24319
  min: 0,
24567
24320
  max: 64,
@@ -26630,21 +26383,6 @@ var PipelineDefaultStepSchema = lazy(() => object({
26630
26383
  group: string().optional(),
26631
26384
  settings: record(string(), unknown()).optional()
26632
26385
  }));
26633
- var PipelineTemplateStepSchema = lazy(() => object({
26634
- addonId: string(),
26635
- enabled: boolean(),
26636
- modelId: string(),
26637
- children: array(PipelineTemplateStepSchema).readonly(),
26638
- settings: record(string(), unknown()).optional()
26639
- }));
26640
- var PipelineTemplateSchema$1 = object({
26641
- id: string(),
26642
- name: string(),
26643
- createdAt: string(),
26644
- updatedAt: string(),
26645
- engine: PipelineEngineChoiceSchema,
26646
- steps: array(PipelineTemplateStepSchema).readonly()
26647
- });
26648
26386
  var PipelineModelOptionSchema = object({
26649
26387
  id: string(),
26650
26388
  name: string(),
@@ -26966,18 +26704,6 @@ var pipelineExecutorCapability = {
26966
26704
  steps: array(PipelineStepInputSchema),
26967
26705
  deviceKey: string().optional()
26968
26706
  }), PipelineValidationResultSchema),
26969
- listTemplates: method(_void(), array(PipelineTemplateSchema$1).readonly()),
26970
- saveTemplate: method(object({
26971
- name: string(),
26972
- steps: array(PipelineTemplateStepSchema).readonly(),
26973
- engine: PipelineEngineChoiceSchema
26974
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
26975
- updateTemplate: method(object({
26976
- id: string(),
26977
- name: string().optional(),
26978
- steps: array(PipelineTemplateStepSchema).readonly().optional()
26979
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
26980
- deleteTemplate: method(object({ id: string() }), _void(), { kind: "mutation" }),
26981
26707
  getCapabilities: method(_void(), InferenceCapabilitiesBridge),
26982
26708
  getAddonModels: method(object({ addonId: string() }), ModelAvailabilityListBridge),
26983
26709
  downloadModel: method(object({
@@ -27235,148 +26961,17 @@ var pipelineExecutorCapability = {
27235
26961
  }
27236
26962
  };
27237
26963
  /**
27238
- * Wire shapes of the Load balancing surface (D748): the session placement
27239
- * policy, the atomic share write, the observed placement statistics, the
27240
- * hardware share suggestion and the stale device pins.
27241
- */
27242
- /**
27243
- * How a new detection session picks its node and device.
27244
- * - `least-loaded` — the historical rule: lowest `attached / weight`, a
27245
- * constant node order at a tie (D37). An idle node always ties at 0, so a
27246
- * weight only bites once a node already holds a session.
27247
- * - `share` — the share of PARALLEL sessions is held to the weights, and a
27248
- * full or drowning node yields to a free one (D748).
27249
- */
27250
- var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
27251
- var LoadBalancingSharesInputSchema = object({
27252
- /** nodeId → share (> 0). A node left out keeps its weight. */
27253
- nodes: record(string(), number().positive()).default({}),
27254
- /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
27255
- devices: record(string(), record(string(), number().positive())).default({})
27256
- });
27257
- var PlacementStatsInputSchema = object({
27258
- /** Window the observed shares are averaged over (default 1 h, max 24 h). */
27259
- windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
27260
- var PlacementDeviceStatsSchema = object({
27261
- deviceKey: string(),
27262
- /** Sessions running on this device now. */
27263
- sessionsNow: number(),
27264
- /** Sessions started on this device inside the window. */
27265
- sessionsStarted: number(),
27266
- /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
27267
- observedShare: number().nullable()
27268
- });
27269
- var PlacementNodeStatsSchema = object({
27270
- nodeId: string(),
27271
- sessionsNow: number(),
27272
- sessionsStarted: number(),
27273
- /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
27274
- observedShare: number().nullable(),
27275
- /** Most sessions this node ran at once inside the window. */
27276
- peakSessions: number(),
27277
- /** Sessions a share election handed elsewhere because this node was full or drowning. */
27278
- yieldsAway: number(),
27279
- devices: array(PlacementDeviceStatsSchema).readonly()
27280
- });
27281
- /** A camera's device pin that the session path cannot honour. */
27282
- var StaleDevicePinSchema = object({
27283
- deviceId: number(),
27284
- deviceKey: string(),
27285
- /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
27286
- reason: _enum(["disabled", "absent"])
27287
- });
27288
- var PlacementStatsSchema = object({
27289
- policy: SessionPlacementPolicySchema,
27290
- windowMs: number(),
27291
- /** How much of the window was actually observed (the hub keeps it in memory). */
27292
- observedForMs: number(),
27293
- sessionsNow: number(),
27294
- /** Most parallel sessions across the cluster inside the window. */
27295
- clusterPeakSessions: number(),
27296
- nodes: array(PlacementNodeStatsSchema).readonly(),
27297
- stalePins: array(StaleDevicePinSchema).readonly()
27298
- });
27299
- var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
27300
- var SuggestedDeviceShareSchema = object({
27301
- deviceKey: string(),
27302
- /** Share of the node (0–100, rounded). */
27303
- share: number(),
27304
- modelId: string().nullable(),
27305
- /** Inferences per second at that model, from the measured table. */
27306
- fps: number().nullable(),
27307
- measured: boolean(),
27308
- /** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
27309
- suggestedMaxSessions: number().nullable()
27310
- });
27311
- var SuggestedNodeShareSchema = object({
27312
- nodeId: string(),
27313
- /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
27314
- share: number().nullable(),
27315
- /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
27316
- capacitySessions: number(),
27317
- devices: array(SuggestedDeviceShareSchema).readonly(),
27318
- skippedReason: string().nullable()
27319
- });
27320
- var SuggestSharesResultSchema = object({
27321
- headroom: number(),
27322
- /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
27323
- cameraFps: number(),
27324
- /** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
27325
- iterations: number(),
27326
- nodes: array(SuggestedNodeShareSchema).readonly()
27327
- });
27328
- /**
27329
- * Where the node and device shares come from (D750).
27330
- * - `auto` — computed by the system from the cluster's measured capacity at
27331
- * the Auto tune models, and recomputed whenever a node or device joins,
27332
- * leaves, is switched on or off, or changes model.
27333
- * - `manual` — the operator's stored sliders. A node or device that cannot
27334
- * take sessions gives its share to the others in proportion; the stored
27335
- * values are never rewritten for that.
27336
- */
27337
- var ShareSourceSchema = _enum(["auto", "manual"]);
27338
- var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
27339
- object({
27340
- nodes: record(string(), number()),
27341
- devices: record(string(), record(string(), number()))
27342
- });
27343
- var EffectiveDeviceShareSchema = object({
27344
- deviceKey: string(),
27345
- /** Can take sessions now (enabled, available, can run the root). */
27346
- eligible: boolean(),
27347
- /** The share the source assigns, as a percentage of the node's devices. */
27348
- configuredPct: number(),
27349
- /** The share actually used, after an ineligible device's share went to the others. */
27350
- effectivePct: number()
27351
- });
27352
- var EffectiveNodeShareSchema = object({
27353
- nodeId: string(),
27354
- eligible: boolean(),
27355
- configuredPct: number(),
27356
- effectivePct: number(),
27357
- devices: array(EffectiveDeviceShareSchema).readonly()
27358
- });
27359
- var EffectiveSharesSchema = object({
27360
- source: ShareSourceSchema,
27361
- policy: SessionPlacementPolicySchema,
27362
- /** `auto` with no computed answer yet: the stored sliders are used meanwhile. */
27363
- autoPending: boolean(),
27364
- /** When the automatic shares were last computed (ms epoch); null = never. */
27365
- computedAt: number().nullable(),
27366
- /** What made the system recompute them last. */
27367
- trigger: string().nullable(),
27368
- nodes: array(EffectiveNodeShareSchema).readonly(),
27369
- /** The relative weights the election reads (before eligibility). */
27370
- nodeWeights: record(string(), number()),
27371
- deviceWeights: record(string(), record(string(), number()))
27372
- });
27373
- /**
27374
26964
  * The wire shapes of the Auto tune plan and apply (D745), used by the
27375
26965
  * `pipeline-orchestrator` cap. The recommender's own types
27376
- * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
26966
+ * (`recommend.ts`) are the TS face of the same data; these
27377
26967
  * schemas are what crosses the cap boundary.
27378
26968
  */
27379
26969
  var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
26970
+ /** The operator's range for it. */
26971
+ var MIN_SESSIONS_PER_DEVICE_RANGE = {
26972
+ min: 1,
26973
+ max: 8
26974
+ };
27380
26975
  var HardwareClassIdSchema = _enum([
27381
26976
  "intel-core-ultra",
27382
26977
  "intel-n-series",
@@ -27394,8 +26989,9 @@ var AcceleratorKindSchema = _enum([
27394
26989
  ]);
27395
26990
  var RecommendationReasonSchema = discriminatedUnion("kind", [
27396
26991
  object({
27397
- kind: literal("fits"),
27398
- utilisation: number()
26992
+ kind: literal("capacity"),
26993
+ sessions: number(),
26994
+ minSessions: number()
27399
26995
  }),
27400
26996
  object({
27401
26997
  kind: literal("tie-faster"),
@@ -27410,16 +27006,13 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
27410
27006
  }),
27411
27007
  object({
27412
27008
  kind: literal("no-fit-lightest"),
27413
- utilisation: number()
27009
+ sessions: number(),
27010
+ minSessions: number()
27414
27011
  }),
27415
27012
  object({
27416
27013
  kind: literal("derived-latency"),
27417
27014
  modelId: string()
27418
27015
  }),
27419
- object({
27420
- kind: literal("estimated-load"),
27421
- observedForMs: number().nullable()
27422
- }),
27423
27016
  object({ kind: literal("cpu-device") }),
27424
27017
  object({ kind: literal("coral-untouched") }),
27425
27018
  object({ kind: literal("device-disabled") }),
@@ -27435,28 +27028,13 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
27435
27028
  format: ModelFormatSchema$1
27436
27029
  })
27437
27030
  ]);
27438
- var DeviceDemandSchema = object({
27439
- nodeId: string(),
27440
- deviceKey: string(),
27441
- demandFps: number(),
27442
- maxCameraFps: number(),
27443
- alwaysOnCameras: number(),
27444
- onMotionSessions: number(),
27445
- onMotionSource: _enum([
27446
- "observed-24h",
27447
- "estimate",
27448
- "none"
27449
- ]),
27450
- observedForMs: number().nullable(),
27451
- /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
27452
- placement: SessionPlacementPolicySchema
27453
- });
27454
27031
  var DeviceModelChoiceSchema = object({
27455
27032
  modelId: string(),
27456
27033
  p50Ms: number(),
27457
27034
  fps: number(),
27458
27035
  measured: boolean(),
27459
- utilisation: number(),
27036
+ /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
27037
+ capacitySessions: number(),
27460
27038
  personRecall: number()
27461
27039
  });
27462
27040
  var DeviceRecommendationSchema = object({
@@ -27464,7 +27042,6 @@ var DeviceRecommendationSchema = object({
27464
27042
  accelerator: AcceleratorKindSchema.nullable(),
27465
27043
  enabled: boolean(),
27466
27044
  available: boolean(),
27467
- demand: DeviceDemandSchema.nullable(),
27468
27045
  chosen: DeviceModelChoiceSchema.nullable(),
27469
27046
  reasons: array(RecommendationReasonSchema).readonly()
27470
27047
  });
@@ -27525,20 +27102,20 @@ var AutoTuneOptionsSchema = object({
27525
27102
  /** Share of each accelerator's throughput kept free (0.3–0.5). */
27526
27103
  headroom: number().min(.3).max(.5).default(.4),
27527
27104
  /**
27528
- * What-if shares (D748): plan as if these node/device shares were stored
27529
- * and the policy were `share`. Absent = the stored shares under the stored
27530
- * policy. A what-if plan is for display; apply always re-plans from what
27531
- * is stored.
27105
+ * The least number of parallel sessions every device must sustain at the
27106
+ * camera rate with the headroom kept free (D755). The most accurate model
27107
+ * that reaches it wins.
27532
27108
  */
27533
- shares: LoadBalancingSharesInputSchema.optional()
27109
+ minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
27534
27110
  });
27535
27111
  var AutoTunePlanSchema = object({
27536
27112
  /** Hash of everything the apply will write — the apply refuses a different one. */
27537
27113
  planHash: string(),
27538
27114
  family: literal("yolov9"),
27539
27115
  headroom: number(),
27540
- /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
27541
- whatIf: boolean(),
27116
+ minSessionsPerDevice: number(),
27117
+ /** The detection rate a session is counted at (the fastest camera running the pipeline root). */
27118
+ cameraFps: number(),
27542
27119
  generatedAt: number(),
27543
27120
  nodes: array(NodeRecommendationSchema).readonly(),
27544
27121
  nodeChanges: array(NodeDeviceChangeSchema).readonly(),
@@ -27548,7 +27125,8 @@ var AutoTunePlanSchema = object({
27548
27125
  });
27549
27126
  var AutoTuneApplyInputSchema = object({
27550
27127
  planHash: string(),
27551
- headroom: number().min(.3).max(.5).default(.4)
27128
+ headroom: number().min(.3).max(.5).default(.4),
27129
+ minSessionsPerDevice: number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
27552
27130
  });
27553
27131
  var AutoTunePhaseResultSchema = object({
27554
27132
  phase: _enum([
@@ -27580,6 +27158,177 @@ var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
27580
27158
  reason: _enum(["apply-in-progress"])
27581
27159
  })
27582
27160
  ]);
27161
+ /**
27162
+ * Wire shapes of the Load balancing surface (D748): the session placement
27163
+ * policy, the atomic share write, the observed placement statistics, the
27164
+ * hardware share suggestion and the stale device pins.
27165
+ */
27166
+ /**
27167
+ * How a new detection session picks its node and device.
27168
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
27169
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
27170
+ * weight only bites once a node already holds a session.
27171
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
27172
+ * full or drowning node yields to a free one (D748).
27173
+ */
27174
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
27175
+ var LoadBalancingSharesInputSchema = object({
27176
+ /** nodeId → share (> 0). A node left out keeps its weight. */
27177
+ nodes: record(string(), number().positive()).default({}),
27178
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
27179
+ devices: record(string(), record(string(), number().positive())).default({})
27180
+ });
27181
+ var PlacementStatsInputSchema = object({
27182
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
27183
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
27184
+ var PlacementDeviceStatsSchema = object({
27185
+ deviceKey: string(),
27186
+ /** Sessions running on this device now. */
27187
+ sessionsNow: number(),
27188
+ /** Sessions started on this device inside the window. */
27189
+ sessionsStarted: number(),
27190
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
27191
+ observedShare: number().nullable()
27192
+ });
27193
+ var PlacementNodeStatsSchema = object({
27194
+ nodeId: string(),
27195
+ sessionsNow: number(),
27196
+ sessionsStarted: number(),
27197
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
27198
+ observedShare: number().nullable(),
27199
+ /** Most sessions this node ran at once inside the window. */
27200
+ peakSessions: number(),
27201
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
27202
+ yieldsAway: number(),
27203
+ devices: array(PlacementDeviceStatsSchema).readonly()
27204
+ });
27205
+ /** A camera's device pin that the session path cannot honour. */
27206
+ var StaleDevicePinSchema = object({
27207
+ deviceId: number(),
27208
+ deviceKey: string(),
27209
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
27210
+ reason: _enum(["disabled", "absent"])
27211
+ });
27212
+ var PlacementStatsSchema = object({
27213
+ policy: SessionPlacementPolicySchema,
27214
+ windowMs: number(),
27215
+ /** How much of the window was actually observed (the hub keeps it in memory). */
27216
+ observedForMs: number(),
27217
+ sessionsNow: number(),
27218
+ /** Most parallel sessions across the cluster inside the window. */
27219
+ clusterPeakSessions: number(),
27220
+ nodes: array(PlacementNodeStatsSchema).readonly(),
27221
+ stalePins: array(StaleDevicePinSchema).readonly()
27222
+ });
27223
+ /**
27224
+ * Where an automatic share's capacity comes from (D755).
27225
+ * - `hardware` — the static capacity of each device at its Auto tune model:
27226
+ * the measured latency table for the node's hardware class.
27227
+ * - `benchmark` — the node's own measured capacity (node benchmark results).
27228
+ * A node with no results falls back to `hardware`, and says so.
27229
+ */
27230
+ var CapacitySourceSchema = _enum(["hardware", "benchmark"]);
27231
+ /** Why a node under the `benchmark` source was sized from hardware instead. */
27232
+ var CapacityFallbackSchema = _enum(["no-benchmark-results", "partial-benchmark-results"]);
27233
+ var SuggestSharesInputSchema = object({
27234
+ headroom: number().min(.3).max(.5).default(.4),
27235
+ /** Default `hardware`. */
27236
+ source: CapacitySourceSchema.default("hardware")
27237
+ });
27238
+ var SuggestedDeviceShareSchema = object({
27239
+ deviceKey: string(),
27240
+ /** Share of the node (0–100, rounded). */
27241
+ share: number(),
27242
+ modelId: string().nullable(),
27243
+ /** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
27244
+ fps: number().nullable(),
27245
+ /** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
27246
+ measured: boolean(),
27247
+ /**
27248
+ * Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
27249
+ * or the benchmark's measured max sessions. Never enforced.
27250
+ */
27251
+ suggestedMaxSessions: number().nullable()
27252
+ });
27253
+ var SuggestedNodeShareSchema = object({
27254
+ nodeId: string(),
27255
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
27256
+ share: number().nullable(),
27257
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
27258
+ capacitySessions: number(),
27259
+ devices: array(SuggestedDeviceShareSchema).readonly(),
27260
+ skippedReason: string().nullable(),
27261
+ /** What this node's capacity was read from; null when the node is skipped. */
27262
+ capacitySource: CapacitySourceSchema.nullable(),
27263
+ /** Set when the `benchmark` source was asked for and this node used `hardware`. */
27264
+ capacityFallback: CapacityFallbackSchema.nullable()
27265
+ });
27266
+ var SuggestSharesResultSchema = object({
27267
+ headroom: number(),
27268
+ /** The source asked for; each node says what it actually used. */
27269
+ source: CapacitySourceSchema,
27270
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
27271
+ cameraFps: number(),
27272
+ /** The Auto tune capacity floor the models were picked at. */
27273
+ minSessionsPerDevice: number(),
27274
+ nodes: array(SuggestedNodeShareSchema).readonly()
27275
+ });
27276
+ /**
27277
+ * Where the node and device shares come from (D750, D755).
27278
+ * - `hardware` (default) — computed by the system from each node's static
27279
+ * capacity (its accelerators at their Auto tune models, from the measured
27280
+ * latency table), recomputed whenever a node or device joins, leaves, is
27281
+ * switched on or off, or changes model. No load input.
27282
+ * - `benchmark` — the same, from each node's measured capacity (node
27283
+ * benchmark results); a node without results falls back to `hardware`.
27284
+ * - `manual` — the operator's stored sliders.
27285
+ * Either way a node or device that cannot take sessions gives its share to
27286
+ * the others in proportion; the stored values are never rewritten for that.
27287
+ */
27288
+ var ShareSourceSchema = _enum([
27289
+ "hardware",
27290
+ "benchmark",
27291
+ "manual"
27292
+ ]);
27293
+ var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
27294
+ object({
27295
+ nodes: record(string(), number()),
27296
+ devices: record(string(), record(string(), number()))
27297
+ });
27298
+ var EffectiveDeviceShareSchema = object({
27299
+ deviceKey: string(),
27300
+ /** Can take sessions now (enabled, available, can run the root). */
27301
+ eligible: boolean(),
27302
+ /** The share the source assigns, as a percentage of the node's devices. */
27303
+ configuredPct: number(),
27304
+ /** The share actually used, after an ineligible device's share went to the others. */
27305
+ effectivePct: number()
27306
+ });
27307
+ var EffectiveNodeShareSchema = object({
27308
+ nodeId: string(),
27309
+ eligible: boolean(),
27310
+ configuredPct: number(),
27311
+ effectivePct: number(),
27312
+ /** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
27313
+ capacitySource: CapacitySourceSchema.nullable(),
27314
+ /** Automatic `benchmark`: why this node used `hardware` instead. */
27315
+ capacityFallback: CapacityFallbackSchema.nullable(),
27316
+ devices: array(EffectiveDeviceShareSchema).readonly()
27317
+ });
27318
+ var EffectiveSharesSchema = object({
27319
+ source: ShareSourceSchema,
27320
+ policy: SessionPlacementPolicySchema,
27321
+ /** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
27322
+ autoPending: boolean(),
27323
+ /** When the automatic shares were last computed (ms epoch); null = never. */
27324
+ computedAt: number().nullable(),
27325
+ /** What made the system recompute them last. */
27326
+ trigger: string().nullable(),
27327
+ nodes: array(EffectiveNodeShareSchema).readonly(),
27328
+ /** The relative weights the election reads (before eligibility). */
27329
+ nodeWeights: record(string(), number()),
27330
+ deviceWeights: record(string(), record(string(), number()))
27331
+ });
27583
27332
  object({
27584
27333
  activeCameras: number(),
27585
27334
  throttledCameras: number(),
@@ -28457,14 +28206,15 @@ var RunnerLocalLoadSchema = object({
28457
28206
  * Per-inference-device live load (multi-device C4). One entry per deviceKey
28458
28207
  * this runner currently has attached cameras on, so the orchestrator's second
28459
28208
  * `balance()` pass (over a node's devices) weights on real per-pool session
28460
- * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
28461
- * per device is 0 until the pool backlog gets a public accessor (follow-up).
28209
+ * counts. Empty on single-device / pre-multi-device runners. There is no
28210
+ * per-device queue depth: the inference pool's backlog has no accessor, and
28211
+ * a field that always read 0 was removed rather than shown as a measurement
28212
+ * (D762).
28462
28213
  */
28463
28214
  devices: array(object({
28464
28215
  deviceKey: string(),
28465
28216
  backend: string(),
28466
- attachedCameras: number(),
28467
- queueDepthTotal: number()
28217
+ attachedCameras: number()
28468
28218
  })).default([]),
28469
28219
  /** Hardware capability flags reported by this node. */
28470
28220
  hardware: object({
@@ -28870,14 +28620,6 @@ var CameraPipelineConfigSchema = object({
28870
28620
  settings: record(string(), unknown()).readonly().optional()
28871
28621
  }).nullable().optional()
28872
28622
  });
28873
- var PipelineTemplateSchema = object({
28874
- id: string(),
28875
- name: string(),
28876
- description: string().optional(),
28877
- config: CameraPipelineConfigSchema,
28878
- createdAt: string(),
28879
- updatedAt: string()
28880
- });
28881
28623
  var DeviceStepConfigSchema = object({
28882
28624
  modelId: string().optional(),
28883
28625
  settings: record(string(), unknown()).optional(),
@@ -28951,8 +28693,10 @@ var CameraStepOverridePatchSchema = object({
28951
28693
  modelId: string().optional(),
28952
28694
  settings: record(string(), unknown()).readonly().optional()
28953
28695
  });
28696
+ var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
28954
28697
  var CameraPipelineSettingsSchema = object({
28955
28698
  stepToggles: record(string(), boolean()).optional(),
28699
+ stepSettings: CameraStepSettingsSchema.optional(),
28956
28700
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
28957
28701
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
28958
28702
  });
@@ -28985,7 +28729,10 @@ var PipelineAssignmentSchema = object({
28985
28729
  });
28986
28730
  /**
28987
28731
  * Per-agent load summary surfaced to the load balancer + dashboards.
28988
- * Aggregated from each runner's `getLocalLoad` cap call.
28732
+ * Aggregated from each runner's `getLocalLoad` cap call. In the
28733
+ * `getAgentLoad` report, a single-device node's default-pool sessions (no
28734
+ * `deviceKey`) are credited to its one eligible device in `load.devices` —
28735
+ * the default pool IS that device (D745); the balancer's census stays raw.
28989
28736
  */
28990
28737
  var AgentLoadSummarySchema = object({
28991
28738
  nodeId: string(),
@@ -29074,26 +28821,27 @@ var CameraBrokerStatusSchema = object({
29074
28821
  width: number(),
29075
28822
  height: number(),
29076
28823
  subscribers: number(),
29077
- inFps: number(),
29078
- outFps: number()
28824
+ /**
28825
+ * Encoded packets/s the broker receives from the camera. null when the
28826
+ * broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
28827
+ * There is no output rate: decoding runs in the session decode workers, not
28828
+ * in the broker, so the broker's own decoded-frame rate is 0 on every live
28829
+ * camera and is not served (D758).
28830
+ */
28831
+ inFps: number().nullable()
29079
28832
  })).readonly(),
29080
28833
  webrtcSessions: number(),
29081
28834
  rtspRestream: boolean()
29082
28835
  });
29083
- /** Shared-memory ring statistics within the decoder block. */
29084
- var CameraDecoderShmSchema = object({
29085
- framesWritten: number(),
29086
- getFrameHits: number(),
29087
- getFrameMisses: number(),
29088
- budgetMb: number()
29089
- });
29090
- /** Decoder block — null when the decoder stage is unreachable or inactive. */
29091
- var CameraDecoderStatusSchema = object({
29092
- nodeId: string(),
29093
- formats: array(string()).readonly(),
29094
- sessionCount: number(),
29095
- shm: CameraDecoderShmSchema
29096
- });
28836
+ /**
28837
+ * Decoder block — WHERE decode runs (co-located with the detection node by
28838
+ * construction); null when the camera has no detection node. It carries no
28839
+ * frame counter: the shared-memory plane whose counters it used to serve is
28840
+ * gone, and those fields read 0 forever. Whether frames actually flow is read
28841
+ * from `detection.actualFps` (frames delivered to and processed by the
28842
+ * detector), never from a counter nothing feeds.
28843
+ */
28844
+ var CameraDecoderStatusSchema = object({ nodeId: string() });
29097
28845
  /** Motion block — null when motion detection is not active for this device. */
29098
28846
  var CameraMotionStatusSchema = object({
29099
28847
  enabled: boolean(),
@@ -29516,6 +29264,13 @@ method(object({
29516
29264
  }), object({ success: literal(true) }), {
29517
29265
  kind: "mutation",
29518
29266
  auth: "admin"
29267
+ }), method(object({
29268
+ deviceId: number(),
29269
+ addonId: string(),
29270
+ settings: record(string(), unknown()).nullable()
29271
+ }), object({ success: literal(true) }), {
29272
+ kind: "mutation",
29273
+ auth: "admin"
29519
29274
  }), method(object({
29520
29275
  deviceId: number(),
29521
29276
  agentNodeId: string(),
@@ -29539,25 +29294,7 @@ method(object({
29539
29294
  }), method(_void(), DiskReconcileJobSchema, {
29540
29295
  kind: "mutation",
29541
29296
  auth: "admin"
29542
- }), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
29543
- name: string(),
29544
- description: string().optional(),
29545
- config: CameraPipelineConfigSchema
29546
- }), PipelineTemplateSchema, {
29547
- kind: "mutation",
29548
- auth: "admin"
29549
- }), method(object({
29550
- id: string(),
29551
- name: string().optional(),
29552
- description: string().optional(),
29553
- config: CameraPipelineConfigSchema.optional()
29554
- }), PipelineTemplateSchema, {
29555
- kind: "mutation",
29556
- auth: "admin"
29557
- }), method(object({ id: string() }), object({ success: literal(true) }), {
29558
- kind: "mutation",
29559
- auth: "admin"
29560
- });
29297
+ }), method(_void(), DiskReconcileJobSchema, { auth: "admin" });
29561
29298
  /**
29562
29299
  * Cap → event-kind mapping for the SENSOR / CONTROL cap families — the table
29563
29300
  * `pipeline-analytics.listEventKinds` uses to turn a linked device's bound
@@ -32073,8 +31810,6 @@ var WebrtcStreamChoiceSchema = object({
32073
31810
  ]).nullable(),
32074
31811
  /** Input FPS from the camera (null for adaptive). */
32075
31812
  inputFps: number().nullable(),
32076
- /** Decoded FPS (null for adaptive). */
32077
- decodeFps: number().nullable(),
32078
31813
  /** Bitrate in kbps (null for adaptive). */
32079
31814
  bitrateKbps: number().nullable()
32080
31815
  });
@@ -42949,90 +42684,18 @@ Object.freeze({
42949
42684
  addonId: null,
42950
42685
  access: "create"
42951
42686
  },
42952
- "decoder.createSession": {
42953
- capName: "decoder",
42954
- capScope: "system",
42955
- addonId: null,
42956
- access: "view"
42957
- },
42958
- "decoder.destroySession": {
42959
- capName: "decoder",
42960
- capScope: "system",
42961
- addonId: null,
42962
- access: "delete"
42963
- },
42964
- "decoder.getFrame": {
42965
- capName: "decoder",
42966
- capScope: "system",
42967
- addonId: null,
42968
- access: "view"
42969
- },
42970
42687
  "decoder.getInfo": {
42971
42688
  capName: "decoder",
42972
42689
  capScope: "system",
42973
42690
  addonId: null,
42974
42691
  access: "view"
42975
42692
  },
42976
- "decoder.getShmStats": {
42977
- capName: "decoder",
42978
- capScope: "system",
42979
- addonId: null,
42980
- access: "view"
42981
- },
42982
- "decoder.getStats": {
42983
- capName: "decoder",
42984
- capScope: "system",
42985
- addonId: null,
42986
- access: "view"
42987
- },
42988
- "decoder.listActiveSessions": {
42989
- capName: "decoder",
42990
- capScope: "system",
42991
- addonId: null,
42992
- access: "view"
42993
- },
42994
- "decoder.openStream": {
42995
- capName: "decoder",
42996
- capScope: "system",
42997
- addonId: null,
42998
- access: "view"
42999
- },
43000
- "decoder.pullFrames": {
43001
- capName: "decoder",
43002
- capScope: "system",
43003
- addonId: null,
43004
- access: "view"
43005
- },
43006
- "decoder.pullHandles": {
43007
- capName: "decoder",
43008
- capScope: "system",
43009
- addonId: null,
43010
- access: "view"
43011
- },
43012
- "decoder.pushPacket": {
43013
- capName: "decoder",
43014
- capScope: "system",
43015
- addonId: null,
43016
- access: "view"
43017
- },
43018
42693
  "decoder.reprobeHwaccel": {
43019
42694
  capName: "decoder",
43020
42695
  capScope: "system",
43021
42696
  addonId: null,
43022
42697
  access: "create"
43023
42698
  },
43024
- "decoder.supportsCodec": {
43025
- capName: "decoder",
43026
- capScope: "system",
43027
- addonId: null,
43028
- access: "view"
43029
- },
43030
- "decoder.updateConfig": {
43031
- capName: "decoder",
43032
- capScope: "system",
43033
- addonId: null,
43034
- access: "view"
43035
- },
43036
42699
  "detectionPipeline.applyDeviceSettingsPatch": {
43037
42700
  capName: "detection-pipeline",
43038
42701
  capScope: "device",
@@ -46123,12 +45786,6 @@ Object.freeze({
46123
45786
  addonId: null,
46124
45787
  access: "delete"
46125
45788
  },
46126
- "pipelineExecutor.deleteTemplate": {
46127
- capName: "pipeline-executor",
46128
- capScope: "system",
46129
- addonId: null,
46130
- access: "delete"
46131
- },
46132
45789
  "pipelineExecutor.downloadModel": {
46133
45790
  capName: "pipeline-executor",
46134
45791
  capScope: "system",
@@ -46267,12 +45924,6 @@ Object.freeze({
46267
45924
  addonId: null,
46268
45925
  access: "view"
46269
45926
  },
46270
- "pipelineExecutor.listTemplates": {
46271
- capName: "pipeline-executor",
46272
- capScope: "system",
46273
- addonId: null,
46274
- access: "view"
46275
- },
46276
45927
  "pipelineExecutor.rearmInferenceDevice": {
46277
45928
  capName: "pipeline-executor",
46278
45929
  capScope: "system",
@@ -46297,12 +45948,6 @@ Object.freeze({
46297
45948
  addonId: null,
46298
45949
  access: "create"
46299
45950
  },
46300
- "pipelineExecutor.saveTemplate": {
46301
- capName: "pipeline-executor",
46302
- capScope: "system",
46303
- addonId: null,
46304
- access: "create"
46305
- },
46306
45951
  "pipelineExecutor.setVideoPipelineSteps": {
46307
45952
  capName: "pipeline-executor",
46308
45953
  capScope: "system",
@@ -46321,12 +45966,6 @@ Object.freeze({
46321
45966
  addonId: null,
46322
45967
  access: "create"
46323
45968
  },
46324
- "pipelineExecutor.updateTemplate": {
46325
- capName: "pipeline-executor",
46326
- capScope: "system",
46327
- addonId: null,
46328
- access: "create"
46329
- },
46330
45969
  "pipelineExecutor.validatePipeline": {
46331
45970
  capName: "pipeline-executor",
46332
45971
  capScope: "system",
@@ -46357,12 +45996,6 @@ Object.freeze({
46357
45996
  addonId: null,
46358
45997
  access: "create"
46359
45998
  },
46360
- "pipelineOrchestrator.deleteTemplate": {
46361
- capName: "pipeline-orchestrator",
46362
- capScope: "system",
46363
- addonId: null,
46364
- access: "delete"
46365
- },
46366
45999
  "pipelineOrchestrator.getAgentLoad": {
46367
46000
  capName: "pipeline-orchestrator",
46368
46001
  capScope: "system",
@@ -46513,12 +46146,6 @@ Object.freeze({
46513
46146
  addonId: null,
46514
46147
  access: "view"
46515
46148
  },
46516
- "pipelineOrchestrator.listTemplates": {
46517
- capName: "pipeline-orchestrator",
46518
- capScope: "system",
46519
- addonId: null,
46520
- access: "view"
46521
- },
46522
46149
  "pipelineOrchestrator.pauseForStorageMigration": {
46523
46150
  capName: "pipeline-orchestrator",
46524
46151
  capScope: "system",
@@ -46573,12 +46200,6 @@ Object.freeze({
46573
46200
  addonId: null,
46574
46201
  access: "create"
46575
46202
  },
46576
- "pipelineOrchestrator.saveTemplate": {
46577
- capName: "pipeline-orchestrator",
46578
- capScope: "system",
46579
- addonId: null,
46580
- access: "create"
46581
- },
46582
46203
  "pipelineOrchestrator.setAgentCapabilities": {
46583
46204
  capName: "pipeline-orchestrator",
46584
46205
  capScope: "system",
@@ -46627,6 +46248,12 @@ Object.freeze({
46627
46248
  addonId: null,
46628
46249
  access: "create"
46629
46250
  },
46251
+ "pipelineOrchestrator.setCameraStepSettings": {
46252
+ capName: "pipeline-orchestrator",
46253
+ capScope: "system",
46254
+ addonId: null,
46255
+ access: "create"
46256
+ },
46630
46257
  "pipelineOrchestrator.setCameraStepToggle": {
46631
46258
  capName: "pipeline-orchestrator",
46632
46259
  capScope: "system",
@@ -46681,12 +46308,6 @@ Object.freeze({
46681
46308
  addonId: null,
46682
46309
  access: "create"
46683
46310
  },
46684
- "pipelineOrchestrator.updateTemplate": {
46685
- capName: "pipeline-orchestrator",
46686
- capScope: "system",
46687
- addonId: null,
46688
- access: "create"
46689
- },
46690
46311
  "pipelineRunner.attachCamera": {
46691
46312
  capName: "pipeline-runner",
46692
46313
  capScope: "system",
@@ -48121,12 +47742,6 @@ Object.freeze({
48121
47742
  addonId: null,
48122
47743
  access: "view"
48123
47744
  },
48124
- "streamBroker.pullFrameHandles": {
48125
- capName: "stream-broker",
48126
- capScope: "system",
48127
- addonId: null,
48128
- access: "view"
48129
- },
48130
47745
  "streamBroker.regenerateRtspToken": {
48131
47746
  capName: "stream-broker",
48132
47747
  capScope: "system",
@@ -48193,12 +47808,6 @@ Object.freeze({
48193
47808
  addonId: null,
48194
47809
  access: "create"
48195
47810
  },
48196
- "streamBroker.subscribeFrames": {
48197
- capName: "stream-broker",
48198
- capScope: "system",
48199
- addonId: null,
48200
- access: "create"
48201
- },
48202
47811
  "streamBroker.unassignProfile": {
48203
47812
  capName: "stream-broker",
48204
47813
  capScope: "system",
@@ -48211,12 +47820,6 @@ Object.freeze({
48211
47820
  addonId: null,
48212
47821
  access: "create"
48213
47822
  },
48214
- "streamBroker.unsubscribeFrames": {
48215
- capName: "stream-broker",
48216
- capScope: "system",
48217
- addonId: null,
48218
- access: "create"
48219
- },
48220
47823
  "streamCatalog.getCatalog": {
48221
47824
  capName: "stream-catalog",
48222
47825
  capScope: "device",
@@ -50730,11 +50333,6 @@ Object.freeze({
50730
50333
  form: "single",
50731
50334
  optional: false
50732
50335
  }],
50733
- "decoder.createSession": [{
50734
- name: "deviceId",
50735
- form: "single",
50736
- optional: true
50737
- }],
50738
50336
  "detectionPipeline.applyDeviceSettingsPatch": [{
50739
50337
  name: "deviceId",
50740
50338
  form: "single",
@@ -52075,6 +51673,11 @@ Object.freeze({
52075
51673
  form: "single",
52076
51674
  optional: false
52077
51675
  }],
51676
+ "pipelineOrchestrator.setCameraStepSettings": [{
51677
+ name: "deviceId",
51678
+ form: "single",
51679
+ optional: false
51680
+ }],
52078
51681
  "pipelineOrchestrator.setCameraStepToggle": [{
52079
51682
  name: "deviceId",
52080
51683
  form: "single",
@@ -55938,12 +55541,6 @@ Object.defineProperty(exports, "overlayClusterStepSettings", {
55938
55541
  return overlayClusterStepSettings;
55939
55542
  }
55940
55543
  });
55941
- Object.defineProperty(exports, "parseJsonUnknown", {
55942
- enumerable: true,
55943
- get: function() {
55944
- return parseJsonUnknown;
55945
- }
55946
- });
55947
55544
  Object.defineProperty(exports, "parseProcStatus", {
55948
55545
  enumerable: true,
55949
55546
  get: function() {