@camstack/addon-pipeline 1.2.256 → 1.2.258

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 (34) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-A5DRjEr3.mjs → default-detection-model-BZ54sUY2.mjs} +1 -1
  4. package/dist/{default-detection-model-Bbw4nC11.js → default-detection-model-vVWcdv0g.js} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-lqqUXDfs.js → dist-CsJJPDQW.js} +180 -6
  8. package/dist/{dist-MJ4ji7um.mjs → dist-D3w2fwD4.mjs} +180 -6
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-80-uOMr8.js → node-1vbEWzPZ.js} +1 -1
  12. package/dist/{node-DdXmHLK4.mjs → node-IHGNrWH9.mjs} +1 -1
  13. package/dist/pipeline-runner/index.js +4 -4
  14. package/dist/pipeline-runner/index.mjs +4 -4
  15. package/dist/{process-memory-Dac9TXlX.js → process-memory-DynU4177.js} +1 -1
  16. package/dist/{process-memory-Cl3ubMxY.mjs → process-memory-jhOBJEil.mjs} +1 -1
  17. package/dist/recorder/index.js +1069 -1015
  18. package/dist/recorder/index.mjs +1069 -1015
  19. package/dist/{restream-intent-VVJiUAkh.js → restream-intent-B0GOuR-F.js} +90 -0
  20. package/dist/{restream-intent-D2VT97-U.mjs → restream-intent-CgyZI565.mjs} +85 -1
  21. package/dist/{segment-demux-js-gIj82O9k.mjs → segment-demux-js-BZAiu_2h.mjs} +1 -1
  22. package/dist/{segment-demux-js-CWwlKQ3M.js → segment-demux-js-OQT6wqXH.js} +1 -1
  23. package/dist/stream-broker/_stub.js +2 -2
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-pOLAb3B1.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CFcO9OoY.mjs} +3 -3
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CTHexfai.mjs +26 -0
  26. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BXK7jbJm.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BbnIk-9T.mjs} +1 -1
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-BRnsXyTM.mjs → hostInit-rU23F6nl.mjs} +3 -3
  30. package/dist/stream-broker/index.js +46 -7
  31. package/dist/stream-broker/index.mjs +46 -7
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CPFjd94C.mjs +0 -26
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-lqqUXDfs.js");
7
- const require_process_memory = require("../process-memory-Dac9TXlX.js");
6
+ const require_dist = require("../dist-CsJJPDQW.js");
7
+ const require_process_memory = require("../process-memory-DynU4177.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, Jt as audioChunkBytesPerSample, Lt as errMsg, N as audioAnalysisCapability, Ot as resolvePoolMemoryPolicy, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Wt as BaseAddon, bn as EventCategory, n as AUDIO_BACKEND_CHOICES, ot as mapAudioLabelToMacro, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL } from "../dist-MJ4ji7um.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Cl3ubMxY.mjs";
2
+ import { $t as hydrateSchema, Jt as audioChunkBytesPerSample, Lt as errMsg, N as audioAnalysisCapability, Ot as resolvePoolMemoryPolicy, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Wt as BaseAddon, bn as EventCategory, n as AUDIO_BACKEND_CHOICES, ot as mapAudioLabelToMacro, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL } from "../dist-D3w2fwD4.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-jhOBJEil.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, tt as hfModelUrl } from "./dist-MJ4ji7um.mjs";
1
+ import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, tt as hfModelUrl } from "./dist-D3w2fwD4.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-lqqUXDfs.js");
1
+ const require_dist = require("./dist-CsJJPDQW.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-lqqUXDfs.js");
7
- const require_node = require("../node-80-uOMr8.js");
8
- const require_default_detection_model = require("../default-detection-model-Bbw4nC11.js");
6
+ const require_dist = require("../dist-CsJJPDQW.js");
7
+ const require_node = require("../node-1vbEWzPZ.js");
8
+ const require_default_detection_model = require("../default-detection-model-vVWcdv0g.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-Dac9TXlX.js");
10
+ const require_process_memory = require("../process-memory-DynU4177.js");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_chunk.__toESM(node_os);
13
13
  let node_fs = require("node:fs");
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, At as runtimeDevices$1, Ft as supportedRuntimes$1, G as detectionPipelineCapability, J as enumerateInferenceDevices, Lt as errMsg, Ot as resolvePoolMemoryPolicy, Tt as resolveClusterStepModelId, V as defaultDeviceFor$1, Wt as BaseAddon, X as evaluateZoneRules, Yt as createEvent, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, gt as pickClusterStepSettings, hn as object, ht as pickClusterStepModels, in as parseJsonUnknown, it as loadContributionCapability, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, nt as inferModelProvider, pt as overlayClusterStepSettings, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, w as PoolMemoryWatchdog, yn as union, yt as pipelineExecutorCapability } from "../dist-MJ4ji7um.mjs";
3
- import { o as readProcessCost } from "../node-DdXmHLK4.mjs";
4
- import { a as localFrameRegistry, c as ALL_STEPS, d as getStepDefinition, f as resolveModelForFormat, l as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as landmarkPrecisionVerdict, r as macroGateVerdict, s as ALL_PIPELINE_STEPS, u as getStep } from "../default-detection-model-A5DRjEr3.mjs";
2
+ import { $t as hydrateSchema, At as runtimeDevices$1, Ft as supportedRuntimes$1, G as detectionPipelineCapability, J as enumerateInferenceDevices, Lt as errMsg, Ot as resolvePoolMemoryPolicy, Tt as resolveClusterStepModelId, V as defaultDeviceFor$1, Wt as BaseAddon, X as evaluateZoneRules, Yt as createEvent, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, gt as pickClusterStepSettings, hn as object, ht as pickClusterStepModels, in as parseJsonUnknown, it as loadContributionCapability, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, nt as inferModelProvider, pt as overlayClusterStepSettings, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, w as PoolMemoryWatchdog, yn as union, yt as pipelineExecutorCapability } from "../dist-D3w2fwD4.mjs";
3
+ import { o as readProcessCost } from "../node-IHGNrWH9.mjs";
4
+ import { a as localFrameRegistry, c as ALL_STEPS, d as getStepDefinition, f as resolveModelForFormat, l as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as landmarkPrecisionVerdict, r as macroGateVerdict, s as ALL_PIPELINE_STEPS, u as getStep } from "../default-detection-model-BZ54sUY2.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Cl3ubMxY.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-jhOBJEil.mjs";
7
7
  import * as os from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-vl6nBE8d.mjs
