@camstack/addon-osd-manager 0.1.185 → 0.1.187

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 (19) hide show
  1. package/dist/{MotionZonesSettings-DBooRvoC.mjs → MotionZonesSettings-DExh7cfG.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-BOI23HW8.mjs → PrivacyMaskSettings-D7DD3Bjn.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-Bh3b6fEU.mjs → SceneMonitorEditor-CSGICuxL.mjs} +3 -3
  4. package/dist/_stub.js +3700 -3402
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CKsdRf-b.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CqKqHB_X.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-xwBgquo5.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-CBABPQis.mjs → hostInit-B0_eqBVt.mjs} +3 -3
  9. package/dist/index.js +41 -481
  10. package/dist/index.mjs +41 -481
  11. package/dist/{player-overlays-Do8k8gA2.mjs → player-overlays-BIS82ltZ.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-yiWJoiT1.mjs → responsive-B3EaDJYd.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-6bTPHwxW.mjs → scene-monitor-copy-b6ZWnJc9.mjs} +1 -1
  15. package/dist/{square-ClXZfZgc.mjs → square-DnMZ8-h0.mjs} +1 -1
  16. package/dist/{trash-2-Cm-45fYx.mjs → trash-2-Cd7WoJCB.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BfGWacqv.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CbqzvZt_.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CTH5s3ZX.mjs +0 -26
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- //#region ../types/dist/event-category-BGmz_oxW.mjs
5
+ //#region ../types/dist/event-category-B_0XEcLF.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -503,15 +503,6 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
503
503
  EventCategory["AgentWsDisconnected"] = "agent.ws.disconnected";
504
504
  EventCategory["AgentBackupActivated"] = "agent.backup.activated";
505
505
  EventCategory["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
506
- /**
507
- * Per-agent hwaccel preference changed (user override set, cleared, or
508
- * re-probed). Observability event — decoders pull the current pref at
509
- * `createSession`, so running sessions keep their current backend until
510
- * they rotate naturally (camera add/remove, stream restart). Future
511
- * work can wire a listener in stream-broker that force-rotates live
512
- * sessions; for now this event powers logs + admin-UI toast feedback.
513
- */
514
- EventCategory["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
515
506
  EventCategory["MotionAnalysis"] = "detection.motion-analysis";
516
507
  /** All raw motion zones from CCL before minArea filter — for UI debug overlay. */
517
508
  EventCategory["MotionZonesRaw"] = "detection.motion-zones-raw";
@@ -5382,7 +5373,7 @@ var ZodIssueCode = {
5382
5373
  var ZodFirstPartyTypeKind;
5383
5374
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5384
5375
  //#endregion
5385
- //#region ../types/dist/sleep-DAJ9Er57.mjs
5376
+ //#region ../types/dist/sleep-BNeXenvr.mjs
5386
5377
  /**
5387
5378
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5388
5379
  * window to float samples (D455).
@@ -6748,32 +6739,12 @@ object({
6748
6739
  audioCodec: string().optional(),
6749
6740
  metadata: record(string(), unknown()).readonly().optional()
6750
6741
  });
6751
- var EncodedPacketSchema = object({
6752
- type: _enum(["video", "audio"]),
6753
- data: _instanceof(Uint8Array),
6754
- pts: number(),
6755
- dts: number(),
6756
- keyframe: boolean(),
6757
- codec: string()
6758
- });
6759
- var DecodedFrameSchema = object({
6760
- data: _instanceof(Uint8Array),
6761
- width: number(),
6762
- height: number(),
6763
- format: _enum([
6764
- "jpeg",
6765
- "rgb",
6766
- "bgr",
6767
- "yuv420",
6768
- "gray"
6769
- ]),
6770
- timestamp: number()
6771
- });
6772
6742
  /**
6773
6743
  * Wire schema for `FrameHandle` — a zero-pixel, serialisable reference to a
6774
6744
  * frame in a shared-memory ring (Phase 5 / D9). Mirrors the `FrameHandle` TS
6775
- * interface in `interfaces/frame-handle.ts` field-for-field so a decoder cap
6776
- * method (`pullHandles`) can carry handles over tRPC / Moleculer.
6745
+ * interface in `interfaces/frame-handle.ts` field-for-field so a cap method
6746
+ * (the runner's native-crop and pipeline-executor inputs) can carry handles
6747
+ * over tRPC / Moleculer.
6777
6748
  *
6778
6749
  * The `satisfies` assertion below pins this schema to the interface: if a
6779
6750
  * field is added to / removed from `FrameHandle` without a matching schema
@@ -6799,50 +6770,6 @@ var FrameHandleSchema = object({
6799
6770
  slotCount: number().int().positive()
6800
6771
  });
6801
6772
  /**
6802
- * Pixel format a frame-handle subscriber can request from the broker
6803
- * (Phase 5 / D9). The packed, raster subset of `FrameFormat` — the formats a
6804
- * `frameSink: 'shm'` decoder session can write into a `FrameRing` slot.
6805
- * `jpeg` is excluded: a variable-length stream is not a fixed-stride ring
6806
- * payload, and no decoded-frame consumer requests it over the shm plane.
6807
- */
6808
- var FrameHandleFormatSchema = _enum([
6809
- "rgb",
6810
- "bgr",
6811
- "yuv420",
6812
- "gray"
6813
- ]);
6814
- /**
6815
- * Input for `stream-broker.subscribeFrames` (Phase 5 / D9). A consumer asks the
6816
- * broker for a `FrameHandle` stream of one `format`; the broker maintains one
6817
- * shared-memory ring per `(brokerId, format)` actually requested, so a `gray`
6818
- * subscriber (motion) and an `rgb` subscriber (detection) each read the format
6819
- * they asked for with no broker-side conversion.
6820
- */
6821
- var SubscribeFramesInputSchema = object({
6822
- brokerId: string(),
6823
- format: FrameHandleFormatSchema,
6824
- /**
6825
- * Optional reader-side cadence hint in frames per second. The broker does
6826
- * NOT throttle — latest-wins ring reads drop frames implicitly for a slow
6827
- * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
6828
- * the consumer can pace its own `pullFrameHandles` polling.
6829
- */
6830
- maxFps: number().positive().optional(),
6831
- /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
6832
- tag: string().optional()
6833
- });
6834
- /**
6835
- * Result of `stream-broker.subscribeFrames`. The consumer then polls
6836
- * `pullFrameHandles({ subscriptionId, maxCount })` and feeds each returned
6837
- * `FrameHandle` to a `FrameRingReader`.
6838
- */
6839
- var SubscribeFramesResultSchema = object({
6840
- /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
6841
- subscriptionId: string(),
6842
- /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
6843
- maxFps: number().nonnegative()
6844
- });
6845
- /**
6846
6773
  * Wire schema for a decoded audio chunk (Phase 5 / D9). Mirrors the
6847
6774
  * `DecodedAudioChunk` TS interface in `interfaces/stream-broker.ts`: PCM
6848
6775
  * sample bytes plus the track parameters a consumer needs to interpret them.
@@ -6850,8 +6777,8 @@ var SubscribeFramesResultSchema = object({
6850
6777
  * Audio chunks are tiny (a ~500ms AudioCodecSession window is a few KB of
6851
6778
  * Float32 PCM), so unlike video frames they ship their bytes INLINE over
6852
6779
  * tRPC / Moleculer — no shared-memory plane. `data` is typed `Uint8Array`
6853
- * (the wire-serialisable supertype of `Buffer`) to match `DecodedFrameSchema`
6854
- * / `EncodedPacketSchema`'s precedent; a `Buffer` is assignable to it.
6780
+ * (the wire-serialisable supertype of `Buffer`); a `Buffer` is assignable to
6781
+ * it.
6855
6782
  */
6856
6783
  var AudioChunkFormatSchema = _enum(AUDIO_CHUNK_FORMATS);
6857
6784
  var DecodedAudioChunkSchema = object({
@@ -6869,11 +6796,10 @@ var DecodedAudioChunkSchema = object({
6869
6796
  format: AudioChunkFormatSchema.optional()
6870
6797
  });
6871
6798
  /**
6872
- * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). The
6873
- * handle-free, ship-bytes-inline analogue of `subscribeFrames`: a consumer
6874
- * asks the broker for the decoded audio-chunk stream of one broker; the
6875
- * broker keeps a per-subscription bounded FIFO queue the consumer drains via
6876
- * `pullAudioChunks`.
6799
+ * Input for `stream-broker.subscribeAudioChunks` (Phase 5 / D9). Audio ships
6800
+ * its bytes inline: a consumer asks the broker for the decoded audio-chunk
6801
+ * stream of one broker; the broker keeps a per-subscription bounded FIFO queue
6802
+ * the consumer drains via `pullAudioChunks`.
6877
6803
  */
6878
6804
  var SubscribeAudioChunksInputSchema = object({
6879
6805
  brokerId: string(),
@@ -6904,9 +6830,7 @@ var BrokerStatsSchema = object({
6904
6830
  "stopped"
6905
6831
  ]),
6906
6832
  inputFps: number(),
6907
- decodeFps: number(),
6908
6833
  encodedSubscribers: number(),
6909
- decodedSubscribers: number(),
6910
6834
  uptimeMs: number(),
6911
6835
  bitrateKbps: number(),
6912
6836
  idrIntervalMs: number(),
@@ -6919,14 +6843,6 @@ var BrokerStatsSchema = object({
6919
6843
  preBufferMs: number(),
6920
6844
  preBufferPackets: number(),
6921
6845
  /**
6922
- * Moleculer node id of the decoder provider currently servicing this
6923
- * stream's decoded subscribers. `null` until the deferred decoder is
6924
- * created (no decoded clients yet, or codec not detected). Surfaces the
6925
- * runtime decoder placement so the UI can show "Decoder: <agent>" without
6926
- * a separate cap call per broker.
6927
- */
6928
- decoderNodeId: string().nullable(),
6929
- /**
6930
6846
  * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
6931
6847
  * when the stream has no audio track or the broker is in cold start.
6932
6848
  * `supported = false` means the codec was detected but the local
@@ -10360,70 +10276,6 @@ var StorageLocationDeclarationSchema = object({
10360
10276
  "backup"
10361
10277
  ]).optional()
10362
10278
  });
10363
- var DecoderStatsSchema = object({
10364
- inputFps: number(),
10365
- outputFps: number(),
10366
- avgDecodeTimeMs: number(),
10367
- droppedFrames: number(),
10368
- /**
10369
- * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
10370
- * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
10371
- * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
10372
- * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
10373
- */
10374
- lagMs: number().optional(),
10375
- effectiveFps: number().optional(),
10376
- adaptiveFps: number().optional()
10377
- });
10378
- var DecoderSessionConfigSchema = object({
10379
- codec: string(),
10380
- maxFps: number().default(0),
10381
- outputFormat: _enum([
10382
- "jpeg",
10383
- "rgb",
10384
- "bgr",
10385
- "yuv420",
10386
- "gray"
10387
- ]).default("jpeg"),
10388
- scale: number().default(1),
10389
- width: number().optional(),
10390
- height: number().optional(),
10391
- /**
10392
- * Identifier of the camera this decoder session serves. Optional
10393
- * because the cap is generic (any caller could request decode), but
10394
- * stream-broker passes it so decoder logs include `deviceId` for
10395
- * per-camera filtering when diagnosing failures (e.g. node-av
10396
- * sendPacket errors on a single hung camera).
10397
- */
10398
- deviceId: number().int().nonnegative().optional(),
10399
- /**
10400
- * Free-form tag for log scoping. Stream-broker uses
10401
- * `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
10402
- * on every line so `grep tag=broker:5/high` filters one camera
10403
- * profile cleanly.
10404
- */
10405
- tag: string().optional(),
10406
- /**
10407
- * Where the session delivers decoded frames (Phase 5 / D9):
10408
- *
10409
- * - `'callback'` (default) — the legacy pixel path: decoded frames are
10410
- * buffered as `DecodedFrame`s and drained via `pullFrames`.
10411
- * - `'shm'` — the shared-memory frame plane: decoded frames are written
10412
- * into an OS shared-memory ring and drained as zero-pixel
10413
- * `FrameHandle`s via `pullHandles`. A session is one mode or the
10414
- * other — `pullFrames` returns nothing for an `'shm'` session and
10415
- * `pullHandles` returns nothing for a `'callback'` session.
10416
- */
10417
- frameSink: _enum(["callback", "shm"]).default("callback"),
10418
- /**
10419
- * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
10420
- * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
10421
- * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
10422
- * stream-broker's `streamingDebug` gate — off by default so production logs
10423
- * stay quiet and the emit path pays zero per-frame cost when disabled.
10424
- */
10425
- debug: boolean().optional()
10426
- });
10427
10279
  /**
10428
10280
  * Per-component log CHANNELS — the gate a hot path consults, and the registry
10429
10281
  * an addon declares its channels in.
@@ -13027,13 +12879,6 @@ var BrokerRtspClientSchema = object({
13027
12879
  lastRtpAt: number(),
13028
12880
  bytesSent: number()
13029
12881
  });
13030
- var BrokerDecodedClientSchema = object({
13031
- tag: string(),
13032
- subscribedAt: number(),
13033
- maxFps: number(),
13034
- framesDelivered: number(),
13035
- framesDropped: number()
13036
- });
13037
12882
  var BrokerAudioClientSchema = object({
13038
12883
  tag: string(),
13039
12884
  subscribedAt: number(),
@@ -13125,7 +12970,6 @@ var BrokerEncodedClientSchema = object({
13125
12970
  });
13126
12971
  var BrokerClientsSchema = object({
13127
12972
  rtsp: array(BrokerRtspClientSchema).readonly(),
13128
- decoded: array(BrokerDecodedClientSchema).readonly(),
13129
12973
  audio: array(BrokerAudioClientSchema).readonly(),
13130
12974
  encoded: array(BrokerEncodedClientSchema).readonly(),
13131
12975
  pipeClients: number(),
@@ -13617,11 +13461,7 @@ var streamBrokerCapability = {
13617
13461
  listClients: method(object({ brokerId: string() }), BrokerClientsSchema),
13618
13462
  killClient: method(object({
13619
13463
  brokerId: string(),
13620
- channel: _enum([
13621
- "rtsp",
13622
- "decoded",
13623
- "audio"
13624
- ]),
13464
+ channel: _enum(["rtsp", "audio"]),
13625
13465
  handle: string()
13626
13466
  }), object({ killed: boolean() }), {
13627
13467
  kind: "mutation",
@@ -13720,31 +13560,6 @@ var streamBrokerCapability = {
13720
13560
  maxCount: number().int().positive().default(8)
13721
13561
  }), array(DecodedAudioChunkSchema).readonly()),
13722
13562
  unsubscribeAudioChunks: method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }),
13723
- /**
13724
- * ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────
13725
- *
13726
- * The handle-based replacement for the live-object `IStreamBroker.
13727
- * onDecodedFrame` callback path. A consumer:
13728
- *
13729
- * 1. `subscribeFrames({ brokerId, format })` — the broker spins up
13730
- * (or reuses) a `frameSink: 'shm'` decoder session producing that
13731
- * `format` and returns a `subscriptionId`.
13732
- * 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains
13733
- * zero-pixel `FrameHandle[]`; each handle is fed to a
13734
- * `FrameRingReader` that opens the named shm segment and reads the
13735
- * pixels back zero-copy.
13736
- * 3. `unsubscribeFrames({ subscriptionId })` on teardown.
13737
- *
13738
- * The broker keeps one shm ring per `(brokerId, format)` actually
13739
- * requested — no broker-side `sharp` conversion. fps throttling is
13740
- * implicit (latest-wins ring reads drop frames for a slow consumer).
13741
- */
13742
- subscribeFrames: method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }),
13743
- pullFrameHandles: method(object({
13744
- subscriptionId: string(),
13745
- maxCount: number().int().positive().default(4)
13746
- }), array(FrameHandleSchema).readonly()),
13747
- unsubscribeFrames: method(object({ subscriptionId: string() }), object({ released: boolean() }), { kind: "mutation" }),
13748
13563
  setPreBufferDuration: method(object({
13749
13564
  brokerId: string(),
13750
13565
  seconds: number().min(0).max(30)
@@ -15460,72 +15275,18 @@ id: union([string(), number()]) }), {
15460
15275
  })
15461
15276
  }
15462
15277
  };
15463
- /**
15464
- * shm ring usage stats for a `frameSink: 'shm'` decoder session —
15465
- * exposed via `decoder.getShmStats` so downstream consumers can
15466
- * observe ring pressure (slot count, byte budget, hit/miss ratio).
15467
- */
15468
- var ShmRingStatsSchema = object({
15469
- sessionId: string(),
15470
- slotCount: number().int(),
15471
- slotByteLength: number().int(),
15472
- segmentBytes: number().int(),
15473
- budgetMb: number().int(),
15474
- framesWritten: number().int(),
15475
- getFrameHits: number().int(),
15476
- getFrameMisses: number().int()
15477
- });
15478
15278
  var decoderCapability = {
15479
15279
  name: "decoder",
15480
15280
  scope: "system",
15481
15281
  mode: "singleton",
15482
15282
  preferredProvider: "decoder-nodeav",
15483
15283
  methods: {
15484
- supportsCodec: method(object({ codec: string() }), boolean()),
15485
15284
  getInfo: method(_void(), object({
15486
15285
  id: string(),
15487
15286
  name: string(),
15488
- isPullMode: boolean().optional(),
15489
- priority: number().optional(),
15490
15287
  hwaccel: string().optional(),
15491
15288
  probedBestHwaccel: string().optional()
15492
15289
  })),
15493
- createSession: method(DecoderSessionConfigSchema, object({
15494
- sessionId: string(),
15495
- nodeId: string()
15496
- })),
15497
- destroySession: method(object({ sessionId: string() }), _void()),
15498
- pushPacket: method(object({
15499
- sessionId: string(),
15500
- packet: EncodedPacketSchema
15501
- }), _void()),
15502
- openStream: method(object({
15503
- sessionId: string(),
15504
- url: string()
15505
- }), _void()),
15506
- pullFrames: method(object({
15507
- sessionId: string(),
15508
- maxCount: number().default(1),
15509
- waitMs: number().optional()
15510
- }), array(DecodedFrameSchema)),
15511
- pullHandles: method(object({
15512
- sessionId: string(),
15513
- maxCount: number().default(1),
15514
- waitMs: number().optional()
15515
- }), array(FrameHandleSchema)),
15516
- getFrame: method(object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()),
15517
- getShmStats: method(object({ sessionId: string() }), ShmRingStatsSchema.nullable()),
15518
- updateConfig: method(object({
15519
- sessionId: string(),
15520
- config: DecoderSessionConfigSchema.partial()
15521
- }), _void()),
15522
- getStats: method(object({ sessionId: string() }), DecoderStatsSchema),
15523
- listActiveSessions: method(_void(), array(object({
15524
- sessionId: string(),
15525
- codec: string(),
15526
- outputFormat: string(),
15527
- createdAtMs: number()
15528
- })).readonly()),
15529
15290
  /**
15530
15291
  * Re-run the host platform-probe for the decoder's hwaccel backend
15531
15292
  * and write the detected value into the addon's own global
@@ -24767,8 +24528,8 @@ Object.freeze(Object.fromEntries([{
24767
24528
  var CLUSTER_STEP_SETTING_FIELDS = [{
24768
24529
  stepId: "face-embedding",
24769
24530
  key: "minLandmarkFaceSize",
24770
- label: "Min face size for recognition (detection px)",
24771
- 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.",
24531
+ label: "Min face size to embed (detection-frame px)",
24532
+ 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.",
24772
24533
  type: "slider",
24773
24534
  min: 0,
24774
24535
  max: 64,
@@ -27480,21 +27241,6 @@ var PipelineDefaultStepSchema = lazy(() => object({
27480
27241
  group: string().optional(),
27481
27242
  settings: record(string(), unknown()).optional()
27482
27243
  }));
27483
- var PipelineTemplateStepSchema = lazy(() => object({
27484
- addonId: string(),
27485
- enabled: boolean(),
27486
- modelId: string(),
27487
- children: array(PipelineTemplateStepSchema).readonly(),
27488
- settings: record(string(), unknown()).optional()
27489
- }));
27490
- var PipelineTemplateSchema$1 = object({
27491
- id: string(),
27492
- name: string(),
27493
- createdAt: string(),
27494
- updatedAt: string(),
27495
- engine: PipelineEngineChoiceSchema,
27496
- steps: array(PipelineTemplateStepSchema).readonly()
27497
- });
27498
27244
  var PipelineModelOptionSchema = object({
27499
27245
  id: string(),
27500
27246
  name: string(),
@@ -27816,18 +27562,6 @@ var pipelineExecutorCapability = {
27816
27562
  steps: array(PipelineStepInputSchema),
27817
27563
  deviceKey: string().optional()
27818
27564
  }), PipelineValidationResultSchema),
27819
- listTemplates: method(_void(), array(PipelineTemplateSchema$1).readonly()),
27820
- saveTemplate: method(object({
27821
- name: string(),
27822
- steps: array(PipelineTemplateStepSchema).readonly(),
27823
- engine: PipelineEngineChoiceSchema
27824
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
27825
- updateTemplate: method(object({
27826
- id: string(),
27827
- name: string().optional(),
27828
- steps: array(PipelineTemplateStepSchema).readonly().optional()
27829
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
27830
- deleteTemplate: method(object({ id: string() }), _void(), { kind: "mutation" }),
27831
27565
  getCapabilities: method(_void(), InferenceCapabilitiesBridge),
27832
27566
  getAddonModels: method(object({ addonId: string() }), ModelAvailabilityListBridge),
27833
27567
  downloadModel: method(object({
@@ -29370,14 +29104,15 @@ var RunnerLocalLoadSchema = object({
29370
29104
  * Per-inference-device live load (multi-device C4). One entry per deviceKey
29371
29105
  * this runner currently has attached cameras on, so the orchestrator's second
29372
29106
  * `balance()` pass (over a node's devices) weights on real per-pool session
29373
- * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
29374
- * per device is 0 until the pool backlog gets a public accessor (follow-up).
29107
+ * counts. Empty on single-device / pre-multi-device runners. There is no
29108
+ * per-device queue depth: the inference pool's backlog has no accessor, and
29109
+ * a field that always read 0 was removed rather than shown as a measurement
29110
+ * (D762).
29375
29111
  */
29376
29112
  devices: array(object({
29377
29113
  deviceKey: string(),
29378
29114
  backend: string(),
29379
- attachedCameras: number(),
29380
- queueDepthTotal: number()
29115
+ attachedCameras: number()
29381
29116
  })).default([]),
29382
29117
  /** Hardware capability flags reported by this node. */
29383
29118
  hardware: object({
@@ -29783,14 +29518,6 @@ var CameraPipelineConfigSchema = object({
29783
29518
  settings: record(string(), unknown()).readonly().optional()
29784
29519
  }).nullable().optional()
29785
29520
  });
29786
- var PipelineTemplateSchema = object({
29787
- id: string(),
29788
- name: string(),
29789
- description: string().optional(),
29790
- config: CameraPipelineConfigSchema,
29791
- createdAt: string(),
29792
- updatedAt: string()
29793
- });
29794
29521
  var DeviceStepConfigSchema = object({
29795
29522
  modelId: string().optional(),
29796
29523
  settings: record(string(), unknown()).optional(),
@@ -29900,7 +29627,10 @@ var PipelineAssignmentSchema = object({
29900
29627
  });
29901
29628
  /**
29902
29629
  * Per-agent load summary surfaced to the load balancer + dashboards.
29903
- * Aggregated from each runner's `getLocalLoad` cap call.
29630
+ * Aggregated from each runner's `getLocalLoad` cap call. In the
29631
+ * `getAgentLoad` report, a single-device node's default-pool sessions (no
29632
+ * `deviceKey`) are credited to its one eligible device in `load.devices` —
29633
+ * the default pool IS that device (D745); the balancer's census stays raw.
29904
29634
  */
29905
29635
  var AgentLoadSummarySchema = object({
29906
29636
  nodeId: string(),
@@ -29989,26 +29719,27 @@ var CameraBrokerStatusSchema = object({
29989
29719
  width: number(),
29990
29720
  height: number(),
29991
29721
  subscribers: number(),
29992
- inFps: number(),
29993
- outFps: number()
29722
+ /**
29723
+ * Encoded packets/s the broker receives from the camera. null when the
29724
+ * broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
29725
+ * There is no output rate: decoding runs in the session decode workers, not
29726
+ * in the broker, so the broker's own decoded-frame rate is 0 on every live
29727
+ * camera and is not served (D758).
29728
+ */
29729
+ inFps: number().nullable()
29994
29730
  })).readonly(),
29995
29731
  webrtcSessions: number(),
29996
29732
  rtspRestream: boolean()
29997
29733
  });
29998
- /** Shared-memory ring statistics within the decoder block. */
29999
- var CameraDecoderShmSchema = object({
30000
- framesWritten: number(),
30001
- getFrameHits: number(),
30002
- getFrameMisses: number(),
30003
- budgetMb: number()
30004
- });
30005
- /** Decoder block — null when the decoder stage is unreachable or inactive. */
30006
- var CameraDecoderStatusSchema = object({
30007
- nodeId: string(),
30008
- formats: array(string()).readonly(),
30009
- sessionCount: number(),
30010
- shm: CameraDecoderShmSchema
30011
- });
29734
+ /**
29735
+ * Decoder block — WHERE decode runs (co-located with the detection node by
29736
+ * construction); null when the camera has no detection node. It carries no
29737
+ * frame counter: the shared-memory plane whose counters it used to serve is
29738
+ * gone, and those fields read 0 forever. Whether frames actually flow is read
29739
+ * from `detection.actualFps` (frames delivered to and processed by the
29740
+ * detector), never from a counter nothing feeds.
29741
+ */
29742
+ var CameraDecoderStatusSchema = object({ nodeId: string() });
30012
29743
  /** Motion block — null when motion detection is not active for this device. */
30013
29744
  var CameraMotionStatusSchema = object({
30014
29745
  enabled: boolean(),
@@ -30862,33 +30593,7 @@ var pipelineOrchestratorCapability = {
30862
30593
  auth: "admin"
30863
30594
  }),
30864
30595
  /** Snapshot of the in-flight or last disk-wins fleet reconcile. */
30865
- getReconcileFromDiskStatus: method(_void(), DiskReconcileJobSchema, { auth: "admin" }),
30866
- /** List every template the operator has saved. */
30867
- listTemplates: method(_void(), array(PipelineTemplateSchema).readonly()),
30868
- /** Create a new named preset from a given CameraPipelineConfig. */
30869
- saveTemplate: method(object({
30870
- name: string(),
30871
- description: string().optional(),
30872
- config: CameraPipelineConfigSchema
30873
- }), PipelineTemplateSchema, {
30874
- kind: "mutation",
30875
- auth: "admin"
30876
- }),
30877
- /** Partial update of a template. Any omitted field is preserved. */
30878
- updateTemplate: method(object({
30879
- id: string(),
30880
- name: string().optional(),
30881
- description: string().optional(),
30882
- config: CameraPipelineConfigSchema.optional()
30883
- }), PipelineTemplateSchema, {
30884
- kind: "mutation",
30885
- auth: "admin"
30886
- }),
30887
- /** Remove a template. Camera configs that were seeded from it keep a copy. */
30888
- deleteTemplate: method(object({ id: string() }), object({ success: literal(true) }), {
30889
- kind: "mutation",
30890
- auth: "admin"
30891
- })
30596
+ getReconcileFromDiskStatus: method(_void(), DiskReconcileJobSchema, { auth: "admin" })
30892
30597
  }
30893
30598
  };
30894
30599
  /**
@@ -33818,8 +33523,6 @@ var WebrtcStreamChoiceSchema = object({
33818
33523
  ]).nullable(),
33819
33524
  /** Input FPS from the camera (null for adaptive). */
33820
33525
  inputFps: number().nullable(),
33821
- /** Decoded FPS (null for adaptive). */
33822
- decodeFps: number().nullable(),
33823
33526
  /** Bitrate in kbps (null for adaptive). */
33824
33527
  bitrateKbps: number().nullable()
33825
33528
  });
@@ -48409,90 +48112,18 @@ Object.freeze({
48409
48112
  addonId: null,
48410
48113
  access: "create"
48411
48114
  },
48412
- "decoder.createSession": {
48413
- capName: "decoder",
48414
- capScope: "system",
48415
- addonId: null,
48416
- access: "view"
48417
- },
48418
- "decoder.destroySession": {
48419
- capName: "decoder",
48420
- capScope: "system",
48421
- addonId: null,
48422
- access: "delete"
48423
- },
48424
- "decoder.getFrame": {
48425
- capName: "decoder",
48426
- capScope: "system",
48427
- addonId: null,
48428
- access: "view"
48429
- },
48430
48115
  "decoder.getInfo": {
48431
48116
  capName: "decoder",
48432
48117
  capScope: "system",
48433
48118
  addonId: null,
48434
48119
  access: "view"
48435
48120
  },
48436
- "decoder.getShmStats": {
48437
- capName: "decoder",
48438
- capScope: "system",
48439
- addonId: null,
48440
- access: "view"
48441
- },
48442
- "decoder.getStats": {
48443
- capName: "decoder",
48444
- capScope: "system",
48445
- addonId: null,
48446
- access: "view"
48447
- },
48448
- "decoder.listActiveSessions": {
48449
- capName: "decoder",
48450
- capScope: "system",
48451
- addonId: null,
48452
- access: "view"
48453
- },
48454
- "decoder.openStream": {
48455
- capName: "decoder",
48456
- capScope: "system",
48457
- addonId: null,
48458
- access: "view"
48459
- },
48460
- "decoder.pullFrames": {
48461
- capName: "decoder",
48462
- capScope: "system",
48463
- addonId: null,
48464
- access: "view"
48465
- },
48466
- "decoder.pullHandles": {
48467
- capName: "decoder",
48468
- capScope: "system",
48469
- addonId: null,
48470
- access: "view"
48471
- },
48472
- "decoder.pushPacket": {
48473
- capName: "decoder",
48474
- capScope: "system",
48475
- addonId: null,
48476
- access: "view"
48477
- },
48478
48121
  "decoder.reprobeHwaccel": {
48479
48122
  capName: "decoder",
48480
48123
  capScope: "system",
48481
48124
  addonId: null,
48482
48125
  access: "create"
48483
48126
  },
48484
- "decoder.supportsCodec": {
48485
- capName: "decoder",
48486
- capScope: "system",
48487
- addonId: null,
48488
- access: "view"
48489
- },
48490
- "decoder.updateConfig": {
48491
- capName: "decoder",
48492
- capScope: "system",
48493
- addonId: null,
48494
- access: "view"
48495
- },
48496
48127
  "detectionPipeline.applyDeviceSettingsPatch": {
48497
48128
  capName: "detection-pipeline",
48498
48129
  capScope: "device",
@@ -51583,12 +51214,6 @@ Object.freeze({
51583
51214
  addonId: null,
51584
51215
  access: "delete"
51585
51216
  },
51586
- "pipelineExecutor.deleteTemplate": {
51587
- capName: "pipeline-executor",
51588
- capScope: "system",
51589
- addonId: null,
51590
- access: "delete"
51591
- },
51592
51217
  "pipelineExecutor.downloadModel": {
51593
51218
  capName: "pipeline-executor",
51594
51219
  capScope: "system",
@@ -51727,12 +51352,6 @@ Object.freeze({
51727
51352
  addonId: null,
51728
51353
  access: "view"
51729
51354
  },
51730
- "pipelineExecutor.listTemplates": {
51731
- capName: "pipeline-executor",
51732
- capScope: "system",
51733
- addonId: null,
51734
- access: "view"
51735
- },
51736
51355
  "pipelineExecutor.rearmInferenceDevice": {
51737
51356
  capName: "pipeline-executor",
51738
51357
  capScope: "system",
@@ -51757,12 +51376,6 @@ Object.freeze({
51757
51376
  addonId: null,
51758
51377
  access: "create"
51759
51378
  },
51760
- "pipelineExecutor.saveTemplate": {
51761
- capName: "pipeline-executor",
51762
- capScope: "system",
51763
- addonId: null,
51764
- access: "create"
51765
- },
51766
51379
  "pipelineExecutor.setVideoPipelineSteps": {
51767
51380
  capName: "pipeline-executor",
51768
51381
  capScope: "system",
@@ -51781,12 +51394,6 @@ Object.freeze({
51781
51394
  addonId: null,
51782
51395
  access: "create"
51783
51396
  },
51784
- "pipelineExecutor.updateTemplate": {
51785
- capName: "pipeline-executor",
51786
- capScope: "system",
51787
- addonId: null,
51788
- access: "create"
51789
- },
51790
51397
  "pipelineExecutor.validatePipeline": {
51791
51398
  capName: "pipeline-executor",
51792
51399
  capScope: "system",
@@ -51817,12 +51424,6 @@ Object.freeze({
51817
51424
  addonId: null,
51818
51425
  access: "create"
51819
51426
  },
51820
- "pipelineOrchestrator.deleteTemplate": {
51821
- capName: "pipeline-orchestrator",
51822
- capScope: "system",
51823
- addonId: null,
51824
- access: "delete"
51825
- },
51826
51427
  "pipelineOrchestrator.getAgentLoad": {
51827
51428
  capName: "pipeline-orchestrator",
51828
51429
  capScope: "system",
@@ -51973,12 +51574,6 @@ Object.freeze({
51973
51574
  addonId: null,
51974
51575
  access: "view"
51975
51576
  },
51976
- "pipelineOrchestrator.listTemplates": {
51977
- capName: "pipeline-orchestrator",
51978
- capScope: "system",
51979
- addonId: null,
51980
- access: "view"
51981
- },
51982
51577
  "pipelineOrchestrator.pauseForStorageMigration": {
51983
51578
  capName: "pipeline-orchestrator",
51984
51579
  capScope: "system",
@@ -52033,12 +51628,6 @@ Object.freeze({
52033
51628
  addonId: null,
52034
51629
  access: "create"
52035
51630
  },
52036
- "pipelineOrchestrator.saveTemplate": {
52037
- capName: "pipeline-orchestrator",
52038
- capScope: "system",
52039
- addonId: null,
52040
- access: "create"
52041
- },
52042
51631
  "pipelineOrchestrator.setAgentCapabilities": {
52043
51632
  capName: "pipeline-orchestrator",
52044
51633
  capScope: "system",
@@ -52147,12 +51736,6 @@ Object.freeze({
52147
51736
  addonId: null,
52148
51737
  access: "create"
52149
51738
  },
52150
- "pipelineOrchestrator.updateTemplate": {
52151
- capName: "pipeline-orchestrator",
52152
- capScope: "system",
52153
- addonId: null,
52154
- access: "create"
52155
- },
52156
51739
  "pipelineRunner.attachCamera": {
52157
51740
  capName: "pipeline-runner",
52158
51741
  capScope: "system",
@@ -53587,12 +53170,6 @@ Object.freeze({
53587
53170
  addonId: null,
53588
53171
  access: "view"
53589
53172
  },
53590
- "streamBroker.pullFrameHandles": {
53591
- capName: "stream-broker",
53592
- capScope: "system",
53593
- addonId: null,
53594
- access: "view"
53595
- },
53596
53173
  "streamBroker.regenerateRtspToken": {
53597
53174
  capName: "stream-broker",
53598
53175
  capScope: "system",
@@ -53659,12 +53236,6 @@ Object.freeze({
53659
53236
  addonId: null,
53660
53237
  access: "create"
53661
53238
  },
53662
- "streamBroker.subscribeFrames": {
53663
- capName: "stream-broker",
53664
- capScope: "system",
53665
- addonId: null,
53666
- access: "create"
53667
- },
53668
53239
  "streamBroker.unassignProfile": {
53669
53240
  capName: "stream-broker",
53670
53241
  capScope: "system",
@@ -53677,12 +53248,6 @@ Object.freeze({
53677
53248
  addonId: null,
53678
53249
  access: "create"
53679
53250
  },
53680
- "streamBroker.unsubscribeFrames": {
53681
- capName: "stream-broker",
53682
- capScope: "system",
53683
- addonId: null,
53684
- access: "create"
53685
- },
53686
53251
  "streamCatalog.getCatalog": {
53687
53252
  capName: "stream-catalog",
53688
53253
  capScope: "device",
@@ -56372,11 +55937,6 @@ Object.freeze({
56372
55937
  form: "single",
56373
55938
  optional: false
56374
55939
  }],
56375
- "decoder.createSession": [{
56376
- name: "deviceId",
56377
- form: "single",
56378
- optional: true
56379
- }],
56380
55940
  "detectionPipeline.applyDeviceSettingsPatch": [{
56381
55941
  name: "deviceId",
56382
55942
  form: "single",