@camstack/addon-osd-manager 0.1.179 → 0.1.181

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-B5aXZahp.mjs → MotionZonesSettings-r-5gadcs.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CCZyGdiM.mjs → PrivacyMaskSettings-DPJp4rMl.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-CzAhKl5N.mjs → SceneMonitorEditor-H5pQrHy7.mjs} +3 -3
  4. package/dist/_stub.js +4298 -4298
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-COWlbxsR.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C2I-8Qsr.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CYSzhahm.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-Bcrn7TOt.mjs → hostInit-CaDP2Kts.mjs} +2 -2
  9. package/dist/index.js +468 -28
  10. package/dist/index.mjs +468 -28
  11. package/dist/{player-overlays-UBW4zDFH.mjs → player-overlays-CWcXFKuD.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-DXhNKsuH.mjs → responsive-BpY0yafY.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-C2sIrKPI.mjs → scene-monitor-copy-413cUke-.mjs} +1 -1
  15. package/dist/{square-BA6S8jxe.mjs → square-CtY8II3Z.mjs} +1 -1
  16. package/dist/{trash-2-ou0dJwcr.mjs → trash-2-m46kRm2C.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BnoZzYog.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-7EsNkWO1.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-t6WKuxCf.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -10610,7 +10610,53 @@ var ModelFormatEntrySchema = object({
10610
10610
  /** Multi-file payload (directory members or sibling files). */
10611
10611
  files: array(string()).readonly().optional(),
10612
10612
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
10613
- runtimes: array(_enum(["python"])).readonly().optional()
10613
+ runtimes: array(_enum(["python"])).readonly().optional(),
10614
+ /**
10615
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
10616
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
10617
+ * weight file) comes from the downloader's generated table, kept in step
10618
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
10619
+ * node records the revision it downloaded next to the file
10620
+ * (`<file>.revision`); a copy with no record or a different one is stale
10621
+ * unless its weight file hashes to the revision, and a stale copy is
10622
+ * downloaded again, the old one serving until the new one is complete. No
10623
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
10624
+ */
10625
+ revision: string().min(1).optional()
10626
+ });
10627
+ /**
10628
+ * What a node holds for one (model, format) (D746). `current` is a complete
10629
+ * copy at its catalog revision — exactly what `downloaded: true` means.
10630
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
10631
+ * no or a different revision record, or a missing sibling. `missing` is no
10632
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
10633
+ * reclaimable bytes and a copy about to be replaced.
10634
+ */
10635
+ var ModelOnDiskStateSchema = _enum([
10636
+ "current",
10637
+ "stale",
10638
+ "missing"
10639
+ ]);
10640
+ /**
10641
+ * The numeric precision of one format's BUILD (D746) — reported only when the
10642
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
10643
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
10644
+ */
10645
+ var ModelFormatPrecisionSchema = _enum([
10646
+ "fp32",
10647
+ "fp16",
10648
+ "int8"
10649
+ ]);
10650
+ /**
10651
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
10652
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
10653
+ * them omits them, and a reader falls back to `downloaded`.
10654
+ */
10655
+ var PipelineModelFormatStatusSchema = object({
10656
+ downloaded: boolean(),
10657
+ sizeMB: number(),
10658
+ onDisk: ModelOnDiskStateSchema.optional(),
10659
+ precision: ModelFormatPrecisionSchema.optional()
10614
10660
  });
10615
10661
  /**
10616
10662
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -27373,7 +27419,7 @@ var FrameRefSchema = object({
27373
27419
  timestamp: number(),
27374
27420
  capturedAt: number().optional()
27375
27421
  });
27376
- var ModelFormatSchema$1 = _enum([
27422
+ var ModelFormatSchema$2 = _enum([
27377
27423
  "onnx",
27378
27424
  "coreml",
27379
27425
  "openvino",
@@ -27391,7 +27437,7 @@ var PipelineSlotSchema = _enum([
27391
27437
  var PipelineEngineChoiceSchema = object({
27392
27438
  runtime: literal("python"),
27393
27439
  backend: string(),
27394
- format: ModelFormatSchema$1,
27440
+ format: ModelFormatSchema$2,
27395
27441
  device: string().optional()
27396
27442
  });
27397
27443
  /**
@@ -27448,10 +27494,7 @@ var PipelineTemplateSchema$1 = object({
27448
27494
  var PipelineModelOptionSchema = object({
27449
27495
  id: string(),
27450
27496
  name: string(),
27451
- formats: record(string(), object({
27452
- downloaded: boolean(),
27453
- sizeMB: number()
27454
- })),
27497
+ formats: record(string(), PipelineModelFormatStatusSchema),
27455
27498
  group: ModelVariantGroupSchema.optional(),
27456
27499
  legacy: boolean().optional(),
27457
27500
  provider: ModelProviderIdSchema.optional(),
@@ -27666,6 +27709,32 @@ var pipelineExecutorCapability = {
27666
27709
  auth: "admin"
27667
27710
  }),
27668
27711
  /**
27712
+ * Best settings (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
27713
+ * the object-detection root, and their binding keys) stored in THIS node's
27714
+ * per-camera detector settings — and, unless `dryRun`, remove them so the
27715
+ * running model's own defaults apply. Every other key of a camera's store
27716
+ * is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
27717
+ * with a store. A camera whose store could not be read is `refused`, never
27718
+ * reported as clean.
27719
+ */
27720
+ clearModelBoundDeviceOverrides: method(object({
27721
+ nodeId: string(),
27722
+ deviceIds: array(number()).readonly().optional(),
27723
+ dryRun: boolean()
27724
+ }), object({
27725
+ entries: array(object({
27726
+ deviceId: number(),
27727
+ keys: array(string()).readonly()
27728
+ })).readonly(),
27729
+ refused: array(object({
27730
+ deviceId: number(),
27731
+ reason: string()
27732
+ })).readonly()
27733
+ }), {
27734
+ kind: "mutation",
27735
+ auth: "admin"
27736
+ }),
27737
+ /**
27669
27738
  * Which of THIS node's inference devices the executor currently refuses,
27670
27739
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
27671
27740
  *
@@ -27760,12 +27829,12 @@ var pipelineExecutorCapability = {
27760
27829
  downloadModel: method(object({
27761
27830
  addonId: string(),
27762
27831
  modelId: string(),
27763
- format: ModelFormatSchema$1
27832
+ format: ModelFormatSchema$2
27764
27833
  }), DownloadModelResultSchema, { kind: "mutation" }),
27765
27834
  deleteModel: method(object({
27766
27835
  addonId: string(),
27767
27836
  modelId: string(),
27768
- format: ModelFormatSchema$1
27837
+ format: ModelFormatSchema$2
27769
27838
  }), object({ success: literal(true) }), { kind: "mutation" }),
27770
27839
  /**
27771
27840
  * Stateless single-frame execution. Callers (runner, benchmark) pass
@@ -28011,6 +28080,307 @@ var pipelineExecutorCapability = {
28011
28080
  getDetectionConfigSchema: method(_void(), ConfigUISchemaNullableBridge)
28012
28081
  }
28013
28082
  };
28083
+ /**
28084
+ * Wire shapes of the Load balancing surface (D748): the session placement
28085
+ * policy, the atomic share write, the observed placement statistics, the
28086
+ * hardware share suggestion and the stale device pins.
28087
+ */
28088
+ /**
28089
+ * How a new detection session picks its node and device.
28090
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
28091
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
28092
+ * weight only bites once a node already holds a session.
28093
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
28094
+ * full or drowning node yields to a free one (D748).
28095
+ */
28096
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
28097
+ var LoadBalancingSharesInputSchema = object({
28098
+ /** nodeId → share (> 0). A node left out keeps its weight. */
28099
+ nodes: record(string(), number().positive()).default({}),
28100
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
28101
+ devices: record(string(), record(string(), number().positive())).default({})
28102
+ });
28103
+ var PlacementStatsInputSchema = object({
28104
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
28105
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
28106
+ var PlacementDeviceStatsSchema = object({
28107
+ deviceKey: string(),
28108
+ /** Sessions running on this device now. */
28109
+ sessionsNow: number(),
28110
+ /** Sessions started on this device inside the window. */
28111
+ sessionsStarted: number(),
28112
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
28113
+ observedShare: number().nullable()
28114
+ });
28115
+ var PlacementNodeStatsSchema = object({
28116
+ nodeId: string(),
28117
+ sessionsNow: number(),
28118
+ sessionsStarted: number(),
28119
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
28120
+ observedShare: number().nullable(),
28121
+ /** Most sessions this node ran at once inside the window. */
28122
+ peakSessions: number(),
28123
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
28124
+ yieldsAway: number(),
28125
+ devices: array(PlacementDeviceStatsSchema).readonly()
28126
+ });
28127
+ /** A camera's device pin that the session path cannot honour. */
28128
+ var StaleDevicePinSchema = object({
28129
+ deviceId: number(),
28130
+ deviceKey: string(),
28131
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
28132
+ reason: _enum(["disabled", "absent"])
28133
+ });
28134
+ var PlacementStatsSchema = object({
28135
+ policy: SessionPlacementPolicySchema,
28136
+ windowMs: number(),
28137
+ /** How much of the window was actually observed (the hub keeps it in memory). */
28138
+ observedForMs: number(),
28139
+ sessionsNow: number(),
28140
+ /** Most parallel sessions across the cluster inside the window. */
28141
+ clusterPeakSessions: number(),
28142
+ nodes: array(PlacementNodeStatsSchema).readonly(),
28143
+ stalePins: array(StaleDevicePinSchema).readonly()
28144
+ });
28145
+ var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
28146
+ var SuggestedDeviceShareSchema = object({
28147
+ deviceKey: string(),
28148
+ /** Share of the node (0–100, rounded). */
28149
+ share: number(),
28150
+ modelId: string().nullable(),
28151
+ /** Inferences per second at that model, from the measured table. */
28152
+ fps: number().nullable(),
28153
+ measured: boolean(),
28154
+ /** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
28155
+ suggestedMaxSessions: number().nullable()
28156
+ });
28157
+ var SuggestedNodeShareSchema = object({
28158
+ nodeId: string(),
28159
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
28160
+ share: number().nullable(),
28161
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
28162
+ capacitySessions: number(),
28163
+ devices: array(SuggestedDeviceShareSchema).readonly(),
28164
+ skippedReason: string().nullable()
28165
+ });
28166
+ var SuggestSharesResultSchema = object({
28167
+ headroom: number(),
28168
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
28169
+ cameraFps: number(),
28170
+ /** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
28171
+ iterations: number(),
28172
+ nodes: array(SuggestedNodeShareSchema).readonly()
28173
+ });
28174
+ /**
28175
+ * The wire shapes of the Best settings plan and apply (D745), used by the
28176
+ * `pipeline-orchestrator` cap. The recommender's own types
28177
+ * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
28178
+ * schemas are what crosses the cap boundary.
28179
+ */
28180
+ var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
28181
+ var HardwareClassIdSchema = _enum([
28182
+ "intel-core-ultra",
28183
+ "intel-n-series",
28184
+ "apple-m-base",
28185
+ "apple-m-pro",
28186
+ "unknown"
28187
+ ]);
28188
+ var AcceleratorKindSchema = _enum([
28189
+ "intel-npu",
28190
+ "intel-igpu",
28191
+ "x86-cpu",
28192
+ "arm-cpu",
28193
+ "apple-ane",
28194
+ "coral"
28195
+ ]);
28196
+ var RecommendationReasonSchema = discriminatedUnion("kind", [
28197
+ object({
28198
+ kind: literal("fits"),
28199
+ utilisation: number()
28200
+ }),
28201
+ object({
28202
+ kind: literal("tie-faster"),
28203
+ over: string(),
28204
+ recallDelta: number()
28205
+ }),
28206
+ object({
28207
+ kind: literal("stepped-down"),
28208
+ from: string(),
28209
+ to: string(),
28210
+ limitedBy: string()
28211
+ }),
28212
+ object({
28213
+ kind: literal("no-fit-lightest"),
28214
+ utilisation: number()
28215
+ }),
28216
+ object({
28217
+ kind: literal("derived-latency"),
28218
+ modelId: string()
28219
+ }),
28220
+ object({
28221
+ kind: literal("estimated-load"),
28222
+ observedForMs: number().nullable()
28223
+ }),
28224
+ object({ kind: literal("cpu-device") }),
28225
+ object({ kind: literal("coral-untouched") }),
28226
+ object({ kind: literal("device-disabled") }),
28227
+ object({ kind: literal("device-unavailable") }),
28228
+ object({ kind: literal("node-offline") }),
28229
+ object({ kind: literal("no-hardware-facts") }),
28230
+ object({
28231
+ kind: literal("no-measured-data"),
28232
+ hardwareClass: HardwareClassIdSchema
28233
+ }),
28234
+ object({
28235
+ kind: literal("no-family-build"),
28236
+ format: ModelFormatSchema$1
28237
+ })
28238
+ ]);
28239
+ var DeviceDemandSchema = object({
28240
+ nodeId: string(),
28241
+ deviceKey: string(),
28242
+ demandFps: number(),
28243
+ maxCameraFps: number(),
28244
+ alwaysOnCameras: number(),
28245
+ onMotionSessions: number(),
28246
+ onMotionSource: _enum([
28247
+ "observed-24h",
28248
+ "estimate",
28249
+ "none"
28250
+ ]),
28251
+ observedForMs: number().nullable(),
28252
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
28253
+ placement: SessionPlacementPolicySchema
28254
+ });
28255
+ var DeviceModelChoiceSchema = object({
28256
+ modelId: string(),
28257
+ p50Ms: number(),
28258
+ fps: number(),
28259
+ measured: boolean(),
28260
+ utilisation: number(),
28261
+ personRecall: number()
28262
+ });
28263
+ var DeviceRecommendationSchema = object({
28264
+ deviceKey: string(),
28265
+ accelerator: AcceleratorKindSchema.nullable(),
28266
+ enabled: boolean(),
28267
+ available: boolean(),
28268
+ demand: DeviceDemandSchema.nullable(),
28269
+ chosen: DeviceModelChoiceSchema.nullable(),
28270
+ reasons: array(RecommendationReasonSchema).readonly()
28271
+ });
28272
+ var NodeRecommendationSchema = object({
28273
+ nodeId: string(),
28274
+ reachable: boolean(),
28275
+ hardwareClass: HardwareClassIdSchema.nullable(),
28276
+ cpuModel: string().nullable(),
28277
+ skipped: boolean(),
28278
+ acceleratorModelId: string().nullable(),
28279
+ devices: array(DeviceRecommendationSchema).readonly(),
28280
+ reasons: array(RecommendationReasonSchema).readonly()
28281
+ });
28282
+ var ModelPinChangeSchema = object({
28283
+ stepId: string(),
28284
+ before: string().nullable(),
28285
+ after: string().nullable()
28286
+ });
28287
+ var NodeDeviceChangeSchema = object({
28288
+ nodeId: string(),
28289
+ deviceKey: string(),
28290
+ madeExplicit: boolean(),
28291
+ modelPins: array(ModelPinChangeSchema).readonly(),
28292
+ thresholds: array(object({
28293
+ stepId: string(),
28294
+ keys: array(string()).readonly()
28295
+ })).readonly()
28296
+ });
28297
+ var CameraOverrideClearSchema = object({
28298
+ deviceId: number(),
28299
+ source: _enum(["step-override", "wholesale"]),
28300
+ nodeId: string(),
28301
+ deviceKey: string().nullable(),
28302
+ stepId: string(),
28303
+ modelIdBefore: string().nullable(),
28304
+ keys: array(string()).readonly()
28305
+ });
28306
+ var DetectorStoreClearSchema = object({
28307
+ deviceId: number(),
28308
+ keys: array(string()).readonly()
28309
+ });
28310
+ var BestSettingsWarningSchema = discriminatedUnion("kind", [
28311
+ object({
28312
+ kind: literal("detector-store-cluster-wide"),
28313
+ skippedNodes: array(string()).readonly()
28314
+ }),
28315
+ object({
28316
+ kind: literal("detector-store-unreadable"),
28317
+ error: string()
28318
+ }),
28319
+ object({
28320
+ kind: literal("coral-enabled"),
28321
+ nodeId: string(),
28322
+ deviceKey: string()
28323
+ })
28324
+ ]);
28325
+ var BestSettingsOptionsSchema = object({
28326
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
28327
+ headroom: number().min(.3).max(.5).default(.4),
28328
+ /**
28329
+ * What-if shares (D748): plan as if these node/device shares were stored
28330
+ * and the policy were `share`. Absent = the stored shares under the stored
28331
+ * policy. A what-if plan is for display; apply always re-plans from what
28332
+ * is stored.
28333
+ */
28334
+ shares: LoadBalancingSharesInputSchema.optional()
28335
+ });
28336
+ var BestSettingsPlanSchema = object({
28337
+ /** Hash of everything the apply will write — the apply refuses a different one. */
28338
+ planHash: string(),
28339
+ family: literal("yolov9"),
28340
+ headroom: number(),
28341
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
28342
+ whatIf: boolean(),
28343
+ generatedAt: number(),
28344
+ nodes: array(NodeRecommendationSchema).readonly(),
28345
+ nodeChanges: array(NodeDeviceChangeSchema).readonly(),
28346
+ cameraClears: array(CameraOverrideClearSchema).readonly(),
28347
+ detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
28348
+ warnings: array(BestSettingsWarningSchema).readonly()
28349
+ });
28350
+ var BestSettingsApplyInputSchema = object({
28351
+ planHash: string(),
28352
+ headroom: number().min(.3).max(.5).default(.4)
28353
+ });
28354
+ var BestSettingsPhaseResultSchema = object({
28355
+ phase: _enum([
28356
+ "download",
28357
+ "camera-overrides",
28358
+ "detector-thresholds",
28359
+ "node-models",
28360
+ "redispatch"
28361
+ ]),
28362
+ ok: boolean(),
28363
+ detail: string()
28364
+ });
28365
+ var BestSettingsApplyResultSchema = discriminatedUnion("kind", [
28366
+ object({
28367
+ kind: literal("applied"),
28368
+ planHash: string(),
28369
+ phases: array(BestSettingsPhaseResultSchema).readonly()
28370
+ }),
28371
+ object({
28372
+ kind: literal("aborted"),
28373
+ phases: array(BestSettingsPhaseResultSchema).readonly()
28374
+ }),
28375
+ object({
28376
+ kind: literal("stale"),
28377
+ plan: BestSettingsPlanSchema
28378
+ }),
28379
+ object({
28380
+ kind: literal("refused"),
28381
+ reason: _enum(["apply-in-progress"])
28382
+ })
28383
+ ]);
28014
28384
  object({
28015
28385
  activeCameras: number(),
28016
28386
  throttledCameras: number(),
@@ -29423,7 +29793,6 @@ var CameraStepOverridePatchSchema = object({
29423
29793
  settings: record(string(), unknown()).readonly().optional()
29424
29794
  });
29425
29795
  var CameraPipelineSettingsSchema = object({
29426
- pinnedAgentNodeId: string().optional(),
29427
29796
  stepToggles: record(string(), boolean()).optional(),
29428
29797
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
29429
29798
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -30071,18 +30440,6 @@ var pipelineOrchestratorCapability = {
30071
30440
  auth: "admin"
30072
30441
  }),
30073
30442
  /**
30074
- * Set a node's detection WEIGHT (relative share for the quota balancer).
30075
- * `null` clears it (back to the implicit weight 1). Unpinned cameras
30076
- * distribute proportionally to weight; `maxCameras` still clamps on top.
30077
- */
30078
- setAgentDetectWeight: method(object({
30079
- agentNodeId: string(),
30080
- detectWeight: number().positive().nullable()
30081
- }), object({ success: literal(true) }), {
30082
- kind: "mutation",
30083
- auth: "admin"
30084
- }),
30085
- /**
30086
30443
  * Set one node's placement CAPABILITIES — the per-node record that
30087
30444
  * replaced the four flat orchestrator lists (`enabledNodes`,
30088
30445
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -30201,6 +30558,54 @@ var pipelineOrchestratorCapability = {
30201
30558
  kind: "mutation",
30202
30559
  auth: "admin"
30203
30560
  }),
30561
+ /**
30562
+ * Best settings (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
30563
+ * for the whole cluster from each node's static hardware class, the
30564
+ * measured latency table and the detection demand, and lists every write
30565
+ * the apply would make: the node model pins set, the enrichment pins and
30566
+ * model-bound thresholds removed (node level and per camera), and the
30567
+ * per-camera detector thresholds cleared. Writes nothing. Step
30568
+ * enablement, device enablement, pins, recording, notifications, zones and
30569
+ * rules are never part of it. `planHash` names exactly this diff.
30570
+ */
30571
+ planBestSettings: method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }),
30572
+ /**
30573
+ * Best settings (D745) — APPLY the plan the operator confirmed. Recomputes
30574
+ * the plan and refuses (`stale`, with the fresh plan) when its hash is not
30575
+ * `planHash`, so what is written is exactly the confirmed diff. Offline
30576
+ * nodes are skipped; there is no undo.
30577
+ */
30578
+ applyBestSettings: method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
30579
+ kind: "mutation",
30580
+ auth: "admin"
30581
+ }),
30582
+ /**
30583
+ * Load balancing (D748) — write node shares (`detectWeight`) and per-node
30584
+ * device shares (inference-device `weight`) in ONE atomic read-modify-write
30585
+ * of the agent settings — the only writer of node shares (the per-node
30586
+ * `setAgentDetectWeight` it replaced raced its siblings, one RMW each).
30587
+ * A node or device left out keeps its weight. Never changes the
30588
+ * `sessionPlacement` policy.
30589
+ */
30590
+ setLoadBalancingShares: method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
30591
+ kind: "mutation",
30592
+ auth: "admin"
30593
+ }),
30594
+ /**
30595
+ * Load balancing (D748) — what placement actually did: per node and
30596
+ * device, sessions now, sessions started and the time-weighted share of
30597
+ * PARALLEL sessions over `windowMs`; the cluster's parallel peak; yields
30598
+ * a share election made; and every device pin the session path cannot
30599
+ * honour. In memory on the hub — a restart starts a new window.
30600
+ */
30601
+ getPlacementStats: method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }),
30602
+ /**
30603
+ * Load balancing (D748) — shares proportional to each node's measured
30604
+ * capacity at the models Best settings would pick, iterated (≤ 3 rounds)
30605
+ * until the shares stop moving; per device, an ADVISORY session cap.
30606
+ * Writes nothing.
30607
+ */
30608
+ suggestShares: method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }),
30204
30609
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
30205
30610
  getCameraSettings: method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()),
