@camstack/addon-pipeline 1.2.106 → 1.2.107

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 (32) hide show
  1. package/dist/{addon-utils-BEzVJ0xg.js → addon-utils-Vv2dCqA2.js} +1 -1
  2. package/dist/audio-analyzer/index.js +3 -3
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/detection-pipeline/index.js +33 -12
  5. package/dist/detection-pipeline/index.mjs +31 -10
  6. package/dist/{dist-lITI1Bn5.mjs → dist-CkXAzTZ2.mjs} +148 -6
  7. package/dist/{dist-BSeR_hVv.js → dist-L-1LMGQs.js} +165 -5
  8. package/dist/{event-loop-stall-monitor-BNsp9k8r.js → event-loop-stall-monitor-DwAho7HD.js} +1 -1
  9. package/dist/{event-loop-stall-monitor-0VvjTRDP.mjs → event-loop-stall-monitor-fHkfgmlw.mjs} +1 -1
  10. package/dist/{lazy-sharp-CBohM8D8.js → lazy-sharp-DfbyQxET.js} +1 -1
  11. package/dist/motion-wasm/index.js +2 -2
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/pipeline-runner/index.js +4 -4
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/{process-memory-C33u3tQz.js → process-memory-CgrbLo3l.js} +1 -1
  16. package/dist/{process-memory-CEKVKfwg.mjs → process-memory-DlSOzuHP.mjs} +1 -1
  17. package/dist/recorder/index.js +2 -2
  18. package/dist/recorder/index.mjs +1 -1
  19. package/dist/session-decode/decode-worker-child.js +2 -2
  20. package/dist/session-decode/decode-worker-child.mjs +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-w2XLD3uI.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BeL4_jgH.mjs} +3 -3
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DjndFc5V.mjs +26 -0
  24. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DsIi4G5Q.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CmHtm5CX.mjs} +1 -1
  25. package/dist/stream-broker/{hostInit-B-h24cDy.mjs → hostInit-BK9nzKAG.mjs} +3 -3
  26. package/dist/stream-broker/index.js +1 -1
  27. package/dist/stream-broker/index.mjs +1 -1
  28. package/dist/stream-broker/remoteEntry.js +1 -1
  29. package/dist/{worker-protocol-CiKfal2P.js → worker-protocol-GGnzfWu3.js} +1 -1
  30. package/dist/{worker-protocol-BDiL8TBm.mjs → worker-protocol-bEipQT9l.mjs} +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DvZWLWk1.mjs +0 -26
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BSeR_hVv.js");
1
+ const require_dist = require("./dist-L-1LMGQs.js");
2
2
  require("node:crypto");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
@@ -2,9 +2,9 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-BSeR_hVv.js");
6
- const require_process_memory = require("../process-memory-C33u3tQz.js");
7
- const require_addon_utils = require("../addon-utils-BEzVJ0xg.js");
5
+ const require_dist = require("../dist-L-1LMGQs.js");
6
+ const require_process_memory = require("../process-memory-CgrbLo3l.js");
7
+ const require_addon_utils = require("../addon-utils-Vv2dCqA2.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_dist.__toESM(node_path);
10
10
  let node_fs = require("node:fs");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Ct as hydrateSchema, K as mapAudioLabelToMacro, O as audioAnalysisCapability, at as resolvePoolMemoryPolicy, b as PoolMemoryWatchdog, ft as errMsg, g as HF_BASE_URL, k as audioAnalyzerCapability, n as AUDIO_BACKEND_CHOICES, s as DEFAULT_AUDIO_ANALYZER_CONFIG, vt as BaseAddon } from "../dist-lITI1Bn5.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CEKVKfwg.mjs";
2
+ import { A as audioAnalyzerCapability, Et as hydrateSchema, _ as HF_BASE_URL, ct as resolvePoolMemoryPolicy, ht as errMsg, k as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, q as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, x as PoolMemoryWatchdog, xt as BaseAddon } from "../dist-CkXAzTZ2.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DlSOzuHP.mjs";
4
4
  import { i as downloadFile } from "../addon-utils-A2S9D7pu.mjs";
5
5
  import * as path$1 from "node:path";
6
6
  import * as fs from "node:fs";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-BSeR_hVv.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-BNsp9k8r.js");
7
- const require_lazy_sharp = require("../lazy-sharp-CBohM8D8.js");
8
- const require_process_memory = require("../process-memory-C33u3tQz.js");
9
- const require_addon_utils = require("../addon-utils-BEzVJ0xg.js");
5
+ const require_dist = require("../dist-L-1LMGQs.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DwAho7HD.js");
7
+ const require_lazy_sharp = require("../lazy-sharp-DfbyQxET.js");
8
+ const require_process_memory = require("../process-memory-CgrbLo3l.js");
9
+ const require_addon_utils = require("../addon-utils-Vv2dCqA2.js");
10
10
  let sharp = require("sharp");
