@camstack/addon-export-alexa 1.2.128 → 1.2.129

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.
@@ -10836,11 +10836,11 @@ var ModelVariantGroupSchema = object({
10836
10836
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10837
10837
  precision: _enum(["fp32", "int8"]).optional(),
10838
10838
  /**
10839
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10840
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10841
- * future performance variants plug into.
10839
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10840
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10841
+ * label is "Test".
10842
10842
  */
10843
- optimization: _enum(["standard", "fast"]).optional(),
10843
+ optimization: _enum(["standard", "test"]).optional(),
10844
10844
  /**
10845
10845
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10846
10846
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10863,9 +10863,10 @@ var ModelProviderIdSchema = _enum([
10863
10863
  * are per upstream. A persisted custom-model row written when this field was a
10864
10864
  * string still parses — the string is lifted into `{ weights }`.
10865
10865
  *
10866
- * Every licence surface (the admin "Models and licenses" page,
10867
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10868
- * these records by `scripts/gen-model-licenses.ts` (D661).
10866
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10867
+ * model table) is GENERATED from these records by
10868
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10869
+ * `camstack/docs` → `/docs/detection/models`.
10869
10870
  */
10870
10871
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10871
10872
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14420,7 +14421,7 @@ DeviceType.Camera;
14420
14421
  * This matters here more than anywhere else in the repo, because every provider
14421
14422
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14422
14423
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14423
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14424
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14424
14425
  * camera's own page will ask for its own login. That is correct, and pre-
14425
14426
  * filling it is the operator's business, not ours.
14426
14427
  *
@@ -17429,7 +17430,7 @@ method(object({
17429
17430
  timeoutMs: 6e5
17430
17431
  });
17431
17432
  method(object({
17432
- nodeId: string(),
17433
+ targetNodeId: string(),
17433
17434
  modelId: string(),
17434
17435
  format: _enum(MODEL_FORMATS),
17435
17436
  entry: ModelCatalogEntrySchema
@@ -19895,8 +19896,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19895
19896
  disabledTargetIds: array(string()).default([])
19896
19897
  });
19897
19898
  /**
19898
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19899
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19899
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19900
+ * report a still-true state. `addons` is the crash-looped addons only and
19901
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19900
19902
  * job is not an open state, and the alarm stays instant.
19901
19903
  */
19902
19904
  var NcStateSummarySectionIdSchema = _enum([
@@ -19908,6 +19910,7 @@ var NcStateSummarySectionIdSchema = _enum([
19908
19910
  "detection-blind",
19909
19911
  "nodes",
19910
19912
  "addons",
19913
+ "addon-updates",
19911
19914
  "updates"
19912
19915
  ]);
19913
19916
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20388,7 +20391,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20388
20391
  * When this mode may be armed. Absent / null = always allowed (same as a
20389
20392
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20390
20393
  */
20391
- schedule: NcScheduleSchema.optional()
20394
+ schedule: NcScheduleSchema.optional(),
20395
+ /**
20396
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20397
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20398
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20399
+ */
20400
+ notifyDuringEntryDelay: boolean().optional(),
20401
+ /**
20402
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20403
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20404
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20405
+ */
20406
+ notifySensorRewatched: boolean().optional()
20392
20407
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20393
20408
  var NcAlarmModeDelaysEditListSchema = array(object({
20394
20409
  mode: AlarmArmModeSchema,
@@ -20397,7 +20412,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20397
20412
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20398
20413
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20399
20414
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20400
- schedule: NcScheduleSchema.nullable().optional()
20415
+ schedule: NcScheduleSchema.nullable().optional(),
20416
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20417
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20418
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20419
+ notifySensorRewatched: boolean().nullable().optional()
20401
20420
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20402
20421
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20403
20422
  var NcAlarmNonBlockingEditSchema = object({
@@ -21374,39 +21393,19 @@ Object.freeze(Object.fromEntries([{
21374
21393
  label: "Face recognition model",
21375
21394
  defaultModelId: "auraface-r100",
21376
21395
  indexName: "the enrolled face gallery",
21377
- options: [
21378
- {
21379
- id: "auraface-r100",
21380
- label: "AuraFace R100"
21381
- },
21382
- {
21383
- id: "arcface-r100",
21384
- label: "ArcFace (ResNet34)"
21385
- },
21386
- {
21387
- id: "inception-resnet-v1",
21388
- label: "Inception ResNet V1"
21389
- }
21390
- ]
21396
+ options: [{
21397
+ id: "auraface-r100",
21398
+ label: "AuraFace R100"
21399
+ }]
21391
21400
  }, {
21392
21401
  stepId: "clip-embedding",
21393
21402
  label: "Semantic search model",
21394
- defaultModelId: "mobileclip-s1",
21403
+ defaultModelId: "siglip2-b16-224",
21395
21404
  indexName: "the object semantic-search index",
21396
- options: [
21397
- {
21398
- id: "mobileclip-s1",
21399
- label: "MobileCLIP S1"
21400
- },
21401
- {
21402
- id: "mobileclip-s2",
21403
- label: "MobileCLIP S2"
21404
- },
21405
- {
21406
- id: "siglip2-b16-224",
21407
- label: "SigLIP2 B/16 (Apache-2.0)"
21408
- }
21409
- ]
21405
+ options: [{
21406
+ id: "siglip2-b16-224",
21407
+ label: "SigLIP2 B/16 (Apache-2.0)"
21408
+ }]
21410
21409
  }].map((s) => [s.stepId, s.defaultModelId])));
21411
21410
  var CLUSTER_STEP_SETTING_FIELDS = [{
21412
21411
  stepId: "face-embedding",
@@ -24254,6 +24253,22 @@ var MotionSourceEnum = _enum([
24254
24253
  "device-activity"
24255
24254
  ]);
24256
24255
  /**
24256
+ * What opened an on-motion detection SESSION: the motion source that passed the
24257
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24258
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24259
+ * device name as the orchestrator's camera-sensors resolution last read it;
24260
+ * absent when unknown or when the camera itself triggered.
24261
+ *
24262
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24263
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24264
+ * runner never decides anything on it.
24265
+ */
24266
+ var SessionTriggerSchema = object({
24267
+ source: MotionSourceEnum,
24268
+ triggeredBy: MotionTriggeredBySchema,
24269
+ sensorName: string().optional()
24270
+ });
24271
+ /**
24257
24272
  * List of motion sources active on a camera. Empty array is valid:
24258
24273
  * "no source" — happens for battery cams without firmware motion when
24259
24274
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24505,6 +24520,14 @@ var RunnerCameraConfigSchema = object({
24505
24520
  */
24506
24521
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24507
24522
  /**
24523
+ * What opened this attach, on a SESSION attach only (see
24524
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24525
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24526
+ * behind it, and every attach from an orchestrator older than the field — the
24527
+ * runner then names no source on the phase event.
24528
+ */
24529
+ sessionTrigger: SessionTriggerSchema.optional(),
24530
+ /**
24508
24531
  * WHICH root detector runs for this camera. The detection counterpart of
24509
24532
  * {@link motionSources}, same shape and same discipline: a per-camera list
24510
24533
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30728,7 +30751,7 @@ var LocalInterfaceSchema = object({
30728
30751
  name: string(),
30729
30752
  family: _enum(["IPv4", "IPv6"]),
30730
30753
  address: string(),
30731
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30754
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30732
30755
  cidr: string(),
30733
30756
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30734
30757
  netmask: string(),
@@ -30782,7 +30805,8 @@ var ConnectionEndpointSchema = object({
30782
30805
  "lan-ipv4",
30783
30806
  "lan-ipv6",
30784
30807
  "public",
30785
- "loopback"
30808
+ "loopback",
30809
+ "app-link"
30786
30810
  ]),
30787
30811
  /**
30788
30812
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30851,15 +30875,27 @@ var GetConnectionEndpointsResultSchema = object({
30851
30875
  localPort: AdvertisedLocalPortSchema
30852
30876
  });
30853
30877
  /**
30854
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30855
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30856
- * what AUTO currently picks, so the UI can show the effective value either way.
30878
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30879
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30880
+ * so the UI can show it either way.
30857
30881
  */
30858
30882
  var NotificationEndpointSchema = object({
30859
30883
  /** The operator's explicit choice, or null for AUTO. */
30860
30884
  baseUrl: string().nullable(),
30861
- /** What the ranking currently resolves to (null when nothing is reachable). */
30862
- resolved: string().nullable()
30885
+ /**
30886
+ * The effective flagged address: the explicit choice, else (AUTO) the
30887
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30888
+ * answered the public tunnel / mesh here, or null.
30889
+ */
30890
+ resolved: string().nullable(),
30891
+ /**
30892
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30893
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30894
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30895
+ * hub advertises neither; the app link is then minted without `hub=`.
30896
+ * Absent on a pre-D709 hub.
30897
+ */
30898
+ appLinkHub: string().nullable()
30863
30899
  });
30864
30900
  /**
30865
30901
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30913,7 +30949,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30913
30949
  * Pass `'https'` when the caller is itself loaded over HTTPS
30914
30950
  * to avoid mixed-content blocks in the browser. The public
30915
30951
  * tunnel always emits `https://` regardless. */
30916
- scheme: _enum(["http", "https"]).optional()
30952
+ scheme: _enum(["http", "https"]).optional(),
30953
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30954
+ * an address notification links can be flagged with, not a hub
30955
+ * route. Default `false`: racers and rankers never see it. */
30956
+ includeAppLink: boolean().optional()
30917
30957
  }), 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, {
30918
30958
  kind: "mutation",
30919
30959
  auth: "admin"
@@ -31174,7 +31214,7 @@ var MeshPeerSchema = object({
31174
31214
  tags: array(string()).readonly(),
31175
31215
  /** True when the peer advertises itself as an exit-node candidate. */
31176
31216
  exitNodeOption: boolean(),
31177
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31217
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
31178
31218
  advertisedRoutes: array(string()).readonly(),
31179
31219
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31180
31220
  userLogin: string().nullable(),
@@ -32118,7 +32158,13 @@ var OsdStatusSchema = object({ overlays: array(object({
32118
32158
  */
32119
32159
  availablePositions: array(OsdPositionEnum).readonly(),
32120
32160
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
32121
- readOnly: boolean().optional()
32161
+ readOnly: boolean().optional(),
32162
+ /**
32163
+ * Firmware text ceiling for this overlay. Absent = no known limit.
32164
+ * The OSD manager truncates here on every write — never stores its own
32165
+ * copy on the binding.
32166
+ */
32167
+ maxCharacters: number().int().positive().optional()
32122
32168
  })).readonly() });
32123
32169
  var OsdOverlayPatchSchema = object({
32124
32170
  enabled: boolean().optional(),
@@ -32169,7 +32215,9 @@ var OsdTemplateBindingSchema = object({
32169
32215
  valuePath: string().min(1).max(64),
32170
32216
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
32171
32217
  displayUnit: string().max(16).optional(),
32172
- maxDecimals: number().int().min(0).max(4).default(1)
32218
+ maxDecimals: number().int().min(0).max(4).default(1),
32219
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
32220
+ valueMap: record(string(), string()).optional()
32173
32221
  });
32174
32222
  /**
32175
32223
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32219,18 +32267,11 @@ var OsdSlotBindingSchema = object({
32219
32267
  source: OsdSourceSchema,
32220
32268
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32221
32269
  template: string().max(96).default("${value}"),
32222
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32223
- maxCharacters: number().int().min(4).max(64).optional(),
32224
32270
  /**
32225
32271
  * Decimal places for a numeric value. `0` yields an integer — the
32226
32272
  * documented workaround for firmwares that reject `.` in overlay text.
32227
32273
  */
32228
32274
  maxDecimals: number().int().min(0).max(4).default(1),
32229
- /**
32230
- * Appended via `${unit}` when no unit conversion produces a label.
32231
- * Prefer `source.displayUnit` for converted device-state values.
32232
- */
32233
- unitLabel: string().max(8).optional(),
32234
32275
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32235
32276
  valueMap: record(string(), string()).optional(),
32236
32277
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32239,9 +32280,7 @@ var OsdSlotBindingSchema = object({
32239
32280
  * Display gate, in the notification centre's condition vocabulary.
32240
32281
  * Only the keys reported by `getConditionSupport` are accepted.
32241
32282
  */
32242
- conditions: NcConditionsSchema.optional(),
32243
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32244
- fallbackText: string().max(64).default("")
32283
+ conditions: NcConditionsSchema.optional()
32245
32284
  });
32246
32285
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32247
32286
  var OsdSlotViewSchema = object({
@@ -47918,12 +47957,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47918
47957
  {
47919
47958
  id: "addons",
47920
47959
  family: "system",
47921
- label: "Addons",
47922
- kinds: [
47923
- "addon-crash-loop",
47924
- "addon-update-available",
47925
- "addon-updated"
47926
- ]
47960
+ label: "Addons stopped",
47961
+ kinds: ["addon-crash-loop"]
47962
+ },
47963
+ {
47964
+ id: "addon-updates",
47965
+ family: "system",
47966
+ label: "Addon updates",
47967
+ kinds: ["addon-update-available", "addon-updated"]
47927
47968
  },
47928
47969
  {
47929
47970
  id: "updates",
@@ -48083,13 +48124,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48083
48124
  },
48084
48125
  {
48085
48126
  name: "summaryAddons",
48086
- label: "Summary: addons",
48087
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48088
- kinds: [
48089
- "addon-crash-loop",
48090
- "addon-update-available",
48091
- "addon-updated"
48092
- ]
48127
+ label: "Summary: addons stopped",
48128
+ example: "hub — recorder stopped after repeated crashes",
48129
+ kinds: ["addon-crash-loop"]
48130
+ },
48131
+ {
48132
+ name: "summaryAddonUpdates",
48133
+ label: "Summary: addon updates",
48134
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
48135
+ kinds: ["addon-update-available", "addon-updated"]
48093
48136
  },
48094
48137
  {
48095
48138
  name: "summaryUpdates",
@@ -48173,6 +48216,7 @@ var STATE_SUMMARY_VARS = [
48173
48216
  [...RULE_BODY_ONLY],
48174
48217
  [...RULE_TEXT],
48175
48218
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48219
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
48176
48220
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48177
48221
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
48178
48222
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -48213,6 +48257,8 @@ var STATE_SUMMARY_VARS = [
48213
48257
  [...RULE_TEXT],
48214
48258
  [...RULE_TEXT],
48215
48259
  [...RULE_TEXT],
48260
+ [...RULE_TEXT],
48261
+ [...RULE_TEXT],
48216
48262
  ...STATE_SUMMARY_VARS
48217
48263
  ];
48218
48264
  new Set([
@@ -10809,11 +10809,11 @@ var ModelVariantGroupSchema = object({
10809
10809
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10810
10810
  precision: _enum(["fp32", "int8"]).optional(),
10811
10811
  /**
10812
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10813
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10814
- * future performance variants plug into.
10812
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10813
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10814
+ * label is "Test".
10815
10815
  */
10816
- optimization: _enum(["standard", "fast"]).optional(),
10816
+ optimization: _enum(["standard", "test"]).optional(),
10817
10817
  /**
10818
10818
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10819
10819
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10836,9 +10836,10 @@ var ModelProviderIdSchema = _enum([
10836
10836
  * are per upstream. A persisted custom-model row written when this field was a
10837
10837
  * string still parses — the string is lifted into `{ weights }`.
10838
10838
  *
10839
- * Every licence surface (the admin "Models and licenses" page,
10840
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10841
- * these records by `scripts/gen-model-licenses.ts` (D661).
10839
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10840
+ * model table) is GENERATED from these records by
10841
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10842
+ * `camstack/docs` → `/docs/detection/models`.
10842
10843
  */
10843
10844
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10844
10845
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14393,7 +14394,7 @@ DeviceType.Camera;
14393
14394
  * This matters here more than anywhere else in the repo, because every provider
14394
14395
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14395
14396
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14396
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14397
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14397
14398
  * camera's own page will ask for its own login. That is correct, and pre-
14398
14399
  * filling it is the operator's business, not ours.
14399
14400
  *
@@ -17402,7 +17403,7 @@ method(object({
17402
17403
  timeoutMs: 6e5
17403
17404
  });
17404
17405
  method(object({
17405
- nodeId: string(),
17406
+ targetNodeId: string(),
17406
17407
  modelId: string(),
17407
17408
  format: _enum(MODEL_FORMATS),
17408
17409
  entry: ModelCatalogEntrySchema
@@ -19868,8 +19869,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19868
19869
  disabledTargetIds: array(string()).default([])
19869
19870
  });
19870
19871
  /**
19871
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19872
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19872
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19873
+ * report a still-true state. `addons` is the crash-looped addons only and
19874
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19873
19875
  * job is not an open state, and the alarm stays instant.
19874
19876
  */
19875
19877
  var NcStateSummarySectionIdSchema = _enum([
@@ -19881,6 +19883,7 @@ var NcStateSummarySectionIdSchema = _enum([
19881
19883
  "detection-blind",
19882
19884
  "nodes",
19883
19885
  "addons",
19886
+ "addon-updates",
19884
19887
  "updates"
19885
19888
  ]);
19886
19889
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20361,7 +20364,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20361
20364
  * When this mode may be armed. Absent / null = always allowed (same as a
20362
20365
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20363
20366
  */
20364
- schedule: NcScheduleSchema.optional()
20367
+ schedule: NcScheduleSchema.optional(),
20368
+ /**
20369
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20370
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20371
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20372
+ */
20373
+ notifyDuringEntryDelay: boolean().optional(),
20374
+ /**
20375
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20376
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20377
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20378
+ */
20379
+ notifySensorRewatched: boolean().optional()
20365
20380
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20366
20381
  var NcAlarmModeDelaysEditListSchema = array(object({
20367
20382
  mode: AlarmArmModeSchema,
@@ -20370,7 +20385,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20370
20385
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20371
20386
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20372
20387
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20373
- schedule: NcScheduleSchema.nullable().optional()
20388
+ schedule: NcScheduleSchema.nullable().optional(),
20389
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20390
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20391
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20392
+ notifySensorRewatched: boolean().nullable().optional()
20374
20393
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20375
20394
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20376
20395
  var NcAlarmNonBlockingEditSchema = object({
@@ -21347,39 +21366,19 @@ Object.freeze(Object.fromEntries([{
21347
21366
  label: "Face recognition model",
21348
21367
  defaultModelId: "auraface-r100",
21349
21368
  indexName: "the enrolled face gallery",
21350
- options: [
21351
- {
21352
- id: "auraface-r100",
21353
- label: "AuraFace R100"
21354
- },
21355
- {
21356
- id: "arcface-r100",
21357
- label: "ArcFace (ResNet34)"
21358
- },
21359
- {
21360
- id: "inception-resnet-v1",
21361
- label: "Inception ResNet V1"
21362
- }
21363
- ]
21369
+ options: [{
21370
+ id: "auraface-r100",
21371
+ label: "AuraFace R100"
21372
+ }]
21364
21373
  }, {
21365
21374
  stepId: "clip-embedding",
21366
21375
  label: "Semantic search model",
21367
- defaultModelId: "mobileclip-s1",
21376
+ defaultModelId: "siglip2-b16-224",
21368
21377
  indexName: "the object semantic-search index",
21369
- options: [
21370
- {
21371
- id: "mobileclip-s1",
21372
- label: "MobileCLIP S1"
21373
- },
21374
- {
21375
- id: "mobileclip-s2",
21376
- label: "MobileCLIP S2"
21377
- },
21378
- {
21379
- id: "siglip2-b16-224",
21380
- label: "SigLIP2 B/16 (Apache-2.0)"
21381
- }
21382
- ]
21378
+ options: [{
21379
+ id: "siglip2-b16-224",
21380
+ label: "SigLIP2 B/16 (Apache-2.0)"
21381
+ }]
21383
21382
  }].map((s) => [s.stepId, s.defaultModelId])));
21384
21383
  var CLUSTER_STEP_SETTING_FIELDS = [{
21385
21384
  stepId: "face-embedding",
@@ -24227,6 +24226,22 @@ var MotionSourceEnum = _enum([
24227
24226
  "device-activity"
24228
24227
  ]);
24229
24228
  /**
24229
+ * What opened an on-motion detection SESSION: the motion source that passed the
24230
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24231
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24232
+ * device name as the orchestrator's camera-sensors resolution last read it;
24233
+ * absent when unknown or when the camera itself triggered.
24234
+ *
24235
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24236
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24237
+ * runner never decides anything on it.
24238
+ */
24239
+ var SessionTriggerSchema = object({
24240
+ source: MotionSourceEnum,
24241
+ triggeredBy: MotionTriggeredBySchema,
24242
+ sensorName: string().optional()
24243
+ });
24244
+ /**
24230
24245
  * List of motion sources active on a camera. Empty array is valid:
24231
24246
  * "no source" — happens for battery cams without firmware motion when
24232
24247
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24478,6 +24493,14 @@ var RunnerCameraConfigSchema = object({
24478
24493
  */
24479
24494
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24480
24495
  /**
24496
+ * What opened this attach, on a SESSION attach only (see
24497
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24498
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24499
+ * behind it, and every attach from an orchestrator older than the field — the
24500
+ * runner then names no source on the phase event.
24501
+ */
24502
+ sessionTrigger: SessionTriggerSchema.optional(),
24503
+ /**
24481
24504
  * WHICH root detector runs for this camera. The detection counterpart of
24482
24505
  * {@link motionSources}, same shape and same discipline: a per-camera list
24483
24506
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30701,7 +30724,7 @@ var LocalInterfaceSchema = object({
30701
30724
  name: string(),
30702
30725
  family: _enum(["IPv4", "IPv6"]),
30703
30726
  address: string(),
30704
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30727
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30705
30728
  cidr: string(),
30706
30729
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30707
30730
  netmask: string(),
@@ -30755,7 +30778,8 @@ var ConnectionEndpointSchema = object({
30755
30778
  "lan-ipv4",
30756
30779
  "lan-ipv6",
30757
30780
  "public",
30758
- "loopback"
30781
+ "loopback",
30782
+ "app-link"
30759
30783
  ]),
30760
30784
  /**
30761
30785
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30824,15 +30848,27 @@ var GetConnectionEndpointsResultSchema = object({
30824
30848
  localPort: AdvertisedLocalPortSchema
30825
30849
  });
30826
30850
  /**
30827
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30828
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30829
- * what AUTO currently picks, so the UI can show the effective value either way.
30851
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30852
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30853
+ * so the UI can show it either way.
30830
30854
  */
30831
30855
  var NotificationEndpointSchema = object({
30832
30856
  /** The operator's explicit choice, or null for AUTO. */
30833
30857
  baseUrl: string().nullable(),
30834
- /** What the ranking currently resolves to (null when nothing is reachable). */
30835
- resolved: string().nullable()
30858
+ /**
30859
+ * The effective flagged address: the explicit choice, else (AUTO) the
30860
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30861
+ * answered the public tunnel / mesh here, or null.
30862
+ */
30863
+ resolved: string().nullable(),
30864
+ /**
30865
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30866
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30867
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30868
+ * hub advertises neither; the app link is then minted without `hub=`.
30869
+ * Absent on a pre-D709 hub.
30870
+ */
30871
+ appLinkHub: string().nullable()
30836
30872
  });
30837
30873
  /**
30838
30874
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30886,7 +30922,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30886
30922
  * Pass `'https'` when the caller is itself loaded over HTTPS
30887
30923
  * to avoid mixed-content blocks in the browser. The public
30888
30924
  * tunnel always emits `https://` regardless. */
30889
- scheme: _enum(["http", "https"]).optional()
30925
+ scheme: _enum(["http", "https"]).optional(),
30926
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30927
+ * an address notification links can be flagged with, not a hub
30928
+ * route. Default `false`: racers and rankers never see it. */
30929
+ includeAppLink: boolean().optional()
30890
30930
  }), 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, {
30891
30931
  kind: "mutation",
30892
30932
  auth: "admin"
@@ -31147,7 +31187,7 @@ var MeshPeerSchema = object({
31147
31187
  tags: array(string()).readonly(),
31148
31188
  /** True when the peer advertises itself as an exit-node candidate. */
31149
31189
  exitNodeOption: boolean(),
31150
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31190
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
31151
31191
  advertisedRoutes: array(string()).readonly(),
31152
31192
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31153
31193
  userLogin: string().nullable(),
@@ -32091,7 +32131,13 @@ var OsdStatusSchema = object({ overlays: array(object({
32091
32131
  */
32092
32132
  availablePositions: array(OsdPositionEnum).readonly(),
32093
32133
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
32094
- readOnly: boolean().optional()
32134
+ readOnly: boolean().optional(),
32135
+ /**
32136
+ * Firmware text ceiling for this overlay. Absent = no known limit.
32137
+ * The OSD manager truncates here on every write — never stores its own
32138
+ * copy on the binding.
32139
+ */
32140
+ maxCharacters: number().int().positive().optional()
32095
32141
  })).readonly() });
32096
32142
  var OsdOverlayPatchSchema = object({
32097
32143
  enabled: boolean().optional(),
@@ -32142,7 +32188,9 @@ var OsdTemplateBindingSchema = object({
32142
32188
  valuePath: string().min(1).max(64),
32143
32189
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
32144
32190
  displayUnit: string().max(16).optional(),
32145
- maxDecimals: number().int().min(0).max(4).default(1)
32191
+ maxDecimals: number().int().min(0).max(4).default(1),
32192
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
32193
+ valueMap: record(string(), string()).optional()
32146
32194
  });
32147
32195
  /**
32148
32196
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32192,18 +32240,11 @@ var OsdSlotBindingSchema = object({
32192
32240
  source: OsdSourceSchema,
32193
32241
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32194
32242
  template: string().max(96).default("${value}"),
32195
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32196
- maxCharacters: number().int().min(4).max(64).optional(),
32197
32243
  /**
32198
32244
  * Decimal places for a numeric value. `0` yields an integer — the
32199
32245
  * documented workaround for firmwares that reject `.` in overlay text.
32200
32246
  */
32201
32247
  maxDecimals: number().int().min(0).max(4).default(1),
32202
- /**
32203
- * Appended via `${unit}` when no unit conversion produces a label.
32204
- * Prefer `source.displayUnit` for converted device-state values.
32205
- */
32206
- unitLabel: string().max(8).optional(),
32207
32248
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32208
32249
  valueMap: record(string(), string()).optional(),
32209
32250
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32212,9 +32253,7 @@ var OsdSlotBindingSchema = object({
32212
32253
  * Display gate, in the notification centre's condition vocabulary.
32213
32254
  * Only the keys reported by `getConditionSupport` are accepted.
32214
32255
  */
32215
- conditions: NcConditionsSchema.optional(),
32216
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32217
- fallbackText: string().max(64).default("")
32256
+ conditions: NcConditionsSchema.optional()
32218
32257
  });
32219
32258
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32220
32259
  var OsdSlotViewSchema = object({
@@ -47891,12 +47930,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47891
47930
  {
47892
47931
  id: "addons",
47893
47932
  family: "system",
47894
- label: "Addons",
47895
- kinds: [
47896
- "addon-crash-loop",
47897
- "addon-update-available",
47898
- "addon-updated"
47899
- ]
47933
+ label: "Addons stopped",
47934
+ kinds: ["addon-crash-loop"]
47935
+ },
47936
+ {
47937
+ id: "addon-updates",
47938
+ family: "system",
47939
+ label: "Addon updates",
47940
+ kinds: ["addon-update-available", "addon-updated"]
47900
47941
  },
47901
47942
  {
47902
47943
  id: "updates",
@@ -48056,13 +48097,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48056
48097
  },
48057
48098
  {
48058
48099
  name: "summaryAddons",
48059
- label: "Summary: addons",
48060
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48061
- kinds: [
48062
- "addon-crash-loop",
48063
- "addon-update-available",
48064
- "addon-updated"
48065
- ]
48100
+ label: "Summary: addons stopped",
48101
+ example: "hub — recorder stopped after repeated crashes",
48102
+ kinds: ["addon-crash-loop"]
48103
+ },
48104
+ {
48105
+ name: "summaryAddonUpdates",
48106
+ label: "Summary: addon updates",
48107
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
48108
+ kinds: ["addon-update-available", "addon-updated"]
48066
48109
  },
48067
48110
  {
48068
48111
  name: "summaryUpdates",
@@ -48146,6 +48189,7 @@ var STATE_SUMMARY_VARS = [
48146
48189
  [...RULE_BODY_ONLY],
48147
48190
  [...RULE_TEXT],
48148
48191
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48192
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
48149
48193
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48150
48194
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
48151
48195
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -48186,6 +48230,8 @@ var STATE_SUMMARY_VARS = [
48186
48230
  [...RULE_TEXT],
48187
48231
  [...RULE_TEXT],
48188
48232
  [...RULE_TEXT],
48233
+ [...RULE_TEXT],
48234
+ [...RULE_TEXT],
48189
48235
  ...STATE_SUMMARY_VARS
48190
48236
  ];
48191
48237
  new Set([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.128",
3
+ "version": "1.2.129",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",