@camstack/addon-pipeline 1.2.321 → 1.2.324

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 (33) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-SkL7rw1J.js → default-detection-model-4nJVRIT6.js} +1 -1
  4. package/dist/{default-detection-model-DBqAX4cL.mjs → default-detection-model-lWMQATmQ.mjs} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-CTLBxswm.mjs → dist-CbRb0Zyj.mjs} +145 -13
  8. package/dist/{dist-DMwFmudw.js → dist-DlgXwnqU.js} +145 -13
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-BO3NIRH9.mjs → node-CZ5DXcvq.mjs} +1 -1
  12. package/dist/{node-CJqa8iTR.js → node-s3wZnnJg.js} +1 -1
  13. package/dist/pipeline-runner/index.js +3 -3
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/{process-memory-BLd-PX9x.js → process-memory-C-mZ1LNi.js} +1 -1
  16. package/dist/{process-memory-qCTMcKBo.mjs → process-memory-CJsA4yRc.mjs} +1 -1
  17. package/dist/recorder/index.js +178 -2
  18. package/dist/recorder/index.mjs +178 -2
  19. package/dist/{segment-demux-js-DXHU1xgc.js → segment-demux-js-BbM0_Fmz.js} +1 -1
  20. package/dist/{segment-demux-js-6HsaPjoo.mjs → segment-demux-js-CuwXgwpj.mjs} +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C1yya1ze.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Duo5d4kr.mjs} +3 -3
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-NkeMtp-v.mjs +26 -0
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mEJkrfvj.mjs +26 -0
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-BHlXLPez.mjs → hostInit-C-RUqF9D.mjs} +3 -3
  28. package/dist/stream-broker/index.js +24 -13
  29. package/dist/stream-broker/index.mjs +24 -13
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-gPsQTvgB.mjs +0 -26
  33. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DGvtO8aA.mjs +0 -26
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-DMwFmudw.js");
7
- const require_process_memory = require("../process-memory-BLd-PX9x.js");
6
+ const require_dist = require("../dist-DlgXwnqU.js");
7
+ const require_process_memory = require("../process-memory-C-mZ1LNi.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as PoolMemoryWatchdog, E as HF_BASE_URL, En as nodePin, Kt as resolvePoolMemoryPolicy, Sn as hydrateSchema, St as mapAudioLabelToMacro, U as audioAnalysisCapability, Un as EventCategory, W as audioAnalyzerCapability, _n as audioChunkBytesPerSample, fn as errMsg, m as DEFAULT_AUDIO_ANALYZER_CONFIG, mn as BaseAddon, r as AUDIO_BACKEND_CHOICES, xn as expandAudioChunkToF32le } from "../dist-CTLBxswm.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-qCTMcKBo.mjs";
2
+ import { A as PoolMemoryWatchdog, E as HF_BASE_URL, En as nodePin, Kt as resolvePoolMemoryPolicy, Sn as hydrateSchema, St as mapAudioLabelToMacro, U as audioAnalysisCapability, Un as EventCategory, W as audioAnalyzerCapability, _n as audioChunkBytesPerSample, fn as errMsg, m as DEFAULT_AUDIO_ANALYZER_CONFIG, mn as BaseAddon, r as AUDIO_BACKEND_CHOICES, xn as expandAudioChunkToF32le } from "../dist-CbRb0Zyj.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CJsA4yRc.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DMwFmudw.js");
1
+ const require_dist = require("./dist-DlgXwnqU.js");
2
2
  const require_worker_protocol = require("./worker-protocol-C-G8qmye.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -1,4 +1,4 @@
1
- import { G as audioKindId, Yt as stepModelRunsOnFormat, _t as hfModelUrl, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, p as COCO_TO_MACRO, vt as inferModelProvider, y as DEVICE_BACKEND_TO_FORMAT } from "./dist-CTLBxswm.mjs";
1
+ import { G as audioKindId, Yt as stepModelRunsOnFormat, _t as hfModelUrl, f as COCO_80_LABELS, i as AUDIO_MACRO_LABELS, p as COCO_TO_MACRO, vt as inferModelProvider, y as DEVICE_BACKEND_TO_FORMAT } from "./dist-CbRb0Zyj.mjs";
2
2
  import { t as isWorkerReply } from "./worker-protocol-D_NzPcnh.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  //#region src/detection-pipeline/registry/effective-confidence.ts
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-DMwFmudw.js");
7
- const require_node = require("../node-CJqa8iTR.js");
8
- const require_default_detection_model = require("../default-detection-model-SkL7rw1J.js");
6
+ const require_dist = require("../dist-DlgXwnqU.js");
7
+ const require_node = require("../node-s3wZnnJg.js");
8
+ const require_default_detection_model = require("../default-detection-model-4nJVRIT6.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-BLd-PX9x.js");
10
+ const require_process_memory = require("../process-memory-C-mZ1LNi.js");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_chunk.__toESM(node_os);
13
13
  let node_fs = require("node:fs");
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-CTLBxswm.mjs";
3
- import { s as readProcessCost } from "../node-BO3NIRH9.mjs";
4
- import { S as resolveModelDefaultConfidence, _ as getStep, a as buildSubtreeCanRun, c as macroGateVerdict, g as getDefaultModelForFormat, h as ALL_STEPS, i as mergeCustomModels, m as ALL_PIPELINE_STEPS, n as resolveDefaultDetectionModel, r as CustomModelCatalog, u as localFrameRegistry, v as getStepDefinition, x as landmarkPrecisionVerdict, y as resolveModelForFormat } from "../default-detection-model-DBqAX4cL.mjs";
2
+ import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-CbRb0Zyj.mjs";
3
+ import { s as readProcessCost } from "../node-CZ5DXcvq.mjs";
4
+ import { S as resolveModelDefaultConfidence, _ as getStep, a as buildSubtreeCanRun, c as macroGateVerdict, g as getDefaultModelForFormat, h as ALL_STEPS, i as mergeCustomModels, m as ALL_PIPELINE_STEPS, n as resolveDefaultDetectionModel, r as CustomModelCatalog, u as localFrameRegistry, v as getStepDefinition, x as landmarkPrecisionVerdict, y as resolveModelForFormat } from "../default-detection-model-lWMQATmQ.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-qCTMcKBo.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CJsA4yRc.mjs";
7
7
  import * as os from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -5379,7 +5379,7 @@ var ZodIssueCode = {
5379
5379
  var ZodFirstPartyTypeKind;
5380
5380
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5381
  //#endregion
5382
- //#region ../types/dist/sleep-CDCONfkt.mjs
5382
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5383
5383
  /**
5384
5384
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5385
  * window to float samples (D455).
@@ -5719,6 +5719,43 @@ function hydrateField(field, values) {
5719
5719
  }
5720
5720
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5721
5721
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5722
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
5723
+ const from = values[field.suggestionsFrom];
5724
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
5725
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
5726
+ return {
5727
+ ...field,
5728
+ suggestions: merged,
5729
+ value
5730
+ };
5731
+ }
5732
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
5733
+ const from = values[field.optionsFrom];
5734
+ const byValue = /* @__PURE__ */ new Map();
5735
+ for (const opt of field.options) byValue.set(opt.value, opt);
5736
+ if (Array.isArray(from)) for (const entry of from) {
5737
+ if (typeof entry === "string" && entry.length > 0) {
5738
+ if (!byValue.has(entry)) byValue.set(entry, {
5739
+ value: entry,
5740
+ label: entry
5741
+ });
5742
+ continue;
5743
+ }
5744
+ if (entry === null || typeof entry !== "object") continue;
5745
+ const v = Reflect.get(entry, "value");
5746
+ const lbl = Reflect.get(entry, "label");
5747
+ if (typeof v !== "string" || v.length === 0) continue;
5748
+ if (!byValue.has(v)) byValue.set(v, {
5749
+ value: v,
5750
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
5751
+ });
5752
+ }
5753
+ return {
5754
+ ...field,
5755
+ options: [...byValue.values()],
5756
+ value
5757
+ };
5758
+ }
5722
5759
  return {
5723
5760
  ...field,
5724
5761
  value
@@ -13041,7 +13078,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
13041
13078
  }),
