@camstack/system 1.2.349 → 1.2.351

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 (68) hide show
  1. package/dist/addon-runner.js +2 -2
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.d.ts +8 -0
  8. package/dist/builtins/alerts/alerts.addon.js +146 -31
  9. package/dist/builtins/alerts/alerts.addon.mjs +146 -31
  10. package/dist/builtins/alerts/device-label.d.ts +8 -0
  11. package/dist/builtins/autotrack/index.js +1 -1
  12. package/dist/builtins/autotrack/index.mjs +1 -1
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  14. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  15. package/dist/builtins/calendars/calendars.addon.js +3 -2
  16. package/dist/builtins/calendars/calendars.addon.mjs +3 -2
  17. package/dist/builtins/camera-grid/index.js +1 -1
  18. package/dist/builtins/camera-grid/index.mjs +1 -1
  19. package/dist/builtins/composer/composer.addon.js +2 -2
  20. package/dist/builtins/composer/composer.addon.mjs +2 -2
  21. package/dist/builtins/console-logging/index.js +1 -1
  22. package/dist/builtins/console-logging/index.mjs +1 -1
  23. package/dist/builtins/core-blocks/block-type-defs.d.ts +20 -5
  24. package/dist/builtins/core-blocks/core-blocks.addon.js +171 -26
  25. package/dist/builtins/core-blocks/core-blocks.addon.mjs +171 -26
  26. package/dist/builtins/device-manager/device-bindings-store.d.ts +3 -1
  27. package/dist/builtins/device-manager/device-manager.addon.js +5 -57
  28. package/dist/builtins/device-manager/device-manager.addon.mjs +5 -57
  29. package/dist/builtins/hub-forwarder/index.js +1 -1
  30. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  31. package/dist/builtins/liveness-monitor/liveness-checks.d.ts +7 -0
  32. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +8 -4
  33. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +8 -4
  34. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  35. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  36. package/dist/builtins/local-network/local-network.addon.js +1 -1
  37. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  38. package/dist/builtins/loki-logging/index.js +1 -1
  39. package/dist/builtins/loki-logging/index.mjs +1 -1
  40. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  41. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  42. package/dist/builtins/platform-probe/index.js +1 -1
  43. package/dist/builtins/platform-probe/index.mjs +1 -1
  44. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  45. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  46. package/dist/builtins/snapshot/index.js +1 -1
  47. package/dist/builtins/snapshot/index.mjs +1 -1
  48. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  49. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  50. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  51. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  52. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +2 -2
  53. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +2 -2
  54. package/dist/builtins/system-config/system-config.addon.js +1 -1
  55. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  56. package/dist/builtins/winston-logging/index.js +1 -1
  57. package/dist/builtins/winston-logging/index.mjs +1 -1
  58. package/dist/{child-cap-dispatch-Pkx_sEKR.mjs → child-cap-dispatch-BAfa6tjj.mjs} +1 -1
  59. package/dist/{child-cap-dispatch-DiDBYNY4.js → child-cap-dispatch-B_0-zpI6.js} +1 -1
  60. package/dist/{composition-sources-w_NIID5d.js → composition-sources-CUfM-BYp.js} +1 -1
  61. package/dist/{composition-sources-DK-hFG7I.mjs → composition-sources-CoFGIGCc.mjs} +1 -1
  62. package/dist/{dist-C6CPaa8G.mjs → dist-DADwBtU5.mjs} +144 -13
  63. package/dist/{dist-DvAczrLl.js → dist-DeGPW01G.js} +144 -13
  64. package/dist/index.js +2 -2
  65. package/dist/index.mjs +2 -2
  66. package/dist/{retired-settings-keys-BQYjCJWI.js → retired-settings-keys-D8G5o4Fc.js} +1 -1
  67. package/dist/{retired-settings-keys-tmMQQ9OH.mjs → retired-settings-keys-bUUnyTMg.mjs} +1 -1
  68. package/package.json +1 -1
@@ -710,7 +710,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
710
710
  return EventCategory;
711
711
  }({});
712
712
  //#endregion
