@fengye404/termpilot 0.2.2 → 0.2.3

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 (2) hide show
  1. package/dist/cli.js +39 -4
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -652,8 +652,7 @@ function createDaemonFromEnv() {
652
652
  function isLocalRelayHost(hostname) {
653
653
  return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || /^10\./.test(hostname) || /^192\.168\./.test(hostname) || /^172\.(1[6-9]|2\d|3[0-1])\./.test(hostname);
654
654
  }
655
- function getRelayBaseCandidates() {
656
- const relayUrl = process.env.TERMPILOT_RELAY_URL ?? "ws://127.0.0.1:8787/ws";
655
+ function getRelayBaseCandidates(relayUrl = process.env.TERMPILOT_RELAY_URL ?? "ws://127.0.0.1:8787/ws") {
657
656
  let url;
658
657
  try {
659
658
  url = new URL(relayUrl);
@@ -686,6 +685,32 @@ function getRelayBaseCandidates() {
686
685
  }
687
686
  return candidates;
688
687
  }
688
+ async function isRelayReachable(baseUrl) {
689
+ try {
690
+ const response = await fetch(new URL("/health", baseUrl), {
691
+ signal: AbortSignal.timeout(2e3)
692
+ });
693
+ return response.ok;
694
+ } catch {
695
+ return false;
696
+ }
697
+ }
698
+ async function resolvePreferredRelayUrl(relayUrl) {
699
+ const candidates = getRelayBaseCandidates(relayUrl);
700
+ if (candidates.length === 1) {
701
+ return candidates[0].relayUrl;
702
+ }
703
+ const primary = candidates[0];
704
+ if (await isRelayReachable(primary.baseUrl)) {
705
+ return primary.relayUrl;
706
+ }
707
+ for (const candidate of candidates.slice(1)) {
708
+ if (await isRelayReachable(candidate.baseUrl)) {
709
+ return candidate.relayUrl;
710
+ }
711
+ }
712
+ return primary.relayUrl;
713
+ }
689
714
  function getAgentToken() {
690
715
  return process.env.TERMPILOT_AGENT_TOKEN ?? DEFAULT_AGENT_TOKEN;
691
716
  }
@@ -1076,9 +1101,19 @@ async function waitForPairingCode(deviceId) {
1076
1101
  async function runStart(argv) {
1077
1102
  const args = parseArgs(argv);
1078
1103
  const shouldPair = Boolean(args.pair);
1079
- const { config, source } = await ensureConfigured(argv);
1104
+ const resolved = await ensureConfigured(argv);
1105
+ let { config } = resolved;
1106
+ const { source } = resolved;
1107
+ const preferredRelayUrl = await resolvePreferredRelayUrl(config.relayUrl);
1108
+ if (preferredRelayUrl !== config.relayUrl) {
1109
+ config = {
1110
+ ...config,
1111
+ relayUrl: preferredRelayUrl
1112
+ };
1113
+ console.log(`\u5DF2\u81EA\u52A8\u4FEE\u6B63 relay \u5730\u5740\u4E3A: ${preferredRelayUrl}`);
1114
+ }
1080
1115
  applyAgentConfig(config);
1081
- if (source === "cli" || source === "prompt") {
1116
+ if (source === "cli" || source === "prompt" || source === "saved") {
1082
1117
  saveAgentConfig(config);
1083
1118
  }
1084
1119
  if (args.foreground) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fengye404/termpilot",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@10.31.0",
6
6
  "description": "一个基于 tmux 的终端会话跨端查看与控制原型。",