5363
+ //#region ../types/dist/sleep-Bs3xPtSh.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -13776,6 +13776,24 @@ var GetStreamWithCodecInputSchema = object({
13776
13776
  });
13777
13777
  var RtpSourceSchema = object({
13778
13778
  url: string(),
13779
+ /**
13780
+ * The SENTRY counterpart of {@link url} — the dial that asks for the stream
13781
+ * WITHOUT asking for the camera — or `null` when this camera offers none.
13782
+ *
13783
+ * The broker answers it because the broker is the only thing that can:
13784
+ * eligibility is `sentryEligible` (a BATTERY camera that DECLARES the signals
13785
+ * cap), asked of facts only the broker holds. A consumer re-deriving it from
13786
+ * cap bindings would be a second authority, and two authorities on the same
13787
+ * question is how a composite camera ends up dialling a sleeping camera
13788
+ * because its own copy of the rule was a release behind.
13789
+ *
13790
+ * `null` is a real answer and is never a live url in disguise: a consumer
13791
+ * that silently fell back to {@link url} would perform exactly the wake this
13792
+ * field exists to prevent. Only a PASSTHROUGH acquisition can offer one — a
13793
+ * transcode hands back an egress the broker is feeding itself, which has no
13794
+ * sentry counterpart.
13795
+ */
13796
+ sentryUrl: string().nullable().optional(),
13779
13797
  videoCodec: _enum(["H264", "H265"]),
13780
13798
  audioCodec: string(),
13781
13799
  resolution: object({
@@ -30490,6 +30508,114 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
30490
30508
  lastChangedAt: number()
30491
30509
  });
30492
30510
  /**
30511
+ * camera-grid-layout — the geometry of a COMPOSITE camera, on the camera's own
30512
+ * page.
30513
+ *
30514
+ * ## Why this is a capability and not an addon settings schema
30515
+ *
30516
+ * It was one, and it did not render. The addon declared the editor as a
30517
+ * `type: 'widget'` field inside its own `deviceSettingsSchema()`; the hub
30518
+ * returned that section correctly and `ConfigFormField` renders `type:'widget'`
30519
+ * perfectly well — and nothing ever asked camera-grid for it. The Cluster →
30520
+ * Pipeline → Device Overrides page interrogates a HAND-WRITTEN list of four
30521
+ * addons (`PIPELINE_CLUSTER_DEVICE_ADDONS`), whose own comment says an addon
30522
+ * not on it "falls off silently".
30523
+ *
30524
+ * Adding a fifth name to that list would have been the wrong fix twice over:
30525
+ * that page is per-camera DETECTION tuning, and a grid's geometry belongs
30526
+ * beside PTZ and motion zones on the camera itself — which is exactly where the
30527
+ * framework already puts a widget, when the widget is declared on a CAPABILITY.
30528
+ * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
30529
+ * all use it): the framework emits the structural section and the widget
30530
+ * self-persists through the cap's own mutations.
30531
+ *
30532
+ * ## Why one addon may implement it
30533
+ *
30534
+ * It is a device-scoped NATIVE cap, registered by the grid camera device
30535
+ * itself. Nothing else declares a composite camera, so nothing else has a
30536
+ * layout — and the device-scoped route means the widget asks THE camera, not
30537
+ * "the camera-grid addon", which is what let the old custom-action pair be
30538
+ * reached only by a caller that already knew the addon id.
30539
+ *
30540
+ * ## The tab
30541
+ *
30542
+ * `streaming`, not a top-tab of its own. A grid's geometry IS what its stream
30543
+ * is, so the Streaming tab is where it belongs; a `grid` top-tab would need an
30544
+ * entry in `WELL_KNOWN_TAB_MAP` or the device page renders the raw id as the
30545
+ * label (measured on the robot camera, 2026-09-06 — a tab called "navigation"
30546
+ * next to "PTZ").
30547
+ */
30548
+ /** A rectangle in normalized [0,1] coordinates of whatever contains it. */
30549
+ var GridNormalizedRectSchema = object({
30550
+ x: number().min(0).max(1),
30551
+ y: number().min(0).max(1),
30552
+ width: number().gt(0).max(1),
30553
+ height: number().gt(0).max(1)
30554
+ });
30555
+ /**
30556
+ * One source camera, the part of its picture taken, and where that part lands.
30557
+ *
30558
+ * Both rectangles are NORMALIZED (D519): a source camera can change resolution
30559
+ * — a profile switch, a firmware update, a substream that comes back different
30560
+ * — and a stored PIXEL rectangle would quietly start cutting the wrong region,
30561
+ * which is the class of bug nobody files.
30562
+ */
30563
+ var GridLayoutCellSchema = object({
30564
+ deviceId: number().int().positive(),
30565
+ /** The part of the SOURCE taken, normalized against the source. */
30566
+ source: GridNormalizedRectSchema,
30567
+ /** Where it lands, normalized against the CANVAS. */
30568
+ cell: GridNormalizedRectSchema
30569
+ });
30570
+ /**
30571
+ * Which profiles this grid can actually compose, and why not.
30572
+ *
30573
+ * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
30574
+ * profile is on offer only when EVERY source can serve it. The refusal NAMES
30575
+ * the sources, because "this grid has no low" is not a finding — "615 has no
30576
+ * low" is, and it is the one an operator can act on.
30577
+ */
30578
+ var GridProfileOfferSchema = object({
30579
+ profile: _enum([
30580
+ "high",
30581
+ "mid",
30582
+ "low"
30583
+ ]),
30584
+ offered: boolean(),
30585
+ /** Sources that cannot serve it. Empty when it is offered, or when there are no cells. */
30586
+ missingSources: array(number().int().positive())
30587
+ });
30588
+ var GridLayoutViewSchema = object({
30589
+ /** The persisted grid row this camera was declared from. */
30590
+ instanceId: string(),
30591
+ deviceId: number().int().nonnegative(),
30592
+ name: string(),
30593
+ /** The canvas the operator laid out — this grid's `high`. mid/low are scaled from it. */
30594
+ width: number().int(),
30595
+ height: number().int(),
30596
+ fps: number().int(),
30597
+ cells: array(GridLayoutCellSchema),
30598
+ /** What the catalog will publish, and what it refuses to. Read-only. */
30599
+ profiles: array(GridProfileOfferSchema)
30600
+ });
30601
+ var GridLayoutPatchSchema = object({
30602
+ deviceId: number().int().nonnegative(),
30603
+ name: string().min(1).max(160).optional(),
30604
+ width: number().int().min(160).max(7680).optional(),
30605
+ height: number().int().min(120).max(4320).optional(),
30606
+ fps: number().int().min(1).max(60).optional(),
30607
+ /**
30608
+ * The whole cell list at once. A per-cell patch would need an ordering the
30609
+ * editor does not have, and a half-applied layout is a picture nobody asked
30610
+ * for.
30611
+ */
30612
+ cells: array(GridLayoutCellSchema).max(16)
30613
+ });
30614
+ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), GridLayoutViewSchema.nullable(), { auth: "admin" }), method(GridLayoutPatchSchema, GridLayoutViewSchema, {
30615
+ kind: "mutation",
30616
+ auth: "admin"
30617
+ });
30618
+ /**
30493
30619
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
30494
30620
  * on-camera motion-detection mask is a single `grid` region (a row-major
30495
30621
  * boolean cell lattice the camera's onboard VMD evaluates). Composing it as
@@ -32189,6 +32315,26 @@ var PtzHomePresetSchema = object({
32189
32315
  "none"
32190
32316
  ])
32191
32317
  });
32318
+ /**
32319
+ * The camera's own idle-return behaviour: whether it goes home by itself, and
32320
+ * after how long.
32321
+ *
32322
+ * ONE shape, not two scalars, because on the camera they are ONE fact —
32323
+ * Reolink's guard point carries `benable` and `timeout` in the same element,
32324
+ * written by the same command. Reading them apart means two round-trips that
32325
+ * can disagree.
32326
+ *
32327
+ * `enabled` and `seconds` are INDEPENDENT: a camera can hold a 68 s delay with
32328
+ * the behaviour switched off, which is exactly what the vendor app leaves when
32329
+ * you turn the guard point off without clearing it. The first version of this
32330
+ * cap reported only the delay, so that state was invisible — a camera could be
32331
+ * configured to return after 68 seconds with no way to say whether it should
32332
+ * return at all.
32333
+ */
32334
+ var PtzHomeReturnSchema = object({
32335
+ enabled: boolean(),
32336
+ seconds: number().int()
32337
+ });
32192
32338
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
32193
32339
  deviceId: number(),
