camstack 1.2.169 → 1.2.171

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-vl6nBE8d.mjs
14525
+ // ../types/dist/sleep-Bs3xPtSh.mjs
14526
14526
  var AUDIO_CHUNK_FORMATS = [
14527
14527
  "f32le",
14528
14528
  "pcmu",
@@ -19073,6 +19073,24 @@ var GetStreamWithCodecInputSchema = external_exports.object({
19073
19073
  });
19074
19074
  var RtpSourceSchema = external_exports.object({
19075
19075
  url: external_exports.string(),
19076
+ /**
19077
+ * The SENTRY counterpart of {@link url} — the dial that asks for the stream
19078
+ * WITHOUT asking for the camera — or `null` when this camera offers none.
19079
+ *
19080
+ * The broker answers it because the broker is the only thing that can:
19081
+ * eligibility is `sentryEligible` (a BATTERY camera that DECLARES the signals
19082
+ * cap), asked of facts only the broker holds. A consumer re-deriving it from
19083
+ * cap bindings would be a second authority, and two authorities on the same
19084
+ * question is how a composite camera ends up dialling a sleeping camera
19085
+ * because its own copy of the rule was a release behind.
19086
+ *
19087
+ * `null` is a real answer and is never a live url in disguise: a consumer
19088
+ * that silently fell back to {@link url} would perform exactly the wake this
19089
+ * field exists to prevent. Only a PASSTHROUGH acquisition can offer one — a
19090
+ * transcode hands back an egress the broker is feeding itself, which has no
19091
+ * sentry counterpart.
19092
+ */
19093
+ sentryUrl: external_exports.string().nullable().optional(),
19076
19094
  videoCodec: external_exports.enum(["H264", "H265"]),
19077
19095
  audioCodec: external_exports.string(),
19078
19096
  resolution: external_exports.object({
@@ -36884,6 +36902,84 @@ var motionTriggerCapability = {
36884
36902
  */
36885
36903
  durability: "session"
36886
36904
  };
36905
+ var GridNormalizedRectSchema = external_exports.object({
36906
+ x: external_exports.number().min(0).max(1),
36907
+ y: external_exports.number().min(0).max(1),
36908
+ width: external_exports.number().gt(0).max(1),
36909
+ height: external_exports.number().gt(0).max(1)
36910
+ });
36911
+ var GridLayoutCellSchema = external_exports.object({
36912
+ deviceId: external_exports.number().int().positive(),
36913
+ /** The part of the SOURCE taken, normalized against the source. */
36914
+ source: GridNormalizedRectSchema,
36915
+ /** Where it lands, normalized against the CANVAS. */
36916
+ cell: GridNormalizedRectSchema
36917
+ });
36918
+ var GridProfileOfferSchema = external_exports.object({
36919
+ profile: external_exports.enum([
36920
+ "high",
36921
+ "mid",
36922
+ "low"
36923
+ ]),
36924
+ offered: external_exports.boolean(),
36925
+ /** Sources that cannot serve it. Empty when it is offered, or when there are no cells. */
36926
+ missingSources: external_exports.array(external_exports.number().int().positive())
36927
+ });
36928
+ var GridLayoutViewSchema = external_exports.object({
36929
+ /** The persisted grid row this camera was declared from. */
36930
+ instanceId: external_exports.string(),
36931
+ deviceId: external_exports.number().int().nonnegative(),
36932
+ name: external_exports.string(),
36933
+ /** The canvas the operator laid out — this grid's `high`. mid/low are scaled from it. */
36934
+ width: external_exports.number().int(),
36935
+ height: external_exports.number().int(),
36936
+ fps: external_exports.number().int(),
36937
+ cells: external_exports.array(GridLayoutCellSchema),
36938
+ /** What the catalog will publish, and what it refuses to. Read-only. */
36939
+ profiles: external_exports.array(GridProfileOfferSchema)
36940
+ });
36941
+ var GridLayoutPatchSchema = external_exports.object({
36942
+ deviceId: external_exports.number().int().nonnegative(),
36943
+ name: external_exports.string().min(1).max(160).optional(),
36944
+ width: external_exports.number().int().min(160).max(7680).optional(),
36945
+ height: external_exports.number().int().min(120).max(4320).optional(),
36946
+ fps: external_exports.number().int().min(1).max(60).optional(),
36947
+ /**
36948
+ * The whole cell list at once. A per-cell patch would need an ordering the
36949
+ * editor does not have, and a half-applied layout is a picture nobody asked
36950
+ * for.
36951
+ */
36952
+ cells: external_exports.array(GridLayoutCellSchema).max(16)
36953
+ });
36954
+ var cameraGridLayoutCapability = {
36955
+ name: "camera-grid-layout",
36956
+ scope: "device",
36957
+ deviceNative: true,
36958
+ mode: "singleton",
36959
+ deviceTypes: [DeviceType.Camera],
36960
+ deviceConfig: { ui: {
36961
+ kind: "widget",
36962
+ widgetId: "host/camera-grid-layout",
36963
+ tab: "streaming",
36964
+ label: "Grid layout",
36965
+ order: 20
36966
+ } },
36967
+ methods: {
36968
+ /**
36969
+ * The grid behind this device.
36970
+ *
36971
+ * `null` means ANSWERED and this camera is not a grid — not "not yet
36972
+ * known". The widget renders its "this is not a grid camera" state only
36973
+ * from this answer, never from an unresolved query (D315).
36974
+ */
36975
+ getLayout: method(external_exports.object({ deviceId: external_exports.number().int().nonnegative() }), GridLayoutViewSchema.nullable(), { auth: "admin" }),
36976
+ /** Write the geometry back. Returns the grid as it now stands, profiles included. */
36977
+ saveLayout: method(GridLayoutPatchSchema, GridLayoutViewSchema, {
36978
+ kind: "mutation",
36979
+ auth: "admin"
36980
+ })
36981
+ }
36982
+ };
36887
36983
  var MotionZoneRegionSchema = external_exports.object({
36888
36984
  id: external_exports.number(),
36889
36985
  enabled: external_exports.boolean(),
@@ -38767,6 +38863,10 @@ var PtzHomePresetSchema = external_exports.object({
38767
38863
  "none"
38768
38864
  ])
38769
38865
  });
38866
+ var PtzHomeReturnSchema = external_exports.object({
38867
+ enabled: external_exports.boolean(),
38868
+ seconds: external_exports.number().int()
38869
+ });
38770
38870
  var ptzCapability = {
38771
38871
  name: "ptz",
38772
38872
  scope: "device",
@@ -38849,18 +38949,25 @@ var ptzCapability = {
38849
38949
  auth: "admin"
38850
38950
  }),
38851
38951
  /**
38852
- * How long the camera waits, idle, before returning home on its own --
38853
- * `null` when it has no such behaviour.
38952
+ * Whether the camera returns home on its own when left idle, and after how
38953
+ * long. `null` when it has no such behaviour at all.
38854
38954
  *
38855
38955
  * Reolink's guard point carries one (`timeout`, freely settable in
38856
38956
  * seconds). It is a real function of the camera that we did not expose at
38857
38957
  * all, and it belongs next to the home it governs rather than in a vendor
38858
38958
  * settings page nobody associates with Home.
38859
38959
  */
38860
- getHomeReturnSeconds: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.number().int().nullable()),
38861
- /** Set the idle-return delay. Refused by a camera that has no such timer. */
38862
- setHomeReturnSeconds: method(external_exports.object({
38960
+ getHomeReturn: method(external_exports.object({ deviceId: external_exports.number() }), PtzHomeReturnSchema.nullable()),
38961
+ /**
38962
+ * Set both together. Refused by a camera with no idle-return behaviour.
38963
+ *
38964
+ * They travel together for the same reason they are read together: the
38965
+ * underlying write carries both, so setting one alone means reading the
38966
+ * other back first and racing whoever else is writing.
38967
+ */
38968
+ setHomeReturn: method(external_exports.object({
38863
38969
  deviceId: external_exports.number(),
38970
+ enabled: external_exports.boolean(),
38864
38971
  seconds: external_exports.number().int().min(0).max(3600)
38865
38972
  }), external_exports.void(), {
38866
38973
  kind: "mutation",
@@ -42551,6 +42658,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
42551
42658
  addonId: null,
42552
42659
  access: "view"
42553
42660
  },
42661
+ "cameraGridLayout.getLayout": {
42662
+ capName: "camera-grid-layout",
42663
+ capScope: "device",
42664
+ addonId: null,
42665
+ access: "view"
42666
+ },
42667
+ "cameraGridLayout.saveLayout": {
42668
+ capName: "camera-grid-layout",
42669
+ capScope: "device",
42670
+ addonId: null,
42671
+ access: "create"
42672
+ },
42554
42673
  "cameraStreams.getBrokerStreams": {
42555
42674
  capName: "camera-streams",
42556
42675
  capScope: "device",
@@ -46301,7 +46420,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
46301
46420
  addonId: null,
46302
46421
  access: "view"
46303
46422
  },
46304
- "ptz.getHomeReturnSeconds": {
46423
+ "ptz.getHomeReturn": {
46305
46424
  capName: "ptz",
46306
46425
  capScope: "device",
46307
46426
  addonId: null,
@@ -46361,7 +46480,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
46361
46480
  addonId: null,
46362
46481
  access: "create"
46363
46482
  },
46364
- "ptz.setHomeReturnSeconds": {
46483
+ "ptz.setHomeReturn": {
46365
46484
  capName: "ptz",
46366
46485
  capScope: "device",
46367
46486
  addonId: null,
@@ -48250,6 +48369,21 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
48250
48369
  form: "single",
48251
48370
  optional: false
48252
48371
  }],
48372
+ "cameraGridLayout.getLayout": [{
48373
+ name: "deviceId",
48374
+ form: "single",
48375
+ optional: false
48376
+ }],
48377
+ "cameraGridLayout.saveLayout": [{
48378
+ name: "cells",
48379
+ form: "object-array",
48380
+ optional: false,
48381
+ itemField: "deviceId"
48382
+ }, {
48383
+ name: "deviceId",
48384
+ form: "single",
48385
+ optional: false
48386
+ }],
48253
48387
  "cameraStreams.getBrokerStreams": [{
48254
48388
  name: "deviceId",
48255
48389
  form: "single",
@@ -49550,7 +49684,7 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
49550
49684
  form: "single",
49551
49685
  optional: false
49552
49686
  }],
49553
- "ptz.getHomeReturnSeconds": [{
49687
+ "ptz.getHomeReturn": [{
49554
49688
  name: "deviceId",
49555
49689
  form: "single",
49556
49690
  optional: false
@@ -49600,7 +49734,7 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
49600
49734
  form: "single",
49601
49735
  optional: false
49602
49736
  }],
49603
- "ptz.setHomeReturnSeconds": [{
49737
+ "ptz.setHomeReturn": [{
49604
49738
  name: "deviceId",
49605
49739
  form: "single",
49606
49740
  optional: false
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-T3N5WXL6.js";
4
+ } from "./chunk-SLJH5H7K.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-TE2XQWET.js");
41
+ await import("./launcher-YO2KRQNJ.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-TE2XQWET.js");
86
+ await import("./launcher-YO2KRQNJ.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1140,7 +1140,7 @@ function isUnknown(_value) {
1140
1140
  return true;
1141
1141
  }
1142
1142
  async function resolveServerInteractive(presetNamespace) {
1143
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-XEKNY5LK.js");
1143
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-IHA2UVS3.js");
1144
1144
  if (presetNamespace) {
1145
1145
  const spinner4 = clack.spinner();
1146
1146
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-T3N5WXL6.js";
8
+ } from "./chunk-SLJH5H7K.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -23742,9 +23742,9 @@ var require_zod = __commonJS({
23742
23742
  }
23743
23743
  });
23744
23744
 
23745
- // ../system/dist/dist-BG0p9Azt.js
23746
- var require_dist_BG0p9Azt = __commonJS({
23747
- "../system/dist/dist-BG0p9Azt.js"(exports) {
23745
+ // ../system/dist/dist-B9y-3rme.js
23746
+ var require_dist_B9y_3rme = __commonJS({
23747
+ "../system/dist/dist-B9y-3rme.js"(exports) {
23748
23748
  "use strict";
23749
23749
  var zod = require_zod();
23750
23750
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -29841,6 +29841,24 @@ var require_dist_BG0p9Azt = __commonJS({
29841
29841
  });
29842
29842
  var RtpSourceSchema = zod.z.object({
29843
29843
  url: zod.z.string(),
29844
+ /**
29845
+ * The SENTRY counterpart of {@link url} — the dial that asks for the stream
29846
+ * WITHOUT asking for the camera — or `null` when this camera offers none.
29847
+ *
29848
+ * The broker answers it because the broker is the only thing that can:
29849
+ * eligibility is `sentryEligible` (a BATTERY camera that DECLARES the signals
29850
+ * cap), asked of facts only the broker holds. A consumer re-deriving it from
29851
+ * cap bindings would be a second authority, and two authorities on the same
29852
+ * question is how a composite camera ends up dialling a sleeping camera
29853
+ * because its own copy of the rule was a release behind.
29854
+ *
29855
+ * `null` is a real answer and is never a live url in disguise: a consumer
29856
+ * that silently fell back to {@link url} would perform exactly the wake this
29857
+ * field exists to prevent. Only a PASSTHROUGH acquisition can offer one — a
29858
+ * transcode hands back an egress the broker is feeding itself, which has no
29859
+ * sentry counterpart.
29860
+ */
29861
+ sentryUrl: zod.z.string().nullable().optional(),
29844
29862
  videoCodec: zod.z.enum(["H264", "H265"]),
29845
29863
  audioCodec: zod.z.string(),
29846
29864
  resolution: zod.z.object({
@@ -47561,6 +47579,84 @@ var require_dist_BG0p9Azt = __commonJS({
47561
47579
  */
47562
47580
  durability: "session"
47563
47581
  };
47582
+ var GridNormalizedRectSchema = zod.z.object({
47583
+ x: zod.z.number().min(0).max(1),
47584
+ y: zod.z.number().min(0).max(1),
47585
+ width: zod.z.number().gt(0).max(1),
47586
+ height: zod.z.number().gt(0).max(1)
47587
+ });
47588
+ var GridLayoutCellSchema = zod.z.object({
47589
+ deviceId: zod.z.number().int().positive(),
47590
+ /** The part of the SOURCE taken, normalized against the source. */
47591
+ source: GridNormalizedRectSchema,
47592
+ /** Where it lands, normalized against the CANVAS. */
47593
+ cell: GridNormalizedRectSchema
47594
+ });
47595
+ var GridProfileOfferSchema = zod.z.object({
47596
+ profile: zod.z.enum([
47597
+ "high",
47598
+ "mid",
47599
+ "low"
47600
+ ]),
47601
+ offered: zod.z.boolean(),
47602
+ /** Sources that cannot serve it. Empty when it is offered, or when there are no cells. */
47603
+ missingSources: zod.z.array(zod.z.number().int().positive())
47604
+ });
47605
+ var GridLayoutViewSchema = zod.z.object({
47606
+ /** The persisted grid row this camera was declared from. */
47607
+ instanceId: zod.z.string(),
47608
+ deviceId: zod.z.number().int().nonnegative(),
47609
+ name: zod.z.string(),
47610
+ /** The canvas the operator laid out — this grid's `high`. mid/low are scaled from it. */
47611
+ width: zod.z.number().int(),
47612
+ height: zod.z.number().int(),
47613
+ fps: zod.z.number().int(),
47614
+ cells: zod.z.array(GridLayoutCellSchema),
47615
+ /** What the catalog will publish, and what it refuses to. Read-only. */
47616
+ profiles: zod.z.array(GridProfileOfferSchema)
47617
+ });
47618
+ var GridLayoutPatchSchema = zod.z.object({
47619
+ deviceId: zod.z.number().int().nonnegative(),
47620
+ name: zod.z.string().min(1).max(160).optional(),
47621
+ width: zod.z.number().int().min(160).max(7680).optional(),
47622
+ height: zod.z.number().int().min(120).max(4320).optional(),
47623
+ fps: zod.z.number().int().min(1).max(60).optional(),
47624
+ /**
47625
+ * The whole cell list at once. A per-cell patch would need an ordering the
47626
+ * editor does not have, and a half-applied layout is a picture nobody asked
47627
+ * for.
47628
+ */
47629
+ cells: zod.z.array(GridLayoutCellSchema).max(16)
47630
+ });
47631
+ var cameraGridLayoutCapability = {
47632
+ name: "camera-grid-layout",
47633
+ scope: "device",
47634
+ deviceNative: true,
47635
+ mode: "singleton",
47636
+ deviceTypes: [DeviceType.Camera],
47637
+ deviceConfig: { ui: {
47638
+ kind: "widget",
47639
+ widgetId: "host/camera-grid-layout",
47640
+ tab: "streaming",
47641
+ label: "Grid layout",
47642
+ order: 20
47643
+ } },
47644
+ methods: {
47645
+ /**
47646
+ * The grid behind this device.
47647
+ *
47648
+ * `null` means ANSWERED and this camera is not a grid — not "not yet
47649
+ * known". The widget renders its "this is not a grid camera" state only
47650
+ * from this answer, never from an unresolved query (D315).
47651
+ */
47652
+ getLayout: method(zod.z.object({ deviceId: zod.z.number().int().nonnegative() }), GridLayoutViewSchema.nullable(), { auth: "admin" }),
47653
+ /** Write the geometry back. Returns the grid as it now stands, profiles included. */
47654
+ saveLayout: method(GridLayoutPatchSchema, GridLayoutViewSchema, {
47655
+ kind: "mutation",
47656
+ auth: "admin"
47657
+ })
47658
+ }
47659
+ };
47564
47660
  var MotionZoneRegionSchema = zod.z.object({
47565
47661
  id: zod.z.number(),
47566
47662
  enabled: zod.z.boolean(),
@@ -49442,6 +49538,10 @@ var require_dist_BG0p9Azt = __commonJS({
49442
49538
  "none"
49443
49539
  ])
49444
49540
  });
49541
+ var PtzHomeReturnSchema = zod.z.object({
49542
+ enabled: zod.z.boolean(),
49543
+ seconds: zod.z.number().int()
49544
+ });
49445
49545
  var ptzCapability = {
49446
49546
  name: "ptz",
49447
49547
  scope: "device",
@@ -49524,18 +49624,25 @@ var require_dist_BG0p9Azt = __commonJS({
49524
49624
  auth: "admin"
49525
49625
  }),
49526
49626
  /**
49527
- * How long the camera waits, idle, before returning home on its own --
49528
- * `null` when it has no such behaviour.
49627
+ * Whether the camera returns home on its own when left idle, and after how
49628
+ * long. `null` when it has no such behaviour at all.
49529
49629
  *
49530
49630
  * Reolink's guard point carries one (`timeout`, freely settable in
49531
49631
  * seconds). It is a real function of the camera that we did not expose at
49532
49632
  * all, and it belongs next to the home it governs rather than in a vendor
49533
49633
  * settings page nobody associates with Home.
49534
49634
  */
49535
- getHomeReturnSeconds: method(zod.z.object({ deviceId: zod.z.number() }), zod.z.number().int().nullable()),
49536
- /** Set the idle-return delay. Refused by a camera that has no such timer. */
49537
- setHomeReturnSeconds: method(zod.z.object({
49635
+ getHomeReturn: method(zod.z.object({ deviceId: zod.z.number() }), PtzHomeReturnSchema.nullable()),
49636
+ /**
49637
+ * Set both together. Refused by a camera with no idle-return behaviour.
49638
+ *
49639
+ * They travel together for the same reason they are read together: the
49640
+ * underlying write carries both, so setting one alone means reading the
49641
+ * other back first and racing whoever else is writing.
49642
+ */
49643
+ setHomeReturn: method(zod.z.object({
49538
49644
  deviceId: zod.z.number(),
49645
+ enabled: zod.z.boolean(),
49539
49646
  seconds: zod.z.number().int().min(0).max(3600)
49540
49647
  }), zod.z.void(), {
49541
49648
  kind: "mutation",
@@ -53203,6 +53310,7 @@ var require_dist_BG0p9Azt = __commonJS({
53203
53310
  brokerCapability,
53204
53311
  buttonCapability,
53205
53312
  cameraCredentialsCapability,
53313
+ cameraGridLayoutCapability,
53206
53314
  cameraPipelineConfigCapability,
53207
53315
  cameraStreamsCapability,
53208
53316
  carbonMonoxideCapability,
@@ -54056,6 +54164,18 @@ var require_dist_BG0p9Azt = __commonJS({
54056
54164
  addonId: null,
54057
54165
  access: "view"
54058
54166
  },
54167
+ "cameraGridLayout.getLayout": {
54168
+ capName: "camera-grid-layout",
54169
+ capScope: "device",
54170
+ addonId: null,
54171
+ access: "view"
54172
+ },
54173
+ "cameraGridLayout.saveLayout": {
54174
+ capName: "camera-grid-layout",
54175
+ capScope: "device",
54176
+ addonId: null,
54177
+ access: "create"
54178
+ },
54059
54179
  "cameraStreams.getBrokerStreams": {
54060
54180
  capName: "camera-streams",
54061
54181
  capScope: "device",
@@ -57806,7 +57926,7 @@ var require_dist_BG0p9Azt = __commonJS({
57806
57926
  addonId: null,
57807
57927
  access: "view"
57808
57928
  },
57809
- "ptz.getHomeReturnSeconds": {
57929
+ "ptz.getHomeReturn": {
57810
57930
  capName: "ptz",
57811
57931
  capScope: "device",
57812
57932
  addonId: null,
@@ -57866,7 +57986,7 @@ var require_dist_BG0p9Azt = __commonJS({
57866
57986
  addonId: null,
57867
57987
  access: "create"
57868
57988
  },
57869
- "ptz.setHomeReturnSeconds": {
57989
+ "ptz.setHomeReturn": {
57870
57990
  capName: "ptz",
57871
57991
  capScope: "device",
57872
57992
  addonId: null,
@@ -59755,6 +59875,21 @@ var require_dist_BG0p9Azt = __commonJS({
59755
59875
  form: "single",
59756
59876
  optional: false
59757
59877
  }],
59878
+ "cameraGridLayout.getLayout": [{
59879
+ name: "deviceId",
59880
+ form: "single",
59881
+ optional: false
59882
+ }],
59883
+ "cameraGridLayout.saveLayout": [{
59884
+ name: "cells",
59885
+ form: "object-array",
59886
+ optional: false,
59887
+ itemField: "deviceId"
59888
+ }, {
59889
+ name: "deviceId",
59890
+ form: "single",
59891
+ optional: false
59892
+ }],
59758
59893
  "cameraStreams.getBrokerStreams": [{
59759
59894
  name: "deviceId",
59760
59895
  form: "single",
@@ -61055,7 +61190,7 @@ var require_dist_BG0p9Azt = __commonJS({
61055
61190
  form: "single",
61056
61191
  optional: false
61057
61192
  }],
61058
- "ptz.getHomeReturnSeconds": [{
61193
+ "ptz.getHomeReturn": [{
61059
61194
  name: "deviceId",
61060
61195
  form: "single",
61061
61196
  optional: false
@@ -61105,7 +61240,7 @@ var require_dist_BG0p9Azt = __commonJS({
61105
61240
  form: "single",
61106
61241
  optional: false
61107
61242
  }],
61108
- "ptz.setHomeReturnSeconds": [{
61243
+ "ptz.setHomeReturn": [{
61109
61244
  name: "deviceId",
61110
61245
  form: "single",
61111
61246
  optional: false
@@ -63137,7 +63272,7 @@ var require_alerts_addon = __commonJS({
63137
63272
  [Symbol.toStringTag]: { value: "Module" }
63138
63273
  });
63139
63274
  require_chunk_Cek0wNdY();
63140
- var require_dist10 = require_dist_BG0p9Azt();
63275
+ var require_dist10 = require_dist_B9y_3rme();
63141
63276
  function selectExpired(alerts, cutoffMs) {
63142
63277
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
63143
63278
  }
@@ -63956,7 +64091,7 @@ var require_console_logging = __commonJS({
63956
64091
  [Symbol.toStringTag]: { value: "Module" }
63957
64092
  });
63958
64093
  require_chunk_Cek0wNdY();
63959
- var require_dist10 = require_dist_BG0p9Azt();
64094
+ var require_dist10 = require_dist_B9y_3rme();
63960
64095
  var require_formatter = require_formatter_DqAKDlvN();
63961
64096
  var LEVEL_RANK = {
63962
64097
  debug: 0,
@@ -64050,7 +64185,7 @@ var require_core_blocks_addon = __commonJS({
64050
64185
  "use strict";
64051
64186
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
64052
64187
  var require_chunk = require_chunk_Cek0wNdY();
64053
- var require_dist10 = require_dist_BG0p9Azt();
64188
+ var require_dist10 = require_dist_B9y_3rme();
64054
64189
  var node_crypto = __require("crypto");
64055
64190
  var node_fs_promises = __require("fs/promises");
64056
64191
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -64947,11 +65082,11 @@ var require_core_blocks = __commonJS({
64947
65082
  }
64948
65083
  });
64949
65084
 
64950
- // ../system/dist/retired-settings-keys-Cmv1q2hJ.js
64951
- var require_retired_settings_keys_Cmv1q2hJ = __commonJS({
64952
- "../system/dist/retired-settings-keys-Cmv1q2hJ.js"(exports) {
65085
+ // ../system/dist/retired-settings-keys-CnMg7wvS.js
65086
+ var require_retired_settings_keys_CnMg7wvS = __commonJS({
65087
+ "../system/dist/retired-settings-keys-CnMg7wvS.js"(exports) {
64953
65088
  "use strict";
64954
- var require_dist10 = require_dist_BG0p9Azt();
65089
+ var require_dist10 = require_dist_B9y_3rme();
64955
65090
  function settingsStoreIsAuthoritativeHere(env) {
64956
65091
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
64957
65092
  return raw === "" || raw === "hub";
@@ -67228,8 +67363,8 @@ var require_device_manager_addon = __commonJS({
67228
67363
  [Symbol.toStringTag]: { value: "Module" }
67229
67364
  });
67230
67365
  require_chunk_Cek0wNdY();
67231
- var require_dist10 = require_dist_BG0p9Azt();
67232
- var require_retired_settings_keys = require_retired_settings_keys_Cmv1q2hJ();
67366
+ var require_dist10 = require_dist_B9y_3rme();
67367
+ var require_retired_settings_keys = require_retired_settings_keys_CnMg7wvS();
67233
67368
  var node_crypto = __require("crypto");
67234
67369
  var _camstack_types_node = require_node();
67235
67370
  var JOB_HISTORY = 20;
@@ -73237,7 +73372,7 @@ var require_hub_forwarder = __commonJS({
73237
73372
  [Symbol.toStringTag]: { value: "Module" }
73238
73373
  });
73239
73374
  require_chunk_Cek0wNdY();
73240
- var require_dist10 = require_dist_BG0p9Azt();
73375
+ var require_dist10 = require_dist_B9y_3rme();
73241
73376
  var require_formatter = require_formatter_DqAKDlvN();
73242
73377
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
73243
73378
  var HubForwarderDestination = class {
@@ -73374,7 +73509,7 @@ var require_liveness_monitor_addon = __commonJS({
73374
73509
  "use strict";
73375
73510
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
73376
73511
  require_chunk_Cek0wNdY();
73377
- var require_dist10 = require_dist_BG0p9Azt();
73512
+ var require_dist10 = require_dist_B9y_3rme();
73378
73513
  var NO_DEVICES = "liveness:no-devices";
73379
73514
  var ALL_OFFLINE = "liveness:all-devices-offline";
73380
73515
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -73570,7 +73705,7 @@ var require_local_auth_addon = __commonJS({
73570
73705
  [Symbol.toStringTag]: { value: "Module" }
73571
73706
  });
73572
73707
  var require_chunk = require_chunk_Cek0wNdY();
73573
- var require_dist10 = require_dist_BG0p9Azt();
73708
+ var require_dist10 = require_dist_B9y_3rme();
73574
73709
  var node_crypto = __require("crypto");
73575
73710
  node_crypto = require_chunk.__toESM(node_crypto);
73576
73711
  var crypto$1 = __require("crypto");
@@ -81383,7 +81518,7 @@ var require_loki_logging = __commonJS({
81383
81518
  [Symbol.toStringTag]: { value: "Module" }
81384
81519
  });
81385
81520
  require_chunk_Cek0wNdY();
81386
- var require_dist10 = require_dist_BG0p9Azt();
81521
+ var require_dist10 = require_dist_B9y_3rme();
81387
81522
  function sanitizeLabelName(raw) {
81388
81523
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
81389
81524
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -81970,7 +82105,7 @@ var require_native_metrics_addon = __commonJS({
81970
82105
  [Symbol.toStringTag]: { value: "Module" }
81971
82106
  });
81972
82107
  var require_chunk = require_chunk_Cek0wNdY();
81973
- var require_dist10 = require_dist_BG0p9Azt();
82108
+ var require_dist10 = require_dist_B9y_3rme();
81974
82109
  var node_fs_promises = __require("fs/promises");
81975
82110
  var node_fs = __require("fs");
81976
82111
  node_fs = require_chunk.__toESM(node_fs);
@@ -84723,7 +84858,7 @@ var require_filesystem_storage_addon = __commonJS({
84723
84858
  [Symbol.toStringTag]: { value: "Module" }
84724
84859
  });
84725
84860
  var require_chunk = require_chunk_Cek0wNdY();
84726
- var require_dist10 = require_dist_BG0p9Azt();
84861
+ var require_dist10 = require_dist_B9y_3rme();
84727
84862
  var node_crypto = __require("crypto");
84728
84863
  var node_fs_promises = __require("fs/promises");
84729
84864
  var node_path = __require("path");
@@ -85950,8 +86085,8 @@ var require_sqlite_settings_addon = __commonJS({
85950
86085
  [Symbol.toStringTag]: { value: "Module" }
85951
86086
  });
85952
86087
  var require_chunk = require_chunk_Cek0wNdY();
85953
- var require_dist10 = require_dist_BG0p9Azt();
85954
- var require_retired_settings_keys = require_retired_settings_keys_Cmv1q2hJ();
86088
+ var require_dist10 = require_dist_B9y_3rme();
86089
+ var require_retired_settings_keys = require_retired_settings_keys_CnMg7wvS();
85955
86090
  var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
85956
86091
  var node_crypto = __require("crypto");
85957
86092
  var node_path = __require("path");
@@ -88738,7 +88873,7 @@ var require_storage_orchestrator_addon = __commonJS({
88738
88873
  [Symbol.toStringTag]: { value: "Module" }
88739
88874
  });
88740
88875
  var require_chunk = require_chunk_Cek0wNdY();
88741
- var require_dist10 = require_dist_BG0p9Azt();
88876
+ var require_dist10 = require_dist_B9y_3rme();
88742
88877
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
88743
88878
  var zod = require_zod();
88744
88879
  var node_crypto = __require("crypto");
@@ -92465,7 +92600,7 @@ var require_system_config_addon = __commonJS({
92465
92600
  [Symbol.toStringTag]: { value: "Module" }
92466
92601
  });
92467
92602
  require_chunk_Cek0wNdY();
92468
- var require_dist10 = require_dist_BG0p9Azt();
92603
+ var require_dist10 = require_dist_B9y_3rme();
92469
92604
  var SECTION_TITLES = {
92470
92605
  server: "Server",
92471
92606
  auth: "Authentication"
@@ -110526,7 +110661,7 @@ var require_winston_logging = __commonJS({
110526
110661
  [Symbol.toStringTag]: { value: "Module" }
110527
110662
  });
110528
110663
  var require_chunk = require_chunk_Cek0wNdY();
110529
- var require_dist10 = require_dist_BG0p9Azt();
110664
+ var require_dist10 = require_dist_B9y_3rme();
110530
110665
  var require_formatter = require_formatter_DqAKDlvN();
110531
110666
  var node_path = __require("path");
110532
110667
  node_path = require_chunk.__toESM(node_path);
@@ -112564,9 +112699,9 @@ var require_event_category_BVfsrBYA = __commonJS({
112564
112699
  }
112565
112700
  });
112566
112701
 
112567
- // ../types/dist/sleep-WeJUxTv-.js
112568
- var require_sleep_WeJUxTv = __commonJS({
112569
- "../types/dist/sleep-WeJUxTv-.js"(exports) {
112702
+ // ../types/dist/sleep-OPlow2a9.js
112703
+ var require_sleep_OPlow2a9 = __commonJS({
112704
+ "../types/dist/sleep-OPlow2a9.js"(exports) {
112570
112705
  "use strict";
112571
112706
  var require_event_category = require_event_category_BVfsrBYA();
112572
112707
  var zod = require_zod();
@@ -115154,6 +115289,10 @@ var require_sleep_WeJUxTv = __commonJS({
115154
115289
  getCredentials: (input) => dispatch("camera-credentials", "cameraCredentials", "getCredentials", "query", input),
115155
115290
  getStatus: (input) => dispatch("camera-credentials", "cameraCredentials", "getStatus", "query", input)
115156
115291
  },
115292
+ cameraGridLayout: {
115293
+ getLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getLayout", "query", input),
115294
+ saveLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "saveLayout", "mutation", input)
115295
+ },
115157
115296
  cameraStreams: {
115158
115297
  getCameraStreams: (input) => dispatch("camera-streams", "cameraStreams", "getCameraStreams", "query", input),
115159
115298
  getBrokerStreams: (input) => dispatch("camera-streams", "cameraStreams", "getBrokerStreams", "query", input),
@@ -115472,8 +115611,8 @@ var require_sleep_WeJUxTv = __commonJS({
115472
115611
  getHomePreset: (input) => dispatch("ptz", "ptz", "getHomePreset", "query", input),
115473
115612
  setHomePreset: (input) => dispatch("ptz", "ptz", "setHomePreset", "mutation", input),
115474
115613
  captureHomeHere: (input) => dispatch("ptz", "ptz", "captureHomeHere", "mutation", input),
115475
- getHomeReturnSeconds: (input) => dispatch("ptz", "ptz", "getHomeReturnSeconds", "query", input),
115476
- setHomeReturnSeconds: (input) => dispatch("ptz", "ptz", "setHomeReturnSeconds", "mutation", input),
115614
+ getHomeReturn: (input) => dispatch("ptz", "ptz", "getHomeReturn", "query", input),
115615
+ setHomeReturn: (input) => dispatch("ptz", "ptz", "setHomeReturn", "mutation", input),
115477
115616
  getPosition: (input) => dispatch("ptz", "ptz", "getPosition", "query", input),
115478
115617
  setAutofocus: (input) => dispatch("ptz", "ptz", "setAutofocus", "mutation", input),
115479
115618
  getStatus: (input) => dispatch("ptz", "ptz", "getStatus", "query", input)
@@ -115763,6 +115902,7 @@ var require_sleep_WeJUxTv = __commonJS({
115763
115902
  "brightness",
115764
115903
  "button",
115765
115904
  "camera-credentials",
115905
+ "camera-grid-layout",
115766
115906
  "camera-pipeline-config",
115767
115907
  "camera-streams",
115768
115908
  "carbon-monoxide",
@@ -116472,7 +116612,7 @@ var require_addon = __commonJS({
116472
116612
  "../types/dist/addon.js"(exports) {
116473
116613
  "use strict";
116474
116614
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
116475
- var require_sleep = require_sleep_WeJUxTv();
116615
+ var require_sleep = require_sleep_OPlow2a9();
116476
116616
  var require_event_category = require_event_category_BVfsrBYA();
116477
116617
  var require_err_msg = require_err_msg_COpsHMw2();
116478
116618
  var CAP_INPUT_DEFAULTS = Object.freeze({
@@ -136798,7 +136938,7 @@ var require_dist3 = __commonJS({
136798
136938
  "use strict";
136799
136939
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
136800
136940
  var require_chunk = require_chunk_Cek0wNdY();
136801
- var require_dist10 = require_dist_BG0p9Azt();
136941
+ var require_dist10 = require_dist_B9y_3rme();
136802
136942
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
136803
136943
  require_alerts();
136804
136944
  var require_formatter = require_formatter_DqAKDlvN();
@@ -217962,7 +218102,7 @@ var require_dist4 = __commonJS({
217962
218102
  "../types/dist/index.js"(exports) {
217963
218103
  "use strict";
217964
218104
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
217965
- var require_sleep = require_sleep_WeJUxTv();
218105
+ var require_sleep = require_sleep_OPlow2a9();
217966
218106
  var require_event_category = require_event_category_BVfsrBYA();
217967
218107
  var require_canonical_hash = require_canonical_hash_CZ2JqJc3();
217968
218108
  var require_enums2 = require_enums();
@@ -223960,6 +224100,24 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
223960
224100
  });
223961
224101
  var RtpSourceSchema = zod.z.object({
223962
224102
  url: zod.z.string(),
224103
+ /**
224104
+ * The SENTRY counterpart of {@link url} — the dial that asks for the stream
224105
+ * WITHOUT asking for the camera — or `null` when this camera offers none.
224106
+ *
224107
+ * The broker answers it because the broker is the only thing that can:
224108
+ * eligibility is `sentryEligible` (a BATTERY camera that DECLARES the signals
224109
+ * cap), asked of facts only the broker holds. A consumer re-deriving it from
224110
+ * cap bindings would be a second authority, and two authorities on the same
224111
+ * question is how a composite camera ends up dialling a sleeping camera
224112
+ * because its own copy of the rule was a release behind.
224113
+ *
224114
+ * `null` is a real answer and is never a live url in disguise: a consumer
224115
+ * that silently fell back to {@link url} would perform exactly the wake this
224116
+ * field exists to prevent. Only a PASSTHROUGH acquisition can offer one — a
224117
+ * transcode hands back an egress the broker is feeding itself, which has no
224118
+ * sentry counterpart.
224119
+ */
224120
+ sentryUrl: zod.z.string().nullable().optional(),
223963
224121
  videoCodec: zod.z.enum(["H264", "H265"]),
223964
224122
  audioCodec: zod.z.string(),
223965
224123
  resolution: zod.z.object({
@@ -242829,6 +242987,84 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
242829
242987
  */
242830
242988
  durability: "session"
242831
242989
  };
242990
+ var GridNormalizedRectSchema = zod.z.object({
242991
+ x: zod.z.number().min(0).max(1),
242992
+ y: zod.z.number().min(0).max(1),
242993
+ width: zod.z.number().gt(0).max(1),
242994
+ height: zod.z.number().gt(0).max(1)
242995
+ });
242996
+ var GridLayoutCellSchema = zod.z.object({
242997
+ deviceId: zod.z.number().int().positive(),
242998
+ /** The part of the SOURCE taken, normalized against the source. */
242999
+ source: GridNormalizedRectSchema,
243000
+ /** Where it lands, normalized against the CANVAS. */
243001
+ cell: GridNormalizedRectSchema
243002
+ });
243003
+ var GridProfileOfferSchema = zod.z.object({
243004
+ profile: zod.z.enum([
243005
+ "high",
243006
+ "mid",
243007
+ "low"
243008
+ ]),
243009
+ offered: zod.z.boolean(),
243010
+ /** Sources that cannot serve it. Empty when it is offered, or when there are no cells. */
243011
+ missingSources: zod.z.array(zod.z.number().int().positive())
243012
+ });
243013
+ var GridLayoutViewSchema = zod.z.object({
243014
+ /** The persisted grid row this camera was declared from. */
243015
+ instanceId: zod.z.string(),
243016
+ deviceId: zod.z.number().int().nonnegative(),
243017
+ name: zod.z.string(),
243018
+ /** The canvas the operator laid out — this grid's `high`. mid/low are scaled from it. */
243019
+ width: zod.z.number().int(),
243020
+ height: zod.z.number().int(),
243021
+ fps: zod.z.number().int(),
243022
+ cells: zod.z.array(GridLayoutCellSchema),
243023
+ /** What the catalog will publish, and what it refuses to. Read-only. */
243024
+ profiles: zod.z.array(GridProfileOfferSchema)
243025
+ });
243026
+ var GridLayoutPatchSchema = zod.z.object({
243027
+ deviceId: zod.z.number().int().nonnegative(),
243028
+ name: zod.z.string().min(1).max(160).optional(),
243029
+ width: zod.z.number().int().min(160).max(7680).optional(),
243030
+ height: zod.z.number().int().min(120).max(4320).optional(),
243031
+ fps: zod.z.number().int().min(1).max(60).optional(),
243032
+ /**
243033
+ * The whole cell list at once. A per-cell patch would need an ordering the
243034
+ * editor does not have, and a half-applied layout is a picture nobody asked
243035
+ * for.
243036
+ */
243037
+ cells: zod.z.array(GridLayoutCellSchema).max(16)
243038
+ });
243039
+ var cameraGridLayoutCapability = {
243040
+ name: "camera-grid-layout",
243041
+ scope: "device",
243042
+ deviceNative: true,
243043
+ mode: "singleton",
243044
+ deviceTypes: [require_sleep.DeviceType.Camera],
243045
+ deviceConfig: { ui: {
243046
+ kind: "widget",
243047
+ widgetId: "host/camera-grid-layout",
243048
+ tab: "streaming",
243049
+ label: "Grid layout",
243050
+ order: 20
243051
+ } },
243052
+ methods: {
243053
+ /**
243054
+ * The grid behind this device.
243055
+ *
243056
+ * `null` means ANSWERED and this camera is not a grid — not "not yet
243057
+ * known". The widget renders its "this is not a grid camera" state only
243058
+ * from this answer, never from an unresolved query (D315).
243059
+ */
243060
+ getLayout: require_sleep.method(zod.z.object({ deviceId: zod.z.number().int().nonnegative() }), GridLayoutViewSchema.nullable(), { auth: "admin" }),
243061
+ /** Write the geometry back. Returns the grid as it now stands, profiles included. */
243062
+ saveLayout: require_sleep.method(GridLayoutPatchSchema, GridLayoutViewSchema, {
243063
+ kind: "mutation",
243064
+ auth: "admin"
243065
+ })
243066
+ }
243067
+ };
242832
243068
  var MotionZoneRegionSchema = zod.z.object({
242833
243069
  id: zod.z.number(),
242834
243070
  enabled: zod.z.boolean(),
@@ -244855,6 +245091,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
244855
245091
  "none"
244856
245092
  ])
244857
245093
  });
245094
+ var PtzHomeReturnSchema = zod.z.object({
245095
+ enabled: zod.z.boolean(),
245096
+ seconds: zod.z.number().int()
245097
+ });
244858
245098
  var ptzCapability = {
244859
245099
  name: "ptz",
244860
245100
  scope: "device",
@@ -244937,18 +245177,25 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
244937
245177
  auth: "admin"
244938
245178
  }),
244939
245179
  /**
244940
- * How long the camera waits, idle, before returning home on its own --
244941
- * `null` when it has no such behaviour.
245180
+ * Whether the camera returns home on its own when left idle, and after how
245181
+ * long. `null` when it has no such behaviour at all.
244942
245182
  *
244943
245183
  * Reolink's guard point carries one (`timeout`, freely settable in
244944
245184
  * seconds). It is a real function of the camera that we did not expose at
244945
245185
  * all, and it belongs next to the home it governs rather than in a vendor
244946
245186
  * settings page nobody associates with Home.
244947
245187
  */
244948
- getHomeReturnSeconds: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.number().int().nullable()),
244949
- /** Set the idle-return delay. Refused by a camera that has no such timer. */
244950
- setHomeReturnSeconds: require_sleep.method(zod.z.object({
245188
+ getHomeReturn: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), PtzHomeReturnSchema.nullable()),
245189
+ /**
245190
+ * Set both together. Refused by a camera with no idle-return behaviour.
245191
+ *
245192
+ * They travel together for the same reason they are read together: the
245193
+ * underlying write carries both, so setting one alone means reading the
245194
+ * other back first and racing whoever else is writing.
245195
+ */
245196
+ setHomeReturn: require_sleep.method(zod.z.object({
244951
245197
  deviceId: zod.z.number(),
245198
+ enabled: zod.z.boolean(),
244952
245199
  seconds: zod.z.number().int().min(0).max(3600)
244953
245200
  }), zod.z.void(), {
244954
245201
  kind: "mutation",
@@ -251201,6 +251448,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
251201
251448
  broker: "broker",
251202
251449
  button: "button",
251203
251450
  cameraCredentials: "camera-credentials",
251451
+ cameraGridLayout: "camera-grid-layout",
251204
251452
  cameraPipelineConfig: "camera-pipeline-config",
251205
251453
  cameraStreams: "camera-streams",
251206
251454
  carbonMonoxide: "carbon-monoxide",
@@ -251438,6 +251686,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
251438
251686
  key: "cameraCredentials",
251439
251687
  name: "camera-credentials"
251440
251688
  },
251689
+ {
251690
+ key: "cameraGridLayout",
251691
+ name: "camera-grid-layout"
251692
+ },
251441
251693
  {
251442
251694
  key: "cameraPipelineConfig",
251443
251695
  name: "camera-pipeline-config"
@@ -251990,6 +252242,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
251990
252242
  brokerCapability,
251991
252243
  buttonCapability,
251992
252244
  cameraCredentialsCapability,
252245
+ cameraGridLayoutCapability,
251993
252246
  cameraPipelineConfigCapability,
251994
252247
  cameraStreamsCapability,
251995
252248
  carbonMonoxideCapability,
@@ -252843,6 +253096,18 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
252843
253096
  addonId: null,
252844
253097
  access: "view"
252845
253098
  },
253099
+ "cameraGridLayout.getLayout": {
253100
+ capName: "camera-grid-layout",
253101
+ capScope: "device",
253102
+ addonId: null,
253103
+ access: "view"
253104
+ },
253105
+ "cameraGridLayout.saveLayout": {
253106
+ capName: "camera-grid-layout",
253107
+ capScope: "device",
253108
+ addonId: null,
253109
+ access: "create"
253110
+ },
252846
253111
  "cameraStreams.getBrokerStreams": {
252847
253112
  capName: "camera-streams",
252848
253113
  capScope: "device",
@@ -256593,7 +256858,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256593
256858
  addonId: null,
256594
256859
  access: "view"
256595
256860
  },
256596
- "ptz.getHomeReturnSeconds": {
256861
+ "ptz.getHomeReturn": {
256597
256862
  capName: "ptz",
256598
256863
  capScope: "device",
256599
256864
  addonId: null,
@@ -256653,7 +256918,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256653
256918
  addonId: null,
256654
256919
  access: "create"
256655
256920
  },
256656
- "ptz.setHomeReturnSeconds": {
256921
+ "ptz.setHomeReturn": {
256657
256922
  capName: "ptz",
256658
256923
  capScope: "device",
256659
256924
  addonId: null,
@@ -258466,6 +258731,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258466
258731
  "broker",
258467
258732
  "button",
258468
258733
  "camera-credentials",
258734
+ "camera-grid-layout",
258469
258735
  "camera-streams",
258470
258736
  "climate-control",
258471
258737
  "color",
@@ -258584,6 +258850,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258584
258850
  "brightness",
258585
258851
  "button",
258586
258852
  "camera-credentials",
258853
+ "camera-grid-layout",
258587
258854
  "camera-streams",
258588
258855
  "climate-control",
258589
258856
  "color",
@@ -258808,6 +259075,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258808
259075
  form: "single",
258809
259076
  optional: false
258810
259077
  }],
259078
+ "cameraGridLayout.getLayout": [{
259079
+ name: "deviceId",
259080
+ form: "single",
259081
+ optional: false
259082
+ }],
259083
+ "cameraGridLayout.saveLayout": [{
259084
+ name: "cells",
259085
+ form: "object-array",
259086
+ optional: false,
259087
+ itemField: "deviceId"
259088
+ }, {
259089
+ name: "deviceId",
259090
+ form: "single",
259091
+ optional: false
259092
+ }],
258811
259093
  "cameraStreams.getBrokerStreams": [{
258812
259094
  name: "deviceId",
258813
259095
  form: "single",
@@ -260108,7 +260390,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
260108
260390
  form: "single",
260109
260391
  optional: false
260110
260392
  }],
260111
- "ptz.getHomeReturnSeconds": [{
260393
+ "ptz.getHomeReturn": [{
260112
260394
  name: "deviceId",
260113
260395
  form: "single",
260114
260396
  optional: false
@@ -260158,7 +260440,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
260158
260440
  form: "single",
260159
260441
  optional: false
260160
260442
  }],
260161
- "ptz.setHomeReturnSeconds": [{
260443
+ "ptz.setHomeReturn": [{
260162
260444
  name: "deviceId",
260163
260445
  form: "single",
260164
260446
  optional: false
@@ -264922,6 +265204,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
264922
265204
  exports.GetLoggingSettingsInputSchema = GetLoggingSettingsInputSchema;
264923
265205
  exports.GetStreamWithCodecInputSchema = GetStreamWithCodecInputSchema;
264924
265206
  exports.GlobalMetricsSchema = GlobalMetricsSchema;
265207
+ exports.GridLayoutPatchSchema = GridLayoutPatchSchema;
265208
+ exports.GridLayoutViewSchema = GridLayoutViewSchema;
264925
265209
  exports.HAP_AUDIO_BASE = HAP_AUDIO_BASE;
264926
265210
  exports.HAP_AUDIO_BITRATE_KBPS = HAP_AUDIO_BITRATE_KBPS;
264927
265211
  exports.HAP_AUDIO_VBV_KBITS = HAP_AUDIO_VBV_KBITS;
@@ -265313,6 +265597,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
265313
265597
  exports.PtzAutotrackStatusSchema = PtzAutotrackStatusSchema;
265314
265598
  exports.PtzAutotrackTargetOptionSchema = PtzAutotrackTargetOptionSchema;
265315
265599
  exports.PtzHomePresetSchema = PtzHomePresetSchema;
265600
+ exports.PtzHomeReturnSchema = PtzHomeReturnSchema;
265316
265601
  exports.PtzMoveCommandSchema = PtzMoveCommandSchema;
265317
265602
  exports.PtzOptionsSchema = PtzOptionsSchema;
265318
265603
  exports.PtzPositionSchema = PtzPositionSchema;
@@ -265715,6 +266000,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
265715
266000
  exports.buildVideoArgs = require_canonical_hash.buildVideoArgs;
265716
266001
  exports.buttonCapability = buttonCapability;
265717
266002
  exports.cameraCredentialsCapability = cameraCredentialsCapability;
266003
+ exports.cameraGridLayoutCapability = cameraGridLayoutCapability;
265718
266004
  exports.cameraPipelineConfigCapability = cameraPipelineConfigCapability;
265719
266005
  exports.cameraStreamsCapability = cameraStreamsCapability;
265720
266006
  exports.canConvertUnit = canConvertUnit;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.169",
3
+ "version": "1.2.171",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",