@xrkseek/harness 0.7.3 → 0.7.5

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 (81) hide show
  1. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.d.ts +2 -2
  2. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.js +3 -3
  3. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.js.map +1 -1
  4. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts +1 -1
  5. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts.map +1 -1
  6. package/node_modules/@xrkseek/llm-registry/dist/index.js.map +1 -1
  7. package/node_modules/@xrkseek/llm-registry/dist/types.d.ts +15 -1
  8. package/node_modules/@xrkseek/llm-registry/dist/types.d.ts.map +1 -1
  9. package/node_modules/@xrkseek/llm-registry/dist/types.js +36 -0
  10. package/node_modules/@xrkseek/llm-registry/dist/types.js.map +1 -1
  11. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  12. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.d.ts.map +1 -1
  13. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js +5 -2
  14. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js.map +1 -1
  15. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.d.ts.map +1 -1
  16. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js +33 -8
  17. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js.map +1 -1
  18. package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
  19. package/node_modules/@xrkseek/server-face/dist/model-catalog.js +6 -6
  20. package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
  21. package/node_modules/@xrkseek/server-face/dist/session-status.js +2 -2
  22. package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
  23. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  24. package/node_modules/@xrkseek/server-host/dist/index.js +35 -1
  25. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  26. package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts +14 -0
  27. package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts.map +1 -1
  28. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-loopback-llm-bridge.d.ts.map +1 -1
  29. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-loopback-llm-bridge.js +29 -0
  30. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-loopback-llm-bridge.js.map +1 -1
  31. package/node_modules/@xrkseek/server-http/dist/dsh-compat/dsh-compat-matrix.js +1 -1
  32. package/node_modules/@xrkseek/server-http/dist/dsh-compat/dsh-compat-matrix.js.map +1 -1
  33. package/node_modules/@xrkseek/server-http/dist/dsh-compat/host-apply-bridge.d.ts +6 -0
  34. package/node_modules/@xrkseek/server-http/dist/dsh-compat/host-apply-bridge.d.ts.map +1 -1
  35. package/node_modules/@xrkseek/server-http/dist/dsh-compat/host-apply-bridge.js +16 -9
  36. package/node_modules/@xrkseek/server-http/dist/dsh-compat/host-apply-bridge.js.map +1 -1
  37. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts +3 -2
  38. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts.map +1 -1
  39. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js +3 -2
  40. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js.map +1 -1
  41. package/node_modules/@xrkseek/server-http/dist/dsh-compat/market.d.ts.map +1 -1
  42. package/node_modules/@xrkseek/server-http/dist/dsh-compat/market.js +66 -2
  43. package/node_modules/@xrkseek/server-http/dist/dsh-compat/market.js.map +1 -1
  44. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.d.ts.map +1 -1
  45. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js +11 -1
  46. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js.map +1 -1
  47. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-lan-share.d.ts +37 -0
  48. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-lan-share.d.ts.map +1 -0
  49. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-lan-share.js +153 -0
  50. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-lan-share.js.map +1 -0
  51. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-local-gateway.d.ts +5 -0
  52. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-local-gateway.d.ts.map +1 -1
  53. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-local-gateway.js +7 -2
  54. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-local-gateway.js.map +1 -1
  55. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts +19 -0
  56. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts.map +1 -1
  57. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js +167 -43
  58. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js.map +1 -1
  59. package/node_modules/@xrkseek/server-http/dist/dsh-compat/shared-registry.d.ts.map +1 -1
  60. package/node_modules/@xrkseek/server-http/dist/dsh-compat/shared-registry.js +7 -1
  61. package/node_modules/@xrkseek/server-http/dist/dsh-compat/shared-registry.js.map +1 -1
  62. package/node_modules/@xrkseek/server-http/dist/dsh-compat/skin-center.d.ts +1 -1
  63. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/index.d.ts +1 -1
  64. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/index.d.ts.map +1 -1
  65. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/index.js +1 -1
  66. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/index.js.map +1 -1
  67. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts +28 -5
  68. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts.map +1 -1
  69. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js +63 -10
  70. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js.map +1 -1
  71. package/node_modules/@xrkseek/server-http/dist/dsh-compat/wire-normalize.d.ts.map +1 -1
  72. package/node_modules/@xrkseek/server-http/dist/dsh-compat/wire-normalize.js +13 -0
  73. package/node_modules/@xrkseek/server-http/dist/dsh-compat/wire-normalize.js.map +1 -1
  74. package/node_modules/@xrkseek/server-http/dist/index.d.ts +1 -1
  75. package/node_modules/@xrkseek/server-http/dist/index.d.ts.map +1 -1
  76. package/node_modules/@xrkseek/server-http/dist/index.js +1 -1
  77. package/node_modules/@xrkseek/server-http/dist/index.js.map +1 -1
  78. package/node_modules/@xrkseek/server-loader/dist/load.d.ts.map +1 -1
  79. package/node_modules/@xrkseek/server-loader/dist/load.js +48 -0
  80. package/node_modules/@xrkseek/server-loader/dist/load.js.map +1 -1
  81. package/package.json +1 -1
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Desktop temporary share: `0.0.0.0` reverse proxy in front of the loopback
3
+ * Desktop Host — Wi‑Fi phones and (optionally) tunnel tools that target the
4
+ * share listen. Process-scoped; Host dispose / toggle-off closes it.
5
+ *
6
+ * Tunnel tip: point 樱花 / frp / cpolar at `localOrigin` (share listen on
7
+ * 127.0.0.1), not a hard-coded 8787. Share ON arms the PIN gate for
8
+ * non-loopback / X-Forwarded-Host; share OFF closes remote class.
9
+ */
10
+ import { networkInterfaces } from "node:os";
11
+ import { startLocalProxyGateway, } from "./mobile-access-local-gateway.js";
12
+ let liveGateway;
13
+ /**
14
+ * Preferred share listen ports. Host already owns loopback 8787 on Desktop,
15
+ * so 0.0.0.0:8787 often fails — fall through. Env `XRK_DESKTOP_SHARE_PORT`
16
+ * overrides the first candidate when set to a positive int.
17
+ */
18
+ export function desktopSharePortCandidates() {
19
+ const fromEnv = Number(String(process.env.XRK_DESKTOP_SHARE_PORT ?? "").trim());
20
+ if (Number.isFinite(fromEnv) && fromEnv > 0 && fromEnv < 65536) {
21
+ return [Math.floor(fromEnv), 8787, 18787];
22
+ }
23
+ // 8787 first for tunnel recipes that expect the familiar product port;
24
+ // 18787 when Host already holds loopback 8787.
25
+ return [8787, 18787];
26
+ }
27
+ /** Non-internal IPv4 addresses suitable for phone URL display. */
28
+ export function listLanIPv4Addresses() {
29
+ const out = [];
30
+ const nets = networkInterfaces();
31
+ for (const entries of Object.values(nets)) {
32
+ if (!entries)
33
+ continue;
34
+ for (const net of entries) {
35
+ if (net.family !== "IPv4" || net.internal)
36
+ continue;
37
+ const ip = net.address.trim();
38
+ if (!ip || out.includes(ip))
39
+ continue;
40
+ out.push(ip);
41
+ }
42
+ }
43
+ return out;
44
+ }
45
+ /** VirtualBox / VMware host-only — phones on real Wi‑Fi cannot reach these. */
46
+ export function isHostOnlyLanIPv4(ip) {
47
+ const parts = ip.split(".");
48
+ if (parts.length !== 4)
49
+ return false;
50
+ const a = Number(parts[0]);
51
+ const b = Number(parts[1]);
52
+ const c = Number(parts[2]);
53
+ // VirtualBox host-only default, VMware host-only common ranges.
54
+ if (a === 192 && b === 168 && (c === 56 || c === 57 || c === 254)) {
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ /**
60
+ * Prefer private Wi‑Fi / Ethernet; skip host-only NICs when any better IP exists.
61
+ */
62
+ export function pickPreferredLanIPv4(addresses = listLanIPv4Addresses()) {
63
+ if (addresses.length === 0)
64
+ return undefined;
65
+ const usable = addresses.filter((ip) => !isHostOnlyLanIPv4(ip));
66
+ const pool = usable.length > 0 ? usable : addresses;
67
+ const scored = [...pool].sort((a, b) => scoreLanIp(b) - scoreLanIp(a));
68
+ return scored[0];
69
+ }
70
+ function scoreLanIp(ip) {
71
+ const parts = ip.split(".");
72
+ if (parts.length !== 4)
73
+ return 0;
74
+ const a = Number(parts[0]);
75
+ const b = Number(parts[1]);
76
+ if (a === 10)
77
+ return 40;
78
+ if (a === 192 && b === 168)
79
+ return isHostOnlyLanIPv4(ip) ? 5 : 35;
80
+ if (a === 172 && b >= 16 && b <= 31)
81
+ return 30;
82
+ if (a === 169 && b === 254)
83
+ return 5;
84
+ return 10;
85
+ }
86
+ export async function stopLanShareGateway() {
87
+ const gw = liveGateway;
88
+ liveGateway = undefined;
89
+ if (gw)
90
+ await gw.close();
91
+ }
92
+ /**
93
+ * Bind LAN share proxy → loopback Host. Returns public origin for phones.
94
+ * Omits `publicOrigin` so the phone `Host` header drives X-Forwarded-Host.
95
+ */
96
+ export async function startLanShareGateway(options) {
97
+ const upstream = options.upstreamOrigin.trim().replace(/\/$/, "");
98
+ if (!upstream) {
99
+ throw new Error("lan_share_missing_upstream");
100
+ }
101
+ const lanHosts = listLanIPv4Addresses();
102
+ const preferred = pickPreferredLanIPv4(lanHosts);
103
+ const requested = options.lanIp?.trim() ?? "";
104
+ // Ignore a host-only NIC when a real Wi‑Fi / Ethernet address exists.
105
+ const lanIp = (requested &&
106
+ lanHosts.includes(requested) &&
107
+ (!isHostOnlyLanIPv4(requested) || preferred === undefined)
108
+ ? requested
109
+ : undefined) ||
110
+ preferred ||
111
+ lanHosts[0];
112
+ if (!lanIp) {
113
+ throw new Error("lan_share_no_lan_ip");
114
+ }
115
+ await stopLanShareGateway();
116
+ const ports = options.listenPort !== undefined
117
+ ? [options.listenPort]
118
+ : [...desktopSharePortCandidates(), 0];
119
+ let lastErr;
120
+ let gateway;
121
+ for (const listenPort of ports) {
122
+ try {
123
+ gateway = await startLocalProxyGateway({
124
+ upstreamUrl: upstream,
125
+ listenHost: "0.0.0.0",
126
+ ...(listenPort > 0 ? { listenPort } : {}),
127
+ });
128
+ break;
129
+ }
130
+ catch (err) {
131
+ lastErr = err;
132
+ const code = err && typeof err === "object" && "code" in err
133
+ ? String(err.code)
134
+ : "";
135
+ if (code !== "EADDRINUSE" && code !== "EACCES")
136
+ throw err;
137
+ }
138
+ }
139
+ if (!gateway) {
140
+ throw lastErr instanceof Error
141
+ ? lastErr
142
+ : new Error("lan_share_listen_failed");
143
+ }
144
+ liveGateway = gateway;
145
+ const { port } = gateway.address();
146
+ const origin = `http://${lanIp}:${String(port)}`;
147
+ const localOrigin = `http://127.0.0.1:${String(port)}`;
148
+ return { origin, port, lanIp, lanHosts, localOrigin };
149
+ }
150
+ export function lanShareGatewayAddress() {
151
+ return liveGateway?.address();
152
+ }
153
+ //# sourceMappingURL=mobile-access-lan-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-access-lan-share.js","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access-lan-share.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,11 @@ export interface LocalMobileGateway {
13
13
  export declare function startLocalProxyGateway(options: {
14
14
  readonly upstreamUrl: string;
15
15
  readonly listenPort?: number;
16
+ /**
17
+ * Bind address. Default `127.0.0.1` (tunnel sidecar). Desktop LAN share
18
+ * uses `0.0.0.0` so phones on Wi‑Fi can reach the proxy.
19
+ */
20
+ readonly listenHost?: string;
16
21
  readonly publicOrigin?: string;
17
22
  }): Promise<LocalMobileGateway>;
18
23
  export declare function reserveLoopbackPort(): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-access-local-gateway.d.ts","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access-local-gateway.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAsHD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiE9B;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAuBD"}
1
+ {"version":3,"file":"mobile-access-local-gateway.d.ts","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access-local-gateway.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAyHD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkE9B;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAuBD"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { createServer, request as httpRequest, } from "node:http";
6
6
  import { URL } from "node:url";
7
+ import { DESKTOP_SHARE_PROXY_HEADER, DESKTOP_SHELL_MARK_HEADER, } from "./underlying/mobile-gate-kit.js";
7
8
  function upstreamPort(upstream) {
8
9
  if (upstream.port)
9
10
  return Number(upstream.port);
@@ -29,6 +30,9 @@ function buildProxyHeaders(req, upstream, publicOrigin) {
29
30
  ...req.headers,
30
31
  host: upstream.host,
31
32
  };
33
+ // Never let a phone / tunnel forge the Electron shell mark through the share.
34
+ delete headers[DESKTOP_SHELL_MARK_HEADER];
35
+ headers[DESKTOP_SHARE_PROXY_HEADER] = "1";
32
36
  const clientHost = publicOrigin !== undefined
33
37
  ? (() => {
34
38
  try {
@@ -99,6 +103,7 @@ function forwardUpgrade(req, socket, head, upstream, publicOrigin) {
99
103
  export async function startLocalProxyGateway(options) {
100
104
  const upstream = new URL(options.upstreamUrl);
101
105
  let listenPort = options.listenPort ?? 0;
106
+ const listenHost = (options.listenHost ?? "127.0.0.1").trim() || "127.0.0.1";
102
107
  const publicOrigin = options.publicOrigin;
103
108
  const proxy = (clientReq, clientRes) => {
104
109
  const targetPath = clientReq.url?.startsWith("/")
@@ -132,7 +137,7 @@ export async function startLocalProxyGateway(options) {
132
137
  });
133
138
  await new Promise((resolve, reject) => {
134
139
  server.once("error", reject);
135
- server.listen(listenPort, "127.0.0.1", () => {
140
+ server.listen(listenPort, listenHost, () => {
136
141
  server.off("error", reject);
137
142
  resolve();
138
143
  });
@@ -145,7 +150,7 @@ export async function startLocalProxyGateway(options) {
145
150
  listenPort = addr.port;
146
151
  return {
147
152
  address: () => ({
148
- host: "127.0.0.1",
153
+ host: listenHost,
149
154
  port: listenPort,
150
155
  ...(publicOrigin ? { origin: publicOrigin } : {}),
151
156
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-access-local-gateway.js","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access-local-gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mobile-access-local-gateway.js","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access-local-gateway.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,18 @@ export interface MobileAccessOptions {
22
22
  * `settings.yaml` under {@link xrkHome}, else `system`.
23
23
  */
24
24
  readonly getThemePreference?: () => GateThemePreference;
25
+ /**
26
+ * Desktop-only: Settings「局域网访问」may start a `0.0.0.0` share gateway.
27
+ * CLI / ordinary `xrkh web` leave this unset.
28
+ */
29
+ readonly lanShareEnabled?: boolean;
30
+ /**
31
+ * Loopback Face origin for the share gateway upstream
32
+ * (e.g. `http://127.0.0.1:43129`). Required when {@link lanShareEnabled}.
33
+ */
34
+ readonly resolveLoopbackOrigin?: () => string;
35
+ /** Optional preferred LAN IPv4 for the phone URL (multi-NIC). */
36
+ readonly resolveLanShareIp?: () => string | undefined;
25
37
  }
26
38
  /**
27
39
  * Best-effort parse of `ui-theme.preference` (parity with Desktop splash /
@@ -70,6 +82,13 @@ export declare function armAccessGateForListen(options: MobileAccessOptions, bin
70
82
  };
71
83
  /** Prefer LAN IPv4 when the Host header is loopback (phone cannot reach 127.0.0.1). */
72
84
  export declare function requestLanOrigin(req: IncomingMessage): string;
85
+ /**
86
+ * Desktop boot: clear persisted "running" so LAN share stays process-scoped
87
+ * (toggle off when Desktop quits; do not auto-reopen a dead gateway).
88
+ */
89
+ export declare function resetDesktopLanShareOnBoot(options: MobileAccessOptions): void;
90
+ /** Host dispose — drop the share listen socket. */
91
+ export declare function disposeDesktopLanShare(): Promise<void>;
73
92
  export declare function handleMobileAccessHttp(req: IncomingMessage, res: ServerResponse, pathname: string, options: MobileAccessOptions): Promise<boolean>;
74
93
  export declare function isMobileAccessPath(pathname: string): boolean;
75
94
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-access.d.ts","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mobile-access.d.ts","sourceRoot":"","sources":["../../src/dsh-compat/mobile-access.ts"],"names":[],"mappings":"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"}
@@ -8,24 +8,25 @@ import { httpMethod, isMutatingMethod, parseJsonBody } from "./underlying/http-k
8
8
  import { buildPinPageHtml, DEVICE_COOKIE, LAN_PIN_COOKIE, LAN_PIN_PAGE_JS, LOGIN_PAGE_HTML, LOGIN_PAGE_JS, mintPairingWindow, pairDevice, PAIR_PAGE_HTML, PAIR_PAGE_JS, parseCookieHeader, pruneMobileAuth, publicDevice, renewSession, SESSION_COOKIE, setAccessPinCookie, setMobileSessionCookies, WAN_PIN_COOKIE, WAN_PIN_PAGE_JS, } from "./mobile-access-auth.js";
9
9
  import { getMobileRemoteRuntime, } from "./mobile-access-remote-runtime.js";
10
10
  import { qrSvgForText } from "./pocket-qrcode.js";
11
+ import { isHostOnlyLanIPv4, lanShareGatewayAddress, listLanIPv4Addresses, pickPreferredLanIPv4, startLanShareGateway, stopLanShareGateway, } from "./mobile-access-lan-share.js";
11
12
  /**
12
13
  * Product-shell mobile seam for `/mobile-access/custom.css`.
13
14
  * Clears session header chrome that collides with dsh-mobile / pocket nav.
14
15
  */
15
- export const XRK_MOBILE_SHELL_CSS = `/* XRK shell mobile seam */
16
- @media (max-width: 900px) {
17
- /* Hide header Status twin (AppFrame phoneChrome owns Overview). Keep
18
- PresenceDock in utilities — do not blank the whole utilities seat. */
19
- [data-slot="conversation.session.header.actions"] {
20
- display: none !important;
21
- }
22
- [data-slot="conversation.session.header.utilities"] > :not([data-presence-dock]) {
23
- display: none !important;
24
- }
25
- [role="tablist"] {
26
- padding-inline: 44px;
27
- }
28
- }
16
+ export const XRK_MOBILE_SHELL_CSS = `/* XRK shell mobile seam */
17
+ @media (max-width: 900px) {
18
+ /* Hide header Status twin (AppFrame phoneChrome owns Overview). Keep
19
+ PresenceDock in utilities — do not blank the whole utilities seat. */
20
+ [data-slot="conversation.session.header.actions"] {
21
+ display: none !important;
22
+ }
23
+ [data-slot="conversation.session.header.utilities"] > :not([data-presence-dock]) {
24
+ display: none !important;
25
+ }
26
+ [role="tablist"] {
27
+ padding-inline: 44px;
28
+ }
29
+ }
29
30
  `;
30
31
  /** Inject shell seam stylesheet into product index (works without dsh-mobile fetch). */
31
32
  export function injectMobileAccessShellIntoHtml(html) {
@@ -250,16 +251,8 @@ function mintToken() {
250
251
  return randomBytes(24).toString("base64url");
251
252
  }
252
253
  function firstLanIPv4() {
253
- const nets = networkInterfaces();
254
- for (const entries of Object.values(nets)) {
255
- if (!entries)
256
- continue;
257
- for (const net of entries) {
258
- if (net.family === "IPv4" && !net.internal)
259
- return net.address;
260
- }
261
- }
262
- return undefined;
254
+ // Prefer real Wi‑Fi / Ethernet; skip VirtualBox host-only (192.168.56.x).
255
+ return pickPreferredLanIPv4(listLanIPv4Addresses());
263
256
  }
264
257
  function requestOrigin(req) {
265
258
  const host = req.headers.host?.trim();
@@ -321,13 +314,75 @@ async function prepareRemoteRuntime(options, state, syncEnabled = false) {
321
314
  }
322
315
  return { runtime, state: withId };
323
316
  }
324
- function lanPayload(state) {
317
+ function lanPayload(state, options) {
318
+ const desktopLanShare = options?.lanShareEnabled === true;
319
+ const shareAddr = desktopLanShare ? lanShareGatewayAddress() : undefined;
320
+ const loopback = options?.resolveLoopbackOrigin?.()?.trim() ?? "";
321
+ const origin = state.running && state.origin ? state.origin : undefined;
322
+ const sharePort = state.running && shareAddr ? shareAddr.port : undefined;
323
+ const localOrigin = sharePort !== undefined
324
+ ? `http://127.0.0.1:${String(sharePort)}`
325
+ : undefined;
326
+ const qrSvg = origin !== undefined
327
+ ? (() => {
328
+ try {
329
+ return qrSvgForText(origin, "share");
330
+ }
331
+ catch {
332
+ return "";
333
+ }
334
+ })()
335
+ : "";
325
336
  return {
326
337
  running: state.running,
327
- ...(state.running && state.origin ? { origin: state.origin } : {}),
338
+ desktopLanShare,
339
+ ...(origin ? { origin } : {}),
340
+ ...(localOrigin ? { localOrigin } : {}),
341
+ // Desktop share uses the WAN PIN plane for both Wi‑Fi and tunnel visitors.
342
+ ...(state.running && state.wanToken ? { pin: state.wanToken } : {}),
343
+ ...(state.running && state.lanToken ? { lanPin: state.lanToken } : {}),
344
+ ...(state.running && state.wanToken ? { wanPin: state.wanToken } : {}),
345
+ ...(qrSvg ? { qrSvg } : {}),
346
+ ...(desktopLanShare
347
+ ? {
348
+ lanHosts: listLanIPv4Addresses(),
349
+ ...(state.lanIpOverride ? { lanIp: state.lanIpOverride } : {}),
350
+ ...(sharePort !== undefined ? { sharePort } : {}),
351
+ ...(loopback ? { hostLoopbackOrigin: loopback } : {}),
352
+ }
353
+ : {}),
328
354
  extensions: { loaded: 0, failed: 0 },
329
355
  };
330
356
  }
357
+ /**
358
+ * Desktop boot: clear persisted "running" so LAN share stays process-scoped
359
+ * (toggle off when Desktop quits; do not auto-reopen a dead gateway).
360
+ */
361
+ export function resetDesktopLanShareOnBoot(options) {
362
+ if (options.lanShareEnabled !== true)
363
+ return;
364
+ void stopLanShareGateway();
365
+ const state = loadState(options);
366
+ // Drop host-only overrides (VirtualBox 192.168.56.x) so the next share
367
+ // pick can prefer a real Wi‑Fi address.
368
+ const dropHostOnly = state.lanIpOverride.trim() !== "" &&
369
+ isHostOnlyLanIPv4(state.lanIpOverride.trim());
370
+ if (!state.running && !state.origin && !dropHostOnly)
371
+ return;
372
+ saveState(options, {
373
+ ...state,
374
+ running: false,
375
+ origin: "",
376
+ pairingToken: "",
377
+ pairingExpiresAt: 0,
378
+ appKey: "",
379
+ ...(dropHostOnly ? { lanIpOverride: "" } : {}),
380
+ });
381
+ }
382
+ /** Host dispose — drop the share listen socket. */
383
+ export async function disposeDesktopLanShare() {
384
+ await stopLanShareGateway();
385
+ }
331
386
  function openLanPairing(state, req, ttlMs) {
332
387
  const opened = mintPairingWindow(typeof ttlMs === "number" && ttlMs >= 10_000 ? ttlMs : 300_000);
333
388
  const withInstance = ensureInstanceId(state);
@@ -358,27 +413,96 @@ function openLanPairing(state, req, ttlMs) {
358
413
  next,
359
414
  };
360
415
  }
361
- async function setRunning(options, req, res, running) {
416
+ async function setRunning(options, req, res, running, body) {
362
417
  let state = ensureInstanceId(loadState(options));
363
- state = { ...state, running };
364
418
  if (!state.csrf)
365
419
  state.csrf = mintToken();
366
- if (running) {
367
- state.origin = requestLanOrigin(req);
368
- if (!state.lanToken)
369
- state.lanToken = mint8DigitPin();
370
- if (!state.wanToken)
371
- state.wanToken = mint8DigitPin();
372
- }
373
- else {
374
- state.origin = "";
375
- state.pairingToken = "";
376
- state.pairingExpiresAt = 0;
377
- state.appKey = "";
420
+ if (!running) {
421
+ await stopLanShareGateway();
422
+ state = {
423
+ ...state,
424
+ running: false,
425
+ origin: "",
426
+ pairingToken: "",
427
+ pairingExpiresAt: 0,
428
+ appKey: "",
429
+ };
430
+ saveState(options, state);
431
+ setCsrfCookie(res, state.csrf);
432
+ sendJson(res, 200, lanPayload(state, options));
433
+ return;
434
+ }
435
+ // Desktop LAN share: real 0.0.0.0 gateway in front of loopback Host.
436
+ if (options.lanShareEnabled === true) {
437
+ const upstream = options.resolveLoopbackOrigin?.()?.trim() ?? "";
438
+ if (!upstream) {
439
+ sendJson(res, 503, {
440
+ ok: false,
441
+ error: "lan_share_host_not_ready",
442
+ desktopLanShare: true,
443
+ });
444
+ return;
445
+ }
446
+ try {
447
+ const fromBody = typeof body?.lanIp === "string" ? body.lanIp.trim() : "";
448
+ const fromHook = options.resolveLanShareIp?.()?.trim() ?? "";
449
+ // Do not reuse a stale host-only override (e.g. VirtualBox 192.168.56.x)
450
+ // when a real Wi‑Fi address is available.
451
+ const hosts = listLanIPv4Addresses();
452
+ const preferred = pickPreferredLanIPv4(hosts);
453
+ const fromStateRaw = state.lanIpOverride.trim();
454
+ const fromState = fromStateRaw &&
455
+ hosts.includes(fromStateRaw) &&
456
+ (!isHostOnlyLanIPv4(fromStateRaw) || preferred === undefined)
457
+ ? fromStateRaw
458
+ : "";
459
+ const lanIp = fromBody || fromHook || fromState || undefined;
460
+ const started = await startLanShareGateway({
461
+ upstreamOrigin: upstream,
462
+ ...(lanIp ? { lanIp } : {}),
463
+ });
464
+ // Fresh PIN every time share turns on (process-scoped temporary share).
465
+ const pin = mint8DigitPin();
466
+ state = {
467
+ ...state,
468
+ running: true,
469
+ origin: started.origin,
470
+ lanIpOverride: started.lanIp,
471
+ lanToken: pin,
472
+ wanToken: pin,
473
+ };
474
+ saveState(options, state);
475
+ setCsrfCookie(res, state.csrf);
476
+ sendJson(res, 200, {
477
+ ...lanPayload(state, options),
478
+ lanHosts: started.lanHosts,
479
+ lanIp: started.lanIp,
480
+ localOrigin: started.localOrigin,
481
+ sharePort: started.port,
482
+ });
483
+ return;
484
+ }
485
+ catch (err) {
486
+ await stopLanShareGateway();
487
+ sendJson(res, 500, {
488
+ ok: false,
489
+ error: err instanceof Error ? err.message : String(err),
490
+ desktopLanShare: true,
491
+ });
492
+ return;
493
+ }
378
494
  }
495
+ // Legacy / CLI / community: flip state only (no extra listen).
496
+ state = {
497
+ ...state,
498
+ running: true,
499
+ origin: requestLanOrigin(req),
500
+ lanToken: state.lanToken || mint8DigitPin(),
501
+ wanToken: state.wanToken || mint8DigitPin(),
502
+ };
379
503
  saveState(options, state);
380
504
  setCsrfCookie(res, state.csrf);
381
- sendJson(res, 200, lanPayload(state));
505
+ sendJson(res, 200, lanPayload(state, options));
382
506
  }
383
507
  function sendHtml(res, body, contentType) {
384
508
  res.writeHead(200, {
@@ -591,7 +715,7 @@ export async function handleMobileAccessHttp(req, res, pathname, options) {
591
715
  if (state.running && state.csrf)
592
716
  setCsrfCookie(res, state.csrf);
593
717
  sendJson(res, 200, {
594
- ...lanPayload(state),
718
+ ...lanPayload(state, options),
595
719
  ...(state.running && origin ? { origin } : {}),
596
720
  });
597
721
  return true;
@@ -599,7 +723,7 @@ export async function handleMobileAccessHttp(req, res, pathname, options) {
599
723
  if (method === "POST" || method === "PUT") {
600
724
  const body = await parseJsonBody(req);
601
725
  const running = typeof body.running === "boolean" ? body.running : !state.running;
602
- await setRunning(options, req, res, running);
726
+ await setRunning(options, req, res, running, body);
603
727
  return true;
604
728
  }
605
729
  }