@camstack/addon-provider-onvif 1.2.119 → 1.2.121

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.
Files changed (3) hide show
  1. package/dist/addon.js +123 -77
  2. package/dist/addon.mjs +123 -77
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -10533,11 +10533,11 @@ var ModelVariantGroupSchema = object({
10533
10533
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10534
10534
  precision: _enum(["fp32", "int8"]).optional(),
10535
10535
  /**
10536
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10537
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10538
- * future performance variants plug into.
10536
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10537
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10538
+ * label is "Test".
10539
10539
  */
10540
- optimization: _enum(["standard", "fast"]).optional(),
10540
+ optimization: _enum(["standard", "test"]).optional(),
10541
10541
  /**
10542
10542
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10543
10543
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10560,9 +10560,10 @@ var ModelProviderIdSchema = _enum([
10560
10560
  * are per upstream. A persisted custom-model row written when this field was a
10561
10561
  * string still parses — the string is lifted into `{ weights }`.
10562
10562
  *
10563
- * Every licence surface (the admin "Models and licenses" page,
10564
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10565
- * these records by `scripts/gen-model-licenses.ts` (D661).
10563
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10564
+ * model table) is GENERATED from these records by
10565
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10566
+ * `camstack/docs` → `/docs/detection/models`.
10566
10567
  */
10567
10568
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10568
10569
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14091,7 +14092,7 @@ DeviceType.Camera;
14091
14092
  * This matters here more than anywhere else in the repo, because every provider
14092
14093
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14093
14094
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14094
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14095
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14095
14096
  * camera's own page will ask for its own login. That is correct, and pre-
14096
14097
  * filling it is the operator's business, not ours.
14097
14098
  *
@@ -17269,7 +17270,7 @@ method(object({
17269
17270
  timeoutMs: 6e5
17270
17271
  });
17271
17272
  method(object({
17272
- nodeId: string(),
17273
+ targetNodeId: string(),
17273
17274
  modelId: string(),
17274
17275
  format: _enum(MODEL_FORMATS),
17275
17276
  entry: ModelCatalogEntrySchema
@@ -19735,8 +19736,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19735
19736
  disabledTargetIds: array(string()).default([])
19736
19737
  });
19737
19738
  /**
19738
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19739
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19739
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19740
+ * report a still-true state. `addons` is the crash-looped addons only and
19741
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19740
19742
  * job is not an open state, and the alarm stays instant.
19741
19743
  */
19742
19744
  var NcStateSummarySectionIdSchema = _enum([
@@ -19748,6 +19750,7 @@ var NcStateSummarySectionIdSchema = _enum([
19748
19750
  "detection-blind",
19749
19751
  "nodes",
19750
19752
  "addons",
19753
+ "addon-updates",
19751
19754
  "updates"
19752
19755
  ]);
19753
19756
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20228,7 +20231,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20228
20231
  * When this mode may be armed. Absent / null = always allowed (same as a
20229
20232
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20230
20233
  */
20231
- schedule: NcScheduleSchema.optional()
20234
+ schedule: NcScheduleSchema.optional(),
20235
+ /**
20236
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20237
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20238
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20239
+ */
20240
+ notifyDuringEntryDelay: boolean().optional(),
20241
+ /**
20242
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20243
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20244
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20245
+ */
20246
+ notifySensorRewatched: boolean().optional()
20232
20247
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20233
20248
  var NcAlarmModeDelaysEditListSchema = array(object({
20234
20249
  mode: AlarmArmModeSchema,
@@ -20237,7 +20252,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20237
20252
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20238
20253
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20239
20254
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20240
- schedule: NcScheduleSchema.nullable().optional()
20255
+ schedule: NcScheduleSchema.nullable().optional(),
20256
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20257
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20258
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20259
+ notifySensorRewatched: boolean().nullable().optional()
20241
20260
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20242
20261
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20243
20262
  var NcAlarmNonBlockingEditSchema = object({
@@ -21198,39 +21217,19 @@ Object.freeze(Object.fromEntries([{
21198
21217
  label: "Face recognition model",
21199
21218
  defaultModelId: "auraface-r100",
21200
21219
  indexName: "the enrolled face gallery",
21201
- options: [
21202
- {
21203
- id: "auraface-r100",
21204
- label: "AuraFace R100"
21205
- },
21206
- {
21207
- id: "arcface-r100",
21208
- label: "ArcFace (ResNet34)"
21209
- },
21210
- {
21211
- id: "inception-resnet-v1",
21212
- label: "Inception ResNet V1"
21213
- }
21214
- ]
21220
+ options: [{
21221
+ id: "auraface-r100",
21222
+ label: "AuraFace R100"
21223
+ }]
21215
21224
  }, {
21216
21225
  stepId: "clip-embedding",
21217
21226
  label: "Semantic search model",
21218
- defaultModelId: "mobileclip-s1",
21227
+ defaultModelId: "siglip2-b16-224",
21219
21228
  indexName: "the object semantic-search index",
21220
- options: [
21221
- {
21222
- id: "mobileclip-s1",
21223
- label: "MobileCLIP S1"
21224
- },
21225
- {
21226
- id: "mobileclip-s2",
21227
- label: "MobileCLIP S2"
21228
- },
21229
- {
21230
- id: "siglip2-b16-224",
21231
- label: "SigLIP2 B/16 (Apache-2.0)"
21232
- }
21233
- ]
21229
+ options: [{
21230
+ id: "siglip2-b16-224",
21231
+ label: "SigLIP2 B/16 (Apache-2.0)"
21232
+ }]
21234
21233
  }].map((s) => [s.stepId, s.defaultModelId])));
21235
21234
  var CLUSTER_STEP_SETTING_FIELDS = [{
21236
21235
  stepId: "face-embedding",
@@ -24078,6 +24077,22 @@ var MotionSourceEnum = _enum([
24078
24077
  "device-activity"
24079
24078
  ]);
24080
24079
  /**
24080
+ * What opened an on-motion detection SESSION: the motion source that passed the
24081
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24082
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24083
+ * device name as the orchestrator's camera-sensors resolution last read it;
24084
+ * absent when unknown or when the camera itself triggered.
24085
+ *
24086
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24087
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24088
+ * runner never decides anything on it.
24089
+ */
24090
+ var SessionTriggerSchema = object({
24091
+ source: MotionSourceEnum,
24092
+ triggeredBy: MotionTriggeredBySchema,
24093
+ sensorName: string().optional()
24094
+ });
24095
+ /**
24081
24096
  * List of motion sources active on a camera. Empty array is valid:
24082
24097
  * "no source" — happens for battery cams without firmware motion when
24083
24098
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24329,6 +24344,14 @@ var RunnerCameraConfigSchema = object({
24329
24344
  */
24330
24345
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24331
24346
  /**
24347
+ * What opened this attach, on a SESSION attach only (see
24348
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24349
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24350
+ * behind it, and every attach from an orchestrator older than the field — the
24351
+ * runner then names no source on the phase event.
24352
+ */
24353
+ sessionTrigger: SessionTriggerSchema.optional(),
24354
+ /**
24332
24355
  * WHICH root detector runs for this camera. The detection counterpart of
24333
24356
  * {@link motionSources}, same shape and same discipline: a per-camera list
24334
24357
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30656,7 +30679,7 @@ var LocalInterfaceSchema = object({
30656
30679
  name: string(),
30657
30680
  family: _enum(["IPv4", "IPv6"]),
30658
30681
  address: string(),
30659
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30682
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30660
30683
  cidr: string(),
30661
30684
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30662
30685
  netmask: string(),
@@ -30710,7 +30733,8 @@ var ConnectionEndpointSchema = object({
30710
30733
  "lan-ipv4",
30711
30734
  "lan-ipv6",
30712
30735
  "public",
30713
- "loopback"
30736
+ "loopback",
30737
+ "app-link"
30714
30738
  ]),
30715
30739
  /**
30716
30740
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30779,15 +30803,27 @@ var GetConnectionEndpointsResultSchema = object({
30779
30803
  localPort: AdvertisedLocalPortSchema
30780
30804
  });
30781
30805
  /**
30782
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30783
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30784
- * what AUTO currently picks, so the UI can show the effective value either way.
30806
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30807
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30808
+ * so the UI can show it either way.
30785
30809
  */
30786
30810
  var NotificationEndpointSchema = object({
30787
30811
  /** The operator's explicit choice, or null for AUTO. */
30788
30812
  baseUrl: string().nullable(),
30789
- /** What the ranking currently resolves to (null when nothing is reachable). */
30790
- resolved: string().nullable()
30813
+ /**
30814
+ * The effective flagged address: the explicit choice, else (AUTO) the
30815
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30816
+ * answered the public tunnel / mesh here, or null.
30817
+ */
30818
+ resolved: string().nullable(),
30819
+ /**
30820
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30821
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30822
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30823
+ * hub advertises neither; the app link is then minted without `hub=`.
30824
+ * Absent on a pre-D709 hub.
30825
+ */
30826
+ appLinkHub: string().nullable()
30791
30827
  });
30792
30828
  /**
30793
30829
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30841,7 +30877,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30841
30877
  * Pass `'https'` when the caller is itself loaded over HTTPS
30842
30878
  * to avoid mixed-content blocks in the browser. The public
30843
30879
  * tunnel always emits `https://` regardless. */
30844
- scheme: _enum(["http", "https"]).optional()
30880
+ scheme: _enum(["http", "https"]).optional(),
30881
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30882
+ * an address notification links can be flagged with, not a hub
30883
+ * route. Default `false`: racers and rankers never see it. */
30884
+ includeAppLink: boolean().optional()
30845
30885
  }), 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, {
30846
30886
  kind: "mutation",
30847
30887
  auth: "admin"
@@ -31102,7 +31142,7 @@ var MeshPeerSchema = object({
31102
31142
  tags: array(string()).readonly(),
31103
31143
  /** True when the peer advertises itself as an exit-node candidate. */
31104
31144
  exitNodeOption: boolean(),
31105
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31145
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
31106
31146
  advertisedRoutes: array(string()).readonly(),
31107
31147
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31108
31148
  userLogin: string().nullable(),
@@ -32046,7 +32086,13 @@ var OsdStatusSchema = object({ overlays: array(object({
32046
32086
  */
32047
32087
  availablePositions: array(OsdPositionEnum).readonly(),
32048
32088
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
32049
- readOnly: boolean().optional()
32089
+ readOnly: boolean().optional(),
32090
+ /**
32091
+ * Firmware text ceiling for this overlay. Absent = no known limit.
32092
+ * The OSD manager truncates here on every write — never stores its own
32093
+ * copy on the binding.
32094
+ */
32095
+ maxCharacters: number().int().positive().optional()
32050
32096
  })).readonly() });
32051
32097
  var OsdOverlayPatchSchema = object({
32052
32098
  enabled: boolean().optional(),
@@ -32097,7 +32143,9 @@ var OsdTemplateBindingSchema = object({
32097
32143
  valuePath: string().min(1).max(64),
32098
32144
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
32099
32145
  displayUnit: string().max(16).optional(),
32100
- maxDecimals: number().int().min(0).max(4).default(1)
32146
+ maxDecimals: number().int().min(0).max(4).default(1),
32147
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
32148
+ valueMap: record(string(), string()).optional()
32101
32149
  });
32102
32150
  /**
32103
32151
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32147,18 +32195,11 @@ var OsdSlotBindingSchema = object({
32147
32195
  source: OsdSourceSchema,
32148
32196
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32149
32197
  template: string().max(96).default("${value}"),
32150
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32151
- maxCharacters: number().int().min(4).max(64).optional(),
32152
32198
  /**
32153
32199
  * Decimal places for a numeric value. `0` yields an integer — the
32154
32200
  * documented workaround for firmwares that reject `.` in overlay text.
32155
32201
  */
32156
32202
  maxDecimals: number().int().min(0).max(4).default(1),
32157
- /**
32158
- * Appended via `${unit}` when no unit conversion produces a label.
32159
- * Prefer `source.displayUnit` for converted device-state values.
32160
- */
32161
- unitLabel: string().max(8).optional(),
32162
32203
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32163
32204
  valueMap: record(string(), string()).optional(),
32164
32205
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32167,9 +32208,7 @@ var OsdSlotBindingSchema = object({
32167
32208
  * Display gate, in the notification centre's condition vocabulary.
32168
32209
  * Only the keys reported by `getConditionSupport` are accepted.
32169
32210
  */
32170
- conditions: NcConditionsSchema.optional(),
32171
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32172
- fallbackText: string().max(64).default("")
32211
+ conditions: NcConditionsSchema.optional()
32173
32212
  });
32174
32213
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32175
32214
  var OsdSlotViewSchema = object({
@@ -48823,12 +48862,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
48823
48862
  {
48824
48863
  id: "addons",
48825
48864
  family: "system",
48826
- label: "Addons",
48827
- kinds: [
48828
- "addon-crash-loop",
48829
- "addon-update-available",
48830
- "addon-updated"
48831
- ]
48865
+ label: "Addons stopped",
48866
+ kinds: ["addon-crash-loop"]
48867
+ },
48868
+ {
48869
+ id: "addon-updates",
48870
+ family: "system",
48871
+ label: "Addon updates",
48872
+ kinds: ["addon-update-available", "addon-updated"]
48832
48873
  },
48833
48874
  {
48834
48875
  id: "updates",
@@ -48988,13 +49029,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48988
49029
  },
48989
49030
  {
48990
49031
  name: "summaryAddons",
48991
- label: "Summary: addons",
48992
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48993
- kinds: [
48994
- "addon-crash-loop",
48995
- "addon-update-available",
48996
- "addon-updated"
48997
- ]
49032
+ label: "Summary: addons stopped",
49033
+ example: "hub — recorder stopped after repeated crashes",
49034
+ kinds: ["addon-crash-loop"]
49035
+ },
49036
+ {
49037
+ name: "summaryAddonUpdates",
49038
+ label: "Summary: addon updates",
49039
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
49040
+ kinds: ["addon-update-available", "addon-updated"]
48998
49041
  },
48999
49042
  {
49000
49043
  name: "summaryUpdates",
@@ -49078,6 +49121,7 @@ var STATE_SUMMARY_VARS = [
49078
49121
  [...RULE_BODY_ONLY],
49079
49122
  [...RULE_TEXT],
49080
49123
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
49124
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
49081
49125
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
49082
49126
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
49083
49127
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -49118,6 +49162,8 @@ var STATE_SUMMARY_VARS = [
49118
49162
  [...RULE_TEXT],
49119
49163
  [...RULE_TEXT],
49120
49164
  [...RULE_TEXT],
49165
+ [...RULE_TEXT],
49166
+ [...RULE_TEXT],
49121
49167
  ...STATE_SUMMARY_VARS
49122
49168
  ];
49123
49169
  new Set([
@@ -59038,7 +59084,7 @@ var OnvifProviderAddon = class extends BaseDeviceProvider {
59038
59084
  key: "host",
59039
59085
  label: "Host",
59040
59086
  required: true,
59041
- placeholder: "192.168.x.x"
59087
+ placeholder: "192.168.10.10"
59042
59088
  },
59043
59089
  {
59044
59090
  type: "number",
package/dist/addon.mjs CHANGED
@@ -10534,11 +10534,11 @@ var ModelVariantGroupSchema = object({
10534
10534
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10535
10535
  precision: _enum(["fp32", "int8"]).optional(),
10536
10536
  /**
10537
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10538
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10539
- * future performance variants plug into.
10537
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10538
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10539
+ * label is "Test".
10540
10540
  */
10541
- optimization: _enum(["standard", "fast"]).optional(),
10541
+ optimization: _enum(["standard", "test"]).optional(),
10542
10542
  /**
10543
10543
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10544
10544
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10561,9 +10561,10 @@ var ModelProviderIdSchema = _enum([
10561
10561
  * are per upstream. A persisted custom-model row written when this field was a
10562
10562
  * string still parses — the string is lifted into `{ weights }`.
10563
10563
  *
10564
- * Every licence surface (the admin "Models and licenses" page,
10565
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10566
- * these records by `scripts/gen-model-licenses.ts` (D661).
10564
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10565
+ * model table) is GENERATED from these records by
10566
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10567
+ * `camstack/docs` → `/docs/detection/models`.
10567
10568
  */
10568
10569
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10569
10570
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14092,7 +14093,7 @@ DeviceType.Camera;
14092
14093
  * This matters here more than anywhere else in the repo, because every provider
14093
14094
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14094
14095
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14095
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14096
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14096
14097
  * camera's own page will ask for its own login. That is correct, and pre-
14097
14098
  * filling it is the operator's business, not ours.
14098
14099
  *
@@ -17270,7 +17271,7 @@ method(object({
17270
17271
  timeoutMs: 6e5
17271
17272
  });
17272
17273
  method(object({
17273
- nodeId: string(),
17274
+ targetNodeId: string(),
17274
17275
  modelId: string(),
17275
17276
  format: _enum(MODEL_FORMATS),
17276
17277
  entry: ModelCatalogEntrySchema
@@ -19736,8 +19737,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19736
19737
  disabledTargetIds: array(string()).default([])
19737
19738
  });
19738
19739
  /**
19739
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19740
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19740
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19741
+ * report a still-true state. `addons` is the crash-looped addons only and
19742
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19741
19743
  * job is not an open state, and the alarm stays instant.
19742
19744
  */
19743
19745
  var NcStateSummarySectionIdSchema = _enum([
@@ -19749,6 +19751,7 @@ var NcStateSummarySectionIdSchema = _enum([
19749
19751
  "detection-blind",
19750
19752
  "nodes",
19751
19753
  "addons",
19754
+ "addon-updates",
19752
19755
  "updates"
19753
19756
  ]);
19754
19757
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20229,7 +20232,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20229
20232
  * When this mode may be armed. Absent / null = always allowed (same as a
20230
20233
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20231
20234
  */
20232
- schedule: NcScheduleSchema.optional()
20235
+ schedule: NcScheduleSchema.optional(),
20236
+ /**
20237
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20238
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20239
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20240
+ */
20241
+ notifyDuringEntryDelay: boolean().optional(),
20242
+ /**
20243
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20244
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20245
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20246
+ */
20247
+ notifySensorRewatched: boolean().optional()
20233
20248
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20234
20249
  var NcAlarmModeDelaysEditListSchema = array(object({
20235
20250
  mode: AlarmArmModeSchema,
@@ -20238,7 +20253,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20238
20253
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20239
20254
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20240
20255
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20241
- schedule: NcScheduleSchema.nullable().optional()
20256
+ schedule: NcScheduleSchema.nullable().optional(),
20257
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20258
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20259
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20260
+ notifySensorRewatched: boolean().nullable().optional()
20242
20261
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20243
20262
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20244
20263
  var NcAlarmNonBlockingEditSchema = object({
@@ -21199,39 +21218,19 @@ Object.freeze(Object.fromEntries([{
21199
21218
  label: "Face recognition model",
21200
21219
  defaultModelId: "auraface-r100",
21201
21220
  indexName: "the enrolled face gallery",
21202
- options: [
21203
- {
21204
- id: "auraface-r100",
21205
- label: "AuraFace R100"
21206
- },
21207
- {
21208
- id: "arcface-r100",
21209
- label: "ArcFace (ResNet34)"
21210
- },
21211
- {
21212
- id: "inception-resnet-v1",
21213
- label: "Inception ResNet V1"
21214
- }
21215
- ]
21221
+ options: [{
21222
+ id: "auraface-r100",
21223
+ label: "AuraFace R100"
21224
+ }]
21216
21225
  }, {
21217
21226
  stepId: "clip-embedding",
21218
21227
  label: "Semantic search model",
21219
- defaultModelId: "mobileclip-s1",
21228
+ defaultModelId: "siglip2-b16-224",
21220
21229
  indexName: "the object semantic-search index",
21221
- options: [
21222
- {
21223
- id: "mobileclip-s1",
21224
- label: "MobileCLIP S1"
21225
- },
21226
- {
21227
- id: "mobileclip-s2",
21228
- label: "MobileCLIP S2"
21229
- },
21230
- {
21231
- id: "siglip2-b16-224",
21232
- label: "SigLIP2 B/16 (Apache-2.0)"
21233
- }
21234
- ]
21230
+ options: [{
21231
+ id: "siglip2-b16-224",
21232
+ label: "SigLIP2 B/16 (Apache-2.0)"
21233
+ }]
21235
21234
  }].map((s) => [s.stepId, s.defaultModelId])));
21236
21235
  var CLUSTER_STEP_SETTING_FIELDS = [{
21237
21236
  stepId: "face-embedding",
@@ -24079,6 +24078,22 @@ var MotionSourceEnum = _enum([
24079
24078
  "device-activity"
24080
24079
  ]);
24081
24080
  /**
24081
+ * What opened an on-motion detection SESSION: the motion source that passed the
24082
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24083
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24084
+ * device name as the orchestrator's camera-sensors resolution last read it;
24085
+ * absent when unknown or when the camera itself triggered.
24086
+ *
24087
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24088
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24089
+ * runner never decides anything on it.
24090
+ */
24091
+ var SessionTriggerSchema = object({
24092
+ source: MotionSourceEnum,
24093
+ triggeredBy: MotionTriggeredBySchema,
24094
+ sensorName: string().optional()
24095
+ });
24096
+ /**
24082
24097
  * List of motion sources active on a camera. Empty array is valid:
24083
24098
  * "no source" — happens for battery cams without firmware motion when
24084
24099
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24330,6 +24345,14 @@ var RunnerCameraConfigSchema = object({
24330
24345
  */
24331
24346
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24332
24347
  /**
24348
+ * What opened this attach, on a SESSION attach only (see
24349
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24350
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24351
+ * behind it, and every attach from an orchestrator older than the field — the
24352
+ * runner then names no source on the phase event.
24353
+ */
24354
+ sessionTrigger: SessionTriggerSchema.optional(),
24355
+ /**
24333
24356
  * WHICH root detector runs for this camera. The detection counterpart of
24334
24357
  * {@link motionSources}, same shape and same discipline: a per-camera list
24335
24358
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30657,7 +30680,7 @@ var LocalInterfaceSchema = object({
30657
30680
  name: string(),
30658
30681
  family: _enum(["IPv4", "IPv6"]),
30659
30682
  address: string(),
30660
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30683
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30661
30684
  cidr: string(),
30662
30685
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30663
30686
  netmask: string(),
@@ -30711,7 +30734,8 @@ var ConnectionEndpointSchema = object({
30711
30734
  "lan-ipv4",
30712
30735
  "lan-ipv6",
30713
30736
  "public",
30714
- "loopback"
30737
+ "loopback",
30738
+ "app-link"
30715
30739
  ]),
30716
30740
  /**
30717
30741
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30780,15 +30804,27 @@ var GetConnectionEndpointsResultSchema = object({
30780
30804
  localPort: AdvertisedLocalPortSchema
30781
30805
  });
30782
30806
  /**
30783
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30784
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30785
- * what AUTO currently picks, so the UI can show the effective value either way.
30807
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30808
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30809
+ * so the UI can show it either way.
30786
30810
  */
30787
30811
  var NotificationEndpointSchema = object({
30788
30812
  /** The operator's explicit choice, or null for AUTO. */
30789
30813
  baseUrl: string().nullable(),
30790
- /** What the ranking currently resolves to (null when nothing is reachable). */
30791
- resolved: string().nullable()
30814
+ /**
30815
+ * The effective flagged address: the explicit choice, else (AUTO) the
30816
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30817
+ * answered the public tunnel / mesh here, or null.
30818
+ */
30819
+ resolved: string().nullable(),
30820
+ /**
30821
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30822
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30823
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30824
+ * hub advertises neither; the app link is then minted without `hub=`.
30825
+ * Absent on a pre-D709 hub.
30826
+ */
30827
+ appLinkHub: string().nullable()
30792
30828
  });
30793
30829
  /**
30794
30830
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30842,7 +30878,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30842
30878
  * Pass `'https'` when the caller is itself loaded over HTTPS
30843
30879
  * to avoid mixed-content blocks in the browser. The public
30844
30880
  * tunnel always emits `https://` regardless. */
30845
- scheme: _enum(["http", "https"]).optional()
30881
+ scheme: _enum(["http", "https"]).optional(),
30882
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30883
+ * an address notification links can be flagged with, not a hub
30884
+ * route. Default `false`: racers and rankers never see it. */
30885
+ includeAppLink: boolean().optional()
30846
30886
  }), 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, {
30847
30887
  kind: "mutation",
30848
30888
  auth: "admin"
@@ -31103,7 +31143,7 @@ var MeshPeerSchema = object({
31103
31143
  tags: array(string()).readonly(),
31104
31144
  /** True when the peer advertises itself as an exit-node candidate. */
31105
31145
  exitNodeOption: boolean(),
31106
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31146
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
31107
31147
  advertisedRoutes: array(string()).readonly(),
31108
31148
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31109
31149
  userLogin: string().nullable(),
@@ -32047,7 +32087,13 @@ var OsdStatusSchema = object({ overlays: array(object({
32047
32087
  */
32048
32088
  availablePositions: array(OsdPositionEnum).readonly(),
32049
32089
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
32050
- readOnly: boolean().optional()
32090
+ readOnly: boolean().optional(),
32091
+ /**
32092
+ * Firmware text ceiling for this overlay. Absent = no known limit.
32093
+ * The OSD manager truncates here on every write — never stores its own
32094
+ * copy on the binding.
32095
+ */
32096
+ maxCharacters: number().int().positive().optional()
32051
32097
  })).readonly() });
32052
32098
  var OsdOverlayPatchSchema = object({
32053
32099
  enabled: boolean().optional(),
@@ -32098,7 +32144,9 @@ var OsdTemplateBindingSchema = object({
32098
32144
  valuePath: string().min(1).max(64),
32099
32145
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
32100
32146
  displayUnit: string().max(16).optional(),
32101
- maxDecimals: number().int().min(0).max(4).default(1)
32147
+ maxDecimals: number().int().min(0).max(4).default(1),
32148
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
32149
+ valueMap: record(string(), string()).optional()
32102
32150
  });
32103
32151
  /**
32104
32152
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32148,18 +32196,11 @@ var OsdSlotBindingSchema = object({
32148
32196
  source: OsdSourceSchema,
32149
32197
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32150
32198
  template: string().max(96).default("${value}"),
32151
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32152
- maxCharacters: number().int().min(4).max(64).optional(),
32153
32199
  /**
32154
32200
  * Decimal places for a numeric value. `0` yields an integer — the
32155
32201
  * documented workaround for firmwares that reject `.` in overlay text.
32156
32202
  */
32157
32203
  maxDecimals: number().int().min(0).max(4).default(1),
32158
- /**
32159
- * Appended via `${unit}` when no unit conversion produces a label.
32160
- * Prefer `source.displayUnit` for converted device-state values.
32161
- */
32162
- unitLabel: string().max(8).optional(),
32163
32204
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32164
32205
  valueMap: record(string(), string()).optional(),
32165
32206
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32168,9 +32209,7 @@ var OsdSlotBindingSchema = object({
32168
32209
  * Display gate, in the notification centre's condition vocabulary.
32169
32210
  * Only the keys reported by `getConditionSupport` are accepted.
32170
32211
  */
32171
- conditions: NcConditionsSchema.optional(),
32172
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32173
- fallbackText: string().max(64).default("")
32212
+ conditions: NcConditionsSchema.optional()
32174
32213
  });
32175
32214
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32176
32215
  var OsdSlotViewSchema = object({
@@ -48824,12 +48863,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
48824
48863
  {
48825
48864
  id: "addons",
48826
48865
  family: "system",
48827
- label: "Addons",
48828
- kinds: [
48829
- "addon-crash-loop",
48830
- "addon-update-available",
48831
- "addon-updated"
48832
- ]
48866
+ label: "Addons stopped",
48867
+ kinds: ["addon-crash-loop"]
48868
+ },
48869
+ {
48870
+ id: "addon-updates",
48871
+ family: "system",
48872
+ label: "Addon updates",
48873
+ kinds: ["addon-update-available", "addon-updated"]
48833
48874
  },
48834
48875
  {
48835
48876
  id: "updates",
@@ -48989,13 +49030,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48989
49030
  },
48990
49031
  {
48991
49032
  name: "summaryAddons",
48992
- label: "Summary: addons",
48993
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48994
- kinds: [
48995
- "addon-crash-loop",
48996
- "addon-update-available",
48997
- "addon-updated"
48998
- ]
49033
+ label: "Summary: addons stopped",
49034
+ example: "hub — recorder stopped after repeated crashes",
49035
+ kinds: ["addon-crash-loop"]
49036
+ },
49037
+ {
49038
+ name: "summaryAddonUpdates",
49039
+ label: "Summary: addon updates",
49040
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
49041
+ kinds: ["addon-update-available", "addon-updated"]
48999
49042
  },
49000
49043
  {
49001
49044
  name: "summaryUpdates",
@@ -49079,6 +49122,7 @@ var STATE_SUMMARY_VARS = [
49079
49122
  [...RULE_BODY_ONLY],
49080
49123
  [...RULE_TEXT],
49081
49124
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
49125
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
49082
49126
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
49083
49127
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
49084
49128
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -49119,6 +49163,8 @@ var STATE_SUMMARY_VARS = [
49119
49163
  [...RULE_TEXT],
49120
49164
  [...RULE_TEXT],
49121
49165
  [...RULE_TEXT],
49166
+ [...RULE_TEXT],
49167
+ [...RULE_TEXT],
49122
49168
  ...STATE_SUMMARY_VARS
49123
49169
  ];
49124
49170
  new Set([
@@ -59039,7 +59085,7 @@ var OnvifProviderAddon = class extends BaseDeviceProvider {
59039
59085
  key: "host",
59040
59086
  label: "Host",
59041
59087
  required: true,
59042
- placeholder: "192.168.x.x"
59088
+ placeholder: "192.168.10.10"
59043
59089
  },
59044
59090
  {
59045
59091
  type: "number",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-onvif",
3
- "version": "1.2.119",
3
+ "version": "1.2.121",
4
4
  "description": "ONVIF camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",