camstack 1.2.167 → 1.2.168

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-BDR76Ykr.mjs
14525
+ // ../types/dist/sleep-B1y0Fo1U.mjs
14526
14526
  var AUDIO_CHUNK_FORMATS = [
14527
14527
  "f32le",
14528
14528
  "pcmu",
@@ -15384,7 +15384,7 @@ function sleep(ms) {
15384
15384
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
15385
15385
  }
15386
15386
 
15387
- // ../types/dist/canonical-hash-Ch5bSjFG.mjs
15387
+ // ../types/dist/canonical-hash-DBkl8q6V.mjs
15388
15388
  import { createHash } from "crypto";
15389
15389
  var DEFAULT_MAX_UNIT_BYTES = 16 * 1024 * 1024;
15390
15390
 
@@ -38683,14 +38683,36 @@ var privacyMaskCapability = {
38683
38683
  * whether persisting is worth a SQLite commit. */
38684
38684
  volatileStateFields: ["lastFetchedAt"]
38685
38685
  };
38686
+ var PtzPresetFunctionSchema = external_exports.enum([
38687
+ "home",
38688
+ "day-mode",
38689
+ "night-mode",
38690
+ "day-night-auto",
38691
+ "set-limits",
38692
+ "save-limits",
38693
+ "reboot",
38694
+ "osd-menu"
38695
+ ]);
38686
38696
  var PtzPresetSchema = external_exports.object({
38687
38697
  id: external_exports.string(),
38688
- name: external_exports.string()
38698
+ name: external_exports.string(),
38699
+ /**
38700
+ * The firmware function this id performs, when the provider KNOWS the id is
38701
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
38702
+ * provider does not recognise -- the two are told apart by `writable`.
38703
+ */
38704
+ fn: PtzPresetFunctionSchema.nullable(),
38705
+ /**
38706
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
38707
+ * it false only for a band it KNOWS is reserved; where the firmware is not
38708
+ * documented it stays true and a refusal comes from the camera, named.
38709
+ */
38710
+ writable: external_exports.boolean()
38689
38711
  });
38690
38712
  var PtzPositionSchema = external_exports.object({
38691
- pan: external_exports.number(),
38692
- tilt: external_exports.number(),
38693
- zoom: external_exports.number()
38713
+ pan: external_exports.number().nullable(),
38714
+ tilt: external_exports.number().nullable(),
38715
+ zoom: external_exports.number().nullable()
38694
38716
  });
38695
38717
  var PtzMoveCommandSchema = external_exports.object({
38696
38718
  pan: external_exports.number().optional(),
@@ -38708,7 +38730,42 @@ var PtzOptionsSchema = external_exports.object({
38708
38730
  maxPresets: external_exports.number().optional(),
38709
38731
  /** Whether the camera exposes a controllable autofocus toggle
38710
38732
  * (boolean `hasX` per the getOptions availability convention). */
38711
- hasAutofocus: external_exports.boolean()
38733
+ hasAutofocus: external_exports.boolean(),
38734
+ /**
38735
+ * How many distinct speeds this camera's NATIVE scale offers.
38736
+ *
38737
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
38738
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
38739
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
38740
+ * meaningless, because it has eight steps and three of them round to the
38741
+ * same one. A loop that tunes its own gain has to know the granularity of
38742
+ * the knob it is turning.
38743
+ *
38744
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
38745
+ * a float). Never a made-up number.
38746
+ */
38747
+ speedSteps: external_exports.number().int().positive().nullable(),
38748
+ /**
38749
+ * How long ONE `move` pulse runs on this driver, ms.
38750
+ *
38751
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
38752
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
38753
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
38754
+ * did the head travel per pulse": without it a measured displacement has no
38755
+ * gain to be divided into.
38756
+ *
38757
+ * `null` = the driver cannot say.
38758
+ */
38759
+ moveImpulseMs: external_exports.number().int().positive().nullable()
38760
+ });
38761
+ var PtzHomePresetSchema = external_exports.object({
38762
+ presetId: external_exports.string().nullable(),
38763
+ source: external_exports.enum([
38764
+ "operator",
38765
+ "firmware",
38766
+ "native",
38767
+ "none"
38768
+ ])
38712
38769
  });
38713
38770
  var ptzCapability = {
38714
38771
  name: "ptz",
@@ -38749,7 +38806,25 @@ var ptzCapability = {
38749
38806
  auth: "admin"
38750
38807
  }),
38751
38808
  getOptions: method(external_exports.object({ deviceId: external_exports.number() }), PtzOptionsSchema),
38809
+ /**
38810
+ * Move to the camera's configured home preset. THROWS when
38811
+ * `getHomePreset()` resolves to `none` -- a head that did not move must
38812
+ * never look like a head that went home.
38813
+ */
38752
38814
  goHome: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), { kind: "mutation" }),
38815
+ /** Which preset `goHome` targets, and who decided it. */
38816
+ getHomePreset: method(external_exports.object({ deviceId: external_exports.number() }), PtzHomePresetSchema),
38817
+ /**
38818
+ * Pin the home preset for this camera. `null` clears the operator's choice
38819
+ * and falls back to whatever the firmware names, or to `none`.
38820
+ */
38821
+ setHomePreset: method(external_exports.object({
38822
+ deviceId: external_exports.number(),
38823
+ presetId: external_exports.string().nullable()
38824
+ }), external_exports.void(), {
38825
+ kind: "mutation",
38826
+ auth: "admin"
38827
+ }),
38753
38828
  /**
38754
38829
  * Pull the current PTZ position. Redundant with the auto-injected
38755
38830
  * `getStatus` method (see `status` below); kept for callers that
@@ -46173,6 +46248,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46173
46248
  addonId: null,
46174
46249
  access: "delete"
46175
46250
  },
46251
+ "ptz.getHomePreset": {
46252
+ capName: "ptz",
46253
+ capScope: "device",
46254
+ addonId: null,
46255
+ access: "view"
46256
+ },
46176
46257
  "ptz.getOptions": {
46177
46258
  capName: "ptz",
46178
46259
  capScope: "device",
@@ -46221,6 +46302,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46221
46302
  addonId: null,
46222
46303
  access: "create"
46223
46304
  },
46305
+ "ptz.setHomePreset": {
46306
+ capName: "ptz",
46307
+ capScope: "device",
46308
+ addonId: null,
46309
+ access: "create"
46310
+ },
46224
46311
  "ptz.stop": {
46225
46312
  capName: "ptz",
46226
46313
  capScope: "device",
@@ -49394,6 +49481,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
49394
49481
  form: "single",
49395
49482
  optional: false
49396
49483
  }],
49484
+ "ptz.getHomePreset": [{
49485
+ name: "deviceId",
49486
+ form: "single",
49487
+ optional: false
49488
+ }],
49397
49489
  "ptz.getOptions": [{
49398
49490
  name: "deviceId",
49399
49491
  form: "single",
@@ -49434,6 +49526,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
49434
49526
  form: "single",
49435
49527
  optional: false
49436
49528
  }],
49529
+ "ptz.setHomePreset": [{
49530
+ name: "deviceId",
49531
+ form: "single",
49532
+ optional: false
49533
+ }],
49437
49534
  "ptz.stop": [{
49438
49535
  name: "deviceId",
49439
49536
  form: "single",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-MXBN3QZ5.js";
4
+ } from "./chunk-AWHVFK2L.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-AYZZUJZ6.js");
41
+ await import("./launcher-PSI434KW.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-AYZZUJZ6.js");
86
+ await import("./launcher-PSI434KW.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-7R72RWAY.js");
1143
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-BCCPZRN4.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-MXBN3QZ5.js";
8
+ } from "./chunk-AWHVFK2L.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-DluLUTzR.js
23746
- var require_dist_DluLUTzR = __commonJS({
23747
- "../system/dist/dist-DluLUTzR.js"(exports) {
23745
+ // ../system/dist/dist-BW7x4kAI.js
23746
+ var require_dist_BW7x4kAI = __commonJS({
23747
+ "../system/dist/dist-BW7x4kAI.js"(exports) {
23748
23748
  "use strict";
23749
23749
  var zod = require_zod();
23750
23750
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -49358,14 +49358,36 @@ var require_dist_DluLUTzR = __commonJS({
49358
49358
  * whether persisting is worth a SQLite commit. */
49359
49359
  volatileStateFields: ["lastFetchedAt"]
49360
49360
  };
