@camstack/addon-export-alexa 1.2.126 → 1.2.128

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.
@@ -5406,7 +5406,7 @@ var ZodIssueCode = {
5406
5406
  var ZodFirstPartyTypeKind;
5407
5407
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5408
5408
  //#endregion
5409
- //#region ../types/dist/sleep-CDCONfkt.mjs
5409
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5410
5410
  /**
5411
5411
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5412
5412
  * window to float samples (D455).
@@ -5714,6 +5714,43 @@ function hydrateField(field, values) {
5714
5714
  }
5715
5715
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5716
5716
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5717
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
5718
+ const from = values[field.suggestionsFrom];
5719
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
5720
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
5721
+ return {
5722
+ ...field,
5723
+ suggestions: merged,
5724
+ value
5725
+ };
5726
+ }
5727
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
5728
+ const from = values[field.optionsFrom];
5729
+ const byValue = /* @__PURE__ */ new Map();
5730
+ for (const opt of field.options) byValue.set(opt.value, opt);
5731
+ if (Array.isArray(from)) for (const entry of from) {
5732
+ if (typeof entry === "string" && entry.length > 0) {
5733
+ if (!byValue.has(entry)) byValue.set(entry, {
5734
+ value: entry,
5735
+ label: entry
5736
+ });
5737
+ continue;
5738
+ }
5739
+ if (entry === null || typeof entry !== "object") continue;
5740
+ const v = Reflect.get(entry, "value");
5741
+ const lbl = Reflect.get(entry, "label");
5742
+ if (typeof v !== "string" || v.length === 0) continue;
5743
+ if (!byValue.has(v)) byValue.set(v, {
5744
+ value: v,
5745
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
5746
+ });
5747
+ }
5748
+ return {
5749
+ ...field,
5750
+ options: [...byValue.values()],
5751
+ value
5752
+ };
5753
+ }
5717
5754
  return {
5718
5755
  ...field,
5719
5756
  value
@@ -11202,7 +11239,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
11202
11239
  }),
