@camstack/system 1.2.116 → 1.2.117

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 (57) 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/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  8. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  9. package/dist/builtins/console-logging/index.js +1 -1
  10. package/dist/builtins/console-logging/index.mjs +1 -1
  11. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  12. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  13. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  14. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  15. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  16. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  17. package/dist/builtins/hub-forwarder/index.js +1 -1
  18. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  19. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  20. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  21. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  22. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  23. package/dist/builtins/local-network/ipv6-lan.d.ts +26 -0
  24. package/dist/builtins/local-network/local-network.addon.d.ts +28 -14
  25. package/dist/builtins/local-network/local-network.addon.js +195 -25
  26. package/dist/builtins/local-network/local-network.addon.mjs +191 -26
  27. package/dist/builtins/loki-logging/index.js +1 -1
  28. package/dist/builtins/loki-logging/index.mjs +1 -1
  29. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  31. package/dist/builtins/platform-probe/index.js +1 -1
  32. package/dist/builtins/platform-probe/index.mjs +1 -1
  33. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/snapshot/index.js +1 -1
  36. package/dist/builtins/snapshot/index.mjs +1 -1
  37. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  41. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  43. package/dist/builtins/system-config/system-config.addon.js +1 -1
  44. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  45. package/dist/builtins/winston-logging/index.js +1 -1
  46. package/dist/builtins/winston-logging/index.mjs +1 -1
  47. package/dist/{dist-BpzbLPel.mjs → dist-D4Vmj8iw.mjs} +16 -8
  48. package/dist/{dist-Cri60Jd0.js → dist-DMEGlqg6.js} +16 -8
  49. package/dist/http/lan-http-bind.d.ts +12 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.js +3 -2
  52. package/dist/index.mjs +3 -3
  53. package/dist/{lan-http-bind-CZ4EBeD_.js → lan-http-bind-DmgpFP6_.js} +53 -11
  54. package/dist/{lan-http-bind-BDJm4d-K.mjs → lan-http-bind-jKrj6OjQ.mjs} +48 -12
  55. package/dist/{retired-settings-keys-SrxMH3OT.mjs → retired-settings-keys--aM_vGF9.mjs} +1 -1
  56. package/dist/{retired-settings-keys-BVAxT5XL.js → retired-settings-keys-DET4YkAU.js} +1 -1
  57. package/package.json +1 -1
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  //#region src/builtins/loki-logging/loki-payload.ts
8
8
  /**
9
9
  * Loki rejects a label name that is not a valid Prometheus label
@@ -1,4 +1,4 @@
1
- import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  //#region src/builtins/loki-logging/loki-payload.ts
3
3
  /**
4
4
  * Loki rejects a label name that is not a valid Prometheus label
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,4 +1,4 @@
1
- import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  import { execFile, execFileSync } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as os from "node:os";
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
+ import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import * as os from "node:os";
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
8
8
  /**
9
9
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,4 +1,4 @@
1
- import { Gt as EventCategory, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { Gt as EventCategory, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  let zod = require("zod");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
@@ -1,4 +1,4 @@
1
- import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { V as filesystemBrowseCapability, pt as storageProviderCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { V as filesystemBrowseCapability, pt as storageProviderCapability, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -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-Cri60Jd0.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-BVAxT5XL.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-DET4YkAU.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_fs = require("node:fs");
10
10
  let node_module = require("node:module");
@@ -1,5 +1,5 @@
1
- import { A as dataStoreProviderCapability, Bt as parseJsonUnknown, _t as vectorStoreCapability, f as RUNTIME_DEFAULTS, gt as vectorDimFromBase64, j as decodeVectorBase64, kt as asJsonObject, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
2
- import { r as retiredKeyStoreOf, t as purgeRetiredSettingsKeys } from "../../retired-settings-keys-SrxMH3OT.mjs";
1
+ import { A as dataStoreProviderCapability, Bt as parseJsonUnknown, _t as vectorStoreCapability, f as RUNTIME_DEFAULTS, gt as vectorDimFromBase64, j as decodeVectorBase64, kt as asJsonObject, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
+ import { r as retiredKeyStoreOf, t as purgeRetiredSettingsKeys } from "../../retired-settings-keys--aM_vGF9.mjs";
3
3
  import { createRequire } from "node:module";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { statSync } from "node:fs";
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,4 +1,4 @@
1
- import { dt as storageCapability, ft as storageMigrationCapability, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as settingsStoreCapability, yt as BaseAddon, zt as parseJsonObject } from "../../dist-BpzbLPel.mjs";
1
+ import { dt as storageCapability, ft as storageMigrationCapability, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as settingsStoreCapability, yt as BaseAddon, zt as parseJsonObject } from "../../dist-D4Vmj8iw.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs/promises";
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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  //#region src/builtins/system-config/system-config.addon.ts
8
8
  /**
9
9
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, vt as errMsg, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { It as hydrateSchema, vt as errMsg, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  //#region src/builtins/system-config/system-config.addon.ts
3
3
  /**
4
4
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -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-Cri60Jd0.js");
6
+ const require_dist = require("../../dist-DMEGlqg6.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-BpzbLPel.mjs";
1
+ import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-D4Vmj8iw.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  import * as path$1 from "node:path";
4
4
  import path from "node:path";
@@ -19197,6 +19197,9 @@ var storageProviderCapability = {
19197
19197
  endDownload: method(EndDownloadInputSchema, z.void(), { kind: "mutation" })
19198
19198
  }
19199
19199
  };
19200
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19201
+ var ProfileSettingsSchemaBridge = z.unknown().nullable();
19202
+ var ProfileSettingsBagSchema = z.record(z.string(), z.unknown());
19200
19203
  /**
19201
19204
  * A live terminal session hosted by the provider addon. Output and input do
19202
19205
  * NOT flow through the capability — they use the addon data plane
@@ -19231,7 +19234,9 @@ var TerminalProfileInfoSchema = z.object({
19231
19234
  executable: z.string().optional(),
19232
19235
  args: z.array(z.string()).readonly().optional(),
19233
19236
  cwd: z.string().optional(),
19234
- environment: z.array(z.string()).readonly().optional()
19237
+ environment: z.array(z.string()).readonly().optional(),
19238
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19239
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19235
19240
  });
19236
19241
  /**
19237
19242
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19248,7 +19253,8 @@ var TerminalInstanceInfoSchema = z.object({
19248
19253
  executable: z.string(),
19249
19254
  args: z.array(z.string()).readonly(),
19250
19255
  cwd: z.string(),
19251
- environment: z.array(z.string()).readonly()
19256
+ environment: z.array(z.string()).readonly(),
19257
+ profileSettings: ProfileSettingsBagSchema
19252
19258
  });
19253
19259
  var TerminalLegacyCameraSchema = z.object({
19254
19260
  stableId: z.string(),
@@ -19298,7 +19304,8 @@ var terminalSessionCapability = {
19298
19304
  executable: z.string().max(1024).optional(),
19299
19305
  args: z.array(z.string().max(2048)).max(64).optional(),
19300
19306
  cwd: z.string().max(1024).optional(),
19301
- environment: z.array(z.string().max(4096)).max(64).optional()
19307
+ environment: z.array(z.string().max(4096)).max(64).optional(),
19308
+ profileSettings: ProfileSettingsBagSchema.optional()
19302
19309
  }), TerminalInstanceInfoSchema, {
19303
19310
  kind: "mutation",
19304
19311
  auth: "admin"
@@ -19309,7 +19316,8 @@ var terminalSessionCapability = {
19309
19316
  executable: z.string().max(1024).optional(),
19310
19317
  args: z.array(z.string().max(2048)).max(64).optional(),
19311
19318
  cwd: z.string().max(1024).optional(),
19312
- environment: z.array(z.string().max(4096)).max(64).optional()
19319
+ environment: z.array(z.string().max(4096)).max(64).optional(),
19320
+ profileSettings: ProfileSettingsBagSchema.optional()
19313
19321
  }), TerminalInstanceInfoSchema, {
19314
19322
  kind: "mutation",
19315
19323
  auth: "admin"
@@ -23781,10 +23789,10 @@ var lawnMowerControlCapability = {
23781
23789
  *
23782
23790
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23783
23791
  * to receive an ordered list of candidate base URLs it should race
23784
- * on connect — LAN IPv4 first (lowest latency when on same network),
23785
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23786
- * race them with short timeouts and stick with the winner for the
23787
- * session.
23792
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
23793
+ * when on the same network), then public hostname (if a tunnel is
23794
+ * up). The SDK can race them with short timeouts and stick with the
23795
+ * winner for the session.
23788
23796
  *
23789
23797
  * Why hub-only: agents are not directly addressable by the operator's
23790
23798
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -19197,6 +19197,9 @@ var storageProviderCapability = {
19197
19197
  endDownload: method(EndDownloadInputSchema, zod.z.void(), { kind: "mutation" })
19198
19198
  }
19199
19199
  };
19200
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19201
+ var ProfileSettingsSchemaBridge = zod.z.unknown().nullable();
19202
+ var ProfileSettingsBagSchema = zod.z.record(zod.z.string(), zod.z.unknown());
19200
19203
  /**
19201
19204
  * A live terminal session hosted by the provider addon. Output and input do
19202
19205
  * NOT flow through the capability — they use the addon data plane
@@ -19231,7 +19234,9 @@ var TerminalProfileInfoSchema = zod.z.object({
19231
19234
  executable: zod.z.string().optional(),
19232
19235
  args: zod.z.array(zod.z.string()).readonly().optional(),
19233
19236
  cwd: zod.z.string().optional(),
19234
- environment: zod.z.array(zod.z.string()).readonly().optional()
19237
+ environment: zod.z.array(zod.z.string()).readonly().optional(),
19238
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19239
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19235
19240
  });
19236
19241
  /**
19237
19242
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19248,7 +19253,8 @@ var TerminalInstanceInfoSchema = zod.z.object({
19248
19253
  executable: zod.z.string(),
19249
19254
  args: zod.z.array(zod.z.string()).readonly(),
19250
19255
  cwd: zod.z.string(),
19251
- environment: zod.z.array(zod.z.string()).readonly()
19256
+ environment: zod.z.array(zod.z.string()).readonly(),
19257
+ profileSettings: ProfileSettingsBagSchema
19252
19258
  });
19253
19259
  var TerminalLegacyCameraSchema = zod.z.object({
19254
19260
  stableId: zod.z.string(),
@@ -19298,7 +19304,8 @@ var terminalSessionCapability = {
19298
19304
  executable: zod.z.string().max(1024).optional(),
19299
19305
  args: zod.z.array(zod.z.string().max(2048)).max(64).optional(),
19300
19306
  cwd: zod.z.string().max(1024).optional(),
19301
- environment: zod.z.array(zod.z.string().max(4096)).max(64).optional()
19307
+ environment: zod.z.array(zod.z.string().max(4096)).max(64).optional(),
19308
+ profileSettings: ProfileSettingsBagSchema.optional()
19302
19309
  }), TerminalInstanceInfoSchema, {
19303
19310
  kind: "mutation",
19304
19311
  auth: "admin"
@@ -19309,7 +19316,8 @@ var terminalSessionCapability = {
19309
19316
  executable: zod.z.string().max(1024).optional(),
19310
19317
  args: zod.z.array(zod.z.string().max(2048)).max(64).optional(),
19311
19318
  cwd: zod.z.string().max(1024).optional(),
19312
- environment: zod.z.array(zod.z.string().max(4096)).max(64).optional()
19319
+ environment: zod.z.array(zod.z.string().max(4096)).max(64).optional(),
19320
+ profileSettings: ProfileSettingsBagSchema.optional()
19313
19321
  }), TerminalInstanceInfoSchema, {
19314
19322
  kind: "mutation",
19315
19323
  auth: "admin"
@@ -23781,10 +23789,10 @@ var lawnMowerControlCapability = {
23781
23789
  *
23782
23790
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
23783
23791
  * to receive an ordered list of candidate base URLs it should race
23784
- * on connect — LAN IPv4 first (lowest latency when on same network),
23785
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
23786
- * race them with short timeouts and stick with the winner for the
23787
- * session.
23792
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
23793
+ * when on the same network), then public hostname (if a tunnel is
23794
+ * up). The SDK can race them with short timeouts and stick with the
23795
+ * winner for the session.
23788
23796
  *
23789
23797
  * Why hub-only: agents are not directly addressable by the operator's
23790
23798
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -1,4 +1,5 @@
1
1
  import { IncomingMessage, ServerResponse } from 'node:http';
2
+ import { Duplex } from 'node:stream';
2
3
  export interface LanHttpBindOptions {
3
4
  readonly enabled: boolean;
4
5
  readonly port: number;
@@ -10,8 +11,18 @@ export interface LanHttpBindResult {
10
11
  readonly port: number;
11
12
  }
12
13
  export type LanHttpRequestHandler = (req: IncomingMessage, res: ServerResponse) => void;
14
+ export type LanHttpUpgradeHandler = (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
15
+ export interface LanHttpHandlers {
16
+ readonly onRequest: LanHttpRequestHandler;
17
+ readonly onUpgrade: LanHttpUpgradeHandler;
18
+ }
13
19
  export declare const DEFAULT_LAN_HTTP_PORT = 4480;
14
- export declare function registerLanHttpHandler(next: LanHttpRequestHandler | null): void;
20
+ /** Map "all IPv4" to dual-stack IPv6 (`::`, ipv6Only false) so IPv4 still works. */
21
+ export declare function allFamiliesListenHost(host: string): {
22
+ host: string;
23
+ ipv6Only: boolean;
24
+ };
25
+ export declare function registerLanHttpHandler(next: LanHttpHandlers | null): void;
15
26
  export declare function readLanHttpState(): LanHttpBindResult;
