@decentnetwork/lan 0.1.252 → 0.1.254

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.
@@ -35,19 +35,27 @@ const DEFAULT_CONFIG_FILE = resolve(DEFAULT_CONFIG_DIR, "config.yaml");
35
35
  // DHT, and CN-side reachability was not re-tested (see docs/BOOTSTRAP-FLEET.md
36
36
  // on why a single vantage point must not be used to prune).
37
37
  export const DEFAULT_BOOTSTRAP_NODES = [
38
- // --- Rendezvous set: the three every node dials. TCP verified open. ---
38
+ // --- Rendezvous set: the three every node dials. Relay handshake verified
39
+ // with `node scripts/relay-probe.mjs` on 2026-07-25 — not just an open port.
39
40
  // US-East — the historical workhorse, and the relay mac-dev has held
40
- // continuously through every incident this month.
41
+ // continuously through every incident this month. AWS legacy infra we don't
42
+ // control, kept here for provider diversity against the two Vultr boxes.
41
43
  { host: "13.58.208.50", port: 33445, pk: "89vny8MrKdDKs7Uta9RdVmspPjnRMdwMmaiEW27pZ7gh" },
42
44
  // lens (Vultr US) — OUR OWN ela-bootstrapd, same box as the express relay.
43
45
  // It was in the iOS app's bootstrap list but missing here, which is a big
44
46
  // part of why natives could always bootstrap while JS peers struggled
45
47
  // (2026-07-25 discovery-outage postmortem: docs/BOOTSTRAP-FLEET.md).
46
48
  { host: "144.202.113.167", port: 33445, pk: "EfT4YMq6qfHdDsCiBCgsEmA78E2NxVYVKVUS9bD6w9GH" },
47
- // US-East.
48
- { host: "18.216.6.197", port: 33445, pk: "H8sqhRrQuJZ6iLtP2wanxt4LzdNrN2NNFnpPdq1uJ9n2" },
49
- // --- Reserve pool. TCP verified open; reached via the dynamic-relay-add
50
- // path when a friend advertises them, and used for DHT bootstrap breadth.
49
+ // gojipower (Vultr US) — ours. Was demoted in 0.1.252 because its ufw had no
50
+ // rule for 33445; firewall opened and relay handshake now verified (192ms),
51
+ // so it takes the third slot over the legacy AWS nodes: we can monitor and
52
+ // fix our own boxes, and 18.216.102.47 / 54.193.141.205 have already gone
53
+ // dark without notice.
54
+ { host: "149.28.98.141", port: 33445, pk: "81PPfuEyzSovgxymxr2ifiCWXdB5CGaiofx5MrxnhYV7" },
55
+ // --- Reserve pool. Relay handshake verified; reached via the
56
+ // dynamic-relay-add path when a friend advertises them, and used for DHT
57
+ // bootstrap breadth.
58
+ { host: "18.216.6.197", port: 33445, pk: "H8sqhRrQuJZ6iLtP2wanxt4LzdNrN2NNFnpPdq1uJ9n2" }, // US-East
51
59
  { host: "52.57.248.163", port: 33445, pk: "CfJLve8FNQPQJ9xYQ8oEVkPxeAPCN7iSdhnYFkWmWgLn" }, // eu-central
52
60
  { host: "35.179.41.220", port: 33445, pk: "6u2vKadPa9wqDf531QaZy7FJN3c7Wzntm7dKXxXqvyNB" }, // eu-west
53
61
  { host: "52.63.19.190", port: 33445, pk: "EeNenbyS4sx3qtu82esT1V1NMe9dZib5LyQmYGM6fboK" }, // ap-southeast
@@ -57,11 +65,10 @@ export const DEFAULT_BOOTSTRAP_NODES = [
57
65
  // gfax (Aliyun CN) — ours, running since 2026-07-02, moved under systemd
58
66
  // 2026-07-25 (identity preserved).
59
67
  { host: "139.129.193.117", port: 33445, pk: "67UQhssARwMky1YgFA2oDGZ1RiQYQmS6JqWFHxtopKq5" },
60
- // --- TCP filtered from the US as of 2026-07-25. Kept for UDP DHT bootstrap
61
- // and in case they serve other regions; must not occupy a relay slot.
62
- // gojipower (Vultr US) ours, deployed 2026-07-25. Demote until its ufw
63
- // allows 33445; promote back to the rendezvous set once verified.
64
- { host: "149.28.98.141", port: 33445, pk: "81PPfuEyzSovgxymxr2ifiCWXdB5CGaiofx5MrxnhYV7" },
68
+ // --- No relay handshake from the US as of 2026-07-25 (7/16). Kept, NOT
69
+ // pruned: several may still answer UDP DHT, and CN-side reachability was not
70
+ // retested a single vantage point must not be used to declare a node dead
71
+ // (docs/BOOTSTRAP-FLEET.md). They must simply never occupy a relay slot.
65
72
  { host: "18.216.102.47", port: 33445, pk: "G5z8MqiNDFTadFUPfMdYsYtkUDbX5mNCMVHMZtsCnFeb" },
66
73
  { host: "54.193.141.205", port: 33445, pk: "7TfZWZNV8vnBxxWzJXuvKgX2QyKkLpg2oXx3LQ5tg8LW" },
67
74
  { host: "154.64.235.176", port: 33445, pk: "GdNtV2N74fZnLjhH7NhQ18nGdxb1k8jRM9dQaK7WnxmL" },
@@ -665,19 +665,28 @@ import yaml from "js-yaml";
665
665
  var DEFAULT_CONFIG_DIR = resolve(homedir2(), ".agentnet");
666
666
  var DEFAULT_CONFIG_FILE = resolve(DEFAULT_CONFIG_DIR, "config.yaml");
667
667
  var DEFAULT_BOOTSTRAP_NODES = [
668
- // --- Rendezvous set: the three every node dials. TCP verified open. ---
668
+ // --- Rendezvous set: the three every node dials. Relay handshake verified
669
+ // with `node scripts/relay-probe.mjs` on 2026-07-25 — not just an open port.
669
670
  // US-East — the historical workhorse, and the relay mac-dev has held
670
- // continuously through every incident this month.
671
+ // continuously through every incident this month. AWS legacy infra we don't
672
+ // control, kept here for provider diversity against the two Vultr boxes.
671
673
  { host: "13.58.208.50", port: 33445, pk: "89vny8MrKdDKs7Uta9RdVmspPjnRMdwMmaiEW27pZ7gh" },
672
674
  // lens (Vultr US) — OUR OWN ela-bootstrapd, same box as the express relay.
673
675
  // It was in the iOS app's bootstrap list but missing here, which is a big
674
676
  // part of why natives could always bootstrap while JS peers struggled
675
677
  // (2026-07-25 discovery-outage postmortem: docs/BOOTSTRAP-FLEET.md).
676
678
  { host: "144.202.113.167", port: 33445, pk: "EfT4YMq6qfHdDsCiBCgsEmA78E2NxVYVKVUS9bD6w9GH" },
677
- // US-East.
679
+ // gojipower (Vultr US) — ours. Was demoted in 0.1.252 because its ufw had no
680
+ // rule for 33445; firewall opened and relay handshake now verified (192ms),
681
+ // so it takes the third slot over the legacy AWS nodes: we can monitor and
682
+ // fix our own boxes, and 18.216.102.47 / 54.193.141.205 have already gone
683
+ // dark without notice.
684
+ { host: "149.28.98.141", port: 33445, pk: "81PPfuEyzSovgxymxr2ifiCWXdB5CGaiofx5MrxnhYV7" },
685
+ // --- Reserve pool. Relay handshake verified; reached via the
686
+ // dynamic-relay-add path when a friend advertises them, and used for DHT
687
+ // bootstrap breadth.
678
688
  { host: "18.216.6.197", port: 33445, pk: "H8sqhRrQuJZ6iLtP2wanxt4LzdNrN2NNFnpPdq1uJ9n2" },
679
- // --- Reserve pool. TCP verified open; reached via the dynamic-relay-add
680
- // path when a friend advertises them, and used for DHT bootstrap breadth.
689
+ // US-East
681
690
  { host: "52.57.248.163", port: 33445, pk: "CfJLve8FNQPQJ9xYQ8oEVkPxeAPCN7iSdhnYFkWmWgLn" },
682
691
  // eu-central
683
692
  { host: "35.179.41.220", port: 33445, pk: "6u2vKadPa9wqDf531QaZy7FJN3c7Wzntm7dKXxXqvyNB" },
@@ -691,11 +700,10 @@ var DEFAULT_BOOTSTRAP_NODES = [
691
700
  // gfax (Aliyun CN) — ours, running since 2026-07-02, moved under systemd
692
701
  // 2026-07-25 (identity preserved).
693
702
  { host: "139.129.193.117", port: 33445, pk: "67UQhssARwMky1YgFA2oDGZ1RiQYQmS6JqWFHxtopKq5" },
694
- // --- TCP filtered from the US as of 2026-07-25. Kept for UDP DHT bootstrap
695
- // and in case they serve other regions; must not occupy a relay slot.
696
- // gojipower (Vultr US) ours, deployed 2026-07-25. Demote until its ufw
697
- // allows 33445; promote back to the rendezvous set once verified.
698
- { host: "149.28.98.141", port: 33445, pk: "81PPfuEyzSovgxymxr2ifiCWXdB5CGaiofx5MrxnhYV7" },
703
+ // --- No relay handshake from the US as of 2026-07-25 (7/16). Kept, NOT
704
+ // pruned: several may still answer UDP DHT, and CN-side reachability was not
705
+ // retested a single vantage point must not be used to declare a node dead
706
+ // (docs/BOOTSTRAP-FLEET.md). They must simply never occupy a relay slot.
699
707
  { host: "18.216.102.47", port: 33445, pk: "G5z8MqiNDFTadFUPfMdYsYtkUDbX5mNCMVHMZtsCnFeb" },
700
708
  { host: "54.193.141.205", port: 33445, pk: "7TfZWZNV8vnBxxWzJXuvKgX2QyKkLpg2oXx3LQ5tg8LW" },
701
709
  { host: "154.64.235.176", port: 33445, pk: "GdNtV2N74fZnLjhH7NhQ18nGdxb1k8jRM9dQaK7WnxmL" },
@@ -1,4 +1,4 @@
1
- window.__DK_UI_VERSION="0.1.252";
1
+ window.__DK_UI_VERSION="0.1.254";
2
2
  const ICON_PATHS = {
3
3
  // ---- tab bar (the four must feel like one set) ----
4
4
  users: '<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/>',
@@ -2688,26 +2688,47 @@ function CallOverlay({ T, ctl, peers }) {
2688
2688
  { key: "local", stream: ctl.localStream, label: ctl.sharing ? T && T.yourScreen || "Your screen" : T && T.you || "You", mirror: !ctl.sharing }
2689
2689
  ].filter((t) => streamHasVideo(t.stream));
2690
2690
  const feat = tiles.find((t) => t.key === featured) || tiles[0] || { key: "remote", stream: ctl.remoteStream, label: name };
2691
- return /* @__PURE__ */ React.createElement("div", { style: { flex: 1, position: "relative", padding: 18, display: "flex", flexDirection: "column" } }, /* @__PURE__ */ React.createElement("div", { style: { flex: 1, position: "relative", borderRadius: 14, overflow: "hidden", background: "#000", border: "1px solid var(--line)" } }, feat.stream ? /* @__PURE__ */ React.createElement(VideoSurface, { stream: feat.stream, muted: true, style: { width: "100%", height: "100%", objectFit: "contain", transform: feat.mirror ? "scaleX(-1)" : "none" } }) : /* @__PURE__ */ React.createElement("div", { style: { width: "100%", height: "100%", display: "flex", alignItems: "center", justifyContent: "center" } }, /* @__PURE__ */ React.createElement(DkIdenticon, { seed: call.peerId, size: 92, radius: 22 })), /* @__PURE__ */ React.createElement("div", { style: { position: "absolute", left: 14, top: 12, padding: "4px 10px", borderRadius: 8, background: "rgba(0,0,0,.55)", color: "#fff", fontFamily: "var(--mono)", fontSize: 12, fontWeight: 600 } }, feat.label)), tiles.length > 0 && /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 12, marginTop: 12, justifyContent: "center", flexWrap: "wrap" } }, tiles.map((t) => /* @__PURE__ */ React.createElement(
2692
- "button",
2693
- {
2694
- key: t.key,
2695
- onClick: () => setFeatured(t.key),
2696
- style: {
2697
- position: "relative",
2698
- width: 150,
2699
- height: 96,
2700
- borderRadius: 10,
2701
- overflow: "hidden",
2702
- background: "#000",
2703
- cursor: "pointer",
2704
- padding: 0,
2705
- border: feat.key === t.key ? "2px solid var(--accent)" : "1px solid var(--line)"
2706
- }
2707
- },
2708
- /* @__PURE__ */ React.createElement(VideoSurface, { stream: t.stream, muted: true, style: { width: "100%", height: "100%", objectFit: "cover", transform: t.mirror ? "scaleX(-1)" : "none" } }),
2709
- /* @__PURE__ */ React.createElement("span", { style: { position: "absolute", left: 6, bottom: 5, padding: "2px 6px", borderRadius: 6, background: "rgba(0,0,0,.6)", color: "#fff", fontSize: 10, fontFamily: "var(--mono)" } }, t.label)
2710
- ))), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", justifyContent: "center", marginTop: 14 } }, /* @__PURE__ */ React.createElement("div", { style: { padding: "16px 26px", borderRadius: 20, background: "color-mix(in oklab, var(--panel), transparent 8%)", border: "1px solid var(--line)" } }, controls)));
2691
+ return (
2692
+ // The thumbnail strip and the controls FLOAT over the video instead of
2693
+ // stacking under it. A phone camera is 9:16, so the featured tile is
2694
+ // height-limited — `object-fit: contain` already shows the whole frame,
2695
+ // but every pixel of chrome below the video shrinks the only dimension
2696
+ // that matters. Stacked, those two rows ate ~210px; in a 900px-tall
2697
+ // window that is a third of the portrait image. Overlaying them is also
2698
+ // what every other call app does.
2699
+ /* @__PURE__ */ React.createElement("div", { style: { flex: 1, minHeight: 0, position: "relative", padding: 18 } }, /* @__PURE__ */ React.createElement("div", { style: { width: "100%", height: "100%", position: "relative", borderRadius: 14, overflow: "hidden", background: "#000", border: "1px solid var(--line)" } }, feat.stream ? /* @__PURE__ */ React.createElement(VideoSurface, { stream: feat.stream, muted: true, style: { width: "100%", height: "100%", objectFit: "contain", transform: feat.mirror ? "scaleX(-1)" : "none" } }) : /* @__PURE__ */ React.createElement("div", { style: { width: "100%", height: "100%", display: "flex", alignItems: "center", justifyContent: "center" } }, /* @__PURE__ */ React.createElement(DkIdenticon, { seed: call.peerId, size: 92, radius: 22 })), /* @__PURE__ */ React.createElement("div", { style: { position: "absolute", left: 14, top: 12, padding: "4px 10px", borderRadius: 8, background: "rgba(0,0,0,.55)", color: "#fff", fontFamily: "var(--mono)", fontSize: 12, fontWeight: 600 } }, feat.label), /* @__PURE__ */ React.createElement("div", { style: {
2700
+ position: "absolute",
2701
+ left: 0,
2702
+ right: 0,
2703
+ bottom: 0,
2704
+ paddingTop: 60,
2705
+ display: "flex",
2706
+ flexDirection: "column",
2707
+ alignItems: "center",
2708
+ gap: 12,
2709
+ background: "linear-gradient(to top, rgba(0,0,0,.65), rgba(0,0,0,0))",
2710
+ pointerEvents: "none"
2711
+ } }, tiles.length > 0 && /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 12, justifyContent: "center", flexWrap: "wrap", pointerEvents: "auto" } }, tiles.map((t) => /* @__PURE__ */ React.createElement(
2712
+ "button",
2713
+ {
2714
+ key: t.key,
2715
+ onClick: () => setFeatured(t.key),
2716
+ style: {
2717
+ position: "relative",
2718
+ width: 150,
2719
+ height: 96,
2720
+ borderRadius: 10,
2721
+ overflow: "hidden",
2722
+ background: "#000",
2723
+ cursor: "pointer",
2724
+ padding: 0,
2725
+ border: feat.key === t.key ? "2px solid var(--accent)" : "1px solid var(--line)"
2726
+ }
2727
+ },
2728
+ /* @__PURE__ */ React.createElement(VideoSurface, { stream: t.stream, muted: true, style: { width: "100%", height: "100%", objectFit: "contain", transform: t.mirror ? "scaleX(-1)" : "none" } }),
2729
+ /* @__PURE__ */ React.createElement("span", { style: { position: "absolute", left: 6, bottom: 5, padding: "2px 6px", borderRadius: 6, background: "rgba(0,0,0,.6)", color: "#fff", fontSize: 10, fontFamily: "var(--mono)" } }, t.label)
2730
+ ))), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", justifyContent: "center", marginBottom: 16, pointerEvents: "auto" } }, /* @__PURE__ */ React.createElement("div", { style: { padding: "16px 26px", borderRadius: 20, background: "color-mix(in oklab, var(--panel), transparent 8%)", border: "1px solid var(--line)" } }, controls)))))
2731
+ );
2711
2732
  })() : /* @__PURE__ */ React.createElement("div", { style: { flex: 1, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: 22 } }, /* @__PURE__ */ React.createElement("div", { style: { position: "relative", display: "flex", alignItems: "center", justifyContent: "center" } }, !connected && /* @__PURE__ */ React.createElement("span", { style: { position: "absolute", width: 150, height: 150, borderRadius: 999, border: "2px solid var(--accent)", animation: "dkpulse 2s ease-out infinite" } }), /* @__PURE__ */ React.createElement(DkIdenticon, { seed: call.peerId, size: 108, radius: 26 })), /* @__PURE__ */ React.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ React.createElement("div", { style: { fontFamily: "var(--mono)", fontSize: 22, fontWeight: 700, color: "var(--text)" } }, name), /* @__PURE__ */ React.createElement("div", { style: { marginTop: 8, fontFamily: "var(--mono)", fontSize: 12.5, color: "var(--faint)" } }, stateLabel)), /* @__PURE__ */ React.createElement("div", { style: { marginTop: 18 } }, controls)));
2712
2733
  }
2713
2734
  Object.assign(window, { useCallController, CallOverlay, IncomingCallModal });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decentnetwork/lan",
3
- "version": "0.1.252",
3
+ "version": "0.1.254",
4
4
  "description": "Private virtual LAN for self-hosted services and AI agents, built on Elastos Carrier. NAT-traversal, name service, ACL, all over a peer-to-peer mesh — no public IP required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",