@camstack/addon-provider-wyze 0.2.126 → 0.2.127

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
@@ -10586,11 +10586,11 @@ var ModelVariantGroupSchema = object({
10586
10586
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10587
10587
  precision: _enum(["fp32", "int8"]).optional(),
10588
10588
  /**
10589
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10590
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10591
- * future performance variants plug into.
10589
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10590
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10591
+ * label is "Test".
10592
10592
  */
10593
- optimization: _enum(["standard", "fast"]).optional(),
10593
+ optimization: _enum(["standard", "test"]).optional(),
10594
10594
  /**
10595
10595
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10596
10596
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10613,9 +10613,10 @@ var ModelProviderIdSchema = _enum([
10613
10613
  * are per upstream. A persisted custom-model row written when this field was a
10614
10614
  * string still parses — the string is lifted into `{ weights }`.
10615
10615
  *
10616
- * Every licence surface (the admin "Models and licenses" page,
10617
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10618
- * these records by `scripts/gen-model-licenses.ts` (D661).
10616
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10617
+ * model table) is GENERATED from these records by
10618
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10619
+ * `camstack/docs` → `/docs/detection/models`.
10619
10620
  */
10620
10621
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10621
10622
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14246,7 +14247,7 @@ DeviceType.Camera;
14246
14247
  * This matters here more than anywhere else in the repo, because every provider
14247
14248
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14248
14249
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14249
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14250
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14250
14251
  * camera's own page will ask for its own login. That is correct, and pre-
14251
14252
  * filling it is the operator's business, not ours.
14252
14253
  *
@@ -17435,7 +17436,7 @@ method(object({
17435
17436
  timeoutMs: 6e5
17436
17437
  });
17437
17438
  method(object({
17438
- nodeId: string(),
17439
+ targetNodeId: string(),
17439
17440
  modelId: string(),
17440
17441
  format: _enum(MODEL_FORMATS),
17441
17442
  entry: ModelCatalogEntrySchema
@@ -19939,8 +19940,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19939
19940
  disabledTargetIds: array(string()).default([])
19940
19941
  });
19941
19942
  /**
19942
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19943
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19943
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19944
+ * report a still-true state. `addons` is the crash-looped addons only and
19945
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19944
19946
  * job is not an open state, and the alarm stays instant.
19945
19947
  */
19946
19948
  var NcStateSummarySectionIdSchema = _enum([
@@ -19952,6 +19954,7 @@ var NcStateSummarySectionIdSchema = _enum([
19952
19954
  "detection-blind",
19953
19955
  "nodes",
19954
19956
  "addons",
19957
+ "addon-updates",
19955
19958
  "updates"
19956
19959
  ]);
19957
19960
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20432,7 +20435,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20432
20435
  * When this mode may be armed. Absent / null = always allowed (same as a
20433
20436
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20434
20437
  */
20435
- schedule: NcScheduleSchema.optional()
20438
+ schedule: NcScheduleSchema.optional(),
20439
+ /**
20440
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20441
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20442
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20443
+ */
20444
+ notifyDuringEntryDelay: boolean().optional(),
20445
+ /**
20446
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20447
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20448
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20449
+ */
20450
+ notifySensorRewatched: boolean().optional()
20436
20451
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20437
20452
  var NcAlarmModeDelaysEditListSchema = array(object({
20438
20453
  mode: AlarmArmModeSchema,
@@ -20441,7 +20456,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20441
20456
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20442
20457
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20443
20458
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20444
- schedule: NcScheduleSchema.nullable().optional()
20459
+ schedule: NcScheduleSchema.nullable().optional(),
20460
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20461
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20462
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20463
+ notifySensorRewatched: boolean().nullable().optional()
20445
20464
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20446
20465
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20447
20466
  var NcAlarmNonBlockingEditSchema = object({
@@ -21402,39 +21421,19 @@ Object.freeze(Object.fromEntries([{
21402
21421
  label: "Face recognition model",
21403
21422
  defaultModelId: "auraface-r100",
21404
21423
  indexName: "the enrolled face gallery",
21405
- options: [
21406
- {
21407
- id: "auraface-r100",
21408
- label: "AuraFace R100"
21409
- },
21410
- {
21411
- id: "arcface-r100",
21412
- label: "ArcFace (ResNet34)"
21413
- },
21414
- {
21415
- id: "inception-resnet-v1",
21416
- label: "Inception ResNet V1"
21417
- }
21418
- ]
21424
+ options: [{
21425
+ id: "auraface-r100",
21426
+ label: "AuraFace R100"
21427
+ }]
21419
21428
  }, {
21420
21429
  stepId: "clip-embedding",
21421
21430
  label: "Semantic search model",
21422
- defaultModelId: "mobileclip-s1",
21431
+ defaultModelId: "siglip2-b16-224",
21423
21432
  indexName: "the object semantic-search index",
21424
- options: [
21425
- {
21426
- id: "mobileclip-s1",
21427
- label: "MobileCLIP S1"
21428
- },
21429
- {
21430
- id: "mobileclip-s2",
21431
- label: "MobileCLIP S2"
21432
- },
21433
- {
21434
- id: "siglip2-b16-224",
21435
- label: "SigLIP2 B/16 (Apache-2.0)"
21436
- }
21437
- ]
21433
+ options: [{
21434
+ id: "siglip2-b16-224",
21435
+ label: "SigLIP2 B/16 (Apache-2.0)"
21436
+ }]
21438
21437
  }].map((s) => [s.stepId, s.defaultModelId])));
21439
21438
  var CLUSTER_STEP_SETTING_FIELDS = [{
21440
21439
  stepId: "face-embedding",
@@ -24322,6 +24321,22 @@ var MotionSourceEnum = _enum([
24322
24321
  "device-activity"
24323
24322
  ]);
24324
24323
  /**
24324
+ * What opened an on-motion detection SESSION: the motion source that passed the
24325
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24326
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24327
+ * device name as the orchestrator's camera-sensors resolution last read it;
24328
+ * absent when unknown or when the camera itself triggered.
24329
+ *
24330
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24331
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24332
+ * runner never decides anything on it.
24333
+ */
24334
+ var SessionTriggerSchema = object({
24335
+ source: MotionSourceEnum,
24336
+ triggeredBy: MotionTriggeredBySchema,
24337
+ sensorName: string().optional()
24338
+ });
24339
+ /**
24325
24340
  * List of motion sources active on a camera. Empty array is valid:
24326
24341
  * "no source" — happens for battery cams without firmware motion when
24327
24342
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24573,6 +24588,14 @@ var RunnerCameraConfigSchema = object({
24573
24588
  */
24574
24589
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24575
24590
  /**
24591
+ * What opened this attach, on a SESSION attach only (see
24592
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24593
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24594
+ * behind it, and every attach from an orchestrator older than the field — the
24595
+ * runner then names no source on the phase event.
24596
+ */
24597
+ sessionTrigger: SessionTriggerSchema.optional(),
24598
+ /**
24576
24599
  * WHICH root detector runs for this camera. The detection counterpart of
24577
24600
  * {@link motionSources}, same shape and same discipline: a per-camera list
24578
24601
  * of sources the system understands, vendor-agnostic, owned here.
@@ -32073,7 +32096,7 @@ var LocalInterfaceSchema = object({
32073
32096
  name: string(),
32074
32097
  family: _enum(["IPv4", "IPv6"]),
32075
32098
  address: string(),
32076
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
32099
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
32077
32100
  cidr: string(),
32078
32101
  /** OS netmask. Stable across calls so the SDK can hash on it. */
32079
32102
  netmask: string(),
@@ -32127,7 +32150,8 @@ var ConnectionEndpointSchema = object({
32127
32150
  "lan-ipv4",
32128
32151
  "lan-ipv6",
32129
32152
  "public",
32130
- "loopback"
32153
+ "loopback",
32154
+ "app-link"
32131
32155
  ]),
32132
32156
  /**
32133
32157
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -32196,15 +32220,27 @@ var GetConnectionEndpointsResultSchema = object({
32196
32220
  localPort: AdvertisedLocalPortSchema
32197
32221
  });
32198
32222
  /**
32199
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
32200
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
32201
- * what AUTO currently picks, so the UI can show the effective value either way.
32223
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
32224
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
32225
+ * so the UI can show it either way.
32202
32226
  */
32203
32227
  var NotificationEndpointSchema = object({
32204
32228
  /** The operator's explicit choice, or null for AUTO. */
32205
32229
  baseUrl: string().nullable(),
32206
- /** What the ranking currently resolves to (null when nothing is reachable). */
32207
- resolved: string().nullable()
32230
+ /**
32231
+ * The effective flagged address: the explicit choice, else (AUTO) the
32232
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
32233
+ * answered the public tunnel / mesh here, or null.
32234
+ */
32235
+ resolved: string().nullable(),
32236
+ /**
32237
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
32238
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
32239
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
32240
+ * hub advertises neither; the app link is then minted without `hub=`.
32241
+ * Absent on a pre-D709 hub.
32242
+ */
32243
+ appLinkHub: string().nullable()
32208
32244
  });
32209
32245
  /**
32210
32246
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -32258,7 +32294,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
32258
32294
  * Pass `'https'` when the caller is itself loaded over HTTPS
32259
32295
  * to avoid mixed-content blocks in the browser. The public
32260
32296
  * tunnel always emits `https://` regardless. */
32261
- scheme: _enum(["http", "https"]).optional()
32297
+ scheme: _enum(["http", "https"]).optional(),
32298
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
32299
+ * an address notification links can be flagged with, not a hub
32300
+ * route. Default `false`: racers and rankers never see it. */
32301
+ includeAppLink: boolean().optional()
32262
32302
  }), 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, {
32263
32303
  kind: "mutation",
32264
32304
  auth: "admin"
@@ -32587,7 +32627,7 @@ var MeshPeerSchema = object({
32587
32627
  tags: array(string()).readonly(),
32588
32628
  /** True when the peer advertises itself as an exit-node candidate. */
32589
32629
  exitNodeOption: boolean(),
32590
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
32630
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
32591
32631
  advertisedRoutes: array(string()).readonly(),
32592
32632
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
32593
32633
  userLogin: string().nullable(),
@@ -33915,7 +33955,13 @@ var OsdStatusSchema = object({ overlays: array(object({
33915
33955
  */
33916
33956
  availablePositions: array(OsdPositionEnum).readonly(),
33917
33957
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
33918
- readOnly: boolean().optional()
33958
+ readOnly: boolean().optional(),
33959
+ /**
33960
+ * Firmware text ceiling for this overlay. Absent = no known limit.
33961
+ * The OSD manager truncates here on every write — never stores its own
33962
+ * copy on the binding.
33963
+ */
33964
+ maxCharacters: number().int().positive().optional()
33919
33965
  })).readonly() });
33920
33966
  var OsdOverlayPatchSchema = object({
33921
33967
  enabled: boolean().optional(),
@@ -33966,7 +34012,9 @@ var OsdTemplateBindingSchema = object({
33966
34012
  valuePath: string().min(1).max(64),
33967
34013
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
33968
34014
  displayUnit: string().max(16).optional(),
33969
- maxDecimals: number().int().min(0).max(4).default(1)
34015
+ maxDecimals: number().int().min(0).max(4).default(1),
34016
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
34017
+ valueMap: record(string(), string()).optional()
33970
34018
  });
33971
34019
  /**
33972
34020
  * A named template: bindings (alias → leaf field) + a parser that
@@ -34016,18 +34064,11 @@ var OsdSlotBindingSchema = object({
34016
34064
  source: OsdSourceSchema,
34017
34065
  /** `${value}` and `${unit}` are substituted; every occurrence. */
34018
34066
  template: string().max(96).default("${value}"),
34019
- /** Truncate with an ellipsis past this length. Absent = no limit. */
34020
- maxCharacters: number().int().min(4).max(64).optional(),
34021
34067
  /**
34022
34068
  * Decimal places for a numeric value. `0` yields an integer — the
34023
34069
  * documented workaround for firmwares that reject `.` in overlay text.
34024
34070
  */
34025
34071
  maxDecimals: number().int().min(0).max(4).default(1),
34026
- /**
34027
- * Appended via `${unit}` when no unit conversion produces a label.
34028
- * Prefer `source.displayUnit` for converted device-state values.
34029
- */
34030
- unitLabel: string().max(8).optional(),
34031
34072
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
34032
34073
  valueMap: record(string(), string()).optional(),
34033
34074
  /** Time windows in which the slot is shown. Absent = always. */
@@ -34036,9 +34077,7 @@ var OsdSlotBindingSchema = object({
34036
34077
  * Display gate, in the notification centre's condition vocabulary.
34037
34078
  * Only the keys reported by `getConditionSupport` are accepted.
34038
34079
  */
34039
- conditions: NcConditionsSchema.optional(),
34040
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
34041
- fallbackText: string().max(64).default("")
34080
+ conditions: NcConditionsSchema.optional()
34042
34081
  });
34043
34082
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
34044
34083
  var OsdSlotViewSchema = object({
@@ -52271,12 +52310,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52271
52310
  {
52272
52311
  id: "addons",
52273
52312
  family: "system",
52274
- label: "Addons",
52275
- kinds: [
52276
- "addon-crash-loop",
52277
- "addon-update-available",
52278
- "addon-updated"
52279
- ]
52313
+ label: "Addons stopped",
52314
+ kinds: ["addon-crash-loop"]
52315
+ },
52316
+ {
52317
+ id: "addon-updates",
52318
+ family: "system",
52319
+ label: "Addon updates",
52320
+ kinds: ["addon-update-available", "addon-updated"]
52280
52321
  },
52281
52322
  {
52282
52323
  id: "updates",
@@ -52436,13 +52477,15 @@ var STATE_SUMMARY_SECTION_VARS = [
52436
52477
  },
52437
52478
  {
52438
52479
  name: "summaryAddons",
52439
- label: "Summary: addons",
52440
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
52441
- kinds: [
52442
- "addon-crash-loop",
52443
- "addon-update-available",
52444
- "addon-updated"
52445
- ]
52480
+ label: "Summary: addons stopped",
52481
+ example: "hub — recorder stopped after repeated crashes",
52482
+ kinds: ["addon-crash-loop"]
52483
+ },
52484
+ {
52485
+ name: "summaryAddonUpdates",
52486
+ label: "Summary: addon updates",
52487
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
52488
+ kinds: ["addon-update-available", "addon-updated"]
52446
52489
  },
52447
52490
  {
52448
52491
  name: "summaryUpdates",
@@ -52526,6 +52569,7 @@ var STATE_SUMMARY_VARS = [
52526
52569
  [...RULE_BODY_ONLY],
52527
52570
  [...RULE_TEXT],
52528
52571
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
52572
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
52529
52573
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
52530
52574
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
52531
52575
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -52566,6 +52610,8 @@ var STATE_SUMMARY_VARS = [
52566
52610
  [...RULE_TEXT],
52567
52611
  [...RULE_TEXT],
52568
52612
  [...RULE_TEXT],
52613
+ [...RULE_TEXT],
52614
+ [...RULE_TEXT],
52569
52615
  ...STATE_SUMMARY_VARS
52570
52616
  ];
52571
52617
  new Set([
@@ -56517,7 +56563,7 @@ function buildCreationFormSchema() {
56517
56563
  key: "ip",
56518
56564
  label: "Local IP",
56519
56565
  required: true,
56520
- placeholder: "192.168.x.x"
56566
+ placeholder: "192.168.10.41"
56521
56567
  },
56522
56568
  {
56523
56569
  type: "text",
package/dist/addon.mjs CHANGED
@@ -10565,11 +10565,11 @@ var ModelVariantGroupSchema = object({
10565
10565
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10566
10566
  precision: _enum(["fp32", "int8"]).optional(),
10567
10567
  /**
10568
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10569
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10570
- * future performance variants plug into.
10568
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10569
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10570
+ * label is "Test".
10571
10571
  */
10572
- optimization: _enum(["standard", "fast"]).optional(),
10572
+ optimization: _enum(["standard", "test"]).optional(),
10573
10573
  /**
10574
10574
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10575
10575
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10592,9 +10592,10 @@ var ModelProviderIdSchema = _enum([
10592
10592
  * are per upstream. A persisted custom-model row written when this field was a
10593
10593
  * string still parses — the string is lifted into `{ weights }`.
10594
10594
  *
10595
- * Every licence surface (the admin "Models and licenses" page,
10596
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10597
- * these records by `scripts/gen-model-licenses.ts` (D661).
10595
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10596
+ * model table) is GENERATED from these records by
10597
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10598
+ * `camstack/docs` → `/docs/detection/models`.
10598
10599
  */
10599
10600
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10600
10601
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14225,7 +14226,7 @@ DeviceType.Camera;
14225
14226
  * This matters here more than anywhere else in the repo, because every provider
14226
14227
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14227
14228
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14228
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14229
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14229
14230
  * camera's own page will ask for its own login. That is correct, and pre-
14230
14231
  * filling it is the operator's business, not ours.
14231
14232
  *
@@ -17414,7 +17415,7 @@ method(object({
17414
17415
  timeoutMs: 6e5
17415
17416
  });
17416
17417
  method(object({
17417
- nodeId: string(),
17418
+ targetNodeId: string(),
17418
17419
  modelId: string(),
17419
17420
  format: _enum(MODEL_FORMATS),
17420
17421
  entry: ModelCatalogEntrySchema
@@ -19918,8 +19919,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19918
19919
  disabledTargetIds: array(string()).default([])
19919
19920
  });
19920
19921
  /**
19921
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19922
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19922
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19923
+ * report a still-true state. `addons` is the crash-looped addons only and
19924
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19923
19925
  * job is not an open state, and the alarm stays instant.
19924
19926
  */
19925
19927
  var NcStateSummarySectionIdSchema = _enum([
@@ -19931,6 +19933,7 @@ var NcStateSummarySectionIdSchema = _enum([
19931
19933
  "detection-blind",
19932
19934
  "nodes",
19933
19935
  "addons",
19936
+ "addon-updates",
19934
19937
  "updates"
19935
19938
  ]);
19936
19939
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20411,7 +20414,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20411
20414
  * When this mode may be armed. Absent / null = always allowed (same as a
20412
20415
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20413
20416
  */
20414
- schedule: NcScheduleSchema.optional()
20417
+ schedule: NcScheduleSchema.optional(),
20418
+ /**
20419
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20420
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20421
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20422
+ */
20423
+ notifyDuringEntryDelay: boolean().optional(),
20424
+ /**
20425
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20426
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20427
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20428
+ */
20429
+ notifySensorRewatched: boolean().optional()
20415
20430
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20416
20431
  var NcAlarmModeDelaysEditListSchema = array(object({
20417
20432
  mode: AlarmArmModeSchema,
@@ -20420,7 +20435,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20420
20435
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20421
20436
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20422
20437
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20423
- schedule: NcScheduleSchema.nullable().optional()
20438
+ schedule: NcScheduleSchema.nullable().optional(),
20439
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20440
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20441
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20442
+ notifySensorRewatched: boolean().nullable().optional()
20424
20443
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20425
20444
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20426
20445
  var NcAlarmNonBlockingEditSchema = object({
@@ -21381,39 +21400,19 @@ Object.freeze(Object.fromEntries([{
21381
21400
  label: "Face recognition model",
21382
21401
  defaultModelId: "auraface-r100",
21383
21402
  indexName: "the enrolled face gallery",
21384
- options: [
21385
- {
21386
- id: "auraface-r100",
21387
- label: "AuraFace R100"
21388
- },
21389
- {
21390
- id: "arcface-r100",
21391
- label: "ArcFace (ResNet34)"
21392
- },
21393
- {
21394
- id: "inception-resnet-v1",
21395
- label: "Inception ResNet V1"
21396
- }
21397
- ]
21403
+ options: [{
21404
+ id: "auraface-r100",
21405
+ label: "AuraFace R100"
21406
+ }]
21398
21407
  }, {
21399
21408
  stepId: "clip-embedding",
21400
21409
  label: "Semantic search model",
21401
- defaultModelId: "mobileclip-s1",
21410
+ defaultModelId: "siglip2-b16-224",
21402
21411
  indexName: "the object semantic-search index",
21403
- options: [
21404
- {
21405
- id: "mobileclip-s1",
21406
- label: "MobileCLIP S1"
21407
- },
21408
- {
21409
- id: "mobileclip-s2",
21410
- label: "MobileCLIP S2"
21411
- },
21412
- {
21413
- id: "siglip2-b16-224",
21414
- label: "SigLIP2 B/16 (Apache-2.0)"
21415
- }
21416
- ]
21412
+ options: [{
21413
+ id: "siglip2-b16-224",
21414
+ label: "SigLIP2 B/16 (Apache-2.0)"
21415
+ }]
21417
21416
  }].map((s) => [s.stepId, s.defaultModelId])));
21418
21417
  var CLUSTER_STEP_SETTING_FIELDS = [{
21419
21418
  stepId: "face-embedding",
@@ -24301,6 +24300,22 @@ var MotionSourceEnum = _enum([
24301
24300
  "device-activity"
24302
24301
  ]);
24303
24302
  /**
24303
+ * What opened an on-motion detection SESSION: the motion source that passed the
24304
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24305
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24306
+ * device name as the orchestrator's camera-sensors resolution last read it;
24307
+ * absent when unknown or when the camera itself triggered.
24308
+ *
24309
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24310
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24311
+ * runner never decides anything on it.
24312
+ */
24313
+ var SessionTriggerSchema = object({
24314
+ source: MotionSourceEnum,
24315
+ triggeredBy: MotionTriggeredBySchema,
24316
+ sensorName: string().optional()
24317
+ });
24318
+ /**
24304
24319
  * List of motion sources active on a camera. Empty array is valid:
24305
24320
  * "no source" — happens for battery cams without firmware motion when
24306
24321
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24552,6 +24567,14 @@ var RunnerCameraConfigSchema = object({
24552
24567
  */
24553
24568
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24554
24569
  /**
24570
+ * What opened this attach, on a SESSION attach only (see
24571
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24572
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24573
+ * behind it, and every attach from an orchestrator older than the field — the
24574
+ * runner then names no source on the phase event.
24575
+ */
24576
+ sessionTrigger: SessionTriggerSchema.optional(),
24577
+ /**
24555
24578
  * WHICH root detector runs for this camera. The detection counterpart of
24556
24579
  * {@link motionSources}, same shape and same discipline: a per-camera list
24557
24580
  * of sources the system understands, vendor-agnostic, owned here.
@@ -32052,7 +32075,7 @@ var LocalInterfaceSchema = object({
32052
32075
  name: string(),
32053
32076
  family: _enum(["IPv4", "IPv6"]),
32054
32077
  address: string(),
32055
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
32078
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
32056
32079
  cidr: string(),
32057
32080
  /** OS netmask. Stable across calls so the SDK can hash on it. */
32058
32081
  netmask: string(),
@@ -32106,7 +32129,8 @@ var ConnectionEndpointSchema = object({
32106
32129
  "lan-ipv4",
32107
32130
  "lan-ipv6",
32108
32131
  "public",
32109
- "loopback"
32132
+ "loopback",
32133
+ "app-link"
32110
32134
  ]),
32111
32135
  /**
32112
32136
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -32175,15 +32199,27 @@ var GetConnectionEndpointsResultSchema = object({
32175
32199
  localPort: AdvertisedLocalPortSchema
32176
32200
  });
32177
32201
  /**
32178
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
32179
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
32180
- * what AUTO currently picks, so the UI can show the effective value either way.
32202
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
32203
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
32204
+ * so the UI can show it either way.
32181
32205
  */
32182
32206
  var NotificationEndpointSchema = object({
32183
32207
  /** The operator's explicit choice, or null for AUTO. */
32184
32208
  baseUrl: string().nullable(),
32185
- /** What the ranking currently resolves to (null when nothing is reachable). */
32186
- resolved: string().nullable()
32209
+ /**
32210
+ * The effective flagged address: the explicit choice, else (AUTO) the
32211
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
32212
+ * answered the public tunnel / mesh here, or null.
32213
+ */
32214
+ resolved: string().nullable(),
32215
+ /**
32216
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
32217
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
32218
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
32219
+ * hub advertises neither; the app link is then minted without `hub=`.
32220
+ * Absent on a pre-D709 hub.
32221
+ */
32222
+ appLinkHub: string().nullable()
32187
32223
  });
32188
32224
  /**
32189
32225
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -32237,7 +32273,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
32237
32273
  * Pass `'https'` when the caller is itself loaded over HTTPS
32238
32274
  * to avoid mixed-content blocks in the browser. The public
32239
32275
  * tunnel always emits `https://` regardless. */
32240
- scheme: _enum(["http", "https"]).optional()
32276
+ scheme: _enum(["http", "https"]).optional(),
32277
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
32278
+ * an address notification links can be flagged with, not a hub
32279
+ * route. Default `false`: racers and rankers never see it. */
32280
+ includeAppLink: boolean().optional()
32241
32281
  }), 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, {
32242
32282
  kind: "mutation",
32243
32283
  auth: "admin"
@@ -32566,7 +32606,7 @@ var MeshPeerSchema = object({
32566
32606
  tags: array(string()).readonly(),
32567
32607
  /** True when the peer advertises itself as an exit-node candidate. */
32568
32608
  exitNodeOption: boolean(),
32569
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
32609
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
32570
32610
  advertisedRoutes: array(string()).readonly(),
32571
32611
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
32572
32612
  userLogin: string().nullable(),
@@ -33894,7 +33934,13 @@ var OsdStatusSchema = object({ overlays: array(object({
33894
33934
  */
33895
33935
  availablePositions: array(OsdPositionEnum).readonly(),
33896
33936
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
33897
- readOnly: boolean().optional()
33937
+ readOnly: boolean().optional(),
33938
+ /**
33939
+ * Firmware text ceiling for this overlay. Absent = no known limit.
33940
+ * The OSD manager truncates here on every write — never stores its own
33941
+ * copy on the binding.
33942
+ */
33943
+ maxCharacters: number().int().positive().optional()
33898
33944
  })).readonly() });
33899
33945
  var OsdOverlayPatchSchema = object({
33900
33946
  enabled: boolean().optional(),
@@ -33945,7 +33991,9 @@ var OsdTemplateBindingSchema = object({
33945
33991
  valuePath: string().min(1).max(64),
33946
33992
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
33947
33993
  displayUnit: string().max(16).optional(),
33948
- maxDecimals: number().int().min(0).max(4).default(1)
33994
+ maxDecimals: number().int().min(0).max(4).default(1),
33995
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
33996
+ valueMap: record(string(), string()).optional()
33949
33997
  });
33950
33998
  /**
33951
33999
  * A named template: bindings (alias → leaf field) + a parser that
@@ -33995,18 +34043,11 @@ var OsdSlotBindingSchema = object({
33995
34043
  source: OsdSourceSchema,
33996
34044
  /** `${value}` and `${unit}` are substituted; every occurrence. */
33997
34045
  template: string().max(96).default("${value}"),
33998
- /** Truncate with an ellipsis past this length. Absent = no limit. */
33999
- maxCharacters: number().int().min(4).max(64).optional(),
34000
34046
  /**
34001
34047
  * Decimal places for a numeric value. `0` yields an integer — the
34002
34048
  * documented workaround for firmwares that reject `.` in overlay text.
34003
34049
  */
34004
34050
  maxDecimals: number().int().min(0).max(4).default(1),
34005
- /**
34006
- * Appended via `${unit}` when no unit conversion produces a label.
34007
- * Prefer `source.displayUnit` for converted device-state values.
34008
- */
34009
- unitLabel: string().max(8).optional(),
34010
34051
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
34011
34052
  valueMap: record(string(), string()).optional(),
34012
34053
  /** Time windows in which the slot is shown. Absent = always. */
@@ -34015,9 +34056,7 @@ var OsdSlotBindingSchema = object({
34015
34056
  * Display gate, in the notification centre's condition vocabulary.
34016
34057
  * Only the keys reported by `getConditionSupport` are accepted.
34017
34058
  */
34018
- conditions: NcConditionsSchema.optional(),
34019
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
34020
- fallbackText: string().max(64).default("")
34059
+ conditions: NcConditionsSchema.optional()
34021
34060
  });
34022
34061
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
34023
34062
  var OsdSlotViewSchema = object({
@@ -52250,12 +52289,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52250
52289
  {
52251
52290
  id: "addons",
52252
52291
  family: "system",
52253
- label: "Addons",
52254
- kinds: [
52255
- "addon-crash-loop",
52256
- "addon-update-available",
52257
- "addon-updated"
52258
- ]
52292
+ label: "Addons stopped",
52293
+ kinds: ["addon-crash-loop"]
52294
+ },
52295
+ {
52296
+ id: "addon-updates",
52297
+ family: "system",
52298
+ label: "Addon updates",
52299
+ kinds: ["addon-update-available", "addon-updated"]
52259
52300
  },
52260
52301
  {
52261
52302
  id: "updates",
@@ -52415,13 +52456,15 @@ var STATE_SUMMARY_SECTION_VARS = [
52415
52456
  },
52416
52457
  {
52417
52458
  name: "summaryAddons",
52418
- label: "Summary: addons",
52419
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
52420
- kinds: [
52421
- "addon-crash-loop",
52422
- "addon-update-available",
52423
- "addon-updated"
52424
- ]
52459
+ label: "Summary: addons stopped",
52460
+ example: "hub — recorder stopped after repeated crashes",
52461
+ kinds: ["addon-crash-loop"]
52462
+ },
52463
+ {
52464
+ name: "summaryAddonUpdates",
52465
+ label: "Summary: addon updates",
52466
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
52467
+ kinds: ["addon-update-available", "addon-updated"]
52425
52468
  },
52426
52469
  {
52427
52470
  name: "summaryUpdates",
@@ -52505,6 +52548,7 @@ var STATE_SUMMARY_VARS = [
52505
52548
  [...RULE_BODY_ONLY],
52506
52549
  [...RULE_TEXT],
52507
52550
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
52551
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
52508
52552
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
52509
52553
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
52510
52554
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -52545,6 +52589,8 @@ var STATE_SUMMARY_VARS = [
52545
52589
  [...RULE_TEXT],
52546
52590
  [...RULE_TEXT],
52547
52591
  [...RULE_TEXT],
52592
+ [...RULE_TEXT],
52593
+ [...RULE_TEXT],
52548
52594
  ...STATE_SUMMARY_VARS
52549
52595
  ];
52550
52596
  new Set([
@@ -56496,7 +56542,7 @@ function buildCreationFormSchema() {
56496
56542
  key: "ip",
56497
56543
  label: "Local IP",
56498
56544
  required: true,
56499
- placeholder: "192.168.x.x"
56545
+ placeholder: "192.168.10.41"
56500
56546
  },
56501
56547
  {
56502
56548
  type: "text",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.126",
3
+ "version": "0.2.127",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",