49361
+ var PtzPresetFunctionSchema = zod.z.enum([
49362
+ "home",
49363
+ "day-mode",
49364
+ "night-mode",
49365
+ "day-night-auto",
49366
+ "set-limits",
49367
+ "save-limits",
49368
+ "reboot",
49369
+ "osd-menu"
49370
+ ]);
49361
49371
  var PtzPresetSchema = zod.z.object({
49362
49372
  id: zod.z.string(),
49363
- name: zod.z.string()
49373
+ name: zod.z.string(),
49374
+ /**
49375
+ * The firmware function this id performs, when the provider KNOWS the id is
49376
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
49377
+ * provider does not recognise -- the two are told apart by `writable`.
49378
+ */
49379
+ fn: PtzPresetFunctionSchema.nullable(),
49380
+ /**
49381
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
49382
+ * it false only for a band it KNOWS is reserved; where the firmware is not
49383
+ * documented it stays true and a refusal comes from the camera, named.
49384
+ */
49385
+ writable: zod.z.boolean()
49364
49386
  });
49365
49387
  var PtzPositionSchema = zod.z.object({
49366
- pan: zod.z.number(),
49367
- tilt: zod.z.number(),
49368
- zoom: zod.z.number()
49388
+ pan: zod.z.number().nullable(),
49389
+ tilt: zod.z.number().nullable(),
49390
+ zoom: zod.z.number().nullable()
49369
49391
  });
