@camstack/system 1.2.434 → 1.2.436

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 (103) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  11. package/dist/builtins/calendars/calendars.addon.js +1 -1
  12. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  13. package/dist/builtins/camera-grid/index.js +1 -1
  14. package/dist/builtins/camera-grid/index.mjs +1 -1
  15. package/dist/builtins/composer/composer.addon.js +2 -2
  16. package/dist/builtins/composer/composer.addon.mjs +2 -2
  17. package/dist/builtins/console-logging/index.js +1 -1
  18. package/dist/builtins/console-logging/index.mjs +1 -1
  19. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  20. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  21. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  22. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  23. package/dist/builtins/hub-forwarder/index.js +1 -1
  24. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  25. package/dist/builtins/keychain/index.js +6 -7
  26. package/dist/builtins/keychain/index.mjs +6 -7
  27. package/dist/builtins/keychain/keychain-service.d.ts +1 -2
  28. package/dist/builtins/keychain/system-held-secrets.d.ts +5 -5
  29. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  30. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  31. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  32. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  33. package/dist/builtins/local-network/local-network.addon.d.ts +4 -2
  34. package/dist/builtins/local-network/local-network.addon.js +23 -13
  35. package/dist/builtins/local-network/local-network.addon.mjs +23 -13
  36. package/dist/builtins/loki-logging/index.js +1 -1
  37. package/dist/builtins/loki-logging/index.mjs +1 -1
  38. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  39. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  40. package/dist/builtins/platform-probe/index.js +1 -1
  41. package/dist/builtins/platform-probe/index.mjs +1 -1
  42. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  43. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  44. package/dist/builtins/snapshot/index.js +1 -1
  45. package/dist/builtins/snapshot/index.mjs +1 -1
  46. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  47. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  48. package/dist/builtins/sqlite-storage/index.js +1 -1
  49. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  50. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +3 -3
  51. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +3 -3
  52. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  53. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  54. package/dist/builtins/system-config/system-config.addon.d.ts +3 -24
  55. package/dist/builtins/system-config/system-config.addon.js +105 -1410
  56. package/dist/builtins/system-config/system-config.addon.mjs +108 -1402
  57. package/dist/builtins/winston-logging/index.js +1 -1
  58. package/dist/builtins/winston-logging/index.mjs +1 -1
  59. package/dist/{composition-sources-B7R1oQnY.js → composition-sources-BAOlCu4j.js} +1 -1
  60. package/dist/{composition-sources-CqrDyHM1.mjs → composition-sources-gN_BWUKp.mjs} +1 -1
  61. package/dist/constants-BFpowodq.mjs +20 -0
  62. package/dist/constants-GENKqk9k.js +66 -0
  63. package/dist/{device-ca-CDjGQQPd.mjs → device-ca-BNM5ai4t.mjs} +1 -1
  64. package/dist/{device-ca-D21ZP00q.js → device-ca-CuWuRW9N.js} +1 -1
  65. package/dist/{dist-CCH3XPqO.js → dist-DVe0Nsp8.js} +48 -16
  66. package/dist/{dist-CYcBqnXk.mjs → dist-DjD2M79P.mjs} +43 -5
  67. package/dist/file-host-worker.js +1 -1
  68. package/dist/file-host-worker.mjs +1 -1
  69. package/dist/index.js +132 -795
  70. package/dist/index.mjs +133 -753
  71. package/dist/kernel/index.d.ts +7 -21
  72. package/dist/kernel/moleculer/agent-ui-unlock.d.ts +7 -32
  73. package/dist/kernel/moleculer/broker-factory.d.ts +3 -9
  74. package/dist/kernel/moleculer/broker-transport-swap.d.ts +17 -0
  75. package/dist/kernel/moleculer/hub-service.d.ts +6 -16
  76. package/dist/kernel/moleculer/mesh-access-middleware.d.ts +7 -17
  77. package/dist/kernel/moleculer/mesh-identity.d.ts +57 -0
  78. package/dist/kernel/moleculer/mesh-mtls/constants.d.ts +1 -4
  79. package/dist/kernel/moleculer/mesh-mtls/index.d.ts +1 -4
  80. package/dist/kernel/moleculer/mesh-mtls/mesh-ca.d.ts +1 -1
  81. package/dist/kernel/moleculer/mesh-mtls/mesh-renewal.d.ts +1 -1
  82. package/dist/kernel/moleculer/node-registry.d.ts +0 -6
  83. package/dist/kernel/moleculer/register-node-client.d.ts +9 -7
  84. package/dist/{restore-archive-5ml7uYMf.mjs → restore-archive-BxmP1ChO.mjs} +1 -1
  85. package/dist/{restore-archive-Do0QwAik.js → restore-archive-D4h904rb.js} +1 -1
  86. package/dist/{retired-settings-keys-CyDdyjLP.mjs → retired-settings-keys-CQaknvx1.mjs} +1 -1
  87. package/dist/{retired-settings-keys-CEiCaI_j.js → retired-settings-keys-CYP5IZJ5.js} +1 -1
  88. package/dist/{wal-maintenance-LZYd8iT-.js → wal-maintenance-Br60onAQ.js} +0 -0
  89. package/dist/{wal-maintenance-DgLLPK14.mjs → wal-maintenance-CaDsrJM_.mjs} +0 -0
  90. package/package.json +1 -1
  91. package/dist/builtins/system-config/cluster-secret-keeper.d.ts +0 -63
  92. package/dist/constants-CrMPWOug.mjs +0 -102
  93. package/dist/constants-CuOfMdYe.js +0 -221
  94. package/dist/kernel/moleculer/agent-mesh-authenticator.d.ts +0 -91
  95. package/dist/kernel/moleculer/cluster-secret.d.ts +0 -46
  96. package/dist/kernel/moleculer/mesh-auth-mode.d.ts +0 -58
  97. package/dist/kernel/moleculer/mesh-authenticator.d.ts +0 -77
  98. package/dist/kernel/moleculer/mesh-auto-enforce.d.ts +0 -46
  99. package/dist/kernel/moleculer/mesh-join-client.d.ts +0 -73
  100. package/dist/kernel/moleculer/mesh-join-hold.d.ts +0 -85
  101. package/dist/kernel/moleculer/mesh-join-proof.d.ts +0 -39
  102. package/dist/kernel/moleculer/mesh-mtls/mesh-enroll.d.ts +0 -34
  103. package/dist/kernel/moleculer/mesh-mtls/mesh-join-token.d.ts +0 -56
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Z as addonPagesCapability, br as BaseAddon, fi as EventCategory, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
1
+ import { Q as addonPagesCapability, br as errMsg, di as EventCategory, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $ as addonWidgetsCapability, br as BaseAddon, fi as EventCategory, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
1
+ import { br as errMsg, di as EventCategory, et as addonWidgetsCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  //#region src/builtins/alerts/device-label.ts
8
8
  /**
9
9
  * Operator-facing device label for alert messages.
@@ -1,4 +1,4 @@
1
- import { Ir as createEvent, br as BaseAddon, et as alertsCapability, fi as EventCategory, i as AlertSchema, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
1
+ import { Lr as createEvent, br as errMsg, di as EventCategory, i as AlertSchema, tt as alertsCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  //#region src/builtins/alerts/device-label.ts
3
3
  /**
4
4
  * Operator-facing device label for alert messages.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  //#region src/builtins/autotrack/autotrack-config.ts
8
8
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
9
9
  deadZoneFraction: .5,
@@ -1,4 +1,4 @@
1
- import { En as ptzAutotrackCapability, Gr as isEvent, br as BaseAddon, fi as EventCategory, k as FIRST_LEVEL_MACRO_CLASSES, rt as bareAddonId, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
1
+ import { Dn as ptzAutotrackCapability, Kr as isEvent, br as errMsg, di as EventCategory, it as bareAddonId, k as FIRST_LEVEL_MACRO_CLASSES, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
7
- const require_restore_archive = require("../../restore-archive-Do0QwAik.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
+ const require_restore_archive = require("../../restore-archive-D4h904rb.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_fs_promises = require("node:fs/promises");
10
10
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,5 +1,5 @@
1
- import { Kn as storageOccupancyCapability, Zr as nodePin, br as BaseAddon, fi as EventCategory, fn as mayWriteToLocation, li as toNodeId, nt as backupCapability } from "../../dist-CYcBqnXk.mjs";
2
- import { a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-5ml7uYMf.mjs";
1
+ import { Zr as nodePin, ci as toNodeId, di as EventCategory, pn as mayWriteToLocation, qn as storageOccupancyCapability, rt as backupCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
+ import { a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-BxmP1ChO.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import * as fsp from "node:fs/promises";
5
5
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/calendars/calendar-color.ts
@@ -1,4 +1,4 @@
1
- import { br as BaseAddon, h as CalendarPreferencesSchema, lt as calendarsCapability } from "../../dist-CYcBqnXk.mjs";
1
+ import { h as CalendarPreferencesSchema, ut as calendarsCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/calendars/calendar-color.ts
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  let zod = require("zod");
8
8
  let _camstack_types_node = require("@camstack/types/node");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { D as DeclaredDevices, Ir as createEvent, Jn as streamCatalogCapability, S as DERIVED_CAMERA_SILENCED_CAP_NAMES, Un as snapshotCapability, Ur as hydrateSchema, ar as buildFfmpegArgs, br as BaseAddon, fi as EventCategory, gn as motionCapability, gr as DeviceFeature, o as BaseDevice, pn as memoizePinnedFfmpeg, ut as cameraGridLayoutCapability, vr as DeviceType, wt as declarationOwnerNodeId, yr as errMsg, z as MOTION_CLOSE_AFTER_MS } from "../../dist-CYcBqnXk.mjs";
1
+ import { D as DeclaredDevices, Lr as createEvent, S as DERIVED_CAMERA_SILENCED_CAP_NAMES, Tt as declarationOwnerNodeId, Wn as snapshotCapability, Wr as hydrateSchema, Yn as streamCatalogCapability, _n as motionCapability, _r as DeviceFeature, br as errMsg, di as EventCategory, dt as cameraGridLayoutCapability, mn as memoizePinnedFfmpeg, o as BaseDevice, or as buildFfmpegArgs, xr as BaseAddon, yr as DeviceType, z as MOTION_CLOSE_AFTER_MS } from "../../dist-DjD2M79P.mjs";
2
2
  import { z } from "zod";
3
3
  import { FfmpegProcess } from "@camstack/types/node";
4
4
  import { join } from "node:path";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
7
- const require_composition_sources = require("../../composition-sources-B7R1oQnY.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
+ const require_composition_sources = require("../../composition-sources-BAOlCu4j.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/shared/device-state-changed.ts
10
10
  /** Structural narrowing helper for untrusted bus payloads. */
@@ -1,5 +1,5 @@
1
- import { Bt as expressionContainsBuiltinCall, Cn as planComposition, D as DeclaredDevices, Ir as createEvent, Lt as evaluateCompositionField, at as buildCapabilityLookup, br as BaseAddon, cr as composedDeviceStableId, d as COMPOSED_ITEM_FIXED_FIELDS, dr as compositionSliceKey, fi as EventCategory, fr as compositionSourceKey, hr as toExpressionValue, ir as COMPOSER_ADDON_ID, lr as compositionFeatureEnabled, mr as disarmRoseMemory, mt as compositionFieldKey, o as BaseDevice, or as cloneStatefulExpressionMemory, pr as createStatefulExpressionMemory, pt as composerCapability, r as ALL_CAPABILITY_DEFINITIONS, sr as composedDeviceRef, ur as compositionItemFieldPath, vr as DeviceType, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
2
- import { n as normalizedNativeOwner } from "../../composition-sources-CqrDyHM1.mjs";
1
+ import { D as DeclaredDevices, Lr as createEvent, Rt as evaluateCompositionField, Vt as expressionContainsBuiltinCall, ar as COMPOSER_ADDON_ID, br as errMsg, cr as composedDeviceRef, d as COMPOSED_ITEM_FIXED_FIELDS, di as EventCategory, dr as compositionItemFieldPath, fr as compositionSliceKey, gr as toExpressionValue, hr as disarmRoseMemory, ht as compositionFieldKey, lr as composedDeviceStableId, mr as createStatefulExpressionMemory, mt as composerCapability, o as BaseDevice, ot as buildCapabilityLookup, pr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, sr as cloneStatefulExpressionMemory, ur as compositionFeatureEnabled, wn as planComposition, xr as BaseAddon, yr as DeviceType } from "../../dist-DjD2M79P.mjs";
2
+ import { n as normalizedNativeOwner } from "../../composition-sources-gN_BWUKp.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/shared/device-state-changed.ts
5
5
  /** Structural narrowing helper for untrusted bus payloads. */
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/console-logging/console-destination.ts
9
9
  var LEVEL_RANK = {
@@ -1,4 +1,4 @@
1
- import { br as BaseAddon, cn as logDestinationCapability } from "../../dist-CYcBqnXk.mjs";
1
+ import { ln as logDestinationCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/console-logging/console-destination.ts
4
4
  var LEVEL_RANK = {
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-CCH3XPqO.js");
4
- const require_composition_sources = require("../../composition-sources-B7R1oQnY.js");
3
+ const require_dist = require("../../dist-DVe0Nsp8.js");
4
+ const require_composition_sources = require("../../composition-sources-BAOlCu4j.js");
5
5
  let node_crypto = require("node:crypto");
6
6
  let _camstack_types_node = require("@camstack/types/node");
7
7
  let node_fs_promises = require("node:fs/promises");
@@ -1,5 +1,5 @@
1
- import { Cn as planComposition, D as DeclaredDevices, Mn as resolveCoreBlockFiles, On as replacedFieldKeys, Ot as describeComposableCaps, Qn as validateComposition, Ur as hydrateSchema, _n as normalizeCoreBlockWrite, _t as coreBlockComposition, at as buildCapabilityLookup, br as BaseAddon, bt as coreBlocksCapability, f as COMPOSER_RUNNER_ID, fr as compositionSourceKey, g as CoreBlockSchema, gt as coreBlockAddonId, ht as compositionSourceRefs, jn as resolveCoreBlockEntry, m as CORE_BLOCK_ADDON_PREFIX, p as CORE_BLOCKS_ADDON_ID, r as ALL_CAPABILITY_DEFINITIONS, sr as composedDeviceRef, vt as coreBlockIdFromAddonId, yr as errMsg, yt as coreBlockSourceKind } from "../../dist-CYcBqnXk.mjs";
2
- import { t as describeCompositionSources } from "../../composition-sources-CqrDyHM1.mjs";
1
+ import { $n as validateComposition, D as DeclaredDevices, Mn as resolveCoreBlockEntry, Nn as resolveCoreBlockFiles, Wr as hydrateSchema, _t as coreBlockAddonId, br as errMsg, bt as coreBlockSourceKind, cr as composedDeviceRef, f as COMPOSER_RUNNER_ID, g as CoreBlockSchema, gt as compositionSourceRefs, kn as replacedFieldKeys, kt as describeComposableCaps, m as CORE_BLOCK_ADDON_PREFIX, ot as buildCapabilityLookup, p as CORE_BLOCKS_ADDON_ID, pr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, vn as normalizeCoreBlockWrite, vt as coreBlockComposition, wn as planComposition, xr as BaseAddon, xt as coreBlocksCapability, yt as coreBlockIdFromAddonId } from "../../dist-DjD2M79P.mjs";
2
+ import { t as describeCompositionSources } from "../../composition-sources-gN_BWUKp.mjs";
3
3
  import { createRequire } from "node:module";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { customizationBlockName } from "@camstack/types/node";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-CEiCaI_j.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-CYP5IZJ5.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
10
10
  let _camstack_types_node = require("@camstack/types/node");
@@ -1,5 +1,5 @@
1
- import { A as FieldClaimModeSchema, At as deviceExtensionCapability, Et as defineExtensionSlotProvider, Fr as collectZodSecretPaths, Ft as enumerateItemArrayFields, Gt as formatMinutes, Hn as siteZoneKey, It as enumerateSchemaFields, Jr as isSecretMarker, Kr as isKeychainStoredField, Ln as runtimeStatePolicyFor, Mt as deviceStateCapability, Nt as deviceStatusCapability, O as DeviceStatusSchema, Or as SECRET_CLEAR, R as MINUTES_PER_DAY, U as STREAM_PROFILE_META, Wr as isDeviceConfigCap, Yr as isSecretMarkerLike, _r as DeviceRole, br as BaseAddon, c as CAMERA_SWITCH_ORDER, ci as sleep$1, ct as buildStreamParamsConfigSchema, di as transformSecretWrite, dt as canonicalIconKey, fi as EventCategory, gr as DeviceFeature, ii as resolveSecretMarkers, j as FieldClaimSchema, jt as deviceManagerCapability, kr as WELL_KNOWN_TAB_MAP, oi as secretTreeFromPaths, qr as isSecretClear, r as ALL_CAPABILITY_DEFINITIONS, rn as legacyAutoLinkIds, sn as locationIconKey, u as CAP_NAMES_WITH_STATUS, ui as toSecretFieldView, vn as normalizeUnit, vr as DeviceType, x as DAY_NAMES, xn as parseStreamParamsFormPatch, xt as createDeviceExtensionProvider, yr as errMsg, zt as expandContainer } from "../../dist-CYcBqnXk.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-CyDdyjLP.mjs";
1
+ import { A as FieldClaimModeSchema, Ar as WELL_KNOWN_TAB_MAP, Bt as expandContainer, Dt as defineExtensionSlotProvider, Gr as isDeviceConfigCap, Ir as collectZodSecretPaths, It as enumerateItemArrayFields, Jr as isSecretClear, Kt as formatMinutes, Lt as enumerateSchemaFields, Mt as deviceManagerCapability, Nt as deviceStateCapability, O as DeviceStatusSchema, Pt as deviceStatusCapability, R as MINUTES_PER_DAY, Rn as runtimeStatePolicyFor, Sn as parseStreamParamsFormPatch, St as createDeviceExtensionProvider, Un as siteZoneKey, W as STREAM_PROFILE_META, Xr as isSecretMarkerLike, Yr as isSecretMarker, _r as DeviceFeature, br as errMsg, c as CAMERA_SWITCH_ORDER, cn as locationIconKey, di as EventCategory, ft as canonicalIconKey, ii as resolveSecretMarkers, in as legacyAutoLinkIds, j as FieldClaimSchema, jt as deviceExtensionCapability, kr as SECRET_CLEAR, li as toSecretFieldView, lt as buildStreamParamsConfigSchema, oi as secretTreeFromPaths, qr as isKeychainStoredField, r as ALL_CAPABILITY_DEFINITIONS, si as sleep$1, u as CAP_NAMES_WITH_STATUS, ui as transformSecretWrite, vr as DeviceRole, x as DAY_NAMES, xr as BaseAddon, yn as normalizeUnit, yr as DeviceType } from "../../dist-DjD2M79P.mjs";
2
+ import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-CQaknvx1.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
9
9
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,4 +1,4 @@
1
- import { br as BaseAddon, cn as logDestinationCapability } from "../../dist-CYcBqnXk.mjs";
1
+ import { ln as logDestinationCapability, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
4
4
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
7
- const require_device_ca = require("../../device-ca-D21ZP00q.js");
8
- const require_constants = require("../../constants-CuOfMdYe.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
+ const require_device_ca = require("../../device-ca-CuWuRW9N.js");
8
+ const require_constants = require("../../constants-GENKqk9k.js");
9
9
  const require_platform_key_source = require("../../platform-key-source-Di7HrlGR.js");
10
10
  let node_crypto = require("node:crypto");
11
11
  let _camstack_types_node = require("@camstack/types/node");
@@ -336,7 +336,7 @@ async function applyKeychainResetTrigger(input) {
336
336
  }
337
337
  await consume(file, logger);
338
338
  const toReenter = ((await service.resetReport().catch(() => null))?.pendingReentry ?? []).map((m) => `${m.owner}:${m.scope}:${m.fieldPath}`);
339
- logger.error("*** KEYCHAIN RESET by the RESET_KEYCHAIN trigger file *** Every stored secret was archived (unreadable without the lost master key) and a new master key and data key were created. Every secret field now reads \"not set\" — re-enter them (System → Secrets lists them). The session signing key is regenerated: everyone signs in again. The cluster secret was cleared: set it again in System → Cluster if agents used one.", {
339
+ logger.error("*** KEYCHAIN RESET by the RESET_KEYCHAIN trigger file *** Every stored secret was archived (unreadable without the lost master key) and a new master key and data key were created. Every secret field now reads \"not set\" — re-enter them (System → Secrets lists them). The session signing key is regenerated: everyone signs in again.", {
340
340
  lockedReason: state.reason,
341
341
  archived: record.archived,
342
342
  archivedCollection: record.archivedCollection,
@@ -360,7 +360,7 @@ var PROCESS_HELD_SECRET_REFS = new Set([
360
360
  require_device_ca.DEVICE_CA_KEY_REF
361
361
  ]);
362
362
  /** `system-settings` keys that may hold a system-owned secret's marker. */
363
- var SYSTEM_SECRET_SETTINGS_KEYS = [require_constants.CLUSTER_SECRET_SETTINGS_KEY];
363
+ var SYSTEM_SECRET_SETTINGS_KEYS = [];
364
364
  var KeychainLockedError = class extends Error {
365
365
  reason;
366
366
  constructor(reason) {
@@ -899,8 +899,7 @@ var KeychainService = class {
899
899
  * 2. Archive every value AND every wrapped data key — the archive stays
900
900
  * openable if the lost master key turns up.
901
901
  * 3. New data key under the new master key ({@link firstBoot}).
902
- * 4. Clear the system-held markers (the cluster secret's): a marker pointing
903
- * at an archived value would refuse every agent forever (D797). The
902
+ * 4. Clear the system-held markers (none remain since D857). The
904
903
  * session signing key has no marker; it now resolves `missing`, and
905
904
  * `local-auth` generates a new one (everyone signs in again).
906
905
  * 5. One `delete` event per archived ref, so every keeper reloads.
@@ -1,6 +1,6 @@
1
- import { Hr as formatSecretScope, P as KEYCHAIN_RESET_TRIGGER_ACTOR, Qr as normalizeSecretOwner, br as BaseAddon, fi as EventCategory, nn as keychainCapability, ti as parseSecretRef, tn as keychainAdminCapability } from "../../dist-CYcBqnXk.mjs";
2
- import { d as JWT_SIGNING_KEY_REF, n as DEVICE_CA_KEY_REF, p as SYSTEM_SECRET_OWNER } from "../../device-ca-CDjGQQPd.mjs";
3
- import { a as MESH_CA_KEY_REF, p as CLUSTER_SECRET_SETTINGS_KEY } from "../../constants-CrMPWOug.mjs";
1
+ import { P as KEYCHAIN_RESET_TRIGGER_ACTOR, Qr as normalizeSecretOwner, Ur as formatSecretScope, di as EventCategory, nn as keychainAdminCapability, rn as keychainCapability, ti as parseSecretRef, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
+ import { d as JWT_SIGNING_KEY_REF, n as DEVICE_CA_KEY_REF, p as SYSTEM_SECRET_OWNER } from "../../device-ca-BNM5ai4t.mjs";
3
+ import { a as MESH_CA_KEY_REF } from "../../constants-BFpowodq.mjs";
4
4
  import { n as getPlatformKeychainKey } from "../../platform-key-source-BWlq0jjn.mjs";
5
5
  import { createCipheriv, createDecipheriv, createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
6
6
  import { restrictDirToOwnerSync, restrictFileToOwnerSync, writeOwnerOnlyFileSync } from "@camstack/types/node";
@@ -330,7 +330,7 @@ async function applyKeychainResetTrigger(input) {
330
330
  }
331
331
  await consume(file, logger);
332
332
  const toReenter = ((await service.resetReport().catch(() => null))?.pendingReentry ?? []).map((m) => `${m.owner}:${m.scope}:${m.fieldPath}`);
333
- logger.error("*** KEYCHAIN RESET by the RESET_KEYCHAIN trigger file *** Every stored secret was archived (unreadable without the lost master key) and a new master key and data key were created. Every secret field now reads \"not set\" — re-enter them (System → Secrets lists them). The session signing key is regenerated: everyone signs in again. The cluster secret was cleared: set it again in System → Cluster if agents used one.", {
333
+ logger.error("*** KEYCHAIN RESET by the RESET_KEYCHAIN trigger file *** Every stored secret was archived (unreadable without the lost master key) and a new master key and data key were created. Every secret field now reads \"not set\" — re-enter them (System → Secrets lists them). The session signing key is regenerated: everyone signs in again.", {
334
334
  lockedReason: state.reason,
335
335
  archived: record.archived,
336
336
  archivedCollection: record.archivedCollection,
@@ -354,7 +354,7 @@ var PROCESS_HELD_SECRET_REFS = new Set([
354
354
  DEVICE_CA_KEY_REF
355
355
  ]);
356
356
  /** `system-settings` keys that may hold a system-owned secret's marker. */
357
- var SYSTEM_SECRET_SETTINGS_KEYS = [CLUSTER_SECRET_SETTINGS_KEY];
357
+ var SYSTEM_SECRET_SETTINGS_KEYS = [];
358
358
  var KeychainLockedError = class extends Error {
359
359
  reason;
360
360
  constructor(reason) {
@@ -893,8 +893,7 @@ var KeychainService = class {
893
893
  * 2. Archive every value AND every wrapped data key — the archive stays
894
894
  * openable if the lost master key turns up.
895
895
  * 3. New data key under the new master key ({@link firstBoot}).
896
- * 4. Clear the system-held markers (the cluster secret's): a marker pointing
897
- * at an archived value would refuse every agent forever (D797). The
896
+ * 4. Clear the system-held markers (none remain since D857). The
898
897
  * session signing key has no marker; it now resolves `missing`, and
899
898
  * `local-auth` generates a new one (everyone signs in again).
900
899
  * 5. One `delete` event per archived ref, so every keeper reloads.
@@ -122,8 +122,7 @@ export declare class KeychainService {
122
122
  * 2. Archive every value AND every wrapped data key — the archive stays
123
123
  * openable if the lost master key turns up.
124
124
  * 3. New data key under the new master key ({@link firstBoot}).
125
- * 4. Clear the system-held markers (the cluster secret's): a marker pointing
126
- * at an archived value would refuse every agent forever (D797). The
125
+ * 4. Clear the system-held markers (none remain since D857). The
127
126
  * session signing key has no marker; it now resolves `missing`, and
128
127
  * `local-auth` generates a new one (everyone signs in again).
129
128
  * 5. One `delete` event per archived ref, so every keeper reloads.
@@ -7,13 +7,13 @@
7
7
  * offered for deletion as an orphan.
8
8
  * - The mesh CA key is HELD the same way (mesh mTLS issuance); the public
9
9
  * certificate lives in `system-settings` `cluster.meshCa`.
10
- * - The cluster secret is a `password` field of `system-config` (System →
11
- * Cluster): its marker lives in the `system-settings` row
12
- * `cluster.clusterSecret`, like any other form-owned secret.
10
+ * - No form-owned system secret remains: the cluster secret was removed (D857) and the
11
+ * mesh certificate is the node identity. A `system/global/clusterSecret` entry left in
12
+ * the keychain by an older hub is NOT recognised here, so it reads as an orphan the
13
+ * operator deletes by hand; nothing reads or writes it any more.
13
14
  */
14
15
  import type { SystemHeldSecretName } from "@camstack/types";
15
16
  import { SYSTEM_SECRET_OWNER } from "../../auth/jwt-signing-key.js";
16
- import { CLUSTER_SECRET_REF } from "../../kernel/moleculer/cluster-secret.js";
17
17
  import { MESH_CA_KEY_REF } from "../../kernel/moleculer/mesh-mtls/constants.js";
18
18
  export { SYSTEM_SECRET_OWNER };
19
19
  /** The refs `keychain-admin.setSystemSecret` may write, by name. */
@@ -22,4 +22,4 @@ export declare const SYSTEM_HELD_SECRET_REFS: Readonly<Record<SystemHeldSecretNa
22
22
  export declare const PROCESS_HELD_SECRET_REFS: ReadonlySet<string>;
23
23
  /** `system-settings` keys that may hold a system-owned secret's marker. */
24
24
  export declare const SYSTEM_SECRET_SETTINGS_KEYS: readonly string[];
25
- export { CLUSTER_SECRET_REF, MESH_CA_KEY_REF };
25
+ export { MESH_CA_KEY_REF };
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-CCH3XPqO.js");
3
+ const require_dist = require("../../dist-DVe0Nsp8.js");
4
4
  //#region src/builtins/liveness-monitor/liveness-checks.ts
5
5
  var NO_DEVICES = "liveness:no-devices";
6
6
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -1,4 +1,4 @@
1
- import { B as RECORDING_SOURCE_CAMSTACK_ADDON, Ir as createEvent, V as RecordingStatusSchema, br as BaseAddon, fi as EventCategory, yr as errMsg } from "../../dist-CYcBqnXk.mjs";
1
+ import { H as RecordingStatusSchema, Lr as createEvent, V as RECORDING_SOURCE_CAMSTACK_ADDON, br as errMsg, di as EventCategory, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
2
2
  //#region src/builtins/liveness-monitor/liveness-checks.ts
3
3
  var NO_DEVICES = "liveness:no-devices";
4
4
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -3,10 +3,10 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-CCH3XPqO.js");
6
+ const require_dist = require("../../dist-DVe0Nsp8.js");
7
7
  const require_safe_buffer$1 = require("../../safe-buffer-D3aoa-7X.js");
8
8
  const require_ms$1 = require("../../ms-LB3giGoU.js");
9
- const require_device_ca = require("../../device-ca-D21ZP00q.js");
9
+ const require_device_ca = require("../../device-ca-CuWuRW9N.js");
10
10
  let node_crypto = require("node:crypto");
11
11
  node_crypto = require_chunk.__toESM(node_crypto);
12
12
  let crypto$1 = require("crypto");
@@ -1,8 +1,8 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
2
- import { C as DEVICE_ENROLLMENT_TTL_MS, G as SsoBridgeClaimsSchema, W as ScopedTokenSchema, Wt as formatDeviceRevoker, X as UserRecordSchema, Zn as userManagementCapability, a as ApiKeyRecordSchema, br as BaseAddon, kt as deviceCredentialsCapability, ot as buildDeviceEnrollmentLink, st as buildDeviceSignatureMessage, tt as authProviderCapability, w as DEVICE_NONCE_TTL_MS } from "../../dist-CYcBqnXk.mjs";
2
+ import { At as deviceCredentialsCapability, C as DEVICE_ENROLLMENT_TTL_MS, G as ScopedTokenSchema, Gt as formatDeviceRevoker, K as SsoBridgeClaimsSchema, Qn as userManagementCapability, Z as UserRecordSchema, a as ApiKeyRecordSchema, ct as buildDeviceSignatureMessage, nt as authProviderCapability, st as buildDeviceEnrollmentLink, w as DEVICE_NONCE_TTL_MS, xr as BaseAddon } from "../../dist-DjD2M79P.mjs";
3
3
  import { t as require_safe_buffer } from "../../safe-buffer-B1OjL1I9.mjs";
4
4
  import { t as require_ms } from "../../ms-CgH2OFlD.mjs";
5
- import { _ as setProcessJwtSigningKey, a as importDevicePublicKey, c as rebuildDeviceCaCertificate, d as JWT_SIGNING_KEY_REF, g as processJwtSigningKey, h as loadJwtSigningKey, i as generateDeviceCa, l as verifyDeviceLeaf, m as getProcessJwtSigningKeyState, n as DEVICE_CA_KEY_REF, o as issueDeviceLeaf, r as DEVICE_CA_SETTINGS_SECTION, s as loadDeviceCa, t as DEVICE_CA_FIELD, u as verifyDeviceSignature } from "../../device-ca-CDjGQQPd.mjs";
5
+ import { _ as setProcessJwtSigningKey, a as importDevicePublicKey, c as rebuildDeviceCaCertificate, d as JWT_SIGNING_KEY_REF, g as processJwtSigningKey, h as loadJwtSigningKey, i as generateDeviceCa, l as verifyDeviceLeaf, m as getProcessJwtSigningKeyState, n as DEVICE_CA_KEY_REF, o as issueDeviceLeaf, r as DEVICE_CA_SETTINGS_SECTION, s as loadDeviceCa, t as DEVICE_CA_FIELD, u as verifyDeviceSignature } from "../../device-ca-BNM5ai4t.mjs";
6
6
  import * as crypto$1 from "node:crypto";
7
7
  import { X509Certificate, createHash, randomUUID, timingSafeEqual } from "node:crypto";
8
8
  import nodeCrypto from "crypto";
@@ -75,6 +75,8 @@ export declare class LocalNetworkAddon extends BaseAddon<LocalNetworkConfig> {
75
75
  /** Optional public hostname tracked from `NetworkTunnelStarted`/
76
76
  * `Stopped` events on the bus. */
77
77
  private publicHostname;
78
+ /** False for a Quick tunnel: shown in the palette, never picked automatically (D860). */
79
+ private publicHostnameStable;
78
80
  /**
79
81
  * Mesh-reachable endpoint (Tailscale MagicDNS / 100.x), learned from
80
82
  * the `MeshNetworkChanged` event-tail and refreshed by a pull-reconcile
@@ -142,7 +144,7 @@ export declare class LocalNetworkAddon extends BaseAddon<LocalNetworkConfig> {
142
144
  * `onInitialize`. This setter exists for tests + future direct
143
145
  * callers; cleared by passing an empty string.
144
146
  */
145
- setPublicHostname(hostname: string): void;
147
+ setPublicHostname(hostname: string, stable?: boolean): void;
146
148
  /**
147
149
  * Replace the cached mesh endpoint. Set from the `MeshNetworkChanged`
148
150
  * event-tail + the pull-reconcile; exposed for tests + future direct
@@ -270,7 +272,7 @@ export interface LanHttpAdvertisement {
270
272
  * only emitted on `includeAppLink: true`.
271
273
  */
272
274
  export declare function appLinkEndpoint(): ConnectionEndpoint;
273
- export declare function buildEndpoints(interfaces: readonly LocalInterface[], port: number, includeLoopback: boolean, ipv4Only: boolean, publicHostname: string, scheme?: "http" | "https", meshEndpoint?: MeshEndpointCache | null, lanHttp?: LanHttpAdvertisement | null): ConnectionEndpoint[];
275
+ export declare function buildEndpoints(interfaces: readonly LocalInterface[], port: number, includeLoopback: boolean, ipv4Only: boolean, publicHostname: string, scheme?: "http" | "https", meshEndpoint?: MeshEndpointCache | null, lanHttp?: LanHttpAdvertisement | null, publicHostnameStable?: boolean): ConnectionEndpoint[];
274
276
  /**
275
277
  * First-boot heuristic: which addresses should the allowlist start
276
278
  * with? Includes LAN + Wi-Fi IPv4 addresses + plausible IPv6:
@@ -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-CCH3XPqO.js");
3
+ const require_dist = require("../../dist-DVe0Nsp8.js");
4
4
  const require_hub_mdns_ciao = require("../../hub-mdns-ciao-CBLvq2oj.js");
5
5
  let zod = require("zod");
6
6
  let node_net = require("node:net");
@@ -608,6 +608,8 @@ var LocalNetworkAddon = class extends require_dist.BaseAddon {
608
608
  /** Optional public hostname tracked from `NetworkTunnelStarted`/
609
609
  * `Stopped` events on the bus. */
610
610
  publicHostname = "";
611
+ /** False for a Quick tunnel: shown in the palette, never picked automatically (D860). */
612
+ publicHostnameStable = true;
611
613
  /**
612
614
  * Mesh-reachable endpoint (Tailscale MagicDNS / 100.x), learned from
613
615
  * the `MeshNetworkChanged` event-tail and refreshed by a pull-reconcile
@@ -783,7 +785,7 @@ var LocalNetworkAddon = class extends require_dist.BaseAddon {
783
785
  httpPort: this.resolvedHttpPort(),
784
786
  httpsPort,
785
787
  localHostname: this.config.localHostname || null
786
- } : null);
788
+ } : null, this.publicHostnameStable);
787
789
  }
788
790
  async onInitialize() {
789
791
  if (!this.config.bootSeeded) {
@@ -916,11 +918,14 @@ var LocalNetworkAddon = class extends require_dist.BaseAddon {
916
918
  }, ALLOWLIST_RECONCILE_INTERVAL_MS);
917
919
  this.allowlistTimer.unref?.();
918
920
  this.ctx.eventBus?.subscribe({ category: require_dist.EventCategory.NetworkTunnelStarted }, (event) => {
919
- const data = event.data ?? {};
920
- if (typeof data.url === "string") try {
921
- const hostname = new URL(data.url).hostname;
922
- if (hostname && !hostname.endsWith(".placeholder") && !hostname.startsWith("pending.")) this.setPublicHostname(hostname);
923
- } catch {}
921
+ const parsed = require_dist.NetworkTunnelStartedDataSchema.safeParse(event.data ?? {});
922
+ if (parsed.success) {
923
+ const data = parsed.data;
924
+ try {
925
+ const hostname = new URL(data.url).hostname;
926
+ if (hostname && !hostname.endsWith(".placeholder") && !hostname.startsWith("pending.")) this.setPublicHostname(hostname, data.stable !== false);
927
+ } catch {}
928
+ }
924
929
  });
925
930
  this.ctx.eventBus?.subscribe({ category: require_dist.EventCategory.NetworkTunnelStopped }, () => this.setPublicHostname(""));
926
931
  this.ctx.eventBus?.subscribe({ category: require_dist.EventCategory.MeshNetworkChanged }, (event) => {
@@ -1031,10 +1036,14 @@ var LocalNetworkAddon = class extends require_dist.BaseAddon {
1031
1036
  * `onInitialize`. This setter exists for tests + future direct
1032
1037
  * callers; cleared by passing an empty string.
1033
1038
  */
1034
- setPublicHostname(hostname) {
1035
- if (this.publicHostname === hostname) return;
1039
+ setPublicHostname(hostname, stable = true) {
1040
+ if (this.publicHostname === hostname && this.publicHostnameStable === stable) return;
1036
1041
  this.publicHostname = hostname;
1037
- this.ctx.logger.info("local-network: public hostname updated", { meta: { hostname: hostname || "(cleared)" } });
1042
+ this.publicHostnameStable = stable;
1043
+ this.ctx.logger.info("local-network: public hostname updated", { meta: {
1044
+ hostname: hostname || "(cleared)",
1045
+ stable
1046
+ } });
1038
1047
  }
1039
1048
  /**
1040
1049
  * Replace the cached mesh endpoint. Set from the `MeshNetworkChanged`
@@ -1363,7 +1372,7 @@ function appLinkEndpoint() {
1363
1372
  priority: -1
1364
1373
  };
1365
1374
  }
1366
- function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostname, scheme = "http", meshEndpoint = null, lanHttp = null) {
1375
+ function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostname, scheme = "http", meshEndpoint = null, lanHttp = null, publicHostnameStable = true) {
1367
1376
  const out = [];
1368
1377
  let priority = 0;
1369
1378
  const preferred = pickPreferred(interfaces);
@@ -1406,13 +1415,14 @@ function buildEndpoints(interfaces, port, includeLoopback, ipv4Only, publicHostn
1406
1415
  emit(iface, "lan-ipv6", `${formatKind(iface.kind)} — ${iface.name} (IPv6)`, `${lanScheme}://[${iface.address}]:${lanPort}`, 10 + priority++);
1407
1416
  }
1408
1417
  if (publicHostname) out.push({
1409
- label: "Public tunnel",
1418
+ label: publicHostnameStable ? "Public tunnel" : "Public tunnel (temporary address)",
1410
1419
  baseUrl: `https://${publicHostname}`,
1411
1420
  kind: "public",
1412
1421
  interfaceKind: "public",
1413
1422
  plausible: true,
1414
1423
  plausibleReason: "",
1415
- priority: 100
1424
+ priority: 100,
1425
+ ...publicHostnameStable ? {} : { stable: false }
1416
1426
  });
1417
1427
  if (meshEndpoint && meshEndpoint.host) out.push({
1418
1428
  label: "Mesh (Tailscale)",