11203
11240
  object({
11204
11241
  kind: literal("cap"),
11205
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
11242
+ /**
11243
+ * One device, several same-family devices (locks / climate family / …),
11244
+ * or `{ $var }` for the device that triggered the run. An array is
11245
+ * fan-out at codegen — each id gets the same cap.method call.
11246
+ */
11247
+ deviceId: union([
11248
+ number().int(),
11249
+ array(number().int()).min(1),
11250
+ object({ $var: string().min(1) })
11251
+ ]),
11206
11252
  cap: string().min(1),
11207
11253
  method: string().min(1),
11208
11254
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -14374,7 +14420,7 @@ DeviceType.Camera;
14374
14420
  * This matters here more than anywhere else in the repo, because every provider
14375
14421
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14376
14422
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14377
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
14423
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14378
14424
  * camera's own page will ask for its own login. That is correct, and pre-
14379
14425
  * filling it is the operator's business, not ours.
14380
14426
  *
@@ -17887,10 +17933,35 @@ var SendResultSchema = object({
17887
17933
  });
17888
17934
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
17889
17935
  var TestResultSchema = SendResultSchema;
17890
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
17936
+ /**
17937
+ * Pre-save credential probe against a partial (unsaved) target config.
17938
+ * `resolvedUrl` never includes secrets (token stripped from path).
17939
+ */
17940
+ var ProbeTargetConfigResultSchema = object({
17941
+ ok: boolean(),
17942
+ resolvedUrl: string(),
17943
+ httpStatus: number().int().optional(),
17944
+ stateInstance: string().optional(),
17945
+ error: string().optional()
17946
+ });
17947
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
17891
17948
  kind: string(),
17892
- config: record(string(), unknown()).optional()
17949
+ config: record(string(), unknown()).optional(),
17950
+ /**
17951
+ * When editing / duplicating, the blank password field never round-trips
17952
+ * the stored token. Pass the source target id so the provider can restore
17953
+ * secrets server-side before dialling (same merge as upsert).
17954
+ */
17955
+ targetId: string().optional()
17893
17956
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
17957
+ kind: string(),
17958
+ config: record(string(), unknown()),
17959
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
17960
+ targetId: string().optional()
17961
+ }), ProbeTargetConfigResultSchema, {
17962
+ kind: "mutation",
17963
+ auth: "admin"
17964
+ }), method(object({
17894
17965
  targetId: string(),
17895
17966
  notification: NotificationSchema
17896
17967
  }), SendResultSchema, {
@@ -17902,7 +17973,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
17902
17973
  }), TestResultSchema, {
17903
17974
  kind: "mutation",
17904
17975
  auth: "admin"
17905
- }), method(object({ target: TargetSchema }), TargetSchema, {
17976
+ }), method(object({
17977
+ target: TargetSchema,
17978
+ /**
17979
+ * Duplicate flow: create a NEW target id while copying secrets from an
17980
+ * existing row. The UI never holds the stored token; blank / redacted
17981
+ * password fields are restored from this source (D634 still applies if
17982
+ * destinations diverge without a re-typed secret).
17983
+ */
17984
+ cloneSecretsFrom: string().optional()
17985
+ }), TargetSchema, {
17906
17986
  kind: "mutation",
17907
17987
  auth: "admin"
17908
17988
  }), method(object({ targetId: string() }), _void(), {
@@ -20283,17 +20363,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
20283
20363
  var NcAlarmDelaySecSchema = number().int().min(0).max(600);
20284
20364
  var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
20285
20365
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
20366
+ /**
20367
+ * What the panel does when a bounded triggered window ends.
20368
+ * - `rearmAfter` — return to the armed mode
20369
+ * - `disableAfter` — auto-disarm
20370
+ * - `doNothing` — stay triggered until a human disarms
20371
+ */
20372
+ var NcAlarmPostTriggeredActionSchema = _enum([
20373
+ "rearmAfter",
20374
+ "disableAfter",
20375
+ "doNothing"
20376
+ ]);
20286
20377
  var NcAlarmModeDelaysListSchema = array(object({
20287
20378
  mode: AlarmArmModeSchema,
20288
20379
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
20289
20380
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
20290
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
20381
+ /**
20382
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
20383
+ * historical field name so older clients still read/write a number.
20384
+ */
20385
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
20386
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
20387
+ /**
20388
+ * When this mode may be armed. Absent / null = always allowed (same as a
20389
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20390
+ */
20391
+ schedule: NcScheduleSchema.optional()
20291
20392
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20292
20393
  var NcAlarmModeDelaysEditListSchema = array(object({
20293
20394
  mode: AlarmArmModeSchema,
20294
20395
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
20295
20396
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
20296
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
20397
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20398
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20399
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
20400
+ schedule: NcScheduleSchema.nullable().optional()
20297
20401
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20298
20402
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20299
20403
  var NcAlarmNonBlockingEditSchema = object({
@@ -20365,12 +20469,18 @@ var NcAlarmSettingsSchema = object({
20365
20469
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
20366
20470
  entryDelaySec: NcAlarmDelaySecSchema,
20367
20471
  /**
20368
- * How long `triggered` lasts before the panel re-arms itself.
20369
- * **0 = until an operator disarms it** — the behaviour before this field
20370
- * existed, and therefore what an untouched install keeps doing.
20472
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
20473
+ * Ignored when the action is `doNothing`. Historical name kept so older
20474
+ * clients still round-trip a number.
20371
20475
  */
20372
20476
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
20373
20477
  /**
20478
+ * What happens when the triggered window ends. Absent on a blob older than
20479
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
20480
+ * else doNothing).
20481
+ */
20482
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
20483
+ /**
20374
20484
  * Deprecated by D630 — every transition is announced. Parsed, never read;
20375
20485
  * remove after one release. Optional so an older admin's patch (which still
20376
20486
  * sends it) parses rather than failing the whole save.
@@ -30618,7 +30728,7 @@ var LocalInterfaceSchema = object({
30618
30728
  name: string(),
30619
30729
  family: _enum(["IPv4", "IPv6"]),
30620
30730
  address: string(),
30621
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
30731
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30622
30732
  cidr: string(),
30623
30733
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30624
30734
  netmask: string(),
@@ -31064,7 +31174,7 @@ var MeshPeerSchema = object({
31064
31174
  tags: array(string()).readonly(),
31065
31175
  /** True when the peer advertises itself as an exit-node candidate. */
31066
31176
  exitNodeOption: boolean(),
31067
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
31177
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31068
31178
  advertisedRoutes: array(string()).readonly(),
31069
31179
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31070
31180
  userLogin: string().nullable(),
@@ -39962,6 +40072,12 @@ Object.freeze({
39962
40072
  addonId: null,
39963
40073
  access: "view"
39964
40074
  },
40075
+ "notificationOutput.getTarget": {
40076
+ capName: "notification-output",
40077
+ capScope: "system",
40078
+ addonId: null,
40079
+ access: "view"
40080
+ },
39965
40081
  "notificationOutput.listTargetKinds": {
39966
40082
  capName: "notification-output",
39967
40083
  capScope: "system",
@@ -39974,6 +40090,12 @@ Object.freeze({
39974
40090
  addonId: null,
39975
40091
  access: "view"
39976
40092
  },
40093
+ "notificationOutput.probeTargetConfig": {
40094
+ capName: "notification-output",
40095
+ capScope: "system",
40096
+ addonId: null,
40097
+ access: "create"
40098
+ },
39977
40099
  "notificationOutput.send": {
39978
40100
  capName: "notification-output",
39979
40101
  capScope: "system",
@@ -43683,6 +43805,7 @@ Object.freeze({
43683
43805
  access: "create"
43684
43806
  }
43685
43807
  });
43808
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
43686
43809
  DeviceFeature.BatteryOperated;
43687
43810
  /**
43688
43811
  * The vocabulary, in the order a picker offers it.
@@ -5379,7 +5379,7 @@ var ZodIssueCode = {
5379
5379
  var ZodFirstPartyTypeKind;
5380
5380
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5381
  //#endregion
5382
- //#region ../types/dist/sleep-CDCONfkt.mjs
5382
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5383
5383
  /**
5384
5384
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5385
  * window to float samples (D455).
@@ -5687,6 +5687,43 @@ function hydrateField(field, values) {
5687
5687
  }
5688
5688
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5689
5689
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5690
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
5691
+ const from = values[field.suggestionsFrom];
5692
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
5693
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
5694
+ return {
5695
+ ...field,
5696
+ suggestions: merged,
5697
+ value
5698
+ };
5699
+ }
5700
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
5701
+ const from = values[field.optionsFrom];
5702
+ const byValue = /* @__PURE__ */ new Map();
5703
+ for (const opt of field.options) byValue.set(opt.value, opt);
5704
+ if (Array.isArray(from)) for (const entry of from) {
5705
+ if (typeof entry === "string" && entry.length > 0) {
5706
+ if (!byValue.has(entry)) byValue.set(entry, {
5707
+ value: entry,
5708
+ label: entry
5709
+ });
5710
+ continue;
5711
+ }
5712
+ if (entry === null || typeof entry !== "object") continue;
5713
+ const v = Reflect.get(entry, "value");
5714
+ const lbl = Reflect.get(entry, "label");
5715
+ if (typeof v !== "string" || v.length === 0) continue;
5716
+ if (!byValue.has(v)) byValue.set(v, {
5717
+ value: v,
5718
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
5719
+ });
5720
+ }
5721
+ return {
5722
+ ...field,
5723
+ options: [...byValue.values()],
5724
+ value
5725
+ };
5726
+ }
5690
5727
  return {
5691
5728
  ...field,
5692
5729
  value
@@ -11175,7 +11212,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
11175
11212
  }),
11176
11213
  object({
11177
11214
  kind: literal("cap"),
11178
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
11215
+ /**
11216
+ * One device, several same-family devices (locks / climate family / …),
11217
+ * or `{ $var }` for the device that triggered the run. An array is
11218
+ * fan-out at codegen — each id gets the same cap.method call.
11219
+ */
11220
+ deviceId: union([
11221
+ number().int(),
11222
+ array(number().int()).min(1),
11223
+ object({ $var: string().min(1) })
11224
+ ]),
11179
11225
  cap: string().min(1),
11180
11226
  method: string().min(1),
11181
11227
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -14347,7 +14393,7 @@ DeviceType.Camera;
14347
14393
  * This matters here more than anywhere else in the repo, because every provider
14348
14394
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14349
14395
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14350
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
14396
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14351
14397
  * camera's own page will ask for its own login. That is correct, and pre-
14352
14398
  * filling it is the operator's business, not ours.
14353
14399
  *
@@ -17860,10 +17906,35 @@ var SendResultSchema = object({
17860
17906
  });
17861
17907
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
17862
17908
  var TestResultSchema = SendResultSchema;
17863
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
17909
+ /**
17910
+ * Pre-save credential probe against a partial (unsaved) target config.
17911
+ * `resolvedUrl` never includes secrets (token stripped from path).
17912
+ */
17913
+ var ProbeTargetConfigResultSchema = object({
17914
+ ok: boolean(),
17915
+ resolvedUrl: string(),
17916
+ httpStatus: number().int().optional(),
17917
+ stateInstance: string().optional(),
17918
+ error: string().optional()
17919
+ });
17920
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
17864
17921
  kind: string(),
17865
- config: record(string(), unknown()).optional()
17922
+ config: record(string(), unknown()).optional(),
17923
+ /**
17924
+ * When editing / duplicating, the blank password field never round-trips
17925
+ * the stored token. Pass the source target id so the provider can restore
17926
+ * secrets server-side before dialling (same merge as upsert).
17927
+ */
17928
+ targetId: string().optional()
17866
17929
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
17930
+ kind: string(),
17931
+ config: record(string(), unknown()),
17932
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
17933
+ targetId: string().optional()
17934
+ }), ProbeTargetConfigResultSchema, {
17935
+ kind: "mutation",
17936
+ auth: "admin"
17937
+ }), method(object({
17867
17938
  targetId: string(),
17868
17939
  notification: NotificationSchema
17869
17940
  }), SendResultSchema, {
@@ -17875,7 +17946,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
17875
17946
  }), TestResultSchema, {
17876
17947
  kind: "mutation",
17877
17948
  auth: "admin"
17878
- }), method(object({ target: TargetSchema }), TargetSchema, {
17949
+ }), method(object({
17950
+ target: TargetSchema,
17951
+ /**
17952
+ * Duplicate flow: create a NEW target id while copying secrets from an
17953
+ * existing row. The UI never holds the stored token; blank / redacted
17954
+ * password fields are restored from this source (D634 still applies if
17955
+ * destinations diverge without a re-typed secret).
17956
+ */
17957
+ cloneSecretsFrom: string().optional()
17958
+ }), TargetSchema, {
17879
17959
  kind: "mutation",
17880
17960
  auth: "admin"
17881
17961
  }), method(object({ targetId: string() }), _void(), {
@@ -20256,17 +20336,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
20256
20336
  var NcAlarmDelaySecSchema = number().int().min(0).max(600);
20257
20337
  var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
20258
20338
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
20339
+ /**
20340
+ * What the panel does when a bounded triggered window ends.
20341
+ * - `rearmAfter` — return to the armed mode
20342
+ * - `disableAfter` — auto-disarm
20343
+ * - `doNothing` — stay triggered until a human disarms
20344
+ */
20345
+ var NcAlarmPostTriggeredActionSchema = _enum([
20346
+ "rearmAfter",
20347
+ "disableAfter",
20348
+ "doNothing"
20349
+ ]);
20259
20350
  var NcAlarmModeDelaysListSchema = array(object({
20260
20351
  mode: AlarmArmModeSchema,
20261
20352
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
20262
20353
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
20263
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
20354
+ /**
20355
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
20356
+ * historical field name so older clients still read/write a number.
20357
+ */
20358
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
20359
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
20360
+ /**
20361
+ * When this mode may be armed. Absent / null = always allowed (same as a
20362
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20363
+ */
20364
+ schedule: NcScheduleSchema.optional()
20264
20365
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20265
20366
  var NcAlarmModeDelaysEditListSchema = array(object({
20266
20367
  mode: AlarmArmModeSchema,
20267
20368
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
20268
20369
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
20269
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
20370
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20371
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20372
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
20373
+ schedule: NcScheduleSchema.nullable().optional()
20270
20374
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20271
20375
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20272
20376
  var NcAlarmNonBlockingEditSchema = object({
@@ -20338,12 +20442,18 @@ var NcAlarmSettingsSchema = object({
20338
20442
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
20339
20443
  entryDelaySec: NcAlarmDelaySecSchema,
20340
20444
  /**
20341
- * How long `triggered` lasts before the panel re-arms itself.
20342
- * **0 = until an operator disarms it** — the behaviour before this field
20343
- * existed, and therefore what an untouched install keeps doing.
20445
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
20446
+ * Ignored when the action is `doNothing`. Historical name kept so older
20447
+ * clients still round-trip a number.
20344
20448
  */
20345
20449
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
20346
20450
  /**
20451
+ * What happens when the triggered window ends. Absent on a blob older than
20452
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
20453
+ * else doNothing).
20454
+ */
20455
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
20456
+ /**
20347
20457
  * Deprecated by D630 — every transition is announced. Parsed, never read;
20348
20458
  * remove after one release. Optional so an older admin's patch (which still
20349
20459
  * sends it) parses rather than failing the whole save.
@@ -30591,7 +30701,7 @@ var LocalInterfaceSchema = object({
30591
30701
  name: string(),
30592
30702
  family: _enum(["IPv4", "IPv6"]),
30593
30703
  address: string(),
30594
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
30704
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30595
30705
  cidr: string(),
30596
30706
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30597
30707
  netmask: string(),
@@ -31037,7 +31147,7 @@ var MeshPeerSchema = object({
31037
31147
  tags: array(string()).readonly(),
31038
31148
  /** True when the peer advertises itself as an exit-node candidate. */
31039
31149
  exitNodeOption: boolean(),
31040
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
31150
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31041
31151
  advertisedRoutes: array(string()).readonly(),
31042
31152
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31043
31153
  userLogin: string().nullable(),
@@ -39935,6 +40045,12 @@ Object.freeze({
39935
40045
  addonId: null,
39936
40046
  access: "view"
39937
40047
  },
40048
+ "notificationOutput.getTarget": {
40049
+ capName: "notification-output",
40050
+ capScope: "system",
40051
+ addonId: null,
40052
+ access: "view"
40053
+ },
39938
40054
  "notificationOutput.listTargetKinds": {
39939
40055
  capName: "notification-output",
39940
40056
  capScope: "system",
@@ -39947,6 +40063,12 @@ Object.freeze({
39947
40063
  addonId: null,
39948
40064
  access: "view"
39949
40065
  },
40066
+ "notificationOutput.probeTargetConfig": {
40067
+ capName: "notification-output",
40068
+ capScope: "system",
40069
+ addonId: null,
40070
+ access: "create"
40071
+ },
39950
40072
  "notificationOutput.send": {
39951
40073
  capName: "notification-output",
39952
40074
  capScope: "system",
@@ -43656,6 +43778,7 @@ Object.freeze({
43656
43778
  access: "create"
43657
43779
  }
43658
43780
  });
43781
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
43659
43782
  DeviceFeature.BatteryOperated;
43660
43783
  /**
43661
43784
  * The vocabulary, in the order a picker offers it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.126",
3
+ "version": "1.2.128",
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",