@camstack/addon-post-analysis 1.2.336 → 1.2.338

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 (15) hide show
  1. package/dist/{clip-model-registry-D7e1kEqc.mjs → clip-model-registry-BLUVLdlY.mjs} +492 -195
  2. package/dist/{clip-model-registry-BxUHFGUg.js → clip-model-registry-BcSLJ8aL.js} +502 -193
  3. package/dist/embedding-encoder/index.js +2 -2
  4. package/dist/embedding-encoder/index.mjs +2 -2
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-y9isEkU9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DDfv_NZB.mjs} +2 -2
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3jDbheU.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BRmdbHeK.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-DH7hZ_gJ.mjs → hostInit-BTA95n_5.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +149 -62
  11. package/dist/pipeline-analytics/index.mjs +149 -62
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +2 -2
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BZ-aada5.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DxUsRAkr.mjs +0 -26
@@ -5451,7 +5451,7 @@ var ZodIssueCode = {
5451
5451
  var ZodFirstPartyTypeKind;
5452
5452
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5453
5453
  //#endregion
5454
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5454
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5455
5455
  /**
5456
5456
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5457
5457
  * window to float samples (D455).
@@ -11529,89 +11529,51 @@ function resolveClipSearchMinScore(meta, request) {
11529
11529
  const factor = CLIP_STRICTNESS_FACTOR[request.strictness ?? "loose"];
11530
11530
  return Math.min(1, Math.round(meta.searchMinScore * factor * 1e3) / 1e3);
11531
11531
  }
11532
- /**
11533
- * The class names a per-class COUNT can ever be keyed on — the macro ids, and
11534
- * only those.
11535
- *
11536
- * `preserveOriginal: false` below is the whole reason this set exists: the
11537
- * executor maps each raw COCO label onto its macro and DROPS everything else,
11538
- * so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
11539
- * Any surface that indexes counts by class name — the ZoneAnalytics occupancy
11540
- * snapshot's `byClass`, and therefore every occupancy rule — can match nothing
11541
- * else. Derived from the catalog, never hand-listed, so a new macro joins it by
11542
- * being declared once.
11543
- *
11544
- * Cost of not having it, 2026-08-12: the notification rule editor offered the
11545
- * full taxonomy for an occupancy class (occupancy is the one condition that
11546
- * does not go through the engine's macro-expanding `expandClassSelector`), two
11547
- * live rules were authored on `car`, and both counters read 0 forever.
11548
- */
11549
- var DETECTION_MACRO_CLASSES = new Set([
11550
- {
11551
- id: "person",
11552
- name: "Person"
11553
- },
11554
- {
11555
- id: "vehicle",
11556
- name: "Vehicle"
11557
- },
11558
- {
11559
- id: "animal",
11560
- name: "Animal"
11561
- },
11562
- {
11563
- id: "package",
11564
- name: "Package"
11565
- }
11566
- ].map((l) => l.id));
11567
- /** True when `className` is a macro the detector can actually emit (and hence a
11568
- * class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
11569
- function isDetectionMacroClass(className) {
11570
- return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
11571
- }
11572
- var COCO_TO_MACRO = {
11573
- mapping: {
11574
- person: "person",
11575
- bicycle: "vehicle",
11576
- car: "vehicle",
11577
- motorcycle: "vehicle",
11578
- airplane: "vehicle",
11579
- bus: "vehicle",
11580
- train: "vehicle",
11581
- truck: "vehicle",
11582
- boat: "vehicle",
11583
- bird: "animal",
11584
- cat: "animal",
11585
- dog: "animal",
11586
- horse: "animal",
11587
- sheep: "animal",
11588
- cow: "animal",
11589
- elephant: "animal",
11590
- bear: "animal",
11591
- zebra: "animal",
11592
- giraffe: "animal",
11593
- suitcase: "package",
11594
- backpack: "package",
11595
- handbag: "package"
11596
- },
11597
- preserveOriginal: false
11598
- };
11599
- /** Steps a root detector may declare it fills. */
11600
- var FILLABLE_STEP_IDS = [
11532
+ /** Steps whose effect a root label can BE. */
11533
+ var LABEL_SUPPLY_STEP_IDS = [
11601
11534
  "animal-classifier",
11602
11535
  "vehicle-classifier",
11603
11536
  "package-detection"
11604
11537
  ];
11605
- /** Narrow a step id to a fillable one — type guard, not a cast. */
11606
- function isFillableStepId(value) {
11607
- return FILLABLE_STEP_IDS.some((id) => id === value);
11608
- }
11538
+ /** Steps whose box a root detection can BE. */
11539
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
11540
+ /** Every step a root model can supply. */
11541
+ var ROOT_SUPPLIABLE_STEP_IDS = [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
11542
+ /** Narrow a step id to a suppliable one — type guard, not a cast. */
11543
+ function isRootSuppliableStepId(value) {
11544
+ return ROOT_SUPPLIABLE_STEP_IDS.some((id) => id === value);
11545
+ }
11546
+ /** Narrow a step id to a label-kind one. */
11547
+ function isLabelSupplyStepId(value) {
11548
+ return LABEL_SUPPLY_STEP_IDS.some((id) => id === value);
11549
+ }
11550
+ var CROP_SUPPLY_SOURCES = {
11551
+ "plate-detection": {
11552
+ rootLabels: ["license_plate"],
11553
+ parentMacro: "vehicle",
11554
+ childClass: "plate",
11555
+ servedChildSteps: ["plate-ocr"],
11556
+ use: "as-output"
11557
+ },
11558
+ "face-detection": {
11559
+ rootLabels: ["face"],
11560
+ parentMacro: "person",
11561
+ childClass: "face",
11562
+ servedChildSteps: ["face-embedding"],
11563
+ use: "refine",
11564
+ minRootInputPx: 640
11565
+ }
11566
+ };
11609
11567
  /** The step a linked label stands in for, or `undefined` for any other attribution. */
11610
11568
  function linkedStepOf(attributionStepId) {
11611
11569
  if (attributionStepId === void 0) return void 0;
11612
11570
  if (!attributionStepId.startsWith("detector-link:")) return void 0;
11613
11571
  const stepId = attributionStepId.slice(14);
11614
- return isFillableStepId(stepId) ? stepId : void 0;
11572
+ return isLabelSupplyStepId(stepId) ? stepId : void 0;
11573
+ }
11574
+ /** The child steps of a crop-kind step that still run on the root's box. */
11575
+ function rootSupplyServes(stepId) {
11576
+ return CROP_SUPPLY_SOURCES[stepId].servedChildSteps;
11615
11577
  }
11616
11578
  var MODEL_FORMATS = [
11617
11579
  "onnx",
@@ -11745,12 +11707,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
11745
11707
  /** True when the weights or their data forbid commercial use. */
11746
11708
  nonCommercial: boolean().optional()
11747
11709
  }));
11748
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
11749
- var FillsClassifierEffectSchema = object({
11750
- stepId: _enum(FILLABLE_STEP_IDS),
11710
+ /**
11711
+ * One step a ROOT detector can supply from its own output (D730) — see
11712
+ * `ModelCatalogEntry.suppliesSteps`.
11713
+ *
11714
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
11715
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
11716
+ * the root cannot produce (shown as unavailable, never a blocker).
11717
+ * - `crop`: the root draws the box the step would have found (`license_plate`
11718
+ * for plate-detection, `face` for face-detection). The box becomes a detail
11719
+ * child of the `parentMacro` detection that contains it — never a track.
11720
+ */
11721
+ var RootStepSupplySchema = discriminatedUnion("kind", [object({
11722
+ kind: literal("label"),
11723
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
11751
11724
  labelToEffect: record(string(), string()),
11752
11725
  uncovered: array(string()).readonly()
11753
- });
11726
+ }), object({
11727
+ kind: literal("crop"),
11728
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
11729
+ rootLabels: array(string()).readonly(),
11730
+ parentMacro: _enum(["vehicle", "person"]),
11731
+ childClass: _enum(["plate", "face"]),
11732
+ /**
11733
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
11734
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
11735
+ * stored by an import.
11736
+ */
11737
+ rootInputPx: number().int().positive().optional()
11738
+ })]);
11754
11739
  var ModelCatalogEntrySchema = object({
11755
11740
  id: string(),
11756
11741
  name: string(),
@@ -11877,15 +11862,15 @@ var ModelCatalogEntrySchema = object({
11877
11862
  */
11878
11863
  classMap: DetectionCatalogClassMapSchema.optional(),
11879
11864
  /**
11880
- * The pipeline steps this ROOT detector already does the work of (D715):
11881
- * its labels name the effect the step exists to produce (`deer` for
11882
- * `animal-classifier`, `package` for `package-detection`). Derived from the
11883
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
11884
- * declares none. Whether a declaration is honoured is the step's own
11885
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
11886
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
11865
+ * The pipeline steps this ROOT detector can supply from its own output
11866
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
11867
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
11868
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
11869
+ * by hand and never assumed per family; a row without it is derived on read
11870
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
11871
+ * `useRootModel` flag (`resolveRootSupply`).
11887
11872
  */
11888
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
11873
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11889
11874
  /**
11890
11875
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11891
11876
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -19469,6 +19454,96 @@ var filesystemBrowseCapability = {
19469
19454
  })
19470
19455
  }
19471
19456
  };
19457
+ /** The central link domain the viewer app claims (Universal Links / App Links). */
19458
+ var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
19459
+ /** Where the hub serves the viewer SPA. */
19460
+ var HUB_VIEWER_MOUNT = "/viewer/camstack";
19461
+ /** True when `baseUrl` names the CamStack app link rather than a hub address. */
19462
+ function isAppLinkBase(baseUrl) {
19463
+ if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
19464
+ try {
19465
+ return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
19466
+ } catch {
19467
+ return false;
19468
+ }
19469
+ }
19470
+ /**
19471
+ * The base a viewer link is built on, from the flagged notification address:
19472
+ * the effective address is the explicit choice, else AUTO's `resolved`. The
19473
+ * one reading of that answer — the NC's tap and the Network page's preview
19474
+ * both go through it.
19475
+ */
19476
+ function viewerLinkBaseOf(endpoint) {
19477
+ const flagged = endpoint.baseUrl ?? endpoint.resolved;
19478
+ return isAppLinkBase(flagged) ? {
19479
+ form: "app",
19480
+ hubBaseUrl: endpoint.appLinkHub ?? null
19481
+ } : {
19482
+ form: "hub",
19483
+ hubBaseUrl: flagged
19484
+ };
19485
+ }
19486
+ /**
19487
+ * Reduce a base URL to the bare origin the central page accepts as `hub=`,
19488
+ * or `null` when it cannot be one: not http(s), carries credentials, or does
19489
+ * not parse. A path/query/fragment is dropped — the central page mounts the
19490
+ * viewer under the origin itself.
19491
+ */
19492
+ function toAppLinkHubOrigin(baseUrl) {
19493
+ let parsed;
19494
+ try {
19495
+ parsed = new URL(baseUrl);
19496
+ } catch {
19497
+ return null;
19498
+ }
19499
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
19500
+ if (parsed.username !== "" || parsed.password !== "") return null;
19501
+ if (parsed.hostname === "") return null;
19502
+ return parsed.origin;
19503
+ }
19504
+ /** The viewer route for a destination, or null when it names nothing. */
19505
+ function viewerRoute(destination) {
19506
+ switch (destination.kind) {
19507
+ case "camera": {
19508
+ if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
19509
+ const at = destination.atMs;
19510
+ return {
19511
+ path: `/camera/${String(destination.deviceId)}`,
19512
+ query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
19513
+ };
19514
+ }
19515
+ case "events": return {
19516
+ path: "/events",
19517
+ query: []
19518
+ };
19519
+ case "notifications": return {
19520
+ path: "/notifications",
19521
+ query: []
19522
+ };
19523
+ }
19524
+ }
19525
+ function encodeQuery(query) {
19526
+ if (query.length === 0) return "";
19527
+ return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
19528
+ }
19529
+ /**
19530
+ * The link for a viewer destination, or `null` when none can be minted: an
19531
+ * unknown destination, or the `hub` form with no reachable base (a dead link
19532
+ * is worse than none).
19533
+ */
19534
+ function buildViewerLink(input) {
19535
+ const route = viewerRoute(input.destination);
19536
+ if (route === null) return null;
19537
+ const raw = input.base.hubBaseUrl;
19538
+ const base = raw === null ? "" : raw.replace(/\/+$/, "");
19539
+ if (input.base.form === "app") {
19540
+ const origin = base === "" ? null : toAppLinkHubOrigin(base);
19541
+ const query = origin === null ? route.query : [...route.query, ["hub", origin]];
19542
+ return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
19543
+ }
19544
+ if (base === "" || isAppLinkBase(base)) return null;
19545
+ return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
19546
+ }
19472
19547
  /**
19473
19548
  * Transport bounds for AI capability methods.
19474
19549
  *
@@ -21529,6 +21604,73 @@ var notificationOutputCapability = {
21529
21604
  })
21530
21605
  }
21531
21606
  };
21607
+ /**
21608
+ * The class names a per-class COUNT can ever be keyed on — the macro ids, and
21609
+ * only those.
21610
+ *
21611
+ * `preserveOriginal: false` below is the whole reason this set exists: the
21612
+ * executor maps each raw COCO label onto its macro and DROPS everything else,
21613
+ * so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
21614
+ * Any surface that indexes counts by class name — the ZoneAnalytics occupancy
21615
+ * snapshot's `byClass`, and therefore every occupancy rule — can match nothing
21616
+ * else. Derived from the catalog, never hand-listed, so a new macro joins it by
21617
+ * being declared once.
21618
+ *
21619
+ * Cost of not having it, 2026-08-12: the notification rule editor offered the
21620
+ * full taxonomy for an occupancy class (occupancy is the one condition that
21621
+ * does not go through the engine's macro-expanding `expandClassSelector`), two
21622
+ * live rules were authored on `car`, and both counters read 0 forever.
21623
+ */
21624
+ var DETECTION_MACRO_CLASSES = new Set([
21625
+ {
21626
+ id: "person",
21627
+ name: "Person"
21628
+ },
21629
+ {
21630
+ id: "vehicle",
21631
+ name: "Vehicle"
21632
+ },
21633
+ {
21634
+ id: "animal",
21635
+ name: "Animal"
21636
+ },
21637
+ {
21638
+ id: "package",
21639
+ name: "Package"
21640
+ }
21641
+ ].map((l) => l.id));
21642
+ /** True when `className` is a macro the detector can actually emit (and hence a
21643
+ * class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
21644
+ function isDetectionMacroClass(className) {
21645
+ return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
21646
+ }
21647
+ var COCO_TO_MACRO = {
21648
+ mapping: {
21649
+ person: "person",
21650
+ bicycle: "vehicle",
21651
+ car: "vehicle",
21652
+ motorcycle: "vehicle",
21653
+ airplane: "vehicle",
21654
+ bus: "vehicle",
21655
+ train: "vehicle",
21656
+ truck: "vehicle",
21657
+ boat: "vehicle",
21658
+ bird: "animal",
21659
+ cat: "animal",
21660
+ dog: "animal",
21661
+ horse: "animal",
21662
+ sheep: "animal",
21663
+ cow: "animal",
21664
+ elephant: "animal",
21665
+ bear: "animal",
21666
+ zebra: "animal",
21667
+ giraffe: "animal",
21668
+ suitcase: "package",
21669
+ backpack: "package",
21670
+ handbag: "package"
21671
+ },
21672
+ preserveOriginal: false
21673
+ };
21532
21674
  var AUDIO_MACRO_LABELS = [
21533
21675
  {
21534
21676
  id: "speech",
@@ -24078,7 +24220,7 @@ var NC_CONDITION_CATALOG = [
24078
24220
  operator: "in",
24079
24221
  appliesTo: ["immediate", "track-end"],
24080
24222
  phase: "P1",
24081
- description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it (D692)."
24223
+ description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it."
24082
24224
  },
24083
24225
  {
24084
24226
  id: "plates",
@@ -28499,6 +28641,34 @@ var pipelineAnalyticsCapability = {
28499
28641
  }
28500
28642
  };
28501
28643
  /**
28644
+ * A root model's boxes standing in for one crop-kind step's own inference
28645
+ * (D730) — see `runPipeline.suppliedRoot`.
28646
+ */
28647
+ var SuppliedRootOutputSchema = object({
28648
+ stepId: string(),
28649
+ /** The root model that drew the boxes — stamped on the result. */
28650
+ modelId: string(),
28651
+ detections: array(object({
28652
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
28653
+ bbox: tuple([
28654
+ number(),
28655
+ number(),
28656
+ number(),
28657
+ number()
28658
+ ]),
28659
+ score: number(),
28660
+ /**
28661
+ * Five facial landmarks in the same pixels — a face the step's own
28662
+ * detector already re-found inside a root face box (D730), so its
28663
+ * embedder child aligns it exactly as it aligns any detected face.
28664
+ */
28665
+ landmarks: array(object({
28666
+ x: number(),
28667
+ y: number()
28668
+ })).optional()
28669
+ })).min(1)
28670
+ });
28671
+ /**
28502
28672
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
28503
28673
  * within the frame, so the executor can re-cut a leaf child ROI at native
28504
28674
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -28629,7 +28799,7 @@ var PipelineModelOptionSchema = object({
28629
28799
  legacy: boolean().optional(),
28630
28800
  provider: ModelProviderIdSchema.optional(),
28631
28801
  defaultConfidence: number().optional(),
28632
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
28802
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
28633
28803
  });
28634
28804
  var ConfigFieldBridge = custom();
28635
28805
  var PipelineAddonSchemaSchema = object({
@@ -29033,7 +29203,16 @@ var pipelineExecutorCapability = {
29033
29203
  * `device-not-servable`), and nothing reaches the camera's live
29034
29204
  * trace stream. Absent ⇒ unchanged behaviour.
29035
29205
  */
29036
- replay: literal(true).optional()
29206
+ replay: literal(true).optional(),
29207
+ /**
29208
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
29209
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
29210
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
29211
+ * NOT inferred, these boxes are its output, and its children (the plate
29212
+ * reader) run on them through their own crop policy. Boxes are in the
29213
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
29214
+ */
29215
+ suppliedRoot: SuppliedRootOutputSchema.optional()
29037
29216
  }), PipelineRunResultBridge, { kind: "mutation" }),
29038
29217
  /**
29039
29218
  * Batched run — N raw frames packed into one cap call. The provider
@@ -30346,7 +30525,22 @@ var pipelineRunnerCapability = {
30346
30525
  */
30347
30526
  cropJpeg: string().optional(),
30348
30527
  parent: DetailParentSchema,
30349
- steps: array(string()).optional()
30528
+ steps: array(string()).optional(),
30529
+ /**
30530
+ * The camera's root model already drew this step's boxes (D730): a
30531
+ * `license_plate` inside the parent vehicle. The named step is NOT
30532
+ * inferred — these FRAME-space boxes are its output — and its
30533
+ * requested children (the plate reader) run on them. Absent ⇒ every
30534
+ * requested step infers as before.
30535
+ */
30536
+ supplied: object({
30537
+ stepId: string(),
30538
+ modelId: string(),
30539
+ boxes: array(object({
30540
+ bbox: NativeCropBboxSchema,
30541
+ score: number()
30542
+ })).min(1)
30543
+ }).optional()
30350
30544
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
30351
30545
  /**
30352
30546
  * Run ONE enrichment step against caller-supplied pixels, with NO camera
@@ -34427,96 +34621,6 @@ var videoclipsCapability = {
34427
34621
  })
34428
34622
  }
34429
34623
  };
34430
- /** The central link domain the viewer app claims (Universal Links / App Links). */
34431
- var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
34432
- /** Where the hub serves the viewer SPA. */
34433
- var HUB_VIEWER_MOUNT = "/viewer/camstack";
34434
- /** True when `baseUrl` names the CamStack app link rather than a hub address. */
34435
- function isAppLinkBase(baseUrl) {
34436
- if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
34437
- try {
34438
- return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
34439
- } catch {
34440
- return false;
34441
- }
34442
- }
34443
- /**
34444
- * The base a viewer link is built on, from the flagged notification address:
34445
- * the effective address is the explicit choice, else AUTO's `resolved`. The
34446
- * one reading of that answer — the NC's tap and the Network page's preview
34447
- * both go through it.
34448
- */
34449
- function viewerLinkBaseOf(endpoint) {
34450
- const flagged = endpoint.baseUrl ?? endpoint.resolved;
34451
- return isAppLinkBase(flagged) ? {
34452
- form: "app",
34453
- hubBaseUrl: endpoint.appLinkHub ?? null
34454
- } : {
34455
- form: "hub",
34456
- hubBaseUrl: flagged
34457
- };
34458
- }
34459
- /**
34460
- * Reduce a base URL to the bare origin the central page accepts as `hub=`,
34461
- * or `null` when it cannot be one: not http(s), carries credentials, or does
34462
- * not parse. A path/query/fragment is dropped — the central page mounts the
34463
- * viewer under the origin itself.
34464
- */
34465
- function toAppLinkHubOrigin(baseUrl) {
34466
- let parsed;
34467
- try {
34468
- parsed = new URL(baseUrl);
34469
- } catch {
34470
- return null;
34471
- }
34472
- if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
34473
- if (parsed.username !== "" || parsed.password !== "") return null;
34474
- if (parsed.hostname === "") return null;
34475
- return parsed.origin;
34476
- }
34477
- /** The viewer route for a destination, or null when it names nothing. */
34478
- function viewerRoute(destination) {
34479
- switch (destination.kind) {
34480
- case "camera": {
34481
- if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
34482
- const at = destination.atMs;
34483
- return {
34484
- path: `/camera/${String(destination.deviceId)}`,
34485
- query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
34486
- };
34487
- }
34488
- case "events": return {
34489
- path: "/events",
34490
- query: []
34491
- };
34492
- case "notifications": return {
34493
- path: "/notifications",
34494
- query: []
34495
- };
34496
- }
34497
- }
34498
- function encodeQuery(query) {
34499
- if (query.length === 0) return "";
34500
- return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
34501
- }
34502
- /**
34503
- * The link for a viewer destination, or `null` when none can be minted: an
34504
- * unknown destination, or the `hub` form with no reachable base (a dead link
34505
- * is worse than none).
34506
- */
34507
- function buildViewerLink(input) {
34508
- const route = viewerRoute(input.destination);
34509
- if (route === null) return null;
34510
- const raw = input.base.hubBaseUrl;
34511
- const base = raw === null ? "" : raw.replace(/\/+$/, "");
34512
- if (input.base.form === "app") {
34513
- const origin = base === "" ? null : toAppLinkHubOrigin(base);
34514
- const query = origin === null ? route.query : [...route.query, ["hub", origin]];
34515
- return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
34516
- }
34517
- if (base === "" || isAppLinkBase(base)) return null;
34518
- return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
34519
- }
34520
34624
  /**
34521
34625
  * Optional client-side hints sent at session creation to help the provider
34522
34626
  * pick the best native source. All fields optional — a viewer that knows
@@ -34992,6 +35096,35 @@ var webrtcSessionCapability = {
34992
35096
  alive: boolean()
34993
35097
  })),
34994
35098
  /**
35099
+ * The viewer's downlink probe, for ONE live session (D733).
35100
+ *
35101
+ * The player measures `/adaptive-probe` after the session's first decoded
35102
+ * frame (D635). It used to act on the reading itself, by opening a SECOND
35103
+ * session with `hints.downlinkMbps` — every adaptive live open became two
35104
+ * sessions, two ICE + DTLS handshakes and two server pipelines. It now
35105
+ * hands the measurement to the session it already has; the provider picks
35106
+ * the rung exactly as it would from an offer's hints (same viewport
35107
+ * ceiling) and moves the session there — in place when the negotiated
35108
+ * codec carries the new rendition, by the existing re-offer
35109
+ * (`getSessionState.pendingRenegotiation`) when it cannot.
35110
+ *
35111
+ * A MEASUREMENT, never a tier: the client does not choose. A probe only
35112
+ * raises the rung; lowering it stays the ladder's call on delivery.
35113
+ * `held` answers why nothing moved (`not-adaptive`, `pinned`,
35114
+ * `already-there`, `recorded`, …) — a client that gets ANY answer must not
35115
+ * fall back to a reconnect; only a provider that does not know the method
35116
+ * (an older hub) leaves the client its legacy second session.
35117
+ */
35118
+ applyDownlinkProbe: method(object({
35119
+ deviceId: number().int().nonnegative(),
35120
+ sessionId: string(),
35121
+ downlinkMbps: number().nonnegative()
35122
+ }), object({
35123
+ outcome: _enum(["switching", "held"]),
35124
+ tier: CamProfileSchema.nullable(),
35125
+ reason: string()
35126
+ }), { kind: "mutation" }),
35127
+ /**
34995
35128
  * The SERVER's half of the stream-debug overlay, for one live session.
34996
35129
  *
34997
35130
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -39242,7 +39375,8 @@ var ConnectionEndpointSchema = object({
39242
39375
  "lan-ipv6",
39243
39376
  "public",
39244
39377
  "loopback",
39245
- "app-link"
39378
+ "app-link",
39379
+ "custom"
39246
39380
  ]),
39247
39381
  /**
39248
39382
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39344,6 +39478,76 @@ var ViewerEndpointsSchema = object({
39344
39478
  /** What the ranking currently resolves to (may be empty if nothing is up). */
39345
39479
  resolved: array(string()).readonly()
39346
39480
  });