11
11
  sharp = require_dist.__toESM(sharp);
12
12
  let node_child_process = require("node:child_process");
@@ -5454,7 +5454,7 @@ function collectUnknownAddonIssues(steps, getStepDef = require_event_loop_stall_
5454
5454
  * `diagnostics.substitutions` instead of happening silently. The caller
5455
5455
  * (the provider) owns logging + dedup for both.
5456
5456
  */
5457
- function resolveInputSteps(steps, format, engine, clusterModels) {
5457
+ function resolveInputSteps(steps, format, engine, clusterModels, clusterSettings) {
5458
5458
  const resolvedSteps = [];
5459
5459
  const unknownAddonIds = [];
5460
5460
  const substitutions = [];
@@ -5476,12 +5476,13 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5476
5476
  format: verdict.format,
5477
5477
  formatsShipped: verdict.formatsShipped
5478
5478
  });
5479
- const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels) : null;
5479
+ const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels, clusterSettings) : null;
5480
5480
  if (childResult) {
5481
5481
  unknownAddonIds.push(...childResult.diagnostics.unknownAddonIds);
5482
5482
  substitutions.push(...childResult.diagnostics.substitutions);
5483
5483
  clusterRefusals.push(...childResult.diagnostics.clusterRefusals);
5484
5484
  }
5485
+ const settings = require_dist.overlayClusterStepSettings(s.addonId, s.settings, clusterSettings ?? {});
5485
5486
  resolvedSteps.push({
5486
5487
  addonId: s.addonId,
5487
5488
  addonName: def.name,
@@ -5491,7 +5492,7 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5491
5492
  enabled: s.enabled,
5492
5493
  modelId: verdict.modelId,
5493
5494
  children: childResult ? childResult.steps : [],
5494
- ...s.settings ? { settings: { ...s.settings } } : {}
5495
+ ...settings ? { settings } : {}
5495
5496
  });
5496
5497
  continue;
5497
5498
  }
@@ -5504,12 +5505,13 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5504
5505
  running: runningModelId,
5505
5506
  format
5506
5507
  });
5507
- const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels) : null;
5508
+ const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels, clusterSettings) : null;
5508
5509
  if (childResult) {
5509
5510
  unknownAddonIds.push(...childResult.diagnostics.unknownAddonIds);
5510
5511
  substitutions.push(...childResult.diagnostics.substitutions);
5511
5512
  clusterRefusals.push(...childResult.diagnostics.clusterRefusals);
5512
5513
  }
5514
+ const settings = require_dist.overlayClusterStepSettings(s.addonId, s.settings, clusterSettings ?? {});
5513
5515
  resolvedSteps.push({
5514
5516
  addonId: s.addonId,
5515
5517
  addonName: def.name,
@@ -5519,7 +5521,7 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5519
5521
  enabled: s.enabled,
5520
5522
  modelId: runningModelId,
5521
5523
  children: childResult ? childResult.steps : [],
5522
- ...s.settings ? { settings: { ...s.settings } } : {}
5524
+ ...settings ? { settings } : {}
5523
5525
  });
5524
5526
  }
