camstack 1.2.177 → 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.
@@ -17774,11 +17774,11 @@ var ModelVariantGroupSchema = external_exports.object({
17774
17774
  /** Quantization axis. Omit ⇒ the fp32 base build. */
17775
17775
  precision: external_exports.enum(["fp32", "int8"]).optional(),
17776
17776
  /**
17777
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
17778
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
17779
- * future performance variants plug into.
17777
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
17778
+ * an alternate training of the same family (Scrypted `relu_test`); chip
17779
+ * label is "Test".
17780
17780
  */
17781
- optimization: external_exports.enum(["standard", "fast"]).optional(),
17781
+ optimization: external_exports.enum(["standard", "test"]).optional(),
17782
17782
  /**
17783
17783
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
17784
17784
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -25333,7 +25333,7 @@ var modelConvertCapability = {
25333
25333
  }) }
25334
25334
  };
25335
25335
  var ModelDistributeInputSchema = external_exports.object({
25336
- nodeId: external_exports.string(),
25336
+ targetNodeId: external_exports.string(),
25337
25337
  modelId: external_exports.string(),
25338
25338
  format: external_exports.enum(MODEL_FORMATS),
25339
25339
  entry: ModelCatalogEntrySchema
@@ -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({
@@ -28552,39 +28569,19 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
28552
28569
  label: "Face recognition model",
28553
28570
  defaultModelId: "auraface-r100",
28554
28571
  indexName: "the enrolled face gallery",
28555
- options: [
28556
- {
28557
- id: "auraface-r100",
28558
- label: "AuraFace R100"
28559
- },
28560
- {
28561
- id: "arcface-r100",
28562
- label: "ArcFace (ResNet34)"
28563
- },
28564
- {
28565
- id: "inception-resnet-v1",
28566
- label: "Inception ResNet V1"
28567
- }
28568
- ]
28572
+ options: [{
28573
+ id: "auraface-r100",
28574
+ label: "AuraFace R100"
28575
+ }]
28569
28576
  }, {
28570
28577
  stepId: "clip-embedding",
28571
28578
  label: "Semantic search model",
28572
- defaultModelId: "mobileclip-s1",
28579
+ defaultModelId: "siglip2-b16-224",
28573
28580
  indexName: "the object semantic-search index",
28574
- options: [
28575
- {
28576
- id: "mobileclip-s1",
28577
- label: "MobileCLIP S1"
28578
- },
28579
- {
28580
- id: "mobileclip-s2",
28581
- label: "MobileCLIP S2"
28582
- },
28583
- {
28584
- id: "siglip2-b16-224",
28585
- label: "SigLIP2 B/16 (Apache-2.0)"
28586
- }
28587
- ]
28581
+ options: [{
28582
+ id: "siglip2-b16-224",
28583
+ label: "SigLIP2 B/16 (Apache-2.0)"
28584
+ }]
28588
28585
  }];
28589
28586
  var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
28590
28587
  var CLUSTER_STEP_SETTING_FIELDS = [{
@@ -31704,6 +31701,11 @@ var MotionSourceEnum = external_exports.enum([
31704
31701
  "analyzer",
31705
31702
  "device-activity"
31706
31703
  ]);
31704
+ var SessionTriggerSchema = external_exports.object({
31705
+ source: MotionSourceEnum,
31706
+ triggeredBy: MotionTriggeredBySchema,
31707
+ sensorName: external_exports.string().optional()
31708
+ });
31707
31709
  var MotionSourcesSchema = external_exports.array(MotionSourceEnum);
31708
31710
  var MOTION_SOURCE_LABELS = {
31709
31711
  analyzer: "Frame-diff Analyzer (motion addon)",
@@ -31851,6 +31853,14 @@ var RunnerCameraConfigSchema = external_exports.object({
31851
31853
  */
31852
31854
  motionSources: MotionSourcesSchema.default(["analyzer"]),
31853
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
+ /**
31854
31864
  * WHICH root detector runs for this camera. The detection counterpart of
31855
31865
  * {@link motionSources}, same shape and same discipline: a per-camera list
31856
31866
  * of sources the system understands, vendor-agnostic, owned here.
@@ -39608,7 +39618,7 @@ var LocalInterfaceSchema = external_exports.object({
39608
39618
  name: external_exports.string(),
39609
39619
  family: external_exports.enum(["IPv4", "IPv6"]),
39610
39620
  address: external_exports.string(),
39611
- /** 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. */
39612
39622
  cidr: external_exports.string(),
39613
39623
  /** OS netmask. Stable across calls so the SDK can hash on it. */
39614
39624
  netmask: external_exports.string(),
@@ -39657,7 +39667,8 @@ var ConnectionEndpointSchema = external_exports.object({
39657
39667
  "lan-ipv4",
39658
39668
  "lan-ipv6",
39659
39669
  "public",
39660
- "loopback"
39670
+ "loopback",
39671
+ "app-link"
39661
39672
  ]),
39662
39673
  /**
39663
39674
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39722,8 +39733,20 @@ var GetConnectionEndpointsResultSchema = external_exports.object({
39722
39733
  var NotificationEndpointSchema = external_exports.object({
39723
39734
  /** The operator's explicit choice, or null for AUTO. */
39724
39735
  baseUrl: external_exports.string().nullable(),
39725
- /** What the ranking currently resolves to (null when nothing is reachable). */
39726
- 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()
39727
39750
  });
