@camstack/addon-osd-manager 0.1.180 → 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-ZY8nEZ4A.mjs → MotionZonesSettings-r-5gadcs.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CBh-nVj6.mjs → PrivacyMaskSettings-DPJp4rMl.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-CCZdsPeR.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-odNWYe2P.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-C4sW45bX.mjs → hostInit-CaDP2Kts.mjs} +2 -2
  9. package/dist/index.js +152 -23
  10. package/dist/index.mjs +152 -23
  11. package/dist/{player-overlays-ClqS_7qr.mjs → player-overlays-CWcXFKuD.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-OY2AYs2K.mjs → responsive-BpY0yafY.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-D50g5tDa.mjs → scene-monitor-copy-413cUke-.mjs} +1 -1
  15. package/dist/{square-CMXmMI2_.mjs → square-CtY8II3Z.mjs} +1 -1
  16. package/dist/{trash-2-CS8cJOvy.mjs → trash-2-m46kRm2C.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Ga9h-wWR.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-D4hHi1KB.mjs +0 -26
package/dist/index.js CHANGED
@@ -28085,6 +28085,97 @@ var pipelineExecutorCapability = {
28085
28085
  }
28086
28086
  };
28087
28087
  /**
28088
+ * Wire shapes of the Load balancing surface (D748): the session placement
28089
+ * policy, the atomic share write, the observed placement statistics, the
28090
+ * hardware share suggestion and the stale device pins.
28091
+ */
28092
+ /**
28093
+ * How a new detection session picks its node and device.
28094
+ * - `least-loaded` — the historical rule: lowest `attached / weight`, a
28095
+ * constant node order at a tie (D37). An idle node always ties at 0, so a
28096
+ * weight only bites once a node already holds a session.
28097
+ * - `share` — the share of PARALLEL sessions is held to the weights, and a
28098
+ * full or drowning node yields to a free one (D748).
28099
+ */
28100
+ var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
28101
+ var LoadBalancingSharesInputSchema = object({
28102
+ /** nodeId → share (> 0). A node left out keeps its weight. */
28103
+ nodes: record(string(), number().positive()).default({}),
28104
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
28105
+ devices: record(string(), record(string(), number().positive())).default({})
28106
+ });
28107
+ var PlacementStatsInputSchema = object({
28108
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
28109
+ windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
28110
+ var PlacementDeviceStatsSchema = object({
28111
+ deviceKey: string(),
28112
+ /** Sessions running on this device now. */
28113
+ sessionsNow: number(),
28114
+ /** Sessions started on this device inside the window. */
28115
+ sessionsStarted: number(),
28116
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
28117
+ observedShare: number().nullable()
28118
+ });
28119
+ var PlacementNodeStatsSchema = object({
28120
+ nodeId: string(),
28121
+ sessionsNow: number(),
28122
+ sessionsStarted: number(),
28123
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
28124
+ observedShare: number().nullable(),
28125
+ /** Most sessions this node ran at once inside the window. */
28126
+ peakSessions: number(),
28127
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
28128
+ yieldsAway: number(),
28129
+ devices: array(PlacementDeviceStatsSchema).readonly()
28130
+ });
28131
+ /** A camera's device pin that the session path cannot honour. */
28132
+ var StaleDevicePinSchema = object({
28133
+ deviceId: number(),
28134
+ deviceKey: string(),
28135
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
28136
+ reason: _enum(["disabled", "absent"])
28137
+ });
28138
+ var PlacementStatsSchema = object({
28139
+ policy: SessionPlacementPolicySchema,
28140
+ windowMs: number(),
28141
+ /** How much of the window was actually observed (the hub keeps it in memory). */
28142
+ observedForMs: number(),
28143
+ sessionsNow: number(),
28144
+ /** Most parallel sessions across the cluster inside the window. */
28145
+ clusterPeakSessions: number(),
28146
+ nodes: array(PlacementNodeStatsSchema).readonly(),
28147
+ stalePins: array(StaleDevicePinSchema).readonly()
28148
+ });
28149
+ var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
28150
+ var SuggestedDeviceShareSchema = object({
28151
+ deviceKey: string(),
28152
+ /** Share of the node (0–100, rounded). */
28153
+ share: number(),
28154
+ modelId: string().nullable(),
28155
+ /** Inferences per second at that model, from the measured table. */
28156
+ fps: number().nullable(),
28157
+ measured: boolean(),
28158
+ /** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
28159
+ suggestedMaxSessions: number().nullable()
28160
+ });
28161
+ var SuggestedNodeShareSchema = object({
28162
+ nodeId: string(),
28163
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
28164
+ share: number().nullable(),
28165
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
28166
+ capacitySessions: number(),
28167
+ devices: array(SuggestedDeviceShareSchema).readonly(),
28168
+ skippedReason: string().nullable()
28169
+ });
28170
+ var SuggestSharesResultSchema = object({
28171
+ headroom: number(),
28172
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
28173
+ cameraFps: number(),
28174
+ /** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
28175
+ iterations: number(),
28176
+ nodes: array(SuggestedNodeShareSchema).readonly()
28177
+ });
28178
+ /**
28088
28179
  * The wire shapes of the Best settings plan and apply (D745), used by the
28089
28180
  * `pipeline-orchestrator` cap. The recommender's own types
28090
28181
  * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
@@ -28161,7 +28252,9 @@ var DeviceDemandSchema = object({
28161
28252
  "estimate",
28162
28253
  "none"
28163
28254
  ]),
28164
- observedForMs: number().nullable()
28255
+ observedForMs: number().nullable(),
28256
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
28257
+ placement: SessionPlacementPolicySchema
28165
28258
  });
28166
28259
  var DeviceModelChoiceSchema = object({
28167
28260
  modelId: string(),
@@ -28233,14 +28326,24 @@ var BestSettingsWarningSchema = discriminatedUnion("kind", [
28233
28326
  deviceKey: string()
28234
28327
  })
28235
28328
  ]);
28236
- var BestSettingsOptionsSchema = object({
28237
- /** Share of each accelerator's throughput kept free (0.3–0.5). */
28238
- headroom: number().min(.3).max(.5).default(.4) });
28329
+ var BestSettingsOptionsSchema = object({
28330
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
28331
+ headroom: number().min(.3).max(.5).default(.4),
28332
+ /**
28333
+ * What-if shares (D748): plan as if these node/device shares were stored
28334
+ * and the policy were `share`. Absent = the stored shares under the stored
28335
+ * policy. A what-if plan is for display; apply always re-plans from what
28336
+ * is stored.
28337
+ */
28338
+ shares: LoadBalancingSharesInputSchema.optional()
28339
+ });
28239
28340
  var BestSettingsPlanSchema = object({
28240
28341
  /** Hash of everything the apply will write — the apply refuses a different one. */
28241
28342
  planHash: string(),
28242
28343
  family: literal("yolov9"),
28243
28344
  headroom: number(),
28345
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
28346
+ whatIf: boolean(),
28244
28347
  generatedAt: number(),
28245
28348
  nodes: array(NodeRecommendationSchema).readonly(),
28246
28349
  nodeChanges: array(NodeDeviceChangeSchema).readonly(),
@@ -29694,7 +29797,6 @@ var CameraStepOverridePatchSchema = object({
29694
29797
  settings: record(string(), unknown()).readonly().optional()
29695
29798
  });
29696
29799
  var CameraPipelineSettingsSchema = object({
29697
- pinnedAgentNodeId: string().optional(),
29698
29800
  stepToggles: record(string(), boolean()).optional(),
29699
29801
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
29700
29802
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -30342,18 +30444,6 @@ var pipelineOrchestratorCapability = {
30342
30444
  auth: "admin"
30343
30445
  }),
30344
30446
  /**
30345
- * Set a node's detection WEIGHT (relative share for the quota balancer).
30346
- * `null` clears it (back to the implicit weight 1). Unpinned cameras
30347
- * distribute proportionally to weight; `maxCameras` still clamps on top.
30348
- */
30349
- setAgentDetectWeight: method(object({
30350
- agentNodeId: string(),
30351
- detectWeight: number().positive().nullable()
30352
- }), object({ success: literal(true) }), {
30353
- kind: "mutation",
30354
- auth: "admin"
30355
- }),
30356
- /**
30357
30447
  * Set one node's placement CAPABILITIES — the per-node record that
30358
30448
  * replaced the four flat orchestrator lists (`enabledNodes`,
30359
30449
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -30493,6 +30583,33 @@ var pipelineOrchestratorCapability = {
30493
30583
  kind: "mutation",
30494
30584
  auth: "admin"
30495
30585
  }),
30586
+ /**
30587
+ * Load balancing (D748) — write node shares (`detectWeight`) and per-node
30588
+ * device shares (inference-device `weight`) in ONE atomic read-modify-write
30589
+ * of the agent settings — the only writer of node shares (the per-node
30590
+ * `setAgentDetectWeight` it replaced raced its siblings, one RMW each).
30591
+ * A node or device left out keeps its weight. Never changes the
30592
+ * `sessionPlacement` policy.
30593
+ */
30594
+ setLoadBalancingShares: method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
30595
+ kind: "mutation",
30596
+ auth: "admin"
30597
+ }),
30598
+ /**
30599
+ * Load balancing (D748) — what placement actually did: per node and
30600
+ * device, sessions now, sessions started and the time-weighted share of
30601
+ * PARALLEL sessions over `windowMs`; the cluster's parallel peak; yields
30602
+ * a share election made; and every device pin the session path cannot
30603
+ * honour. In memory on the hub — a restart starts a new window.
30604
+ */
30605
+ getPlacementStats: method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }),
30606
+ /**
30607
+ * Load balancing (D748) — shares proportional to each node's measured
30608
+ * capacity at the models Best settings would pick, iterated (≤ 3 rounds)
30609
+ * until the shares stop moving; per device, an ADVISORY session cap.
30610
+ * Writes nothing.
30611
+ */
30612
+ suggestShares: method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }),
30496
30613
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
30497
30614
  getCameraSettings: method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()),