16
27
  export declare function applyLanHttp(options: LanHttpBindOptions): Promise<LanHttpBindResult>;
17
28
  /** After the hub registers the Fastify request handler, bind whatever was pending. */
package/dist/index.d.ts CHANGED
@@ -80,7 +80,7 @@ export { StorageLocationManager } from './storage/storage-location-manager.js';
80
80
  export type { IFileStorage, IStorageLocation, IStorageProvider as ICoreStorageProvider, IStructuredStorage, QueryFilter, StorageRecord, } from './storage/storage-manager.js';
81
81
  export { StorageManager } from './storage/storage-manager.js';
82
82
  export * from './tls/index.js';
83
- export { applyLanHttp, bindPendingLanHttp, closeLanHttp, DEFAULT_LAN_HTTP_PORT, readLanHttpState, registerLanHttpHandler, } from './http/lan-http-bind.js';
83
+ export { applyLanHttp, allFamiliesListenHost, bindPendingLanHttp, closeLanHttp, DEFAULT_LAN_HTTP_PORT, readLanHttpState, registerLanHttpHandler, } from './http/lan-http-bind.js';
84
84
  export { IntegrationRegistry } from './builtins/sqlite-storage/integration-registry.js';
85
85
  export { type EnsureAddonNativePrebuildsOptions, ensureAddonNativePrebuilds, type NativeEnsureOutcome, type NativeEnsureResult, } from './kernel/deps/ensure-addon-natives.js';
