@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.
Files changed (19) hide show
  1. package/dist/{MotionZonesSettings-DYN6D3Q3.mjs → MotionZonesSettings-JRWr-847.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D8ePv2JK.mjs → PrivacyMaskSettings-BfpUuDZo.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-DnOFRC20.mjs → SceneMonitorEditor-B6q_snqj.mjs} +3 -3
  4. package/dist/_stub.js +103 -101
  5. 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
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BKQUo9FB.mjs +26 -0
  7. package/dist/addon-model-studio.css +1 -1
  8. package/dist/{hostInit-DF-H_MgC.mjs → hostInit-DWCuJ3yO.mjs} +3 -3
  9. package/dist/model-studio.addon.js +145 -13
  10. package/dist/model-studio.addon.mjs +145 -13
  11. package/dist/{player-overlays-1iZVpnxF.mjs → player-overlays-RAKUtQ68.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-Cpl8e10S.mjs → responsive-Cr8pn1rO.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-D5NESGG4.mjs → scene-monitor-copy-NIVM76QJ.mjs} +1 -1
  15. package/dist/{square-Do07uow8.mjs → square-BOlfCWYp.mjs} +1 -1
  16. package/dist/{trash-2-JIHOLs10.mjs → trash-2-aAfBxjgh.mjs} +1 -1
  17. 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
  18. package/package.json +1 -1
  19. 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-CDCONfkt.mjs
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
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
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.50.139/` is a URL a browser accepts. The
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
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
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({ target: TargetSchema }), TargetSchema, {
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
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
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 the panel re-arms itself.
20685
- * **0 = until an operator disarms it** — the behaviour before this field
20686
- * existed, and therefore what an untouched install keeps doing.
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.1.10/24`). Empty when OS doesn't expose. */
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.1.0/24"]`). */
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-CDCONfkt.mjs
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
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
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.50.139/` is a URL a browser accepts. The
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
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
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({ target: TargetSchema }), TargetSchema, {
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
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
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 the panel re-arms itself.
20664
- * **0 = until an operator disarms it** — the behaviour before this field
20665
- * existed, and therefore what an untouched install keeps doing.
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.1.10/24`). Empty when OS doesn't expose. */
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.1.0/24"]`). */
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-Cpl8e10S.mjs";
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",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Cb6JeXV8.mjs";
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-wNBuLHob.mjs";
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-Cpl8e10S.mjs";
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"
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-Cpl8e10S.mjs";
1
+ import { s as e } from "./responsive-Cr8pn1rO.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-Cpl8e10S.mjs";
1
+ import { s as e } from "./responsive-Cr8pn1rO.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -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-DXaNF8pe.mjs")).catch((e) => {
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.1.196",
3
+ "version": "1.1.198",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",