39728
39751
  var ViewerEndpointsSchema = external_exports.object({
39729
39752
  /** The operator's explicit race set, or empty for AUTO. */
@@ -39787,7 +39810,7 @@ var localNetworkCapability = {
39787
39810
  * every client a second authority on a socket only the hub binds. A viewer
39788
39811
  * configured with a port-less public URL (`https://camstack.example.top`)
39789
39812
  * infers 443 from the scheme, asks with 443, and was handed
39790
- * `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
39791
39814
  * cannot ever answer, and losing its race reads in the log exactly like
39792
39815
  * "the LAN was tried and it was slower" — so an operator sitting on his own
39793
39816
  * WiFi stayed on the public tunnel for weeks, with the LAN candidate born
@@ -39820,13 +39843,21 @@ var localNetworkCapability = {
39820
39843
  * Pass `'https'` when the caller is itself loaded over HTTPS
39821
39844
  * to avoid mixed-content blocks in the browser. The public
39822
39845
  * tunnel always emits `https://` regardless. */
39823
- 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()
39824
39851
  }), GetConnectionEndpointsResultSchema),
39825
39852
  /**
39826
- * The endpoint OUTBOUND artifacts must be addressed by — notification
39827
- * attachment links and deep links. `baseUrl: null` means AUTO: the first
39828
- * public candidate (a configured origin, then a connected tunnel, then the
39829
- * 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.
39830
39861
  *
39831
39862
  * Why an explicit marker: the automatic ranking cannot know which of
39832
39863
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -40185,7 +40216,7 @@ var MeshPeerSchema = external_exports.object({
40185
40216
  tags: external_exports.array(external_exports.string()).readonly(),
40186
40217
  /** True when the peer advertises itself as an exit-node candidate. */
40187
40218
  exitNodeOption: external_exports.boolean(),
40188
- /** 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"]`). */
40189
40220
  advertisedRoutes: external_exports.array(external_exports.string()).readonly(),
40190
40221
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
40191
40222
  userLogin: external_exports.string().nullable(),
@@ -41335,7 +41366,13 @@ var OsdOverlaySchema = external_exports.object({
41335
41366
  */
41336
41367
  availablePositions: external_exports.array(OsdPositionEnum).readonly(),
41337
41368
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
41338
- readOnly: external_exports.boolean().optional()
41369
+ readOnly: external_exports.boolean().optional(),
41370
+ /**
41371
+ * Firmware text ceiling for this overlay. Absent = no known limit.
41372
+ * The OSD manager truncates here on every write — never stores its own
41373
+ * copy on the binding.
41374
+ */
41375
+ maxCharacters: external_exports.number().int().positive().optional()
41339
41376
  });