86
86
  export { type EnsureNativePrebuildsOptions, ensureNativePrebuilds, hasDotNode, NATIVE_SCAN_DEPTH, type PrebuildFetchFn, type PrebuildTarget, TRADITIONAL_NATIVE_PACKAGES, } from './kernel/deps/ensure-native-prebuilds.js';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-Cri60Jd0.js");
3
+ const require_dist = require("./dist-DMEGlqg6.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_formatter = require("./formatter-DqAKDlvN.js");
@@ -27,7 +27,7 @@ const require_builtins_winston_logging_index = require("./builtins/winston-loggi
27
27
  const require_file_data_plane = require("./file-data-plane-DUHPHa-Y.js");
28
28
  const require_manifest_python_deps = require("./manifest-python-deps-CwBbX4Ut.js");
29
29
  const require_resource_monitor = require("./resource-monitor-CdnzxBLP.js");
30
- const require_lan_http_bind = require("./lan-http-bind-CZ4EBeD_.js");
30
+ const require_lan_http_bind = require("./lan-http-bind-DmgpFP6_.js");
31
31
  const require_custom_action_registry = require("./custom-action-registry-jY0NOZK8.js");
32
32
  let zod = require("zod");
33
33
  let node_crypto = require("node:crypto");
@@ -94948,6 +94948,7 @@ exports.WinstonLoggingAddon = require_builtins_winston_logging_index.WinstonLogg
94948
94948
  exports.__resetCapUsageRegistryForTests = require_manifest_python_deps.__resetCapUsageRegistryForTests;
94949
94949
  exports.adaptBrokerToCluster = require_manifest_python_deps.adaptBrokerToCluster;
94950
94950
  exports.addonSettingsCapability = require_dist.addonSettingsCapability;
94951
+ exports.allFamiliesListenHost = require_lan_http_bind.allFamiliesListenHost;
94951
94952
  exports.applyLanHttp = require_lan_http_bind.applyLanHttp;
94952
94953
  exports.bindPendingLanHttp = require_lan_http_bind.bindPendingLanHttp;
94953
94954
  exports.bootstrapSchema = bootstrapSchema;
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { At as asNumber, B as extractNestedAddonId, Bt as parseJsonUnknown$1, Dt as ReadinessTimeoutError, Et as ReadinessRegistry, Ft as expandCapMethods, Gt as EventCategory$1, H as isArrayOutputSchema, Ht as resolveCapMount, J as lifecycleJobSchema, K as isVoidInput, Mt as createEvent, Nt as emitDownForOwnedCaps, Q as looseSchema, St as DEVICE_STATUS_METHOD, U as isCollectionArrayMethod, Ut as scopeKey, Vt as readinessKey, W as isObjectInput, Z as logLevelAtMost, bt as DATAPLANE_SECRET_HEADER$1, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, it as procedureAuthKey, jt as asString$1, kt as asJsonObject$1, ot as scopesAllowAddon, q as kebabToCamel, st as scopesAllowDeviceCap, t as ALL_CAPABILITY_DEFINITIONS, tt as objectInputDeclaresAddonId, vt as errMsg$1, xt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, y as addonSettingsCapability, zt as parseJsonObject } from "./dist-BpzbLPel.mjs";
2
+ import { At as asNumber, B as extractNestedAddonId, Bt as parseJsonUnknown$1, Dt as ReadinessTimeoutError, Et as ReadinessRegistry, Ft as expandCapMethods, Gt as EventCategory$1, H as isArrayOutputSchema, Ht as resolveCapMount, J as lifecycleJobSchema, K as isVoidInput, Mt as createEvent, Nt as emitDownForOwnedCaps, Q as looseSchema, St as DEVICE_STATUS_METHOD, U as isCollectionArrayMethod, Ut as scopeKey, Vt as readinessKey, W as isObjectInput, Z as logLevelAtMost, bt as DATAPLANE_SECRET_HEADER$1, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, it as procedureAuthKey, jt as asString$1, kt as asJsonObject$1, ot as scopesAllowAddon, q as kebabToCamel, st as scopesAllowDeviceCap, t as ALL_CAPABILITY_DEFINITIONS, tt as objectInputDeclaresAddonId, vt as errMsg$1, xt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, y as addonSettingsCapability, zt as parseJsonObject } from "./dist-D4Vmj8iw.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { t as formatLogLine } from "./formatter-B7qW8bPJ.mjs";
@@ -26,7 +26,7 @@ import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logg
26
26
  import { a as parseTokenizedUrl, c as collectModelFiles, d as downloadModel, f as ensureModel, h as isModelDownloaded, i as parseRangeHeader, l as deleteModelFromDisk, m as getModelFilePath, n as contentTypeFor, o as resolveFilePath, p as fetchJson, r as createAuthenticatedFileServer, s as ModelDownloadService, t as createFileDataPlaneHandler, u as downloadFile } from "./file-data-plane-CuE_hBli.mjs";
27
27
  import { $ as buildNativeCapProxy, A as createHubCapForwardService, At as buildHeapSample, B as AGENT_CAP_FWD_ACTION, C as brokerTransportLink, Ct as runNpm, D as localProviderLink, Dt as HEAP_WATCH_INTERVAL_MS, E as ipcParentLink, Et as HEAP_RECLAIM_TRIGGER_MB, F as createUdsLogger, Ft as strandedMb, G as callWithServiceDiscovery, H as CapRouteResolver, I as createUdsLoggerWithControl, J as UdsLocalTransportServer, K as createLocalTransport, L as LocalChildClient, M as createUdsEventBridge, Mt as shouldReclaim, N as createUdsEventBus, Nt as startHeapWatch, O as HUB_CAP_FWD_ACTION, Ot as HEAP_WATCH_WARN_RATIO, P as udsChildLogToWorkerEntry, Pt as startRunnerHeapWatch, Q as encodeFrame, R as LocalChildRegistry, S as brokerCallForCap, St as resolveNpmInvocation, T as ipcChildLink, Tt as HEAP_RECLAIM_MIN_INTERVAL_MS, U as CapRouteError, V as AGENT_CAP_FWD_SERVICE, W as classifyCapRoute, X as localEndpointPath, Y as SocketChannel, Z as FrameDecoder, _ as createKernelHwAccel, _t as CapabilityHandle, a as getWorkerDeviceRegistry, b as __resetCapUsageRegistryForTests, bt as installManifestNativeDeps, c as setHubConnected, ct as NATIVE_PROVIDER_SERVICE_INFIX, d as getBrokerEventBus, dt as capBareAction, et as buildUdsNativeCapProxy, f as getMoleculerEventStats, ft as capServiceName, g as AddonDepsManager, gt as DeviceRegistry, h as subscribePassthrough, ht as serializeTypedArrays, i as createUdsAddonContext, it as mountNativeCapService, j as createParentUnownedCallHandler, jt as createV8Reclaimer, k as HUB_CAP_FWD_SERVICE, kt as RUNNER_HEAP_WATCH_INTERVAL_MS, l as EVENT_TOPIC_PREFIX, lt as capActionName, m as setNodeEventInterest, mt as deserializeTypedArrays, n as adaptBrokerToCluster, o as getOrInitReadinessRegistry, ot as createAddonService, p as registerEventBusService, pt as parseCapAction, q as UdsLocalTransportClient, r as createAddonContext, s as getOrInitReadinessRegistryForClient, st as validateProviderRegistrations, t as installManifestPythonDeps, tt as createBrokerDeviceManagerApi, u as clusterEventTopic, ut as capActionSuffix, v as resolveHwAccel, vt as CapabilityUnavailableError, w as buildLinkChain, wt as createAddonDataPlaneFacility, x as getCapUsageRegistry, xt as resolveAddonClass, y as CapUsageRegistry, yt as copyBundledNativeModules, z as UDS_NO_ROUTE_PREFIX } from "./manifest-python-deps-SGdbr9D5.mjs";
28
28
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-BWmQ5i-o.mjs";
29
- import { S as evaluateExistingCert, _ as collectCertIdentity, a as readLanHttpState, b as MAX_LEAF_VALIDITY_DAYS, c as readTlsAccessStatus, d as writeTlsMode, f as validateUploadedTls, g as CA_COMMON_NAME, h as reissueTlsLeaf, i as closeLanHttp, l as readTlsMode, m as loadTlsCert, n as applyLanHttp, o as registerLanHttpHandler, p as ensureTlsCert, r as bindPendingLanHttp, s as readExtraSans, t as DEFAULT_LAN_HTTP_PORT, u as writeExtraSans, v as CA_VALIDITY_DAYS, x as SERVER_AUTH_OID, y as LEAF_RENEWAL_WINDOW_DAYS } from "./lan-http-bind-BDJm4d-K.mjs";
29
+ import { C as evaluateExistingCert, S as SERVER_AUTH_OID, _ as CA_COMMON_NAME, a as closeLanHttp, b as LEAF_RENEWAL_WINDOW_DAYS, c as readExtraSans, d as writeExtraSans, f as writeTlsMode, g as reissueTlsLeaf, h as loadTlsCert, i as bindPendingLanHttp, l as readTlsAccessStatus, m as ensureTlsCert, n as allFamiliesListenHost, o as readLanHttpState, p as validateUploadedTls, r as applyLanHttp, s as registerLanHttpHandler, t as DEFAULT_LAN_HTTP_PORT, u as readTlsMode, v as collectCertIdentity, x as MAX_LEAF_VALIDITY_DAYS, y as CA_VALIDITY_DAYS } from "./lan-http-bind-jKrj6OjQ.mjs";
30
30
  import { t as CustomActionRegistry } from "./custom-action-registry-F__gp_VX.mjs";
31
31
  import { z } from "zod";
32
32
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
@@ -94816,4 +94816,4 @@ var LifecycleJobEngine = class {
94816
94816
  }
94817
94817
  };
94818
94818
  //#endregion
94819
- export { AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_READINESS_SERVICE_NAME, ALL_CAPABILITY_DEFINITIONS, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AlertCenterAddon, ApiKeyManager, AuthManager, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REJECTED_EXIT_CODE, CORE_CAP_SERVICE_NAME, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DEFAULT_DATA_PATH, DEFAULT_LAN_HTTP_PORT, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JobJournal, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LokiDestination, LokiLoggingAddon, MAX_LEAF_VALIDITY_DAYS, METHOD_ACCESS_MAP, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, PYTHON_VERSION, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, RESTART_MARKER_FILE, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, ScopedLogger, ScopedTokenManager, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, ToastService, UDS_NO_ROUTE_PREFIX, UdsLocalTransportClient, UdsLocalTransportServer, UserManager, WinstonDestination, WinstonLoggingAddon, __resetCapUsageRegistryForTests, adaptBrokerToCluster, addonSettingsCapability, applyLanHttp, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildStorageLocationRegistry, buildUdsNativeCapProxy, builderMountedCapNames, callRegisterNodeWithRetry, callWithServiceDiscovery, capActionName, capActionSuffix, capBareAction, capServiceName, classifyAddonDir, classifyCapRoute, clearPendingRestart, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonService, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCoreCapService, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createKernelHwAccel, createLocalTransport, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, detectWorkspacePackagesDir, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, encodeFrame, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, fetchJson, findInPath, formatLogLine, getBrokerEventBus, getCapUsageRegistry, getFfmpegDownloadUrl, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, installManifestNativeDeps, installManifestPythonDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcChildLink, ipcParentLink, isAddonDeploySource, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isInfraCapability, isModelDownloaded, isSourceNewer, loadTlsCert, localEndpointPath, localProviderLink, mountNativeCapService, parseCapAction, parseRangeHeader, parseTokenizedUrl, proxyToUpstream, quarantineAddonResidue, readExtraSans, readLanHttpState, readPendingRestart, readTlsAccessStatus, readTlsMode, readinessKey, registerEventBusService, registerLanHttpHandler, reissueTlsLeaf, resolveFilePath, resolveHwAccel, resolveNpmInvocation, runNpm, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, serializeTypedArrays, setHubConnected, setNodeEventInterest, shouldReclaim, startHeapWatch, startRunnerHeapWatch, strandedMb, stripCamstackDeps, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, writeExtraSans, writePendingRestart, writeTlsMode };
94819
+ export { AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_READINESS_SERVICE_NAME, ALL_CAPABILITY_DEFINITIONS, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AlertCenterAddon, ApiKeyManager, AuthManager, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REJECTED_EXIT_CODE, CORE_CAP_SERVICE_NAME, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DEFAULT_DATA_PATH, DEFAULT_LAN_HTTP_PORT, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JobJournal, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LokiDestination, LokiLoggingAddon, MAX_LEAF_VALIDITY_DAYS, METHOD_ACCESS_MAP, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, PYTHON_VERSION, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, RESTART_MARKER_FILE, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, ScopedLogger, ScopedTokenManager, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, ToastService, UDS_NO_ROUTE_PREFIX, UdsLocalTransportClient, UdsLocalTransportServer, UserManager, WinstonDestination, WinstonLoggingAddon, __resetCapUsageRegistryForTests, adaptBrokerToCluster, addonSettingsCapability, allFamiliesListenHost, applyLanHttp, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildStorageLocationRegistry, buildUdsNativeCapProxy, builderMountedCapNames, callRegisterNodeWithRetry, callWithServiceDiscovery, capActionName, capActionSuffix, capBareAction, capServiceName, classifyAddonDir, classifyCapRoute, clearPendingRestart, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonService, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCoreCapService, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createKernelHwAccel, createLocalTransport, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, detectWorkspacePackagesDir, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, encodeFrame, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, fetchJson, findInPath, formatLogLine, getBrokerEventBus, getCapUsageRegistry, getFfmpegDownloadUrl, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, installManifestNativeDeps, installManifestPythonDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcChildLink, ipcParentLink, isAddonDeploySource, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isInfraCapability, isModelDownloaded, isSourceNewer, loadTlsCert, localEndpointPath, localProviderLink, mountNativeCapService, parseCapAction, parseRangeHeader, parseTokenizedUrl, proxyToUpstream, quarantineAddonResidue, readExtraSans, readLanHttpState, readPendingRestart, readTlsAccessStatus, readTlsMode, readinessKey, registerEventBusService, registerLanHttpHandler, reissueTlsLeaf, resolveFilePath, resolveHwAccel, resolveNpmInvocation, runNpm, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, serializeTypedArrays, setHubConnected, setNodeEventInterest, shouldReclaim, startHeapWatch, startRunnerHeapWatch, strandedMb, stripCamstackDeps, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, writeExtraSans, writePendingRestart, writeTlsMode };
@@ -622,11 +622,15 @@ function readTlsAccessStatus(dataDir, restartRequired = false) {
622
622
  * Second HTTP listener that shares the hub's existing request handler.
623
623
  *
624
624
  * Fastify is one protocol per instance; HTTPS stays on :4443 and this
625
- * binds a plain `http.Server` that emits `request` onto the same
626
- * handler graph (tRPC, cookies, data-plane, static).
625
+ * binds a plain `http.Server` that emits `request` AND `upgrade` onto the
626
+ * same handler graph (tRPC HTTP, cookies, data-plane, static, tRPC WS).
627
+ *
628
+ * Forwarding only `request` is not enough: the viewer speaks tRPC exclusively
629
+ * over WebSocket (`wsLink`). `/health` wins the LAN race, then `ws://…/trpc`
630
+ * hangs because nobody handles the upgrade on this socket.
627
631
  */
628
632
  var DEFAULT_HTTP_PORT = 4480;
629
- var handler = null;
633
+ var handlers = null;
630
634
  var server = null;
631
635
  var pending = null;
632
636
  var state = {
@@ -634,9 +638,21 @@ var state = {
634
638
  error: null,
635
639
  port: DEFAULT_HTTP_PORT
636
640
  };
641
+ var boundRequestedHost = null;
637
642
  var DEFAULT_LAN_HTTP_PORT = DEFAULT_HTTP_PORT;
643
+ /** Map "all IPv4" to dual-stack IPv6 (`::`, ipv6Only false) so IPv4 still works. */
644
+ function allFamiliesListenHost(host) {
645
+ if (host === "0.0.0.0" || host === "*" || host === "") return {
646
+ host: "::",
647
+ ipv6Only: false
648
+ };
649
+ return {
650
+ host,
651
+ ipv6Only: false
652
+ };
653
+ }
638
654
  function registerLanHttpHandler(next) {
639
- handler = next;
655
+ handlers = next;
640
656
  }
641
657
  function readLanHttpState() {
642
658
  return state;
@@ -652,7 +668,7 @@ async function applyLanHttp(options) {
652
668
  };
653
669
  return state;
654
670
  }
655
- if (handler === null) {
671
+ if (handlers === null) {
656
672
  state = {
657
673
  listening: false,
658
674
  error: "HTTP listener is not registered yet",
@@ -660,14 +676,17 @@ async function applyLanHttp(options) {
660
676
  };
661
677
  return state;
662
678
  }
663
- if (server !== null && state.listening && state.port === options.port) return state;
679
+ if (server !== null && state.listening && (options.port === 0 || state.port === options.port) && boundRequestedHost === options.host) return state;
664
680
  await closeLanHttp();
665
681
  try {
666
- server = await listenHttp(options.port, options.host, handler);
682
+ const bound = await listenHttp(options.port, options.host, handlers);
683
+ server = bound;
684
+ boundRequestedHost = options.host;
685
+ const addr = bound.address();
667
686
  state = {
668
687
  listening: true,
669
688
  error: null,
670
- port: options.port
689
+ port: typeof addr === "object" && addr !== null ? addr.port : options.port
671
690
  };
672
691
  return state;
673
692
  } catch (err) {
@@ -692,16 +711,29 @@ async function bindPendingLanHttp() {
692
711
  async function closeLanHttp() {
693
712
  const current = server;
694
713
  server = null;
714
+ boundRequestedHost = null;
695
715
  if (current === null) return;
696
716
  await new Promise((resolve) => {
697
717
  current.close(() => resolve());
698
718
  });
699
719
  }
700
- function listenHttp(port, host, onRequest) {
720
+ function listenHttp(port, host, next) {
721
+ const resolved = allFamiliesListenHost(host);
722
+ return listenOn(port, resolved, next).catch((err) => {
723
+ if (resolved.host === "::" && host !== "::") return listenOn(port, {
724
+ host: "0.0.0.0",
725
+ ipv6Only: false
726
+ }, next);
727
+ throw err;
728
+ });
729
+ }
730
+ function listenOn(port, bind, next) {
701
731
  return new Promise((resolve, reject) => {
702
- const created = (0, node_http.createServer)(onRequest);
732
+ const created = (0, node_http.createServer)(next.onRequest);
733
+ created.on("upgrade", next.onUpgrade);
703
734
  const onError = (err) => {
704
735
  created.off("listening", onListening);
736
+ created.close();
705
737
  reject(err);
706
738
  };
707
739
  const onListening = () => {
@@ -710,7 +742,11 @@ function listenHttp(port, host, onRequest) {
710
742
  };
711
743
  created.once("error", onError);
712
744
  created.once("listening", onListening);
713
- created.listen(port, host);
745
+ created.listen({
746
+ port,
747
+ host: bind.host,
748
+ ipv6Only: bind.ipv6Only
749
+ });
714
750
  });
715
751
  }
716
752
  //#endregion
@@ -750,6 +786,12 @@ Object.defineProperty(exports, "SERVER_AUTH_OID", {
750
786
  return SERVER_AUTH_OID;
751
787
  }
752
788
  });
789
+ Object.defineProperty(exports, "allFamiliesListenHost", {
790
+ enumerable: true,
791
+ get: function() {
792
+ return allFamiliesListenHost;
793
+ }
794
+ });
753
795
  Object.defineProperty(exports, "applyLanHttp", {
754
796
  enumerable: true,
755
797
  get: function() {