@camstack/system 1.2.396 → 1.2.398

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.
@@ -5,7 +5,7 @@ Object.defineProperties(exports, {
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
6
  const require_dist = require("../../dist-CME5sVBJ.js");
7
7
  const require_jwt_signing_key = require("../../jwt-signing-key-CyoJaT3C.js");
8
- const require_constants = require("../../constants-Bz9gKWe8.js");
8
+ const require_constants = require("../../constants-Dcecs0Ks.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 node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { E as KEYCHAIN_RESET_TRIGGER_ACTOR, Gr as parseSecretRef, Gt as keychainAdminCapability, Hr as normalizeSecretOwner, Kt as keychainCapability, Mr as formatSecretScope, dr as BaseAddon, ri as EventCategory } from "../../dist-0P1gm4Gd.mjs";
2
2
  import { r as SYSTEM_SECRET_OWNER, t as JWT_SIGNING_KEY_REF } from "../../jwt-signing-key-DK-IFI9j.mjs";
3
- import { m as CLUSTER_SECRET_SETTINGS_KEY, o as MESH_CA_KEY_REF } from "../../constants-C1WoQ0E8.mjs";
3
+ import { a as MESH_CA_KEY_REF, p as CLUSTER_SECRET_SETTINGS_KEY } from "../../constants-5vADty9I.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 * as path$1 from "node:path";
@@ -7,17 +7,9 @@ export declare class SystemConfigAddon extends BaseAddon {
7
7
  readonly id = "system-config";
8
8
  private clusterSecretKeeper;
9
9
  private meshCaKeeper;
10
- /** One warn per process when a retired cutover key is posted with a cluster save. */
11
- private retiredClusterCutoverPatchWarned;
12
10
  constructor();
13
11
  protected onInitialize(): Promise<AddonInitResult<typeof systemConfigMeshActions>>;
14
12
  protected onShutdown(): Promise<void>;
15
- /**
16
- * Boot: a stored `meshClearPort: off` is the operator's standing choice, so it
17
- * is applied WITHOUT the agents gate (nobody is connected yet to be checked).
18
- * Default `on` changes nothing.
19
- */
20
- private applyStoredClearPort;
21
13
  private onMeshCaReady;
22
14
  private mintJoinToken;
23
15
  /** D821 — short-lived ticket for the agent's `:4444` unlock session. */
@@ -45,8 +37,6 @@ export declare class SystemConfigAddon extends BaseAddon {
45
37
  * enforced (D821) — a legacy `meshAuth` in the patch is ignored.
46
38
  */
47
39
  private writeClusterSection;
48
- /** Cutover keys were removed from the Cluster form; ignore stray posts from stale clients. */
49
- private warnRetiredClusterCutoverPatch;
50
40
  /** Persist + publish mesh auth mode (always `enforced` after D821). */
51
41
  private writeMeshAuthMode;
52
42
  /**
@@ -5,7 +5,7 @@ Object.defineProperties(exports, {
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
6
  const require_dist = require("../../dist-CME5sVBJ.js");
7
7
  const require_ms$1 = require("../../ms-t68_FaqE.js");
8
- const require_constants$8 = require("../../constants-Bz9gKWe8.js");
8
+ const require_constants$8 = require("../../constants-Dcecs0Ks.js");
9
9
  const require_x509_es = require("../../x509.es-BhTzcFhZ.js");
10
10
  let zod = require("zod");
11
11
  let node_crypto = require("node:crypto");
@@ -607,67 +607,23 @@ function processMeshCrl() {
607
607
  return crl;
608
608
  }
609
609
  //#endregion
610
- //#region src/kernel/moleculer/mesh-mtls/mesh-clear-port.ts
611
- /** The field key inside the `cluster` section. */
612
- var MESH_CLEAR_PORT_FIELD = "meshClearPort";
613
- function isMeshClearPortMode(value) {
614
- return value === "on" || value === "off";
615
- }
616
- /** A stored value that is not a mode reads as `on`: never cut the mesh on a typo. */
617
- function parseMeshClearPortMode(value) {
618
- return isMeshClearPortMode(value) ? value : "on";
619
- }
620
- /** Pure: may the clear port be switched off right now? */
621
- function decideMeshClearPortOff(control) {
622
- if (control === null) return {
623
- allowed: false,
624
- blocking: [],
625
- error: "The clear mesh port can only be switched off on the hub (no mesh transport here)."
626
- };
627
- if (!control.isTlsListening()) return {
628
- allowed: false,
629
- blocking: [],
630
- error: "Refusing to close the clear mesh port: the TLS listener (:6443) is not up yet, so no node could reach the hub."
631
- };
632
- const blocking = control.listOnlineAgents().filter((agent) => agent.transport !== "tls").map((agent) => agent.nodeId).toSorted();
633
- if (blocking.length > 0) return {
634
- allowed: false,
635
- blocking,
636
- error: `Refusing to close the clear mesh port: ${blocking.join(", ")} still ${blocking.length === 1 ? "connects" : "connect"} in clear. Enroll ${blocking.length === 1 ? "it" : "each"} with a join token first (System → Cluster → Add agent).`
637
- };
638
- return { allowed: true };
610
+ //#region src/kernel/moleculer/mesh-mtls/mesh-peer-transport.ts
611
+ var LOOKUP_SLOT = Symbol.for("camstack.cluster.mesh-peer-transport-lookup");
612
+ /** Published by the hub broker owner; cleared on shutdown. */
613
+ function setProcessMeshPeerTransportLookup(lookup) {
614
+ if (lookup === null) Reflect.deleteProperty(globalThis, LOOKUP_SLOT);
615
+ else Reflect.set(globalThis, LOOKUP_SLOT, lookup);
639
616
  }
640
- var CONTROL_SLOT = Symbol.for("camstack.cluster.mesh-clear-port-control");
641
- /** Published by the hub's broker owner; cleared on shutdown. */
642
- function setProcessMeshClearPortControl(control) {
643
- if (control === null) Reflect.deleteProperty(globalThis, CONTROL_SLOT);
644
- else Reflect.set(globalThis, CONTROL_SLOT, control);
617
+ function isMeshPeerTransportLookup(value) {
618
+ return value !== null && typeof value === "object" && typeof Reflect.get(value, "transportOf") === "function";
645
619
  }
646
- function isMeshClearPortControl(value) {
647
- return value !== null && typeof value === "object" && typeof Reflect.get(value, "listOnlineAgents") === "function" && typeof Reflect.get(value, "isTlsListening") === "function" && typeof Reflect.get(value, "apply") === "function" && typeof Reflect.get(value, "transportOf") === "function";
648
- }
649
- function getProcessMeshClearPortControl() {
650
- const value = Reflect.get(globalThis, CONTROL_SLOT);
651
- return isMeshClearPortControl(value) ? value : null;
620
+ function getProcessMeshPeerTransportLookup() {
621
+ const value = Reflect.get(globalThis, LOOKUP_SLOT);
622
+ return isMeshPeerTransportLookup(value) ? value : null;
652
623
  }
653
624
  /** `tls` / `clear` for an agent as the hub sees it; `undefined` off the hub. */
654
625
  function getProcessNodeMeshTransport(nodeId) {
655
- return getProcessMeshClearPortControl()?.transportOf(nodeId);
656
- }
657
- /**
658
- * Validate a requested mode against the live mesh. `on` is always allowed; `off`
659
- * only when {@link decideMeshClearPortOff} allows. Does NOT apply it.
660
- */
661
- function checkProcessMeshClearPort(mode) {
662
- if (mode === "on") return { allowed: true };
663
- return decideMeshClearPortOff(getProcessMeshClearPortControl());
664
- }
665
- /** Apply a mode that {@link checkProcessMeshClearPort} allowed. No-op where nobody can. */
666
- async function applyProcessMeshClearPort(mode) {
667
- const control = getProcessMeshClearPortControl();
668
- if (control === null) return false;
669
- await control.apply(mode);
670
- return true;
626
+ return getProcessMeshPeerTransportLookup()?.transportOf(nodeId);
671
627
  }
672
628
  //#endregion
673
629
  //#region ../../node_modules/jose/dist/webapi/lib/buffer_utils.js
@@ -87469,11 +87425,12 @@ import_moleculer.default.Validators;
87469
87425
  //#endregion
87470
87426
  //#region src/kernel/moleculer/mesh-mtls/tls-tcp-transporter.ts
87471
87427
  /**
87472
- * Moleculer TCP transporter with a second mTLS listener (Release A).
87428
+ * Moleculer TCP transporter with a mutual-TLS listener (D826).
87473
87429
  *
87474
- * Hub rollout: clear TCP stays on `port` (default 6000); TLS 1.3 mutual auth
87475
- * listens on `tlsPort` (default 6443). Agents without a certificate keep using
87476
- * 6000. On a TLS socket, any packet whose `sender` ≠ the peer certificate CN
87430
+ * Hub: `hubTlsOnly` — no clear TCP reader and no UDP discovery; TLS 1.3 on
87431
+ * `tlsPort` (default 6443) once mesh material is ready. Agents without mesh
87432
+ * material use clear TCP on their own listen port and dial the hub on TLS when
87433
+ * enrolled. On a TLS socket, any packet whose `sender` ≠ the peer certificate CN
87477
87434
  * is dropped.
87478
87435
  */
87479
87436
  var TcpTransporterBase = Transporters.TCP;
@@ -87517,6 +87474,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87517
87474
  /** Node id (certificate CN) → serial of every peer that completed a mutual-TLS handshake. */
87518
87475
  tlsPeers = /* @__PURE__ */ new Map();
87519
87476
  clearDisabled = false;
87477
+ hubTlsOnly;
87520
87478
  /** Clear-text `TcpWriter.connect` captured once before the TLS wrap (A→B). */
87521
87479
  clearWriterConnect = null;
87522
87480
  writerTlsPatched = false;
@@ -87524,6 +87482,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87524
87482
  super({ ...opts });
87525
87483
  this.meshTls = opts.meshTls ?? null;
87526
87484
  this.crl = opts.crl ?? processMeshCrl();
87485
+ this.hubTlsOnly = opts.hubTlsOnly === true;
87527
87486
  if (this.opts.tlsPort === void 0) this.opts.tlsPort = require_constants$8.DEFAULT_HUB_TLS_TCP_PORT;
87528
87487
  }
87529
87488
  startTcpServer() {
@@ -87534,7 +87493,9 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87534
87493
  connect() {
87535
87494
  return this.Promise.resolve().then(() => {
87536
87495
  if (this.opts.urls) return this.loadUrls();
87537
- }).then(() => this.startTcpServer()).then(() => this.startTlsServerIfReady()).then(() => this.startUdpServer()).then(() => this.startTimers()).then(() => {
87496
+ }).then(() => this.startTcpServer()).then(() => {
87497
+ if (this.hubTlsOnly) this.disableClearTransport();
87498
+ }).then(() => this.startTlsServerIfReady()).then(() => this.hubTlsOnly ? this.Promise.resolve() : this.startUdpServer()).then(() => this.startTimers()).then(() => {
87538
87499
  this.logger.info("TCP Transporter started.");
87539
87500
  this.connected = true;
87540
87501
  this.nodes.localNode.port = this.opts.port;
@@ -87684,6 +87645,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87684
87645
  }
87685
87646
  /** The switch back: listen on the clear port again and restart UDP discovery. Idempotent. */
87686
87647
  async enableClearTransport() {
87648
+ if (this.hubTlsOnly) return;
87687
87649
  if (!this.clearDisabled) return;
87688
87650
  this.clearDisabled = false;
87689
87651
  if (this.reader !== null && this.reader.server?.listening !== true) await this.reader.listen();
@@ -87971,7 +87933,7 @@ var mintJoinTokenInputSchema = zod.z.object({
87971
87933
  nodeId: zod.z.string().min(1).optional(),
87972
87934
  /** Override hub HTTPS base (default: local-network publicEndpoint). */
87973
87935
  hubUrl: zod.z.string().url().optional(),
87974
- /** Override `host:6000` clear mesh address carried in the token. */
87936
+ /** Override `host:6443` TLS mesh address carried in the token. */
87975
87937
  hubMeshAddress: zod.z.string().min(3).optional(),
87976
87938
  /** Seconds until expiry; capped at 1 h. */
87977
87939
  ttlSec: zod.z.number().int().positive().max(3600).optional()
@@ -88072,9 +88034,7 @@ var KEY_TO_SECTION = {
88072
88034
  trustedProxies: "auth",
88073
88035
  trustedNetworks: "auth",
88074
88036
  [CLUSTER_SECRET_FIELD]: "cluster",
88075
- [MESH_AUTH_MODE_FIELD]: "cluster",
88076
- [MESH_CLEAR_PORT_FIELD]: "cluster",
88077
- [AGENT_DASHBOARD_ORIGINS_FIELD]: "cluster"
88037
+ [MESH_AUTH_MODE_FIELD]: "cluster"
88078
88038
  };
88079
88039
  /** Bytes of a generated cluster secret (D802) — 256 bits, base64url (43 chars). */
88080
88040
  var GENERATED_SECRET_BYTES = 32;
@@ -88102,8 +88062,6 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88102
88062
  id = "system-config";
88103
88063
  clusterSecretKeeper = null;
88104
88064
  meshCaKeeper = null;
88105
- /** One warn per process when a retired cutover key is posted with a cluster save. */
88106
- retiredClusterCutoverPatchWarned = false;
88107
88065
  constructor() {
88108
88066
  super({});
88109
88067
  }
@@ -88132,7 +88090,6 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88132
88090
  onReady: (ca) => this.onMeshCaReady(ca)
88133
88091
  });
88134
88092
  await this.meshCaKeeper.start();
88135
- await this.applyStoredClearPort();
88136
88093
  this.ctx.logger.info("Initialized — exposes yml-backed sections via getGlobalSettings");
88137
88094
  return {
88138
88095
  customActions: systemConfigMeshActions,
@@ -88149,20 +88106,6 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88149
88106
  this.clusterSecretKeeper?.stop();
88150
88107
  this.clusterSecretKeeper = null;
88151
88108
  }
88152
- /**
88153
- * Boot: a stored `meshClearPort: off` is the operator's standing choice, so it
88154
- * is applied WITHOUT the agents gate (nobody is connected yet to be checked).
88155
- * Default `on` changes nothing.
88156
- */
88157
- async applyStoredClearPort() {
88158
- try {
88159
- const stored = (await this.ctx.settings?.getSection("cluster"))?.[MESH_CLEAR_PORT_FIELD];
88160
- if (parseMeshClearPortMode(stored) !== "off") return;
88161
- if (await applyProcessMeshClearPort("off")) this.ctx.logger.info("Mesh clear port is OFF (cluster.meshClearPort)");
88162
- } catch (err) {
88163
- this.ctx.logger.warn("could not apply cluster.meshClearPort at boot", { meta: { error: require_dist.errMsg(err) } });
88164
- }
88165
- }
88166
88109
  async onMeshCaReady(ca) {
88167
88110
  const hubLeaf = await issueMeshLeafForNode(ca, "hub");
88168
88111
  await requestProcessMeshTlsEnable({
@@ -88240,10 +88183,10 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88240
88183
  async resolveHubMeshAddress() {
88241
88184
  try {
88242
88185
  const base = (await this.ctx.api?.localNetwork?.getAddresses?.query({}))?.roles?.internal?.resolved;
88243
- if (typeof base === "string" && base.length > 0) return `${new URL(base).hostname}:${require_constants$8.DEFAULT_HUB_TCP_PORT}`;
88186
+ if (typeof base === "string" && base.length > 0) return `${new URL(base).hostname}:${require_constants$8.DEFAULT_HUB_TLS_TCP_PORT}`;
88244
88187
  } catch {}
88245
88188
  const host = (await this.ctx.settings?.getSection("server"))?.["host"];
88246
- return `${typeof host === "string" && host.length > 0 && host !== "0.0.0.0" ? host : "127.0.0.1"}:${require_constants$8.DEFAULT_HUB_TCP_PORT}`;
88189
+ return `${typeof host === "string" && host.length > 0 && host !== "0.0.0.0" ? host : "127.0.0.1"}:${require_constants$8.DEFAULT_HUB_TLS_TCP_PORT}`;
88247
88190
  }
88248
88191
  /** The keychain handle for owner `system`; `null` where there is no door. */
88249
88192
  systemSecrets() {
@@ -88384,6 +88327,14 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88384
88327
  if (!this.ctx.settings) throw new Error("system-config: ctx.settings not available — cannot write sections");
88385
88328
  const perSection = /* @__PURE__ */ new Map();
88386
88329
  for (const [key, value] of Object.entries(patch)) {
88330
+ if (key === "meshClearPort") {
88331
+ this.ctx.logger.warn("cluster.meshClearPort is retired (D826) — the hub mesh is TLS-only; ignoring this patch");
88332
+ continue;
88333
+ }
88334
+ if (key === "agentDashboardOrigins") {
88335
+ this.ctx.logger.warn("cluster.agentDashboardOrigins is no longer writable from settings — ignoring this patch");
88336
+ continue;
88337
+ }
88387
88338
  const section = KEY_TO_SECTION[key];
88388
88339
  if (section === void 0) {
88389
88340
  this.ctx.logger.warn("update ignored unknown key (not mapped to any section)", { meta: { key } });
@@ -88424,8 +88375,7 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88424
88375
  * enforced (D821) — a legacy `meshAuth` in the patch is ignored.
88425
88376
  */
88426
88377
  async writeClusterSection(patch) {
88427
- const { [MESH_AUTH_MODE_FIELD]: _legacyMode, [MESH_CLEAR_PORT_FIELD]: clearPort, [AGENT_DASHBOARD_ORIGINS_FIELD]: dashboardOrigins, ...secretPatch } = patch;
88428
- if (clearPort !== void 0 || dashboardOrigins !== void 0) this.warnRetiredClusterCutoverPatch(clearPort !== void 0, dashboardOrigins !== void 0);
88378
+ const { [MESH_AUTH_MODE_FIELD]: _legacyMode, ...secretPatch } = patch;
88429
88379
  await this.writeMeshAuthMode("enforced");
88430
88380
  if (Object.keys(secretPatch).length === 0) return;
88431
88381
  if (require_dist.isSecretClear(secretPatch["clusterSecret"])) throw new Error("The cluster secret is mandatory and cannot be cleared — save a new value to rotate it");
@@ -88433,15 +88383,6 @@ var SystemConfigAddon = class extends require_dist.BaseAddon {
88433
88383
  this.ctx.logger.info("Cluster secret updated");
88434
88384
  await this.clusterSecretKeeper?.reload();
88435
88385
  }
88436
- /** Cutover keys were removed from the Cluster form; ignore stray posts from stale clients. */
88437
- warnRetiredClusterCutoverPatch(hadMeshClearPort, hadAgentDashboardOrigins) {
88438
- if (this.retiredClusterCutoverPatchWarned) return;
88439
- this.retiredClusterCutoverPatchWarned = true;
88440
- this.ctx.logger.warn("cluster save ignored retired cutover field(s) — use Pipeline → Cluster / Nodes", { meta: {
88441
- meshClearPort: hadMeshClearPort,
88442
- agentDashboardOrigins: hadAgentDashboardOrigins
88443
- } });
88444
- }
88445
88386
  /** Persist + publish mesh auth mode (always `enforced` after D821). */
88446
88387
  async writeMeshAuthMode(mode) {
88447
88388
  await this.ctx.settings.setSection("cluster", { [MESH_AUTH_MODE_FIELD]: mode });
@@ -88527,7 +88468,6 @@ exports.AGENT_UI_UNLOCK_VERSION = AGENT_UI_UNLOCK_VERSION;
88527
88468
  exports.Errors = Errors;
88528
88469
  exports.JoinTokenJtiStore = JoinTokenJtiStore;
88529
88470
  exports.MESH_AUTH_MODE_FIELD = MESH_AUTH_MODE_FIELD;
88530
- exports.MESH_CLEAR_PORT_FIELD = MESH_CLEAR_PORT_FIELD;
88531
88471
  exports.MeshCaKeeper = MeshCaKeeper;
88532
88472
  exports.MeshCrl = MeshCrl;
88533
88473
  exports.SYSTEM_CONFIG_CLUSTER_SECTION_ID = SYSTEM_CONFIG_CLUSTER_SECTION_ID;
@@ -88536,13 +88476,10 @@ exports.SystemConfigAddon = SystemConfigAddon;
88536
88476
  exports.default = SystemConfigAddon;
88537
88477
  exports.TlsTcpTransporter = TlsTcpTransporter;
88538
88478
  exports.UnlockTicketJtiStore = UnlockTicketJtiStore;
88539
- exports.applyProcessMeshClearPort = applyProcessMeshClearPort;
88540
88479
  exports.caFingerprint = caFingerprint;
88541
88480
  exports.caFingerprintCompact = caFingerprintCompact;
88542
- exports.checkProcessMeshClearPort = checkProcessMeshClearPort;
88543
88481
  exports.createCidrMatcher = createCidrMatcher;
88544
88482
  exports.createMeshCsrPem = createMeshCsrPem;
88545
- exports.decideMeshClearPortOff = decideMeshClearPortOff;
88546
88483
  exports.enrollMeshNode = enrollMeshNode;
88547
88484
  exports.exportMeshPrivateKeyPem = exportMeshPrivateKeyPem;
88548
88485
  exports.generateMeshCa = generateMeshCa;
@@ -88569,8 +88506,8 @@ exports.requestProcessMeshEnforcement = requestProcessMeshEnforcement;
88569
88506
  exports.requireProcessMeshCa = requireProcessMeshCa;
88570
88507
  exports.setProcessMeshAuthMode = setProcessMeshAuthMode;
88571
88508
  exports.setProcessMeshAuthStatusSource = setProcessMeshAuthStatusSource;
88572
- exports.setProcessMeshClearPortControl = setProcessMeshClearPortControl;
88573
88509
  exports.setProcessMeshEnforcer = setProcessMeshEnforcer;
88510
+ exports.setProcessMeshPeerTransportLookup = setProcessMeshPeerTransportLookup;
88574
88511
  exports.setProcessMeshTlsEnabler = setProcessMeshTlsEnabler;
88575
88512
  exports.systemConfigMeshActions = systemConfigMeshActions;
88576
88513
  exports.verifyAgentUiUnlockTicket = verifyAgentUiUnlockTicket;
@@ -1,7 +1,7 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
2
2
  import { Br as makeSecretMarker, Dr as customAction, Lr as isSecretClear, Nr as hydrateSchema, Or as defineCustomActions, Qr as secretTreeFromSchema, Rr as isSecretMarker, dr as BaseAddon, ni as transformSecretWrite, ur as errMsg } from "../../dist-0P1gm4Gd.mjs";
3
3
  import { n as require_safe_buffer, t as require_ms } from "../../ms-DlIWNkkk.mjs";
4
- import { a as MESH_CA_FIELD, c as MESH_CA_VALIDITY_DAYS, f as CLUSTER_SECRET_REF, i as MESH_CA_COMMON_NAME, l as MESH_JOIN_TOKEN_MAX_TTL_SEC, n as DEFAULT_HUB_TCP_PORT, o as MESH_CA_KEY_REF, r as DEFAULT_HUB_TLS_TCP_PORT, s as MESH_CA_SETTINGS_KEY, t as CLIENT_AUTH_OID, u as SERVER_AUTH_OID, x as setProcessClusterSecretGate, y as hashClusterSecret } from "../../constants-C1WoQ0E8.mjs";
4
+ import { a as MESH_CA_KEY_REF, b as setProcessClusterSecretGate, c as MESH_JOIN_TOKEN_MAX_TTL_SEC, d as CLUSTER_SECRET_REF, i as MESH_CA_FIELD, l as SERVER_AUTH_OID, n as DEFAULT_HUB_TLS_TCP_PORT, o as MESH_CA_SETTINGS_KEY, r as MESH_CA_COMMON_NAME, s as MESH_CA_VALIDITY_DAYS, t as CLIENT_AUTH_OID, v as hashClusterSecret } from "../../constants-5vADty9I.mjs";
5
5
  import { a as KeyUsagesExtension, c as Pkcs10CertificateRequestGenerator, d as X509Certificate$1, f as X509CertificateGenerator, i as KeyUsageFlags, n as BasicConstraintsExtension, o as PemConverter, p as cryptoProvider, r as ExtendedKeyUsageExtension, s as Pkcs10CertificateRequest, t as AuthorityKeyIdentifierExtension, u as SubjectKeyIdentifierExtension } from "../../x509.es-Xf3K_brW.mjs";
6
6
  import { z } from "zod";
7
7
  import { X509Certificate, createHash, createHmac, randomBytes, timingSafeEqual, webcrypto } from "node:crypto";
@@ -598,67 +598,23 @@ function processMeshCrl() {
598
598
  return crl;
599
599
  }
600
600
  //#endregion
601
- //#region src/kernel/moleculer/mesh-mtls/mesh-clear-port.ts
602
- /** The field key inside the `cluster` section. */
603
- var MESH_CLEAR_PORT_FIELD = "meshClearPort";
604
- function isMeshClearPortMode(value) {
605
- return value === "on" || value === "off";
606
- }
607
- /** A stored value that is not a mode reads as `on`: never cut the mesh on a typo. */
608
- function parseMeshClearPortMode(value) {
609
- return isMeshClearPortMode(value) ? value : "on";
610
- }
611
- /** Pure: may the clear port be switched off right now? */
612
- function decideMeshClearPortOff(control) {
613
- if (control === null) return {
614
- allowed: false,
615
- blocking: [],
616
- error: "The clear mesh port can only be switched off on the hub (no mesh transport here)."
617
- };
618
- if (!control.isTlsListening()) return {
619
- allowed: false,
620
- blocking: [],
621
- error: "Refusing to close the clear mesh port: the TLS listener (:6443) is not up yet, so no node could reach the hub."
622
- };
623
- const blocking = control.listOnlineAgents().filter((agent) => agent.transport !== "tls").map((agent) => agent.nodeId).toSorted();
624
- if (blocking.length > 0) return {
625
- allowed: false,
626
- blocking,
627
- error: `Refusing to close the clear mesh port: ${blocking.join(", ")} still ${blocking.length === 1 ? "connects" : "connect"} in clear. Enroll ${blocking.length === 1 ? "it" : "each"} with a join token first (System → Cluster → Add agent).`
628
- };
629
- return { allowed: true };
601
+ //#region src/kernel/moleculer/mesh-mtls/mesh-peer-transport.ts
602
+ var LOOKUP_SLOT = Symbol.for("camstack.cluster.mesh-peer-transport-lookup");
603
+ /** Published by the hub broker owner; cleared on shutdown. */
604
+ function setProcessMeshPeerTransportLookup(lookup) {
605
+ if (lookup === null) Reflect.deleteProperty(globalThis, LOOKUP_SLOT);
606
+ else Reflect.set(globalThis, LOOKUP_SLOT, lookup);
630
607
  }
631
- var CONTROL_SLOT = Symbol.for("camstack.cluster.mesh-clear-port-control");
632
- /** Published by the hub's broker owner; cleared on shutdown. */
633
- function setProcessMeshClearPortControl(control) {
634
- if (control === null) Reflect.deleteProperty(globalThis, CONTROL_SLOT);
635
- else Reflect.set(globalThis, CONTROL_SLOT, control);
608
+ function isMeshPeerTransportLookup(value) {
609
+ return value !== null && typeof value === "object" && typeof Reflect.get(value, "transportOf") === "function";
636
610
  }
637
- function isMeshClearPortControl(value) {
638
- return value !== null && typeof value === "object" && typeof Reflect.get(value, "listOnlineAgents") === "function" && typeof Reflect.get(value, "isTlsListening") === "function" && typeof Reflect.get(value, "apply") === "function" && typeof Reflect.get(value, "transportOf") === "function";
639
- }
640
- function getProcessMeshClearPortControl() {
641
- const value = Reflect.get(globalThis, CONTROL_SLOT);
642
- return isMeshClearPortControl(value) ? value : null;
611
+ function getProcessMeshPeerTransportLookup() {
612
+ const value = Reflect.get(globalThis, LOOKUP_SLOT);
613
+ return isMeshPeerTransportLookup(value) ? value : null;
643
614
  }
644
615
  /** `tls` / `clear` for an agent as the hub sees it; `undefined` off the hub. */
645
616
  function getProcessNodeMeshTransport(nodeId) {
646
- return getProcessMeshClearPortControl()?.transportOf(nodeId);
647
- }
648
- /**
649
- * Validate a requested mode against the live mesh. `on` is always allowed; `off`
650
- * only when {@link decideMeshClearPortOff} allows. Does NOT apply it.
651
- */
652
- function checkProcessMeshClearPort(mode) {
653
- if (mode === "on") return { allowed: true };
654
- return decideMeshClearPortOff(getProcessMeshClearPortControl());
655
- }
656
- /** Apply a mode that {@link checkProcessMeshClearPort} allowed. No-op where nobody can. */
657
- async function applyProcessMeshClearPort(mode) {
658
- const control = getProcessMeshClearPortControl();
659
- if (control === null) return false;
660
- await control.apply(mode);
661
- return true;
617
+ return getProcessMeshPeerTransportLookup()?.transportOf(nodeId);
662
618
  }
663
619
  //#endregion
664
620
  //#region ../../node_modules/jose/dist/webapi/lib/buffer_utils.js
@@ -87460,11 +87416,12 @@ import_moleculer.default.Validators;
87460
87416
  //#endregion
87461
87417
  //#region src/kernel/moleculer/mesh-mtls/tls-tcp-transporter.ts
87462
87418
  /**
87463
- * Moleculer TCP transporter with a second mTLS listener (Release A).
87419
+ * Moleculer TCP transporter with a mutual-TLS listener (D826).
87464
87420
  *
87465
- * Hub rollout: clear TCP stays on `port` (default 6000); TLS 1.3 mutual auth
87466
- * listens on `tlsPort` (default 6443). Agents without a certificate keep using
87467
- * 6000. On a TLS socket, any packet whose `sender` ≠ the peer certificate CN
87421
+ * Hub: `hubTlsOnly` — no clear TCP reader and no UDP discovery; TLS 1.3 on
87422
+ * `tlsPort` (default 6443) once mesh material is ready. Agents without mesh
87423
+ * material use clear TCP on their own listen port and dial the hub on TLS when
87424
+ * enrolled. On a TLS socket, any packet whose `sender` ≠ the peer certificate CN
87468
87425
  * is dropped.
87469
87426
  */
87470
87427
  var TcpTransporterBase = Transporters.TCP;
@@ -87508,6 +87465,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87508
87465
  /** Node id (certificate CN) → serial of every peer that completed a mutual-TLS handshake. */
87509
87466
  tlsPeers = /* @__PURE__ */ new Map();
87510
87467
  clearDisabled = false;
87468
+ hubTlsOnly;
87511
87469
  /** Clear-text `TcpWriter.connect` captured once before the TLS wrap (A→B). */
87512
87470
  clearWriterConnect = null;
87513
87471
  writerTlsPatched = false;
@@ -87515,6 +87473,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87515
87473
  super({ ...opts });
87516
87474
  this.meshTls = opts.meshTls ?? null;
87517
87475
  this.crl = opts.crl ?? processMeshCrl();
87476
+ this.hubTlsOnly = opts.hubTlsOnly === true;
87518
87477
  if (this.opts.tlsPort === void 0) this.opts.tlsPort = DEFAULT_HUB_TLS_TCP_PORT;
87519
87478
  }
87520
87479
  startTcpServer() {
@@ -87525,7 +87484,9 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87525
87484
  connect() {
87526
87485
  return this.Promise.resolve().then(() => {
87527
87486
  if (this.opts.urls) return this.loadUrls();
87528
- }).then(() => this.startTcpServer()).then(() => this.startTlsServerIfReady()).then(() => this.startUdpServer()).then(() => this.startTimers()).then(() => {
87487
+ }).then(() => this.startTcpServer()).then(() => {
87488
+ if (this.hubTlsOnly) this.disableClearTransport();
87489
+ }).then(() => this.startTlsServerIfReady()).then(() => this.hubTlsOnly ? this.Promise.resolve() : this.startUdpServer()).then(() => this.startTimers()).then(() => {
87529
87490
  this.logger.info("TCP Transporter started.");
87530
87491
  this.connected = true;
87531
87492
  this.nodes.localNode.port = this.opts.port;
@@ -87675,6 +87636,7 @@ var TlsTcpTransporter = class extends TcpTransporterBase {
87675
87636
  }
87676
87637
  /** The switch back: listen on the clear port again and restart UDP discovery. Idempotent. */
87677
87638
  async enableClearTransport() {
87639
+ if (this.hubTlsOnly) return;
87678
87640
  if (!this.clearDisabled) return;
87679
87641
  this.clearDisabled = false;
87680
87642
  if (this.reader !== null && this.reader.server?.listening !== true) await this.reader.listen();
@@ -87961,7 +87923,7 @@ var mintJoinTokenInputSchema = z.object({
87961
87923
  nodeId: z.string().min(1).optional(),
87962
87924
  /** Override hub HTTPS base (default: local-network publicEndpoint). */
87963
87925
  hubUrl: z.string().url().optional(),
87964
- /** Override `host:6000` clear mesh address carried in the token. */
87926
+ /** Override `host:6443` TLS mesh address carried in the token. */
87965
87927
  hubMeshAddress: z.string().min(3).optional(),
87966
87928
  /** Seconds until expiry; capped at 1 h. */
87967
87929
  ttlSec: z.number().int().positive().max(3600).optional()
@@ -88062,9 +88024,7 @@ var KEY_TO_SECTION = {
88062
88024
  trustedProxies: "auth",
88063
88025
  trustedNetworks: "auth",
88064
88026
  [CLUSTER_SECRET_FIELD]: "cluster",
88065
- [MESH_AUTH_MODE_FIELD]: "cluster",
88066
- [MESH_CLEAR_PORT_FIELD]: "cluster",
88067
- [AGENT_DASHBOARD_ORIGINS_FIELD]: "cluster"
88027
+ [MESH_AUTH_MODE_FIELD]: "cluster"
88068
88028
  };
88069
88029
  /** Bytes of a generated cluster secret (D802) — 256 bits, base64url (43 chars). */
88070
88030
  var GENERATED_SECRET_BYTES = 32;
@@ -88092,8 +88052,6 @@ var SystemConfigAddon = class extends BaseAddon {
88092
88052
  id = "system-config";
88093
88053
  clusterSecretKeeper = null;
88094
88054
  meshCaKeeper = null;
88095
- /** One warn per process when a retired cutover key is posted with a cluster save. */
88096
- retiredClusterCutoverPatchWarned = false;
88097
88055
  constructor() {
88098
88056
  super({});
88099
88057
  }
@@ -88122,7 +88080,6 @@ var SystemConfigAddon = class extends BaseAddon {
88122
88080
  onReady: (ca) => this.onMeshCaReady(ca)
88123
88081
  });
88124
88082
  await this.meshCaKeeper.start();
88125
- await this.applyStoredClearPort();
88126
88083
  this.ctx.logger.info("Initialized — exposes yml-backed sections via getGlobalSettings");
88127
88084
  return {
88128
88085
  customActions: systemConfigMeshActions,
@@ -88139,20 +88096,6 @@ var SystemConfigAddon = class extends BaseAddon {
88139
88096
  this.clusterSecretKeeper?.stop();
88140
88097
  this.clusterSecretKeeper = null;
88141
88098
  }
88142
- /**
88143
- * Boot: a stored `meshClearPort: off` is the operator's standing choice, so it
88144
- * is applied WITHOUT the agents gate (nobody is connected yet to be checked).
88145
- * Default `on` changes nothing.
88146
- */
88147
- async applyStoredClearPort() {
88148
- try {
88149
- const stored = (await this.ctx.settings?.getSection("cluster"))?.[MESH_CLEAR_PORT_FIELD];
88150
- if (parseMeshClearPortMode(stored) !== "off") return;
88151
- if (await applyProcessMeshClearPort("off")) this.ctx.logger.info("Mesh clear port is OFF (cluster.meshClearPort)");
88152
- } catch (err) {
88153
- this.ctx.logger.warn("could not apply cluster.meshClearPort at boot", { meta: { error: errMsg(err) } });
88154
- }
88155
- }
88156
88099
  async onMeshCaReady(ca) {
88157
88100
  const hubLeaf = await issueMeshLeafForNode(ca, "hub");
88158
88101
  await requestProcessMeshTlsEnable({
@@ -88230,10 +88173,10 @@ var SystemConfigAddon = class extends BaseAddon {
88230
88173
  async resolveHubMeshAddress() {
88231
88174
  try {
88232
88175
  const base = (await this.ctx.api?.localNetwork?.getAddresses?.query({}))?.roles?.internal?.resolved;
88233
- if (typeof base === "string" && base.length > 0) return `${new URL(base).hostname}:${DEFAULT_HUB_TCP_PORT}`;
88176
+ if (typeof base === "string" && base.length > 0) return `${new URL(base).hostname}:${DEFAULT_HUB_TLS_TCP_PORT}`;
88234
88177
  } catch {}
88235
88178
  const host = (await this.ctx.settings?.getSection("server"))?.["host"];
88236
- return `${typeof host === "string" && host.length > 0 && host !== "0.0.0.0" ? host : "127.0.0.1"}:${DEFAULT_HUB_TCP_PORT}`;
88179
+ return `${typeof host === "string" && host.length > 0 && host !== "0.0.0.0" ? host : "127.0.0.1"}:${DEFAULT_HUB_TLS_TCP_PORT}`;
88237
88180
  }
88238
88181
  /** The keychain handle for owner `system`; `null` where there is no door. */
88239
88182
  systemSecrets() {
@@ -88374,6 +88317,14 @@ var SystemConfigAddon = class extends BaseAddon {
88374
88317
  if (!this.ctx.settings) throw new Error("system-config: ctx.settings not available — cannot write sections");
88375
88318
  const perSection = /* @__PURE__ */ new Map();
88376
88319
  for (const [key, value] of Object.entries(patch)) {
88320
+ if (key === "meshClearPort") {
88321
+ this.ctx.logger.warn("cluster.meshClearPort is retired (D826) — the hub mesh is TLS-only; ignoring this patch");
88322
+ continue;
88323
+ }
88324
+ if (key === "agentDashboardOrigins") {
88325
+ this.ctx.logger.warn("cluster.agentDashboardOrigins is no longer writable from settings — ignoring this patch");
88326
+ continue;
88327
+ }
88377
88328
  const section = KEY_TO_SECTION[key];
88378
88329
  if (section === void 0) {
88379
88330
  this.ctx.logger.warn("update ignored unknown key (not mapped to any section)", { meta: { key } });
@@ -88414,8 +88365,7 @@ var SystemConfigAddon = class extends BaseAddon {
88414
88365
  * enforced (D821) — a legacy `meshAuth` in the patch is ignored.
88415
88366
  */
88416
88367
  async writeClusterSection(patch) {
88417
- const { [MESH_AUTH_MODE_FIELD]: _legacyMode, [MESH_CLEAR_PORT_FIELD]: clearPort, [AGENT_DASHBOARD_ORIGINS_FIELD]: dashboardOrigins, ...secretPatch } = patch;
88418
- if (clearPort !== void 0 || dashboardOrigins !== void 0) this.warnRetiredClusterCutoverPatch(clearPort !== void 0, dashboardOrigins !== void 0);
88368
+ const { [MESH_AUTH_MODE_FIELD]: _legacyMode, ...secretPatch } = patch;
88419
88369
  await this.writeMeshAuthMode("enforced");
88420
88370
  if (Object.keys(secretPatch).length === 0) return;
88421
88371
  if (isSecretClear(secretPatch["clusterSecret"])) throw new Error("The cluster secret is mandatory and cannot be cleared — save a new value to rotate it");
@@ -88423,15 +88373,6 @@ var SystemConfigAddon = class extends BaseAddon {
88423
88373
  this.ctx.logger.info("Cluster secret updated");
88424
88374
  await this.clusterSecretKeeper?.reload();
88425
88375
  }
88426
- /** Cutover keys were removed from the Cluster form; ignore stray posts from stale clients. */
88427
- warnRetiredClusterCutoverPatch(hadMeshClearPort, hadAgentDashboardOrigins) {
88428
- if (this.retiredClusterCutoverPatchWarned) return;
88429
- this.retiredClusterCutoverPatchWarned = true;
88430
- this.ctx.logger.warn("cluster save ignored retired cutover field(s) — use Pipeline → Cluster / Nodes", { meta: {
88431
- meshClearPort: hadMeshClearPort,
88432
- agentDashboardOrigins: hadAgentDashboardOrigins
88433
- } });
88434
- }
88435
88376
  /** Persist + publish mesh auth mode (always `enforced` after D821). */
88436
88377
  async writeMeshAuthMode(mode) {
88437
88378
  await this.ctx.settings.setSection("cluster", { [MESH_AUTH_MODE_FIELD]: mode });
@@ -88510,4 +88451,4 @@ function readJwtExp(token) {
88510
88451
  return typeof exp === "number" ? exp : 0;
88511
88452
  }
88512
88453
  //#endregion
88513
- export { loadMeshCa as A, MESH_AUTH_MODE_FIELD as B, caFingerprintCompact as C, generateMeshKeyPair as D, generateMeshCa as E, UnlockTicketJtiStore as F, requestProcessMeshEnforcement as G, getProcessMeshAuthStatus as H, isAllowedAgentDashboardReturnTo as I, setProcessMeshEnforcer as J, setProcessMeshAuthMode as K, mintAgentUiUnlockTicket as L, AGENT_UI_UNLOCK_DOMAIN as M, AGENT_UI_UNLOCK_TTL_MS as N, issueMeshLeafForNode as O, AGENT_UI_UNLOCK_VERSION as P, readCidrSetting as Q, parseAgentDashboardOrigins as R, caFingerprint as S, SYSTEM_CONFIG_CLUSTER_SECTION_ID, SystemConfigAddon, SystemConfigAddon as default, exportMeshPrivateKeyPem as T, isMeshAuthMode as U, getProcessMeshAuthMode as V, parseMeshAuthMode as W, normalizeIp as X, createCidrMatcher as Y, parseCidrList as Z, MeshCrl as _, setProcessMeshTlsEnabler as a, getProcessMeshCaState as b, mintMeshJoinToken as c, MESH_CLEAR_PORT_FIELD as d, applyProcessMeshClearPort as f, setProcessMeshClearPortControl as g, getProcessNodeMeshTransport as h, ServiceBroker as i, AGENT_DASHBOARD_ORIGINS_FIELD as j, issueMeshLeafFromCsr as k, processJoinTokenJtiStore as l, decideMeshClearPortOff as m, TlsTcpTransporter as n, enrollMeshNode as o, checkProcessMeshClearPort as p, setProcessMeshAuthStatusSource as q, Errors as r, JoinTokenJtiStore as s, systemConfigMeshActions as t, verifyMeshJoinToken as u, processMeshCrl as v, createMeshCsrPem as w, requireProcessMeshCa as x, MeshCaKeeper as y, verifyAgentUiUnlockTicket as z };
88454
+ export { AGENT_UI_UNLOCK_VERSION as A, parseMeshAuthMode as B, generateMeshKeyPair as C, AGENT_DASHBOARD_ORIGINS_FIELD as D, loadMeshCa as E, verifyAgentUiUnlockTicket as F, createCidrMatcher as G, setProcessMeshAuthMode as H, MESH_AUTH_MODE_FIELD as I, readCidrSetting as J, normalizeIp as K, getProcessMeshAuthMode as L, isAllowedAgentDashboardReturnTo as M, mintAgentUiUnlockTicket as N, AGENT_UI_UNLOCK_DOMAIN as O, parseAgentDashboardOrigins as P, getProcessMeshAuthStatus as R, generateMeshCa as S, SYSTEM_CONFIG_CLUSTER_SECTION_ID, SystemConfigAddon, SystemConfigAddon as default, issueMeshLeafFromCsr as T, setProcessMeshAuthStatusSource as U, requestProcessMeshEnforcement as V, setProcessMeshEnforcer as W, requireProcessMeshCa as _, setProcessMeshTlsEnabler as a, createMeshCsrPem as b, mintMeshJoinToken as c, getProcessNodeMeshTransport as d, setProcessMeshPeerTransportLookup as f, getProcessMeshCaState as g, MeshCaKeeper as h, ServiceBroker as i, UnlockTicketJtiStore as j, AGENT_UI_UNLOCK_TTL_MS as k, processJoinTokenJtiStore as l, processMeshCrl as m, TlsTcpTransporter as n, enrollMeshNode as o, MeshCrl as p, parseCidrList as q, Errors as r, JoinTokenJtiStore as s, systemConfigMeshActions as t, verifyMeshJoinToken as u, caFingerprint as v, issueMeshLeafForNode as w, exportMeshPrivateKeyPem as x, caFingerprintCompact as y, isMeshAuthMode as z };
@@ -92,8 +92,6 @@ var MESH_CA_FIELD = "meshCa";
92
92
  /** Join-token / leaf lifetimes. */
93
93
  var MESH_JOIN_TOKEN_MAX_TTL_SEC = 3600;
94
94
  var MESH_CA_VALIDITY_DAYS = 3650;
95
- /** Hub clear TCP (existing) and TLS dual-listen port (Release A). */
96
- var DEFAULT_HUB_TCP_PORT = 6e3;
97
95
  var DEFAULT_HUB_TLS_TCP_PORT = 6443;
98
96
  /** Subject of the mesh root. Distinct from the HTTPS local CA. */
99
97
  var MESH_CA_COMMON_NAME = "CamStack Mesh CA";
@@ -101,4 +99,4 @@ var MESH_CA_COMMON_NAME = "CamStack Mesh CA";
101
99
  var SERVER_AUTH_OID = "1.3.6.1.5.5.7.3.1";
102
100
  var CLIENT_AUTH_OID = "1.3.6.1.5.5.7.3.2";
103
101
  //#endregion
104
- export { clusterSecretMatches as _, MESH_CA_FIELD as a, isClusterSecretMismatchError as b, MESH_CA_VALIDITY_DAYS as c, CLUSTER_SECRET_MISMATCH_TYPE as d, CLUSTER_SECRET_REF as f, checkClusterSecret as g, CLUSTER_SECRET_UNAVAILABLE_TYPE as h, MESH_CA_COMMON_NAME as i, MESH_JOIN_TOKEN_MAX_TTL_SEC as l, CLUSTER_SECRET_SETTINGS_KEY as m, DEFAULT_HUB_TCP_PORT as n, MESH_CA_KEY_REF as o, CLUSTER_SECRET_REJECTED_EXIT_CODE as p, DEFAULT_HUB_TLS_TCP_PORT as r, MESH_CA_SETTINGS_KEY as s, CLIENT_AUTH_OID as t, SERVER_AUTH_OID as u, getProcessClusterSecretGate as v, setProcessClusterSecretGate as x, hashClusterSecret as y };
102
+ export { getProcessClusterSecretGate as _, MESH_CA_KEY_REF as a, setProcessClusterSecretGate as b, MESH_JOIN_TOKEN_MAX_TTL_SEC as c, CLUSTER_SECRET_REF as d, CLUSTER_SECRET_REJECTED_EXIT_CODE as f, clusterSecretMatches as g, checkClusterSecret as h, MESH_CA_FIELD as i, SERVER_AUTH_OID as l, CLUSTER_SECRET_UNAVAILABLE_TYPE as m, DEFAULT_HUB_TLS_TCP_PORT as n, MESH_CA_SETTINGS_KEY as o, CLUSTER_SECRET_SETTINGS_KEY as p, MESH_CA_COMMON_NAME as r, MESH_CA_VALIDITY_DAYS as s, CLIENT_AUTH_OID as t, CLUSTER_SECRET_MISMATCH_TYPE as u, hashClusterSecret as v, isClusterSecretMismatchError as y };
@@ -92,8 +92,6 @@ var MESH_CA_FIELD = "meshCa";
92
92
  /** Join-token / leaf lifetimes. */
93
93
  var MESH_JOIN_TOKEN_MAX_TTL_SEC = 3600;
94
94
  var MESH_CA_VALIDITY_DAYS = 3650;
95
- /** Hub clear TCP (existing) and TLS dual-listen port (Release A). */
96
- var DEFAULT_HUB_TCP_PORT = 6e3;
97
95
  var DEFAULT_HUB_TLS_TCP_PORT = 6443;
98
96
  /** Subject of the mesh root. Distinct from the HTTPS local CA. */
99
97
  var MESH_CA_COMMON_NAME = "CamStack Mesh CA";
@@ -137,12 +135,6 @@ Object.defineProperty(exports, "CLUSTER_SECRET_UNAVAILABLE_TYPE", {
137
135
  return CLUSTER_SECRET_UNAVAILABLE_TYPE;
138
136
  }
139
137
  });
140
- Object.defineProperty(exports, "DEFAULT_HUB_TCP_PORT", {
141
- enumerable: true,
142
- get: function() {
143
- return DEFAULT_HUB_TCP_PORT;
144
- }
145
- });
146
138
  Object.defineProperty(exports, "DEFAULT_HUB_TLS_TCP_PORT", {
147
139
  enumerable: true,
148
140
  get: function() {
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ const require_builtins_sqlite_storage_index = require("./builtins/sqlite-storage
27
27
  const require_hub_cap_forward = require("./hub-cap-forward-W8oEm4ME.js");
28
28
  const require_builtins_storage_orchestrator_storage_orchestrator_addon = require("./builtins/storage-orchestrator/storage-orchestrator.addon.js");
29
29
  require("./builtins/storage-orchestrator/index.js");
30
- const require_constants = require("./constants-Bz9gKWe8.js");
30
+ const require_constants = require("./constants-Dcecs0Ks.js");
31
31
  const require_builtins_system_config_system_config_addon = require("./builtins/system-config/system-config.addon.js");
32
32
  require("./builtins/system-config/index.js");
33
33
  const require_builtins_winston_logging_index = require("./builtins/winston-logging/index.js");
@@ -11132,9 +11132,8 @@ function createBroker(config) {
11132
11132
  tlsPort: config.tlsPort ?? 6443,
11133
11133
  maxPacketSize: 10 * 1024 * 1024,
11134
11134
  useHostname,
11135
- udpDiscovery: true,
11136
- udpPort,
11137
- udpPeriod: 5,
11135
+ hubTlsOnly: true,
11136
+ udpDiscovery: false,
11138
11137
  debug: false,
11139
11138
  ...config.meshTls !== void 0 ? { meshTls: config.meshTls } : {}
11140
11139
  }),
@@ -14033,7 +14032,6 @@ exports.MESH_AUTO_ENFORCE_GRACE_MS = MESH_AUTO_ENFORCE_GRACE_MS;
14033
14032
  exports.MESH_CA_FIELD = require_constants.MESH_CA_FIELD;
14034
14033
  exports.MESH_CA_KEY_REF = require_constants.MESH_CA_KEY_REF;
14035
14034
  exports.MESH_CA_SETTINGS_KEY = require_constants.MESH_CA_SETTINGS_KEY;
14036
- exports.MESH_CLEAR_PORT_FIELD = require_builtins_system_config_system_config_addon.MESH_CLEAR_PORT_FIELD;
14037
14035
  exports.MESH_JOIN_AUTHENTICATE_ACTION = MESH_JOIN_AUTHENTICATE_ACTION;
14038
14036
  exports.MESH_JOIN_CHALLENGE_ACTION = MESH_JOIN_CHALLENGE_ACTION;
14039
14037
  exports.MESH_JOIN_CHALLENGE_INVALID_TYPE = MESH_JOIN_CHALLENGE_INVALID_TYPE;
@@ -14124,7 +14122,6 @@ exports.allFamiliesListenHost = require_tls.allFamiliesListenHost;
14124
14122
  exports.answerClaimedGetStatus = require_child_cap_dispatch.answerClaimedGetStatus;
14125
14123
  exports.applyCertificateToListener = require_tls.applyCertificateToListener;
14126
14124
  exports.applyLanHttp = require_tls.applyLanHttp;
14127
- exports.applyProcessMeshClearPort = require_builtins_system_config_system_config_addon.applyProcessMeshClearPort;
14128
14125
  exports.attachUserManagementInternal = require_builtins_local_auth_local_auth_addon.attachUserManagementInternal;
14129
14126
  exports.attributeStall = require_event_loop_stall_monitor.attributeStall;
14130
14127
  exports.bindPendingLanHttp = require_tls.bindPendingLanHttp;
@@ -14156,7 +14153,6 @@ exports.capActionSuffix = require_child_cap_dispatch.capActionSuffix;
14156
14153
  exports.capBareAction = require_child_cap_dispatch.capBareAction;
14157
14154
  exports.capServiceName = require_child_cap_dispatch.capServiceName;
14158
14155
  exports.checkClusterSecret = require_constants.checkClusterSecret;
14159
- exports.checkProcessMeshClearPort = require_builtins_system_config_system_config_addon.checkProcessMeshClearPort;
14160
14156
  exports.classifyAddonDir = classifyAddonDir;
14161
14157
  exports.classifyCapRoute = require_child_cap_dispatch.classifyCapRoute;
14162
14158
  exports.clearHttpsListener = require_tls.clearHttpsListener;
@@ -14215,7 +14211,6 @@ exports.createUdsLogger = require_child_cap_dispatch.createUdsLogger;
14215
14211
  exports.createUdsLoggerWithControl = require_child_cap_dispatch.createUdsLoggerWithControl;
14216
14212
  exports.createV8Reclaimer = require_child_cap_dispatch.createV8Reclaimer;
14217
14213
  exports.decideMeshAutoEnforce = decideMeshAutoEnforce;
14218
- exports.decideMeshClearPortOff = require_builtins_system_config_system_config_addon.decideMeshClearPortOff;
14219
14214
  exports.deleteModelFromDisk = require_event_loop_stall_monitor.deleteModelFromDisk;
14220
14215
  exports.deriveAgentListenPort = deriveAgentListenPort;
14221
14216
  exports.describeProviderKindDrift = describeProviderKindDrift;
@@ -14437,8 +14432,8 @@ exports.setPlatformKeychainKey = require_platform_key_source.setPlatformKeychain
14437
14432
  exports.setProcessClusterSecretGate = require_constants.setProcessClusterSecretGate;
14438
14433
  exports.setProcessMeshAuthMode = require_builtins_system_config_system_config_addon.setProcessMeshAuthMode;
14439
14434
  exports.setProcessMeshAuthStatusSource = require_builtins_system_config_system_config_addon.setProcessMeshAuthStatusSource;
14440
- exports.setProcessMeshClearPortControl = require_builtins_system_config_system_config_addon.setProcessMeshClearPortControl;
14441
14435
  exports.setProcessMeshEnforcer = require_builtins_system_config_system_config_addon.setProcessMeshEnforcer;
14436
+ exports.setProcessMeshPeerTransportLookup = require_builtins_system_config_system_config_addon.setProcessMeshPeerTransportLookup;
14442
14437
  exports.setProcessMeshTlsEnabler = require_builtins_system_config_system_config_addon.setProcessMeshTlsEnabler;
14443
14438
  exports.setWrapperActive = require_builtins_device_manager_device_manager_addon.setWrapperActive;
14444
14439
  exports.shouldReclaim = require_child_cap_dispatch.shouldReclaim;
package/dist/index.mjs CHANGED
@@ -26,8 +26,8 @@ import { ConfigStore, DeviceStore } from "./builtins/sqlite-storage/index.mjs";
26
26
  import { i as stripForwardedCaller, n as HUB_CAP_FWD_SERVICE, r as createHubCapForwardService, t as HUB_CAP_FWD_ACTION } from "./hub-cap-forward-CDiN1p98.mjs";
27
27
  import { StorageOrchestratorAddon, n as buildStorageLocationRegistry, t as StorageOrchestratorService } from "./builtins/storage-orchestrator/storage-orchestrator.addon.mjs";
28
28
  import "./builtins/storage-orchestrator/index.mjs";
29
- import { _ as clusterSecretMatches, a as MESH_CA_FIELD, b as isClusterSecretMismatchError, d as CLUSTER_SECRET_MISMATCH_TYPE, f as CLUSTER_SECRET_REF, g as checkClusterSecret, h as CLUSTER_SECRET_UNAVAILABLE_TYPE, m as CLUSTER_SECRET_SETTINGS_KEY, o as MESH_CA_KEY_REF, p as CLUSTER_SECRET_REJECTED_EXIT_CODE, r as DEFAULT_HUB_TLS_TCP_PORT, s as MESH_CA_SETTINGS_KEY, v as getProcessClusterSecretGate, x as setProcessClusterSecretGate, y as hashClusterSecret } from "./constants-C1WoQ0E8.mjs";
30
- import { A as loadMeshCa, B as MESH_AUTH_MODE_FIELD, C as caFingerprintCompact, D as generateMeshKeyPair, E as generateMeshCa, F as UnlockTicketJtiStore, G as requestProcessMeshEnforcement, H as getProcessMeshAuthStatus, I as isAllowedAgentDashboardReturnTo, J as setProcessMeshEnforcer, K as setProcessMeshAuthMode, L as mintAgentUiUnlockTicket, M as AGENT_UI_UNLOCK_DOMAIN, N as AGENT_UI_UNLOCK_TTL_MS, O as issueMeshLeafForNode, P as AGENT_UI_UNLOCK_VERSION, Q as readCidrSetting, R as parseAgentDashboardOrigins, S as caFingerprint, SystemConfigAddon, T as exportMeshPrivateKeyPem, U as isMeshAuthMode, V as getProcessMeshAuthMode, W as parseMeshAuthMode, X as normalizeIp, Y as createCidrMatcher, Z as parseCidrList, _ as MeshCrl, a as setProcessMeshTlsEnabler, b as getProcessMeshCaState, c as mintMeshJoinToken, d as MESH_CLEAR_PORT_FIELD, f as applyProcessMeshClearPort, g as setProcessMeshClearPortControl, h as getProcessNodeMeshTransport, i as ServiceBroker, j as AGENT_DASHBOARD_ORIGINS_FIELD, k as issueMeshLeafFromCsr, l as processJoinTokenJtiStore, m as decideMeshClearPortOff, n as TlsTcpTransporter, o as enrollMeshNode, p as checkProcessMeshClearPort, q as setProcessMeshAuthStatusSource, r as Errors, s as JoinTokenJtiStore, u as verifyMeshJoinToken, v as processMeshCrl, w as createMeshCsrPem, x as requireProcessMeshCa, y as MeshCaKeeper, z as verifyAgentUiUnlockTicket } from "./builtins/system-config/system-config.addon.mjs";
29
+ import { _ as getProcessClusterSecretGate, a as MESH_CA_KEY_REF, b as setProcessClusterSecretGate, d as CLUSTER_SECRET_REF, f as CLUSTER_SECRET_REJECTED_EXIT_CODE, g as clusterSecretMatches, h as checkClusterSecret, i as MESH_CA_FIELD, m as CLUSTER_SECRET_UNAVAILABLE_TYPE, n as DEFAULT_HUB_TLS_TCP_PORT, o as MESH_CA_SETTINGS_KEY, p as CLUSTER_SECRET_SETTINGS_KEY, u as CLUSTER_SECRET_MISMATCH_TYPE, v as hashClusterSecret, y as isClusterSecretMismatchError } from "./constants-5vADty9I.mjs";
30
+ import { A as AGENT_UI_UNLOCK_VERSION, B as parseMeshAuthMode, C as generateMeshKeyPair, D as AGENT_DASHBOARD_ORIGINS_FIELD, E as loadMeshCa, F as verifyAgentUiUnlockTicket, G as createCidrMatcher, H as setProcessMeshAuthMode, I as MESH_AUTH_MODE_FIELD, J as readCidrSetting, K as normalizeIp, L as getProcessMeshAuthMode, M as isAllowedAgentDashboardReturnTo, N as mintAgentUiUnlockTicket, O as AGENT_UI_UNLOCK_DOMAIN, P as parseAgentDashboardOrigins, R as getProcessMeshAuthStatus, S as generateMeshCa, SystemConfigAddon, T as issueMeshLeafFromCsr, U as setProcessMeshAuthStatusSource, V as requestProcessMeshEnforcement, W as setProcessMeshEnforcer, _ as requireProcessMeshCa, a as setProcessMeshTlsEnabler, b as createMeshCsrPem, c as mintMeshJoinToken, d as getProcessNodeMeshTransport, f as setProcessMeshPeerTransportLookup, g as getProcessMeshCaState, h as MeshCaKeeper, i as ServiceBroker, j as UnlockTicketJtiStore, k as AGENT_UI_UNLOCK_TTL_MS, l as processJoinTokenJtiStore, m as processMeshCrl, n as TlsTcpTransporter, o as enrollMeshNode, p as MeshCrl, q as parseCidrList, r as Errors, s as JoinTokenJtiStore, u as verifyMeshJoinToken, v as caFingerprint, w as issueMeshLeafForNode, x as exportMeshPrivateKeyPem, y as caFingerprintCompact, z as isMeshAuthMode } from "./builtins/system-config/system-config.addon.mjs";
31
31
  import "./builtins/system-config/index.mjs";
32
32
  import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
33
33
  import { C as resolveFormatRevision, S as isModelDownloaded, _ as downloadModel, a as createFileDataPlaneHandler, b as getModelFilePath, c as parseRangeHeader, d as ModelDownloadService, g as downloadFile, h as deleteModelFromDisk, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as collectModelFiles, n as STALL_TICK_MS, o as contentTypeFor, p as adoptModelRevisions, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as ensureModel, w as revisionWeightUrl, y as fetchJson } from "./event-loop-stall-monitor-BHtIKJY2.mjs";
@@ -11129,9 +11129,8 @@ function createBroker(config) {
11129
11129
  tlsPort: config.tlsPort ?? 6443,
11130
11130
  maxPacketSize: 10 * 1024 * 1024,
11131
11131
  useHostname,
11132
- udpDiscovery: true,
11133
- udpPort,
11134
- udpPeriod: 5,
11132
+ hubTlsOnly: true,
11133
+ udpDiscovery: false,
11135
11134
  debug: false,
11136
11135
  ...config.meshTls !== void 0 ? { meshTls: config.meshTls } : {}
11137
11136
  }),
@@ -13901,4 +13900,4 @@ var LifecycleJobEngine = class {
13901
13900
  }
13902
13901
  };
13903
13902
  //#endregion
13904
- export { ADMIN_TOKEN_MAX_LIFETIME_MS, ADMIN_TOKEN_PREFIX, AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_DASHBOARD_ORIGINS_FIELD, AGENT_READINESS_SERVICE_NAME, AGENT_REGISTER_NODE_ACTION, AGENT_UI_UNLOCK_DOMAIN, AGENT_UI_UNLOCK_TTL_MS, AGENT_UI_UNLOCK_VERSION, ALL_CAPABILITY_DEFINITIONS, ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ARRAY_BUFFER_CENSUS_SUSTAIN_MS, ARRAY_BUFFER_CENSUS_THRESHOLD_MB, ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AdminTokenManager, AgentMeshAuthenticator, AlertCenterAddon, ApiKeyManager, AuthAuditLog, AuthManager, BackupDecryptError, BackupKeyFormatError, BackupKeyMismatchError, BackupKeyRequiredError, CAP_ACTION_OVERFLOW_LABEL, CAP_ACTION_UNLABELLED, CAP_METHOD_NOT_IMPLEMENTED, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REF, CLUSTER_SECRET_REJECTED_EXIT_CODE, CLUSTER_SECRET_SETTINGS_KEY, CLUSTER_SECRET_UNAVAILABLE_TYPE, CORE_CAP_SERVICE_NAME, CalendarsAddon, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ComposerAddon, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DECISIVE_HEAP_SPACES, DEFAULT_DATA_PATH, DEFAULT_HUB_TLS_TCP_PORT, DEFAULT_LAN_HTTP_PORT, DEFAULT_LOG_LEVEL, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EMPTY_CAP_ACTION_READING, EMPTY_SOCKET_DIRECTION, EMPTY_SOCKET_PLANE_BASELINE, EVENT_PLANE_TOP_N, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FIRST_BOOT_ADMIN_PASSWORD, FIRST_BOOT_ADMIN_USERNAME, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, GET_STATUS_METHOD, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_SPACE_REPORT_MIN_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HUB_MAIN_HEAP_WATCH_LABEL, HUB_MAIN_RSS_BUDGET_MB, HUB_RSS_BUDGET_ENV, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JWT_SIGNING_KEY_REF, JobJournal, JoinTokenJtiStore, JwtSigningKeyUnavailableError, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LoggingGate, LoginSessionManager, LokiDestination, LokiLoggingAddon, MAX_CAP_ACTIONS_PER_PEER, MAX_LEAF_VALIDITY_DAYS, MESH_ACTION_FORBIDDEN_TYPE, MESH_AUTH_MODE_FIELD, MESH_AUTO_ENFORCE_GRACE_MS, MESH_CA_FIELD, MESH_CA_KEY_REF, MESH_CA_SETTINGS_KEY, MESH_CLEAR_PORT_FIELD, MESH_JOIN_AUTHENTICATE_ACTION, MESH_JOIN_CHALLENGE_ACTION, MESH_JOIN_CHALLENGE_INVALID_TYPE, MESH_JOIN_CHALLENGE_TTL_MS, MESH_JOIN_PROTOCOL, MESH_NODE_UNAUTHENTICATED_TYPE, MESH_QUEUE_TOP_N, METHOD_ACCESS_MAP, MeshAuthenticator, MeshCaKeeper, MeshCrl, MeshJoinClient, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, OUTBOUND_QUEUE_COOLDOWN_MS, OUTBOUND_QUEUE_SUSTAIN_MS, OUTBOUND_QUEUE_THRESHOLD_BYTES, PARENT_ROUTED_PROVIDER_ADDON_ID, PYTHON_VERSION, PeerAnsweredError, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, REFRESH_TOKEN_PREFIX, RESTART_MARKER_FILE, RSS_BUDGET_REANNOUNCE_MIN_MS, RSS_BUDGET_RELEASE_RATIO, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNNER_RSS_BUDGET_ENV, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, SOCKET_PLANE_TOP_N, SOCKET_QUEUE_TOP_N, STALL_REPORT_MS, STALL_TICK_MS, STORE_READABLE_BOOTSTRAP_KEYS, SYSTEM_SECRET_OWNER, ScopedLogger, ScopedTokenManager, SettingsReadUnavailableError, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemBackupService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, TlsTcpTransporter, ToastService, UDS_NO_ROUTE_PREFIX, UNCLAIMED, UPLOADED_CA_FILE, USER_MANAGEMENT_INTERNAL, UdsLocalTransportClient, UdsLocalTransportServer, UnlockTicketJtiStore, UserManager, WinstonDestination, WinstonLoggingAddon, ZERO_LOOP_DELAY, __resetCapUsageRegistryForTests, __resetLoggingGateForTests, adaptBrokerToCluster, addonSettingsCapability, adoptModelRevisions, afterWorkerOnlineAnnounce, allFamiliesListenHost, answerClaimedGetStatus, applyCertificateToListener, applyLanHttp, applyProcessMeshClearPort, attachUserManagementInternal, attributeStall, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildNpmChildEnv, buildStorageLocationRegistry, builderMountedCapNames, caFingerprint, caFingerprintCompact, callRegisterNodeWithRetry, callWithServiceDiscovery, canServeDataPlane, capActionLabel, capActionName, capActionSuffix, capBareAction, capServiceName, checkClusterSecret, checkProcessMeshClearPort, classifyAddonDir, classifyCapRoute, clearHttpsListener, clearPendingRestart, clearPlatformKeychainKey, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, computeHubJoinProof, computeNodeJoinProof, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonPeerBytesFacility, createAddonService, createArrayBufferCensusGate, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCapActionCensus, createCidrMatcher, createCoreCapService, createDeferredHeapWatchSink, createDoorSettingsView, createEventPlaneMeter, createEventPlaneReader, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createInspectorArrayBufferCensus, createKernelHwAccel, createKernelInferenceEngine, createLocalTransport, createLoopDelayMeter, createMeshAccessMiddleware, createMeshCsrPem, createMeshQueueReader, createOutboundQueueGate, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createSocketDirectionCounters, createSocketPlaneMeter, createSocketPlaneReader, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, decideMeshAutoEnforce, decideMeshClearPortOff, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, describeRss, detectWorkspacePackagesDir, deviceCapResolverLink, deviceOfGetStatus, diffCapActionCensus, diffEventPlane, diffSocketPlane, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, emitHeapDiagnosticReport, encodeFrame, enrollMeshNode, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, exportMeshPrivateKeyPem, fetchJson, findInPath, formatArrayBufferCensus, formatEventPlane, formatHeapSpaces, formatLogLine, formatMeshQueue, formatOutboundQueueVerdict, formatSocketPlane, generateBackupKeyPair, generateMeshCa, generateMeshKeyPair, getBrokerEventBus, getBrokerTlsTransporter, getCapUsageRegistry, getFfmpegDownloadUrl, getLoggingGate, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPlatformKeychainKey, getProcessClusterSecretGate, getProcessJwtSigningKeyState, getProcessMeshAuthMode, getProcessMeshAuthStatus, getProcessMeshCaState, getProcessNodeMeshTransport, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getUserManagementInternal, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, heapSpaceField, hostNodeIdOf, hubMainRssBudget, installManifestNativeDeps, installManifestPythonDeps, installManifestSystemDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcParentLink, isAddonDeploySource, isAllowedAgentDashboardReturnTo, isArrayBufferCensusReport, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isCredentialKeyName, isInfraCapability, isMeshAuthMode, isModelDownloaded, isOwnChildNodeId, isRemoteForbiddenAction, isRemoteForbiddenOnAgent, isSettingsReadUnavailable, isSourceNewer, isolatedBuiltinPhase, issueMeshLeafForNode, issueMeshLeafFromCsr, leafFingerprintOf, loadMeshCa, loadTlsCert, localEndpointPath, localProviderLink, localSupportedPythonRuntimes, mapSignalsToInferenceHardware, meshErrorType, mintAgentUiUnlockTicket, mintMeshJoinToken, mountNativeCapService, nextRssBudgetState, normalizeIp, overlayGetStatus, parseAgentDashboardOrigins, parseCapAction, parseCidrList, parseMeshAuthMode, parseRangeHeader, parseRssBudgetMb, parseTokenExpiry, parseTokenizedUrl, partitionIsolatedBuiltinIds, prepareBootTls, prepareRestoreArchive, probePlatform, processJoinTokenJtiStore, processJwtSigningKey, processMeshCrl, proxyToUpstream, quarantineAddonResidue, readBackupEncryptionHeader, readCidrSetting, readExtraSans, readHeapSpaces, readLanHttpState, readPendingRestart, readSocketQueues, readTlsAccessStatus, readTlsMode, readinessKey, reclaimIntervalMs, recordSocketFrame, redactLogEntry, redactLogMeta, redactLogText, regenerateCertificate, registerEventBusService, registerHttpsListener, registerLanHttpHandler, reissueTlsLeaf, reloadHttpsListener, requestProcessMeshEnforcement, requireProcessMeshCa, resolveFilePath, resolveFormatRevision, resolveHwAccel, resolveNpmInvocation, revertToGeneratedCertificate, revisionWeightUrl, runHubAddonBoot, runNpm, sampleSocketDirection, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, selectReportedSpaces, serializeTypedArrays, servedHttpsLeafFingerprint, setHubConnected, setNodeEventInterest, setPlatformKeychainKey, setProcessClusterSecretGate, setProcessMeshAuthMode, setProcessMeshAuthStatusSource, setProcessMeshClearPortControl, setProcessMeshEnforcer, setProcessMeshTlsEnabler, setWrapperActive, shouldReclaim, signalAllRunnerGroups, socketDirectionBytes, socketDirectionMessages, splitPemCertificates, stampCallerAddonId, startEventLoopStallMonitor, startHeapWatch, startRunnerHeapWatch, staticJwtSigningKey, storeMayAnswer, storeUploadedCertificate, strandedMb, stripCamstackDeps, stripForgedIdentity, stripForwardedCaller, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, verifyAgentUiUnlockTicket, verifyMeshJoinToken, waitUntilReady, writeExtraSans, writePendingRestart, writeTlsMode };
13903
+ export { ADMIN_TOKEN_MAX_LIFETIME_MS, ADMIN_TOKEN_PREFIX, AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_DASHBOARD_ORIGINS_FIELD, AGENT_READINESS_SERVICE_NAME, AGENT_REGISTER_NODE_ACTION, AGENT_UI_UNLOCK_DOMAIN, AGENT_UI_UNLOCK_TTL_MS, AGENT_UI_UNLOCK_VERSION, ALL_CAPABILITY_DEFINITIONS, ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ARRAY_BUFFER_CENSUS_SUSTAIN_MS, ARRAY_BUFFER_CENSUS_THRESHOLD_MB, ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AdminTokenManager, AgentMeshAuthenticator, AlertCenterAddon, ApiKeyManager, AuthAuditLog, AuthManager, BackupDecryptError, BackupKeyFormatError, BackupKeyMismatchError, BackupKeyRequiredError, CAP_ACTION_OVERFLOW_LABEL, CAP_ACTION_UNLABELLED, CAP_METHOD_NOT_IMPLEMENTED, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REF, CLUSTER_SECRET_REJECTED_EXIT_CODE, CLUSTER_SECRET_SETTINGS_KEY, CLUSTER_SECRET_UNAVAILABLE_TYPE, CORE_CAP_SERVICE_NAME, CalendarsAddon, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ComposerAddon, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DECISIVE_HEAP_SPACES, DEFAULT_DATA_PATH, DEFAULT_HUB_TLS_TCP_PORT, DEFAULT_LAN_HTTP_PORT, DEFAULT_LOG_LEVEL, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EMPTY_CAP_ACTION_READING, EMPTY_SOCKET_DIRECTION, EMPTY_SOCKET_PLANE_BASELINE, EVENT_PLANE_TOP_N, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FIRST_BOOT_ADMIN_PASSWORD, FIRST_BOOT_ADMIN_USERNAME, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, GET_STATUS_METHOD, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_SPACE_REPORT_MIN_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HUB_MAIN_HEAP_WATCH_LABEL, HUB_MAIN_RSS_BUDGET_MB, HUB_RSS_BUDGET_ENV, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JWT_SIGNING_KEY_REF, JobJournal, JoinTokenJtiStore, JwtSigningKeyUnavailableError, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LoggingGate, LoginSessionManager, LokiDestination, LokiLoggingAddon, MAX_CAP_ACTIONS_PER_PEER, MAX_LEAF_VALIDITY_DAYS, MESH_ACTION_FORBIDDEN_TYPE, MESH_AUTH_MODE_FIELD, MESH_AUTO_ENFORCE_GRACE_MS, MESH_CA_FIELD, MESH_CA_KEY_REF, MESH_CA_SETTINGS_KEY, MESH_JOIN_AUTHENTICATE_ACTION, MESH_JOIN_CHALLENGE_ACTION, MESH_JOIN_CHALLENGE_INVALID_TYPE, MESH_JOIN_CHALLENGE_TTL_MS, MESH_JOIN_PROTOCOL, MESH_NODE_UNAUTHENTICATED_TYPE, MESH_QUEUE_TOP_N, METHOD_ACCESS_MAP, MeshAuthenticator, MeshCaKeeper, MeshCrl, MeshJoinClient, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, OUTBOUND_QUEUE_COOLDOWN_MS, OUTBOUND_QUEUE_SUSTAIN_MS, OUTBOUND_QUEUE_THRESHOLD_BYTES, PARENT_ROUTED_PROVIDER_ADDON_ID, PYTHON_VERSION, PeerAnsweredError, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, REFRESH_TOKEN_PREFIX, RESTART_MARKER_FILE, RSS_BUDGET_REANNOUNCE_MIN_MS, RSS_BUDGET_RELEASE_RATIO, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNNER_RSS_BUDGET_ENV, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, SOCKET_PLANE_TOP_N, SOCKET_QUEUE_TOP_N, STALL_REPORT_MS, STALL_TICK_MS, STORE_READABLE_BOOTSTRAP_KEYS, SYSTEM_SECRET_OWNER, ScopedLogger, ScopedTokenManager, SettingsReadUnavailableError, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemBackupService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, TlsTcpTransporter, ToastService, UDS_NO_ROUTE_PREFIX, UNCLAIMED, UPLOADED_CA_FILE, USER_MANAGEMENT_INTERNAL, UdsLocalTransportClient, UdsLocalTransportServer, UnlockTicketJtiStore, UserManager, WinstonDestination, WinstonLoggingAddon, ZERO_LOOP_DELAY, __resetCapUsageRegistryForTests, __resetLoggingGateForTests, adaptBrokerToCluster, addonSettingsCapability, adoptModelRevisions, afterWorkerOnlineAnnounce, allFamiliesListenHost, answerClaimedGetStatus, applyCertificateToListener, applyLanHttp, attachUserManagementInternal, attributeStall, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildNpmChildEnv, buildStorageLocationRegistry, builderMountedCapNames, caFingerprint, caFingerprintCompact, callRegisterNodeWithRetry, callWithServiceDiscovery, canServeDataPlane, capActionLabel, capActionName, capActionSuffix, capBareAction, capServiceName, checkClusterSecret, classifyAddonDir, classifyCapRoute, clearHttpsListener, clearPendingRestart, clearPlatformKeychainKey, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, computeHubJoinProof, computeNodeJoinProof, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonPeerBytesFacility, createAddonService, createArrayBufferCensusGate, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCapActionCensus, createCidrMatcher, createCoreCapService, createDeferredHeapWatchSink, createDoorSettingsView, createEventPlaneMeter, createEventPlaneReader, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createInspectorArrayBufferCensus, createKernelHwAccel, createKernelInferenceEngine, createLocalTransport, createLoopDelayMeter, createMeshAccessMiddleware, createMeshCsrPem, createMeshQueueReader, createOutboundQueueGate, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createSocketDirectionCounters, createSocketPlaneMeter, createSocketPlaneReader, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, decideMeshAutoEnforce, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, describeRss, detectWorkspacePackagesDir, deviceCapResolverLink, deviceOfGetStatus, diffCapActionCensus, diffEventPlane, diffSocketPlane, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, emitHeapDiagnosticReport, encodeFrame, enrollMeshNode, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, exportMeshPrivateKeyPem, fetchJson, findInPath, formatArrayBufferCensus, formatEventPlane, formatHeapSpaces, formatLogLine, formatMeshQueue, formatOutboundQueueVerdict, formatSocketPlane, generateBackupKeyPair, generateMeshCa, generateMeshKeyPair, getBrokerEventBus, getBrokerTlsTransporter, getCapUsageRegistry, getFfmpegDownloadUrl, getLoggingGate, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPlatformKeychainKey, getProcessClusterSecretGate, getProcessJwtSigningKeyState, getProcessMeshAuthMode, getProcessMeshAuthStatus, getProcessMeshCaState, getProcessNodeMeshTransport, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getUserManagementInternal, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, heapSpaceField, hostNodeIdOf, hubMainRssBudget, installManifestNativeDeps, installManifestPythonDeps, installManifestSystemDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcParentLink, isAddonDeploySource, isAllowedAgentDashboardReturnTo, isArrayBufferCensusReport, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isCredentialKeyName, isInfraCapability, isMeshAuthMode, isModelDownloaded, isOwnChildNodeId, isRemoteForbiddenAction, isRemoteForbiddenOnAgent, isSettingsReadUnavailable, isSourceNewer, isolatedBuiltinPhase, issueMeshLeafForNode, issueMeshLeafFromCsr, leafFingerprintOf, loadMeshCa, loadTlsCert, localEndpointPath, localProviderLink, localSupportedPythonRuntimes, mapSignalsToInferenceHardware, meshErrorType, mintAgentUiUnlockTicket, mintMeshJoinToken, mountNativeCapService, nextRssBudgetState, normalizeIp, overlayGetStatus, parseAgentDashboardOrigins, parseCapAction, parseCidrList, parseMeshAuthMode, parseRangeHeader, parseRssBudgetMb, parseTokenExpiry, parseTokenizedUrl, partitionIsolatedBuiltinIds, prepareBootTls, prepareRestoreArchive, probePlatform, processJoinTokenJtiStore, processJwtSigningKey, processMeshCrl, proxyToUpstream, quarantineAddonResidue, readBackupEncryptionHeader, readCidrSetting, readExtraSans, readHeapSpaces, readLanHttpState, readPendingRestart, readSocketQueues, readTlsAccessStatus, readTlsMode, readinessKey, reclaimIntervalMs, recordSocketFrame, redactLogEntry, redactLogMeta, redactLogText, regenerateCertificate, registerEventBusService, registerHttpsListener, registerLanHttpHandler, reissueTlsLeaf, reloadHttpsListener, requestProcessMeshEnforcement, requireProcessMeshCa, resolveFilePath, resolveFormatRevision, resolveHwAccel, resolveNpmInvocation, revertToGeneratedCertificate, revisionWeightUrl, runHubAddonBoot, runNpm, sampleSocketDirection, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, selectReportedSpaces, serializeTypedArrays, servedHttpsLeafFingerprint, setHubConnected, setNodeEventInterest, setPlatformKeychainKey, setProcessClusterSecretGate, setProcessMeshAuthMode, setProcessMeshAuthStatusSource, setProcessMeshEnforcer, setProcessMeshPeerTransportLookup, setProcessMeshTlsEnabler, setWrapperActive, shouldReclaim, signalAllRunnerGroups, socketDirectionBytes, socketDirectionMessages, splitPemCertificates, stampCallerAddonId, startEventLoopStallMonitor, startHeapWatch, startRunnerHeapWatch, staticJwtSigningKey, storeMayAnswer, storeUploadedCertificate, strandedMb, stripCamstackDeps, stripForgedIdentity, stripForwardedCaller, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, verifyAgentUiUnlockTicket, verifyMeshJoinToken, waitUntilReady, writeExtraSans, writePendingRestart, writeTlsMode };
@@ -39,8 +39,8 @@ export { buildStorageLocationRegistry } from "./storage-location-registry.js";
39
39
  export type { StorageLocationRegistry } from "./storage-location-registry.js";
40
40
  export { createBroker, deriveAgentListenPort, getBrokerTlsTransporter } from "./moleculer/broker-factory.js";
41
41
  export type { BrokerConfig } from "./moleculer/broker-factory.js";
42
- export { applyProcessMeshClearPort, caFingerprint, caFingerprintCompact, checkProcessMeshClearPort, createMeshCsrPem, decideMeshClearPortOff, enrollMeshNode, exportMeshPrivateKeyPem, getProcessNodeMeshTransport, MESH_CLEAR_PORT_FIELD, setProcessMeshClearPortControl, generateMeshCa, generateMeshKeyPair, getProcessMeshCaState, issueMeshLeafForNode, issueMeshLeafFromCsr, JoinTokenJtiStore, loadMeshCa, MESH_CA_FIELD, MESH_CA_KEY_REF, MESH_CA_SETTINGS_KEY, MeshCaKeeper, MeshCrl, mintMeshJoinToken, processMeshCrl, processJoinTokenJtiStore, requireProcessMeshCa, setProcessMeshTlsEnabler, TlsTcpTransporter, verifyMeshJoinToken, DEFAULT_HUB_TLS_TCP_PORT } from "./moleculer/mesh-mtls/index.js";
43
- export type { MeshCaSigner, MeshClearPortAgent, MeshClearPortControl, MeshClearPortDecision, MeshClearPortMode, MeshEnrollResult, MeshTransport, MeshJoinTokenClaims, MeshTlsMaterial } from "./moleculer/mesh-mtls/index.js";
42
+ export { caFingerprint, caFingerprintCompact, createMeshCsrPem, enrollMeshNode, exportMeshPrivateKeyPem, getProcessNodeMeshTransport, setProcessMeshPeerTransportLookup, generateMeshCa, generateMeshKeyPair, getProcessMeshCaState, issueMeshLeafForNode, issueMeshLeafFromCsr, JoinTokenJtiStore, loadMeshCa, MESH_CA_FIELD, MESH_CA_KEY_REF, MESH_CA_SETTINGS_KEY, MeshCaKeeper, MeshCrl, mintMeshJoinToken, processMeshCrl, processJoinTokenJtiStore, requireProcessMeshCa, setProcessMeshTlsEnabler, TlsTcpTransporter, verifyMeshJoinToken, DEFAULT_HUB_TLS_TCP_PORT } from "./moleculer/mesh-mtls/index.js";
43
+ export type { MeshCaSigner, MeshEnrollResult, MeshPeerTransportLookup, MeshTransport, MeshJoinTokenClaims, MeshTlsMaterial } from "./moleculer/mesh-mtls/index.js";
44
44
  export { type AddonDeploySource, isAddonDeploySource } from "./moleculer/addon-deploy-source.js";
45
45
  export { createAddonService, validateProviderRegistrations } from "./moleculer/addon-service-factory.js";
46
46
  export { createCoreCapService, CORE_CAP_SERVICE_NAME } from "./moleculer/core-cap-service.js";
@@ -8,7 +8,7 @@ export declare const MESH_CA_FIELD = "meshCa";
8
8
  export declare const MESH_JOIN_TOKEN_MAX_TTL_SEC: number;
9
9
  export declare const MESH_LEAF_VALIDITY_DAYS = 30;
10
10
  export declare const MESH_CA_VALIDITY_DAYS = 3650;
11
- /** Hub clear TCP (existing) and TLS dual-listen port (Release A). */
11
+ /** Hub legacy clear TCP (retired on hub — D826) and TLS listen port. */
12
12
  export declare const DEFAULT_HUB_TCP_PORT = 6e3;
13
13
  export declare const DEFAULT_HUB_TLS_TCP_PORT = 6443;
14
14
  /** Join token payload version. */
@@ -2,7 +2,7 @@ export { CLIENT_AUTH_OID, DEFAULT_HUB_TCP_PORT, DEFAULT_HUB_TLS_TCP_PORT, MESH_C
2
2
  export { caFingerprint, caFingerprintCompact, createMeshCsrPem, exportMeshPrivateKeyPem, generateMeshCa, generateMeshKeyPair, issueMeshLeafForNode, issueMeshLeafFromCsr, loadMeshCa, MESH_KEY_ALGORITHM, MESH_SIGNING_ALGORITHM, subjectCn, type MeshCaSigner, type MeshLeafMaterial } from "./mesh-ca.js";
3
3
  export { clearProcessMeshCa, getProcessMeshCaState, loadOrGenerateMeshCa, MESH_CA_RETRY_MS, MeshCaKeeper, requireProcessMeshCa, setProcessMeshCa, type MeshCaKeeperDeps, type MeshCaState } from "./mesh-ca-keeper.js";
4
4
  export { clearProcessMeshCrl, MeshCrl, processMeshCrl } from "./mesh-crl.js";
5
- export { applyProcessMeshClearPort, checkProcessMeshClearPort, decideMeshClearPortOff, getProcessMeshClearPortControl, getProcessNodeMeshTransport, isMeshClearPortMode, MESH_CLEAR_PORT_FIELD, parseMeshClearPortMode, setProcessMeshClearPortControl, type MeshClearPortAgent, type MeshClearPortControl, type MeshClearPortDecision, type MeshClearPortMode, type MeshTransport } from "./mesh-clear-port.js";
5
+ export { getProcessNodeMeshTransport, setProcessMeshPeerTransportLookup, type MeshPeerTransportLookup, type MeshTransport } from "./mesh-peer-transport.js";
6
6
  export { enrollMeshNode } from "./mesh-enroll.js";
7
7
  export type { EnrollMeshNodeDeps, MeshEnrollRequest, MeshEnrollResult } from "./mesh-enroll.js";
8
8
  export { JoinTokenJtiStore, mintMeshJoinToken, processJoinTokenJtiStore, verifyMeshJoinToken, type MeshJoinTokenClaims, type MintJoinTokenInput } from "./mesh-join-token.js";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Hub-side telemetry: how an agent node reached the mesh transporter.
3
+ * The clear mesh port is retired — only mutual TLS is offered on the hub.
4
+ */
5
+ /** How a node reaches the hub (badge / topology). */
6
+ export type MeshTransport = "tls" | "clear";
7
+ export interface MeshPeerTransportLookup {
8
+ transportOf(nodeId: string): MeshTransport | undefined;
9
+ }
10
+ /** Published by the hub broker owner; cleared on shutdown. */
11
+ export declare function setProcessMeshPeerTransportLookup(lookup: MeshPeerTransportLookup | null): void;
12
+ /** `tls` / `clear` for an agent as the hub sees it; `undefined` off the hub. */
13
+ export declare function getProcessNodeMeshTransport(nodeId: string): MeshTransport | undefined;
@@ -69,6 +69,8 @@ export interface TlsTcpTransporterOptions {
69
69
  /** When set at construction, TLS starts with the clear reader. */
70
70
  readonly meshTls?: MeshTlsMaterial;
71
71
  readonly crl?: MeshCrl;
72
+ /** Hub only (D826): never bind clear TCP or UDP discovery. */
73
+ readonly hubTlsOnly?: boolean;
72
74
  }
73
75
  export declare class TlsTcpTransporter extends TcpTransporterBase {
74
76
  private tlsServer;
@@ -78,6 +80,7 @@ export declare class TlsTcpTransporter extends TcpTransporterBase {
78
80
  /** Node id (certificate CN) → serial of every peer that completed a mutual-TLS handshake. */
79
81
  private readonly tlsPeers;
80
82
  private clearDisabled;
83
+ private readonly hubTlsOnly;
81
84
  /** Clear-text `TcpWriter.connect` captured once before the TLS wrap (A→B). */
82
85
  private clearWriterConnect;
83
86
  private writerTlsPatched;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.396",
3
+ "version": "1.2.398",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",
@@ -1,56 +0,0 @@
1
- /**
2
- * Cutover switch for the hub's clear mesh port (Release A, rollout step 3).
3
- *
4
- * `cluster.meshClearPort` = `on` (default — clear :6000 + UDP discovery run next
5
- * to the TLS :6443 listener) or `off` (the hub stops listening on :6000 and
6
- * stops UDP discovery). Turning it off is REFUSED while any online agent still
7
- * reaches the hub in clear — the same spirit as D803's auto-enforce: the switch
8
- * must never cut off an agent that has not enrolled.
9
- *
10
- * The setting is owned by `system-config`; the transporter lives in the hub's
11
- * broker. They meet through this process slot (same pattern as
12
- * `mesh-auth-mode.ts` / `mesh-tls-enabler.ts`).
13
- */
14
- /** How a node reaches the hub. */
15
- export type MeshTransport = "tls" | "clear";
16
- export type MeshClearPortMode = "on" | "off";
17
- /** The field key inside the `cluster` section. */
18
- export declare const MESH_CLEAR_PORT_FIELD = "meshClearPort";
19
- export declare function isMeshClearPortMode(value: unknown): value is MeshClearPortMode;
20
- /** A stored value that is not a mode reads as `on`: never cut the mesh on a typo. */
21
- export declare function parseMeshClearPortMode(value: unknown): MeshClearPortMode;
22
- export interface MeshClearPortAgent {
23
- readonly nodeId: string;
24
- readonly transport: MeshTransport;
25
- }
26
- export interface MeshClearPortControl {
27
- /** Agents connected right now (never the hub, never `hub/<runner>` children). */
28
- listOnlineAgents(): readonly MeshClearPortAgent[];
29
- /** Whether the TLS listener is up — without it, closing the clear port cuts everyone. */
30
- isTlsListening(): boolean;
31
- /** Close (`off`) or reopen (`on`) the clear TCP reader and UDP discovery. */
32
- apply(mode: MeshClearPortMode): Promise<void>;
33
- /** How one node reaches the hub, `undefined` when the hub cannot tell. */
34
- transportOf(nodeId: string): MeshTransport | undefined;
35
- }
36
- export type MeshClearPortDecision = {
37
- readonly allowed: true;
38
- } | {
39
- readonly allowed: false;
40
- readonly blocking: readonly string[];
41
- readonly error: string;
42
- };
43
- /** Pure: may the clear port be switched off right now? */
44
- export declare function decideMeshClearPortOff(control: Pick<MeshClearPortControl, "listOnlineAgents" | "isTlsListening"> | null): MeshClearPortDecision;
45
- /** Published by the hub's broker owner; cleared on shutdown. */
46
- export declare function setProcessMeshClearPortControl(control: MeshClearPortControl | null): void;
47
- export declare function getProcessMeshClearPortControl(): MeshClearPortControl | null;
48
- /** `tls` / `clear` for an agent as the hub sees it; `undefined` off the hub. */
49
- export declare function getProcessNodeMeshTransport(nodeId: string): MeshTransport | undefined;
50
- /**
51
- * Validate a requested mode against the live mesh. `on` is always allowed; `off`
52
- * only when {@link decideMeshClearPortOff} allows. Does NOT apply it.
53
- */
54
- export declare function checkProcessMeshClearPort(mode: MeshClearPortMode): MeshClearPortDecision;
55
- /** Apply a mode that {@link checkProcessMeshClearPort} allowed. No-op where nobody can. */
56
- export declare function applyProcessMeshClearPort(mode: MeshClearPortMode): Promise<boolean>;