5525
5527
  return {
@@ -5608,6 +5610,7 @@ var CLUSTER_MODEL_OWNER_ADDON_ID = "pipeline-orchestrator";
5608
5610
  /** TTL-cached read of the cluster model row. */
5609
5611
  var ClusterModelSource = class {
5610
5612
  models = require_dist.DEFAULT_CLUSTER_STEP_MODELS;
5613
+ settings = require_dist.DEFAULT_CLUSTER_STEP_SETTINGS;
5611
5614
  lastReadAtMs = Number.NEGATIVE_INFINITY;
5612
5615
  inFlight = null;
5613
5616
  logger;
@@ -5622,6 +5625,10 @@ var ClusterModelSource = class {
5622
5625
  current() {
5623
5626
  return this.models;
5624
5627
  }
5628
+ /** Cluster-scoped step knobs in force right now (admission floors, …). */
5629
+ currentSettings() {
5630
+ return this.settings;
5631
+ }
5625
5632
  /**
5626
5633
  * Re-read if the cached row has expired. Concurrent callers share one
5627
5634
  * in-flight read; a failure keeps the LAST KNOWN row.
@@ -5637,9 +5644,16 @@ var ClusterModelSource = class {
5637
5644
  }
5638
5645
  async read(api) {
5639
5646
  try {
5640
- const next = require_dist.pickClusterStepModels(await api.addonSettings.getGlobalSettings.query({ addonId: CLUSTER_MODEL_OWNER_ADDON_ID }));
5647
+ const view = await api.addonSettings.getGlobalSettings.query({ addonId: CLUSTER_MODEL_OWNER_ADDON_ID });
5648
+ const next = require_dist.pickClusterStepModels(view);
5649
+ const nextSettings = require_dist.pickClusterStepSettings(view);
5641
5650
  this.lastReadAtMs = this.now();
5642
5651
  const changed = Object.keys(next).filter((stepId) => next[stepId] !== this.models[stepId]);
5652
+ const settingsChanged = Object.keys(nextSettings).some((stepId) => {
5653
+ const from = this.settings[stepId] ?? {};
5654
+ const to = nextSettings[stepId] ?? {};
5655
+ return [...new Set([...Object.keys(from), ...Object.keys(to)])].some((key) => from[key] !== to[key]);
5656
+ });
5643
5657
  if (changed.length > 0) {
5644
5658
  this.logger.info("cluster step model changed — vectors already stored by the previous model need a re-embed pass", { meta: { changed: changed.map((stepId) => ({
5645
5659
  stepId,
@@ -5648,6 +5662,13 @@ var ClusterModelSource = class {
5648
5662
  })) } });
5649
5663
  this.models = next;
5650
5664
  }
5665
+ if (settingsChanged) {
5666
+ this.logger.info("cluster step settings changed", { meta: {
5667
+ from: { ...this.settings },
5668
+ to: { ...nextSettings }
5669
+ } });
5670
+ this.settings = nextSettings;
5671
+ }
5651
5672
  } catch (err) {
5652
5673
  this.logger.warn("cluster step model read failed — keeping the last known row", { meta: {
5653
5674
  owner: CLUSTER_MODEL_OWNER_ADDON_ID,
@@ -7504,7 +7525,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7504
7525
  backend: this.currentEngine.backend,
7505
7526
  device: this.currentEngine.device ?? null
7506
7527
  }, clusterRefusalsOut) {
7507
- const { steps: resolvedSteps, diagnostics } = resolveInputSteps(steps, format, engine, this.clusterModels.current());
7528
+ const { steps: resolvedSteps, diagnostics } = resolveInputSteps(steps, format, engine, this.clusterModels.current(), this.clusterModels.currentSettings());
7508
7529
  if (clusterRefusalsOut) clusterRefusalsOut.push(...diagnostics.clusterRefusals);
7509
7530
  for (const addonId of diagnostics.unknownAddonIds) this.logLiveDispatchIssueOnce(`unknown:${addonId}`, () => this.log.warn("Live pipeline step references an unknown addon — dropping step", { meta: { addonId } }));
7510
7531
  for (const sub of diagnostics.substitutions) this.logLiveDispatchIssueOnce(`${sub.addonId}|${sub.chosen}|${sub.running}|${sub.format}`, () => this.log.info("Live pipeline step model substituted for engine format (node-local)", { meta: {
@@ -1,8 +1,8 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $ as pipelineExecutorCapability, B as detectionPipelineCapability, Ct as hydrateSchema, Dt as nodePin, E as YAMNET_TO_MACRO, F as defaultDeviceFor$1, Ht as union, Nt as array, Ot as parseJsonUnknown, St as createEvent, U as enumerateInferenceDevices, Ut as EventCategory, Vt as string, W as evaluateZoneRules, X as pickClusterStepModels, at as resolvePoolMemoryPolicy, b as PoolMemoryWatchdog, c as DEFAULT_CLUSTER_STEP_MODELS, f as DEVICE_BACKEND_TO_FORMAT, ft as errMsg, jt as sleep, rt as resolveClusterStepModelId, st as runtimeDevices$1, t as APPLE_SA_TO_MACRO, ut as supportedRuntimes$1, vt as BaseAddon, zt as object } from "../dist-lITI1Bn5.mjs";
3
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, u as landmarkPrecisionVerdict } from "../event-loop-stall-monitor-0VvjTRDP.mjs";
2
+ import { $ as pickClusterStepSettings, At as nodePin, D as YAMNET_TO_MACRO, Et as hydrateSchema, G as evaluateZoneRules, Gt as union, Ht as object, I as defaultDeviceFor$1, It as array, Kt as EventCategory, Pt as sleep, Q as pickClusterStepModels, Tt as createEvent, V as detectionPipelineCapability, W as enumerateInferenceDevices, Wt as string, X as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as resolvePoolMemoryPolicy, ht as errMsg, jt as parseJsonUnknown, l as DEFAULT_CLUSTER_STEP_SETTINGS, nt as pipelineExecutorCapability, ot as resolveClusterStepModelId, p as DEVICE_BACKEND_TO_FORMAT, pt as supportedRuntimes$1, t as APPLE_SA_TO_MACRO, ut as runtimeDevices$1, x as PoolMemoryWatchdog, xt as BaseAddon } from "../dist-CkXAzTZ2.mjs";
3
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, u as landmarkPrecisionVerdict } from "../event-loop-stall-monitor-fHkfgmlw.mjs";
4
4
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
5
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CEKVKfwg.mjs";
5
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DlSOzuHP.mjs";
6
6
  import { a as ensureModel, o as isModelDownloaded, r as deleteModelFromDisk } from "../addon-utils-A2S9D7pu.mjs";
7
7
  import sharp from "sharp";
8
8
  import { spawn } from "node:child_process";
@@ -5447,7 +5447,7 @@ function collectUnknownAddonIssues(steps, getStepDef = getStepDefinition) {
5447
5447
  * `diagnostics.substitutions` instead of happening silently. The caller
5448
5448
  * (the provider) owns logging + dedup for both.
5449
5449
  */
5450
- function resolveInputSteps(steps, format, engine, clusterModels) {
5450
+ function resolveInputSteps(steps, format, engine, clusterModels, clusterSettings) {
5451
5451
  const resolvedSteps = [];
5452
5452
  const unknownAddonIds = [];
5453
5453
  const substitutions = [];
@@ -5469,12 +5469,13 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5469
5469
  format: verdict.format,
5470
5470
  formatsShipped: verdict.formatsShipped
5471
5471
  });
5472
- const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels) : null;
5472
+ const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels, clusterSettings) : null;
5473
5473
  if (childResult) {
5474
5474
  unknownAddonIds.push(...childResult.diagnostics.unknownAddonIds);
5475
5475
  substitutions.push(...childResult.diagnostics.substitutions);
5476
5476
  clusterRefusals.push(...childResult.diagnostics.clusterRefusals);
5477
5477
  }
5478
+ const settings = overlayClusterStepSettings(s.addonId, s.settings, clusterSettings ?? {});
5478
5479
  resolvedSteps.push({
5479
5480
  addonId: s.addonId,
5480
5481
  addonName: def.name,
@@ -5484,7 +5485,7 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5484
5485
  enabled: s.enabled,
5485
5486
  modelId: verdict.modelId,
5486
5487
  children: childResult ? childResult.steps : [],
5487
- ...s.settings ? { settings: { ...s.settings } } : {}
5488
+ ...settings ? { settings } : {}
5488
5489
  });
5489
5490
  continue;
5490
5491
  }
