@camstack/addon-osd-manager 0.1.180 → 0.1.182

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-zw2RZO3c.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CBh-nVj6.mjs → PrivacyMaskSettings-MfIH7-Fl.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-CCZdsPeR.mjs → SceneMonitorEditor-B9fe5VoP.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-16Cp8rtD.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CWgx3QDa.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-C4sW45bX.mjs → hostInit-CGQt1oAH.mjs} +2 -2
  9. package/dist/index.js +242 -40
  10. package/dist/index.mjs +242 -40
  11. package/dist/{player-overlays-ClqS_7qr.mjs → player-overlays-DBos84dy.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-OY2AYs2K.mjs → responsive-CSrcORLE.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-D50g5tDa.mjs → scene-monitor-copy-DvcsgzM2.mjs} +1 -1
  15. package/dist/{square-CMXmMI2_.mjs → square-BALj2dYA.mjs} +1 -1
  16. package/dist/{trash-2-CS8cJOvy.mjs → trash-2-BMJXCVQ3.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-sz6-3sRO.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
@@ -27713,7 +27713,7 @@ var pipelineExecutorCapability = {
27713
27713
  auth: "admin"
27714
27714
  }),
27715
27715
  /**
27716
- * Best settings (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
27716
+ * Auto tune (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
27717
27717
  * the object-detection root, and their binding keys) stored in THIS node's
27718
27718
  * per-camera detector settings — and, unless `dryRun`, remove them so the
27719
27719
  * running model's own defaults apply. Every other key of a camera's store
@@ -28085,7 +28085,143 @@ var pipelineExecutorCapability = {
28085
28085
  }
28086
28086
  };
28087
28087
  /**
28088
- * The wire shapes of the Best settings plan and apply (D745), used by the
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
+ /**
28179
+ * Where the node and device shares come from (D750).
28180
+ * - `auto` — computed by the system from the cluster's measured capacity at
28181
+ * the Auto tune models, and recomputed whenever a node or device joins,
28182
+ * leaves, is switched on or off, or changes model.
28183
+ * - `manual` — the operator's stored sliders. A node or device that cannot
28184
+ * take sessions gives its share to the others in proportion; the stored
28185
+ * values are never rewritten for that.
28186
+ */
28187
+ var ShareSourceSchema = _enum(["auto", "manual"]);
28188
+ var SetShareSourceInputSchema = object({ source: ShareSourceSchema });
28189
+ object({
28190
+ nodes: record(string(), number()),
28191
+ devices: record(string(), record(string(), number()))
28192
+ });
28193
+ var EffectiveDeviceShareSchema = object({
28194
+ deviceKey: string(),
28195
+ /** Can take sessions now (enabled, available, can run the root). */
28196
+ eligible: boolean(),
28197
+ /** The share the source assigns, as a percentage of the node's devices. */
28198
+ configuredPct: number(),
28199
+ /** The share actually used, after an ineligible device's share went to the others. */
28200
+ effectivePct: number()
28201
+ });
28202
+ var EffectiveNodeShareSchema = object({
28203
+ nodeId: string(),
28204
+ eligible: boolean(),
28205
+ configuredPct: number(),
28206
+ effectivePct: number(),
28207
+ devices: array(EffectiveDeviceShareSchema).readonly()
28208
+ });
28209
+ var EffectiveSharesSchema = object({
28210
+ source: ShareSourceSchema,
28211
+ policy: SessionPlacementPolicySchema,
28212
+ /** `auto` with no computed answer yet: the stored sliders are used meanwhile. */
28213
+ autoPending: boolean(),
28214
+ /** When the automatic shares were last computed (ms epoch); null = never. */
28215
+ computedAt: number().nullable(),
28216
+ /** What made the system recompute them last. */
28217
+ trigger: string().nullable(),
28218
+ nodes: array(EffectiveNodeShareSchema).readonly(),
28219
+ /** The relative weights the election reads (before eligibility). */
28220
+ nodeWeights: record(string(), number()),
28221
+ deviceWeights: record(string(), record(string(), number()))
28222
+ });
28223
+ /**
28224
+ * The wire shapes of the Auto tune plan and apply (D745), used by the
28089
28225
  * `pipeline-orchestrator` cap. The recommender's own types
28090
28226
  * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
28091
28227
  * schemas are what crosses the cap boundary.
@@ -28161,7 +28297,9 @@ var DeviceDemandSchema = object({
28161
28297
  "estimate",
28162
28298
  "none"
28163
28299
  ]),
28164
- observedForMs: number().nullable()
28300
+ observedForMs: number().nullable(),
28301
+ /** How on-motion sessions were charged: per-device observation, or split by share (D748). */
28302
+ placement: SessionPlacementPolicySchema
28165
28303
  });