49370
49392
  var PtzMoveCommandSchema = zod.z.object({
49371
49393
  pan: zod.z.number().optional(),
@@ -49383,7 +49405,42 @@ var require_dist_DluLUTzR = __commonJS({
49383
49405
  maxPresets: zod.z.number().optional(),
49384
49406
  /** Whether the camera exposes a controllable autofocus toggle
49385
49407
  * (boolean `hasX` per the getOptions availability convention). */
49386
- hasAutofocus: zod.z.boolean()
49408
+ hasAutofocus: zod.z.boolean(),
49409
+ /**
49410
+ * How many distinct speeds this camera's NATIVE scale offers.
49411
+ *
49412
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
49413
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
49414
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
49415
+ * meaningless, because it has eight steps and three of them round to the
49416
+ * same one. A loop that tunes its own gain has to know the granularity of
49417
+ * the knob it is turning.
49418
+ *
49419
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
49420
+ * a float). Never a made-up number.
49421
+ */
49422
+ speedSteps: zod.z.number().int().positive().nullable(),
49423
+ /**
49424
+ * How long ONE `move` pulse runs on this driver, ms.
49425
+ *
49426
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
49427
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
49428
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
49429
+ * did the head travel per pulse": without it a measured displacement has no
49430
+ * gain to be divided into.
49431
+ *
49432
+ * `null` = the driver cannot say.
49433
+ */
49434
+ moveImpulseMs: zod.z.number().int().positive().nullable()
49435
+ });
49436
+ var PtzHomePresetSchema = zod.z.object({
49437
+ presetId: zod.z.string().nullable(),
49438
+ source: zod.z.enum([
49439
+ "operator",
49440
+ "firmware",
49441
+ "native",
49442
+ "none"
49443
+ ])
49387
49444
  });
49388
49445
  var ptzCapability = {
49389
49446
  name: "ptz",
@@ -49424,7 +49481,25 @@ var require_dist_DluLUTzR = __commonJS({
49424
49481
  auth: "admin"
49425
49482
  }),
49426
49483
  getOptions: method(zod.z.object({ deviceId: zod.z.number() }), PtzOptionsSchema),
49484
+ /**
49485
+ * Move to the camera's configured home preset. THROWS when
49486
+ * `getHomePreset()` resolves to `none` -- a head that did not move must
49487
+ * never look like a head that went home.
49488
+ */
49427
49489
  goHome: method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
49490
+ /** Which preset `goHome` targets, and who decided it. */
49491
+ getHomePreset: method(zod.z.object({ deviceId: zod.z.number() }), PtzHomePresetSchema),
49492
+ /**
49493
+ * Pin the home preset for this camera. `null` clears the operator's choice
49494
+ * and falls back to whatever the firmware names, or to `none`.
49495
+ */
49496
+ setHomePreset: method(zod.z.object({
49497
+ deviceId: zod.z.number(),
49498
+ presetId: zod.z.string().nullable()
49499
+ }), zod.z.void(), {
49500
+ kind: "mutation",
49501
+ auth: "admin"
49502
+ }),
49428
49503
  /**
49429
49504
  * Pull the current PTZ position. Redundant with the auto-injected
49430
49505
  * `getStatus` method (see `status` below); kept for callers that
@@ -57678,6 +57753,12 @@ var require_dist_DluLUTzR = __commonJS({
57678
57753
  addonId: null,
57679
57754
  access: "delete"
57680
57755
  },
57756
+ "ptz.getHomePreset": {
57757
+ capName: "ptz",
57758
+ capScope: "device",
57759
+ addonId: null,
57760
+ access: "view"
57761
+ },
57681
57762
  "ptz.getOptions": {
57682
57763
  capName: "ptz",
57683
57764
  capScope: "device",
@@ -57726,6 +57807,12 @@ var require_dist_DluLUTzR = __commonJS({
57726
57807
  addonId: null,
57727
57808
  access: "create"
57728
57809
  },
57810
+ "ptz.setHomePreset": {
57811
+ capName: "ptz",
57812
+ capScope: "device",
57813
+ addonId: null,
57814
+ access: "create"
57815
+ },
57729
57816
  "ptz.stop": {
57730
57817
  capName: "ptz",
57731
57818
  capScope: "device",
@@ -60899,6 +60986,11 @@ var require_dist_DluLUTzR = __commonJS({
60899
60986
  form: "single",
60900
60987
  optional: false
60901
60988
  }],
60989
+ "ptz.getHomePreset": [{
60990
+ name: "deviceId",
60991
+ form: "single",
60992
+ optional: false
60993
+ }],
60902
60994
  "ptz.getOptions": [{
60903
60995
  name: "deviceId",
60904
60996
  form: "single",
@@ -60939,6 +61031,11 @@ var require_dist_DluLUTzR = __commonJS({
60939
61031
  form: "single",
60940
61032
  optional: false
60941
61033
  }],
61034
+ "ptz.setHomePreset": [{
61035
+ name: "deviceId",
61036
+ form: "single",
61037
+ optional: false
61038
+ }],
60942
61039
  "ptz.stop": [{
60943
61040
  name: "deviceId",
60944
61041
  form: "single",
@@ -62966,7 +63063,7 @@ var require_alerts_addon = __commonJS({
62966
63063
  [Symbol.toStringTag]: { value: "Module" }
62967
63064
  });
62968
63065
  require_chunk_Cek0wNdY();
62969
- var require_dist10 = require_dist_DluLUTzR();
63066
+ var require_dist10 = require_dist_BW7x4kAI();
62970
63067
  function selectExpired(alerts, cutoffMs) {
62971
63068
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
62972
63069
  }
@@ -63785,7 +63882,7 @@ var require_console_logging = __commonJS({
63785
63882
  [Symbol.toStringTag]: { value: "Module" }
63786
63883
  });
63787
63884
  require_chunk_Cek0wNdY();
63788
- var require_dist10 = require_dist_DluLUTzR();
63885
+ var require_dist10 = require_dist_BW7x4kAI();
63789
63886
  var require_formatter = require_formatter_DqAKDlvN();
63790
63887
  var LEVEL_RANK = {
63791
63888
  debug: 0,
@@ -63879,7 +63976,7 @@ var require_core_blocks_addon = __commonJS({
63879
63976
  "use strict";
63880
63977
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
63881
63978
  var require_chunk = require_chunk_Cek0wNdY();
63882
- var require_dist10 = require_dist_DluLUTzR();
63979
+ var require_dist10 = require_dist_BW7x4kAI();
63883
63980
  var node_crypto = __require("crypto");
63884
63981
  var node_fs_promises = __require("fs/promises");
63885
63982
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -64776,11 +64873,11 @@ var require_core_blocks = __commonJS({
64776
64873
  }
64777
64874
  });
64778
64875
 
64779
- // ../system/dist/retired-settings-keys-VcrnwKN0.js
64780
- var require_retired_settings_keys_VcrnwKN0 = __commonJS({
64781
- "../system/dist/retired-settings-keys-VcrnwKN0.js"(exports) {
64876
+ // ../system/dist/retired-settings-keys-CeaYCDU4.js
64877
+ var require_retired_settings_keys_CeaYCDU4 = __commonJS({
64878
+ "../system/dist/retired-settings-keys-CeaYCDU4.js"(exports) {
64782
64879
  "use strict";
64783
- var require_dist10 = require_dist_DluLUTzR();
64880
+ var require_dist10 = require_dist_BW7x4kAI();
64784
64881
  function settingsStoreIsAuthoritativeHere(env) {
64785
64882
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
64786
64883
  return raw === "" || raw === "hub";
@@ -65060,9 +65157,9 @@ var require_retired_settings_keys_VcrnwKN0 = __commonJS({
65060
65157
  }
65061
65158
  });
65062
65159
 
65063
- // ../types/dist/canonical-hash-9lydiEzx.js
65064
- var require_canonical_hash_9lydiEzx = __commonJS({
65065
- "../types/dist/canonical-hash-9lydiEzx.js"(exports) {
65160
+ // ../types/dist/canonical-hash-CZ2JqJc3.js
65161
+ var require_canonical_hash_CZ2JqJc3 = __commonJS({
65162
+ "../types/dist/canonical-hash-CZ2JqJc3.js"(exports) {
65066
65163
  "use strict";
65067
65164
  var node_crypto = __require("crypto");
65068
65165
  var AUDIO_ENCODER_BY_CODEC = {
@@ -65114,7 +65211,27 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65114
65211
  args.push("-i", input.url);
65115
65212
  return args;
65116
65213
  }
65117
- function buildVideoFilterArgs(scale, outputArgs) {
65214
+ function resolveStreamMaps(selection) {
65215
+ const graph = selection.filterGraph;
65216
+ if (graph) return {
65217
+ video: `[${graph.videoOutLabel}]`,
65218
+ audio: graph.audioOutLabel ? `[${graph.audioOutLabel}]` : "0:a:0?"
65219
+ };
65220
+ if (selection.extraInputs?.length) return {
65221
+ video: "0:v:0",
65222
+ audio: "0:a:0?"
65223
+ };
65224
+ return {
65225
+ video: null,
65226
+ audio: null
65227
+ };
65228
+ }
65229
+ function buildVideoFilterArgs(scale, outputArgs, filterGraph) {
65230
+ if (filterGraph) {
65231
+ if (scale) throw new Error("FfmpegInvocation: video.scale cannot be combined with a filter graph \u2014 scale inside the graph instead (the -vf would feed an output the graph already feeds)");
65232
+ if (outputArgs.some((a) => a === "-vf")) throw new Error("FfmpegInvocation: outputArgs carries a -vf while a filter graph feeds the same output \u2014 fold the filter into the graph");
65233
+ return [];
65234
+ }
65118
65235
  if (!scale) return [];
65119
65236
  if (outputArgs.some((a) => a === "-vf")) return [];
65120
65237
  if (scale.mode === "exact") return ["-vf", `scale=${scale.width}:${scale.height}`];
@@ -65136,14 +65253,17 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65136
65253
  `${bufsize}k`
65137
65254
  ];
65138
65255
  }
65139
- function buildVideoArgs(video, outputArgs) {
65140
- if (video.kind === "copy") return [
65141
- "-c:v",
65142
- "copy",
65143
- ...video.bitstreamFilter ? ["-bsf:v", video.bitstreamFilter] : []
65144
- ];
65256
+ function buildVideoArgs(video, outputArgs, filterGraph) {
65257
+ if (video.kind === "copy") {
65258
+ if (filterGraph) throw new Error("FfmpegInvocation: a filter graph produces a NEW picture, so video.kind must be `encode`");
65259
+ return [
65260
+ "-c:v",
65261
+ "copy",
65262
+ ...video.bitstreamFilter ? ["-bsf:v", video.bitstreamFilter] : []
65263
+ ];
65264
+ }
65145
65265
  const args = [
65146
- ...buildVideoFilterArgs(video.scale, outputArgs),
65266
+ ...buildVideoFilterArgs(video.scale, outputArgs, filterGraph),
65147
65267
  "-c:v",
65148
65268
  video.encoder
65149
65269
  ];
@@ -65234,14 +65354,23 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65234
65354
  ];
65235
65355
  }
65236
65356
  function buildFfmpegArgs(inv) {
65237
- const head = [...logBannerArgs(inv.logLevel), ...buildInputArgs(inv.input, inv.decodeHwAccel)];
65357
+ const graph = inv.filterGraph ?? null;
65358
+ const head = [
65359
+ ...logBannerArgs(inv.logLevel),
65360
+ ...buildInputArgs(inv.input, inv.decodeHwAccel),
65361
+ ...(inv.extraInputs ?? []).flatMap((extra) => buildInputArgs(extra, inv.decodeHwAccel)),
65362
+ ...graph ? ["-filter_complex", graph.graph] : []
65363
+ ];
65238
65364
  const threadArgs = inv.threadCount > 0 ? ["-threads", String(inv.threadCount)] : [];
65365
+ const maps = resolveStreamMaps(inv);
65366
+ const videoMapArgs = maps.video ? ["-map", maps.video] : [];
65367
+ const audioMapArgs = maps.audio ? ["-map", maps.audio] : [];
65239
65368
  if (inv.sink.kind === "rtp-outputs") {
65240
65369
  const videoLeg = inv.sink.video ? [
65241
65370
  "-an",
65242
65371
  "-map",
65243
- "0:v:0",
65244
- ...buildVideoArgs(inv.video, inv.outputArgs),
65372
+ maps.video ?? "0:v:0",
65373
+ ...buildVideoArgs(inv.video, inv.outputArgs, graph),
65245
65374
  ...threadArgs,
65246
65375
  ...inv.outputArgs,
65247
65376
  ...buildRtpOutputArgs(inv.sink.video)
@@ -65249,7 +65378,7 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65249
65378
  const audioLeg = inv.sink.audio ? [
65250
65379
  "-vn",
65251
65380
  "-map",
65252
- "0:a:0?",
65381
+ maps.audio ?? "0:a:0?",
65253
65382
  ...buildAudioArgs(inv.audio),
65254
65383
  ...buildRtpOutputArgs(inv.sink.audio)
65255
65384
  ] : [];
@@ -65259,15 +65388,17 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65259
65388
  ...audioLeg
65260
65389
  ];
65261
65390
  }
65391
+ const mutedAudio = isElementaryVideoSink(inv.sink) || inv.audio.kind === "none";
65262
65392
  const audioArgs = isElementaryVideoSink(inv.sink) ? ["-an"] : buildAudioArgs(inv.audio);
65263
- const sinkArgs = buildStdoutOrRtspSinkArgs(inv.sink);
65264
65393
  return [
65265
65394
  ...head,
65266
- ...buildVideoArgs(inv.video, inv.outputArgs),
65395
+ ...videoMapArgs,
65396
+ ...buildVideoArgs(inv.video, inv.outputArgs, graph),
65267
65397
  ...threadArgs,
65398
+ ...mutedAudio ? [] : audioMapArgs,
65268
65399
  ...audioArgs,
65269
65400
  ...inv.outputArgs,
65270
- ...sinkArgs,
65401
+ ...buildStdoutOrRtspSinkArgs(inv.sink),
65271
65402
  ...inv.audioSidecar ? buildAudioSidecarArgs(inv.audioSidecar) : []
65272
65403
  ];
65273
65404
  }
@@ -65618,6 +65749,12 @@ var require_canonical_hash_9lydiEzx = __commonJS({
65618
65749
  return pickVideoEncoder;
65619
65750
  }
65620
65751
  });
65752
+ Object.defineProperty(exports, "resolveStreamMaps", {
65753
+ enumerable: true,
65754
+ get: function() {
65755
+ return resolveStreamMaps;
65756
+ }
65757
+ });
65621
65758
  }
65622
65759
  });
65623
65760
 
@@ -65664,7 +65801,7 @@ var require_node = __commonJS({
65664
65801
  value: mod,
65665
65802
  enumerable: true
65666
65803
  }) : target, mod));
65667
- var require_canonical_hash = require_canonical_hash_9lydiEzx();
65804
+ var require_canonical_hash = require_canonical_hash_CZ2JqJc3();
65668
65805
  var require_err_msg = require_err_msg_COpsHMw2();
65669
65806
  var node_crypto = __require("crypto");
65670
65807
  var node_fs = __require("fs");
@@ -67017,8 +67154,8 @@ var require_device_manager_addon = __commonJS({
67017
67154
  [Symbol.toStringTag]: { value: "Module" }
67018
67155
  });
67019
67156
  require_chunk_Cek0wNdY();
67020
- var require_dist10 = require_dist_DluLUTzR();
67021
- var require_retired_settings_keys = require_retired_settings_keys_VcrnwKN0();
67157
+ var require_dist10 = require_dist_BW7x4kAI();
67158
+ var require_retired_settings_keys = require_retired_settings_keys_CeaYCDU4();
67022
67159
  var node_crypto = __require("crypto");
67023
67160
  var _camstack_types_node = require_node();
67024
67161
  var JOB_HISTORY = 20;
@@ -73026,7 +73163,7 @@ var require_hub_forwarder = __commonJS({
73026
73163
  [Symbol.toStringTag]: { value: "Module" }
73027
73164
  });
73028
73165
  require_chunk_Cek0wNdY();
73029
- var require_dist10 = require_dist_DluLUTzR();
73166
+ var require_dist10 = require_dist_BW7x4kAI();
73030
73167
  var require_formatter = require_formatter_DqAKDlvN();
73031
73168
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
73032
73169
  var HubForwarderDestination = class {
@@ -73163,7 +73300,7 @@ var require_liveness_monitor_addon = __commonJS({
73163
73300
  "use strict";
73164
73301
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
73165
73302
  require_chunk_Cek0wNdY();
73166
- var require_dist10 = require_dist_DluLUTzR();
73303
+ var require_dist10 = require_dist_BW7x4kAI();
73167
73304
  var NO_DEVICES = "liveness:no-devices";
73168
73305
  var ALL_OFFLINE = "liveness:all-devices-offline";
73169
73306
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -73359,7 +73496,7 @@ var require_local_auth_addon = __commonJS({
73359
73496
  [Symbol.toStringTag]: { value: "Module" }
73360
73497
  });
73361
73498
  var require_chunk = require_chunk_Cek0wNdY();
73362
- var require_dist10 = require_dist_DluLUTzR();
73499
+ var require_dist10 = require_dist_BW7x4kAI();
73363
73500
  var node_crypto = __require("crypto");
73364
73501
  node_crypto = require_chunk.__toESM(node_crypto);
73365
73502
  var crypto$1 = __require("crypto");
@@ -81172,7 +81309,7 @@ var require_loki_logging = __commonJS({
81172
81309
  [Symbol.toStringTag]: { value: "Module" }
81173
81310
  });
81174
81311
  require_chunk_Cek0wNdY();
81175
- var require_dist10 = require_dist_DluLUTzR();
81312
+ var require_dist10 = require_dist_BW7x4kAI();
81176
81313
  function sanitizeLabelName(raw) {
81177
81314
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
81178
81315
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -81759,7 +81896,7 @@ var require_native_metrics_addon = __commonJS({
81759
81896
  [Symbol.toStringTag]: { value: "Module" }
81760
81897
  });
81761
81898
  var require_chunk = require_chunk_Cek0wNdY();
81762
- var require_dist10 = require_dist_DluLUTzR();
81899
+ var require_dist10 = require_dist_BW7x4kAI();
81763
81900
  var node_fs_promises = __require("fs/promises");
81764
81901
  var node_fs = __require("fs");
81765
81902
  node_fs = require_chunk.__toESM(node_fs);
@@ -84512,7 +84649,7 @@ var require_filesystem_storage_addon = __commonJS({
84512
84649
  [Symbol.toStringTag]: { value: "Module" }
84513
84650
  });
84514
84651
  var require_chunk = require_chunk_Cek0wNdY();
84515
- var require_dist10 = require_dist_DluLUTzR();
84652
+ var require_dist10 = require_dist_BW7x4kAI();
84516
84653
  var node_crypto = __require("crypto");
84517
84654
  var node_fs_promises = __require("fs/promises");
84518
84655
  var node_path = __require("path");
@@ -85739,8 +85876,8 @@ var require_sqlite_settings_addon = __commonJS({
85739
85876
  [Symbol.toStringTag]: { value: "Module" }
85740
85877
  });
85741
85878
  var require_chunk = require_chunk_Cek0wNdY();
85742
- var require_dist10 = require_dist_DluLUTzR();
85743
- var require_retired_settings_keys = require_retired_settings_keys_VcrnwKN0();
85879
+ var require_dist10 = require_dist_BW7x4kAI();
85880
+ var require_retired_settings_keys = require_retired_settings_keys_CeaYCDU4();
85744
85881
  var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
85745
85882
  var node_crypto = __require("crypto");
85746
85883
  var node_path = __require("path");
@@ -88527,7 +88664,7 @@ var require_storage_orchestrator_addon = __commonJS({
88527
88664
  [Symbol.toStringTag]: { value: "Module" }
88528
88665
  });
88529
88666
  var require_chunk = require_chunk_Cek0wNdY();
88530
- var require_dist10 = require_dist_DluLUTzR();
88667
+ var require_dist10 = require_dist_BW7x4kAI();
88531
88668
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
88532
88669
  var zod = require_zod();
88533
88670
  var node_crypto = __require("crypto");
@@ -92254,7 +92391,7 @@ var require_system_config_addon = __commonJS({
92254
92391
  [Symbol.toStringTag]: { value: "Module" }
92255
92392
  });
92256
92393
  require_chunk_Cek0wNdY();
92257
- var require_dist10 = require_dist_DluLUTzR();
92394
+ var require_dist10 = require_dist_BW7x4kAI();
92258
92395
  var SECTION_TITLES = {
92259
92396
  server: "Server",
92260
92397
  auth: "Authentication"
@@ -110315,7 +110452,7 @@ var require_winston_logging = __commonJS({
110315
110452
  [Symbol.toStringTag]: { value: "Module" }
110316
110453
  });
110317
110454
  var require_chunk = require_chunk_Cek0wNdY();
110318
- var require_dist10 = require_dist_DluLUTzR();
110455
+ var require_dist10 = require_dist_BW7x4kAI();
110319
110456
  var require_formatter = require_formatter_DqAKDlvN();
110320
110457
  var node_path = __require("path");
110321
110458
  node_path = require_chunk.__toESM(node_path);
@@ -112353,9 +112490,9 @@ var require_event_category_BVfsrBYA = __commonJS({
112353
112490
  }
112354
112491
  });
112355
112492
 
112356
- // ../types/dist/sleep-DqtlfkSS.js
112357
- var require_sleep_DqtlfkSS = __commonJS({
112358
- "../types/dist/sleep-DqtlfkSS.js"(exports) {
112493
+ // ../types/dist/sleep-BAAUFDCk.js
112494
+ var require_sleep_BAAUFDCk = __commonJS({
112495
+ "../types/dist/sleep-BAAUFDCk.js"(exports) {
112359
112496
  "use strict";
112360
112497
  var require_event_category = require_event_category_BVfsrBYA();
112361
112498
  var zod = require_zod();
@@ -115258,6 +115395,8 @@ var require_sleep_DqtlfkSS = __commonJS({
115258
115395
  deletePreset: (input) => dispatch("ptz", "ptz", "deletePreset", "mutation", input),
115259
115396
  getOptions: (input) => dispatch("ptz", "ptz", "getOptions", "query", input),
115260
115397
  goHome: (input) => dispatch("ptz", "ptz", "goHome", "mutation", input),
115398
+ getHomePreset: (input) => dispatch("ptz", "ptz", "getHomePreset", "query", input),
115399
+ setHomePreset: (input) => dispatch("ptz", "ptz", "setHomePreset", "mutation", input),
115261
115400
  getPosition: (input) => dispatch("ptz", "ptz", "getPosition", "query", input),
115262
115401
  setAutofocus: (input) => dispatch("ptz", "ptz", "setAutofocus", "mutation", input),
115263
115402
  getStatus: (input) => dispatch("ptz", "ptz", "getStatus", "query", input)
@@ -116256,7 +116395,7 @@ var require_addon = __commonJS({
116256
116395
  "../types/dist/addon.js"(exports) {
116257
116396
  "use strict";
116258
116397
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
116259
- var require_sleep = require_sleep_DqtlfkSS();
116398
+ var require_sleep = require_sleep_BAAUFDCk();
116260
116399
  var require_event_category = require_event_category_BVfsrBYA();
116261
116400
  var require_err_msg = require_err_msg_COpsHMw2();
116262
116401
  var CAP_INPUT_DEFAULTS = Object.freeze({
@@ -136582,7 +136721,7 @@ var require_dist3 = __commonJS({
136582
136721
  "use strict";
136583
136722
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
136584
136723
  var require_chunk = require_chunk_Cek0wNdY();
136585
- var require_dist10 = require_dist_DluLUTzR();
136724
+ var require_dist10 = require_dist_BW7x4kAI();
136586
136725
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
136587
136726
  require_alerts();
136588
136727
  var require_formatter = require_formatter_DqAKDlvN();
@@ -217746,9 +217885,9 @@ var require_dist4 = __commonJS({
217746
217885
  "../types/dist/index.js"(exports) {
217747
217886
  "use strict";
217748
217887
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
217749
- var require_sleep = require_sleep_DqtlfkSS();
217888
+ var require_sleep = require_sleep_BAAUFDCk();
217750
217889
  var require_event_category = require_event_category_BVfsrBYA();
217751
- var require_canonical_hash = require_canonical_hash_9lydiEzx();
217890
+ var require_canonical_hash = require_canonical_hash_CZ2JqJc3();
217752
217891
  var require_enums2 = require_enums();
217753
217892
  var require_err_msg = require_err_msg_COpsHMw2();
217754
217893
  var zod = require_zod();
@@ -244555,14 +244694,36 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
244555
244694
  if (profiles.length === 0) return null;
244556
244695
  return profiles.some((p) => p.audioEnabled);
244557
244696
  }
244697
+ var PtzPresetFunctionSchema = zod.z.enum([
244698
+ "home",
244699
+ "day-mode",
244700
+ "night-mode",
244701
+ "day-night-auto",
244702
+ "set-limits",
244703
+ "save-limits",
244704
+ "reboot",
244705
+ "osd-menu"
244706
+ ]);
244558
244707
  var PtzPresetSchema = zod.z.object({
244559
244708
  id: zod.z.string(),
244560
- name: zod.z.string()
244709
+ name: zod.z.string(),
244710
+ /**
244711
+ * The firmware function this id performs, when the provider KNOWS the id is
244712
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
244713
+ * provider does not recognise -- the two are told apart by `writable`.
244714
+ */
244715
+ fn: PtzPresetFunctionSchema.nullable(),
244716
+ /**
244717
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
244718
+ * it false only for a band it KNOWS is reserved; where the firmware is not
244719
+ * documented it stays true and a refusal comes from the camera, named.
244720
+ */
244721
+ writable: zod.z.boolean()
244561
244722
  });
244562
244723
  var PtzPositionSchema = zod.z.object({
244563
- pan: zod.z.number(),
244564
- tilt: zod.z.number(),
244565
- zoom: zod.z.number()
244724
+ pan: zod.z.number().nullable(),
244725
+ tilt: zod.z.number().nullable(),
244726
+ zoom: zod.z.number().nullable()
244566
244727
  });
244567
244728
  var PtzMoveCommandSchema = zod.z.object({
244568
244729
  pan: zod.z.number().optional(),
@@ -244580,7 +244741,42 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
244580
244741
  maxPresets: zod.z.number().optional(),
244581
244742
  /** Whether the camera exposes a controllable autofocus toggle
244582
244743
  * (boolean `hasX` per the getOptions availability convention). */
244583
- hasAutofocus: zod.z.boolean()
244744
+ hasAutofocus: zod.z.boolean(),
244745
+ /**
244746
+ * How many distinct speeds this camera's NATIVE scale offers.
244747
+ *
244748
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
244749
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
244750
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
244751
+ * meaningless, because it has eight steps and three of them round to the
244752
+ * same one. A loop that tunes its own gain has to know the granularity of
244753
+ * the knob it is turning.
244754
+ *
244755
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
244756
+ * a float). Never a made-up number.
244757
+ */
244758
+ speedSteps: zod.z.number().int().positive().nullable(),
244759
+ /**
244760
+ * How long ONE `move` pulse runs on this driver, ms.
244761
+ *
244762
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
244763
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
244764
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
244765
+ * did the head travel per pulse": without it a measured displacement has no
244766
+ * gain to be divided into.
244767
+ *
244768
+ * `null` = the driver cannot say.
244769
+ */
244770
+ moveImpulseMs: zod.z.number().int().positive().nullable()
244771
+ });
244772
+ var PtzHomePresetSchema = zod.z.object({
244773
+ presetId: zod.z.string().nullable(),
244774
+ source: zod.z.enum([
244775
+ "operator",
244776
+ "firmware",
244777
+ "native",
244778
+ "none"
244779
+ ])
244584
244780
  });
244585
244781
  var ptzCapability = {
244586
244782
  name: "ptz",
@@ -244621,7 +244817,25 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
244621
244817
  auth: "admin"
244622
244818
  }),