30206
30611
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -51054,6 +51459,12 @@ Object.freeze({
51054
51459
  addonId: null,
51055
51460
  access: "delete"
51056
51461
  },
51462
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
51463
+ capName: "pipeline-executor",
51464
+ capScope: "system",
51465
+ addonId: null,
51466
+ access: "delete"
51467
+ },
51057
51468
  "pipelineExecutor.deleteModel": {
51058
51469
  capName: "pipeline-executor",
51059
51470
  capScope: "system",
@@ -51270,6 +51681,12 @@ Object.freeze({
51270
51681
  addonId: null,
51271
51682
  access: "view"
51272
51683
  },
51684
+ "pipelineOrchestrator.applyBestSettings": {
51685
+ capName: "pipeline-orchestrator",
51686
+ capScope: "system",
51687
+ addonId: null,
51688
+ access: "create"
51689
+ },
51273
51690
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
51274
51691
  capName: "pipeline-orchestrator",
51275
51692
  capScope: "system",
@@ -51420,6 +51837,12 @@ Object.freeze({
51420
51837
  addonId: null,
51421
51838
  access: "view"
51422
51839
  },
51840
+ "pipelineOrchestrator.getPlacementStats": {
51841
+ capName: "pipeline-orchestrator",
51842
+ capScope: "system",
51843
+ addonId: null,
51844
+ access: "view"
51845
+ },
51423
51846
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51424
51847
  capName: "pipeline-orchestrator",
51425
51848
  capScope: "system",
@@ -51444,6 +51867,12 @@ Object.freeze({
51444
51867
  addonId: null,
51445
51868
  access: "create"
51446
51869
  },
51870
+ "pipelineOrchestrator.planBestSettings": {
51871
+ capName: "pipeline-orchestrator",
51872
+ capScope: "system",
51873
+ addonId: null,
51874
+ access: "view"
51875
+ },
51447
51876
  "pipelineOrchestrator.rebalance": {
51448
51877
  capName: "pipeline-orchestrator",
51449
51878
  capScope: "system",
@@ -51504,12 +51933,6 @@ Object.freeze({
51504
51933
  addonId: null,
51505
51934
  access: "create"
51506
51935
  },
51507
- "pipelineOrchestrator.setAgentDetectWeight": {
51508
- capName: "pipeline-orchestrator",
51509
- capScope: "system",
51510
- addonId: null,
51511
- access: "create"
51512
- },
51513
51936
  "pipelineOrchestrator.setAgentInferenceDevices": {
51514
51937
  capName: "pipeline-orchestrator",
51515
51938
  capScope: "system",
@@ -51564,12 +51987,24 @@ Object.freeze({
51564
51987
  addonId: null,
51565
51988
  access: "create"
51566
51989
  },
51990
+ "pipelineOrchestrator.setLoadBalancingShares": {
51991
+ capName: "pipeline-orchestrator",
51992
+ capScope: "system",
51993
+ addonId: null,
51994
+ access: "create"
51995
+ },
51567
51996
  "pipelineOrchestrator.setPipelineDevicePin": {
51568
51997
  capName: "pipeline-orchestrator",
51569
51998
  capScope: "system",
51570
51999
  addonId: null,
51571
52000
  access: "create"
51572
52001
  },
52002
+ "pipelineOrchestrator.suggestShares": {
52003
+ capName: "pipeline-orchestrator",
52004
+ capScope: "system",
52005
+ addonId: null,
52006
+ access: "view"
52007
+ },
51573
52008
  "pipelineOrchestrator.unassignAudio": {
51574
52009
  capName: "pipeline-orchestrator",
51575
52010
  capScope: "system",
@@ -57042,6 +57477,11 @@ Object.freeze({
57042
57477
  form: "single",
57043
57478
  optional: false
57044
57479
  }],
57480
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
57481
+ name: "deviceIds",
57482
+ form: "array",
57483
+ optional: true
57484
+ }],
57045
57485
  "pipelineExecutor.runPipeline": [{
57046
57486
  name: "deviceId",
57047
57487
  form: "single",
@@ -1,5 +1,5 @@
1
1
  import { b as e, g as t, l as n, u as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
- import { c as i, s as a } from "./responsive-DXhNKsuH.mjs";
2
+ import { c as i, s as a } from "./responsive-BpY0yafY.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
4
4
  var l = i("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BnoZzYog.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-7EsNkWO1.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { _ as e, b as t, c as n, g as r, l as i, m as a, n as o, r as s, t as c, u as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
3
- import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-t6WKuxCf.mjs";
3
+ import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CYSzhahm.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  t();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,5 +1,5 @@
1
1
  import { b as e, c as t, g as n, m as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
- import { c as i } from "./responsive-DXhNKsuH.mjs";
2
+ import { c as i } from "./responsive-BpY0yafY.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -1,4 +1,4 @@
1
- import { c as e } from "./responsive-DXhNKsuH.mjs";
1
+ import { c as e } from "./responsive-BpY0yafY.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { c as e } from "./responsive-DXhNKsuH.mjs";
1
+ import { c as e } from "./responsive-BpY0yafY.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-COWlbxsR.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C2I-8Qsr.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-osd-manager",
3
- "version": "0.1.179",
3
+ "version": "0.1.181",
4
4
  "description": "Binds camera on-screen-display slots to live state and recognitions",
5
5
  "keywords": [
6
6
  "camstack",