41340
41377
  var OsdStatusSchema = external_exports.object({ overlays: external_exports.array(OsdOverlaySchema).readonly() });
41341
41378
  var OsdOverlayPatchSchema = external_exports.object({
@@ -41423,7 +41460,9 @@ var OsdTemplateBindingSchema = external_exports.object({
41423
41460
  valuePath: external_exports.string().min(1).max(64),
41424
41461
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
41425
41462
  displayUnit: external_exports.string().max(16).optional(),
41426
- maxDecimals: external_exports.number().int().min(0).max(4).default(1)
41463
+ maxDecimals: external_exports.number().int().min(0).max(4).default(1),
41464
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
41465
+ valueMap: external_exports.record(external_exports.string(), external_exports.string()).optional()
41427
41466
  });
41428
41467
  var OsdNamedTemplateSchema = external_exports.object({
41429
41468
  id: external_exports.string().min(1).max(64),
@@ -41468,18 +41507,11 @@ var OsdSlotBindingSchema = external_exports.object({
41468
41507
  source: OsdSourceSchema,
41469
41508
  /** `${value}` and `${unit}` are substituted; every occurrence. */
41470
41509
  template: external_exports.string().max(96).default("${value}"),
41471
- /** Truncate with an ellipsis past this length. Absent = no limit. */
41472
- maxCharacters: external_exports.number().int().min(4).max(64).optional(),
41473
41510
  /**
41474
41511
  * Decimal places for a numeric value. `0` yields an integer — the
41475
41512
  * documented workaround for firmwares that reject `.` in overlay text.
41476
41513
  */
41477
41514
  maxDecimals: external_exports.number().int().min(0).max(4).default(1),
41478
- /**
41479
- * Appended via `${unit}` when no unit conversion produces a label.
41480
- * Prefer `source.displayUnit` for converted device-state values.
41481
- */
41482
- unitLabel: external_exports.string().max(8).optional(),
41483
41515
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
41484
41516
  valueMap: external_exports.record(external_exports.string(), external_exports.string()).optional(),
41485
41517
  /** Time windows in which the slot is shown. Absent = always. */
@@ -41488,9 +41520,7 @@ var OsdSlotBindingSchema = external_exports.object({
41488
41520
  * Display gate, in the notification centre's condition vocabulary.
41489
41521
  * Only the keys reported by `getConditionSupport` are accepted.
41490
41522
  */
41491
- conditions: NcConditionsSchema.optional(),
41492
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
41493
- fallbackText: external_exports.string().max(64).default("")
41523
+ conditions: NcConditionsSchema.optional()
41494
41524
  });
41495
41525
  var OsdSlotViewSchema = external_exports.object({
41496
41526
  slotId: external_exports.string(),
@@ -57812,12 +57842,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57812
57842
  {
57813
57843
  id: "addons",
57814
57844
  family: "system",
57815
- label: "Addons",
57816
- kinds: [
57817
- "addon-crash-loop",
57818
- "addon-update-available",
57819
- "addon-updated"
57820
- ]
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"]
57821
57853
  },
57822
57854
  {
57823
57855
  id: "updates",
@@ -57951,13 +57983,15 @@ var STATE_SUMMARY_SECTION_VARS = [
57951
57983
  },
57952
57984
  {
57953
57985
  name: "summaryAddons",
57954
- label: "Summary: addons",
57955
- example: "@camstack/addon-recorder 1.2.3 \u2192 1.2.4",
57956
- kinds: [
57957
- "addon-crash-loop",
57958
- "addon-update-available",
57959
- "addon-updated"
57960
- ]
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"]
57961
57995
  },
57962
57996
  {
57963
57997
  name: "summaryUpdates",
@@ -58298,6 +58332,16 @@ var NC_TEMPLATE_VARS = [
58298
58332
  kinds: ["system"],
58299
58333
  systemEventKinds: [...DEVICE_EVENTS]
58300
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
+ },
58301
58345
  {
58302
58346
  name: "deviceId",
58303
58347
  label: "Device id",
@@ -58387,7 +58431,7 @@ var NC_TEMPLATE_VARS = [
58387
58431
  {
58388
58432
  name: "devices",
58389
58433
  label: "Devices",
58390
- description: "node-inference-unavailable: the affected cameras, comma-joined. Alarm arm / refusal: HOW MANY devices are armed (or open).",
58434
+ description: "node-inference-unavailable: the affected cameras, comma-joined. Alarm arm / arming / refusal: HOW MANY devices are armed (or open).",
58391
58435
  example: "Ingresso, Garage",
58392
58436
  group: "system",
58393
58437
  families: ["rule"],
@@ -58396,6 +58440,7 @@ var NC_TEMPLATE_VARS = [
58396
58440
  systemEventKinds: [
58397
58441
  "node-inference-unavailable",
58398
58442
  "alarm-armed",
58443
+ "alarm-arming",
58399
58444
  "alarm-arm-refused"
58400
58445
  ]
58401
58446
  },
@@ -58616,18 +58661,18 @@ var NC_TEMPLATE_VARS = [
58616
58661
  {
58617
58662
  name: "rules",
58618
58663
  label: "Covering rules",
58619
- description: "How many enabled rules the armed mode gates.",
58664
+ description: "How many enabled rules the armed / arming mode gates.",
58620
58665
  example: "2",
58621
58666
  group: "system",
58622
58667
  families: ["rule"],
58623
58668
  fields: [...RULE_TEXT],
58624
58669
  kinds: ["system"],
58625
- systemEventKinds: ["alarm-armed"]
58670
+ systemEventKinds: ["alarm-armed", "alarm-arming"]
58626
58671
  },
58627
58672
  {
58628
58673
  name: "names",
58629
58674
  label: "Device names",
58630
- description: "Armed: the devices armed. Arming: the devices this mode cannot arm. Refusal: the open sensors.",
58675
+ description: "Armed / arming: the Active devices (or every skipped name when none are Active). Refusal: the open sensors.",
58631
58676
  example: "Ingresso, Garage",
58632
58677
  group: "system",
58633
58678
  families: ["rule"],
@@ -58648,7 +58693,29 @@ var NC_TEMPLATE_VARS = [
58648
58693
  families: ["rule"],
58649
58694
  fields: [...RULE_TEXT],
58650
58695
  kinds: ["system"],
58651
- systemEventKinds: ["alarm-armed"]
58696
+ systemEventKinds: ["alarm-armed", "alarm-arming"]
58697
+ },
58698
+ {
58699
+ name: "active",
58700
+ label: "Active count",
58701
+ description: "How many named devices the armed / arming mode is watching (title: n attivi / n active).",
58702
+ example: "3",
58703
+ group: "system",
58704
+ families: ["rule"],
58705
+ fields: [...RULE_TEXT],
58706
+ kinds: ["system"],
58707
+ systemEventKinds: ["alarm-armed", "alarm-arming"]
58708
+ },
58709
+ {
58710
+ name: "skipped",
58711
+ label: "Skipped count",
58712
+ description: "How many named devices the mode cannot arm \u2014 muted, detection off, offline (title: m saltati).",
58713
+ example: "1",
58714
+ group: "system",
58715
+ families: ["rule"],
58716
+ fields: [...RULE_TEXT],
58717
+ kinds: ["system"],
58718
+ systemEventKinds: ["alarm-armed", "alarm-arming"]
58652
58719
  },
58653
58720
  {
58654
58721
  name: "bypassedNames",