13042
13079
  object({
13043
13080
  kind: literal("cap"),
13044
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
13081
+ /**
13082
+ * One device, several same-family devices (locks / climate family / …),
13083
+ * or `{ $var }` for the device that triggered the run. An array is
13084
+ * fan-out at codegen — each id gets the same cap.method call.
13085
+ */
13086
+ deviceId: union([
13087
+ number().int(),
13088
+ array(number().int()).min(1),
13089
+ object({ $var: string().min(1) })
13090
+ ]),
13045
13091
  cap: string().min(1),
13046
13092
  method: string().min(1),
13047
13093
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -16697,7 +16743,7 @@ var detectionPipelineCapability = {
16697
16743
  * This matters here more than anywhere else in the repo, because every provider
16698
16744
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
16699
16745
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
16700
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
16746
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
16701
16747
  * camera's own page will ask for its own login. That is correct, and pre-
16702
16748
  * filling it is the operator's business, not ours.
16703
16749
  *
@@ -20256,10 +20302,35 @@ var SendResultSchema = object({
20256
20302
  });
20257
20303
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
20258
20304
  var TestResultSchema = SendResultSchema;
20259
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
20305
+ /**
20306
+ * Pre-save credential probe against a partial (unsaved) target config.
20307
+ * `resolvedUrl` never includes secrets (token stripped from path).
20308
+ */
20309
+ var ProbeTargetConfigResultSchema = object({
20310
+ ok: boolean(),
20311
+ resolvedUrl: string(),
20312
+ httpStatus: number().int().optional(),
20313
+ stateInstance: string().optional(),
20314
+ error: string().optional()
20315
+ });
20316
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
20260
20317
  kind: string(),
20261
- config: record(string(), unknown()).optional()
20318
+ config: record(string(), unknown()).optional(),
20319
+ /**
20320
+ * When editing / duplicating, the blank password field never round-trips
20321
+ * the stored token. Pass the source target id so the provider can restore
20322
+ * secrets server-side before dialling (same merge as upsert).
20323
+ */
20324
+ targetId: string().optional()
20262
20325
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
20326
+ kind: string(),
20327
+ config: record(string(), unknown()),
20328
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
20329
+ targetId: string().optional()
20330
+ }), ProbeTargetConfigResultSchema, {
20331
+ kind: "mutation",
20332
+ auth: "admin"
20333
+ }), method(object({
20263
20334
  targetId: string(),
20264
20335
  notification: NotificationSchema
20265
20336
  }), SendResultSchema, {
@@ -20271,7 +20342,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
20271
20342
  }), TestResultSchema, {
20272
20343
  kind: "mutation",
20273
20344
  auth: "admin"
20274
- }), method(object({ target: TargetSchema }), TargetSchema, {
20345
+ }), method(object({
20346
+ target: TargetSchema,
20347
+ /**
20348
+ * Duplicate flow: create a NEW target id while copying secrets from an
20349
+ * existing row. The UI never holds the stored token; blank / redacted
20350
+ * password fields are restored from this source (D634 still applies if
20351
+ * destinations diverge without a re-typed secret).
20352
+ */
20353
+ cloneSecretsFrom: string().optional()
20354
+ }), TargetSchema, {
20275
20355
  kind: "mutation",
20276
20356
  auth: "admin"
20277
20357
  }), method(object({ targetId: string() }), _void(), {
@@ -21234,6 +21314,15 @@ var AlarmArmModeSchema = _enum([
21234
21314
  object({
21235
21315
  /** Current lifecycle state. */
21236
21316
  state: AlarmStateSchema,
21317
+ /**
21318
+ * The arm mode the machine belongs to under transitional words
21319
+ * (`arming` / `pending` / `triggered` / `disarming`). `null` when
21320
+ * disarmed or when a provider cannot name one. Exporters MUST prefer
21321
+ * this over an in-process memo — a HomeKit accessory that missed the
21322
+ * settled `armed_*` slice used to map `pending` to DISARMED and hide
21323
+ * an entry delay.
21324
+ */
21325
+ targetMode: AlarmArmModeSchema.nullable().optional(),
21237
21326
  /** Subset of arm modes the panel accepts. UI renders one button per
21238
21327
  * mode in this list. */
21239
21328
  availableModes: array(AlarmArmModeSchema),
@@ -22969,17 +23058,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
22969
23058
  var NcAlarmDelaySecSchema = number().int().min(0).max(600);
22970
23059
  var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
22971
23060
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
23061
+ /**
23062
+ * What the panel does when a bounded triggered window ends.
23063
+ * - `rearmAfter` — return to the armed mode
23064
+ * - `disableAfter` — auto-disarm
23065
+ * - `doNothing` — stay triggered until a human disarms
23066
+ */
23067
+ var NcAlarmPostTriggeredActionSchema = _enum([
23068
+ "rearmAfter",
23069
+ "disableAfter",
23070
+ "doNothing"
23071
+ ]);
22972
23072
  var NcAlarmModeDelaysListSchema = array(object({
22973
23073
  mode: AlarmArmModeSchema,
22974
23074
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
22975
23075
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
22976
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
23076
+ /**
23077
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
23078
+ * historical field name so older clients still read/write a number.
23079
+ */
23080
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
23081
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
23082
+ /**
23083
+ * When this mode may be armed. Absent / null = always allowed (same as a
23084
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
23085
+ */
23086
+ schedule: NcScheduleSchema.optional()
22977
23087
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
22978
23088
  var NcAlarmModeDelaysEditListSchema = array(object({
22979
23089
  mode: AlarmArmModeSchema,
22980
23090
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
22981
23091
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
22982
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
23092
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
23093
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
23094
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
23095
+ schedule: NcScheduleSchema.nullable().optional()
22983
23096
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
22984
23097
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
22985
23098
  var NcAlarmNonBlockingEditSchema = object({
@@ -23051,12 +23164,18 @@ var NcAlarmSettingsSchema = object({
23051
23164
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
23052
23165
  entryDelaySec: NcAlarmDelaySecSchema,
23053
23166
  /**
23054
- * How long `triggered` lasts before the panel re-arms itself.
23055
- * **0 = until an operator disarms it** — the behaviour before this field
23056
- * existed, and therefore what an untouched install keeps doing.
23167
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
23168
+ * Ignored when the action is `doNothing`. Historical name kept so older
23169
+ * clients still round-trip a number.
23057
23170
  */
23058
23171
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
23059
23172
  /**
23173
+ * What happens when the triggered window ends. Absent on a blob older than
23174
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
23175
+ * else doNothing).
23176
+ */
23177
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
23178
+ /**
23060
23179
  * Deprecated by D630 — every transition is announced. Parsed, never read;
23061
23180
  * remove after one release. Optional so an older admin's patch (which still
23062
23181
  * sends it) parses rather than failing the whole save.
@@ -34198,7 +34317,7 @@ var LocalInterfaceSchema = object({
34198
34317
  name: string(),
34199
34318
  family: _enum(["IPv4", "IPv6"]),
34200
34319
  address: string(),
34201
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
34320
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
34202
34321
  cidr: string(),
34203
34322
  /** OS netmask. Stable across calls so the SDK can hash on it. */
34204
34323
  netmask: string(),
@@ -34644,7 +34763,7 @@ var MeshPeerSchema = object({
34644
34763
  tags: array(string()).readonly(),
34645
34764
  /** True when the peer advertises itself as an exit-node candidate. */
34646
34765
  exitNodeOption: boolean(),
34647
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
34766
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
34648
34767
  advertisedRoutes: array(string()).readonly(),
34649
34768
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
34650
34769
  userLogin: string().nullable(),
@@ -44081,6 +44200,12 @@ Object.freeze({
44081
44200
  addonId: null,
44082
44201
  access: "view"
44083
44202
  },
44203
+ "notificationOutput.getTarget": {
44204
+ capName: "notification-output",
44205
+ capScope: "system",
44206
+ addonId: null,
44207
+ access: "view"
44208
+ },
44084
44209
  "notificationOutput.listTargetKinds": {
44085
44210
  capName: "notification-output",
44086
44211
  capScope: "system",
@@ -44093,6 +44218,12 @@ Object.freeze({
44093
44218
  addonId: null,
44094
44219
  access: "view"
44095
44220
  },
44221
+ "notificationOutput.probeTargetConfig": {
44222
+ capName: "notification-output",
44223
+ capScope: "system",
44224
+ addonId: null,
44225
+ access: "create"
44226
+ },
44096
44227
  "notificationOutput.send": {
44097
44228
  capName: "notification-output",
44098
44229
  capScope: "system",
@@ -47802,6 +47933,7 @@ Object.freeze({
47802
47933
  access: "create"
47803
47934
  }
47804
47935
  });
47936
+ 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;
47805
47937
  DeviceFeature.BatteryOperated;
47806
47938
  /**
47807
47939
  * The vocabulary, in the order a picker offers it.
@@ -5379,7 +5379,7 @@ var ZodIssueCode = {
5379
5379
  var ZodFirstPartyTypeKind;
5380
5380
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5381
5381
  //#endregion
5382
- //#region ../types/dist/sleep-CDCONfkt.mjs
5382
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
5383
5383
  /**
5384
5384
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5385
5385
  * window to float samples (D455).
@@ -5719,6 +5719,43 @@ function hydrateField(field, values) {
5719
5719
  }
5720
5720
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5721
5721
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5722
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
5723
+ const from = values[field.suggestionsFrom];
5724
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
5725
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
5726
+ return {
5727
+ ...field,
5728
+ suggestions: merged,
5729
+ value
5730
+ };
5731
+ }
5732
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
5733
+ const from = values[field.optionsFrom];
5734
+ const byValue = /* @__PURE__ */ new Map();
5735
+ for (const opt of field.options) byValue.set(opt.value, opt);
5736
+ if (Array.isArray(from)) for (const entry of from) {
5737
+ if (typeof entry === "string" && entry.length > 0) {
5738
+ if (!byValue.has(entry)) byValue.set(entry, {
5739
+ value: entry,
5740
+ label: entry
5741
+ });
5742
+ continue;
5743
+ }
5744
+ if (entry === null || typeof entry !== "object") continue;
5745
+ const v = Reflect.get(entry, "value");
5746
+ const lbl = Reflect.get(entry, "label");
5747
+ if (typeof v !== "string" || v.length === 0) continue;
5748
+ if (!byValue.has(v)) byValue.set(v, {
5749
+ value: v,
5750
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
5751
+ });
5752
+ }
5753
+ return {
5754
+ ...field,
5755
+ options: [...byValue.values()],
5756
+ value
5757
+ };
5758
+ }
5722
5759
  return {
5723
5760
  ...field,
5724
5761
  value
@@ -13041,7 +13078,16 @@ var AutomationActionSchema = discriminatedUnion("kind", [
13041
13078
  }),
13042
13079
  object({
13043
13080
  kind: literal("cap"),
13044
- deviceId: union([number().int(), object({ $var: string().min(1) })]),
13081
+ /**
13082
+ * One device, several same-family devices (locks / climate family / …),
13083
+ * or `{ $var }` for the device that triggered the run. An array is
13084
+ * fan-out at codegen — each id gets the same cap.method call.
13085
+ */
13086
+ deviceId: union([
13087
+ number().int(),
13088
+ array(number().int()).min(1),
13089
+ object({ $var: string().min(1) })
13090
+ ]),
13045
13091
  cap: string().min(1),
13046
13092
  method: string().min(1),
13047
13093
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -16697,7 +16743,7 @@ var detectionPipelineCapability = {
16697
16743
  * This matters here more than anywhere else in the repo, because every provider
16698
16744
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
16699
16745
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
16700
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
16746
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
16701
16747
  * camera's own page will ask for its own login. That is correct, and pre-
16702
16748
  * filling it is the operator's business, not ours.
16703
16749
  *
@@ -20256,10 +20302,35 @@ var SendResultSchema = object({
20256
20302
  });
20257
20303
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
20258
20304
  var TestResultSchema = SendResultSchema;
20259
- method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({
20305
+ /**
20306
+ * Pre-save credential probe against a partial (unsaved) target config.
20307
+ * `resolvedUrl` never includes secrets (token stripped from path).
20308
+ */
20309
+ var ProbeTargetConfigResultSchema = object({
20310
+ ok: boolean(),
20311
+ resolvedUrl: string(),
20312
+ httpStatus: number().int().optional(),
20313
+ stateInstance: string().optional(),
20314
+ error: string().optional()
20315
+ });
20316
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema), { auth: "admin" }), method(object({ targetId: string() }), TargetSchema, { auth: "admin" }), method(object({
20260
20317
  kind: string(),
20261
- config: record(string(), unknown()).optional()
20318
+ config: record(string(), unknown()).optional(),
20319
+ /**
20320
+ * When editing / duplicating, the blank password field never round-trips
20321
+ * the stored token. Pass the source target id so the provider can restore
20322
+ * secrets server-side before dialling (same merge as upsert).
20323
+ */
20324
+ targetId: string().optional()
20262
20325
  }), array(DiscoveredTargetSchema), { auth: "admin" }), method(object({
20326
+ kind: string(),
20327
+ config: record(string(), unknown()),
20328
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
20329
+ targetId: string().optional()
20330
+ }), ProbeTargetConfigResultSchema, {
20331
+ kind: "mutation",
20332
+ auth: "admin"
20333
+ }), method(object({
20263
20334
  targetId: string(),
20264
20335
  notification: NotificationSchema
20265
20336
  }), SendResultSchema, {
@@ -20271,7 +20342,16 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
20271
20342
  }), TestResultSchema, {
20272
20343
  kind: "mutation",
20273
20344
  auth: "admin"
20274
- }), method(object({ target: TargetSchema }), TargetSchema, {
20345
+ }), method(object({
20346
+ target: TargetSchema,
20347
+ /**
20348
+ * Duplicate flow: create a NEW target id while copying secrets from an
20349
+ * existing row. The UI never holds the stored token; blank / redacted
20350
+ * password fields are restored from this source (D634 still applies if
20351
+ * destinations diverge without a re-typed secret).
20352
+ */
20353
+ cloneSecretsFrom: string().optional()
20354
+ }), TargetSchema, {
20275
20355
  kind: "mutation",
20276
20356
  auth: "admin"
20277
20357
  }), method(object({ targetId: string() }), _void(), {
@@ -21234,6 +21314,15 @@ var AlarmArmModeSchema = _enum([
21234
21314
  object({
21235
21315
  /** Current lifecycle state. */
21236
21316
  state: AlarmStateSchema,
21317
+ /**
21318
+ * The arm mode the machine belongs to under transitional words
21319
+ * (`arming` / `pending` / `triggered` / `disarming`). `null` when
21320
+ * disarmed or when a provider cannot name one. Exporters MUST prefer
21321
+ * this over an in-process memo — a HomeKit accessory that missed the
21322
+ * settled `armed_*` slice used to map `pending` to DISARMED and hide
21323
+ * an entry delay.
21324
+ */
21325
+ targetMode: AlarmArmModeSchema.nullable().optional(),
21237
21326
  /** Subset of arm modes the panel accepts. UI renders one button per
21238
21327
  * mode in this list. */
21239
21328
  availableModes: array(AlarmArmModeSchema),
@@ -22969,17 +23058,41 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
22969
23058
  var NcAlarmDelaySecSchema = number().int().min(0).max(600);
22970
23059
  var NcAlarmTriggeredSecSchema = number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
22971
23060
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
23061
+ /**
23062
+ * What the panel does when a bounded triggered window ends.
23063
+ * - `rearmAfter` — return to the armed mode
23064
+ * - `disableAfter` — auto-disarm
23065
+ * - `doNothing` — stay triggered until a human disarms
23066
+ */
23067
+ var NcAlarmPostTriggeredActionSchema = _enum([
23068
+ "rearmAfter",
23069
+ "disableAfter",
23070
+ "doNothing"
23071
+ ]);
22972
23072
  var NcAlarmModeDelaysListSchema = array(object({
22973
23073
  mode: AlarmArmModeSchema,
22974
23074
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
22975
23075
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
22976
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
23076
+ /**
23077
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
23078
+ * historical field name so older clients still read/write a number.
23079
+ */
23080
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
23081
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
23082
+ /**
23083
+ * When this mode may be armed. Absent / null = always allowed (same as a
23084
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
23085
+ */
23086
+ schedule: NcScheduleSchema.optional()
22977
23087
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
22978
23088
  var NcAlarmModeDelaysEditListSchema = array(object({
22979
23089
  mode: AlarmArmModeSchema,
22980
23090
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
22981
23091
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
22982
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
23092
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
23093
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
23094
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
23095
+ schedule: NcScheduleSchema.nullable().optional()
22983
23096
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
22984
23097
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
22985
23098
  var NcAlarmNonBlockingEditSchema = object({
@@ -23051,12 +23164,18 @@ var NcAlarmSettingsSchema = object({
23051
23164
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
23052
23165
  entryDelaySec: NcAlarmDelaySecSchema,
23053
23166
  /**
23054
- * How long `triggered` lasts before the panel re-arms itself.
23055
- * **0 = until an operator disarms it** — the behaviour before this field
23056
- * existed, and therefore what an untouched install keeps doing.
23167
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
23168
+ * Ignored when the action is `doNothing`. Historical name kept so older
23169
+ * clients still round-trip a number.
23057
23170
  */
23058
23171
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
23059
23172
  /**
23173
+ * What happens when the triggered window ends. Absent on a blob older than
23174
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
23175
+ * else doNothing).
23176
+ */
23177
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
23178
+ /**
23060
23179
  * Deprecated by D630 — every transition is announced. Parsed, never read;
23061
23180
  * remove after one release. Optional so an older admin's patch (which still
23062
23181
  * sends it) parses rather than failing the whole save.
@@ -34198,7 +34317,7 @@ var LocalInterfaceSchema = object({
34198
34317
  name: string(),
34199
34318
  family: _enum(["IPv4", "IPv6"]),
34200
34319
  address: string(),
34201
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
34320
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
34202
34321
  cidr: string(),
34203
34322
  /** OS netmask. Stable across calls so the SDK can hash on it. */
34204
34323
  netmask: string(),
@@ -34644,7 +34763,7 @@ var MeshPeerSchema = object({
34644
34763
  tags: array(string()).readonly(),
34645
34764
  /** True when the peer advertises itself as an exit-node candidate. */
34646
34765
  exitNodeOption: boolean(),
34647
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
34766
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
34648
34767
  advertisedRoutes: array(string()).readonly(),
34649
34768
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
34650
34769
  userLogin: string().nullable(),
@@ -44081,6 +44200,12 @@ Object.freeze({
44081
44200
  addonId: null,
44082
44201
  access: "view"
44083
44202
  },
44203
+ "notificationOutput.getTarget": {
44204
+ capName: "notification-output",
44205
+ capScope: "system",
44206
+ addonId: null,
44207
+ access: "view"
44208
+ },
44084
44209
  "notificationOutput.listTargetKinds": {
44085
44210
  capName: "notification-output",
44086
44211
  capScope: "system",
@@ -44093,6 +44218,12 @@ Object.freeze({
44093
44218
  addonId: null,
44094
44219
  access: "view"
44095
44220
  },
44221
+ "notificationOutput.probeTargetConfig": {
44222
+ capName: "notification-output",
44223
+ capScope: "system",
44224
+ addonId: null,
44225
+ access: "create"
44226
+ },
44096
44227
  "notificationOutput.send": {
44097
44228
  capName: "notification-output",
44098
44229
  capScope: "system",
@@ -47802,6 +47933,7 @@ Object.freeze({
47802
47933
  access: "create"
47803
47934
  }
47804
47935
  });
47936
+ 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;
47805
47937
  DeviceFeature.BatteryOperated;
47806
47938
  /**
47807
47939
  * The vocabulary, in the order a picker offers it.
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DMwFmudw.js");
5
+ const require_dist = require("../dist-DlgXwnqU.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-CTLBxswm.mjs";
1
+ import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-CbRb0Zyj.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-CTLBxswm.mjs";
1
+ import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-CbRb0Zyj.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-DMwFmudw.js");
2
+ const require_dist = require("./dist-DlgXwnqU.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-DMwFmudw.js");
7
- const require_node = require("../node-CJqa8iTR.js");
8
- const require_default_detection_model = require("../default-detection-model-SkL7rw1J.js");
6
+ const require_dist = require("../dist-DlgXwnqU.js");
7
+ const require_node = require("../node-s3wZnnJg.js");
8
+ const require_default_detection_model = require("../default-detection-model-4nJVRIT6.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
10
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
11
11
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");