@camstack/addon-provider-dreame 0.2.121 → 0.2.123

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 +122 -76
  2. package/dist/addon.mjs +122 -76
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -63437,11 +63437,11 @@ var ModelVariantGroupSchema = object({
63437
63437
  /** Quantization axis. Omit ⇒ the fp32 base build. */
63438
63438
  precision: _enum(["fp32", "int8"]).optional(),
63439
63439
  /**
63440
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
63441
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
63442
- * future performance variants plug into.
63440
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
63441
+ * an alternate training of the same family (Scrypted `relu_test`); chip
63442
+ * label is "Test".
63443
63443
  */
63444
- optimization: _enum(["standard", "fast"]).optional(),
63444
+ optimization: _enum(["standard", "test"]).optional(),
63445
63445
  /**
63446
63446
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
63447
63447
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -63464,9 +63464,10 @@ var ModelProviderIdSchema = _enum([
63464
63464
  * are per upstream. A persisted custom-model row written when this field was a
63465
63465
  * string still parses — the string is lifted into `{ weights }`.
63466
63466
  *
63467
- * Every licence surface (the admin "Models and licenses" page,
63468
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
63469
- * these records by `scripts/gen-model-licenses.ts` (D661).
63467
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
63468
+ * model table) is GENERATED from these records by
63469
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
63470
+ * `camstack/docs` → `/docs/detection/models`.
63470
63471
  */
63471
63472
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
63472
63473
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -67097,7 +67098,7 @@ DeviceType.Camera;
67097
67098
  * This matters here more than anywhere else in the repo, because every provider
67098
67099
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
67099
67100
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
67100
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
67101
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
67101
67102
  * camera's own page will ask for its own login. That is correct, and pre-
67102
67103
  * filling it is the operator's business, not ours.
67103
67104
  *
@@ -70286,7 +70287,7 @@ method(object({
70286
70287
  timeoutMs: 6e5
70287
70288
  });
70288
70289
  method(object({
70289
- nodeId: string(),
70290
+ targetNodeId: string(),
70290
70291
  modelId: string(),
70291
70292
  format: _enum(MODEL_FORMATS),
70292
70293
  entry: ModelCatalogEntrySchema
@@ -72790,8 +72791,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
72790
72791
  disabledTargetIds: array(string()).default([])
72791
72792
  });
72792
72793
  /**
72793
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
72794
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
72794
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
72795
+ * report a still-true state. `addons` is the crash-looped addons only and
72796
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
72795
72797
  * job is not an open state, and the alarm stays instant.
72796
72798
  */
72797
72799
  var NcStateSummarySectionIdSchema = _enum([
@@ -72803,6 +72805,7 @@ var NcStateSummarySectionIdSchema = _enum([
72803
72805
  "detection-blind",
72804
72806
  "nodes",
72805
72807
  "addons",
72808
+ "addon-updates",
72806
72809
  "updates"
72807
72810
  ]);
72808
72811
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -73283,7 +73286,19 @@ var NcAlarmModeDelaysListSchema = array(object({
73283
73286
  * When this mode may be armed. Absent / null = always allowed (same as a
73284
73287
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
73285
73288
  */
73286
- schedule: NcScheduleSchema.optional()
73289
+ schedule: NcScheduleSchema.optional(),
73290
+ /**
73291
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
73292
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
73293
+ * only one, and the matches ride the triggered notification's mosaic (D705).
73294
+ */
73295
+ notifyDuringEntryDelay: boolean().optional(),
73296
+ /**
73297
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
73298
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
73299
+ * is the one that starts the entry delay — the entry-delay notification already names it.
73300
+ */
73301
+ notifySensorRewatched: boolean().optional()
73287
73302
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
73288
73303
  var NcAlarmModeDelaysEditListSchema = array(object({
73289
73304
  mode: AlarmArmModeSchema,
@@ -73292,7 +73307,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
73292
73307
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
73293
73308
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
73294
73309
  /** Set a schedule, or `null` to clear (mode always allowed again). */
73295
- schedule: NcScheduleSchema.nullable().optional()
73310
+ schedule: NcScheduleSchema.nullable().optional(),
73311
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
73312
+ notifyDuringEntryDelay: boolean().nullable().optional(),
73313
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
73314
+ notifySensorRewatched: boolean().nullable().optional()
73296
73315
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
73297
73316
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
73298
73317
  var NcAlarmNonBlockingEditSchema = object({
@@ -74253,39 +74272,19 @@ Object.freeze(Object.fromEntries([{
74253
74272
  label: "Face recognition model",
74254
74273
  defaultModelId: "auraface-r100",
74255
74274
  indexName: "the enrolled face gallery",
74256
- options: [
74257
- {
74258
- id: "auraface-r100",
74259
- label: "AuraFace R100"
74260
- },
74261
- {
74262
- id: "arcface-r100",
74263
- label: "ArcFace (ResNet34)"
74264
- },
74265
- {
74266
- id: "inception-resnet-v1",
74267
- label: "Inception ResNet V1"
74268
- }
74269
- ]
74275
+ options: [{
74276
+ id: "auraface-r100",
74277
+ label: "AuraFace R100"
74278
+ }]
74270
74279
  }, {
74271
74280
  stepId: "clip-embedding",
74272
74281
  label: "Semantic search model",
74273
- defaultModelId: "mobileclip-s1",
74282
+ defaultModelId: "siglip2-b16-224",
74274
74283
  indexName: "the object semantic-search index",
74275
- options: [
74276
- {
74277
- id: "mobileclip-s1",
74278
- label: "MobileCLIP S1"
74279
- },
74280
- {
74281
- id: "mobileclip-s2",
74282
- label: "MobileCLIP S2"
74283
- },
74284
- {
74285
- id: "siglip2-b16-224",
74286
- label: "SigLIP2 B/16 (Apache-2.0)"
74287
- }
74288
- ]
74284
+ options: [{
74285
+ id: "siglip2-b16-224",
74286
+ label: "SigLIP2 B/16 (Apache-2.0)"
74287
+ }]
74289
74288
  }].map((s) => [s.stepId, s.defaultModelId])));
74290
74289
  var CLUSTER_STEP_SETTING_FIELDS = [{
74291
74290
  stepId: "face-embedding",
@@ -77173,6 +77172,22 @@ var MotionSourceEnum = _enum([
77173
77172
  "device-activity"
77174
77173
  ]);
77175
77174
  /**
77175
+ * What opened an on-motion detection SESSION: the motion source that passed the
77176
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
77177
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
77178
+ * device name as the orchestrator's camera-sensors resolution last read it;
77179
+ * absent when unknown or when the camera itself triggered.
77180
+ *
77181
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
77182
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
77183
+ * runner never decides anything on it.
77184
+ */
77185
+ var SessionTriggerSchema = object({
77186
+ source: MotionSourceEnum,
77187
+ triggeredBy: MotionTriggeredBySchema,
77188
+ sensorName: string().optional()
77189
+ });
77190
+ /**
77176
77191
  * List of motion sources active on a camera. Empty array is valid:
77177
77192
  * "no source" — happens for battery cams without firmware motion when
77178
77193
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -77424,6 +77439,14 @@ var RunnerCameraConfigSchema = object({
77424
77439
  */
77425
77440
  motionSources: MotionSourcesSchema.default(["analyzer"]),
77426
77441
  /**
77442
+ * What opened this attach, on a SESSION attach only (see
77443
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
77444
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
77445
+ * behind it, and every attach from an orchestrator older than the field — the
77446
+ * runner then names no source on the phase event.
77447
+ */
77448
+ sessionTrigger: SessionTriggerSchema.optional(),
77449
+ /**
77427
77450
  * WHICH root detector runs for this camera. The detection counterpart of
77428
77451
  * {@link motionSources}, same shape and same discipline: a per-camera list
77429
77452
  * of sources the system understands, vendor-agnostic, owned here.
@@ -84837,7 +84860,7 @@ var LocalInterfaceSchema = object({
84837
84860
  name: string(),
84838
84861
  family: _enum(["IPv4", "IPv6"]),
84839
84862
  address: string(),
84840
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
84863
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
84841
84864
  cidr: string(),
84842
84865
  /** OS netmask. Stable across calls so the SDK can hash on it. */
84843
84866
  netmask: string(),
@@ -84891,7 +84914,8 @@ var ConnectionEndpointSchema = object({
84891
84914
  "lan-ipv4",
84892
84915
  "lan-ipv6",
84893
84916
  "public",
84894
- "loopback"
84917
+ "loopback",
84918
+ "app-link"
84895
84919
  ]),
84896
84920
  /**
84897
84921
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -84960,15 +84984,27 @@ var GetConnectionEndpointsResultSchema = object({
84960
84984
  localPort: AdvertisedLocalPortSchema
84961
84985
  });
84962
84986
  /**
84963
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
84964
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
84965
- * what AUTO currently picks, so the UI can show the effective value either way.
84987
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
84988
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
84989
+ * so the UI can show it either way.
84966
84990
  */
84967
84991
  var NotificationEndpointSchema = object({
84968
84992
  /** The operator's explicit choice, or null for AUTO. */
84969
84993
  baseUrl: string().nullable(),
84970
- /** What the ranking currently resolves to (null when nothing is reachable). */
84971
- resolved: string().nullable()
84994
+ /**
84995
+ * The effective flagged address: the explicit choice, else (AUTO) the
84996
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
84997
+ * answered the public tunnel / mesh here, or null.
84998
+ */
84999
+ resolved: string().nullable(),
85000
+ /**
85001
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
85002
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
85003
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
85004
+ * hub advertises neither; the app link is then minted without `hub=`.
85005
+ * Absent on a pre-D709 hub.
85006
+ */
85007
+ appLinkHub: string().nullable()
84972
85008
  });
84973
85009
  /**
84974
85010
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -85022,7 +85058,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
85022
85058
  * Pass `'https'` when the caller is itself loaded over HTTPS
85023
85059
  * to avoid mixed-content blocks in the browser. The public
85024
85060
  * tunnel always emits `https://` regardless. */
85025
- scheme: _enum(["http", "https"]).optional()
85061
+ scheme: _enum(["http", "https"]).optional(),
85062
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
85063
+ * an address notification links can be flagged with, not a hub
85064
+ * route. Default `false`: racers and rankers never see it. */
85065
+ includeAppLink: boolean().optional()
85026
85066
  }), 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, {
85027
85067
  kind: "mutation",
85028
85068
  auth: "admin"
@@ -85351,7 +85391,7 @@ var MeshPeerSchema = object({
85351
85391
  tags: array(string()).readonly(),
85352
85392
  /** True when the peer advertises itself as an exit-node candidate. */
85353
85393
  exitNodeOption: boolean(),
85354
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
85394
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
85355
85395
  advertisedRoutes: array(string()).readonly(),
85356
85396
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
85357
85397
  userLogin: string().nullable(),
@@ -86827,7 +86867,13 @@ var OsdStatusSchema = object({ overlays: array(object({
86827
86867
  */
86828
86868
  availablePositions: array(OsdPositionEnum).readonly(),
86829
86869
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
86830
- readOnly: boolean().optional()
86870
+ readOnly: boolean().optional(),
86871
+ /**
86872
+ * Firmware text ceiling for this overlay. Absent = no known limit.
86873
+ * The OSD manager truncates here on every write — never stores its own
86874
+ * copy on the binding.
86875
+ */
86876
+ maxCharacters: number().int().positive().optional()
86831
86877
  })).readonly() });
86832
86878
  var OsdOverlayPatchSchema = object({
86833
86879
  enabled: boolean().optional(),
@@ -86878,7 +86924,9 @@ var OsdTemplateBindingSchema = object({
86878
86924
  valuePath: string().min(1).max(64),
86879
86925
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
86880
86926
  displayUnit: string().max(16).optional(),
86881
- maxDecimals: number().int().min(0).max(4).default(1)
86927
+ maxDecimals: number().int().min(0).max(4).default(1),
86928
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
86929
+ valueMap: record(string(), string()).optional()
86882
86930
  });
86883
86931
  /**
86884
86932
  * A named template: bindings (alias → leaf field) + a parser that
@@ -86928,18 +86976,11 @@ var OsdSlotBindingSchema = object({
86928
86976
  source: OsdSourceSchema,
86929
86977
  /** `${value}` and `${unit}` are substituted; every occurrence. */
86930
86978
  template: string().max(96).default("${value}"),
86931
- /** Truncate with an ellipsis past this length. Absent = no limit. */
86932
- maxCharacters: number().int().min(4).max(64).optional(),
86933
86979
  /**
86934
86980
  * Decimal places for a numeric value. `0` yields an integer — the
86935
86981
  * documented workaround for firmwares that reject `.` in overlay text.
86936
86982
  */
86937
86983
  maxDecimals: number().int().min(0).max(4).default(1),
86938
- /**
86939
- * Appended via `${unit}` when no unit conversion produces a label.
86940
- * Prefer `source.displayUnit` for converted device-state values.
86941
- */
86942
- unitLabel: string().max(8).optional(),
86943
86984
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
86944
86985
  valueMap: record(string(), string()).optional(),
86945
86986
  /** Time windows in which the slot is shown. Absent = always. */
@@ -86948,9 +86989,7 @@ var OsdSlotBindingSchema = object({
86948
86989
  * Display gate, in the notification centre's condition vocabulary.
86949
86990
  * Only the keys reported by `getConditionSupport` are accepted.
86950
86991
  */
86951
- conditions: NcConditionsSchema.optional(),
86952
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
86953
- fallbackText: string().max(64).default("")
86992
+ conditions: NcConditionsSchema.optional()
86954
86993
  });
86955
86994
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
86956
86995
  var OsdSlotViewSchema = object({
@@ -105183,12 +105222,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
105183
105222
  {
105184
105223
  id: "addons",
105185
105224
  family: "system",
105186
- label: "Addons",
105187
- kinds: [
105188
- "addon-crash-loop",
105189
- "addon-update-available",
105190
- "addon-updated"
105191
- ]
105225
+ label: "Addons stopped",
105226
+ kinds: ["addon-crash-loop"]
105227
+ },
105228
+ {
105229
+ id: "addon-updates",
105230
+ family: "system",
105231
+ label: "Addon updates",
105232
+ kinds: ["addon-update-available", "addon-updated"]
105192
105233
  },
105193
105234
  {
105194
105235
  id: "updates",
@@ -105348,13 +105389,15 @@ var STATE_SUMMARY_SECTION_VARS = [
105348
105389
  },
105349
105390
  {
105350
105391
  name: "summaryAddons",
105351
- label: "Summary: addons",
105352
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
105353
- kinds: [
105354
- "addon-crash-loop",
105355
- "addon-update-available",
105356
- "addon-updated"
105357
- ]
105392
+ label: "Summary: addons stopped",
105393
+ example: "hub — recorder stopped after repeated crashes",
105394
+ kinds: ["addon-crash-loop"]
105395
+ },
105396
+ {
105397
+ name: "summaryAddonUpdates",
105398
+ label: "Summary: addon updates",
105399
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
105400
+ kinds: ["addon-update-available", "addon-updated"]
105358
105401
  },
105359
105402
  {
105360
105403
  name: "summaryUpdates",
@@ -105438,6 +105481,7 @@ var STATE_SUMMARY_VARS = [
105438
105481
  [...RULE_BODY_ONLY],
105439
105482
  [...RULE_TEXT],
105440
105483
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
105484
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
105441
105485
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
105442
105486
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
105443
105487
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -105478,6 +105522,8 @@ var STATE_SUMMARY_VARS = [
105478
105522
  [...RULE_TEXT],
105479
105523
  [...RULE_TEXT],
105480
105524
  [...RULE_TEXT],
105525
+ [...RULE_TEXT],
105526
+ [...RULE_TEXT],
105481
105527
  ...STATE_SUMMARY_VARS
105482
105528
  ];
105483
105529
  new Set([
package/dist/addon.mjs CHANGED
@@ -63434,11 +63434,11 @@ var ModelVariantGroupSchema = object({
63434
63434
  /** Quantization axis. Omit ⇒ the fp32 base build. */
63435
63435
  precision: _enum(["fp32", "int8"]).optional(),
63436
63436
  /**
63437
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
63438
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
63439
- * future performance variants plug into.
63437
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
63438
+ * an alternate training of the same family (Scrypted `relu_test`); chip
63439
+ * label is "Test".
63440
63440
  */
63441
- optimization: _enum(["standard", "fast"]).optional(),
63441
+ optimization: _enum(["standard", "test"]).optional(),
63442
63442
  /**
63443
63443
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
63444
63444
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -63461,9 +63461,10 @@ var ModelProviderIdSchema = _enum([
63461
63461
  * are per upstream. A persisted custom-model row written when this field was a
63462
63462
  * string still parses — the string is lifted into `{ weights }`.
63463
63463
  *
63464
- * Every licence surface (the admin "Models and licenses" page,
63465
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
63466
- * these records by `scripts/gen-model-licenses.ts` (D661).
63464
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
63465
+ * model table) is GENERATED from these records by
63466
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
63467
+ * `camstack/docs` → `/docs/detection/models`.
63467
63468
  */
63468
63469
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
63469
63470
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -67094,7 +67095,7 @@ DeviceType.Camera;
67094
67095
  * This matters here more than anywhere else in the repo, because every provider
67095
67096
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
67096
67097
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
67097
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
67098
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
67098
67099
  * camera's own page will ask for its own login. That is correct, and pre-
67099
67100
  * filling it is the operator's business, not ours.
67100
67101
  *
@@ -70283,7 +70284,7 @@ method(object({
70283
70284
  timeoutMs: 6e5
70284
70285
  });
70285
70286
  method(object({
70286
- nodeId: string(),
70287
+ targetNodeId: string(),
70287
70288
  modelId: string(),
70288
70289
  format: _enum(MODEL_FORMATS),
70289
70290
  entry: ModelCatalogEntrySchema
@@ -72787,8 +72788,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
72787
72788
  disabledTargetIds: array(string()).default([])
72788
72789
  });
72789
72790
  /**
72790
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
72791
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
72791
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
72792
+ * report a still-true state. `addons` is the crash-looped addons only and
72793
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
72792
72794
  * job is not an open state, and the alarm stays instant.
72793
72795
  */
72794
72796
  var NcStateSummarySectionIdSchema = _enum([
@@ -72800,6 +72802,7 @@ var NcStateSummarySectionIdSchema = _enum([
72800
72802
  "detection-blind",
72801
72803
  "nodes",
72802
72804
  "addons",
72805
+ "addon-updates",
72803
72806
  "updates"
72804
72807
  ]);
72805
72808
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -73280,7 +73283,19 @@ var NcAlarmModeDelaysListSchema = array(object({
73280
73283
  * When this mode may be armed. Absent / null = always allowed (same as a
73281
73284
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
73282
73285
  */
73283
- schedule: NcScheduleSchema.optional()
73286
+ schedule: NcScheduleSchema.optional(),
73287
+ /**
73288
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
73289
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
73290
+ * only one, and the matches ride the triggered notification's mosaic (D705).
73291
+ */
73292
+ notifyDuringEntryDelay: boolean().optional(),
73293
+ /**
73294
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
73295
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
73296
+ * is the one that starts the entry delay — the entry-delay notification already names it.
73297
+ */
73298
+ notifySensorRewatched: boolean().optional()
73284
73299
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
73285
73300
  var NcAlarmModeDelaysEditListSchema = array(object({
73286
73301
  mode: AlarmArmModeSchema,
@@ -73289,7 +73304,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
73289
73304
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
73290
73305
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
73291
73306
  /** Set a schedule, or `null` to clear (mode always allowed again). */
73292
- schedule: NcScheduleSchema.nullable().optional()
73307
+ schedule: NcScheduleSchema.nullable().optional(),
73308
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
73309
+ notifyDuringEntryDelay: boolean().nullable().optional(),
73310
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
73311
+ notifySensorRewatched: boolean().nullable().optional()
73293
73312
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
73294
73313
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
73295
73314
  var NcAlarmNonBlockingEditSchema = object({
@@ -74250,39 +74269,19 @@ Object.freeze(Object.fromEntries([{
74250
74269
  label: "Face recognition model",
74251
74270
  defaultModelId: "auraface-r100",
74252
74271
  indexName: "the enrolled face gallery",
74253
- options: [
74254
- {
74255
- id: "auraface-r100",
74256
- label: "AuraFace R100"
74257
- },
74258
- {
74259
- id: "arcface-r100",
74260
- label: "ArcFace (ResNet34)"
74261
- },
74262
- {
74263
- id: "inception-resnet-v1",
74264
- label: "Inception ResNet V1"
74265
- }
74266
- ]
74272
+ options: [{
74273
+ id: "auraface-r100",
74274
+ label: "AuraFace R100"
74275
+ }]
74267
74276
  }, {
74268
74277
  stepId: "clip-embedding",
74269
74278
  label: "Semantic search model",
74270
- defaultModelId: "mobileclip-s1",
74279
+ defaultModelId: "siglip2-b16-224",
74271
74280
  indexName: "the object semantic-search index",
74272
- options: [
74273
- {
74274
- id: "mobileclip-s1",
74275
- label: "MobileCLIP S1"
74276
- },
74277
- {
74278
- id: "mobileclip-s2",
74279
- label: "MobileCLIP S2"
74280
- },
74281
- {
74282
- id: "siglip2-b16-224",
74283
- label: "SigLIP2 B/16 (Apache-2.0)"
74284
- }
74285
- ]
74281
+ options: [{
74282
+ id: "siglip2-b16-224",
74283
+ label: "SigLIP2 B/16 (Apache-2.0)"
74284
+ }]
74286
74285
  }].map((s) => [s.stepId, s.defaultModelId])));
74287
74286
  var CLUSTER_STEP_SETTING_FIELDS = [{
74288
74287
  stepId: "face-embedding",
@@ -77170,6 +77169,22 @@ var MotionSourceEnum = _enum([
77170
77169
  "device-activity"
77171
77170
  ]);
77172
77171
  /**
77172
+ * What opened an on-motion detection SESSION: the motion source that passed the
77173
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
77174
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
77175
+ * device name as the orchestrator's camera-sensors resolution last read it;
77176
+ * absent when unknown or when the camera itself triggered.
77177
+ *
77178
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
77179
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
77180
+ * runner never decides anything on it.
77181
+ */
77182
+ var SessionTriggerSchema = object({
77183
+ source: MotionSourceEnum,
77184
+ triggeredBy: MotionTriggeredBySchema,
77185
+ sensorName: string().optional()
77186
+ });
77187
+ /**
77173
77188
  * List of motion sources active on a camera. Empty array is valid:
77174
77189
  * "no source" — happens for battery cams without firmware motion when
77175
77190
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -77421,6 +77436,14 @@ var RunnerCameraConfigSchema = object({
77421
77436
  */
77422
77437
  motionSources: MotionSourcesSchema.default(["analyzer"]),
77423
77438
  /**
77439
+ * What opened this attach, on a SESSION attach only (see
77440
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
77441
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
77442
+ * behind it, and every attach from an orchestrator older than the field — the
77443
+ * runner then names no source on the phase event.
77444
+ */
77445
+ sessionTrigger: SessionTriggerSchema.optional(),
77446
+ /**
77424
77447
  * WHICH root detector runs for this camera. The detection counterpart of
77425
77448
  * {@link motionSources}, same shape and same discipline: a per-camera list
77426
77449
  * of sources the system understands, vendor-agnostic, owned here.
@@ -84834,7 +84857,7 @@ var LocalInterfaceSchema = object({
84834
84857
  name: string(),
84835
84858
  family: _enum(["IPv4", "IPv6"]),
84836
84859
  address: string(),
84837
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
84860
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
84838
84861
  cidr: string(),
84839
84862
  /** OS netmask. Stable across calls so the SDK can hash on it. */
84840
84863
  netmask: string(),
@@ -84888,7 +84911,8 @@ var ConnectionEndpointSchema = object({
84888
84911
  "lan-ipv4",
84889
84912
  "lan-ipv6",
84890
84913
  "public",
84891
- "loopback"
84914
+ "loopback",
84915
+ "app-link"
84892
84916
  ]),
84893
84917
  /**
84894
84918
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -84957,15 +84981,27 @@ var GetConnectionEndpointsResultSchema = object({
84957
84981
  localPort: AdvertisedLocalPortSchema
84958
84982
  });
84959
84983
  /**
84960
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
84961
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
84962
- * what AUTO currently picks, so the UI can show the effective value either way.
84984
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
84985
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
84986
+ * so the UI can show it either way.
84963
84987
  */
84964
84988
  var NotificationEndpointSchema = object({
84965
84989
  /** The operator's explicit choice, or null for AUTO. */
84966
84990
  baseUrl: string().nullable(),
84967
- /** What the ranking currently resolves to (null when nothing is reachable). */
84968
- resolved: string().nullable()
84991
+ /**
84992
+ * The effective flagged address: the explicit choice, else (AUTO) the
84993
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
84994
+ * answered the public tunnel / mesh here, or null.
84995
+ */
84996
+ resolved: string().nullable(),
84997
+ /**
84998
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
84999
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
85000
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
85001
+ * hub advertises neither; the app link is then minted without `hub=`.
85002
+ * Absent on a pre-D709 hub.
85003
+ */
85004
+ appLinkHub: string().nullable()
84969
85005
  });
84970
85006
  /**
84971
85007
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -85019,7 +85055,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
85019
85055
  * Pass `'https'` when the caller is itself loaded over HTTPS
85020
85056
  * to avoid mixed-content blocks in the browser. The public
85021
85057
  * tunnel always emits `https://` regardless. */
85022
- scheme: _enum(["http", "https"]).optional()
85058
+ scheme: _enum(["http", "https"]).optional(),
85059
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
85060
+ * an address notification links can be flagged with, not a hub
85061
+ * route. Default `false`: racers and rankers never see it. */
85062
+ includeAppLink: boolean().optional()
85023
85063
  }), 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, {
85024
85064
  kind: "mutation",
85025
85065
  auth: "admin"
@@ -85348,7 +85388,7 @@ var MeshPeerSchema = object({
85348
85388
  tags: array(string()).readonly(),
85349
85389
  /** True when the peer advertises itself as an exit-node candidate. */
85350
85390
  exitNodeOption: boolean(),
85351
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
85391
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
85352
85392
  advertisedRoutes: array(string()).readonly(),
85353
85393
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
85354
85394
  userLogin: string().nullable(),
@@ -86824,7 +86864,13 @@ var OsdStatusSchema = object({ overlays: array(object({
86824
86864
  */
86825
86865
  availablePositions: array(OsdPositionEnum).readonly(),
86826
86866
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
86827
- readOnly: boolean().optional()
86867
+ readOnly: boolean().optional(),
86868
+ /**
86869
+ * Firmware text ceiling for this overlay. Absent = no known limit.
86870
+ * The OSD manager truncates here on every write — never stores its own
86871
+ * copy on the binding.
86872
+ */
86873
+ maxCharacters: number().int().positive().optional()
86828
86874
  })).readonly() });
86829
86875
  var OsdOverlayPatchSchema = object({
86830
86876
  enabled: boolean().optional(),
@@ -86875,7 +86921,9 @@ var OsdTemplateBindingSchema = object({
86875
86921
  valuePath: string().min(1).max(64),
86876
86922
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
86877
86923
  displayUnit: string().max(16).optional(),
86878
- maxDecimals: number().int().min(0).max(4).default(1)
86924
+ maxDecimals: number().int().min(0).max(4).default(1),
86925
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
86926
+ valueMap: record(string(), string()).optional()
86879
86927
  });
86880
86928
  /**
86881
86929
  * A named template: bindings (alias → leaf field) + a parser that
@@ -86925,18 +86973,11 @@ var OsdSlotBindingSchema = object({
86925
86973
  source: OsdSourceSchema,
86926
86974
  /** `${value}` and `${unit}` are substituted; every occurrence. */
86927
86975
  template: string().max(96).default("${value}"),
86928
- /** Truncate with an ellipsis past this length. Absent = no limit. */
86929
- maxCharacters: number().int().min(4).max(64).optional(),
86930
86976
  /**
86931
86977
  * Decimal places for a numeric value. `0` yields an integer — the
86932
86978
  * documented workaround for firmwares that reject `.` in overlay text.
86933
86979
  */
86934
86980
  maxDecimals: number().int().min(0).max(4).default(1),
86935
- /**
86936
- * Appended via `${unit}` when no unit conversion produces a label.
86937
- * Prefer `source.displayUnit` for converted device-state values.
86938
- */
86939
- unitLabel: string().max(8).optional(),
86940
86981
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
86941
86982
  valueMap: record(string(), string()).optional(),
86942
86983
  /** Time windows in which the slot is shown. Absent = always. */
@@ -86945,9 +86986,7 @@ var OsdSlotBindingSchema = object({
86945
86986
  * Display gate, in the notification centre's condition vocabulary.
86946
86987
  * Only the keys reported by `getConditionSupport` are accepted.
86947
86988
  */
86948
- conditions: NcConditionsSchema.optional(),
86949
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
86950
- fallbackText: string().max(64).default("")
86989
+ conditions: NcConditionsSchema.optional()
86951
86990
  });
86952
86991
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
86953
86992
  var OsdSlotViewSchema = object({
@@ -105180,12 +105219,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
105180
105219
  {
105181
105220
  id: "addons",
105182
105221
  family: "system",
105183
- label: "Addons",
105184
- kinds: [
105185
- "addon-crash-loop",
105186
- "addon-update-available",
105187
- "addon-updated"
105188
- ]
105222
+ label: "Addons stopped",
105223
+ kinds: ["addon-crash-loop"]
105224
+ },
105225
+ {
105226
+ id: "addon-updates",
105227
+ family: "system",
105228
+ label: "Addon updates",
105229
+ kinds: ["addon-update-available", "addon-updated"]
105189
105230
  },
105190
105231
  {
105191
105232
  id: "updates",
@@ -105345,13 +105386,15 @@ var STATE_SUMMARY_SECTION_VARS = [
105345
105386
  },
105346
105387
  {
105347
105388
  name: "summaryAddons",
105348
- label: "Summary: addons",
105349
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
105350
- kinds: [
105351
- "addon-crash-loop",
105352
- "addon-update-available",
105353
- "addon-updated"
105354
- ]
105389
+ label: "Summary: addons stopped",
105390
+ example: "hub — recorder stopped after repeated crashes",
105391
+ kinds: ["addon-crash-loop"]
105392
+ },
105393
+ {
105394
+ name: "summaryAddonUpdates",
105395
+ label: "Summary: addon updates",
105396
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
105397
+ kinds: ["addon-update-available", "addon-updated"]
105355
105398
  },
105356
105399
  {
105357
105400
  name: "summaryUpdates",
@@ -105435,6 +105478,7 @@ var STATE_SUMMARY_VARS = [
105435
105478
  [...RULE_BODY_ONLY],
105436
105479
  [...RULE_TEXT],
105437
105480
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
105481
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
105438
105482
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
105439
105483
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
105440
105484
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -105475,6 +105519,8 @@ var STATE_SUMMARY_VARS = [
105475
105519
  [...RULE_TEXT],
105476
105520
  [...RULE_TEXT],
105477
105521
  [...RULE_TEXT],
105522
+ [...RULE_TEXT],
105523
+ [...RULE_TEXT],
105478
105524
  ...STATE_SUMMARY_VARS
105479
105525
  ];
105480
105526
  new Set([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.121",
3
+ "version": "0.2.123",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",