@ccpocket/bridge 1.3.0 → 1.4.1

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.
package/README.md CHANGED
@@ -7,7 +7,7 @@ This is the server component of [ccpocket](https://github.com/K9i-0/ccpocket)
7
7
  ## Quick Start
8
8
 
9
9
  ```bash
10
- npx @ccpocket/bridge
10
+ npx @ccpocket/bridge@latest
11
11
  ```
12
12
 
13
13
  A QR code will appear in your terminal. Scan it with the ccpocket mobile app to connect.
@@ -16,7 +16,7 @@ A QR code will appear in your terminal. Scan it with the ccpocket mobile app to
16
16
 
17
17
  ```bash
18
18
  # Run directly (no install needed)
19
- npx @ccpocket/bridge
19
+ npx @ccpocket/bridge@latest
20
20
 
21
21
  # Or install globally
22
22
  npm install -g @ccpocket/bridge
@@ -30,11 +30,11 @@ ccpocket-bridge
30
30
  | `BRIDGE_PORT` | `8765` | WebSocket port |
31
31
  | `BRIDGE_HOST` | `0.0.0.0` | Bind address |
32
32
  | `BRIDGE_API_KEY` | (none) | API key authentication (enabled when set) |
33
- | `BRIDGE_HIDE_IP` | (none) | Hide IP addresses in QR code and logs (set any value to enable) |
33
+ | `BRIDGE_DEMO_MODE` | (none) | Demo mode: hide Tailscale IPs and API key from QR code / logs |
34
34
 
35
35
  ```bash
36
36
  # Example: custom port with API key
37
- BRIDGE_PORT=9000 BRIDGE_API_KEY=my-secret npx @ccpocket/bridge
37
+ BRIDGE_PORT=9000 BRIDGE_API_KEY=my-secret npx @ccpocket/bridge@latest
38
38
  ```
39
39
 
40
40
  ## Requirements
@@ -65,7 +65,7 @@ export function setupLaunchd(opts) {
65
65
  <string>/bin/zsh</string>
66
66
  <string>-li</string>
67
67
  <string>-c</string>
68
- <string>exec npx @ccpocket/bridge</string>
68
+ <string>exec npx @ccpocket/bridge@latest</string>
69
69
  </array>
70
70
 
71
71
  <key>EnvironmentVariables</key>
@@ -32,52 +32,60 @@ export async function printStartupInfo(port, _host, apiKey) {
32
32
  const addresses = getReachableAddresses();
33
33
  if (addresses.length === 0)
34
34
  return;
35
+ const demoMode = !!process.env.BRIDGE_DEMO_MODE;
36
+ // Demo mode: exclude Tailscale addresses for video recording
37
+ const displayAddresses = demoMode
38
+ ? addresses.filter((a) => a.label !== "Tailscale")
39
+ : addresses;
40
+ if (displayAddresses.length === 0)
41
+ return;
35
42
  const lines = [];
36
43
  lines.push("");
37
- lines.push("[bridge] ─── Connection Info ───────────────────────────");
44
+ if (demoMode) {
45
+ lines.push("[bridge] ─── Connection Info [DEMO MODE] ────────────────");
46
+ }
47
+ else {
48
+ lines.push("[bridge] ─── Connection Info ───────────────────────────");
49
+ }
38
50
  // Group by label
39
51
  const grouped = new Map();
40
- for (const addr of addresses) {
52
+ for (const addr of displayAddresses) {
41
53
  const list = grouped.get(addr.label) ?? [];
42
54
  list.push(addr.ip);
43
55
  grouped.set(addr.label, list);
44
56
  }
45
- const hideIp = !!process.env.BRIDGE_HIDE_IP;
46
57
  for (const [label, ips] of grouped) {
47
58
  for (const ip of ips) {
48
59
  const padded = `${label}:`.padEnd(12);
49
- const display = hideIp ? "xxx.xxx.xxx.xxx" : ip;
50
- lines.push(`[bridge] ${padded} ws://${display}:${port}`);
60
+ lines.push(`[bridge] ${padded} ws://${ip}:${port}`);
51
61
  }
52
62
  }
53
63
  // Use first LAN address, fallback to first address
54
- const primaryAddr = addresses.find((a) => a.label === "LAN")?.ip ?? addresses[0].ip;
55
- const deepLink = buildConnectionUrl(primaryAddr, port, apiKey);
64
+ const primaryAddr = displayAddresses.find((a) => a.label === "LAN")?.ip ??
65
+ displayAddresses[0].ip;
66
+ // Demo mode: omit API key from deep link
67
+ const deepLink = buildConnectionUrl(primaryAddr, port, demoMode ? undefined : apiKey);
56
68
  lines.push("");
57
- lines.push(`[bridge] Deep Link: ${hideIp ? "(hidden)" : deepLink}`);
58
- if (!hideIp) {
59
- lines.push("");
60
- lines.push("[bridge] Scan QR code with ccpocket app:");
61
- }
69
+ lines.push(`[bridge] Deep Link: ${deepLink}`);
70
+ lines.push("");
71
+ lines.push("[bridge] Scan QR code with ccpocket app:");
62
72
  // Print all non-QR lines
63
73
  console.log(lines.join("\n"));
64
- // Generate and print QR code (skip when hiding IP)
65
- if (!hideIp) {
66
- try {
67
- const qrText = await QRCode.toString(deepLink, {
68
- type: "terminal",
69
- small: true,
70
- });
71
- // Indent QR code lines
72
- const indented = qrText
73
- .split("\n")
74
- .map((line) => ` ${line}`)
75
- .join("\n");
76
- console.log(indented);
77
- }
78
- catch {
79
- console.log("[bridge] (QR code generation failed)");
80
- }
74
+ // Generate and print QR code
75
+ try {
76
+ const qrText = await QRCode.toString(deepLink, {
77
+ type: "terminal",
78
+ small: true,
79
+ });
80
+ // Indent QR code lines
81
+ const indented = qrText
82
+ .split("\n")
83
+ .map((line) => ` ${line}`)
84
+ .join("\n");
85
+ console.log(indented);
86
+ }
87
+ catch {
88
+ console.log("[bridge] (QR code generation failed)");
81
89
  }
82
90
  console.log("[bridge] ───────────────────────────────────────────────");
83
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"startup-info.js","sourceRoot":"","sources":["../src/startup-info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"startup-info.js","sourceRoot":"","sources":["../src/startup-info.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ccpocket/bridge",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Bridge server that connects Claude Code and Codex CLI to mobile devices via WebSocket",
5
5
  "private": false,
6
6
  "type": "module",