39481
+ /**
39482
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
39483
+ * one release for addons built against it): `cluster` is the `agents` role,
39484
+ * `browser` the `signIn` role; `override` is the flagged address.
39485
+ */
39486
+ var HubAddressSnapshotSchema = object({
39487
+ override: string().nullable(),
39488
+ resolved: string().nullable(),
39489
+ source: _enum([
39490
+ "override",
39491
+ "auto",
39492
+ "none"
39493
+ ])
39494
+ });
39495
+ var HubAddressesSchema = object({
39496
+ cluster: HubAddressSnapshotSchema,
39497
+ browser: HubAddressSnapshotSchema
39498
+ });
39499
+ /**
39500
+ * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
39501
+ * `notifications`, `agents` and `signIn` are carried by at most one address.
39502
+ */
39503
+ var HubAddressRoleSchema = _enum([
39504
+ "viewer",
39505
+ "notifications",
39506
+ "agents",
39507
+ "signIn"
39508
+ ]);
39509
+ var RoleSourceSchema = _enum([
39510
+ "flagged",
39511
+ "auto",
39512
+ "none"
39513
+ ]);
39514
+ /** One single-valued role: the flagged address, the one in use, and why. */
39515
+ var HubAddressRoleResolutionSchema = object({
39516
+ /** The address carrying the flag, or null = automatic. */
39517
+ flagged: string().nullable(),
39518
+ /** The address in use, or null when nothing qualifies (never loopback). */
39519
+ resolved: string().nullable(),
39520
+ source: RoleSourceSchema
39521
+ });
39522
+ var HubViewerResolutionSchema = object({
39523
+ /** The addresses flagged `viewer`, or empty = automatic. */
39524
+ flagged: array(string()).readonly(),
39525
+ /** What the apps race right now. */
39526
+ resolved: array(string()).readonly(),
39527
+ source: RoleSourceSchema
39528
+ });
39529
+ var HubAddressBookSchema = object({
39530
+ rows: array(ConnectionEndpointSchema.extend({
39531
+ /** In the hub's detected palette right now. */
39532
+ detected: boolean(),
39533
+ /** Entered by the operator (removable). */
39534
+ custom: boolean(),
39535
+ /** The roles explicitly flagged on this address. */
39536
+ flags: array(HubAddressRoleSchema).readonly(),
39537
+ /** The roles this address serves right now — flagged or automatic. */
39538
+ inUse: array(HubAddressRoleSchema).readonly(),
39539
+ /** The roles this address may be flagged with. */
39540
+ eligible: array(HubAddressRoleSchema).readonly()
39541
+ })).readonly(),
39542
+ roles: object({
39543
+ viewer: HubViewerResolutionSchema,
39544
+ notifications: HubAddressRoleResolutionSchema,
39545
+ agents: HubAddressRoleResolutionSchema,
39546
+ signIn: HubAddressRoleResolutionSchema
39547
+ }),
39548
+ /** The `hub=` an app link carries (D709), or null. */
39549
+ appLinkHub: string().nullable()
39550
+ });
39347
39551
  var AllowedAddressesSchema = object({
39348
39552
  /**
39349
39553
  * Allowlist of interface addresses operators have explicitly opted
@@ -39456,26 +39660,78 @@ var localNetworkCapability = {
39456
39660
  */
39457
39661
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
39458
39662
  /**
39459
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
39460
- * AUTO. The value is stored verbatim (not an index into the candidate
39461
- * list): interfaces come and go, and an index would silently re-point at a
39462
- * different address after a reboot.
39663
+ * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
39664
+ * an older admin UI keeps working: it writes the same `notifications`
39665
+ * flag, with the same validation. `baseUrl: null` restores automatic; an
39666
+ * address that is not detected becomes a custom address.
39463
39667
  */
39464
39668
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39465
39669
  /**
39466
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
39467
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
39468
- * never mesh, never loopback. `resolved` is that set (or the operator's
39469
- * explicit subset) as it stands right now.
39670
+ * The `viewer` role as shipped apps read it: the flagged addresses
39671
+ * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
39672
+ * the public tunnel, never IPv6, mesh, loopback or a custom address.
39673
+ * `resolved` is the set as it stands right now; the custom ones in it are
39674
+ * also in `getConnectionEndpoints`, which the apps filter by it.
39470
39675
  */
39471
39676
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
39472
39677
  /**
39473
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
39474
- * verbatim (not indices) so a temporarily-down tunnel is not silently
39475
- * dropped from the operator's choice.
39678
+ * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
39679
+ * older admin UI keeps working: it replaces the same `viewer` flags.
39680
+ * Empty `baseUrls` restores automatic.
39476
39681
  */
39477
39682
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
39478
39683
  /**
39684
+ * The Network page's Addresses table and every role's answer — the ONE
39685
+ * reading of "which address is this hub reached at, for what": detected
39686
+ * endpoints and custom addresses with their role flags, and per role the
39687
+ * flagged address, the one in use and whether it is automatic. Agent
39688
+ * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
39689
+ * here; nothing ranks the palette itself. `scheme` is the one the caller
39690
+ * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
39691
+ * always resolved over the HTTPS palette.
39692
+ */
39693
+ getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
39694
+ /**
39695
+ * Add a custom address. Validated: an http(s) origin with a host, no
39696
+ * credentials, no path, never loopback — an invalid one is refused with
39697
+ * the reason and nothing is stored. Adding an address that already exists
39698
+ * only updates its label.
39699
+ */
39700
+ addCustomAddress: method(object({
39701
+ baseUrl: string(),
39702
+ label: string().max(80)
39703
+ }), HubAddressBookSchema, {
39704
+ kind: "mutation",
39705
+ auth: "admin"
39706
+ }),
39707
+ /** Remove a custom address. Its role flags go with it (those roles turn automatic). */
39708
+ removeCustomAddress: method(object({ baseUrl: string() }), HubAddressBookSchema, {
39709
+ kind: "mutation",
39710
+ auth: "admin"
39711
+ }),
39712
+ /**
39713
+ * Flag (`enabled: true`) or unflag an address for a role. For a
39714
+ * single-valued role, flagging moves the flag off every other address.
39715
+ * `baseUrl: null` returns the role to automatic. The address must be a row
39716
+ * of the table (detected, custom, or the app link for notifications);
39717
+ * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
39718
+ */
39719
+ setAddressRole: method(object({
39720
+ role: HubAddressRoleSchema,
39721
+ baseUrl: string().nullable(),
39722
+ enabled: boolean(),
39723
+ acceptInsecureHttp: boolean().optional()
39724
+ }), HubAddressBookSchema, {
39725
+ kind: "mutation",
39726
+ auth: "admin"
39727
+ }),
39728
+ /**
39729
+ * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
39730
+ * release so an addon built against the D729 amendment keeps resolving:
39731
+ * `cluster` = the `agents` role, `browser` = the `signIn` role.
39732
+ */
39733
+ getHubAddresses: method(_void(), HubAddressesSchema),
39734
+ /**
39479
39735
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
39480
39736
  * by the admin UI's address selector to seed its checkbox state.
39481
39737
  */
@@ -51488,12 +51744,24 @@ Object.freeze({
51488
51744
  addonId: null,
51489
51745
  access: "view"
51490
51746
  },
51747
+ "localNetwork.addCustomAddress": {
51748
+ capName: "local-network",
51749
+ capScope: "system",
51750
+ addonId: null,
51751
+ access: "create"
51752
+ },
51491
51753
  "localNetwork.downloadCa": {
51492
51754
  capName: "local-network",
51493
51755
  capScope: "system",
51494
51756
  addonId: null,
51495
51757
  access: "view"
51496
51758
  },
51759
+ "localNetwork.getAddresses": {
51760
+ capName: "local-network",
51761
+ capScope: "system",
51762
+ addonId: null,
51763
+ access: "view"
51764
+ },
51497
51765
  "localNetwork.getAllowedAddresses": {
51498
51766
  capName: "local-network",
51499
51767
  capScope: "system",
@@ -51506,6 +51774,12 @@ Object.freeze({
51506
51774
  addonId: null,
51507
51775
  access: "view"
51508
51776
  },
51777
+ "localNetwork.getHubAddresses": {
51778
+ capName: "local-network",
51779
+ capScope: "system",
51780
+ addonId: null,
51781
+ access: "view"
51782
+ },
51509
51783
  "localNetwork.getNotificationEndpoint": {
51510
51784
  capName: "local-network",
51511
51785
  capScope: "system",
@@ -51542,6 +51816,12 @@ Object.freeze({
51542
51816
  addonId: null,
51543
51817
  access: "create"
51544
51818
  },
51819
+ "localNetwork.removeCustomAddress": {
51820
+ capName: "local-network",
51821
+ capScope: "system",
51822
+ addonId: null,
51823
+ access: "delete"
51824
+ },
51545
51825
  "localNetwork.resetAllowlistToBestMatch": {
51546
51826
  capName: "local-network",
51547
51827
  capScope: "system",
@@ -51554,6 +51834,12 @@ Object.freeze({
51554
51834
  addonId: null,
51555
51835
  access: "create"
51556
51836
  },
51837
+ "localNetwork.setAddressRole": {
51838
+ capName: "local-network",
51839
+ capScope: "system",
51840
+ addonId: null,
51841
+ access: "create"
51842
+ },
51557
51843
  "localNetwork.setAllowedAddresses": {
51558
51844
  capName: "local-network",
51559
51845
  capScope: "system",
@@ -55808,6 +56094,12 @@ Object.freeze({
55808
56094
  addonId: null,
55809
56095
  access: "create"
55810
56096
  },
56097
+ "webrtcSession.applyDownlinkProbe": {
56098
+ capName: "webrtc-session",
56099
+ capScope: "device",
56100
+ addonId: null,
56101
+ access: "create"
56102
+ },
55811
56103
  "webrtcSession.closeSession": {
55812
56104
  capName: "webrtc-session",
55813
56105
  capScope: "device",
@@ -59906,6 +60198,11 @@ Object.freeze({
59906
60198
  form: "single",
59907
60199
  optional: false
59908
60200
  }],
60201
+ "webrtcSession.applyDownlinkProbe": [{
60202
+ name: "deviceId",
60203
+ form: "single",
60204
+ optional: false
60205
+ }],
59909
60206
  "webrtcSession.closeSession": [{
59910
60207
  name: "deviceId",
59911
60208
  form: "single",
@@ -61290,7 +61587,7 @@ var STATE_SUMMARY_VARS = [
61290
61587
  {
61291
61588
  name: "summarySection",
61292
61589
  label: "Summary: this section",
61293
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
61590
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
61294
61591
  example: "Batterie scariche",
61295
61592
  group: "system",
61296
61593
  families: ["rule"],
@@ -63812,4 +64109,4 @@ function buildClipModelRegistry(entries) {
63812
64109
  /** The built-in catalog's registry. */
63813
64110
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
63814
64111
  //#endregion
63815
- export { NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as $, encodeVectorBase64 as $n, systemEventFilterApplies as $r, RECORDING_SOURCE_CAMSTACK_ADDON as $t, EMBEDDING_MODEL_FAILED as A, number as Ai, applyModeDelaysEdits as An, readDeviceStateFrom as Ar, NcLegacyRuleActionSequenceSchema as At, LabelAttributionSchema as B, EventCategory as Bi, coreBlockIdFromAddonId as Bn, ruleBelongsToAlarm as Br, NcSnoozeInputSchema as Bt, CoverStateSchema as C, ZodObject as Ci, TrackSideSchema as Cn, mayWriteToLocation as Cr, NcAlarmConfigSchema as Ct, DETECTION_PIPELINE_CAP_NAME as D, discriminatedUnion as Di, alarmDeviceSecureOnArm as Dn, parseProcStatus as Dr, NcAlarmSettingsPatchSchema as Dt, DETECTION_MACRO_CLASSES as E, boolean as Ei, addonWidgetsSourceCapability as En, occupancyScope as Er, NcAlarmSensorsSchema as Et, EVENT_OWNER_TYPES as F, string as Fi, audioModeOf as Fn, resolveLocationMode as Fr, NcRuleSchema as Ft, MAX_BIRTH_DECISION_RECORDS as G, deriveRecordingMode as Gn, secureActuationFor as Gr, NcTaxonomySchema as Gt, ListTrackRelationsResultSchema as H, createAlarmProfile as Hn, ruleGroupingApplies as Hr, NcSnoozeSuppressedSchema as Ht, EXPORT_DENSE_MAX_RANGES as I, templateLiteral as Ii, buildEventKindDescriptor as In, resolveModeDelays as Ir, NcRuleTargetSchema as It, MAX_TRACK_RELATIONS as J, embeddingEncoderCapability as Jn, storageOccupancyCapability as Jr, NcTemplateVarDescriptorSchema as Jt, MAX_BIRTH_LATENCY_PROXY_MS as K, describeSystemEventDeliveryProblem as Kn, sensorRaisedOf as Kr, NcTemplatePreviewInputSchema as Kt, FIRST_LEVEL_MACRO_CLASSES as L, tuple as Li, buildViewerLink as Ln, resolveModeNotifyPolicy as Lr, NcRuleUpdateInputSchema as Lt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as M, partialRecord as Mi, applySecureOnArmEdit as Mn, readTimelapseGeneratedAt as Mr, NcRuleActionsSchema as Mt, EVENT_DENSITY_BATCH_MAX as N, record as Ni, assertTimelapseCadences as Nn, renameAlarmProfile as Nr, NcRuleInputSchema as Nt, DeclaredDevices as O, literal as Oi, alarmPanelCapability as On, pipelineAnalyticsCapability as Or, NcConditionDescriptorSchema as Ot, EVENT_KIND_BY_CAP as P, strictObject as Pi, audioMetricsCapability as Pn, resolveClipSearchMinScore as Pr, NcRulePatchSchema as Pt, NC_ALARM_DEFAULT_PROFILE_ID as Q, embeddingRequirementsUnavailableError as Qn, systemEventFamilyProblems as Qr, RECORDING_EXPORT_MAX_READ_BYTES as Qt, FULL_IMAGE_BBOX as R, union as Ri, cloneAlarmSettings as Rn, resolvePoolMemoryPolicy as Rr, NcScheduleSchema as Rt, ClearTrackRelationResultSchema as S, sleep as Si, TrackRelationSchema as Sn, linkedStepOf as Sr, NC_TEMPLATE_VARS as St, DEFAULT_TIMELAPSE_PREVIEW_TEXT as T, array as Ti, activateAlarmProfile as Tn, notificationRulesCapability as Tr, NcAlarmSensorsInputSchema as Tt, LockStateSchema as U, deleteAlarmProfile as Un, ruleKindOf as Ur, NcStateSummarySectionIdSchema as Ut, ListTrackRelationsInputSchema as V, cosineSimilarity as Vn, ruleDeviceCompatCapQueries as Vr, NcSnoozeSchema as Vt, MAX_ARCHIVED_DEBUG_NOTES as W, derivePostTriggeredAction as Wn, sceneMonitorCapability as Wr, NcSystemEventKindSchema as Wt, MediaFileKindEnum as X, embeddingRefusalOf as Xn, syncActiveAlarmProfileSettings as Xr, OpsLogEntrySchema as Xt, MOTION_CLOSE_AFTER_MS as Y, embeddingModelFailedError as Yn, subKindsOf as Yr, OPS_LOG_DEFAULT_LIMIT as Yt, MotionTriggeredBySchema as Z, embeddingRequirementsFailedError as Zn, systemEventDeliveryProblems as Zr, PoolMemoryWatchdog as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, defineCustomActions as _i, TimelapseRuleInputSchema as _n, isScheduleActive as _r, NC_SENSOR_TRANSITION_KINDS as _t, CLIP_EMBEDDING_STEP_ID as a, viewerLinkBaseOf as ai, SCENE_DEFAULT_CHECK_INTERVAL_SEC as an, gifDeriveSpeed as ar, NC_AUDIO_CONFIRM_HITS_DEFAULT as at, COCO_TO_MACRO as b, nodePin as bi, TrackPuritySchema as bn, isVectorIndexDimConflict as br, NC_TANK_SYSTEM_EVENT_KINDS as bt, resolveClusterModelPin as c, canonicalHash as ci, SCENE_DEFAULT_UNCOVERED_POLICY as cn, isAppLinkBase as cr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as ct, APPEARANCE_BLOCKS as d, DeviceType as di, SceneMonitorSchema as dn, isDetectionMacroClass as dr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as dt, systemEventSummaryScheduleOf as ei, RebuildObjectEmbeddingsRefusalSchema as en, ensureAlarmProfiles as er, NC_ALARM_DELAY_FIELDS as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, errMsg as fi, SetTrackPurityInputSchema as fn, isEventKindLabelKey as fr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ft, ArchivedDebugNoteSchema as g, customAction as gi, TRACK_RELATIONS_DEFAULT_LIMIT as gn, isRetiredClearKey as gr, NC_GROUPING_MIN_SEC as gt, AlarmArmModeSchema as h, createEvent as hi, TIMELAPSE_DENSE_FLOOR_SEC as hn, isMediaOwnerType as hr, NC_GROUPING_MAX_SEC as ht, CLIP_TEXT_MODELS as i, vectorDimFromBase64 as ii, SCENE_DEFAULT_ANCHOR_THRESHOLD as in, failureContributionCapability as ir, NC_ALARM_TRIGGERED_MAX_SEC as it, EMBEDDING_REQUIREMENTS_FAILED as j, object as ji, applyNonBlockingEdit as jn, readMotionTriggeredBy as jr, NcRuleActionSchema as jt, DetectionSourceSchema as k, looseObject as ki, applyBlockingEdit as kn, plateGalleryCapability as kr, NcConditionsSchema as kt, ALL_CAPABILITY_DEFINITIONS as l, evaluateSensorEdge as li, SCENE_DIVERGED as ln, isAudioClassName as lr, NC_CLIP_RETENTION_MAX_SEC as lt, AUDIO_MACRO_LABELS as m, CamProfileSchema as mi, SetTrackRelationInputSchema as mn, isKnownTemplateVar as mr, NC_GROUPING_DEFAULT_SEC as mt, DEFAULT_CLIP_MODEL as n, templateCarriesSummary as ni, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as nn, evictionPolicyOfLocation as nr, NC_ALARM_NOTIFY_FIELDS as nt, FACE_EMBEDDING_STEP_ID as o, zoneAnalyticsCapability as oi, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as on, gifFromMp4Args as or, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, BaseAddon as pi, SetTrackPurityResultSchema as pn, isEventOwnerType as pr, NC_DEFAULT_SNOOZE_MINUTES as pt, MAX_TRACK_PURITIES as q, describeSystemEventFamilyProblem as qn, servedTemplateVars as qr, NcTemplatePreviewSchema as qt, CLIP_IMAGE_MODELS as r, templateVarsFor as ri, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as rn, faceGalleryCapability as rr, NC_ALARM_SYSTEM_EVENT_KINDS as rt, readClusterModelPinStrict as s, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as si, SCENE_DEFAULT_QUIET_SECONDS as sn, isAlarmControllableCap as sr, NC_CLIP_POST_ROLL_DEFAULT_SEC as st, BUILTIN_CLIP_MODELS as t, systemEventSummarySplitOf as ti, RetrainStatusSchema as tn, eventKindLabel as tr, NC_ALARM_DELAY_MAX_SEC as tt, APPEARANCE_BIN_COUNT as u, isSourceCap as ui, SCENE_RESET_RECAPTURES as un, isDefaultAlarmProfileId as ur, NC_CONDITION_CATALOG as ut, BaseDevice as v, hydrateSchema as vi, TimelapseRulePatchSchema as vn, isSystemDelivery as vr, NC_SNOOZE_MAX_MINUTES as vt, DEFAULT_EVENT_COLOR as w, _enum as wi, TrackSourceSchema as wn, memoizePinnedFfmpeg as wr, NcAlarmPostTriggeredActionSchema as wt, ClearTrackRelationInputSchema as x, normalizeNodeId as xi, TrackRelationKindSchema as xn, kebabToCamel as xr, NC_TAXONOMY as xt, BirthDecisionRecordSchema as y, isDeviceScopedCap as yi, TimelapseRuleSchema as yn, isSystemEventSummaryRule as yr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as yt, FailureCounters as z, unknown as zi, consumableLowPercentOf as zn, ruleAutoTriggersAlarm as zr, NcSharedSequenceSchema as zt };
64112
+ export { NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as $, encodeVectorBase64 as $n, systemEventDeliveryProblems as $r, RECORDING_SOURCE_CAMSTACK_ADDON as $t, EMBEDDING_MODEL_FAILED as A, literal as Ai, applyModeDelaysEdits as An, plateGalleryCapability as Ar, NcLegacyRuleActionSequenceSchema as At, LabelAttributionSchema as B, union as Bi, coreBlockIdFromAddonId as Bn, rootSupplyServes as Br, NcSnoozeInputSchema as Bt, CoverStateSchema as C, normalizeNodeId as Ci, TrackSideSchema as Cn, linkedStepOf as Cr, NcAlarmConfigSchema as Ct, DETECTION_PIPELINE_CAP_NAME as D, array as Di, alarmDeviceSecureOnArm as Dn, occupancyScope as Dr, NcAlarmSettingsPatchSchema as Dt, DETECTION_MACRO_CLASSES as E, _enum as Ei, addonWidgetsSourceCapability as En, notificationRulesCapability as Er, NcAlarmSensorsSchema as Et, EVENT_OWNER_TYPES as F, record as Fi, audioModeOf as Fn, resolveClipSearchMinScore as Fr, NcRuleSchema as Ft, MAX_BIRTH_DECISION_RECORDS as G, deriveRecordingMode as Gn, ruleKindOf as Gr, NcTaxonomySchema as Gt, ListTrackRelationsResultSchema as H, EventCategory as Hi, createAlarmProfile as Hn, ruleBelongsToAlarm as Hr, NcSnoozeSuppressedSchema as Ht, EXPORT_DENSE_MAX_RANGES as I, strictObject as Ii, buildEventKindDescriptor as In, resolveLocationMode as Ir, NcRuleTargetSchema as It, MAX_TRACK_RELATIONS as J, embeddingEncoderCapability as Jn, sensorRaisedOf as Jr, NcTemplateVarDescriptorSchema as Jt, MAX_BIRTH_LATENCY_PROXY_MS as K, describeSystemEventDeliveryProblem as Kn, sceneMonitorCapability as Kr, NcTemplatePreviewInputSchema as Kt, FIRST_LEVEL_MACRO_CLASSES as L, string as Li, buildViewerLink as Ln, resolveModeDelays as Lr, NcRuleUpdateInputSchema as Lt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as M, number as Mi, applySecureOnArmEdit as Mn, readMotionTriggeredBy as Mr, NcRuleActionsSchema as Mt, EVENT_DENSITY_BATCH_MAX as N, object as Ni, assertTimelapseCadences as Nn, readTimelapseGeneratedAt as Nr, NcRuleInputSchema as Nt, DeclaredDevices as O, boolean as Oi, alarmPanelCapability as On, parseProcStatus as Or, NcConditionDescriptorSchema as Ot, EVENT_KIND_BY_CAP as P, partialRecord as Pi, audioMetricsCapability as Pn, renameAlarmProfile as Pr, NcRulePatchSchema as Pt, NC_ALARM_DEFAULT_PROFILE_ID as Q, embeddingRequirementsUnavailableError as Qn, syncActiveAlarmProfileSettings as Qr, RECORDING_EXPORT_MAX_READ_BYTES as Qt, FULL_IMAGE_BBOX as R, templateLiteral as Ri, cloneAlarmSettings as Rn, resolveModeNotifyPolicy as Rr, NcScheduleSchema as Rt, ClearTrackRelationResultSchema as S, nodePin as Si, TrackRelationSchema as Sn, kebabToCamel as Sr, NC_TEMPLATE_VARS as St, DEFAULT_TIMELAPSE_PREVIEW_TEXT as T, ZodObject as Ti, activateAlarmProfile as Tn, memoizePinnedFfmpeg as Tr, NcAlarmSensorsInputSchema as Tt, LockStateSchema as U, deleteAlarmProfile as Un, ruleDeviceCompatCapQueries as Ur, NcStateSummarySectionIdSchema as Ut, ListTrackRelationsInputSchema as V, unknown as Vi, cosineSimilarity as Vn, ruleAutoTriggersAlarm as Vr, NcSnoozeSchema as Vt, MAX_ARCHIVED_DEBUG_NOTES as W, derivePostTriggeredAction as Wn, ruleGroupingApplies as Wr, NcSystemEventKindSchema as Wt, MediaFileKindEnum as X, embeddingRefusalOf as Xn, storageOccupancyCapability as Xr, OpsLogEntrySchema as Xt, MOTION_CLOSE_AFTER_MS as Y, embeddingModelFailedError as Yn, servedTemplateVars as Yr, OPS_LOG_DEFAULT_LIMIT as Yt, MotionTriggeredBySchema as Z, embeddingRequirementsFailedError as Zn, subKindsOf as Zr, PoolMemoryWatchdog as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, createEvent as _i, TimelapseRuleInputSchema as _n, isRootSuppliableStepId as _r, NC_SENSOR_TRANSITION_KINDS as _t, CLIP_EMBEDDING_STEP_ID as a, templateVarsFor as ai, SCENE_DEFAULT_CHECK_INTERVAL_SEC as an, gifDeriveSpeed as ar, NC_AUDIO_CONFIRM_HITS_DEFAULT as at, COCO_TO_MACRO as b, hydrateSchema as bi, TrackPuritySchema as bn, isSystemEventSummaryRule as br, NC_TANK_SYSTEM_EVENT_KINDS as bt, resolveClusterModelPin as c, zoneAnalyticsCapability as ci, SCENE_DEFAULT_UNCOVERED_POLICY as cn, isAppLinkBase as cr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as ct, APPEARANCE_BLOCKS as d, evaluateSensorEdge as di, SceneMonitorSchema as dn, isDetectionMacroClass as dr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as dt, systemEventFamilyProblems as ei, RebuildObjectEmbeddingsRefusalSchema as en, ensureAlarmProfiles as er, NC_ALARM_DELAY_FIELDS as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, isSourceCap as fi, SetTrackPurityInputSchema as fn, isEventKindLabelKey as fr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ft, ArchivedDebugNoteSchema as g, CamProfileSchema as gi, TRACK_RELATIONS_DEFAULT_LIMIT as gn, isRetiredClearKey as gr, NC_GROUPING_MIN_SEC as gt, AlarmArmModeSchema as h, BaseAddon as hi, TIMELAPSE_DENSE_FLOOR_SEC as hn, isMediaOwnerType as hr, NC_GROUPING_MAX_SEC as ht, CLIP_TEXT_MODELS as i, templateCarriesSummary as ii, SCENE_DEFAULT_ANCHOR_THRESHOLD as in, failureContributionCapability as ir, NC_ALARM_TRIGGERED_MAX_SEC as it, EMBEDDING_REQUIREMENTS_FAILED as j, looseObject as ji, applyNonBlockingEdit as jn, readDeviceStateFrom as jr, NcRuleActionSchema as jt, DetectionSourceSchema as k, discriminatedUnion as ki, applyBlockingEdit as kn, pipelineAnalyticsCapability as kr, NcConditionsSchema as kt, ALL_CAPABILITY_DEFINITIONS as l, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as li, SCENE_DIVERGED as ln, isAudioClassName as lr, NC_CLIP_RETENTION_MAX_SEC as lt, AUDIO_MACRO_LABELS as m, errMsg as mi, SetTrackRelationInputSchema as mn, isKnownTemplateVar as mr, NC_GROUPING_DEFAULT_SEC as mt, DEFAULT_CLIP_MODEL as n, systemEventSummaryScheduleOf as ni, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as nn, evictionPolicyOfLocation as nr, NC_ALARM_NOTIFY_FIELDS as nt, FACE_EMBEDDING_STEP_ID as o, vectorDimFromBase64 as oi, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as on, gifFromMp4Args as or, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, DeviceType as pi, SetTrackPurityResultSchema as pn, isEventOwnerType as pr, NC_DEFAULT_SNOOZE_MINUTES as pt, MAX_TRACK_PURITIES as q, describeSystemEventFamilyProblem as qn, secureActuationFor as qr, NcTemplatePreviewSchema as qt, CLIP_IMAGE_MODELS as r, systemEventSummarySplitOf as ri, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as rn, faceGalleryCapability as rr, NC_ALARM_SYSTEM_EVENT_KINDS as rt, readClusterModelPinStrict as s, viewerLinkBaseOf as si, SCENE_DEFAULT_QUIET_SECONDS as sn, isAlarmControllableCap as sr, NC_CLIP_POST_ROLL_DEFAULT_SEC as st, BUILTIN_CLIP_MODELS as t, systemEventFilterApplies as ti, RetrainStatusSchema as tn, eventKindLabel as tr, NC_ALARM_DELAY_MAX_SEC as tt, APPEARANCE_BIN_COUNT as u, canonicalHash as ui, SCENE_RESET_RECAPTURES as un, isDefaultAlarmProfileId as ur, NC_CONDITION_CATALOG as ut, BaseDevice as v, customAction as vi, TimelapseRulePatchSchema as vn, isScheduleActive as vr, NC_SNOOZE_MAX_MINUTES as vt, DEFAULT_EVENT_COLOR as w, sleep as wi, TrackSourceSchema as wn, mayWriteToLocation as wr, NcAlarmPostTriggeredActionSchema as wt, ClearTrackRelationInputSchema as x, isDeviceScopedCap as xi, TrackRelationKindSchema as xn, isVectorIndexDimConflict as xr, NC_TAXONOMY as xt, BirthDecisionRecordSchema as y, defineCustomActions as yi, TimelapseRuleSchema as yn, isSystemDelivery as yr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as yt, FailureCounters as z, tuple as zi, consumableLowPercentOf as zn, resolvePoolMemoryPolicy as zr, NcSharedSequenceSchema as zt };