@camstack/addon-pipeline-orchestrator 1.2.175 → 1.2.177

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.
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.2.91",
6
+ version: "1.2.93",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_orchestrator_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.171",
21
+ version: "1.2.173",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_orchestrator_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.139",
36
+ version: "1.2.141",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_orchestrator_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.171",
39
+ version: "1.2.173",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -45,7 +45,7 @@ async function r() {
45
45
  }
46
46
  },
47
47
  "@camstack/sdk": {
48
- version: "1.2.91",
48
+ version: "1.2.93",
49
49
  scope: "default",
50
50
  shareConfig: {
51
51
  singleton: !0,
@@ -99,7 +99,7 @@ async function r() {
99
99
  }
100
100
  },
101
101
  "@camstack/ui-library": {
102
- version: "1.2.139",
102
+ version: "1.2.141",
103
103
  scope: "default",
104
104
  shareConfig: {
105
105
  singleton: !0,
package/dist/index.js CHANGED
@@ -21523,6 +21523,22 @@ var occupancyRecheckFramesField = {
21523
21523
  step: 1
21524
21524
  };
21525
21525
  /**
21526
+ * Frames one PRE-ROLL catch-up burst may send to inference at session open.
21527
+ *
21528
+ * The default of 12 over a ~4 s retained window is one frame per ~333 ms of
21529
+ * footage, and costs ~480 ms of ONE inference permit at the 40 ms/frame this
21530
+ * fleet measures — one-shot, and only ever taken while a permit would still be
21531
+ * spare for live. `0` turns the burst off entirely (the history is still
21532
+ * decoded, because that is how the dial reaches a decodable GOP, and is then
21533
+ * discarded — the pre-D411 behaviour).
21534
+ */
21535
+ var preRollInferenceFramesField = {
21536
+ min: 0,
21537
+ max: 30,
21538
+ default: 12,
21539
+ step: 1
21540
+ };
21541
+ /**
21526
21542
  * Source enum for motion signals fed to the runner. Extensible — add
21527
21543
  * new variants here when new motion-trigger paths are wired in
21528
21544
  * (`wasm-cross-camera`, `event-bus-relay`, etc.). The runner uses
@@ -21763,6 +21779,31 @@ var RunnerCameraConfigSchema = object({
21763
21779
  * to every occupancy rule until something moved in front of it. The churn is
21764
21780
  * now paid on the interval instead — see `occupancyRecheckSecField`.
21765
21781
  */
21782
+ /**
21783
+ * Infer the session's PRE-ROLL — the retained history the restreamer replays
21784
+ * at session open — instead of decoding it and throwing it away.
21785
+ *
21786
+ * DEFAULT `true`, and the default is the argument. This is not a new
21787
+ * capability being offered cautiously: the pre-roll is ALREADY requested,
21788
+ * already served, already decoded and already paid for on every on-motion
21789
+ * detection session that asks for history. What shipped was a last-moment
21790
+ * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
21791
+ * arriving inside a few hundred ms of wall clock looks to it like one frame's
21792
+ * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
21793
+ * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
21794
+ * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
21795
+ * was decoded, and was freed.
21796
+ *
21797
+ * Shipping that as opt-in would ship the bug: an operator cannot discover a
21798
+ * setting whose absence looks exactly like a camera that noticed the cyclist
21799
+ * late. What makes ON safe is not a switch but the BOUND —
21800
+ * `preRollInferenceFrames`, a wall-clock ceiling, and a lane that never takes
21801
+ * the last inference permit — so the switch exists for the camera where the
21802
+ * history is worthless (a doorbell whose subject is always already at the
21803
+ * door), not as a hedge against the feature.
21804
+ */
21805
+ preRollInferenceEnabled: boolean().default(true),
21806
+ preRollInferenceFrames: number().min(preRollInferenceFramesField.min).max(preRollInferenceFramesField.max).default(preRollInferenceFramesField.default),
21766
21807
  occupancyRecheckEnabled: boolean().default(true),
21767
21808
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
21768
21809
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
@@ -21917,6 +21958,29 @@ var RunnerCameraDeviceUIFields = [
21917
21958
  includes: "onboard"
21918
21959
  }
21919
21960
  },
21961
+ {
21962
+ key: "preRollInferenceEnabled",
21963
+ type: "boolean",
21964
+ style: "checkbox",
21965
+ label: "Detect in the pre-roll",
21966
+ description: "Run detection over the few seconds of footage the camera had already buffered when motion fired, so a subject that was in view before the trigger is found at the moment it appeared rather than seconds later. The burst is bounded and never delays live detection.",
21967
+ default: true
21968
+ },
21969
+ {
21970
+ key: "preRollInferenceFrames",
21971
+ type: "slider",
21972
+ label: "Pre-roll frames",
21973
+ description: "How many frames of buffered history may be detected on, per session. Higher samples the history more densely; 0 disables the pass.",
21974
+ min: preRollInferenceFramesField.min,
21975
+ max: preRollInferenceFramesField.max,
21976
+ step: preRollInferenceFramesField.step,
21977
+ default: preRollInferenceFramesField.default,
21978
+ showValue: true,
21979
+ showWhen: {
21980
+ field: "preRollInferenceEnabled",
21981
+ equals: true
21982
+ }
21983
+ },
21920
21984
  {
21921
21985
  key: "occupancyRecheckEnabled",
21922
21986
  type: "boolean",
@@ -44271,6 +44335,10 @@ function resolveDetectionSettings(input) {
44271
44335
  const occupancyRecheckEnabled = typeof userOccupancyRecheckEnabled === "boolean" ? userOccupancyRecheckEnabled : true;
44272
44336
  const occupancyRecheckSec = mustNumber(flat, deviceId, "occupancyRecheckSec");
44273
44337
  const occupancyRecheckFrames = mustNumber(flat, deviceId, "occupancyRecheckFrames");
44338
+ const userPreRollEnabled = raw["preRollInferenceEnabled"];
44339
+ const preRollInferenceEnabled = typeof userPreRollEnabled === "boolean" ? userPreRollEnabled : true;
44340
+ const userPreRollFrames = raw["preRollInferenceFrames"];
44341
+ const preRollInferenceFrames = typeof userPreRollFrames === "number" && Number.isFinite(userPreRollFrames) ? userPreRollFrames : 12;
44274
44342
  return {
44275
44343
  motionDetectionEnabled,
44276
44344
  pipelineEnabled,
@@ -44288,7 +44356,9 @@ function resolveDetectionSettings(input) {
44288
44356
  onboardMotionDrivesAnalyzer,
44289
44357
  occupancyRecheckEnabled,
44290
44358
  occupancyRecheckSec,
44291
- occupancyRecheckFrames
44359
+ occupancyRecheckFrames,
44360
+ preRollInferenceEnabled,
44361
+ preRollInferenceFrames
44292
44362
  };
44293
44363
  }
44294
44364
  /**
@@ -44346,7 +44416,9 @@ function buildDetectionConfigFromInputs(resolved, assigned) {
44346
44416
  onboardMotionDrivesAnalyzer: resolved.onboardMotionDrivesAnalyzer,
44347
44417
  occupancyRecheckEnabled: resolved.occupancyRecheckEnabled,
44348
44418
  occupancyRecheckSec: resolved.occupancyRecheckSec,
44349
- occupancyRecheckFrames: resolved.occupancyRecheckFrames
44419
+ occupancyRecheckFrames: resolved.occupancyRecheckFrames,
44420
+ preRollInferenceEnabled: resolved.preRollInferenceEnabled,
44421
+ preRollInferenceFrames: resolved.preRollInferenceFrames
44350
44422
  };
44351
44423
  }
44352
44424
  /**
@@ -44371,6 +44443,8 @@ function detectionConfigEquals(a, b) {
44371
44443
  if (a.occupancyRecheckEnabled !== b.occupancyRecheckEnabled) return false;
44372
44444
  if (a.occupancyRecheckSec !== b.occupancyRecheckSec) return false;
44373
44445
  if (a.occupancyRecheckFrames !== b.occupancyRecheckFrames) return false;
44446
+ if (a.preRollInferenceEnabled !== b.preRollInferenceEnabled) return false;
44447
+ if (a.preRollInferenceFrames !== b.preRollInferenceFrames) return false;
44374
44448
  if (a.motionSources.length !== b.motionSources.length) return false;
44375
44449
  for (const s of a.motionSources) if (!b.motionSources.includes(s)) return false;
44376
44450
  return true;
@@ -44404,7 +44478,9 @@ function buildRunnerConfig(base, overrides) {
44404
44478
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
44405
44479
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
44406
44480
  occupancyRecheckSec: config.occupancyRecheckSec,
44407
- occupancyRecheckFrames: config.occupancyRecheckFrames
44481
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
44482
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
44483
+ preRollInferenceFrames: config.preRollInferenceFrames
44408
44484
  };
44409
44485
  }
44410
44486
  //#endregion
@@ -51236,7 +51312,9 @@ var SessionDispatchController = class {
51236
51312
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
51237
51313
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
51238
51314
  occupancyRecheckSec: config.occupancyRecheckSec,
51239
- occupancyRecheckFrames: config.occupancyRecheckFrames
51315
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
51316
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
51317
+ preRollInferenceFrames: config.preRollInferenceFrames
51240
51318
  };
51241
51319
  await this.deps.attachOn(nodeId, watchConfig);
51242
51320
  this.motionWatchByDevice.set(deviceId, nodeId);
@@ -51420,7 +51498,9 @@ var SessionDispatchController = class {
51420
51498
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
51421
51499
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
51422
51500
  occupancyRecheckSec: config.occupancyRecheckSec,
51423
- occupancyRecheckFrames: config.occupancyRecheckFrames
51501
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
51502
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
51503
+ preRollInferenceFrames: config.preRollInferenceFrames
51424
51504
  };
51425
51505
  const dispatchGuard = this.deps.ledger.markDispatching(deviceId);
51426
51506
  try {
@@ -53338,7 +53418,7 @@ function buildDeviceSettingsSections(nodeOptions) {
53338
53418
  tab: "detection-pipeline",
53339
53419
  location: "top-tab",
53340
53420
  order: 4,
53341
- fields: [...RunnerCameraDeviceUIFields.filter((f) => f.key !== "detectionFps" && f.key !== "occupancyRecheckSec" && f.key !== "occupancyRecheckFrames"), {
53421
+ fields: [...RunnerCameraDeviceUIFields.filter((f) => f.key !== "detectionFps" && f.key !== "occupancyRecheckSec" && f.key !== "occupancyRecheckFrames" && f.key !== "preRollInferenceEnabled" && f.key !== "preRollInferenceFrames"), {
53342
53422
  key: "motionStreamProfile",
53343
53423
  type: "select",
53344
53424
  label: "Motion Stream (analyzer)",
@@ -53486,6 +53566,15 @@ function buildDeviceSettingsSections(nodeOptions) {
53486
53566
  description: "Periodic re-sampling to keep stationary objects / occupancy fresh while the camera is idle (watching).",
53487
53567
  fields: RunnerCameraDeviceUIFields.filter((f) => f.key === "occupancyRecheckSec" || f.key === "occupancyRecheckFrames")
53488
53568
  },
53569
+ {
53570
+ id: "pre-roll-detection",
53571
+ title: "Pre-roll detection",
53572
+ tab: "detection-pipeline",
53573
+ location: "top-tab",
53574
+ order: 8,
53575
+ description: "When motion opens a session the camera has already buffered a few seconds of footage. Detecting over it finds a subject at the moment it appeared instead of after the decoder has warmed up.",
53576
+ fields: RunnerCameraDeviceUIFields.filter((f) => f.key === "preRollInferenceEnabled" || f.key === "preRollInferenceFrames")
53577
+ },
53489
53578
  {
53490
53579
  id: "cluster-assignment",
53491
53580
  title: "Cluster Assignment",
package/dist/index.mjs CHANGED
@@ -21495,6 +21495,22 @@ var occupancyRecheckFramesField = {
21495
21495
  step: 1
21496
21496
  };
21497
21497
  /**
21498
+ * Frames one PRE-ROLL catch-up burst may send to inference at session open.
21499
+ *
21500
+ * The default of 12 over a ~4 s retained window is one frame per ~333 ms of
21501
+ * footage, and costs ~480 ms of ONE inference permit at the 40 ms/frame this
21502
+ * fleet measures — one-shot, and only ever taken while a permit would still be
21503
+ * spare for live. `0` turns the burst off entirely (the history is still
21504
+ * decoded, because that is how the dial reaches a decodable GOP, and is then
21505
+ * discarded — the pre-D411 behaviour).
21506
+ */
21507
+ var preRollInferenceFramesField = {
21508
+ min: 0,
21509
+ max: 30,
21510
+ default: 12,
21511
+ step: 1
21512
+ };
21513
+ /**
21498
21514
  * Source enum for motion signals fed to the runner. Extensible — add
21499
21515
  * new variants here when new motion-trigger paths are wired in
21500
21516
  * (`wasm-cross-camera`, `event-bus-relay`, etc.). The runner uses
@@ -21735,6 +21751,31 @@ var RunnerCameraConfigSchema = object({
21735
21751
  * to every occupancy rule until something moved in front of it. The churn is
21736
21752
  * now paid on the interval instead — see `occupancyRecheckSecField`.
21737
21753
  */
21754
+ /**
21755
+ * Infer the session's PRE-ROLL — the retained history the restreamer replays
21756
+ * at session open — instead of decoding it and throwing it away.
21757
+ *
21758
+ * DEFAULT `true`, and the default is the argument. This is not a new
21759
+ * capability being offered cautiously: the pre-roll is ALREADY requested,
21760
+ * already served, already decoded and already paid for on every on-motion
21761
+ * detection session that asks for history. What shipped was a last-moment
21762
+ * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
21763
+ * arriving inside a few hundred ms of wall clock looks to it like one frame's
21764
+ * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
21765
+ * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
21766
+ * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
21767
+ * was decoded, and was freed.
21768
+ *
21769
+ * Shipping that as opt-in would ship the bug: an operator cannot discover a
21770
+ * setting whose absence looks exactly like a camera that noticed the cyclist
21771
+ * late. What makes ON safe is not a switch but the BOUND —
21772
+ * `preRollInferenceFrames`, a wall-clock ceiling, and a lane that never takes
21773
+ * the last inference permit — so the switch exists for the camera where the
21774
+ * history is worthless (a doorbell whose subject is always already at the
21775
+ * door), not as a hedge against the feature.
21776
+ */
21777
+ preRollInferenceEnabled: boolean().default(true),
21778
+ preRollInferenceFrames: number().min(preRollInferenceFramesField.min).max(preRollInferenceFramesField.max).default(preRollInferenceFramesField.default),
21738
21779
  occupancyRecheckEnabled: boolean().default(true),
21739
21780
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
21740
21781
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
@@ -21889,6 +21930,29 @@ var RunnerCameraDeviceUIFields = [
21889
21930
  includes: "onboard"
21890
21931
  }
21891
21932
  },
21933
+ {
21934
+ key: "preRollInferenceEnabled",
21935
+ type: "boolean",
21936
+ style: "checkbox",
21937
+ label: "Detect in the pre-roll",
21938
+ description: "Run detection over the few seconds of footage the camera had already buffered when motion fired, so a subject that was in view before the trigger is found at the moment it appeared rather than seconds later. The burst is bounded and never delays live detection.",
21939
+ default: true
21940
+ },
21941
+ {
21942
+ key: "preRollInferenceFrames",
21943
+ type: "slider",
21944
+ label: "Pre-roll frames",
21945
+ description: "How many frames of buffered history may be detected on, per session. Higher samples the history more densely; 0 disables the pass.",
21946
+ min: preRollInferenceFramesField.min,
21947
+ max: preRollInferenceFramesField.max,
21948
+ step: preRollInferenceFramesField.step,
21949
+ default: preRollInferenceFramesField.default,
21950
+ showValue: true,
21951
+ showWhen: {
21952
+ field: "preRollInferenceEnabled",
21953
+ equals: true
21954
+ }
21955
+ },
21892
21956
  {
21893
21957
  key: "occupancyRecheckEnabled",
21894
21958
  type: "boolean",
@@ -44243,6 +44307,10 @@ function resolveDetectionSettings(input) {
44243
44307
  const occupancyRecheckEnabled = typeof userOccupancyRecheckEnabled === "boolean" ? userOccupancyRecheckEnabled : true;
44244
44308
  const occupancyRecheckSec = mustNumber(flat, deviceId, "occupancyRecheckSec");
44245
44309
  const occupancyRecheckFrames = mustNumber(flat, deviceId, "occupancyRecheckFrames");
44310
+ const userPreRollEnabled = raw["preRollInferenceEnabled"];
44311
+ const preRollInferenceEnabled = typeof userPreRollEnabled === "boolean" ? userPreRollEnabled : true;
44312
+ const userPreRollFrames = raw["preRollInferenceFrames"];
44313
+ const preRollInferenceFrames = typeof userPreRollFrames === "number" && Number.isFinite(userPreRollFrames) ? userPreRollFrames : 12;
44246
44314
  return {
44247
44315
  motionDetectionEnabled,
44248
44316
  pipelineEnabled,
@@ -44260,7 +44328,9 @@ function resolveDetectionSettings(input) {
44260
44328
  onboardMotionDrivesAnalyzer,
44261
44329
  occupancyRecheckEnabled,
44262
44330
  occupancyRecheckSec,
44263
- occupancyRecheckFrames
44331
+ occupancyRecheckFrames,
44332
+ preRollInferenceEnabled,
44333
+ preRollInferenceFrames
44264
44334
  };
44265
44335
  }
44266
44336
  /**
@@ -44318,7 +44388,9 @@ function buildDetectionConfigFromInputs(resolved, assigned) {
44318
44388
  onboardMotionDrivesAnalyzer: resolved.onboardMotionDrivesAnalyzer,
44319
44389
  occupancyRecheckEnabled: resolved.occupancyRecheckEnabled,
44320
44390
  occupancyRecheckSec: resolved.occupancyRecheckSec,
44321
- occupancyRecheckFrames: resolved.occupancyRecheckFrames
44391
+ occupancyRecheckFrames: resolved.occupancyRecheckFrames,
44392
+ preRollInferenceEnabled: resolved.preRollInferenceEnabled,
44393
+ preRollInferenceFrames: resolved.preRollInferenceFrames
44322
44394
  };
44323
44395
  }
44324
44396
  /**
@@ -44343,6 +44415,8 @@ function detectionConfigEquals(a, b) {
44343
44415
  if (a.occupancyRecheckEnabled !== b.occupancyRecheckEnabled) return false;
44344
44416
  if (a.occupancyRecheckSec !== b.occupancyRecheckSec) return false;
44345
44417
  if (a.occupancyRecheckFrames !== b.occupancyRecheckFrames) return false;
44418
+ if (a.preRollInferenceEnabled !== b.preRollInferenceEnabled) return false;
44419
+ if (a.preRollInferenceFrames !== b.preRollInferenceFrames) return false;
44346
44420
  if (a.motionSources.length !== b.motionSources.length) return false;
44347
44421
  for (const s of a.motionSources) if (!b.motionSources.includes(s)) return false;
44348
44422
  return true;
@@ -44376,7 +44450,9 @@ function buildRunnerConfig(base, overrides) {
44376
44450
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
44377
44451
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
44378
44452
  occupancyRecheckSec: config.occupancyRecheckSec,
44379
- occupancyRecheckFrames: config.occupancyRecheckFrames
44453
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
44454
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
44455
+ preRollInferenceFrames: config.preRollInferenceFrames
44380
44456
  };
44381
44457
  }
44382
44458
  //#endregion
@@ -51208,7 +51284,9 @@ var SessionDispatchController = class {
51208
51284
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
51209
51285
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
51210
51286
  occupancyRecheckSec: config.occupancyRecheckSec,
51211
- occupancyRecheckFrames: config.occupancyRecheckFrames
51287
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
51288
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
51289
+ preRollInferenceFrames: config.preRollInferenceFrames
51212
51290
  };
51213
51291
  await this.deps.attachOn(nodeId, watchConfig);
51214
51292
  this.motionWatchByDevice.set(deviceId, nodeId);
@@ -51392,7 +51470,9 @@ var SessionDispatchController = class {
51392
51470
  onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,
51393
51471
  occupancyRecheckEnabled: config.occupancyRecheckEnabled,
51394
51472
  occupancyRecheckSec: config.occupancyRecheckSec,
51395
- occupancyRecheckFrames: config.occupancyRecheckFrames
51473
+ occupancyRecheckFrames: config.occupancyRecheckFrames,
51474
+ preRollInferenceEnabled: config.preRollInferenceEnabled,
51475
+ preRollInferenceFrames: config.preRollInferenceFrames
51396
51476
  };
51397
51477
  const dispatchGuard = this.deps.ledger.markDispatching(deviceId);
51398
51478
  try {
@@ -53310,7 +53390,7 @@ function buildDeviceSettingsSections(nodeOptions) {
53310
53390
  tab: "detection-pipeline",
53311
53391
  location: "top-tab",
53312
53392
  order: 4,
53313
- fields: [...RunnerCameraDeviceUIFields.filter((f) => f.key !== "detectionFps" && f.key !== "occupancyRecheckSec" && f.key !== "occupancyRecheckFrames"), {
53393
+ fields: [...RunnerCameraDeviceUIFields.filter((f) => f.key !== "detectionFps" && f.key !== "occupancyRecheckSec" && f.key !== "occupancyRecheckFrames" && f.key !== "preRollInferenceEnabled" && f.key !== "preRollInferenceFrames"), {
53314
53394
  key: "motionStreamProfile",
53315
53395
  type: "select",
53316
53396
  label: "Motion Stream (analyzer)",
@@ -53458,6 +53538,15 @@ function buildDeviceSettingsSections(nodeOptions) {
53458
53538
  description: "Periodic re-sampling to keep stationary objects / occupancy fresh while the camera is idle (watching).",
53459
53539
  fields: RunnerCameraDeviceUIFields.filter((f) => f.key === "occupancyRecheckSec" || f.key === "occupancyRecheckFrames")
53460
53540
  },
53541
+ {
53542
+ id: "pre-roll-detection",
53543
+ title: "Pre-roll detection",
53544
+ tab: "detection-pipeline",
53545
+ location: "top-tab",
53546
+ order: 8,
53547
+ description: "When motion opens a session the camera has already buffered a few seconds of footage. Detecting over it finds a subject at the moment it appeared instead of after the decoder has warmed up.",
53548
+ fields: RunnerCameraDeviceUIFields.filter((f) => f.key === "preRollInferenceEnabled" || f.key === "preRollInferenceFrames")
53549
+ },
53461
53550
  {
53462
53551
  id: "cluster-assignment",
53463
53552
  title: "Cluster Assignment",
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-CJt29L-j.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-5hw6B6LK.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.2.175",
3
+ "version": "1.2.177",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",