713
- //#region ../types/dist/sleep-CDCONfkt.mjs
713
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
714
714
  /**
715
715
  * The audio chunk plane's byte format, and the ONE expansion from a coded
716
716
  * window to float samples (D455).
@@ -1019,6 +1019,43 @@ function hydrateField(field, values) {
1019
1019
  }
1020
1020
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
1021
1021
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
1022
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
1023
+ const from = values[field.suggestionsFrom];
1024
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
1025
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
1026
+ return {
1027
+ ...field,
1028
+ suggestions: merged,
1029
+ value
1030
+ };
1031
+ }
1032
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
1033
+ const from = values[field.optionsFrom];
1034
+ const byValue = /* @__PURE__ */ new Map();
1035
+ for (const opt of field.options) byValue.set(opt.value, opt);
1036
+ if (Array.isArray(from)) for (const entry of from) {
1037
+ if (typeof entry === "string" && entry.length > 0) {
1038
+ if (!byValue.has(entry)) byValue.set(entry, {
1039
+ value: entry,
1040
+ label: entry
1041
+ });
1042
+ continue;
1043
+ }
1044
+ if (entry === null || typeof entry !== "object") continue;
1045
+ const v = Reflect.get(entry, "value");
1046
+ const lbl = Reflect.get(entry, "label");
1047
+ if (typeof v !== "string" || v.length === 0) continue;
1048
+ if (!byValue.has(v)) byValue.set(v, {
1049
+ value: v,
1050
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
1051
+ });
1052
+ }
1053
+ return {
1054
+ ...field,
1055
+ options: [...byValue.values()],
1056
+ value
1057
+ };
1058
+ }
1022
1059
  return {
1023
1060
  ...field,
1024
1061
  value
@@ -8341,7 +8378,16 @@ var AutomationActionSchema = z.discriminatedUnion("kind", [
8341
8378
  }),
8342
8379
  z.object({
8343
8380
  kind: z.literal("cap"),
8344
- deviceId: z.union([z.number().int(), z.object({ $var: z.string().min(1) })]),
8381
+ /**
8382
+ * One device, several same-family devices (locks / climate family / …),
8383
+ * or `{ $var }` for the device that triggered the run. An array is
8384
+ * fan-out at codegen — each id gets the same cap.method call.
8385
+ */
8386
+ deviceId: z.union([
8387
+ z.number().int(),
8388
+ z.array(z.number().int()).min(1),
8389
+ z.object({ $var: z.string().min(1) })
8390
+ ]),
8345
8391
  cap: z.string().min(1),
8346
8392
  method: z.string().min(1),
8347
8393
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -14122,7 +14168,7 @@ var detectionPipelineCapability = {
14122
14168
  * This matters here more than anywhere else in the repo, because every provider
14123
14169
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14124
14170
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14125
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
14171
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14126
14172
  * camera's own page will ask for its own login. That is correct, and pre-
14127
14173
  * filling it is the operator's business, not ours.
14128
14174
  *
@@ -19082,6 +19128,17 @@ var SendResultSchema = z.object({
19082
19128
  });
19083
19129
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
19084
19130
  var TestResultSchema = SendResultSchema;
19131
+ /**
19132
+ * Pre-save credential probe against a partial (unsaved) target config.
19133
+ * `resolvedUrl` never includes secrets (token stripped from path).
19134
+ */
19135
+ var ProbeTargetConfigResultSchema = z.object({
19136
+ ok: z.boolean(),
19137
+ resolvedUrl: z.string(),
19138
+ httpStatus: z.number().int().optional(),
19139
+ stateInstance: z.string().optional(),
19140
+ error: z.string().optional()
19141
+ });
19085
19142
  var notificationOutputCapability = {
19086
19143
  name: "notification-output",
19087
19144
  scope: "system",
@@ -19089,10 +19146,32 @@ var notificationOutputCapability = {
19089
19146
  methods: {
19090
19147
  listTargetKinds: method(z.object({}), z.array(TargetKindSchema)),
19091
19148
  listTargets: method(z.object({}), z.array(TargetSchema), { auth: "admin" }),
19149
+ /**
19150
+ * One target WITH secrets — admin edit / duplicate hydration only.
19151
+ * `listTargets` stays redacted; the editor loads this so password fields
19152
+ * are filled (masked in the input) and a save can round-trip the token
19153
+ * when a destination changes (Duplicate with a new chatId, etc.).
19154
+ */
19155
+ getTarget: method(z.object({ targetId: z.string() }), TargetSchema, { auth: "admin" }),
19092
19156
  discoverTargets: method(z.object({
19093
19157
  kind: z.string(),
19094
- config: z.record(z.string(), z.unknown()).optional()
19158
+ config: z.record(z.string(), z.unknown()).optional(),
19159
+ /**
19160
+ * When editing / duplicating, the blank password field never round-trips
19161
+ * the stored token. Pass the source target id so the provider can restore
19162
+ * secrets server-side before dialling (same merge as upsert).
19163
+ */
19164
+ targetId: z.string().optional()
19095
19165
  }), z.array(DiscoveredTargetSchema), { auth: "admin" }),
19166
+ probeTargetConfig: method(z.object({
19167
+ kind: z.string(),
19168
+ config: z.record(z.string(), z.unknown()),
19169
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
19170
+ targetId: z.string().optional()
19171
+ }), ProbeTargetConfigResultSchema, {
19172
+ kind: "mutation",
19173
+ auth: "admin"
19174
+ }),
19096
19175
  send: method(z.object({
19097
19176
  targetId: z.string(),
19098
19177
  notification: NotificationSchema
@@ -19107,7 +19186,16 @@ var notificationOutputCapability = {
19107
19186
  kind: "mutation",
19108
19187
  auth: "admin"
19109
19188
  }),
19110
- upsertTarget: method(z.object({ target: TargetSchema }), TargetSchema, {
19189
+ upsertTarget: method(z.object({
19190
+ target: TargetSchema,
19191
+ /**
19192
+ * Duplicate flow: create a NEW target id while copying secrets from an
19193
+ * existing row. The UI never holds the stored token; blank / redacted
19194
+ * password fields are restored from this source (D634 still applies if
19195
+ * destinations diverge without a re-typed secret).
19196
+ */
19197
+ cloneSecretsFrom: z.string().optional()
19198
+ }), TargetSchema, {
19111
19199
  kind: "mutation",
19112
19200
  auth: "admin"
19113
19201
  }),
@@ -21556,12 +21644,33 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
21556
21644
  var NcAlarmDelaySecSchema = z.number().int().min(0).max(600);
21557
21645
  var NcAlarmTriggeredSecSchema = z.number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
21558
21646
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
21647
+ /**
21648
+ * What the panel does when a bounded triggered window ends.
21649
+ * - `rearmAfter` — return to the armed mode
21650
+ * - `disableAfter` — auto-disarm
21651
+ * - `doNothing` — stay triggered until a human disarms
21652
+ */
21653
+ var NcAlarmPostTriggeredActionSchema = z.enum([
21654
+ "rearmAfter",
21655
+ "disableAfter",
21656
+ "doNothing"
21657
+ ]);
21559
21658
  /** One mode's OVERRIDES. An absent field inherits the global value (D697). */
21560
21659
  var NcAlarmModeDelaysSchema = z.object({
21561
21660
  mode: AlarmArmModeSchema,
21562
21661
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
21563
21662
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
21564
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
21663
+ /**
21664
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
21665
+ * historical field name so older clients still read/write a number.
21666
+ */
21667
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
21668
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
21669
+ /**
21670
+ * When this mode may be armed. Absent / null = always allowed (same as a
21671
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
21672
+ */
21673
+ schedule: NcScheduleSchema.optional()
21565
21674
  });
21566
21675
  var NcAlarmModeDelaysListSchema = z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
21567
21676
  /**
@@ -21573,7 +21682,10 @@ var NcAlarmModeDelaysEditSchema = z.object({
21573
21682
  mode: AlarmArmModeSchema,
21574
21683
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
21575
21684
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
21576
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
21685
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
21686
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
21687
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
21688
+ schedule: NcScheduleSchema.nullable().optional()
21577
21689
  });
21578
21690
  var NcAlarmModeDelaysEditListSchema = z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
21579
21691
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
@@ -21646,12 +21758,18 @@ var NcAlarmSettingsSchema = z.object({
21646
21758
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
21647
21759
  entryDelaySec: NcAlarmDelaySecSchema,
21648
21760
  /**
21649
- * How long `triggered` lasts before the panel re-arms itself.
21650
- * **0 = until an operator disarms it** — the behaviour before this field
21651
- * existed, and therefore what an untouched install keeps doing.
21761
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
21762
+ * Ignored when the action is `doNothing`. Historical name kept so older
21763
+ * clients still round-trip a number.
21652
21764
  */
21653
21765
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
21654
21766
  /**
21767
+ * What happens when the triggered window ends. Absent on a blob older than
21768
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
21769
+ * else doNothing).
21770
+ */
21771
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
21772
+ /**
21655
21773
  * Deprecated by D630 — every transition is announced. Parsed, never read;
21656
21774
  * remove after one release. Optional so an older admin's patch (which still
21657
21775
  * sends it) parses rather than failing the whole save.
@@ -36049,7 +36167,7 @@ var LocalInterfaceSchema = z.object({
36049
36167
  name: z.string(),
36050
36168
  family: z.enum(["IPv4", "IPv6"]),
36051
36169
  address: z.string(),
36052
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
36170
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
36053
36171
  cidr: z.string(),
36054
36172
  /** OS netmask. Stable across calls so the SDK can hash on it. */
36055
36173
  netmask: z.string(),
@@ -36248,7 +36366,7 @@ var localNetworkCapability = {
36248
36366
  * every client a second authority on a socket only the hub binds. A viewer
36249
36367
  * configured with a port-less public URL (`https://camstack.example.top`)
36250
36368
  * infers 443 from the scheme, asks with 443, and was handed
36251
- * `https://192.168.1.9:443` for a hub listening on 4443. That candidate
36369
+ * `https://192.168.x.x:443` for a hub listening on 4443. That candidate
36252
36370
  * cannot ever answer, and losing its race reads in the log exactly like
36253
36371
  * "the LAN was tried and it was slower" — so an operator sitting on his own
36254
36372
  * WiFi stayed on the public tunnel for weeks, with the LAN candidate born
@@ -36701,7 +36819,7 @@ var MeshPeerSchema = z.object({
36701
36819
  tags: z.array(z.string()).readonly(),
36702
36820
  /** True when the peer advertises itself as an exit-node candidate. */
36703
36821
  exitNodeOption: z.boolean(),
36704
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
36822
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
36705
36823
  advertisedRoutes: z.array(z.string()).readonly(),
36706
36824
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
36707
36825
  userLogin: z.string().nullable(),
@@ -50118,6 +50236,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50118
50236
  addonId: null,
50119
50237
  access: "view"
50120
50238
  },
50239
+ "notificationOutput.getTarget": {
50240
+ capName: "notification-output",
50241
+ capScope: "system",
50242
+ addonId: null,
50243
+ access: "view"
50244
+ },
50121
50245
  "notificationOutput.listTargetKinds": {
50122
50246
  capName: "notification-output",
50123
50247
  capScope: "system",
@@ -50130,6 +50254,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50130
50254
  addonId: null,
50131
50255
  access: "view"
50132
50256
  },
50257
+ "notificationOutput.probeTargetConfig": {
50258
+ capName: "notification-output",
50259
+ capScope: "system",
50260
+ addonId: null,
50261
+ access: "create"
50262
+ },
50133
50263
  "notificationOutput.send": {
50134
50264
  capName: "notification-output",
50135
50265
  capScope: "system",
@@ -53839,6 +53969,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
53839
53969
  access: "create"
53840
53970
  }
53841
53971
  });
53972
+ 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;
53842
53973
  DeviceFeature.BatteryOperated;
53843
53974
  /**
53844
53975
  * The vocabulary, in the order a picker offers it.
@@ -710,7 +710,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
710
710
  return EventCategory;
711
711
  }({});
712
712
  //#endregion
713
- //#region ../types/dist/sleep-CDCONfkt.mjs
713
+ //#region ../types/dist/sleep-DXKLNFvA.mjs
714
714
  /**
715
715
  * The audio chunk plane's byte format, and the ONE expansion from a coded
716
716
  * window to float samples (D455).
@@ -1019,6 +1019,43 @@ function hydrateField(field, values) {
1019
1019
  }
1020
1020
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
1021
1021
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
1022
+ if (field.type === "tags" && typeof field.suggestionsFrom === "string") {
1023
+ const from = values[field.suggestionsFrom];
1024
+ const extra = Array.isArray(from) ? from.filter((s) => typeof s === "string" && s.length > 0) : [];
1025
+ const merged = [...new Set([...field.suggestions ?? [], ...extra])];
1026
+ return {
1027
+ ...field,
1028
+ suggestions: merged,
1029
+ value
1030
+ };
1031
+ }
1032
+ if ((field.type === "select" || field.type === "multiselect") && typeof field.optionsFrom === "string") {
1033
+ const from = values[field.optionsFrom];
1034
+ const byValue = /* @__PURE__ */ new Map();
1035
+ for (const opt of field.options) byValue.set(opt.value, opt);
1036
+ if (Array.isArray(from)) for (const entry of from) {
1037
+ if (typeof entry === "string" && entry.length > 0) {
1038
+ if (!byValue.has(entry)) byValue.set(entry, {
1039
+ value: entry,
1040
+ label: entry
1041
+ });
1042
+ continue;
1043
+ }
1044
+ if (entry === null || typeof entry !== "object") continue;
1045
+ const v = Reflect.get(entry, "value");
1046
+ const lbl = Reflect.get(entry, "label");
1047
+ if (typeof v !== "string" || v.length === 0) continue;
1048
+ if (!byValue.has(v)) byValue.set(v, {
1049
+ value: v,
1050
+ label: typeof lbl === "string" && lbl.length > 0 ? lbl : v
1051
+ });
1052
+ }
1053
+ return {
1054
+ ...field,
1055
+ options: [...byValue.values()],
1056
+ value
1057
+ };
1058
+ }
1022
1059
  return {
1023
1060
  ...field,
1024
1061
  value
@@ -8341,7 +8378,16 @@ var AutomationActionSchema = zod.z.discriminatedUnion("kind", [
8341
8378
  }),
8342
8379
  zod.z.object({
8343
8380
  kind: zod.z.literal("cap"),
8344
- deviceId: zod.z.union([zod.z.number().int(), zod.z.object({ $var: zod.z.string().min(1) })]),
8381
+ /**
8382
+ * One device, several same-family devices (locks / climate family / …),
8383
+ * or `{ $var }` for the device that triggered the run. An array is
8384
+ * fan-out at codegen — each id gets the same cap.method call.
8385
+ */
8386
+ deviceId: zod.z.union([
8387
+ zod.z.number().int(),
8388
+ zod.z.array(zod.z.number().int()).min(1),
8389
+ zod.z.object({ $var: zod.z.string().min(1) })
8390
+ ]),
8345
8391
  cap: zod.z.string().min(1),
8346
8392
  method: zod.z.string().min(1),
8347
8393
  /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
@@ -14122,7 +14168,7 @@ var detectionPipelineCapability = {
14122
14168
  * This matters here more than anywhere else in the repo, because every provider
14123
14169
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14124
14170
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14125
- * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
14171
+ * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14126
14172
  * camera's own page will ask for its own login. That is correct, and pre-
14127
14173
  * filling it is the operator's business, not ours.
14128
14174
  *
@@ -19082,6 +19128,17 @@ var SendResultSchema = zod.z.object({
19082
19128
  });
19083
19129
  /** Same shape as SendResult — kept as a distinct name for the test panel. */
19084
19130
  var TestResultSchema = SendResultSchema;
19131
+ /**
19132
+ * Pre-save credential probe against a partial (unsaved) target config.
19133
+ * `resolvedUrl` never includes secrets (token stripped from path).
19134
+ */
19135
+ var ProbeTargetConfigResultSchema = zod.z.object({
19136
+ ok: zod.z.boolean(),
19137
+ resolvedUrl: zod.z.string(),
19138
+ httpStatus: zod.z.number().int().optional(),
19139
+ stateInstance: zod.z.string().optional(),
19140
+ error: zod.z.string().optional()
19141
+ });
19085
19142
  var notificationOutputCapability = {
19086
19143
  name: "notification-output",
19087
19144
  scope: "system",
@@ -19089,10 +19146,32 @@ var notificationOutputCapability = {
19089
19146
  methods: {
19090
19147
  listTargetKinds: method(zod.z.object({}), zod.z.array(TargetKindSchema)),
19091
19148
  listTargets: method(zod.z.object({}), zod.z.array(TargetSchema), { auth: "admin" }),
19149
+ /**
19150
+ * One target WITH secrets — admin edit / duplicate hydration only.
19151
+ * `listTargets` stays redacted; the editor loads this so password fields
19152
+ * are filled (masked in the input) and a save can round-trip the token
19153
+ * when a destination changes (Duplicate with a new chatId, etc.).
19154
+ */
19155
+ getTarget: method(zod.z.object({ targetId: zod.z.string() }), TargetSchema, { auth: "admin" }),
19092
19156
  discoverTargets: method(zod.z.object({
19093
19157
  kind: zod.z.string(),
19094
- config: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
19158
+ config: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
19159
+ /**
19160
+ * When editing / duplicating, the blank password field never round-trips
19161
+ * the stored token. Pass the source target id so the provider can restore
19162
+ * secrets server-side before dialling (same merge as upsert).
19163
+ */
19164
+ targetId: zod.z.string().optional()
19095
19165
  }), zod.z.array(DiscoveredTargetSchema), { auth: "admin" }),
19166
+ probeTargetConfig: method(zod.z.object({
19167
+ kind: zod.z.string(),
19168
+ config: zod.z.record(zod.z.string(), zod.z.unknown()),
19169
+ /** See `discoverTargets.targetId` — restore stored secrets for a blank password. */
19170
+ targetId: zod.z.string().optional()
19171
+ }), ProbeTargetConfigResultSchema, {
19172
+ kind: "mutation",
19173
+ auth: "admin"
19174
+ }),
19096
19175
  send: method(zod.z.object({
19097
19176
  targetId: zod.z.string(),
19098
19177
  notification: NotificationSchema
@@ -19107,7 +19186,16 @@ var notificationOutputCapability = {
19107
19186
  kind: "mutation",
19108
19187
  auth: "admin"
19109
19188
  }),
19110
- upsertTarget: method(zod.z.object({ target: TargetSchema }), TargetSchema, {
19189
+ upsertTarget: method(zod.z.object({
19190
+ target: TargetSchema,
19191
+ /**
19192
+ * Duplicate flow: create a NEW target id while copying secrets from an
19193
+ * existing row. The UI never holds the stored token; blank / redacted
19194
+ * password fields are restored from this source (D634 still applies if
19195
+ * destinations diverge without a re-typed secret).
19196
+ */
19197
+ cloneSecretsFrom: zod.z.string().optional()
19198
+ }), TargetSchema, {
19111
19199
  kind: "mutation",
19112
19200
  auth: "admin"
19113
19201
  }),
@@ -21556,12 +21644,33 @@ var NC_ALARM_TRIGGERED_MAX_SEC = 3600;
21556
21644
  var NcAlarmDelaySecSchema = zod.z.number().int().min(0).max(600);
21557
21645
  var NcAlarmTriggeredSecSchema = zod.z.number().int().min(0).max(NC_ALARM_TRIGGERED_MAX_SEC);
21558
21646
  var uniqueModes = (entries) => new Set(entries.map((e) => e.mode)).size === entries.length;
21647
+ /**
21648
+ * What the panel does when a bounded triggered window ends.
21649
+ * - `rearmAfter` — return to the armed mode
21650
+ * - `disableAfter` — auto-disarm
21651
+ * - `doNothing` — stay triggered until a human disarms
21652
+ */
21653
+ var NcAlarmPostTriggeredActionSchema = zod.z.enum([
21654
+ "rearmAfter",
21655
+ "disableAfter",
21656
+ "doNothing"
21657
+ ]);
21559
21658
  /** One mode's OVERRIDES. An absent field inherits the global value (D697). */
21560
21659
  var NcAlarmModeDelaysSchema = zod.z.object({
21561
21660
  mode: AlarmArmModeSchema,
21562
21661
  exitDelaySec: NcAlarmDelaySecSchema.optional(),
21563
21662
  entryDelaySec: NcAlarmDelaySecSchema.optional(),
21564
- triggeredDurationSec: NcAlarmTriggeredSecSchema.optional()
21663
+ /**
21664
+ * Duration of `triggered` before {@link postTriggeredAction}. Kept as the
21665
+ * historical field name so older clients still read/write a number.
21666
+ */
21667
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.optional(),
21668
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
21669
+ /**
21670
+ * When this mode may be armed. Absent / null = always allowed (same as a
21671
+ * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
21672
+ */
21673
+ schedule: NcScheduleSchema.optional()
21565
21674
  });
21566
21675
  var NcAlarmModeDelaysListSchema = zod.z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
21567
21676
  /**
@@ -21573,7 +21682,10 @@ var NcAlarmModeDelaysEditSchema = zod.z.object({
21573
21682
  mode: AlarmArmModeSchema,
21574
21683
  exitDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
21575
21684
  entryDelaySec: NcAlarmDelaySecSchema.nullable().optional(),
21576
- triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional()
21685
+ triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
21686
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
21687
+ /** Set a schedule, or `null` to clear (mode always allowed again). */
21688
+ schedule: NcScheduleSchema.nullable().optional()
21577
21689
  });
21578
21690
  var NcAlarmModeDelaysEditListSchema = zod.z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
21579
21691
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
@@ -21646,12 +21758,18 @@ var NcAlarmSettingsSchema = zod.z.object({
21646
21758
  /** Grace period between a trigger and the alarm firing. 0 = immediate. */
21647
21759
  entryDelaySec: NcAlarmDelaySecSchema,
21648
21760
  /**
21649
- * How long `triggered` lasts before the panel re-arms itself.
21650
- * **0 = until an operator disarms it** — the behaviour before this field
21651
- * existed, and therefore what an untouched install keeps doing.
21761
+ * How long `triggered` lasts before {@link postTriggeredAction} runs.
21762
+ * Ignored when the action is `doNothing`. Historical name kept so older
21763
+ * clients still round-trip a number.
21652
21764
  */
21653
21765
  triggeredDurationSec: NcAlarmTriggeredSecSchema,
21654
21766
  /**
21767
+ * What happens when the triggered window ends. Absent on a blob older than
21768
+ * this field → derived from {@link triggeredDurationSec} (`>0` ⇒ rearmAfter,
21769
+ * else doNothing).
21770
+ */
21771
+ postTriggeredAction: NcAlarmPostTriggeredActionSchema.optional(),
21772
+ /**
21655
21773
  * Deprecated by D630 — every transition is announced. Parsed, never read;
21656
21774
  * remove after one release. Optional so an older admin's patch (which still
21657
21775
  * sends it) parses rather than failing the whole save.
@@ -36049,7 +36167,7 @@ var LocalInterfaceSchema = zod.z.object({
36049
36167
  name: zod.z.string(),
36050
36168
  family: zod.z.enum(["IPv4", "IPv6"]),
36051
36169
  address: zod.z.string(),
36052
- /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */
36170
+ /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
36053
36171
  cidr: zod.z.string(),
36054
36172
  /** OS netmask. Stable across calls so the SDK can hash on it. */
36055
36173
  netmask: zod.z.string(),
@@ -36248,7 +36366,7 @@ var localNetworkCapability = {
36248
36366
  * every client a second authority on a socket only the hub binds. A viewer
36249
36367
  * configured with a port-less public URL (`https://camstack.example.top`)
36250
36368
  * infers 443 from the scheme, asks with 443, and was handed
36251
- * `https://192.168.1.9:443` for a hub listening on 4443. That candidate
36369
+ * `https://192.168.x.x:443` for a hub listening on 4443. That candidate
36252
36370
  * cannot ever answer, and losing its race reads in the log exactly like
36253
36371
  * "the LAN was tried and it was slower" — so an operator sitting on his own
36254
36372
  * WiFi stayed on the public tunnel for weeks, with the LAN candidate born
@@ -36701,7 +36819,7 @@ var MeshPeerSchema = zod.z.object({
36701
36819
  tags: zod.z.array(zod.z.string()).readonly(),
36702
36820
  /** True when the peer advertises itself as an exit-node candidate. */
36703
36821
  exitNodeOption: zod.z.boolean(),
36704
- /** Subnet routes the peer advertises (e.g. `["192.168.1.0/24"]`). */
36822
+ /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
36705
36823
  advertisedRoutes: zod.z.array(zod.z.string()).readonly(),
36706
36824
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
36707
36825
  userLogin: zod.z.string().nullable(),
@@ -50118,6 +50236,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50118
50236
  addonId: null,
50119
50237
  access: "view"
50120
50238
  },
50239
+ "notificationOutput.getTarget": {
50240
+ capName: "notification-output",
50241
+ capScope: "system",
50242
+ addonId: null,
50243
+ access: "view"
50244
+ },
50121
50245
  "notificationOutput.listTargetKinds": {
50122
50246
  capName: "notification-output",
50123
50247
  capScope: "system",
@@ -50130,6 +50254,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50130
50254
  addonId: null,
50131
50255
  access: "view"
50132
50256
  },
50257
+ "notificationOutput.probeTargetConfig": {
50258
+ capName: "notification-output",
50259
+ capScope: "system",
50260
+ addonId: null,
50261
+ access: "create"
50262
+ },
50133
50263
  "notificationOutput.send": {
50134
50264
  capName: "notification-output",
50135
50265
  capScope: "system",
@@ -53839,6 +53969,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
53839
53969
  access: "create"
53840
53970
  }
53841
53971
  });
53972
+ 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;
53842
53973
  DeviceFeature.BatteryOperated;
53843
53974
  /**
53844
53975
  * The vocabulary, in the order a picker offers it.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-DvAczrLl.js");
3
+ const require_dist = require("./dist-DeGPW01G.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_builtins_calendars_calendars_addon = require("./builtins/calendars/calendars.addon.js");
@@ -31,7 +31,7 @@ require("./builtins/system-config/index.js");
31
31
  const require_builtins_winston_logging_index = require("./builtins/winston-logging/index.js");
32
32
  const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-ey4mbofz.js");
33
33
  const require_tls$1 = require("./tls-ue_Xefmv.js");
34
- const require_child_cap_dispatch = require("./child-cap-dispatch-DiDBYNY4.js");
34
+ const require_child_cap_dispatch = require("./child-cap-dispatch-B_0-zpI6.js");
35
35
  const require_resource_monitor = require("./resource-monitor-BgWGRxN5.js");
36
36
  const require_custom_action_registry = require("./custom-action-registry-acBY3mHA.js");
37
37
  let zod = require("zod");
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { $n as ReadinessRegistry, Bt as lifecycleJobSchema, D as METHOD_ACCESS_MAP, Dt as extractNestedAddonId, Ft as isObjectInput, Gt as looseSchema, It as isVoidInput, Jn as errMsg$1, Lt as kebabToCamel, M as RUNTIME_DEFAULTS, Mt as isArrayOutputSchema, Nt as isCollectionArrayMethod, Qn as DEVICE_STATUS_METHOD, U as addonSettingsCapability, Wt as logLevelAtMost, Xn as DATAPLANE_SECRET_HEADER$1, Zn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, _r as scopeKey, an as procedureAuthKey, ar as createEvent, br as EventCategory$1, cr as expandCapMethods, en as objectInputDeclaresAddonId, er as ReadinessTimeoutError, gn as scopesAllowDeviceCap, gr as resolveCapMount, hn as scopesAllowAddon, hr as readinessKey, ir as asString$1, mr as parseJsonUnknown, nr as asJsonObject$1, or as emitDownForOwnedCaps, pn as resolveMethodAuth, pr as parseJsonObject, rr as asNumber, t as ALL_CAPABILITY_DEFINITIONS, tn as objectInputDeclaresRequiredDeviceId, w as LOG_LEVEL_RANK } from "./dist-C6CPaa8G.mjs";
2
+ import { $n as ReadinessRegistry, Bt as lifecycleJobSchema, D as METHOD_ACCESS_MAP, Dt as extractNestedAddonId, Ft as isObjectInput, Gt as looseSchema, It as isVoidInput, Jn as errMsg$1, Lt as kebabToCamel, M as RUNTIME_DEFAULTS, Mt as isArrayOutputSchema, Nt as isCollectionArrayMethod, Qn as DEVICE_STATUS_METHOD, U as addonSettingsCapability, Wt as logLevelAtMost, Xn as DATAPLANE_SECRET_HEADER$1, Zn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, _r as scopeKey, an as procedureAuthKey, ar as createEvent, br as EventCategory$1, cr as expandCapMethods, en as objectInputDeclaresAddonId, er as ReadinessTimeoutError, gn as scopesAllowDeviceCap, gr as resolveCapMount, hn as scopesAllowAddon, hr as readinessKey, ir as asString$1, mr as parseJsonUnknown, nr as asJsonObject$1, or as emitDownForOwnedCaps, pn as resolveMethodAuth, pr as parseJsonObject, rr as asNumber, t as ALL_CAPABILITY_DEFINITIONS, tn as objectInputDeclaresRequiredDeviceId, w as LOG_LEVEL_RANK } from "./dist-DADwBtU5.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { CalendarsAddon } from "./builtins/calendars/calendars.addon.mjs";
@@ -30,7 +30,7 @@ import "./builtins/system-config/index.mjs";
30
30
  import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
31
31
  import { _ as ensureModel, a as createFileDataPlaneHandler, c as parseRangeHeader, d as ModelDownloadService, g as downloadModel, h as downloadFile, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as deleteModelFromDisk, n as STALL_TICK_MS, o as contentTypeFor, p as collectModelFiles, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as fetchJson, x as isModelDownloaded, y as getModelFilePath } from "./event-loop-stall-monitor-EXjzIxDz.mjs";
32
32
  import { C as registerLanHttpHandler, S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, b as bindPendingLanHttp, c as loadTlsCert, d as collectCertIdentity, f as CA_VALIDITY_DAYS, g as evaluateExistingCert, h as SERVER_AUTH_OID, i as writeExtraSans, l as reissueTlsLeaf, m as MAX_LEAF_VALIDITY_DAYS, n as readTlsAccessStatus, o as validateUploadedTls, p as LEAF_RENEWAL_WINDOW_DAYS, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, u as CA_COMMON_NAME, v as allFamiliesListenHost, x as closeLanHttp, y as applyLanHttp } from "./tls-DTlVWwAI.mjs";
33
- import { $ as CapRouteError, $n as CAP_ACTION_UNLABELLED, $t as RUNNER_HEAP_WATCH_INTERVAL_MS, A as resolveHwAccel, An as OUTBOUND_QUEUE_COOLDOWN_MS, At as serializeTypedArrays, B as udsChildLogToWorkerEntry, Bn as SOCKET_QUEUE_TOP_N, Bt as createAddonPeerBytesFacility, C as getBrokerEventBus, Cn as DECISIVE_HEAP_SPACES, Ct as NATIVE_PROVIDER_SERVICE_INFIX, D as subscribePassthrough, Dn as heapSpaceField, Dt as capServiceName, E as setNodeEventInterest, En as formatHeapSpaces, Et as capBareAction, F as ipcParentLink, Fn as MESH_QUEUE_TOP_N, Ft as installManifestNativeDeps, G as UDS_NO_ROUTE_PREFIX, Gn as readSocketQueues, Gt as HEAP_RECLAIM_TRIGGER_MB, H as createUdsLoggerWithControl, Hn as createSocketPlaneReader, Ht as createAddonDataPlaneFacility, I as localProviderLink, In as createMeshQueueReader, It as resolveAddonClass, J as answerClaimedGetStatus, Jn as recordSocketFrame, Jt as HUB_MAIN_HEAP_WATCH_LABEL, K as afterWorkerOnlineAnnounce, Kn as EMPTY_SOCKET_DIRECTION, Kt as HEAP_WATCH_INTERVAL_MS, L as createParentUnownedCallHandler, Ln as formatMeshQueue, Lt as buildNpmChildEnv, M as brokerTransportLink, Mn as OUTBOUND_QUEUE_THRESHOLD_BYTES, Mt as CapabilityHandle, N as buildLinkChain, Nn as createOutboundQueueGate, Nt as CapabilityUnavailableError, O as AddonDepsManager, On as readHeapSpaces, Ot as parseCapAction, P as deviceCapResolverLink, Pn as formatOutboundQueueVerdict, Pt as copyBundledNativeModules, Q as CapRouteResolver, Qn as CAP_ACTION_OVERFLOW_LABEL, Qt as RSS_BUDGET_RELEASE_RATIO, R as createUdsEventBridge, Rn as EMPTY_SOCKET_PLANE_BASELINE, Rt as resolveNpmInvocation, S as clusterEventTopic, Sn as isArrayBufferCensusReport, St as validateProviderRegistrations, T as registerEventBusService, Tn as emitHeapDiagnosticReport, Tt as capActionSuffix, U as LocalChildClient, Un as diffSocketPlane, Ut as HEAP_RECLAIM_MIN_INTERVAL_MS, V as createUdsLogger, Vn as createSocketPlaneMeter, Vt as hostNodeIdOf, W as LocalChildRegistry, Wn as formatSocketPlane, Wt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, X as AGENT_CAP_FWD_ACTION, Xn as socketDirectionBytes, Xt as HUB_RSS_BUDGET_ENV, Y as deviceOfGetStatus, Yn as sampleSocketDirection, Yt as HUB_MAIN_RSS_BUDGET_MB, Z as AGENT_CAP_FWD_SERVICE, Zn as socketDirectionMessages, Zt as RSS_BUDGET_REANNOUNCE_MIN_MS, _ as getWorkerDeviceRegistry, _n as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, a as reapProcessGroup, an as createV8Reclaimer, ar as EVENT_PLANE_TOP_N, at as __resetCapUsageRegistryForTests, b as setHubConnected, bn as createInspectorArrayBufferCensus, c as runnerOwnsProcessGroup, cn as nextRssBudgetState, cr as diffEventPlane, ct as UdsLocalTransportClient, d as summarizeMembers, dn as shouldReclaim, dt as PeerAnsweredError, en as RUNNER_RSS_BUDGET_ENV, er as EMPTY_CAP_ACTION_READING, et as classifyCapRoute, f as installManifestSystemDeps, fn as startHeapWatch, ft as localEndpointPath, g as createUdsAddonContext, gn as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, gt as createBrokerDeviceManagerApi, h as createAddonContext, hn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ht as buildNativeCapProxy, in as createLoopDelayMeter, ir as diffCapActionCensus, it as PARENT_ROUTED_PROVIDER_ADDON_ID, j as brokerCallForCap, jn as OUTBOUND_QUEUE_SUSTAIN_MS, jt as DeviceRegistry, k as createKernelHwAccel, kn as selectReportedSpaces, kt as deserializeTypedArrays, l as signalAllRunnerGroups, ln as parseRssBudgetMb, lr as formatEventPlane, lt as UdsLocalTransportServer, m as adaptBrokerToCluster, mn as strandedMb, mt as encodeFrame, nn as buildHeapSample, nr as capActionLabel, nt as readMoleculerFanoutMode, o as registerRunnerGroup, on as describeRss, or as createEventPlaneMeter, ot as getCapUsageRegistry, p as installManifestPythonDeps, pn as startRunnerHeapWatch, pt as FrameDecoder, q as GET_STATUS_METHOD, qn as createSocketDirectionCounters, qt as HEAP_WATCH_WARN_RATIO, r as defaultProcessGroupOps, rn as createDeferredHeapWatchSink, rr as createCapActionCensus, rt as CapUsageRegistry, s as releaseRunnerGroup, sn as hubMainRssBudget, sr as createEventPlaneReader, st as createLocalTransport, t as CAP_METHOD_NOT_IMPLEMENTED, tn as ZERO_LOOP_DELAY, tr as MAX_CAP_ACTIONS_PER_PEER, tt as callWithServiceDiscovery, un as reclaimIntervalMs, ut as SocketChannel, v as getOrInitReadinessRegistry, vn as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, w as getMoleculerEventStats, wn as HEAP_SPACE_REPORT_MIN_MB, wt as capActionName, x as EVENT_TOPIC_PREFIX, xn as formatArrayBufferCensus, xt as createAddonService, y as getOrInitReadinessRegistryForClient, yn as createArrayBufferCensusGate, yt as mountNativeCapService, z as createUdsEventBus, zn as SOCKET_PLANE_TOP_N, zt as runNpm } from "./child-cap-dispatch-Pkx_sEKR.mjs";
33
+ import { $ as CapRouteError, $n as CAP_ACTION_UNLABELLED, $t as RUNNER_HEAP_WATCH_INTERVAL_MS, A as resolveHwAccel, An as OUTBOUND_QUEUE_COOLDOWN_MS, At as serializeTypedArrays, B as udsChildLogToWorkerEntry, Bn as SOCKET_QUEUE_TOP_N, Bt as createAddonPeerBytesFacility, C as getBrokerEventBus, Cn as DECISIVE_HEAP_SPACES, Ct as NATIVE_PROVIDER_SERVICE_INFIX, D as subscribePassthrough, Dn as heapSpaceField, Dt as capServiceName, E as setNodeEventInterest, En as formatHeapSpaces, Et as capBareAction, F as ipcParentLink, Fn as MESH_QUEUE_TOP_N, Ft as installManifestNativeDeps, G as UDS_NO_ROUTE_PREFIX, Gn as readSocketQueues, Gt as HEAP_RECLAIM_TRIGGER_MB, H as createUdsLoggerWithControl, Hn as createSocketPlaneReader, Ht as createAddonDataPlaneFacility, I as localProviderLink, In as createMeshQueueReader, It as resolveAddonClass, J as answerClaimedGetStatus, Jn as recordSocketFrame, Jt as HUB_MAIN_HEAP_WATCH_LABEL, K as afterWorkerOnlineAnnounce, Kn as EMPTY_SOCKET_DIRECTION, Kt as HEAP_WATCH_INTERVAL_MS, L as createParentUnownedCallHandler, Ln as formatMeshQueue, Lt as buildNpmChildEnv, M as brokerTransportLink, Mn as OUTBOUND_QUEUE_THRESHOLD_BYTES, Mt as CapabilityHandle, N as buildLinkChain, Nn as createOutboundQueueGate, Nt as CapabilityUnavailableError, O as AddonDepsManager, On as readHeapSpaces, Ot as parseCapAction, P as deviceCapResolverLink, Pn as formatOutboundQueueVerdict, Pt as copyBundledNativeModules, Q as CapRouteResolver, Qn as CAP_ACTION_OVERFLOW_LABEL, Qt as RSS_BUDGET_RELEASE_RATIO, R as createUdsEventBridge, Rn as EMPTY_SOCKET_PLANE_BASELINE, Rt as resolveNpmInvocation, S as clusterEventTopic, Sn as isArrayBufferCensusReport, St as validateProviderRegistrations, T as registerEventBusService, Tn as emitHeapDiagnosticReport, Tt as capActionSuffix, U as LocalChildClient, Un as diffSocketPlane, Ut as HEAP_RECLAIM_MIN_INTERVAL_MS, V as createUdsLogger, Vn as createSocketPlaneMeter, Vt as hostNodeIdOf, W as LocalChildRegistry, Wn as formatSocketPlane, Wt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, X as AGENT_CAP_FWD_ACTION, Xn as socketDirectionBytes, Xt as HUB_RSS_BUDGET_ENV, Y as deviceOfGetStatus, Yn as sampleSocketDirection, Yt as HUB_MAIN_RSS_BUDGET_MB, Z as AGENT_CAP_FWD_SERVICE, Zn as socketDirectionMessages, Zt as RSS_BUDGET_REANNOUNCE_MIN_MS, _ as getWorkerDeviceRegistry, _n as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, a as reapProcessGroup, an as createV8Reclaimer, ar as EVENT_PLANE_TOP_N, at as __resetCapUsageRegistryForTests, b as setHubConnected, bn as createInspectorArrayBufferCensus, c as runnerOwnsProcessGroup, cn as nextRssBudgetState, cr as diffEventPlane, ct as UdsLocalTransportClient, d as summarizeMembers, dn as shouldReclaim, dt as PeerAnsweredError, en as RUNNER_RSS_BUDGET_ENV, er as EMPTY_CAP_ACTION_READING, et as classifyCapRoute, f as installManifestSystemDeps, fn as startHeapWatch, ft as localEndpointPath, g as createUdsAddonContext, gn as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, gt as createBrokerDeviceManagerApi, h as createAddonContext, hn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ht as buildNativeCapProxy, in as createLoopDelayMeter, ir as diffCapActionCensus, it as PARENT_ROUTED_PROVIDER_ADDON_ID, j as brokerCallForCap, jn as OUTBOUND_QUEUE_SUSTAIN_MS, jt as DeviceRegistry, k as createKernelHwAccel, kn as selectReportedSpaces, kt as deserializeTypedArrays, l as signalAllRunnerGroups, ln as parseRssBudgetMb, lr as formatEventPlane, lt as UdsLocalTransportServer, m as adaptBrokerToCluster, mn as strandedMb, mt as encodeFrame, nn as buildHeapSample, nr as capActionLabel, nt as readMoleculerFanoutMode, o as registerRunnerGroup, on as describeRss, or as createEventPlaneMeter, ot as getCapUsageRegistry, p as installManifestPythonDeps, pn as startRunnerHeapWatch, pt as FrameDecoder, q as GET_STATUS_METHOD, qn as createSocketDirectionCounters, qt as HEAP_WATCH_WARN_RATIO, r as defaultProcessGroupOps, rn as createDeferredHeapWatchSink, rr as createCapActionCensus, rt as CapUsageRegistry, s as releaseRunnerGroup, sn as hubMainRssBudget, sr as createEventPlaneReader, st as createLocalTransport, t as CAP_METHOD_NOT_IMPLEMENTED, tn as ZERO_LOOP_DELAY, tr as MAX_CAP_ACTIONS_PER_PEER, tt as callWithServiceDiscovery, un as reclaimIntervalMs, ut as SocketChannel, v as getOrInitReadinessRegistry, vn as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, w as getMoleculerEventStats, wn as HEAP_SPACE_REPORT_MIN_MB, wt as capActionName, x as EVENT_TOPIC_PREFIX, xn as formatArrayBufferCensus, xt as createAddonService, y as getOrInitReadinessRegistryForClient, yn as createArrayBufferCensusGate, yt as mountNativeCapService, z as createUdsEventBus, zn as SOCKET_PLANE_TOP_N, zt as runNpm } from "./child-cap-dispatch-BAfa6tjj.mjs";
34
34
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-B2WZ8_q9.mjs";
35
35
  import { t as CustomActionRegistry } from "./custom-action-registry-B4Cf4O_X.mjs";
36
36
  import { z } from "zod";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DvAczrLl.js");
1
+ const require_dist = require("./dist-DeGPW01G.js");
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
@@ -1,4 +1,4 @@
1
- import { nr as asJsonObject } from "./dist-C6CPaa8G.mjs";
1
+ import { nr as asJsonObject } from "./dist-DADwBtU5.mjs";
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.349",
3
+ "version": "1.2.351",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",