32194
32340
  presetId: string()
@@ -32214,8 +32360,9 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
32214
32360
  }), method(object({ deviceId: number() }), _void(), {
32215
32361
  kind: "mutation",
32216
32362
  auth: "admin"
32217
- }), method(object({ deviceId: number() }), number().int().nullable()), method(object({
32363
+ }), method(object({ deviceId: number() }), PtzHomeReturnSchema.nullable()), method(object({
32218
32364
  deviceId: number(),
32365
+ enabled: boolean(),
32219
32366
  seconds: number().int().min(0).max(3600)
32220
32367
  }), _void(), {
32221
32368
  kind: "mutation",
@@ -35911,6 +36058,18 @@ Object.freeze({
35911
36058
  addonId: null,
35912
36059
  access: "view"
35913
36060
  },
36061
+ "cameraGridLayout.getLayout": {
36062
+ capName: "camera-grid-layout",
36063
+ capScope: "device",
36064
+ addonId: null,
36065
+ access: "view"
36066
+ },
36067
+ "cameraGridLayout.saveLayout": {
36068
+ capName: "camera-grid-layout",
36069
+ capScope: "device",
36070
+ addonId: null,
36071
+ access: "create"
36072
+ },
35914
36073
  "cameraStreams.getBrokerStreams": {
35915
36074
  capName: "camera-streams",
35916
36075
  capScope: "device",
@@ -39661,7 +39820,7 @@ Object.freeze({
39661
39820
  addonId: null,
39662
39821
  access: "view"
39663
39822
  },
39664
- "ptz.getHomeReturnSeconds": {
39823
+ "ptz.getHomeReturn": {
39665
39824
  capName: "ptz",
39666
39825
  capScope: "device",
39667
39826
  addonId: null,
@@ -39721,7 +39880,7 @@ Object.freeze({
39721
39880
  addonId: null,
39722
39881
  access: "create"
39723
39882
  },
39724
- "ptz.setHomeReturnSeconds": {
39883
+ "ptz.setHomeReturn": {
39725
39884
  capName: "ptz",
39726
39885
  capScope: "device",
39727
39886
  addonId: null,
@@ -41610,6 +41769,21 @@ Object.freeze({
41610
41769
  form: "single",
41611
41770
  optional: false
41612
41771
  }],
41772
+ "cameraGridLayout.getLayout": [{
41773
+ name: "deviceId",
41774
+ form: "single",
41775
+ optional: false
41776
+ }],
41777
+ "cameraGridLayout.saveLayout": [{
41778
+ name: "cells",
41779
+ form: "object-array",
41780
+ optional: false,
41781
+ itemField: "deviceId"
41782
+ }, {
41783
+ name: "deviceId",
41784
+ form: "single",
41785
+ optional: false
41786
+ }],
41613
41787
  "cameraStreams.getBrokerStreams": [{
41614
41788
  name: "deviceId",
41615
41789
  form: "single",
@@ -42910,7 +43084,7 @@ Object.freeze({
42910
43084
  form: "single",
42911
43085
  optional: false
42912
43086
  }],
42913
- "ptz.getHomeReturnSeconds": [{
43087
+ "ptz.getHomeReturn": [{
42914
43088
  name: "deviceId",
42915
43089
  form: "single",
42916
43090
  optional: false
@@ -42960,7 +43134,7 @@ Object.freeze({
42960
43134
  form: "single",
42961
43135
  optional: false
42962
43136
  }],
42963
- "ptz.setHomeReturnSeconds": [{
43137
+ "ptz.setHomeReturn": [{
42964
43138
  name: "deviceId",
42965
43139
  form: "single",
42966
43140
  optional: false
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-vl6nBE8d.mjs
5363
+ //#region ../types/dist/sleep-Bs3xPtSh.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -13776,6 +13776,24 @@ var GetStreamWithCodecInputSchema = object({
13776
13776
  });
13777
13777
  var RtpSourceSchema = object({
13778
13778
  url: string(),
13779
+ /**
13780
+ * The SENTRY counterpart of {@link url} — the dial that asks for the stream
13781
+ * WITHOUT asking for the camera — or `null` when this camera offers none.
13782
+ *
13783
+ * The broker answers it because the broker is the only thing that can:
13784
+ * eligibility is `sentryEligible` (a BATTERY camera that DECLARES the signals
13785
+ * cap), asked of facts only the broker holds. A consumer re-deriving it from
13786
+ * cap bindings would be a second authority, and two authorities on the same
13787
+ * question is how a composite camera ends up dialling a sleeping camera
13788
+ * because its own copy of the rule was a release behind.
13789
+ *
13790
+ * `null` is a real answer and is never a live url in disguise: a consumer
13791
+ * that silently fell back to {@link url} would perform exactly the wake this
13792
+ * field exists to prevent. Only a PASSTHROUGH acquisition can offer one — a
13793
+ * transcode hands back an egress the broker is feeding itself, which has no
13794
+ * sentry counterpart.
13795
+ */
13796
+ sentryUrl: string().nullable().optional(),
13779
13797
  videoCodec: _enum(["H264", "H265"]),
13780
13798
  audioCodec: string(),
13781
13799
  resolution: object({
@@ -30490,6 +30508,114 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
30490
30508
  lastChangedAt: number()
30491
30509
  });
30492
30510
  /**
30511
+ * camera-grid-layout — the geometry of a COMPOSITE camera, on the camera's own
30512
+ * page.
30513
+ *
30514
+ * ## Why this is a capability and not an addon settings schema
30515
+ *
30516
+ * It was one, and it did not render. The addon declared the editor as a
30517
+ * `type: 'widget'` field inside its own `deviceSettingsSchema()`; the hub
30518
+ * returned that section correctly and `ConfigFormField` renders `type:'widget'`
30519
+ * perfectly well — and nothing ever asked camera-grid for it. The Cluster →
30520
+ * Pipeline → Device Overrides page interrogates a HAND-WRITTEN list of four
30521
+ * addons (`PIPELINE_CLUSTER_DEVICE_ADDONS`), whose own comment says an addon
30522
+ * not on it "falls off silently".
30523
+ *
30524
+ * Adding a fifth name to that list would have been the wrong fix twice over:
30525
+ * that page is per-camera DETECTION tuning, and a grid's geometry belongs
30526
+ * beside PTZ and motion zones on the camera itself — which is exactly where the
30527
+ * framework already puts a widget, when the widget is declared on a CAPABILITY.
30528
+ * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
30529
+ * all use it): the framework emits the structural section and the widget
30530
+ * self-persists through the cap's own mutations.
30531
+ *
30532
+ * ## Why one addon may implement it
30533
+ *
30534
+ * It is a device-scoped NATIVE cap, registered by the grid camera device
30535
+ * itself. Nothing else declares a composite camera, so nothing else has a
30536
+ * layout — and the device-scoped route means the widget asks THE camera, not
30537
+ * "the camera-grid addon", which is what let the old custom-action pair be
30538
+ * reached only by a caller that already knew the addon id.
30539
+ *
30540
+ * ## The tab
30541
+ *
30542
+ * `streaming`, not a top-tab of its own. A grid's geometry IS what its stream
30543
+ * is, so the Streaming tab is where it belongs; a `grid` top-tab would need an
30544
+ * entry in `WELL_KNOWN_TAB_MAP` or the device page renders the raw id as the
30545
+ * label (measured on the robot camera, 2026-09-06 — a tab called "navigation"
30546
+ * next to "PTZ").
30547
+ */
30548
+ /** A rectangle in normalized [0,1] coordinates of whatever contains it. */
30549
+ var GridNormalizedRectSchema = object({
30550
+ x: number().min(0).max(1),
30551
+ y: number().min(0).max(1),
30552
+ width: number().gt(0).max(1),
30553
+ height: number().gt(0).max(1)
30554
+ });
30555
+ /**
30556
+ * One source camera, the part of its picture taken, and where that part lands.
30557
+ *
30558
+ * Both rectangles are NORMALIZED (D519): a source camera can change resolution
30559
+ * — a profile switch, a firmware update, a substream that comes back different
30560
+ * — and a stored PIXEL rectangle would quietly start cutting the wrong region,
30561
+ * which is the class of bug nobody files.
30562
+ */
30563
+ var GridLayoutCellSchema = object({
30564
+ deviceId: number().int().positive(),
30565
+ /** The part of the SOURCE taken, normalized against the source. */
30566
+ source: GridNormalizedRectSchema,
30567
+ /** Where it lands, normalized against the CANVAS. */
30568
+ cell: GridNormalizedRectSchema
30569
+ });
30570
+ /**
30571
+ * Which profiles this grid can actually compose, and why not.
30572
+ *
30573
+ * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
30574
+ * profile is on offer only when EVERY source can serve it. The refusal NAMES
30575
+ * the sources, because "this grid has no low" is not a finding — "615 has no
30576
+ * low" is, and it is the one an operator can act on.
30577
+ */
30578
+ var GridProfileOfferSchema = object({
30579
+ profile: _enum([
30580
+ "high",
30581
+ "mid",
30582
+ "low"
30583
+ ]),
30584
+ offered: boolean(),
30585
+ /** Sources that cannot serve it. Empty when it is offered, or when there are no cells. */
30586
+ missingSources: array(number().int().positive())
30587
+ });
30588
+ var GridLayoutViewSchema = object({
30589
+ /** The persisted grid row this camera was declared from. */
30590
+ instanceId: string(),
30591
+ deviceId: number().int().nonnegative(),
30592
+ name: string(),
30593
+ /** The canvas the operator laid out — this grid's `high`. mid/low are scaled from it. */
30594
+ width: number().int(),
30595
+ height: number().int(),
30596
+ fps: number().int(),
30597
+ cells: array(GridLayoutCellSchema),
30598
+ /** What the catalog will publish, and what it refuses to. Read-only. */
30599
+ profiles: array(GridProfileOfferSchema)
30600
+ });
30601
+ var GridLayoutPatchSchema = object({
30602
+ deviceId: number().int().nonnegative(),
30603
+ name: string().min(1).max(160).optional(),
30604
+ width: number().int().min(160).max(7680).optional(),
30605
+ height: number().int().min(120).max(4320).optional(),
30606
+ fps: number().int().min(1).max(60).optional(),
30607
+ /**
30608
+ * The whole cell list at once. A per-cell patch would need an ordering the
30609
+ * editor does not have, and a half-applied layout is a picture nobody asked
30610
+ * for.
30611
+ */
30612
+ cells: array(GridLayoutCellSchema).max(16)
30613
+ });
30614
+ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), GridLayoutViewSchema.nullable(), { auth: "admin" }), method(GridLayoutPatchSchema, GridLayoutViewSchema, {
30615
+ kind: "mutation",
30616
+ auth: "admin"
30617
+ });
30618
+ /**
30493
30619
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
30494
30620
  * on-camera motion-detection mask is a single `grid` region (a row-major
30495
30621
  * boolean cell lattice the camera's onboard VMD evaluates). Composing it as
@@ -32189,6 +32315,26 @@ var PtzHomePresetSchema = object({
32189
32315
  "none"
32190
32316
  ])
32191
32317
  });
32318
+ /**
32319
+ * The camera's own idle-return behaviour: whether it goes home by itself, and
32320
+ * after how long.
32321
+ *
32322
+ * ONE shape, not two scalars, because on the camera they are ONE fact —
32323
+ * Reolink's guard point carries `benable` and `timeout` in the same element,
32324
+ * written by the same command. Reading them apart means two round-trips that
32325
+ * can disagree.
32326
+ *
32327
+ * `enabled` and `seconds` are INDEPENDENT: a camera can hold a 68 s delay with
32328
+ * the behaviour switched off, which is exactly what the vendor app leaves when
32329
+ * you turn the guard point off without clearing it. The first version of this
32330
+ * cap reported only the delay, so that state was invisible — a camera could be
32331
+ * configured to return after 68 seconds with no way to say whether it should
32332
+ * return at all.
32333
+ */
32334
+ var PtzHomeReturnSchema = object({
32335
+ enabled: boolean(),
32336
+ seconds: number().int()
32337
+ });
32192
32338
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
32193
32339
  deviceId: number(),
32194
32340
  presetId: string()
@@ -32214,8 +32360,9 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
32214
32360
  }), method(object({ deviceId: number() }), _void(), {
32215
32361
  kind: "mutation",
32216
32362
  auth: "admin"
32217
- }), method(object({ deviceId: number() }), number().int().nullable()), method(object({
32363
+ }), method(object({ deviceId: number() }), PtzHomeReturnSchema.nullable()), method(object({
32218
32364
  deviceId: number(),
32365
+ enabled: boolean(),
32219
32366
  seconds: number().int().min(0).max(3600)
32220
32367
  }), _void(), {
32221
32368
  kind: "mutation",
@@ -35911,6 +36058,18 @@ Object.freeze({
35911
36058
  addonId: null,
35912
36059
  access: "view"
35913
36060
  },
36061
+ "cameraGridLayout.getLayout": {
36062
+ capName: "camera-grid-layout",
36063
+ capScope: "device",
36064
+ addonId: null,
36065
+ access: "view"
36066
+ },
36067
+ "cameraGridLayout.saveLayout": {
36068
+ capName: "camera-grid-layout",
36069
+ capScope: "device",
36070
+ addonId: null,
36071
+ access: "create"
36072
+ },
35914
36073
  "cameraStreams.getBrokerStreams": {
35915
36074
  capName: "camera-streams",
35916
36075
  capScope: "device",
@@ -39661,7 +39820,7 @@ Object.freeze({
39661
39820
  addonId: null,
39662
39821
  access: "view"
39663
39822
  },
39664
- "ptz.getHomeReturnSeconds": {
39823
+ "ptz.getHomeReturn": {
39665
39824
  capName: "ptz",
39666
39825
  capScope: "device",
39667
39826
  addonId: null,
@@ -39721,7 +39880,7 @@ Object.freeze({
39721
39880
  addonId: null,
39722
39881
  access: "create"
39723
39882
  },
39724
- "ptz.setHomeReturnSeconds": {
39883
+ "ptz.setHomeReturn": {
39725
39884
  capName: "ptz",
39726
39885
  capScope: "device",
39727
39886
  addonId: null,
@@ -41610,6 +41769,21 @@ Object.freeze({
41610
41769
  form: "single",
41611
41770
  optional: false
41612
41771
  }],
41772
+ "cameraGridLayout.getLayout": [{
41773
+ name: "deviceId",
41774
+ form: "single",
41775
+ optional: false
41776
+ }],
41777
+ "cameraGridLayout.saveLayout": [{
41778
+ name: "cells",
41779
+ form: "object-array",
41780
+ optional: false,
41781
+ itemField: "deviceId"
41782
+ }, {
41783
+ name: "deviceId",
41784
+ form: "single",
41785
+ optional: false
41786
+ }],
41613
41787
  "cameraStreams.getBrokerStreams": [{
41614
41788
  name: "deviceId",
41615
41789
  form: "single",
@@ -42910,7 +43084,7 @@ Object.freeze({
42910
43084
  form: "single",
42911
43085
  optional: false
42912
43086
  }],
42913
- "ptz.getHomeReturnSeconds": [{
43087
+ "ptz.getHomeReturn": [{
42914
43088
  name: "deviceId",
42915
43089
  form: "single",
42916
43090
  optional: false
@@ -42960,7 +43134,7 @@ Object.freeze({
42960
43134
  form: "single",
42961
43135
  optional: false
42962
43136
  }],
42963
- "ptz.setHomeReturnSeconds": [{
43137
+ "ptz.setHomeReturn": [{
42964
43138
  name: "deviceId",
42965
43139
  form: "single",
42966
43140
  optional: false
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-lqqUXDfs.js");
5
+ const require_dist = require("../dist-CsJJPDQW.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-MJ4ji7um.mjs";
1
+ import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-D3w2fwD4.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-lqqUXDfs.js");
2
+ const require_dist = require("./dist-CsJJPDQW.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-MJ4ji7um.mjs";
1
+ import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-D3w2fwD4.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -3,13 +3,13 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-lqqUXDfs.js");
7
- const require_node = require("../node-80-uOMr8.js");
8
- const require_default_detection_model = require("../default-detection-model-Bbw4nC11.js");
6
+ const require_dist = require("../dist-CsJJPDQW.js");
7
+ const require_node = require("../node-1vbEWzPZ.js");
8
+ const require_default_detection_model = require("../default-detection-model-vVWcdv0g.js");
9
9
  const require_worker_protocol = require("../worker-protocol-B2MfQLlu.js");
10
10
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
11
11
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
12
- const require_restream_intent = require("../restream-intent-VVJiUAkh.js");
12
+ const require_restream_intent = require("../restream-intent-B0GOuR-F.js");
13
13
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
14
14
  let node_os = require("node:os");
15
15
  node_os = require_chunk.__toESM(node_os);
@@ -1,10 +1,10 @@
1
- import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-MJ4ji7um.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-DdXmHLK4.mjs";
3
- import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-A5DRjEr3.mjs";
1
+ import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-D3w2fwD4.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-IHGNrWH9.mjs";
3
+ import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-BZ54sUY2.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-C_W-P_g-.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
7
- import { a as preRollRequestOf, o as withDetectionIntent, t as DETECTION_PRE_ROLL_REQUEST_MS } from "../restream-intent-D2VT97-U.mjs";
7
+ import { a as preRollRequestOf, o as withDetectionIntent, t as DETECTION_PRE_ROLL_REQUEST_MS } from "../restream-intent-CgyZI565.mjs";
8
8
  import { n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-BeHi78PZ.mjs";
9
9
  import * as os from "node:os";
10
10
  import { fork } from "node:child_process";