30498
30615
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -51724,6 +51841,12 @@ Object.freeze({
51724
51841
  addonId: null,
51725
51842
  access: "view"
51726
51843
  },
51844
+ "pipelineOrchestrator.getPlacementStats": {
51845
+ capName: "pipeline-orchestrator",
51846
+ capScope: "system",
51847
+ addonId: null,
51848
+ access: "view"
51849
+ },
51727
51850
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51728
51851
  capName: "pipeline-orchestrator",
51729
51852
  capScope: "system",
@@ -51814,12 +51937,6 @@ Object.freeze({
51814
51937
  addonId: null,
51815
51938
  access: "create"
51816
51939
  },
51817
- "pipelineOrchestrator.setAgentDetectWeight": {
51818
- capName: "pipeline-orchestrator",
51819
- capScope: "system",
51820
- addonId: null,
51821
- access: "create"
51822
- },
51823
51940
  "pipelineOrchestrator.setAgentInferenceDevices": {
51824
51941
  capName: "pipeline-orchestrator",
51825
51942
  capScope: "system",
@@ -51874,12 +51991,24 @@ Object.freeze({
51874
51991
  addonId: null,
51875
51992
  access: "create"
51876
51993
  },
51994
+ "pipelineOrchestrator.setLoadBalancingShares": {
51995
+ capName: "pipeline-orchestrator",
51996
+ capScope: "system",
51997
+ addonId: null,
51998
+ access: "create"
51999
+ },
51877
52000
  "pipelineOrchestrator.setPipelineDevicePin": {
51878
52001
  capName: "pipeline-orchestrator",
51879
52002
  capScope: "system",
51880
52003
  addonId: null,
51881
52004
  access: "create"
51882
52005
  },
52006
+ "pipelineOrchestrator.suggestShares": {
52007
+ capName: "pipeline-orchestrator",
52008
+ capScope: "system",
52009
+ addonId: null,
52010
+ access: "view"
52011
+ },
51883
52012
  "pipelineOrchestrator.unassignAudio": {
51884
52013
  capName: "pipeline-orchestrator",
51885
52014
  capScope: "system",
package/dist/index.mjs CHANGED
@@ -28081,6 +28081,97 @@ var pipelineExecutorCapability = {
28081
28081
  }
28082
28082
  };
28083
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
+ /**
28084
28175
  * The wire shapes of the Best settings plan and apply (D745), used by the
28085
28176
  * `pipeline-orchestrator` cap. The recommender's own types
28086
28177
  * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
@@ -28157,7 +28248,9 @@ var DeviceDemandSchema = object({
28157
28248
  "estimate",
28158
28249
  "none"
28159
28250
  ]),
28160
- observedForMs: number().nullable()
28251
+ observedForMs: number().nullable(),
28252
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
28253
+ placement: SessionPlacementPolicySchema
28161
28254
  });
28162
28255
  var DeviceModelChoiceSchema = object({
28163
28256
  modelId: string(),
@@ -28229,14 +28322,24 @@ var BestSettingsWarningSchema = discriminatedUnion("kind", [
28229
28322
  deviceKey: string()
28230
28323
  })
28231
28324
  ]);
28232
- var BestSettingsOptionsSchema = object({
28233
- /** Share of each accelerator's throughput kept free (0.3–0.5). */
28234
- headroom: number().min(.3).max(.5).default(.4) });
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
+ });
28235
28336
  var BestSettingsPlanSchema = object({
28236
28337
  /** Hash of everything the apply will write — the apply refuses a different one. */
28237
28338
  planHash: string(),
28238
28339
  family: literal("yolov9"),
28239
28340
  headroom: number(),
28341
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
28342
+ whatIf: boolean(),
28240
28343
  generatedAt: number(),
28241
28344
  nodes: array(NodeRecommendationSchema).readonly(),
28242
28345
  nodeChanges: array(NodeDeviceChangeSchema).readonly(),
@@ -29690,7 +29793,6 @@ var CameraStepOverridePatchSchema = object({
29690
29793
  settings: record(string(), unknown()).readonly().optional()
29691
29794
  });
29692
29795
  var CameraPipelineSettingsSchema = object({
29693
- pinnedAgentNodeId: string().optional(),
29694
29796
  stepToggles: record(string(), boolean()).optional(),
29695
29797
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
29696
29798
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -30338,18 +30440,6 @@ var pipelineOrchestratorCapability = {
30338
30440
  auth: "admin"
30339
30441
  }),
30340
30442
  /**
30341
- * Set a node's detection WEIGHT (relative share for the quota balancer).
30342
- * `null` clears it (back to the implicit weight 1). Unpinned cameras
30343
- * distribute proportionally to weight; `maxCameras` still clamps on top.
30344
- */
30345
- setAgentDetectWeight: method(object({
30346
- agentNodeId: string(),
30347
- detectWeight: number().positive().nullable()
30348
- }), object({ success: literal(true) }), {
30349
- kind: "mutation",
30350
- auth: "admin"
30351
- }),
30352
- /**
30353
30443
  * Set one node's placement CAPABILITIES — the per-node record that
30354
30444
  * replaced the four flat orchestrator lists (`enabledNodes`,
30355
30445
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -30489,6 +30579,33 @@ var pipelineOrchestratorCapability = {
30489
30579
  kind: "mutation",
30490
30580
  auth: "admin"
30491
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" }),
30492
30609
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
30493
30610
  getCameraSettings: method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()),
30494
30611
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -51720,6 +51837,12 @@ Object.freeze({
51720
51837
  addonId: null,
51721
51838
  access: "view"
51722
51839
  },
51840
+ "pipelineOrchestrator.getPlacementStats": {
51841
+ capName: "pipeline-orchestrator",
51842
+ capScope: "system",
51843
+ addonId: null,
51844
+ access: "view"
51845
+ },
51723
51846
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51724
51847
  capName: "pipeline-orchestrator",
51725
51848
  capScope: "system",
@@ -51810,12 +51933,6 @@ Object.freeze({
51810
51933
  addonId: null,
51811
51934
  access: "create"
51812
51935
  },
51813
- "pipelineOrchestrator.setAgentDetectWeight": {
51814
- capName: "pipeline-orchestrator",
51815
- capScope: "system",
51816
- addonId: null,
51817
- access: "create"
51818
- },
51819
51936
  "pipelineOrchestrator.setAgentInferenceDevices": {
51820
51937
  capName: "pipeline-orchestrator",
51821
51938
  capScope: "system",
@@ -51870,12 +51987,24 @@ Object.freeze({
51870
51987
  addonId: null,
51871
51988
  access: "create"
51872
51989
  },
51990
+ "pipelineOrchestrator.setLoadBalancingShares": {
51991
+ capName: "pipeline-orchestrator",
51992
+ capScope: "system",
51993
+ addonId: null,
51994
+ access: "create"
51995
+ },
51873
51996
  "pipelineOrchestrator.setPipelineDevicePin": {
51874
51997
  capName: "pipeline-orchestrator",
51875
51998
  capScope: "system",
51876
51999
  addonId: null,
51877
52000
  access: "create"
51878
52001
  },
52002
+ "pipelineOrchestrator.suggestShares": {
52003
+ capName: "pipeline-orchestrator",
52004
+ capScope: "system",
52005
+ addonId: null,
52006
+ access: "view"
52007
+ },
51879
52008
  "pipelineOrchestrator.unassignAudio": {
51880
52009
  capName: "pipeline-orchestrator",
51881
52010
  capScope: "system",
@@ -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-OY2AYs2K.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-Ga9h-wWR.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-D4hHi1KB.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-OY2AYs2K.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-OY2AYs2K.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-OY2AYs2K.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-odNWYe2P.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.180",
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",