244623
244819
  getOptions: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), PtzOptionsSchema),
244820
+ /**
244821
+ * Move to the camera's configured home preset. THROWS when
244822
+ * `getHomePreset()` resolves to `none` -- a head that did not move must
244823
+ * never look like a head that went home.
244824
+ */
244624
244825
  goHome: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
244826
+ /** Which preset `goHome` targets, and who decided it. */
244827
+ getHomePreset: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), PtzHomePresetSchema),
244828
+ /**
244829
+ * Pin the home preset for this camera. `null` clears the operator's choice
244830
+ * and falls back to whatever the firmware names, or to `none`.
244831
+ */
244832
+ setHomePreset: require_sleep.method(zod.z.object({
244833
+ deviceId: zod.z.number(),
244834
+ presetId: zod.z.string().nullable()
244835
+ }), zod.z.void(), {
244836
+ kind: "mutation",
244837
+ auth: "admin"
244838
+ }),
244625
244839
  /**
244626
244840
  * Pull the current PTZ position. Redundant with the auto-injected
244627
244841
  * `getStatus` method (see `status` below); kept for callers that
@@ -256249,6 +256463,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256249
256463
  addonId: null,
256250
256464
  access: "delete"
256251
256465
  },
256466
+ "ptz.getHomePreset": {
256467
+ capName: "ptz",
256468
+ capScope: "device",
256469
+ addonId: null,
256470
+ access: "view"
256471
+ },
256252
256472
  "ptz.getOptions": {
256253
256473
  capName: "ptz",
256254
256474
  capScope: "device",
@@ -256297,6 +256517,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256297
256517
  addonId: null,
256298
256518
  access: "create"
256299
256519
  },
256520
+ "ptz.setHomePreset": {
256521
+ capName: "ptz",
256522
+ capScope: "device",
256523
+ addonId: null,
256524
+ access: "create"
256525
+ },
256300
256526
  "ptz.stop": {
256301
256527
  capName: "ptz",
256302
256528
  capScope: "device",
@@ -259736,6 +259962,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
259736
259962
  form: "single",
259737
259963
  optional: false
259738
259964
  }],
259965
+ "ptz.getHomePreset": [{
259966
+ name: "deviceId",
259967
+ form: "single",
259968
+ optional: false
259969
+ }],
259739
259970
  "ptz.getOptions": [{
259740
259971
  name: "deviceId",
259741
259972
  form: "single",
@@ -259776,6 +260007,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
259776
260007
  form: "single",
259777
260008
  optional: false
259778
260009
  }],
260010
+ "ptz.setHomePreset": [{
260011
+ name: "deviceId",
260012
+ form: "single",
260013
+ optional: false
260014
+ }],
259779
260015
  "ptz.stop": [{
259780
260016
  name: "deviceId",
259781
260017
  form: "single",
@@ -264925,9 +265161,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
264925
265161
  exports.PtzAutotrackSettingsSchema = PtzAutotrackSettingsSchema;
264926
265162
  exports.PtzAutotrackStatusSchema = PtzAutotrackStatusSchema;
264927
265163
  exports.PtzAutotrackTargetOptionSchema = PtzAutotrackTargetOptionSchema;
265164
+ exports.PtzHomePresetSchema = PtzHomePresetSchema;
264928
265165
  exports.PtzMoveCommandSchema = PtzMoveCommandSchema;
264929
265166
  exports.PtzOptionsSchema = PtzOptionsSchema;
264930
265167
  exports.PtzPositionSchema = PtzPositionSchema;
265168
+ exports.PtzPresetFunctionSchema = PtzPresetFunctionSchema;
264931
265169
  exports.PtzPresetSchema = PtzPresetSchema;
264932
265170
  exports.PtzStatusSchema = PtzStatusSchema;
264933
265171
  exports.QueryFilterSchema = QueryFilterSchema;
@@ -265648,6 +265886,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
265648
265886
  exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
265649
265887
  exports.resolveRecordingProfiles = resolveRecordingProfiles;
265650
265888
  exports.resolveRunnerId = resolveRunnerId;
265889
+ exports.resolveStreamMaps = require_canonical_hash.resolveStreamMaps;
265651
265890
  exports.resolveVariantModelId = resolveVariantModelId;
265652
265891
  exports.resolveViewableDeviceIds = resolveViewableDeviceIds;
265653
265892
  exports.roleSpec = roleSpec;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.167",
3
+ "version": "1.2.168",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",