@camstack/addon-model-studio 1.1.196 → 1.1.198
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/{MotionZonesSettings-DYN6D3Q3.mjs → MotionZonesSettings-JRWr-847.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-D8ePv2JK.mjs → PrivacyMaskSettings-BfpUuDZo.mjs} +4 -4
- package/dist/{SceneMonitorEditor-DnOFRC20.mjs → SceneMonitorEditor-B6q_snqj.mjs} +3 -3
- package/dist/_stub.js +103 -101
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DXaNF8pe.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BmFXvTL5.mjs} +4 -4
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BKQUo9FB.mjs +26 -0
- package/dist/addon-model-studio.css +1 -1
- package/dist/{hostInit-DF-H_MgC.mjs → hostInit-DWCuJ3yO.mjs} +3 -3
- package/dist/model-studio.addon.js +145 -13
- package/dist/model-studio.addon.mjs +145 -13
- package/dist/{player-overlays-1iZVpnxF.mjs → player-overlays-RAKUtQ68.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-Cpl8e10S.mjs → responsive-Cr8pn1rO.mjs} +1 -1
- package/dist/{scene-monitor-copy-D5NESGG4.mjs → scene-monitor-copy-NIVM76QJ.mjs} +1 -1
- package/dist/{square-Do07uow8.mjs → square-BOlfCWYp.mjs} +1 -1
- package/dist/{trash-2-JIHOLs10.mjs → trash-2-aAfBxjgh.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Cb6JeXV8.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BhhyZUuH.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-wNBuLHob.mjs +0 -26
|
@@ -5950,7 +5950,7 @@ var ZodIssueCode = {
|
|
|
5950
5950
|
var ZodFirstPartyTypeKind;
|
|
5951
5951
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5952
5952
|
//#endregion
|
|
5953
|
-
//#region ../types/dist/sleep-
|
|
5953
|
+
//#region ../types/dist/sleep-DXKLNFvA.mjs
|
|
5954
5954
|
/**
|
|
5955
5955
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5956
5956
|
* window to float samples (D455).
|
|
@@ -6258,6 +6258,43 @@ function hydrateField(field, values) {
|
|
|
6258
6258
|
}
|
|
6259
6259
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
6260
6260
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
6261
|
+
if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
|
|
6262
|
+
const from = values[field.suggestionsFrom];
|
|
6263
|
+
const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
|
|
6264
|
+
const merged = [...new Set([...field.suggestions ?? [], ...extra])];
|
|
6265
|
+
return {
|
|
6266
|
+
...field,
|
|
6267
|
+
suggestions: merged,
|
|
6268
|
+
value
|
|
6269
|
+
};
|
|
6270
|
+
}
|
|
6271
|
+
if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
|
|
6272
|
+
const from = values[field.optionsFrom];
|
|
6273
|
+
const byValue = /* @__PURE__ */ new Map();
|
|
6274
|
+
for (const opt of field.options) byValue.set(opt.value, opt);
|
|
6275
|
+
if (Array.isArray(from)) for (const entry of from) {
|
|
6276
|
+
if (typeof entry === "string" && entry.length > 0) {
|
|
6277
|
+
if (!byValue.has(entry)) byValue.set(entry, {
|
|
6278
|
+
value: entry,
|
|
6279
|
+
label: entry
|
|
6280
|
+
});
|
|
6281
|
+
continue;
|
|
6282
|
+
}
|
|
6283
|
+
if (entry === null || typeof entry !== "object") continue;
|
|
6284
|
+
const v = Reflect.get(entry, "value");
|
|
6285
|
+
const lbl = Reflect.get(entry, "label");
|
|
6286
|
+
if (typeof v !== "string" || v.length === 0) continue;
|
|
6287
|
+
if (!byValue.has(v)) byValue.set(v, {
|
|
6288
|
+
value: v,
|
|
6289
|
+
label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
|
|
6290
|
+
});
|
|
6291
|
+
}
|
|
6292
|
+
return {
|
|
6293
|
+
...field,
|
|
6294
|
+
options: [...byValue.values()],
|
|
6295
|
+
value
|
|
6296
|
+
};
|
|
6297
|
+
}
|
|
6261
6298
|
return {
|
|
6262
6299
|
...field,
|
|
6263
6300
|
value
|
|
@@ -11532,7 +11569,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
11532
11569
|
}),
|
|
11533
11570
|
object({
|
|
11534
11571
|
kind: literal("cap"),
|
|
11535
|
-
|
|
11572
|
+
/**
|
|
11573
|
+
* One device, several same-family devices (locks / climate family / …),
|
|
11574
|
+
* or `{ $var }` for the device that triggered the run. An array is
|
|
11575
|
+
* fan-out at codegen — each id gets the same cap.method call.
|
|
11576
|
+
*/
|
|
11577
|
+
deviceId: union([
|
|
11578
|
+
number().int(),
|
|
11579
|
+
array(number().int()).min(1),
|
|
11580
|
+
object({ $var: string().min(1) })
|
|
11581
|
+
]),
|
|
11536
11582
|
cap: string().min(1),
|
|
11537
11583
|
method: string().min(1),
|
|
11538
11584
|
/** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
|
|
@@ -14718,7 +14764,7 @@ DeviceType.Camera;
|
|
|
14718
14764
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14719
14765
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14720
14766
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14721
|
-
* and `http://admin:hunter2@192.168.
|
|
14767
|
+
* and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
|
|
14722
14768
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14723
14769
|
* filling it is the operator's business, not ours.
|
|
14724
14770
|
*
|
|
@@ -18212,10 +18258,35 @@ var SendResultSchema = object({
|
|
|
18212
18258
|
});
|
|
18213
18259
|
/** Same shape as SendResult — kept as a distinct name for the test panel. */
|
|
18214
18260
|
var TestResultSchema = SendResultSchema;
|
|
18215
|
-
|
|
18261
|
+
/**
|
|
18262
|
+
* Pre-save credential probe against a partial (unsaved) target config.
|
|
18263
|
+
* `resolvedUrl` never includes secrets (token stripped from path).
|
|
18264
|
+
*/
|
|
18265
|
+
var ProbeTargetConfigResultSchema = object({
|
|
18266
|
+
ok: boolean(),
|
|
18267
|
+
resolvedUrl: string(),
|
|
18268
|
+
httpStatus: number().int().optional(),
|
|
18269
|
+
stateInstance: string().optional(),
|
|
18270
|
+
error: string().optional()
|
|
18271
|
+
});
|
|
18272
|
+
method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
|
|
18216
18273
|
kind: string(),
|
|
18217
|
-
config: record(string(), unknown()).optional()
|
|
18274
|
+
config: record(string(), unknown()).optional(),
|
|
18275
|
+
/**
|
|
18276
|
+
* When editing / duplicating, the blank password field never round-trips
|
|
18277
|
+
* the stored token. Pass the source target id so the provider can restore
|
|
18278
|
+
* secrets server-side before dialling (same merge as upsert).
|
|
18279
|
+
*/
|
|
18280
|
+
targetId: string().optional()
|
|
18218
18281
|
}), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
|
|
18282
|
+
kind: string(),
|
|
18283
|
+
config: record(string(), unknown()),
|
|
18284
|
+
/** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
|
|
18285
|
+
targetId: string().optional()
|
|
18286
|
+
}), ProbeTargetConfigResultSchema, {
|
|
18287
|
+
kind: "mutation",
|
|
18288
|
+
auth: "admin"
|
|
18289
|
+
}), method(object({
|
|
18219
18290
|
targetId: string(),
|
|
18220
18291
|
notification: NotificationSchema
|
|
18221
18292
|
}), SendResultSchema, {
|
|
@@ -18227,7 +18298,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
18227
18298
|
}), TestResultSchema, {
|
|
18228
18299
|
kind: "mutation",
|
|
18229
18300
|
auth: "admin"
|
|
18230
|
-
}), method(object({
|
|
18301
|
+
}), method(object({
|
|
18302
|
+
target: TargetSchema,
|
|
18303
|
+
/**
|
|
18304
|
+
* Duplicate flow: create a NEW target id while copying secrets from an
|
|
18305
|
+
* existing row. The UI never holds the stored token; blank / redacted
|
|
18306
|
+
* password fields are restored from this source (D634 still applies if
|
|
18307
|
+
* destinations diverge without a re-typed secret).
|
|
18308
|
+
*/
|
|
18309
|
+
cloneSecretsFrom: string().optional()
|
|
18310
|
+
}), TargetSchema, {
|
|
18231
18311
|
kind: "mutation",
|
|
18232
18312
|
auth: "admin"
|
|
18233
18313
|
}), method(object({ targetId: string() }), _void(), {
|
|
@@ -18864,6 +18944,15 @@ var AlarmArmModeSchema = _enum([
|
|
|
18864
18944
|
object({
|
|
18865
18945
|
/** Current lifecycle state. */
|
|
18866
18946
|
state: AlarmStateSchema,
|
|
18947
|
+
/**
|
|
18948
|
+
* The arm mode the machine belongs to under transitional words
|
|
18949
|
+
* (`arming` / `pending` / `triggered` / `disarming`). `null` when
|
|
18950
|
+
* disarmed or when a provider cannot name one. Exporters MUST prefer
|
|
18951
|
+
* this over an in-process memo — a HomeKit accessory that missed the
|
|
18952
|
+
* settled `armed_*` slice used to map `pending` to DISARMED and hide
|
|
18953
|
+
* an entry delay.
|
|
18954
|
+
*/
|
|
18955
|
+
targetMode: AlarmArmModeSchema.nullable().optional(),
|
|
18867
18956
|
/** Subset of arm modes the panel accepts. UI renders one button per
|
|
18868
18957
|
* mode in this list. */
|
|
18869
18958
|
availableModes: array(AlarmArmModeSchema),
|
|
@@ -20599,17 +20688,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
|
|
|
20599
20688
|
var NcAlarmDelaySecSchema = number().int().min(0).max(600);
|
|
20600
20689
|
var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
|
|
20601
20690
|
var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
|
|
20691
|
+
/**
|
|
20692
|
+
* What the panel does when a bounded triggered window ends.
|
|
20693
|
+
* - `rearmAfter` — return to the armed mode
|
|
20694
|
+
* - `disableAfter` — auto-disarm
|
|
20695
|
+
* - `doNothing` — stay triggered until a human disarms
|
|
20696
|
+
*/
|
|
20697
|
+
var NcAlarmPostTriggeredActionSchema = _enum([
|
|
20698
|
+
"rearmAfter",
|
|
20699
|
+
"disableAfter",
|
|
20700
|
+
"doNothing"
|
|
20701
|
+
]);
|
|
20602
20702
|
var NcAlarmModeDelaysListSchema = array(object({
|
|
20603
20703
|
mode: AlarmArmModeSchema,
|
|
20604
20704
|
exitDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
20605
20705
|
entryDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
20606
|
-
|
|
20706
|
+
/**
|
|
20707
|
+
* Duration of `triggered` before {@link postTriggeredAction}. Kept as the
|
|
20708
|
+
* historical field name so older clients still read/write a number.
|
|
20709
|
+
*/
|
|
20710
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
|
|
20711
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
20712
|
+
/**
|
|
20713
|
+
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
20714
|
+
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
20715
|
+
*/
|
|
20716
|
+
schedule: NcScheduleSchema.optional()
|
|
20607
20717
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20608
20718
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20609
20719
|
mode: AlarmArmModeSchema,
|
|
20610
20720
|
exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
20611
20721
|
entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
20612
|
-
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
|
|
20722
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
20723
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
20724
|
+
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
20725
|
+
schedule: NcScheduleSchema.nullable().optional()
|
|
20613
20726
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20614
20727
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20615
20728
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -20681,12 +20794,18 @@ var NcAlarmSettingsSchema = object({
|
|
|
20681
20794
|
/** Grace period between a trigger and the alarm firing. 0 = immediate. */
|
|
20682
20795
|
entryDelaySec: NcAlarmDelaySecSchema,
|
|
20683
20796
|
/**
|
|
20684
|
-
* How long `triggered` lasts before
|
|
20685
|
-
*
|
|
20686
|
-
*
|
|
20797
|
+
* How long `triggered` lasts before {@link postTriggeredAction} runs.
|
|
20798
|
+
* Ignored when the action is `doNothing`. Historical name kept so older
|
|
20799
|
+
* clients still round-trip a number.
|
|
20687
20800
|
*/
|
|
20688
20801
|
triggeredDurationSec: NcAlarmTriggeredSecSchema,
|
|
20689
20802
|
/**
|
|
20803
|
+
* What happens when the triggered window ends. Absent on a blob older than
|
|
20804
|
+
* this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
|
|
20805
|
+
* else doNothing).
|
|
20806
|
+
*/
|
|
20807
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
20808
|
+
/**
|
|
20690
20809
|
* Deprecated by D630 — every transition is announced. Parsed, never read;
|
|
20691
20810
|
* remove after one release. Optional so an older admin's patch (which still
|
|
20692
20811
|
* sends it) parses rather than failing the whole save.
|
|
@@ -30918,7 +31037,7 @@ var LocalInterfaceSchema = object({
|
|
|
30918
31037
|
name: string(),
|
|
30919
31038
|
family: _enum(["IPv4", "IPv6"]),
|
|
30920
31039
|
address: string(),
|
|
30921
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
31040
|
+
/** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
|
|
30922
31041
|
cidr: string(),
|
|
30923
31042
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
30924
31043
|
netmask: string(),
|
|
@@ -31364,7 +31483,7 @@ var MeshPeerSchema = object({
|
|
|
31364
31483
|
tags: array(string()).readonly(),
|
|
31365
31484
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
31366
31485
|
exitNodeOption: boolean(),
|
|
31367
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
31486
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
|
|
31368
31487
|
advertisedRoutes: array(string()).readonly(),
|
|
31369
31488
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
31370
31489
|
userLogin: string().nullable(),
|
|
@@ -40262,6 +40381,12 @@ Object.freeze({
|
|
|
40262
40381
|
addonId: null,
|
|
40263
40382
|
access: "view"
|
|
40264
40383
|
},
|
|
40384
|
+
"notificationOutput.getTarget": {
|
|
40385
|
+
capName: "notification-output",
|
|
40386
|
+
capScope: "system",
|
|
40387
|
+
addonId: null,
|
|
40388
|
+
access: "view"
|
|
40389
|
+
},
|
|
40265
40390
|
"notificationOutput.listTargetKinds": {
|
|
40266
40391
|
capName: "notification-output",
|
|
40267
40392
|
capScope: "system",
|
|
@@ -40274,6 +40399,12 @@ Object.freeze({
|
|
|
40274
40399
|
addonId: null,
|
|
40275
40400
|
access: "view"
|
|
40276
40401
|
},
|
|
40402
|
+
"notificationOutput.probeTargetConfig": {
|
|
40403
|
+
capName: "notification-output",
|
|
40404
|
+
capScope: "system",
|
|
40405
|
+
addonId: null,
|
|
40406
|
+
access: "create"
|
|
40407
|
+
},
|
|
40277
40408
|
"notificationOutput.send": {
|
|
40278
40409
|
capName: "notification-output",
|
|
40279
40410
|
capScope: "system",
|
|
@@ -43983,6 +44114,7 @@ Object.freeze({
|
|
|
43983
44114
|
access: "create"
|
|
43984
44115
|
}
|
|
43985
44116
|
});
|
|
44117
|
+
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;
|
|
43986
44118
|
DeviceFeature.BatteryOperated;
|
|
43987
44119
|
/**
|
|
43988
44120
|
* The vocabulary, in the order a picker offers it.
|
|
@@ -5929,7 +5929,7 @@ var ZodIssueCode = {
|
|
|
5929
5929
|
var ZodFirstPartyTypeKind;
|
|
5930
5930
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5931
5931
|
//#endregion
|
|
5932
|
-
//#region ../types/dist/sleep-
|
|
5932
|
+
//#region ../types/dist/sleep-DXKLNFvA.mjs
|
|
5933
5933
|
/**
|
|
5934
5934
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5935
5935
|
* window to float samples (D455).
|
|
@@ -6237,6 +6237,43 @@ function hydrateField(field, values) {
|
|
|
6237
6237
|
}
|
|
6238
6238
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
6239
6239
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
6240
|
+
if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
|
|
6241
|
+
const from = values[field.suggestionsFrom];
|
|
6242
|
+
const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
|
|
6243
|
+
const merged = [...new Set([...field.suggestions ?? [], ...extra])];
|
|
6244
|
+
return {
|
|
6245
|
+
...field,
|
|
6246
|
+
suggestions: merged,
|
|
6247
|
+
value
|
|
6248
|
+
};
|
|
6249
|
+
}
|
|
6250
|
+
if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
|
|
6251
|
+
const from = values[field.optionsFrom];
|
|
6252
|
+
const byValue = /* @__PURE__ */ new Map();
|
|
6253
|
+
for (const opt of field.options) byValue.set(opt.value, opt);
|
|
6254
|
+
if (Array.isArray(from)) for (const entry of from) {
|
|
6255
|
+
if (typeof entry === "string" && entry.length > 0) {
|
|
6256
|
+
if (!byValue.has(entry)) byValue.set(entry, {
|
|
6257
|
+
value: entry,
|
|
6258
|
+
label: entry
|
|
6259
|
+
});
|
|
6260
|
+
continue;
|
|
6261
|
+
}
|
|
6262
|
+
if (entry === null || typeof entry !== "object") continue;
|
|
6263
|
+
const v = Reflect.get(entry, "value");
|
|
6264
|
+
const lbl = Reflect.get(entry, "label");
|
|
6265
|
+
if (typeof v !== "string" || v.length === 0) continue;
|
|
6266
|
+
if (!byValue.has(v)) byValue.set(v, {
|
|
6267
|
+
value: v,
|
|
6268
|
+
label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
|
|
6269
|
+
});
|
|
6270
|
+
}
|
|
6271
|
+
return {
|
|
6272
|
+
...field,
|
|
6273
|
+
options: [...byValue.values()],
|
|
6274
|
+
value
|
|
6275
|
+
};
|
|
6276
|
+
}
|
|
6240
6277
|
return {
|
|
6241
6278
|
...field,
|
|
6242
6279
|
value
|
|
@@ -11511,7 +11548,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
11511
11548
|
}),
|
|
11512
11549
|
object({
|
|
11513
11550
|
kind: literal("cap"),
|
|
11514
|
-
|
|
11551
|
+
/**
|
|
11552
|
+
* One device, several same-family devices (locks / climate family / …),
|
|
11553
|
+
* or `{ $var }` for the device that triggered the run. An array is
|
|
11554
|
+
* fan-out at codegen — each id gets the same cap.method call.
|
|
11555
|
+
*/
|
|
11556
|
+
deviceId: union([
|
|
11557
|
+
number().int(),
|
|
11558
|
+
array(number().int()).min(1),
|
|
11559
|
+
object({ $var: string().min(1) })
|
|
11560
|
+
]),
|
|
11515
11561
|
cap: string().min(1),
|
|
11516
11562
|
method: string().min(1),
|
|
11517
11563
|
/** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
|
|
@@ -14697,7 +14743,7 @@ DeviceType.Camera;
|
|
|
14697
14743
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14698
14744
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14699
14745
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14700
|
-
* and `http://admin:hunter2@192.168.
|
|
14746
|
+
* and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
|
|
14701
14747
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14702
14748
|
* filling it is the operator's business, not ours.
|
|
14703
14749
|
*
|
|
@@ -18191,10 +18237,35 @@ var SendResultSchema = object({
|
|
|
18191
18237
|
});
|
|
18192
18238
|
/** Same shape as SendResult — kept as a distinct name for the test panel. */
|
|
18193
18239
|
var TestResultSchema = SendResultSchema;
|
|
18194
|
-
|
|
18240
|
+
/**
|
|
18241
|
+
* Pre-save credential probe against a partial (unsaved) target config.
|
|
18242
|
+
* `resolvedUrl` never includes secrets (token stripped from path).
|
|
18243
|
+
*/
|
|
18244
|
+
var ProbeTargetConfigResultSchema = object({
|
|
18245
|
+
ok: boolean(),
|
|
18246
|
+
resolvedUrl: string(),
|
|
18247
|
+
httpStatus: number().int().optional(),
|
|
18248
|
+
stateInstance: string().optional(),
|
|
18249
|
+
error: string().optional()
|
|
18250
|
+
});
|
|
18251
|
+
method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
|
|
18195
18252
|
kind: string(),
|
|
18196
|
-
config: record(string(), unknown()).optional()
|
|
18253
|
+
config: record(string(), unknown()).optional(),
|
|
18254
|
+
/**
|
|
18255
|
+
* When editing / duplicating, the blank password field never round-trips
|
|
18256
|
+
* the stored token. Pass the source target id so the provider can restore
|
|
18257
|
+
* secrets server-side before dialling (same merge as upsert).
|
|
18258
|
+
*/
|
|
18259
|
+
targetId: string().optional()
|
|
18197
18260
|
}), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
|
|
18261
|
+
kind: string(),
|
|
18262
|
+
config: record(string(), unknown()),
|
|
18263
|
+
/** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
|
|
18264
|
+
targetId: string().optional()
|
|
18265
|
+
}), ProbeTargetConfigResultSchema, {
|
|
18266
|
+
kind: "mutation",
|
|
18267
|
+
auth: "admin"
|
|
18268
|
+
}), method(object({
|
|
18198
18269
|
targetId: string(),
|
|
18199
18270
|
notification: NotificationSchema
|
|
18200
18271
|
}), SendResultSchema, {
|
|
@@ -18206,7 +18277,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
18206
18277
|
}), TestResultSchema, {
|
|
18207
18278
|
kind: "mutation",
|
|
18208
18279
|
auth: "admin"
|
|
18209
|
-
}), method(object({
|
|
18280
|
+
}), method(object({
|
|
18281
|
+
target: TargetSchema,
|
|
18282
|
+
/**
|
|
18283
|
+
* Duplicate flow: create a NEW target id while copying secrets from an
|
|
18284
|
+
* existing row. The UI never holds the stored token; blank / redacted
|
|
18285
|
+
* password fields are restored from this source (D634 still applies if
|
|
18286
|
+
* destinations diverge without a re-typed secret).
|
|
18287
|
+
*/
|
|
18288
|
+
cloneSecretsFrom: string().optional()
|
|
18289
|
+
}), TargetSchema, {
|
|
18210
18290
|
kind: "mutation",
|
|
18211
18291
|
auth: "admin"
|
|
18212
18292
|
}), method(object({ targetId: string() }), _void(), {
|
|
@@ -18843,6 +18923,15 @@ var AlarmArmModeSchema = _enum([
|
|
|
18843
18923
|
object({
|
|
18844
18924
|
/** Current lifecycle state. */
|
|
18845
18925
|
state: AlarmStateSchema,
|
|
18926
|
+
/**
|
|
18927
|
+
* The arm mode the machine belongs to under transitional words
|
|
18928
|
+
* (`arming` / `pending` / `triggered` / `disarming`). `null` when
|
|
18929
|
+
* disarmed or when a provider cannot name one. Exporters MUST prefer
|
|
18930
|
+
* this over an in-process memo — a HomeKit accessory that missed the
|
|
18931
|
+
* settled `armed_*` slice used to map `pending` to DISARMED and hide
|
|
18932
|
+
* an entry delay.
|
|
18933
|
+
*/
|
|
18934
|
+
targetMode: AlarmArmModeSchema.nullable().optional(),
|
|
18846
18935
|
/** Subset of arm modes the panel accepts. UI renders one button per
|
|
18847
18936
|
* mode in this list. */
|
|
18848
18937
|
availableModes: array(AlarmArmModeSchema),
|
|
@@ -20578,17 +20667,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
|
|
|
20578
20667
|
var NcAlarmDelaySecSchema = number().int().min(0).max(600);
|
|
20579
20668
|
var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
|
|
20580
20669
|
var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
|
|
20670
|
+
/**
|
|
20671
|
+
* What the panel does when a bounded triggered window ends.
|
|
20672
|
+
* - `rearmAfter` — return to the armed mode
|
|
20673
|
+
* - `disableAfter` — auto-disarm
|
|
20674
|
+
* - `doNothing` — stay triggered until a human disarms
|
|
20675
|
+
*/
|
|
20676
|
+
var NcAlarmPostTriggeredActionSchema = _enum([
|
|
20677
|
+
"rearmAfter",
|
|
20678
|
+
"disableAfter",
|
|
20679
|
+
"doNothing"
|
|
20680
|
+
]);
|
|
20581
20681
|
var NcAlarmModeDelaysListSchema = array(object({
|
|
20582
20682
|
mode: AlarmArmModeSchema,
|
|
20583
20683
|
exitDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
20584
20684
|
entryDelaySec: NcAlarmDelaySecSchema.optional(),
|
|
20585
|
-
|
|
20685
|
+
/**
|
|
20686
|
+
* Duration of `triggered` before {@link postTriggeredAction}. Kept as the
|
|
20687
|
+
* historical field name so older clients still read/write a number.
|
|
20688
|
+
*/
|
|
20689
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
|
|
20690
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
20691
|
+
/**
|
|
20692
|
+
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
20693
|
+
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
20694
|
+
*/
|
|
20695
|
+
schedule: NcScheduleSchema.optional()
|
|
20586
20696
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
20587
20697
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
20588
20698
|
mode: AlarmArmModeSchema,
|
|
20589
20699
|
exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
20590
20700
|
entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
|
|
20591
|
-
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
|
|
20701
|
+
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
20702
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
20703
|
+
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
20704
|
+
schedule: NcScheduleSchema.nullable().optional()
|
|
20592
20705
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
20593
20706
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
20594
20707
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -20660,12 +20773,18 @@ var NcAlarmSettingsSchema = object({
|
|
|
20660
20773
|
/** Grace period between a trigger and the alarm firing. 0 = immediate. */
|
|
20661
20774
|
entryDelaySec: NcAlarmDelaySecSchema,
|
|
20662
20775
|
/**
|
|
20663
|
-
* How long `triggered` lasts before
|
|
20664
|
-
*
|
|
20665
|
-
*
|
|
20776
|
+
* How long `triggered` lasts before {@link postTriggeredAction} runs.
|
|
20777
|
+
* Ignored when the action is `doNothing`. Historical name kept so older
|
|
20778
|
+
* clients still round-trip a number.
|
|
20666
20779
|
*/
|
|
20667
20780
|
triggeredDurationSec: NcAlarmTriggeredSecSchema,
|
|
20668
20781
|
/**
|
|
20782
|
+
* What happens when the triggered window ends. Absent on a blob older than
|
|
20783
|
+
* this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
|
|
20784
|
+
* else doNothing).
|
|
20785
|
+
*/
|
|
20786
|
+
postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
|
|
20787
|
+
/**
|
|
20669
20788
|
* Deprecated by D630 — every transition is announced. Parsed, never read;
|
|
20670
20789
|
* remove after one release. Optional so an older admin's patch (which still
|
|
20671
20790
|
* sends it) parses rather than failing the whole save.
|
|
@@ -30897,7 +31016,7 @@ var LocalInterfaceSchema = object({
|
|
|
30897
31016
|
name: string(),
|
|
30898
31017
|
family: _enum(["IPv4", "IPv6"]),
|
|
30899
31018
|
address: string(),
|
|
30900
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
31019
|
+
/** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
|
|
30901
31020
|
cidr: string(),
|
|
30902
31021
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
30903
31022
|
netmask: string(),
|
|
@@ -31343,7 +31462,7 @@ var MeshPeerSchema = object({
|
|
|
31343
31462
|
tags: array(string()).readonly(),
|
|
31344
31463
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
31345
31464
|
exitNodeOption: boolean(),
|
|
31346
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
31465
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
|
|
31347
31466
|
advertisedRoutes: array(string()).readonly(),
|
|
31348
31467
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
31349
31468
|
userLogin: string().nullable(),
|
|
@@ -40241,6 +40360,12 @@ Object.freeze({
|
|
|
40241
40360
|
addonId: null,
|
|
40242
40361
|
access: "view"
|
|
40243
40362
|
},
|
|
40363
|
+
"notificationOutput.getTarget": {
|
|
40364
|
+
capName: "notification-output",
|
|
40365
|
+
capScope: "system",
|
|
40366
|
+
addonId: null,
|
|
40367
|
+
access: "view"
|
|
40368
|
+
},
|
|
40244
40369
|
"notificationOutput.listTargetKinds": {
|
|
40245
40370
|
capName: "notification-output",
|
|
40246
40371
|
capScope: "system",
|
|
@@ -40253,6 +40378,12 @@ Object.freeze({
|
|
|
40253
40378
|
addonId: null,
|
|
40254
40379
|
access: "view"
|
|
40255
40380
|
},
|
|
40381
|
+
"notificationOutput.probeTargetConfig": {
|
|
40382
|
+
capName: "notification-output",
|
|
40383
|
+
capScope: "system",
|
|
40384
|
+
addonId: null,
|
|
40385
|
+
access: "create"
|
|
40386
|
+
},
|
|
40256
40387
|
"notificationOutput.send": {
|
|
40257
40388
|
capName: "notification-output",
|
|
40258
40389
|
capScope: "system",
|
|
@@ -43962,6 +44093,7 @@ Object.freeze({
|
|
|
43962
44093
|
access: "create"
|
|
43963
44094
|
}
|
|
43964
44095
|
});
|
|
44096
|
+
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;
|
|
43965
44097
|
DeviceFeature.BatteryOperated;
|
|
43966
44098
|
/**
|
|
43967
44099
|
* The vocabulary, in the order a picker offers it.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
|
-
import { o as i, s as a } from "./responsive-
|
|
2
|
+
import { o as i, s as a } from "./responsive-Cr8pn1rO.mjs";
|
|
3
3
|
import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
|
|
4
4
|
var l = a("chevron-down", [["path", {
|
|
5
5
|
d: "m6 9 6 6 6-6",
|
package/dist/remoteEntry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-
|
|
1
|
+
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BhhyZUuH.mjs";
|
|
2
2
|
export { t as get, e as init };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
2
|
import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
|
|
3
|
-
import { i as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-
|
|
3
|
+
import { i as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BKQUo9FB.mjs";
|
|
4
4
|
//#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
|
|
5
5
|
l();
|
|
6
6
|
var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
|
-
import { s as i } from "./responsive-
|
|
2
|
+
import { s as i } from "./responsive-Cr8pn1rO.mjs";
|
|
3
3
|
var a = i("camera", [["path", {
|
|
4
4
|
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
|
|
5
5
|
key: "18u6gg"
|
|
@@ -2753,7 +2753,7 @@ async function rr(e) {
|
|
|
2753
2753
|
}
|
|
2754
2754
|
}
|
|
2755
2755
|
async function ir() {
|
|
2756
|
-
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-
|
|
2756
|
+
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BmFXvTL5.mjs")).catch((e) => {
|
|
2757
2757
|
throw tr = void 0, e;
|
|
2758
2758
|
}), tr;
|
|
2759
2759
|
}
|