camstack 1.2.178 → 1.2.179

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.
@@ -27316,6 +27316,7 @@ var NcStateSummarySectionIdSchema = external_exports.enum([
27316
27316
  "detection-blind",
27317
27317
  "nodes",
27318
27318
  "addons",
27319
+ "addon-updates",
27319
27320
  "updates"
27320
27321
  ]);
27321
27322
  var NcStateSummaryPreviewSectionSchema = external_exports.object({
@@ -27702,7 +27703,19 @@ var NcAlarmModeDelaysSchema = external_exports.object({
27702
27703
  * When this mode may be armed. Absent / null = always allowed (same as a
27703
27704
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
27704
27705
  */
27705
- schedule: NcScheduleSchema.optional()
27706
+ schedule: NcScheduleSchema.optional(),
27707
+ /**
27708
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
27709
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
27710
+ * only one, and the matches ride the triggered notification's mosaic (D705).
27711
+ */
27712
+ notifyDuringEntryDelay: external_exports.boolean().optional(),
27713
+ /**
27714
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
27715
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
27716
+ * is the one that starts the entry delay — the entry-delay notification already names it.
27717
+ */
27718
+ notifySensorRewatched: external_exports.boolean().optional()
27706
27719
  });
27707
27720
  var NcAlarmModeDelaysListSchema = external_exports.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
27708
27721
  var NcAlarmModeDelaysEditSchema = external_exports.object({
@@ -27712,7 +27725,11 @@ var NcAlarmModeDelaysEditSchema = external_exports.object({
27712
27725
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
27713
27726
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
27714
27727
  /** Set a schedule, or `null` to clear (mode always allowed again). */
27715
- schedule: NcScheduleSchema.nullable().optional()
27728
+ schedule: NcScheduleSchema.nullable().optional(),
27729
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
27730
+ notifyDuringEntryDelay: external_exports.boolean().nullable().optional(),
27731
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
27732
+ notifySensorRewatched: external_exports.boolean().nullable().optional()
27716
27733
  });
27717
27734
  var NcAlarmModeDelaysEditListSchema = external_exports.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
27718
27735
  var NcAlarmNonBlockingEditSchema = external_exports.object({
@@ -31684,6 +31701,11 @@ var MotionSourceEnum = external_exports.enum([
31684
31701
  "analyzer",
31685
31702
  "device-activity"
31686
31703
  ]);
31704
+ var SessionTriggerSchema = external_exports.object({
31705
+ source: MotionSourceEnum,
31706
+ triggeredBy: MotionTriggeredBySchema,
31707
+ sensorName: external_exports.string().optional()
31708
+ });
31687
31709
  var MotionSourcesSchema = external_exports.array(MotionSourceEnum);
31688
31710
  var MOTION_SOURCE_LABELS = {
31689
31711
  analyzer: "Frame-diff Analyzer (motion addon)",
@@ -31831,6 +31853,14 @@ var RunnerCameraConfigSchema = external_exports.object({
31831
31853
  */
31832
31854
  motionSources: MotionSourcesSchema.default(["analyzer"]),
31833
31855
  /**
31856
+ * What opened this attach, on a SESSION attach only (see
31857
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
31858
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
31859
+ * behind it, and every attach from an orchestrator older than the field — the
31860
+ * runner then names no source on the phase event.
31861
+ */
31862
+ sessionTrigger: SessionTriggerSchema.optional(),
31863
+ /**
31834
31864
  * WHICH root detector runs for this camera. The detection counterpart of
31835
31865
  * {@link motionSources}, same shape and same discipline: a per-camera list
31836
31866
  * of sources the system understands, vendor-agnostic, owned here.
@@ -39588,7 +39618,7 @@ var LocalInterfaceSchema = external_exports.object({
39588
39618
  name: external_exports.string(),
39589
39619
  family: external_exports.enum(["IPv4", "IPv6"]),
39590
39620
  address: external_exports.string(),
39591
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
39621
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
39592
39622
  cidr: external_exports.string(),
39593
39623
  /** OS netmask. Stable across calls so the SDK can hash on it. */
39594
39624
  netmask: external_exports.string(),
@@ -39637,7 +39667,8 @@ var ConnectionEndpointSchema = external_exports.object({
39637
39667
  "lan-ipv4",
39638
39668
  "lan-ipv6",
39639
39669
  "public",
39640
- "loopback"
39670
+ "loopback",
39671
+ "app-link"
39641
39672
  ]),
39642
39673
  /**
39643
39674
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39702,8 +39733,20 @@ var GetConnectionEndpointsResultSchema = external_exports.object({
39702
39733
  var NotificationEndpointSchema = external_exports.object({
39703
39734
  /** The operator's explicit choice, or null for AUTO. */
39704
39735
  baseUrl: external_exports.string().nullable(),
39705
- /** What the ranking currently resolves to (null when nothing is reachable). */
39706
- resolved: external_exports.string().nullable()
39736
+ /**
39737
+ * The effective flagged address: the explicit choice, else (AUTO) the
39738
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
39739
+ * answered the public tunnel / mesh here, or null.
39740
+ */
39741
+ resolved: external_exports.string().nullable(),
39742
+ /**
39743
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
39744
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
39745
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
39746
+ * hub advertises neither; the app link is then minted without `hub=`.
39747
+ * Absent on a pre-D709 hub.
39748
+ */
39749
+ appLinkHub: external_exports.string().nullable()
39707
39750
  });
39708
39751
  var ViewerEndpointsSchema = external_exports.object({
39709
39752
  /** The operator's explicit race set, or empty for AUTO. */
@@ -39767,7 +39810,7 @@ var localNetworkCapability = {
39767
39810
  * every client a second authority on a socket only the hub binds. A viewer
39768
39811
  * configured with a port-less public URL (`https://camstack.example.top`)
39769
39812
  * infers 443 from the scheme, asks with 443, and was handed
39770
- * `https://192.168.x.x:443` for a hub listening on 4443. That candidate
39813
+ * `https://192.168.10.9:443` for a hub listening on 4443. That candidate
39771
39814
  * cannot ever answer, and losing its race reads in the log exactly like
39772
39815
  * "the LAN was tried and it was slower" — so an operator sitting on his own
39773
39816
  * WiFi stayed on the public tunnel for weeks, with the LAN candidate born
@@ -39800,13 +39843,21 @@ var localNetworkCapability = {
39800
39843
  * Pass `'https'` when the caller is itself loaded over HTTPS
39801
39844
  * to avoid mixed-content blocks in the browser. The public
39802
39845
  * tunnel always emits `https://` regardless. */
39803
- scheme: external_exports.enum(["http", "https"]).optional()
39846
+ scheme: external_exports.enum(["http", "https"]).optional(),
39847
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39848
+ * an address notification links can be flagged with, not a hub
39849
+ * route. Default `false`: racers and rankers never see it. */
39850
+ includeAppLink: external_exports.boolean().optional()
39804
39851
  }), GetConnectionEndpointsResultSchema),
39805
39852
  /**
39806
- * The endpoint OUTBOUND artifacts must be addressed by — notification
39807
- * attachment links and deep links. `baseUrl: null` means AUTO: the first
39808
- * public candidate (a configured origin, then a connected tunnel, then the
39809
- * LAN), never loopback.
39853
+ * The address notification links are flagged with. `baseUrl: null` means
39854
+ * AUTO, which is the CamStack app link (D709): viewer taps go through
39855
+ * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39856
+ * hub address the palette lists can be flagged instead; then viewer taps,
39857
+ * attachment links and action buttons all use it. Signed media and
39858
+ * buttons never use the app link — with it flagged (or AUTO) they keep
39859
+ * the ranked hub ladder (a configured origin, a connected tunnel, then
39860
+ * the LAN), never loopback.
39810
39861
  *
39811
39862
  * Why an explicit marker: the automatic ranking cannot know which of
39812
39863
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -40165,7 +40216,7 @@ var MeshPeerSchema = external_exports.object({
40165
40216
  tags: external_exports.array(external_exports.string()).readonly(),
40166
40217
  /** True when the peer advertises itself as an exit-node candidate. */
40167
40218
  exitNodeOption: external_exports.boolean(),
40168
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
40219
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
40169
40220
  advertisedRoutes: external_exports.array(external_exports.string()).readonly(),
40170
40221
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
40171
40222
  userLogin: external_exports.string().nullable(),
@@ -57791,12 +57842,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57791
57842
  {
57792
57843
  id: "addons",
57793
57844
  family: "system",
57794
- label: "Addons",
57795
- kinds: [
57796
- "addon-crash-loop",
57797
- "addon-update-available",
57798
- "addon-updated"
57799
- ]
57845
+ label: "Addons stopped",
57846
+ kinds: ["addon-crash-loop"]
57847
+ },
57848
+ {
57849
+ id: "addon-updates",
57850
+ family: "system",
57851
+ label: "Addon updates",
57852
+ kinds: ["addon-update-available", "addon-updated"]
57800
57853
  },
57801
57854
  {
57802
57855
  id: "updates",
@@ -57930,13 +57983,15 @@ var STATE_SUMMARY_SECTION_VARS = [
57930
57983
  },
57931
57984
  {
57932
57985
  name: "summaryAddons",
57933
- label: "Summary: addons",
57934
- example: "@camstack/addon-recorder 1.2.3 \u2192 1.2.4",
57935
- kinds: [
57936
- "addon-crash-loop",
57937
- "addon-update-available",
57938
- "addon-updated"
57939
- ]
57986
+ label: "Summary: addons stopped",
57987
+ example: "hub \u2014 recorder stopped after repeated crashes",
57988
+ kinds: ["addon-crash-loop"]
57989
+ },
57990
+ {
57991
+ name: "summaryAddonUpdates",
57992
+ label: "Summary: addon updates",
57993
+ example: "hub:\n\u2022 @camstack/addon-recorder 1.2.3 \u2192 1.2.4",
57994
+ kinds: ["addon-update-available", "addon-updated"]
57940
57995
  },
57941
57996
  {
57942
57997
  name: "summaryUpdates",
@@ -58277,6 +58332,16 @@ var NC_TEMPLATE_VARS = [
58277
58332
  kinds: ["system"],
58278
58333
  systemEventKinds: [...DEVICE_EVENTS]
58279
58334
  },
58335
+ {
58336
+ name: "locations",
58337
+ label: "Intrusion locations",
58338
+ example: "Ingresso, Corridoio, Salone",
58339
+ group: "system",
58340
+ families: ["rule"],
58341
+ fields: [...RULE_TEXT],
58342
+ kinds: ["system"],
58343
+ systemEventKinds: [...COMBINED_ALARM]
58344
+ },
58280
58345
  {
58281
58346
  name: "deviceId",
58282
58347
  label: "Device id",
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  FFMPEG_PATH_ENV,
4
4
  runDiscover
5
- } from "./chunk-3AV5PMK2.js";
5
+ } from "./chunk-MRRNUEHP.js";
6
6
  import "./chunk-LMMQX4CK.js";
7
7
 
8
8
  // src/cli.ts
@@ -39,7 +39,7 @@ async function runServe(args) {
39
39
  ...typeof values.data === "string" ? { data: values.data } : {}
40
40
  };
41
41
  Object.assign(process.env, buildServeEnv(opts));
42
- await import("./launcher-2BHKBGSC.js");
42
+ await import("./launcher-ER4ORH3G.js");
43
43
  }
44
44
 
45
45
  // src/commands/agent.ts
@@ -72,7 +72,7 @@ async function runAgent(args) {
72
72
  allowPositionals: false
73
73
  });
74
74
  if (typeof values.hub !== "string" || values.hub.length === 0) {
75
- throw new Error("--hub is required (e.g. --hub 192.168.x.x)");
75
+ throw new Error("--hub is required (e.g. --hub 192.168.10.10)");
76
76
  }
77
77
  if (typeof values.token !== "string" || values.token.length === 0) {
78
78
  throw new Error("--token is required");
@@ -84,7 +84,7 @@ async function runAgent(args) {
84
84
  ...typeof values.port === "string" ? { port: values.port } : {}
85
85
  };
86
86
  Object.assign(process.env, buildAgentEnv(opts));
87
- await import("./launcher-2BHKBGSC.js");
87
+ await import("./launcher-ER4ORH3G.js");
88
88
  }
89
89
 
90
90
  // src/commands/setup.ts
@@ -1134,7 +1134,7 @@ function isUnknown(_value) {
1134
1134
  return true;
1135
1135
  }
1136
1136
  async function resolveServerInteractive(presetNamespace) {
1137
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-XEXOBUMG.js");
1137
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-TGPXHMVK.js");
1138
1138
  if (presetNamespace) {
1139
1139
  const spinner4 = clack.spinner();
1140
1140
  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-3AV5PMK2.js";
8
+ } from "./chunk-MRRNUEHP.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,