@camstack/addon-agent-ui 1.2.172 → 1.2.174

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.
package/dist/addon.js CHANGED
@@ -10539,11 +10539,11 @@ var ModelVariantGroupSchema = object({
10539
10539
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10540
10540
  precision: _enum(["fp32", "int8"]).optional(),
10541
10541
  /**
10542
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10543
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10544
- * future performance variants plug into.
10542
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10543
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10544
+ * label is "Test".
10545
10545
  */
10546
- optimization: _enum(["standard", "fast"]).optional(),
10546
+ optimization: _enum(["standard", "test"]).optional(),
10547
10547
  /**
10548
10548
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10549
10549
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10566,9 +10566,10 @@ var ModelProviderIdSchema = _enum([
10566
10566
  * are per upstream. A persisted custom-model row written when this field was a
10567
10567
  * string still parses — the string is lifted into `{ weights }`.
10568
10568
  *
10569
- * Every licence surface (the admin "Models and licenses" page,
10570
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10571
- * these records by `scripts/gen-model-licenses.ts` (D661).
10569
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10570
+ * model table) is GENERATED from these records by
10571
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10572
+ * `camstack/docs` → `/docs/detection/models`.
10572
10573
  */
10573
10574
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10574
10575
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14097,7 +14098,7 @@ DeviceType.Camera;
14097
14098
  * This matters here more than anywhere else in the repo, because every provider
14098
14099
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14099
14100
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14100
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14101
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14101
14102
  * camera's own page will ask for its own login. That is correct, and pre-
14102
14103
  * filling it is the operator's business, not ours.
14103
14104
  *
@@ -17081,7 +17082,7 @@ method(object({
17081
17082
  timeoutMs: 6e5
17082
17083
  });
17083
17084
  method(object({
17084
- nodeId: string(),
17085
+ targetNodeId: string(),
17085
17086
  modelId: string(),
17086
17087
  format: _enum(MODEL_FORMATS),
17087
17088
  entry: ModelCatalogEntrySchema
@@ -19547,8 +19548,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19547
19548
  disabledTargetIds: array(string()).default([])
19548
19549
  });
19549
19550
  /**
19550
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19551
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19551
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19552
+ * report a still-true state. `addons` is the crash-looped addons only and
19553
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19552
19554
  * job is not an open state, and the alarm stays instant.
19553
19555
  */
19554
19556
  var NcStateSummarySectionIdSchema = _enum([
@@ -19560,6 +19562,7 @@ var NcStateSummarySectionIdSchema = _enum([
19560
19562
  "detection-blind",
19561
19563
  "nodes",
19562
19564
  "addons",
19565
+ "addon-updates",
19563
19566
  "updates"
19564
19567
  ]);
19565
19568
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20040,7 +20043,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20040
20043
  * When this mode may be armed. Absent / null = always allowed (same as a
20041
20044
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20042
20045
  */
20043
- schedule: NcScheduleSchema.optional()
20046
+ schedule: NcScheduleSchema.optional(),
20047
+ /**
20048
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20049
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20050
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20051
+ */
20052
+ notifyDuringEntryDelay: boolean().optional(),
20053
+ /**
20054
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20055
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20056
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20057
+ */
20058
+ notifySensorRewatched: boolean().optional()
20044
20059
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20045
20060
  var NcAlarmModeDelaysEditListSchema = array(object({
20046
20061
  mode: AlarmArmModeSchema,
@@ -20049,7 +20064,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20049
20064
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20050
20065
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20051
20066
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20052
- schedule: NcScheduleSchema.nullable().optional()
20067
+ schedule: NcScheduleSchema.nullable().optional(),
20068
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20069
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20070
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20071
+ notifySensorRewatched: boolean().nullable().optional()
20053
20072
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20054
20073
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20055
20074
  var NcAlarmNonBlockingEditSchema = object({
@@ -21010,39 +21029,19 @@ Object.freeze(Object.fromEntries([{
21010
21029
  label: "Face recognition model",
21011
21030
  defaultModelId: "auraface-r100",
21012
21031
  indexName: "the enrolled face gallery",
21013
- options: [
21014
- {
21015
- id: "auraface-r100",
21016
- label: "AuraFace R100"
21017
- },
21018
- {
21019
- id: "arcface-r100",
21020
- label: "ArcFace (ResNet34)"
21021
- },
21022
- {
21023
- id: "inception-resnet-v1",
21024
- label: "Inception ResNet V1"
21025
- }
21026
- ]
21032
+ options: [{
21033
+ id: "auraface-r100",
21034
+ label: "AuraFace R100"
21035
+ }]
21027
21036
  }, {
21028
21037
  stepId: "clip-embedding",
21029
21038
  label: "Semantic search model",
21030
- defaultModelId: "mobileclip-s1",
21039
+ defaultModelId: "siglip2-b16-224",
21031
21040
  indexName: "the object semantic-search index",
21032
- options: [
21033
- {
21034
- id: "mobileclip-s1",
21035
- label: "MobileCLIP S1"
21036
- },
21037
- {
21038
- id: "mobileclip-s2",
21039
- label: "MobileCLIP S2"
21040
- },
21041
- {
21042
- id: "siglip2-b16-224",
21043
- label: "SigLIP2 B/16 (Apache-2.0)"
21044
- }
21045
- ]
21041
+ options: [{
21042
+ id: "siglip2-b16-224",
21043
+ label: "SigLIP2 B/16 (Apache-2.0)"
21044
+ }]
21046
21045
  }].map((s) => [s.stepId, s.defaultModelId])));
21047
21046
  var CLUSTER_STEP_SETTING_FIELDS = [{
21048
21047
  stepId: "face-embedding",
@@ -23890,6 +23889,22 @@ var MotionSourceEnum = _enum([
23890
23889
  "device-activity"
23891
23890
  ]);
23892
23891
  /**
23892
+ * What opened an on-motion detection SESSION: the motion source that passed the
23893
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
23894
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
23895
+ * device name as the orchestrator's camera-sensors resolution last read it;
23896
+ * absent when unknown or when the camera itself triggered.
23897
+ *
23898
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
23899
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
23900
+ * runner never decides anything on it.
23901
+ */
23902
+ var SessionTriggerSchema = object({
23903
+ source: MotionSourceEnum,
23904
+ triggeredBy: MotionTriggeredBySchema,
23905
+ sensorName: string().optional()
23906
+ });
23907
+ /**
23893
23908
  * List of motion sources active on a camera. Empty array is valid:
23894
23909
  * "no source" — happens for battery cams without firmware motion when
23895
23910
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24141,6 +24156,14 @@ var RunnerCameraConfigSchema = object({
24141
24156
  */
24142
24157
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24143
24158
  /**
24159
+ * What opened this attach, on a SESSION attach only (see
24160
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24161
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24162
+ * behind it, and every attach from an orchestrator older than the field — the
24163
+ * runner then names no source on the phase event.
24164
+ */
24165
+ sessionTrigger: SessionTriggerSchema.optional(),
24166
+ /**
24144
24167
  * WHICH root detector runs for this camera. The detection counterpart of
24145
24168
  * {@link motionSources}, same shape and same discipline: a per-camera list
24146
24169
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30364,7 +30387,7 @@ var LocalInterfaceSchema = object({
30364
30387
  name: string(),
30365
30388
  family: _enum(["IPv4", "IPv6"]),
30366
30389
  address: string(),
30367
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30390
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30368
30391
  cidr: string(),
30369
30392
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30370
30393
  netmask: string(),
@@ -30418,7 +30441,8 @@ var ConnectionEndpointSchema = object({
30418
30441
  "lan-ipv4",
30419
30442
  "lan-ipv6",
30420
30443
  "public",
30421
- "loopback"
30444
+ "loopback",
30445
+ "app-link"
30422
30446
  ]),
30423
30447
  /**
30424
30448
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30487,15 +30511,27 @@ var GetConnectionEndpointsResultSchema = object({
30487
30511
  localPort: AdvertisedLocalPortSchema
30488
30512
  });
30489
30513
  /**
30490
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30491
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30492
- * what AUTO currently picks, so the UI can show the effective value either way.
30514
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30515
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30516
+ * so the UI can show it either way.
30493
30517
  */
30494
30518
  var NotificationEndpointSchema = object({
30495
30519
  /** The operator's explicit choice, or null for AUTO. */
30496
30520
  baseUrl: string().nullable(),
30497
- /** What the ranking currently resolves to (null when nothing is reachable). */
30498
- resolved: string().nullable()
30521
+ /**
30522
+ * The effective flagged address: the explicit choice, else (AUTO) the
30523
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30524
+ * answered the public tunnel / mesh here, or null.
30525
+ */
30526
+ resolved: string().nullable(),
30527
+ /**
30528
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30529
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30530
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30531
+ * hub advertises neither; the app link is then minted without `hub=`.
30532
+ * Absent on a pre-D709 hub.
30533
+ */
30534
+ appLinkHub: string().nullable()
30499
30535
  });
30500
30536
  /**
30501
30537
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30549,7 +30585,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30549
30585
  * Pass `'https'` when the caller is itself loaded over HTTPS
30550
30586
  * to avoid mixed-content blocks in the browser. The public
30551
30587
  * tunnel always emits `https://` regardless. */
30552
- scheme: _enum(["http", "https"]).optional()
30588
+ scheme: _enum(["http", "https"]).optional(),
30589
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30590
+ * an address notification links can be flagged with, not a hub
30591
+ * route. Default `false`: racers and rankers never see it. */
30592
+ includeAppLink: boolean().optional()
30553
30593
  }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
30554
30594
  kind: "mutation",
30555
30595
  auth: "admin"
@@ -30810,7 +30850,7 @@ var MeshPeerSchema = object({
30810
30850
  tags: array(string()).readonly(),
30811
30851
  /** True when the peer advertises itself as an exit-node candidate. */
30812
30852
  exitNodeOption: boolean(),
30813
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
30853
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
30814
30854
  advertisedRoutes: array(string()).readonly(),
30815
30855
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
30816
30856
  userLogin: string().nullable(),
@@ -31754,7 +31794,13 @@ var OsdStatusSchema = object({ overlays: array(object({
31754
31794
  */
31755
31795
  availablePositions: array(OsdPositionEnum).readonly(),
31756
31796
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
31757
- readOnly: boolean().optional()
31797
+ readOnly: boolean().optional(),
31798
+ /**
31799
+ * Firmware text ceiling for this overlay. Absent = no known limit.
31800
+ * The OSD manager truncates here on every write — never stores its own
31801
+ * copy on the binding.
31802
+ */
31803
+ maxCharacters: number().int().positive().optional()
31758
31804
  })).readonly() });
31759
31805
  var OsdOverlayPatchSchema = object({
31760
31806
  enabled: boolean().optional(),
@@ -31805,7 +31851,9 @@ var OsdTemplateBindingSchema = object({
31805
31851
  valuePath: string().min(1).max(64),
31806
31852
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
31807
31853
  displayUnit: string().max(16).optional(),
31808
- maxDecimals: number().int().min(0).max(4).default(1)
31854
+ maxDecimals: number().int().min(0).max(4).default(1),
31855
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
31856
+ valueMap: record(string(), string()).optional()
31809
31857
  });
31810
31858
  /**
31811
31859
  * A named template: bindings (alias → leaf field) + a parser that
@@ -31855,18 +31903,11 @@ var OsdSlotBindingSchema = object({
31855
31903
  source: OsdSourceSchema,
31856
31904
  /** `${value}` and `${unit}` are substituted; every occurrence. */
31857
31905
  template: string().max(96).default("${value}"),
31858
- /** Truncate with an ellipsis past this length. Absent = no limit. */
31859
- maxCharacters: number().int().min(4).max(64).optional(),
31860
31906
  /**
31861
31907
  * Decimal places for a numeric value. `0` yields an integer — the
31862
31908
  * documented workaround for firmwares that reject `.` in overlay text.
31863
31909
  */
31864
31910
  maxDecimals: number().int().min(0).max(4).default(1),
31865
- /**
31866
- * Appended via `${unit}` when no unit conversion produces a label.
31867
- * Prefer `source.displayUnit` for converted device-state values.
31868
- */
31869
- unitLabel: string().max(8).optional(),
31870
31911
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
31871
31912
  valueMap: record(string(), string()).optional(),
31872
31913
  /** Time windows in which the slot is shown. Absent = always. */
@@ -31875,9 +31916,7 @@ var OsdSlotBindingSchema = object({
31875
31916
  * Display gate, in the notification centre's condition vocabulary.
31876
31917
  * Only the keys reported by `getConditionSupport` are accepted.
31877
31918
  */
31878
- conditions: NcConditionsSchema.optional(),
31879
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
31880
- fallbackText: string().max(64).default("")
31919
+ conditions: NcConditionsSchema.optional()
31881
31920
  });
31882
31921
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
31883
31922
  var OsdSlotViewSchema = object({
@@ -47554,12 +47593,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47554
47593
  {
47555
47594
  id: "addons",
47556
47595
  family: "system",
47557
- label: "Addons",
47558
- kinds: [
47559
- "addon-crash-loop",
47560
- "addon-update-available",
47561
- "addon-updated"
47562
- ]
47596
+ label: "Addons stopped",
47597
+ kinds: ["addon-crash-loop"]
47598
+ },
47599
+ {
47600
+ id: "addon-updates",
47601
+ family: "system",
47602
+ label: "Addon updates",
47603
+ kinds: ["addon-update-available", "addon-updated"]
47563
47604
  },
47564
47605
  {
47565
47606
  id: "updates",
@@ -47719,13 +47760,15 @@ var STATE_SUMMARY_SECTION_VARS = [
47719
47760
  },
47720
47761
  {
47721
47762
  name: "summaryAddons",
47722
- label: "Summary: addons",
47723
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
47724
- kinds: [
47725
- "addon-crash-loop",
47726
- "addon-update-available",
47727
- "addon-updated"
47728
- ]
47763
+ label: "Summary: addons stopped",
47764
+ example: "hub — recorder stopped after repeated crashes",
47765
+ kinds: ["addon-crash-loop"]
47766
+ },
47767
+ {
47768
+ name: "summaryAddonUpdates",
47769
+ label: "Summary: addon updates",
47770
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
47771
+ kinds: ["addon-update-available", "addon-updated"]
47729
47772
  },
47730
47773
  {
47731
47774
  name: "summaryUpdates",
@@ -47809,6 +47852,7 @@ var STATE_SUMMARY_VARS = [
47809
47852
  [...RULE_BODY_ONLY],
47810
47853
  [...RULE_TEXT],
47811
47854
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
47855
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
47812
47856
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
47813
47857
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
47814
47858
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -47849,6 +47893,8 @@ var STATE_SUMMARY_VARS = [
47849
47893
  [...RULE_TEXT],
47850
47894
  [...RULE_TEXT],
47851
47895
  [...RULE_TEXT],
47896
+ [...RULE_TEXT],
47897
+ [...RULE_TEXT],
47852
47898
  ...STATE_SUMMARY_VARS
47853
47899
  ];
47854
47900
  new Set([
@@ -48389,7 +48435,7 @@ var AgentUIAddon = class extends BaseAddon {
48389
48435
  capability: adminUiCapability,
48390
48436
  provider: {
48391
48437
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
48392
- getVersion: async () => ({ version: "1.2.172" })
48438
+ getVersion: async () => ({ version: "1.2.174" })
48393
48439
  }
48394
48440
  }];
48395
48441
  }