@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.
- package/dist/export-alexa.addon.js +136 -13
- package/dist/export-alexa.addon.mjs +136 -13
- package/package.json +1 -1
|
@@ -5406,7 +5406,7 @@ var ZodIssueCode = {
|
|
|
5406
5406
|
var ZodFirstPartyTypeKind;
|
|
5407
5407
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5408
5408
|
//#endregion
|
|
5409
|
-
//#region ../types/dist/sleep-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
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
|
|
20369
|
-
*
|
|
20370
|
-
*
|
|
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.
|
|
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.
|
|
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-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
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
|
|
20342
|
-
*
|
|
20343
|
-
*
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|