camstack 1.2.29 → 1.2.31

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.
@@ -28610,6 +28610,14 @@ var ClipSchema = external_exports.object({
28610
28610
  endMs: external_exports.number()
28611
28611
  }),
28612
28612
  /**
28613
+ * Distinct object classes attached to this visit (`person`, `car`, …),
28614
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
28615
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
28616
+ * did not. Absent (never empty) when the visit attached no classified object
28617
+ * event, so a motion/audio-only visit keeps its kind label.
28618
+ */
28619
+ labels: external_exports.array(external_exports.string()).max(3).optional(),
28620
+ /**
28613
28621
  * Lazy thumbnail URL, never inlined.
28614
28622
  *
28615
28623
  * Recording-derived clips (events-mode keep-window, and the prepared
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-LH2PIENV.js";
4
+ } from "./chunk-UCPOTU23.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-MEE5XESN.js");
41
+ await import("./launcher-PT4JLGCT.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-MEE5XESN.js");
86
+ await import("./launcher-PT4JLGCT.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-LPBV7MTE.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-3RXB46IL.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  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-LH2PIENV.js";
8
+ } from "./chunk-UCPOTU23.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -23631,9 +23631,9 @@ var require_zod = __commonJS({
23631
23631
  }
23632
23632
  });
23633
23633
 
23634
- // ../system/dist/dist-DR1VmGz6.js
23635
- var require_dist_DR1VmGz6 = __commonJS({
23636
- "../system/dist/dist-DR1VmGz6.js"(exports) {
23634
+ // ../system/dist/dist-CB2eCKJb.js
23635
+ var require_dist_CB2eCKJb = __commonJS({
23636
+ "../system/dist/dist-CB2eCKJb.js"(exports) {
23637
23637
  "use strict";
23638
23638
  var zod = require_zod();
23639
23639
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -38892,6 +38892,14 @@ var require_dist_DR1VmGz6 = __commonJS({
38892
38892
  endMs: zod.z.number()
38893
38893
  }),
38894
38894
  /**
38895
+ * Distinct object classes attached to this visit (`person`, `car`, …),
38896
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
38897
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
38898
+ * did not. Absent (never empty) when the visit attached no classified object
38899
+ * event, so a motion/audio-only visit keeps its kind label.
38900
+ */
38901
+ labels: zod.z.array(zod.z.string()).max(3).optional(),
38902
+ /**
38895
38903
  * Lazy thumbnail URL, never inlined.
38896
38904
  *
38897
38905
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -56075,7 +56083,7 @@ var require_alerts_addon = __commonJS({
56075
56083
  [Symbol.toStringTag]: { value: "Module" }
56076
56084
  });
56077
56085
  require_chunk_Cek0wNdY();
56078
- var require_dist10 = require_dist_DR1VmGz6();
56086
+ var require_dist10 = require_dist_CB2eCKJb();
56079
56087
  function selectExpired(alerts, cutoffMs) {
56080
56088
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
56081
56089
  }
@@ -56888,7 +56896,7 @@ var require_console_logging = __commonJS({
56888
56896
  [Symbol.toStringTag]: { value: "Module" }
56889
56897
  });
56890
56898
  require_chunk_Cek0wNdY();
56891
- var require_dist10 = require_dist_DR1VmGz6();
56899
+ var require_dist10 = require_dist_CB2eCKJb();
56892
56900
  var require_formatter = require_formatter_DqAKDlvN();
56893
56901
  var LEVEL_RANK = {
56894
56902
  debug: 0,
@@ -56982,7 +56990,7 @@ var require_core_blocks_addon = __commonJS({
56982
56990
  "use strict";
56983
56991
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
56984
56992
  var require_chunk = require_chunk_Cek0wNdY();
56985
- var require_dist10 = require_dist_DR1VmGz6();
56993
+ var require_dist10 = require_dist_CB2eCKJb();
56986
56994
  var node_crypto = __require("crypto");
56987
56995
  var node_fs_promises = __require("fs/promises");
56988
56996
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -59702,7 +59710,7 @@ var require_device_manager_addon = __commonJS({
59702
59710
  [Symbol.toStringTag]: { value: "Module" }
59703
59711
  });
59704
59712
  require_chunk_Cek0wNdY();
59705
- var require_dist10 = require_dist_DR1VmGz6();
59713
+ var require_dist10 = require_dist_CB2eCKJb();
59706
59714
  var node_crypto = __require("crypto");
59707
59715
  var _camstack_types_node = require_node();
59708
59716
  var JOB_HISTORY = 20;
@@ -63690,7 +63698,7 @@ var require_hub_forwarder = __commonJS({
63690
63698
  [Symbol.toStringTag]: { value: "Module" }
63691
63699
  });
63692
63700
  require_chunk_Cek0wNdY();
63693
- var require_dist10 = require_dist_DR1VmGz6();
63701
+ var require_dist10 = require_dist_CB2eCKJb();
63694
63702
  var require_formatter = require_formatter_DqAKDlvN();
63695
63703
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
63696
63704
  var HubForwarderDestination = class {
@@ -63827,7 +63835,7 @@ var require_liveness_monitor_addon = __commonJS({
63827
63835
  "use strict";
63828
63836
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
63829
63837
  require_chunk_Cek0wNdY();
63830
- var require_dist10 = require_dist_DR1VmGz6();
63838
+ var require_dist10 = require_dist_CB2eCKJb();
63831
63839
  var NO_DEVICES = "liveness:no-devices";
63832
63840
  var ALL_OFFLINE = "liveness:all-devices-offline";
63833
63841
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -64017,7 +64025,7 @@ var require_local_auth_addon = __commonJS({
64017
64025
  [Symbol.toStringTag]: { value: "Module" }
64018
64026
  });
64019
64027
  var require_chunk = require_chunk_Cek0wNdY();
64020
- var require_dist10 = require_dist_DR1VmGz6();
64028
+ var require_dist10 = require_dist_CB2eCKJb();
64021
64029
  var node_crypto = __require("crypto");
64022
64030
  node_crypto = require_chunk.__toESM(node_crypto);
64023
64031
  var crypto$1 = __require("crypto");
@@ -71701,7 +71709,7 @@ var require_loki_logging = __commonJS({
71701
71709
  [Symbol.toStringTag]: { value: "Module" }
71702
71710
  });
71703
71711
  require_chunk_Cek0wNdY();
71704
- var require_dist10 = require_dist_DR1VmGz6();
71712
+ var require_dist10 = require_dist_CB2eCKJb();
71705
71713
  function sanitizeLabelName(raw) {
71706
71714
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
71707
71715
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -72266,7 +72274,7 @@ var require_native_metrics_addon = __commonJS({
72266
72274
  [Symbol.toStringTag]: { value: "Module" }
72267
72275
  });
72268
72276
  var require_chunk = require_chunk_Cek0wNdY();
72269
- var require_dist10 = require_dist_DR1VmGz6();
72277
+ var require_dist10 = require_dist_CB2eCKJb();
72270
72278
  var node_child_process = __require("child_process");
72271
72279
  var node_util = __require("util");
72272
72280
  var node_os = __require("os");
@@ -73208,7 +73216,7 @@ var require_filesystem_storage_addon = __commonJS({
73208
73216
  [Symbol.toStringTag]: { value: "Module" }
73209
73217
  });
73210
73218
  var require_chunk = require_chunk_Cek0wNdY();
73211
- var require_dist10 = require_dist_DR1VmGz6();
73219
+ var require_dist10 = require_dist_CB2eCKJb();
73212
73220
  var node_crypto = __require("crypto");
73213
73221
  var node_fs_promises = __require("fs/promises");
73214
73222
  var node_path = __require("path");
@@ -74324,7 +74332,7 @@ var require_sqlite_settings_addon = __commonJS({
74324
74332
  [Symbol.toStringTag]: { value: "Module" }
74325
74333
  });
74326
74334
  var require_chunk = require_chunk_Cek0wNdY();
74327
- var require_dist10 = require_dist_DR1VmGz6();
74335
+ var require_dist10 = require_dist_CB2eCKJb();
74328
74336
  var node_crypto = __require("crypto");
74329
74337
  var node_fs = __require("fs");
74330
74338
  var node_module = __require("module");
@@ -75892,7 +75900,7 @@ var require_storage_orchestrator_addon = __commonJS({
75892
75900
  [Symbol.toStringTag]: { value: "Module" }
75893
75901
  });
75894
75902
  var require_chunk = require_chunk_Cek0wNdY();
75895
- var require_dist10 = require_dist_DR1VmGz6();
75903
+ var require_dist10 = require_dist_CB2eCKJb();
75896
75904
  var node_crypto = __require("crypto");
75897
75905
  var node_fs_promises = __require("fs/promises");
75898
75906
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -77771,7 +77779,7 @@ var require_system_config_addon = __commonJS({
77771
77779
  [Symbol.toStringTag]: { value: "Module" }
77772
77780
  });
77773
77781
  require_chunk_Cek0wNdY();
77774
- var require_dist10 = require_dist_DR1VmGz6();
77782
+ var require_dist10 = require_dist_CB2eCKJb();
77775
77783
  var SECTION_TITLES = {
77776
77784
  server: "Server",
77777
77785
  auth: "Authentication"
@@ -95832,7 +95840,7 @@ var require_winston_logging = __commonJS({
95832
95840
  [Symbol.toStringTag]: { value: "Module" }
95833
95841
  });
95834
95842
  var require_chunk = require_chunk_Cek0wNdY();
95835
- var require_dist10 = require_dist_DR1VmGz6();
95843
+ var require_dist10 = require_dist_CB2eCKJb();
95836
95844
  var require_formatter = require_formatter_DqAKDlvN();
95837
95845
  var node_path = __require("path");
95838
95846
  node_path = require_chunk.__toESM(node_path);
@@ -118081,7 +118089,7 @@ var require_dist3 = __commonJS({
118081
118089
  "use strict";
118082
118090
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
118083
118091
  var require_chunk = require_chunk_Cek0wNdY();
118084
- var require_dist10 = require_dist_DR1VmGz6();
118092
+ var require_dist10 = require_dist_CB2eCKJb();
118085
118093
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
118086
118094
  require_alerts();
118087
118095
  var require_formatter = require_formatter_DqAKDlvN();
@@ -253369,6 +253377,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
253369
253377
  }
253370
253378
  };
253371
253379
  var MAX_CLIP_EVENT_IDS = 24;
253380
+ var MAX_CLIP_LABELS = 3;
253372
253381
  var ClipSchema = zod.z.object({
253373
253382
  /** Opaque, provider-namespaced id. The default provider encodes the time
253374
253383
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -253386,6 +253395,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
253386
253395
  endMs: zod.z.number()
253387
253396
  }),
253388
253397
  /**
253398
+ * Distinct object classes attached to this visit (`person`, `car`, …),
253399
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
253400
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
253401
+ * did not. Absent (never empty) when the visit attached no classified object
253402
+ * event, so a motion/audio-only visit keeps its kind label.
253403
+ */
253404
+ labels: zod.z.array(zod.z.string()).max(3).optional(),
253405
+ /**
253389
253406
  * Lazy thumbnail URL, never inlined.
253390
253407
  *
253391
253408
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -276274,6 +276291,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
276274
276291
  exports.LoginStageEnum = LoginStageEnum;
276275
276292
  exports.MACRO_LABELS = MACRO_LABELS;
276276
276293
  exports.MAX_CLIP_EVENT_IDS = MAX_CLIP_EVENT_IDS;
276294
+ exports.MAX_CLIP_LABELS = MAX_CLIP_LABELS;
276277
276295
  exports.MAX_CONDITION_DEPTH = MAX_CONDITION_DEPTH;
276278
276296
  exports.MAX_CONDITION_LEAVES = MAX_CONDITION_LEAVES;
276279
276297
  exports.MAX_EXPRESSION_AST_NODES = MAX_EXPRESSION_AST_NODES;
@@ -401020,6 +401038,52 @@ var require_boot_config = __commonJS({
401020
401038
  }
401021
401039
  });
401022
401040
 
401041
+ // ../../server/backend/dist/core/app-links/well-known-app-links.js
401042
+ var require_well_known_app_links = __commonJS({
401043
+ "../../server/backend/dist/core/app-links/well-known-app-links.js"(exports) {
401044
+ "use strict";
401045
+ Object.defineProperty(exports, "__esModule", { value: true });
401046
+ exports.buildAppLinkFiles = buildAppLinkFiles;
401047
+ exports.parseCertFingerprints = parseCertFingerprints;
401048
+ var APPLE_TEAM_ID = "C3F24V5NS5";
401049
+ var BUNDLE_ID = "com.apocaliss92.camstack";
401050
+ var BUNDLE_ID_DEV = "com.apocaliss92.camstack.dev";
401051
+ var VIEWER_COMPONENT = "/viewer/camstack/*";
401052
+ function buildAppLinkFiles(androidCertSha256) {
401053
+ const appIds = [`${APPLE_TEAM_ID}.${BUNDLE_ID}`, `${APPLE_TEAM_ID}.${BUNDLE_ID_DEV}`];
401054
+ return {
401055
+ appleAppSiteAssociation: {
401056
+ applinks: {
401057
+ apps: [],
401058
+ details: [
401059
+ {
401060
+ appIDs: appIds,
401061
+ components: [{ "/": VIEWER_COMPONENT, comment: "Viewer deep links" }]
401062
+ },
401063
+ // Legacy `paths` block for pre-iOS-13 parsers, as Zentik ships.
401064
+ { appID: appIds[0], paths: [VIEWER_COMPONENT] }
401065
+ ]
401066
+ },
401067
+ webcredentials: { apps: appIds }
401068
+ },
401069
+ assetLinks: [BUNDLE_ID, BUNDLE_ID_DEV].map((pkg) => ({
401070
+ relation: ["delegate_permission/common.handle_all_urls"],
401071
+ target: {
401072
+ namespace: "android_app",
401073
+ package_name: pkg,
401074
+ sha256_cert_fingerprints: [...androidCertSha256]
401075
+ }
401076
+ }))
401077
+ };
401078
+ }
401079
+ function parseCertFingerprints(raw) {
401080
+ if (raw === void 0)
401081
+ return [];
401082
+ return raw.split(",").map((s) => s.trim().toUpperCase()).filter((s) => /^[0-9A-F]{2}(:[0-9A-F]{2}){31}$/.test(s));
401083
+ }
401084
+ }
401085
+ });
401086
+
401023
401087
  // ../../server/backend/dist/core/addon/addon-call-gateway.js
401024
401088
  var require_addon_call_gateway = __commonJS({
401025
401089
  "../../server/backend/dist/core/addon/addon-call-gateway.js"(exports) {
@@ -408288,6 +408352,7 @@ var require_main4 = __commonJS({
408288
408352
  var integration_id_backfill_1 = require_integration_id_backfill();
408289
408353
  var post_boot_service_1 = require_post_boot_service();
408290
408354
  var addon_package_service_1 = require_addon_package_service();
408355
+ var well_known_app_links_1 = require_well_known_app_links();
408291
408356
  var addon_registry_service_1 = require_addon_registry_service();
408292
408357
  var addon_bridge_service_1 = require_addon_bridge_service();
408293
408358
  var addon_pages_service_1 = require_addon_pages_service();
@@ -408984,6 +409049,14 @@ var require_main4 = __commonJS({
408984
409049
  const adminUiState = { staticDir: null, indexPath: null };
408985
409050
  const viewerUiState = { staticDir: null, indexPath: null };
408986
409051
  const VIEWER_MOUNT = "/viewer/camstack";
409052
+ {
409053
+ const { appleAppSiteAssociation, assetLinks } = (0, well_known_app_links_1.buildAppLinkFiles)((0, well_known_app_links_1.parseCertFingerprints)(process.env["CAMSTACK_ANDROID_CERT_SHA256"]));
409054
+ const aasa = JSON.stringify(appleAppSiteAssociation);
409055
+ const assetlinks = JSON.stringify(assetLinks);
409056
+ fastify.get("/.well-known/apple-app-site-association", async (_request, reply) => reply.type("application/json").send(aasa));
409057
+ fastify.get("/apple-app-site-association", async (_request, reply) => reply.type("application/json").send(aasa));
409058
+ fastify.get("/.well-known/assetlinks.json", async (_request, reply) => reply.type("application/json").send(assetlinks));
409059
+ }
408987
409060
  fastify.get("/viewer", async (_request, reply) => reply.redirect(`${VIEWER_MOUNT}/`));
408988
409061
  fastify.get("/viewer/", async (_request, reply) => reply.redirect(`${VIEWER_MOUNT}/`));
408989
409062
  fastify.get("/webrtc-test.html", async (_request, reply) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.29",
3
+ "version": "1.2.31",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",