28166
28304
  var DeviceModelChoiceSchema = object({
28167
28305
  modelId: string(),
@@ -28218,7 +28356,7 @@ var DetectorStoreClearSchema = object({
28218
28356
  deviceId: number(),
28219
28357
  keys: array(string()).readonly()
28220
28358
  });
28221
- var BestSettingsWarningSchema = discriminatedUnion("kind", [
28359
+ var AutoTuneWarningSchema = discriminatedUnion("kind", [
28222
28360
  object({
28223
28361
  kind: literal("detector-store-cluster-wide"),
28224
28362
  skippedNodes: array(string()).readonly()
@@ -28233,26 +28371,36 @@ var BestSettingsWarningSchema = discriminatedUnion("kind", [
28233
28371
  deviceKey: string()
28234
28372
  })
28235
28373
  ]);
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) });
28239
- var BestSettingsPlanSchema = object({
28374
+ var AutoTuneOptionsSchema = object({
28375
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
28376
+ headroom: number().min(.3).max(.5).default(.4),
28377
+ /**
28378
+ * What-if shares (D748): plan as if these node/device shares were stored
28379
+ * and the policy were `share`. Absent = the stored shares under the stored
28380
+ * policy. A what-if plan is for display; apply always re-plans from what
28381
+ * is stored.
28382
+ */
28383
+ shares: LoadBalancingSharesInputSchema.optional()
28384
+ });
28385
+ var AutoTunePlanSchema = object({
28240
28386
  /** Hash of everything the apply will write — the apply refuses a different one. */
28241
28387
  planHash: string(),
28242
28388
  family: literal("yolov9"),
28243
28389
  headroom: number(),
28390
+ /** Planned under what-if shares (D748): for display — apply refuses it as stale. */
28391
+ whatIf: boolean(),
28244
28392
  generatedAt: number(),
28245
28393
  nodes: array(NodeRecommendationSchema).readonly(),
28246
28394
  nodeChanges: array(NodeDeviceChangeSchema).readonly(),
28247
28395
  cameraClears: array(CameraOverrideClearSchema).readonly(),
28248
28396
  detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
28249
- warnings: array(BestSettingsWarningSchema).readonly()
28397
+ warnings: array(AutoTuneWarningSchema).readonly()
28250
28398
  });
28251
- var BestSettingsApplyInputSchema = object({
28399
+ var AutoTuneApplyInputSchema = object({
28252
28400
  planHash: string(),
28253
28401
  headroom: number().min(.3).max(.5).default(.4)
28254
28402
  });
28255
- var BestSettingsPhaseResultSchema = object({
28403
+ var AutoTunePhaseResultSchema = object({
28256
28404
  phase: _enum([
28257
28405
  "download",
28258
28406
  "camera-overrides",
@@ -28263,19 +28411,19 @@ var BestSettingsPhaseResultSchema = object({
28263
28411
  ok: boolean(),
28264
28412
  detail: string()
28265
28413
  });
28266
- var BestSettingsApplyResultSchema = discriminatedUnion("kind", [
28414
+ var AutoTuneApplyResultSchema = discriminatedUnion("kind", [
28267
28415
  object({
28268
28416
  kind: literal("applied"),
28269
28417
  planHash: string(),
28270
- phases: array(BestSettingsPhaseResultSchema).readonly()
28418
+ phases: array(AutoTunePhaseResultSchema).readonly()
28271
28419
  }),
28272
28420
  object({
28273
28421
  kind: literal("aborted"),
28274
- phases: array(BestSettingsPhaseResultSchema).readonly()
28422
+ phases: array(AutoTunePhaseResultSchema).readonly()
28275
28423
  }),
28276
28424
  object({
28277
28425
  kind: literal("stale"),
28278
- plan: BestSettingsPlanSchema
28426
+ plan: AutoTunePlanSchema
28279
28427
  }),
28280
28428
  object({
28281
28429
  kind: literal("refused"),
@@ -29694,7 +29842,6 @@ var CameraStepOverridePatchSchema = object({
29694
29842
  settings: record(string(), unknown()).readonly().optional()
29695
29843
  });
29696
29844
  var CameraPipelineSettingsSchema = object({
29697
- pinnedAgentNodeId: string().optional(),
29698
29845
  stepToggles: record(string(), boolean()).optional(),
29699
29846
  stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
29700
29847
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
@@ -30342,18 +30489,6 @@ var pipelineOrchestratorCapability = {
30342
30489
  auth: "admin"
30343
30490
  }),
30344
30491
  /**
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
30492
  * Set one node's placement CAPABILITIES — the per-node record that
30358
30493
  * replaced the four flat orchestrator lists (`enabledNodes`,
30359
30494
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -30473,7 +30608,7 @@ var pipelineOrchestratorCapability = {
30473
30608
  auth: "admin"
30474
30609
  }),
30475
30610
  /**
30476
- * Best settings (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
30611
+ * Auto tune (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
30477
30612
  * for the whole cluster from each node's static hardware class, the
30478
30613
  * measured latency table and the detection demand, and lists every write
30479
30614
  * the apply would make: the node model pins set, the enrichment pins and
@@ -30482,14 +30617,57 @@ var pipelineOrchestratorCapability = {
30482
30617
  * enablement, device enablement, pins, recording, notifications, zones and
30483
30618
  * rules are never part of it. `planHash` names exactly this diff.
30484
30619
  */
30485
- planBestSettings: method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }),
30620
+ planAutoTune: method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }),
30486
30621
  /**
30487
- * Best settings (D745) — APPLY the plan the operator confirmed. Recomputes
30622
+ * Auto tune (D745) — APPLY the plan the operator confirmed. Recomputes
30488
30623
  * the plan and refuses (`stale`, with the fresh plan) when its hash is not
30489
30624
  * `planHash`, so what is written is exactly the confirmed diff. Offline
30490
30625
  * nodes are skipped; there is no undo.
30491
30626
  */
30492
- applyBestSettings: method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
30627
+ applyAutoTune: method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
30628
+ kind: "mutation",
30629
+ auth: "admin"
30630
+ }),
30631
+ /**
30632
+ * Load balancing (D748) — write node shares (`detectWeight`) and per-node
30633
+ * device shares (inference-device `weight`) in ONE atomic read-modify-write
30634
+ * of the agent settings — the only writer of node shares (the per-node
30635
+ * `setAgentDetectWeight` it replaced raced its siblings, one RMW each).
30636
+ * A node or device left out keeps its weight. Never changes the
30637
+ * `sessionPlacement` policy.
30638
+ */
30639
+ setLoadBalancingShares: method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
30640
+ kind: "mutation",
30641
+ auth: "admin"
30642
+ }),
30643
+ /**
30644
+ * Load balancing (D748) — what placement actually did: per node and
30645
+ * device, sessions now, sessions started and the time-weighted share of
30646
+ * PARALLEL sessions over `windowMs`; the cluster's parallel peak; yields
30647
+ * a share election made; and every device pin the session path cannot
30648
+ * honour. In memory on the hub — a restart starts a new window.
30649
+ */
30650
+ getPlacementStats: method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }),
30651
+ /**
30652
+ * Load balancing (D748) — shares proportional to each node's measured
30653
+ * capacity at the models Auto tune would pick, iterated (≤ 3 rounds)
30654
+ * until the shares stop moving; per device, an ADVISORY session cap.
30655
+ * Writes nothing.
30656
+ */
30657
+ suggestShares: method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }),
30658
+ /**
30659
+ * Load balancing (D750) — the shares placement reads now: the source
30660
+ * (automatic capacity shares or the operator's sliders), each node's and
30661
+ * device's configured share, and the effective share after a node or
30662
+ * device that cannot take sessions gave its share to the others.
30663
+ */
30664
+ getEffectiveShares: method(_void(), EffectiveSharesSchema, { auth: "admin" }),
30665
+ /**
30666
+ * Load balancing (D750) — switch between automatic and manual shares.
30667
+ * Going manual seeds the sliders with the current automatic shares (one
30668
+ * atomic write), so nothing jumps; going automatic recomputes at once.
30669
+ */
30670
+ setShareSource: method(SetShareSourceInputSchema, object({ success: literal(true) }), {
30493
30671
  kind: "mutation",
30494
30672
  auth: "admin"
30495
30673
  }),
@@ -51568,7 +51746,7 @@ Object.freeze({
51568
51746
  addonId: null,
51569
51747
  access: "view"
51570
51748
  },
51571
- "pipelineOrchestrator.applyBestSettings": {
51749
+ "pipelineOrchestrator.applyAutoTune": {
51572
51750
  capName: "pipeline-orchestrator",
51573
51751
  capScope: "system",
51574
51752
  addonId: null,
@@ -51688,6 +51866,12 @@ Object.freeze({
51688
51866
  addonId: null,
51689
51867
  access: "view"
51690
51868
  },
51869
+ "pipelineOrchestrator.getEffectiveShares": {
51870
+ capName: "pipeline-orchestrator",
51871
+ capScope: "system",
51872
+ addonId: null,
51873
+ access: "view"
51874
+ },
51691
51875
  "pipelineOrchestrator.getGlobalMetrics": {
51692
51876
  capName: "pipeline-orchestrator",
51693
51877
  capScope: "system",
@@ -51724,6 +51908,12 @@ Object.freeze({
51724
51908
  addonId: null,
51725
51909
  access: "view"
51726
51910
  },
51911
+ "pipelineOrchestrator.getPlacementStats": {
51912
+ capName: "pipeline-orchestrator",
51913
+ capScope: "system",
51914
+ addonId: null,
51915
+ access: "view"
51916
+ },
51727
51917
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51728
51918
  capName: "pipeline-orchestrator",
51729
51919
  capScope: "system",
@@ -51748,7 +51938,7 @@ Object.freeze({
51748
51938
  addonId: null,
51749
51939
  access: "create"
51750
51940
  },
51751
- "pipelineOrchestrator.planBestSettings": {
51941
+ "pipelineOrchestrator.planAutoTune": {
51752
51942
  capName: "pipeline-orchestrator",
51753
51943
  capScope: "system",
51754
51944
  addonId: null,
@@ -51814,12 +52004,6 @@ Object.freeze({
51814
52004
  addonId: null,
51815
52005
  access: "create"
51816
52006
  },
51817
- "pipelineOrchestrator.setAgentDetectWeight": {
51818
- capName: "pipeline-orchestrator",
51819
- capScope: "system",
51820
- addonId: null,
51821
- access: "create"
51822
- },
51823
52007
  "pipelineOrchestrator.setAgentInferenceDevices": {
51824
52008
  capName: "pipeline-orchestrator",
51825
52009
  capScope: "system",
@@ -51874,12 +52058,30 @@ Object.freeze({
51874
52058
  addonId: null,
51875
52059
  access: "create"
51876
52060
  },
52061
+ "pipelineOrchestrator.setLoadBalancingShares": {
52062
+ capName: "pipeline-orchestrator",
52063
+ capScope: "system",
52064
+ addonId: null,
52065
+ access: "create"
52066
+ },
51877
52067
  "pipelineOrchestrator.setPipelineDevicePin": {
51878
52068
  capName: "pipeline-orchestrator",
51879
52069
  capScope: "system",
51880
52070
  addonId: null,
51881
52071
  access: "create"
51882
52072
  },
52073
+ "pipelineOrchestrator.setShareSource": {
52074
+ capName: "pipeline-orchestrator",
52075
+ capScope: "system",
52076
+ addonId: null,
52077
+ access: "create"
52078
+ },
52079
+ "pipelineOrchestrator.suggestShares": {
52080
+ capName: "pipeline-orchestrator",
52081
+ capScope: "system",
52082
+ addonId: null,
52083
+ access: "view"
52084
+ },
51883
52085
  "pipelineOrchestrator.unassignAudio": {
51884
52086
  capName: "pipeline-orchestrator",
51885
52087
  capScope: "system",