@@ -5497,12 +5498,13 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5497
5498
  running: runningModelId,
5498
5499
  format
5499
5500
  });
5500
- const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels) : null;
5501
+ const childResult = s.children ? resolveInputSteps(s.children, format, engine, clusterModels, clusterSettings) : null;
5501
5502
  if (childResult) {
5502
5503
  unknownAddonIds.push(...childResult.diagnostics.unknownAddonIds);
5503
5504
  substitutions.push(...childResult.diagnostics.substitutions);
5504
5505
  clusterRefusals.push(...childResult.diagnostics.clusterRefusals);
5505
5506
  }
5507
+ const settings = overlayClusterStepSettings(s.addonId, s.settings, clusterSettings ?? {});
5506
5508
  resolvedSteps.push({
5507
5509
  addonId: s.addonId,
5508
5510
  addonName: def.name,
@@ -5512,7 +5514,7 @@ function resolveInputSteps(steps, format, engine, clusterModels) {
5512
5514
  enabled: s.enabled,
5513
5515
  modelId: runningModelId,
5514
5516
  children: childResult ? childResult.steps : [],
5515
- ...s.settings ? { settings: { ...s.settings } } : {}
5517
+ ...settings ? { settings } : {}
5516
5518
  });
5517
5519
  }
5518
5520
  return {
@@ -5601,6 +5603,7 @@ var CLUSTER_MODEL_OWNER_ADDON_ID = "pipeline-orchestrator";
5601
5603
  /** TTL-cached read of the cluster model row. */
5602
5604
  var ClusterModelSource = class {
5603
5605
  models = DEFAULT_CLUSTER_STEP_MODELS;
5606
+ settings = DEFAULT_CLUSTER_STEP_SETTINGS;
5604
5607
  lastReadAtMs = Number.NEGATIVE_INFINITY;
5605
5608
  inFlight = null;
5606
5609
  logger;
@@ -5615,6 +5618,10 @@ var ClusterModelSource = class {
5615
5618
  current() {
5616
5619
  return this.models;
5617
5620
  }
5621
+ /** Cluster-scoped step knobs in force right now (admission floors, …). */
5622
+ currentSettings() {
5623
+ return this.settings;
5624
+ }
5618
5625
  /**
5619
5626
  * Re-read if the cached row has expired. Concurrent callers share one
5620
5627
  * in-flight read; a failure keeps the LAST KNOWN row.
@@ -5630,9 +5637,16 @@ var ClusterModelSource = class {
5630
5637
  }
5631
5638
  async read(api) {
5632
5639
  try {
5633
- const next = pickClusterStepModels(await api.addonSettings.getGlobalSettings.query({ addonId: CLUSTER_MODEL_OWNER_ADDON_ID }));
5640
+ const view = await api.addonSettings.getGlobalSettings.query({ addonId: CLUSTER_MODEL_OWNER_ADDON_ID });
5641
+ const next = pickClusterStepModels(view);
5642
+ const nextSettings = pickClusterStepSettings(view);
5634
5643
  this.lastReadAtMs = this.now();
5635
5644
  const changed = Object.keys(next).filter((stepId) => next[stepId] !== this.models[stepId]);
5645
+ const settingsChanged = Object.keys(nextSettings).some((stepId) => {
5646
+ const from = this.settings[stepId] ?? {};
5647
+ const to = nextSettings[stepId] ?? {};
5648
+ return [...new Set([...Object.keys(from), ...Object.keys(to)])].some((key) => from[key] !== to[key]);
5649
+ });
5636
5650
  if (changed.length > 0) {
5637
5651
  this.logger.info("cluster step model changed — vectors already stored by the previous model need a re-embed pass", { meta: { changed: changed.map((stepId) => ({
5638
5652
  stepId,
@@ -5641,6 +5655,13 @@ var ClusterModelSource = class {
5641
5655
  })) } });
5642
5656
  this.models = next;
5643
5657
  }
5658
+ if (settingsChanged) {
5659
+ this.logger.info("cluster step settings changed", { meta: {
5660
+ from: { ...this.settings },
5661
+ to: { ...nextSettings }
5662
+ } });
5663
+ this.settings = nextSettings;
5664
+ }
5644
5665
  } catch (err) {
5645
5666
  this.logger.warn("cluster step model read failed — keeping the last known row", { meta: {
5646
5667
  owner: CLUSTER_MODEL_OWNER_ADDON_ID,
@@ -7497,7 +7518,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
7497
7518
  backend: this.currentEngine.backend,
7498
7519
  device: this.currentEngine.device ?? null
7499
7520
  }, clusterRefusalsOut) {
7500
- const { steps: resolvedSteps, diagnostics } = resolveInputSteps(steps, format, engine, this.clusterModels.current());
7521
+ const { steps: resolvedSteps, diagnostics } = resolveInputSteps(steps, format, engine, this.clusterModels.current(), this.clusterModels.currentSettings());
7501
7522
  if (clusterRefusalsOut) clusterRefusalsOut.push(...diagnostics.clusterRefusals);
7502
7523
  for (const addonId of diagnostics.unknownAddonIds) this.logLiveDispatchIssueOnce(`unknown:${addonId}`, () => this.log.warn("Live pipeline step references an unknown addon — dropping step", { meta: { addonId } }));
7503
7524
  for (const sub of diagnostics.substitutions) this.logLiveDispatchIssueOnce(`${sub.addonId}|${sub.chosen}|${sub.running}|${sub.format}`, () => this.log.info("Live pipeline step model substituted for engine format (node-local)", { meta: {
@@ -21682,7 +21682,12 @@ var TerminalSessionInfoSchema = object({
21682
21682
  var TerminalProfileInfoSchema = object({
21683
21683
  profileId: string(),
21684
21684
  label: string(),
21685
- description: string().optional()
21685
+ description: string().optional(),
21686
+ /** Spawn defaults the instance form copies on create. */
21687
+ executable: string().optional(),
21688
+ args: array(string()).readonly().optional(),
21689
+ cwd: string().optional(),
21690
+ environment: array(string()).readonly().optional()
21686
21691
  });
21687
21692
  /**
21688
21693
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21695,7 +21700,11 @@ var TerminalInstanceInfoSchema = object({
21695
21700
  profileId: string(),
21696
21701
  profileLabel: string(),
21697
21702
  name: string(),
21698
- enabled: boolean()
21703
+ enabled: boolean(),
21704
+ executable: string(),
21705
+ args: array(string()).readonly(),
21706
+ cwd: string(),
21707
+ environment: array(string()).readonly()
21699
21708
  });
21700
21709
  var TerminalLegacyCameraSchema = object({
21701
21710
  stableId: string(),
@@ -21725,7 +21734,21 @@ var TerminalOutputBatchSchema = object({
21725
21734
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21726
21735
  targetNodeId: string().min(1),
21727
21736
  profileId: string().min(1),
21728
- name: string().trim().min(1).max(160).optional()
21737
+ name: string().trim().min(1).max(160).optional(),
21738
+ executable: string().max(1024).optional(),
21739
+ args: array(string().max(2048)).max(64).optional(),
21740
+ cwd: string().max(1024).optional(),
21741
+ environment: array(string().max(4096)).max(64).optional()
21742
+ }), TerminalInstanceInfoSchema, {
21743
+ kind: "mutation",
21744
+ auth: "admin"
21745
+ }), method(object({
21746
+ instanceId: string().min(1),
21747
+ name: string().trim().min(1).max(160).optional(),
21748
+ executable: string().max(1024).optional(),
21749
+ args: array(string().max(2048)).max(64).optional(),
21750
+ cwd: string().max(1024).optional(),
21751
+ environment: array(string().max(4096)).max(64).optional()
21729
21752
  }), TerminalInstanceInfoSchema, {
21730
21753
  kind: "mutation",
21731
21754
  auth: "admin"
@@ -21747,7 +21770,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21747
21770
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21748
21771
  profileId: string(),
21749
21772
  cols: number().int().positive(),
21750
- rows: number().int().positive()
21773
+ rows: number().int().positive(),
21774
+ executable: string().max(1024).optional(),
21775
+ args: array(string().max(2048)).max(64).optional(),
21776
+ cwd: string().max(1024).optional(),
21777
+ environment: array(string().max(4096)).max(64).optional()
21751
21778
  }), TerminalSessionInfoSchema, {
21752
21779
  kind: "mutation",
21753
21780
  auth: "admin"
@@ -24842,6 +24869,20 @@ var AllowedAddressesSchema = object({
24842
24869
  * Network Addresses admin page and persisted by the addon.
24843
24870
  */
24844
24871
  addresses: array(string()).readonly() });
24872
+ var TlsStatusSchema = object({
24873
+ mode: _enum([
24874
+ "generated",
24875
+ "uploaded",
24876
+ "disabled"
24877
+ ]),
24878
+ leafFingerprintSha256: string().nullable(),
24879
+ caFingerprintSha256: string().nullable(),
24880
+ validTo: string().nullable(),
24881
+ sans: array(string()),
24882
+ caCertPem: string().nullable(),
24883
+ reissueError: string().nullable(),
24884
+ restartRequired: boolean()
24885
+ });
24845
24886
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24846
24887
  /**
24847
24888
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24861,7 +24902,20 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24861
24902
  * to avoid mixed-content blocks in the browser. The public
24862
24903
  * tunnel always emits `https://` regardless. */
24863
24904
  scheme: _enum(["http", "https"]).optional()
24864
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
24905
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
24906
+ kind: "mutation",
24907
+ auth: "admin"
24908
+ }), method(object({
24909
+ certPem: string().min(1),
24910
+ keyPem: string().min(1),
24911
+ caPem: string().optional()
24912
+ }), TlsStatusSchema, {
24913
+ kind: "mutation",
24914
+ auth: "admin"
24915
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24916
+ kind: "mutation",
24917
+ auth: "admin"
24918
+ });
24865
24919
  object({
24866
24920
  /** Lifecycle state of the lock. `jammed` means the motor reported
24867
24921
  * failure to reach the target — operator intervention required. */
@@ -30796,6 +30850,12 @@ Object.freeze({
30796
30850
  addonId: null,
30797
30851
  access: "create"
30798
30852
  },
30853
+ "localNetwork.downloadCa": {
30854
+ capName: "local-network",
30855
+ capScope: "system",
30856
+ addonId: null,
30857
+ access: "view"
30858
+ },
30799
30859
  "localNetwork.getAllowedAddresses": {
30800
30860
  capName: "local-network",
30801
30861
  capScope: "system",
@@ -30820,18 +30880,36 @@ Object.freeze({
30820
30880
  addonId: null,
30821
30881
  access: "view"
30822
30882
  },
30883
+ "localNetwork.getTlsStatus": {
30884
+ capName: "local-network",
30885
+ capScope: "system",
30886
+ addonId: null,
30887
+ access: "view"
30888
+ },
30823
30889
  "localNetwork.list": {
30824
30890
  capName: "local-network",
30825
30891
  capScope: "system",
30826
30892
  addonId: null,
30827
30893
  access: "view"
30828
30894
  },
30895
+ "localNetwork.regenerateCertificate": {
30896
+ capName: "local-network",
30897
+ capScope: "system",
30898
+ addonId: null,
30899
+ access: "create"
30900
+ },
30829
30901
  "localNetwork.resetAllowlistToBestMatch": {
30830
30902
  capName: "local-network",
30831
30903
  capScope: "system",
30832
30904
  addonId: null,
30833
30905
  access: "delete"
30834
30906
  },
30907
+ "localNetwork.revertToGeneratedCertificate": {
30908
+ capName: "local-network",
30909
+ capScope: "system",
30910
+ addonId: null,
30911
+ access: "create"
30912
+ },
30835
30913
  "localNetwork.setAllowedAddresses": {
30836
30914
  capName: "local-network",
30837
30915
  capScope: "system",
@@ -30844,6 +30922,12 @@ Object.freeze({
30844
30922
  addonId: null,
30845
30923
  access: "create"
30846
30924
  },
30925
+ "localNetwork.uploadCertificate": {
30926
+ capName: "local-network",
30927
+ capScope: "system",
30928
+ addonId: null,
30929
+ access: "create"
30930
+ },
30847
30931
  "lockControl.lock": {
30848
30932
  capName: "lock-control",
30849
30933
  capScope: "device",
@@ -33724,6 +33808,12 @@ Object.freeze({
33724
33808
  addonId: null,
33725
33809
  access: "create"
33726
33810
  },
33811
+ "terminalSession.updateInstance": {
33812
+ capName: "terminal-session",
33813
+ capScope: "system",
33814
+ addonId: null,
33815
+ access: "create"
33816
+ },
33727
33817
  "terminalSession.writeInput": {
33728
33818
  capName: "terminal-session",
33729
33819
  capScope: "system",
@@ -36375,6 +36465,58 @@ function resolveClusterStepModelId(stepId, models) {
36375
36465
  const chosen = models[stepId];
36376
36466
  return chosen !== void 0 && chosen !== "" ? chosen : step.defaultModelId;
36377
36467
  }
36468
+ var CLUSTER_STEP_SETTING_FIELDS = [{
36469
+ stepId: "face-embedding",
36470
+ key: "minLandmarkFaceSize",
36471
+ label: "Min face size for recognition (detection px)",
36472
+ 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.",
36473
+ type: "slider",
36474
+ min: 0,
36475
+ max: 64,
36476
+ step: 2,
36477
+ default: 24
36478
+ }];
36479
+ function clusterStepSettingKey(stepId, fieldKey) {
36480
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
36481
+ }
36482
+ var ClusterSettingNumberSchema = number().finite();
36483
+ function readClusterStepSettings(config) {
36484
+ const out = {};
36485
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
36486
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
36487
+ const value = parsed.success ? parsed.data : field.default;
36488
+ const existing = out[field.stepId] ?? {};
36489
+ out[field.stepId] = {
36490
+ ...existing,
36491
+ [field.key]: value
36492
+ };
36493
+ }
36494
+ return out;
36495
+ }
36496
+ var DEFAULT_CLUSTER_STEP_SETTINGS = readClusterStepSettings({});
36497
+ function pickClusterStepSettings(view) {
36498
+ if (view === null) return DEFAULT_CLUSTER_STEP_SETTINGS;
36499
+ const flat = {};
36500
+ const wanted = new Set(CLUSTER_STEP_SETTING_FIELDS.map((field) => clusterStepSettingKey(field.stepId, field.key)));
36501
+ for (const section of view.sections) for (const entry of section.fields) {
36502
+ if (!isHydratedField$2(entry) || typeof entry.key !== "string") continue;
36503
+ if (wanted.has(entry.key)) flat[entry.key] = entry.value;
36504
+ }
36505
+ return readClusterStepSettings(flat);
36506
+ }
36507
+ /**
36508
+ * Cluster knobs win over leftover per-device values. The cluster row is the
36509
+ * authority; a device-local copy is a leftover of the old per-node editor.
36510
+ */
36511
+ function overlayClusterStepSettings(stepId, deviceSettings, cluster) {
36512
+ const overlay = cluster[stepId];
36513
+ if (overlay === void 0 || Object.keys(overlay).length === 0) return deviceSettings === void 0 ? void 0 : { ...deviceSettings };
36514
+ if (deviceSettings === void 0) return { ...overlay };
36515
+ return {
36516
+ ...deviceSettings,
36517
+ ...overlay
36518
+ };
36519
+ }
36378
36520
  var DETAIL_CROP_PADDING_KEY = "detailCropPaddingRatio";
36379
36521
  var DETAIL_CROP_SQUARE_KEY = "detailCropSquare";
36380
36522
  /**
@@ -37434,4 +37576,4 @@ function enumerateInferenceDevices(hw) {
37434
37576
  return out;
37435
37577
  }
37436
37578
  //#endregion
37437
- export { pipelineExecutorCapability as $, audioKindId as A, selectAssignedProfileSlots as At, detectionPipelineCapability as B, record as Bt, RECORDING_EXPORT_MAX_READ_BYTES as C, hydrateSchema as Ct, addonWidgetsSourceCapability as D, nodePin as Dt, YAMNET_TO_MACRO as E, makeSourceBrokerId as Et, defaultDeviceFor as F, discriminatedUnion as Ft, hfModelUrl as G, egressTransportFromRequest as H, union as Ht, defineCustomActions as I, lazy as It, motionDetectionCapability as J, mapAudioLabelToMacro as K, deriveBatteryPresence as L, literal as Lt, cameraStreamsCapability as M, _enum as Mt, createHwAccelCache as N, array as Nt, audioAnalysisCapability as O, parseJsonUnknown as Ot, customAction as P, boolean as Pt, pickNativeLeaseOverride as Q, deriveDetailCropRect as R, number as Rt, RATE_CONTROL_TIGHT as S, createEvent as St, RingBuffer as T, makeProfileBrokerId as Tt, enumerateInferenceDevices as U, EventCategory as Ut, egressTranscodeSharingKey as V, string as Vt, evaluateZoneRules as W, pickClusterStepModels as X, parseProcStatus as Y, pickDetailCropConvention as Z, NativeLeaseAdmissionSchema as _, isSoftwareDecode as _t, COCO_80_LABELS as a, resolvePoolMemoryPolicy as at, PoolMemoryWatchdog as b, DeviceFeature as bt, DEFAULT_CLUSTER_STEP_MODELS as c, storageEvictableCapability as ct, DEFAULT_NATIVE_LEASE_SETTINGS as d, webrtcSessionCapability as dt, pipelineRunnerCapability as et, DEVICE_BACKEND_TO_FORMAT as f, errMsg as ft, HF_BASE_URL as g, invocationFromEncodeProfile as gt, ExportRecordSchema as h, buildFfmpegArgs as ht, BatteryStatusSchema as i, resolveEgressDecodeHwAccel as it, batteryCapability as j, sleep as jt, audioAnalyzerCapability as k, parseProfileBrokerId as kt, DEFAULT_DETAIL_CROP_CONVENTION as l, streamBrokerCapability as lt, EncodeProfileSchema as m, Fmp4BoxSplitter as mt, AUDIO_BACKEND_CHOICES as n, recordingExportCapability as nt, COCO_TO_MACRO as o, resolveRecordingProfiles as ot, EVENT_PAD_MS as p, AUDIO_PRESETS as pt, maskUrlCredentials as q, AUDIO_MACRO_LABELS as r, resolveClusterStepModelId as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, runtimeDevices as st, APPLE_SA_TO_MACRO as t, recordingCapability as tt, DEFAULT_EVENTS_BAND_BUFFER_SEC as u, supportedRuntimes as ut, NativeLeaseSettingsSchema as v, BaseAddon as vt, RecordingConfigSchema as w, isEvent as wt, RATE_CONTROL_RELAXED as x, DeviceType as xt, OpsLogEntrySchema as y, CAM_PROFILE_ORDER as yt, deriveRecordingMode as z, object as zt };
37579
+ export { pickClusterStepSettings as $, audioAnalyzerCapability as A, nodePin as At, deriveRecordingMode as B, literal as Bt, RATE_CONTROL_TIGHT as C, DeviceFeature as Ct, YAMNET_TO_MACRO as D, isEvent as Dt, RingBuffer as E, hydrateSchema as Et, customAction as F, _enum as Ft, evaluateZoneRules as G, union as Gt, egressTranscodeSharingKey as H, object as Ht, defaultDeviceFor as I, array as It, maskUrlCredentials as J, hfModelUrl as K, EventCategory as Kt, defineCustomActions as L, boolean as Lt, batteryCapability as M, parseProfileBrokerId as Mt, cameraStreamsCapability as N, selectAssignedProfileSlots as Nt, addonWidgetsSourceCapability as O, makeProfileBrokerId as Ot, createHwAccelCache as P, sleep as Pt, pickClusterStepModels as Q, deriveBatteryPresence as R, discriminatedUnion as Rt, RATE_CONTROL_RELAXED as S, CAM_PROFILE_ORDER as St, RecordingConfigSchema as T, createEvent as Tt, egressTransportFromRequest as U, record as Ut, detectionPipelineCapability as V, number as Vt, enumerateInferenceDevices as W, string as Wt, overlayClusterStepSettings as X, motionDetectionCapability as Y, parseProcStatus as Z, HF_BASE_URL as _, Fmp4BoxSplitter as _t, COCO_80_LABELS as a, recordingExportCapability as at, OpsLogEntrySchema as b, isSoftwareDecode as bt, DEFAULT_CLUSTER_STEP_MODELS as c, resolvePoolMemoryPolicy as ct, DEFAULT_EVENTS_BAND_BUFFER_SEC as d, storageEvictableCapability as dt, pickDetailCropConvention as et, DEFAULT_NATIVE_LEASE_SETTINGS as f, streamBrokerCapability as ft, ExportRecordSchema as g, AUDIO_PRESETS as gt, EncodeProfileSchema as h, errMsg as ht, BatteryStatusSchema as i, recordingCapability as it, audioKindId as j, parseJsonUnknown as jt, audioAnalysisCapability as k, makeSourceBrokerId as kt, DEFAULT_CLUSTER_STEP_SETTINGS as l, resolveRecordingProfiles as lt, EVENT_PAD_MS as m, webrtcSessionCapability as mt, AUDIO_BACKEND_CHOICES as n, pipelineExecutorCapability as nt, COCO_TO_MACRO as o, resolveClusterStepModelId as ot, DEVICE_BACKEND_TO_FORMAT as p, supportedRuntimes as pt, mapAudioLabelToMacro as q, AUDIO_MACRO_LABELS as r, pipelineRunnerCapability as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, resolveEgressDecodeHwAccel as st, APPLE_SA_TO_MACRO as t, pickNativeLeaseOverride as tt, DEFAULT_DETAIL_CROP_CONVENTION as u, runtimeDevices as ut, NativeLeaseAdmissionSchema as v, buildFfmpegArgs as vt, RECORDING_EXPORT_MAX_READ_BYTES as w, DeviceType as wt, PoolMemoryWatchdog as x, BaseAddon as xt, NativeLeaseSettingsSchema as y, invocationFromEncodeProfile as yt, deriveDetailCropRect as z, lazy as zt };