vibelet 0.1.38 → 1.0.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 +80 -0
- package/bin/cloudflared-quick-tunnel.mjs +11 -0
- package/bin/cloudflared-resolver.mjs +171 -0
- package/bin/vibelet-runtime-policy.mjs +36 -0
- package/bin/vibelet.cjs +12 -0
- package/bin/vibelet.mjs +1235 -0
- package/dist/index.cjs +126 -0
- package/package.json +24 -22
- package/app.json +0 -5
- package/dist/advertised-hosts.d.ts +0 -34
- package/dist/advertised-hosts.d.ts.map +0 -1
- package/dist/advertised-hosts.js +0 -176
- package/dist/advertised-hosts.js.map +0 -1
- package/dist/advertised-hosts.test.d.ts +0 -2
- package/dist/advertised-hosts.test.d.ts.map +0 -1
- package/dist/advertised-hosts.test.js +0 -96
- package/dist/advertised-hosts.test.js.map +0 -1
- package/dist/audit.d.ts +0 -30
- package/dist/audit.d.ts.map +0 -1
- package/dist/audit.js +0 -73
- package/dist/audit.js.map +0 -1
- package/dist/audit.test.d.ts +0 -2
- package/dist/audit.test.d.ts.map +0 -1
- package/dist/audit.test.js +0 -33
- package/dist/audit.test.js.map +0 -1
- package/dist/auth.d.ts +0 -6
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -27
- package/dist/auth.js.map +0 -1
- package/dist/claude-hooks.d.ts +0 -58
- package/dist/claude-hooks.d.ts.map +0 -1
- package/dist/claude-hooks.js +0 -129
- package/dist/claude-hooks.js.map +0 -1
- package/dist/cli-version.d.ts +0 -3
- package/dist/cli-version.d.ts.map +0 -1
- package/dist/cli-version.js +0 -35
- package/dist/cli-version.js.map +0 -1
- package/dist/cli-version.test.d.ts +0 -2
- package/dist/cli-version.test.d.ts.map +0 -1
- package/dist/cli-version.test.js +0 -38
- package/dist/cli-version.test.js.map +0 -1
- package/dist/config.d.ts +0 -30
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -327
- package/dist/config.js.map +0 -1
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -184
- package/dist/config.test.js.map +0 -1
- package/dist/dev-auth.test.d.ts +0 -2
- package/dist/dev-auth.test.d.ts.map +0 -1
- package/dist/dev-auth.test.js +0 -154
- package/dist/dev-auth.test.js.map +0 -1
- package/dist/dev-script.test.d.ts +0 -2
- package/dist/dev-script.test.d.ts.map +0 -1
- package/dist/dev-script.test.js +0 -412
- package/dist/dev-script.test.js.map +0 -1
- package/dist/drivers/claude.d.ts +0 -34
- package/dist/drivers/claude.d.ts.map +0 -1
- package/dist/drivers/claude.js +0 -413
- package/dist/drivers/claude.js.map +0 -1
- package/dist/drivers/claude.test.d.ts +0 -2
- package/dist/drivers/claude.test.d.ts.map +0 -1
- package/dist/drivers/claude.test.js +0 -951
- package/dist/drivers/claude.test.js.map +0 -1
- package/dist/drivers/codex.d.ts +0 -38
- package/dist/drivers/codex.d.ts.map +0 -1
- package/dist/drivers/codex.js +0 -771
- package/dist/drivers/codex.js.map +0 -1
- package/dist/drivers/codex.test.d.ts +0 -2
- package/dist/drivers/codex.test.d.ts.map +0 -1
- package/dist/drivers/codex.test.js +0 -939
- package/dist/drivers/codex.test.js.map +0 -1
- package/dist/drivers/types.d.ts +0 -14
- package/dist/drivers/types.d.ts.map +0 -1
- package/dist/drivers/types.js +0 -2
- package/dist/drivers/types.js.map +0 -1
- package/dist/e2e.test.d.ts +0 -2
- package/dist/e2e.test.d.ts.map +0 -1
- package/dist/e2e.test.js +0 -111
- package/dist/e2e.test.js.map +0 -1
- package/dist/identity.d.ts +0 -10
- package/dist/identity.d.ts.map +0 -1
- package/dist/identity.js +0 -66
- package/dist/identity.js.map +0 -1
- package/dist/identity.test.d.ts +0 -2
- package/dist/identity.test.d.ts.map +0 -1
- package/dist/identity.test.js +0 -25
- package/dist/identity.test.js.map +0 -1
- package/dist/index-entry.test.d.ts +0 -2
- package/dist/index-entry.test.d.ts.map +0 -1
- package/dist/index-entry.test.js +0 -272
- package/dist/index-entry.test.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -707
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts +0 -31
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -75
- package/dist/logger.js.map +0 -1
- package/dist/metrics.d.ts +0 -52
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js +0 -89
- package/dist/metrics.js.map +0 -1
- package/dist/pairing-store.d.ts +0 -29
- package/dist/pairing-store.d.ts.map +0 -1
- package/dist/pairing-store.js +0 -131
- package/dist/pairing-store.js.map +0 -1
- package/dist/pairing-store.test.d.ts +0 -2
- package/dist/pairing-store.test.d.ts.map +0 -1
- package/dist/pairing-store.test.js +0 -47
- package/dist/pairing-store.test.js.map +0 -1
- package/dist/paths.d.ts +0 -16
- package/dist/paths.d.ts.map +0 -1
- package/dist/paths.js +0 -18
- package/dist/paths.js.map +0 -1
- package/dist/perf-compare.d.ts +0 -13
- package/dist/perf-compare.d.ts.map +0 -1
- package/dist/perf-compare.js +0 -125
- package/dist/perf-compare.js.map +0 -1
- package/dist/port-conflict.d.ts +0 -9
- package/dist/port-conflict.d.ts.map +0 -1
- package/dist/port-conflict.js +0 -33
- package/dist/port-conflict.js.map +0 -1
- package/dist/port-conflict.test.d.ts +0 -2
- package/dist/port-conflict.test.d.ts.map +0 -1
- package/dist/port-conflict.test.js +0 -38
- package/dist/port-conflict.test.js.map +0 -1
- package/dist/process-scanner.d.ts +0 -43
- package/dist/process-scanner.d.ts.map +0 -1
- package/dist/process-scanner.js +0 -453
- package/dist/process-scanner.js.map +0 -1
- package/dist/process-scanner.perf.test.d.ts +0 -2
- package/dist/process-scanner.perf.test.d.ts.map +0 -1
- package/dist/process-scanner.perf.test.js +0 -186
- package/dist/process-scanner.perf.test.js.map +0 -1
- package/dist/process-scanner.test.d.ts +0 -2
- package/dist/process-scanner.test.d.ts.map +0 -1
- package/dist/process-scanner.test.js +0 -399
- package/dist/process-scanner.test.js.map +0 -1
- package/dist/push-protocol.d.ts +0 -15
- package/dist/push-protocol.d.ts.map +0 -1
- package/dist/push-protocol.js +0 -23
- package/dist/push-protocol.js.map +0 -1
- package/dist/push-protocol.test.d.ts +0 -2
- package/dist/push-protocol.test.d.ts.map +0 -1
- package/dist/push-protocol.test.js +0 -57
- package/dist/push-protocol.test.js.map +0 -1
- package/dist/push-store.d.ts +0 -22
- package/dist/push-store.d.ts.map +0 -1
- package/dist/push-store.js +0 -103
- package/dist/push-store.js.map +0 -1
- package/dist/push-store.test.d.ts +0 -2
- package/dist/push-store.test.d.ts.map +0 -1
- package/dist/push-store.test.js +0 -79
- package/dist/push-store.test.js.map +0 -1
- package/dist/push.d.ts +0 -65
- package/dist/push.d.ts.map +0 -1
- package/dist/push.js +0 -202
- package/dist/push.js.map +0 -1
- package/dist/push.test.d.ts +0 -2
- package/dist/push.test.d.ts.map +0 -1
- package/dist/push.test.js +0 -199
- package/dist/push.test.js.map +0 -1
- package/dist/safe-stdio.d.ts +0 -3
- package/dist/safe-stdio.d.ts.map +0 -1
- package/dist/safe-stdio.js +0 -46
- package/dist/safe-stdio.js.map +0 -1
- package/dist/scanner.d.ts +0 -30
- package/dist/scanner.d.ts.map +0 -1
- package/dist/scanner.js +0 -859
- package/dist/scanner.js.map +0 -1
- package/dist/scanner.perf.test.d.ts +0 -2
- package/dist/scanner.perf.test.d.ts.map +0 -1
- package/dist/scanner.perf.test.js +0 -320
- package/dist/scanner.perf.test.js.map +0 -1
- package/dist/scanner.test.d.ts +0 -2
- package/dist/scanner.test.d.ts.map +0 -1
- package/dist/scanner.test.js +0 -948
- package/dist/scanner.test.js.map +0 -1
- package/dist/session-inventory.d.ts +0 -63
- package/dist/session-inventory.d.ts.map +0 -1
- package/dist/session-inventory.js +0 -525
- package/dist/session-inventory.js.map +0 -1
- package/dist/session-inventory.perf.test.d.ts +0 -2
- package/dist/session-inventory.perf.test.d.ts.map +0 -1
- package/dist/session-inventory.perf.test.js +0 -220
- package/dist/session-inventory.perf.test.js.map +0 -1
- package/dist/session-inventory.test.d.ts +0 -2
- package/dist/session-inventory.test.d.ts.map +0 -1
- package/dist/session-inventory.test.js +0 -712
- package/dist/session-inventory.test.js.map +0 -1
- package/dist/session-manager.d.ts +0 -75
- package/dist/session-manager.d.ts.map +0 -1
- package/dist/session-manager.js +0 -1515
- package/dist/session-manager.js.map +0 -1
- package/dist/session-manager.test.d.ts +0 -2
- package/dist/session-manager.test.d.ts.map +0 -1
- package/dist/session-manager.test.js +0 -2861
- package/dist/session-manager.test.js.map +0 -1
- package/dist/session-store.d.ts +0 -42
- package/dist/session-store.d.ts.map +0 -1
- package/dist/session-store.js +0 -163
- package/dist/session-store.js.map +0 -1
- package/dist/session-store.test.d.ts +0 -2
- package/dist/session-store.test.d.ts.map +0 -1
- package/dist/session-store.test.js +0 -236
- package/dist/session-store.test.js.map +0 -1
- package/dist/session-title.d.ts +0 -6
- package/dist/session-title.d.ts.map +0 -1
- package/dist/session-title.js +0 -105
- package/dist/session-title.js.map +0 -1
- package/dist/session-title.perf.test.d.ts +0 -2
- package/dist/session-title.perf.test.d.ts.map +0 -1
- package/dist/session-title.perf.test.js +0 -99
- package/dist/session-title.perf.test.js.map +0 -1
- package/dist/session-title.test.d.ts +0 -2
- package/dist/session-title.test.d.ts.map +0 -1
- package/dist/session-title.test.js +0 -199
- package/dist/session-title.test.js.map +0 -1
- package/dist/shutdown-endpoint.test.d.ts +0 -2
- package/dist/shutdown-endpoint.test.d.ts.map +0 -1
- package/dist/shutdown-endpoint.test.js +0 -93
- package/dist/shutdown-endpoint.test.js.map +0 -1
- package/dist/storage-housekeeping.d.ts +0 -28
- package/dist/storage-housekeeping.d.ts.map +0 -1
- package/dist/storage-housekeeping.js +0 -76
- package/dist/storage-housekeeping.js.map +0 -1
- package/dist/storage-housekeeping.test.d.ts +0 -2
- package/dist/storage-housekeeping.test.d.ts.map +0 -1
- package/dist/storage-housekeeping.test.js +0 -65
- package/dist/storage-housekeeping.test.js.map +0 -1
- package/dist/test-daemon-harness.d.ts +0 -31
- package/dist/test-daemon-harness.d.ts.map +0 -1
- package/dist/test-daemon-harness.js +0 -337
- package/dist/test-daemon-harness.js.map +0 -1
- package/dist/token-auth.test.d.ts +0 -2
- package/dist/token-auth.test.d.ts.map +0 -1
- package/dist/token-auth.test.js +0 -52
- package/dist/token-auth.test.js.map +0 -1
- package/dist/utils.d.ts +0 -4
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -40
- package/dist/utils.js.map +0 -1
- package/dist/utils.test.d.ts +0 -2
- package/dist/utils.test.d.ts.map +0 -1
- package/dist/utils.test.js +0 -54
- package/dist/utils.test.js.map +0 -1
- package/dist/ws-data.d.ts +0 -4
- package/dist/ws-data.d.ts.map +0 -1
- package/dist/ws-data.js +0 -20
- package/dist/ws-data.js.map +0 -1
- package/dist/ws-data.test.d.ts +0 -2
- package/dist/ws-data.test.d.ts.map +0 -1
- package/dist/ws-data.test.js +0 -17
- package/dist/ws-data.test.js.map +0 -1
- package/perf-reporter.mjs +0 -138
- package/scripts/build-release.mjs +0 -41
- package/scripts/dev.mjs +0 -537
- package/src/advertised-hosts.test.ts +0 -125
- package/src/advertised-hosts.ts +0 -225
- package/src/audit.test.ts +0 -38
- package/src/audit.ts +0 -117
- package/src/auth.ts +0 -31
- package/src/claude-hooks.ts +0 -195
- package/src/cli-version.test.ts +0 -36
- package/src/cli-version.ts +0 -46
- package/src/config.test.ts +0 -254
- package/src/config.ts +0 -324
- package/src/dev-auth.test.ts +0 -183
- package/src/dev-script.test.ts +0 -511
- package/src/drivers/claude.test.ts +0 -1186
- package/src/drivers/claude.ts +0 -443
- package/src/drivers/codex.test.ts +0 -1096
- package/src/drivers/codex.ts +0 -879
- package/src/drivers/types.ts +0 -15
- package/src/e2e.test.ts +0 -139
- package/src/identity.test.ts +0 -26
- package/src/identity.ts +0 -82
- package/src/index-entry.test.ts +0 -336
- package/src/index.ts +0 -781
- package/src/logger.ts +0 -112
- package/src/metrics.ts +0 -117
- package/src/pairing-store.test.ts +0 -53
- package/src/pairing-store.ts +0 -154
- package/src/paths.ts +0 -19
- package/src/perf-compare.ts +0 -164
- package/src/port-conflict.test.ts +0 -45
- package/src/port-conflict.ts +0 -44
- package/src/process-scanner.perf.test.ts +0 -222
- package/src/process-scanner.test.ts +0 -575
- package/src/process-scanner.ts +0 -514
- package/src/push-protocol.test.ts +0 -74
- package/src/push-protocol.ts +0 -36
- package/src/push-store.test.ts +0 -89
- package/src/push-store.ts +0 -126
- package/src/push.test.ts +0 -234
- package/src/push.ts +0 -318
- package/src/safe-stdio.ts +0 -51
- package/src/scanner.perf.test.ts +0 -359
- package/src/scanner.test.ts +0 -1045
- package/src/scanner.ts +0 -924
- package/src/session-inventory.perf.test.ts +0 -250
- package/src/session-inventory.test.ts +0 -1002
- package/src/session-inventory.ts +0 -721
- package/src/session-manager.test.ts +0 -3430
- package/src/session-manager.ts +0 -1775
- package/src/session-store.test.ts +0 -276
- package/src/session-store.ts +0 -202
- package/src/session-title.perf.test.ts +0 -118
- package/src/session-title.test.ts +0 -286
- package/src/session-title.ts +0 -108
- package/src/shutdown-endpoint.test.ts +0 -95
- package/src/storage-housekeeping.test.ts +0 -78
- package/src/storage-housekeeping.ts +0 -111
- package/src/test-daemon-harness.ts +0 -410
- package/src/token-auth.test.ts +0 -67
- package/src/utils.test.ts +0 -65
- package/src/utils.ts +0 -47
- package/src/ws-data.test.ts +0 -20
- package/src/ws-data.ts +0 -26
- package/tsconfig.json +0 -12
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Vibelet
|
|
2
|
+
|
|
3
|
+
`@vibelet/cli` is a cross-platform CLI that installs and manages the Vibelet daemon for remote coding sessions. The same package is also published as `vibelet`.
|
|
4
|
+
|
|
5
|
+
Official website: https://vibelet.icu
|
|
6
|
+
|
|
7
|
+
## Requirements
|
|
8
|
+
|
|
9
|
+
- macOS / Linux / Windows
|
|
10
|
+
- Node.js 18 or newer
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @vibelet/cli
|
|
16
|
+
npx vibelet
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install it globally:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g @vibelet/cli
|
|
23
|
+
npm install -g vibelet
|
|
24
|
+
vibelet
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The CLI prints the official website on each run so users can always jump back to the main docs and download page.
|
|
28
|
+
|
|
29
|
+
## Commands
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
vibelet # Install/start daemon, auto-enable remote access, and print pairing QR code
|
|
33
|
+
vibelet start # Same as above
|
|
34
|
+
vibelet stop # Stop the daemon
|
|
35
|
+
vibelet restart # Restart the daemon
|
|
36
|
+
vibelet status # Show service and daemon status
|
|
37
|
+
vibelet logs # Print recent daemon logs
|
|
38
|
+
vibelet reset # Reset pairings and print a fresh QR code
|
|
39
|
+
vibelet --help # Show help
|
|
40
|
+
vibelet --version # Show CLI version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Options
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
vibelet --local # Skip the default Cloudflare Tunnel for this run
|
|
47
|
+
vibelet --remote --force # Force a fresh tunnel URL
|
|
48
|
+
vibelet --relay <url> # Use a tunnel URL for remote access
|
|
49
|
+
vibelet --relay "" # Clear saved relay URL
|
|
50
|
+
vibelet --host <ip> # Set primary host/IP advertised for connections
|
|
51
|
+
vibelet --fallback-hosts <ip1>,<ip2> # Comma-separated fallback IPs
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Remote access is enabled by default for `vibelet`, `vibelet start`, `vibelet restart`, and `vibelet reset`. Use `--local` when you want a LAN-only QR code for that run.
|
|
55
|
+
|
|
56
|
+
## Release
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pnpm publish:dual:dry-run
|
|
60
|
+
pnpm publish:dual
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The dual publish script builds once, then publishes the same CLI bundle to both `@vibelet/cli` and `vibelet`. The dry-run path stages both packages and validates them with `npm pack --dry-run` without touching the registry.
|
|
64
|
+
|
|
65
|
+
## Notes
|
|
66
|
+
|
|
67
|
+
- The npm package publishes the CLI plus a minified daemon runtime bundle.
|
|
68
|
+
- The package is intended for end users of the macOS host daemon, not for importing as a library.
|
|
69
|
+
- The daemon keeps `~/.vibelet/data/audit.jsonl` and `~/.vibelet/logs/daemon.*.log` size-bounded by trimming the oldest content in place.
|
|
70
|
+
- Environment variables:
|
|
71
|
+
| Variable | Default | Description |
|
|
72
|
+
|----------|---------|-------------|
|
|
73
|
+
| `VIBE_PORT` | `9876` | Daemon listen port |
|
|
74
|
+
| `VIBE_IDLE_TIMEOUT_MS` | `1800000` (30 min) | Idle timeout before a driver is released (0 = disabled) |
|
|
75
|
+
| `VIBE_TURN_STALL_TIMEOUT_MS` | `300000` (5 min) | Max inactivity for an in-flight turn (0 = disabled) |
|
|
76
|
+
| `VIBE_AUDIT_MAX_BYTES` | `8388608` (8 MB) | Max audit.jsonl size before trimming |
|
|
77
|
+
| `VIBE_DAEMON_LOG_MAX_BYTES` | `16777216` (16 MB) | Max daemon log file size before trimming |
|
|
78
|
+
| `VIBE_STORAGE_HOUSEKEEPING_INTERVAL_MS` | `300000` (5 min) | Log trimming check interval |
|
|
79
|
+
| `CLAUDE_PATH` | auto-detect | Path to Claude binary |
|
|
80
|
+
| `CODEX_PATH` | auto-detect | Path to Codex binary |
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const QUICK_TUNNEL_URL_PATTERN = /https:\/\/[a-z0-9-]+\.trycloudflare\.com(?=$|[\s"',)\]])/g;
|
|
2
|
+
|
|
3
|
+
export function extractQuickTunnelUrl(logContent) {
|
|
4
|
+
if (typeof logContent !== 'string' || logContent.length === 0) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const match = QUICK_TUNNEL_URL_PATTERN.exec(logContent);
|
|
9
|
+
QUICK_TUNNEL_URL_PATTERN.lastIndex = 0;
|
|
10
|
+
return match?.[0] ?? null;
|
|
11
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { delimiter, dirname, isAbsolute, join, resolve } from 'node:path';
|
|
4
|
+
|
|
5
|
+
const npmFallbackCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx';
|
|
6
|
+
const npmFallbackArgs = ['--yes', '--package=cloudflared', 'cloudflared'];
|
|
7
|
+
const npmFallbackDescription = `npx ${npmFallbackArgs.join(' ')}`;
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
|
|
10
|
+
function defaultResolveCloudflaredPackageJsonPath() {
|
|
11
|
+
if (process.env.VIBELET_CLOUDFLARED_PACKAGE_JSON) {
|
|
12
|
+
return process.env.VIBELET_CLOUDFLARED_PACKAGE_JSON;
|
|
13
|
+
}
|
|
14
|
+
return require.resolve('cloudflared/package.json');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function getExecutableCandidates(name, pathExtValue = process.env.PATHEXT ?? '') {
|
|
18
|
+
if (process.platform !== 'win32') {
|
|
19
|
+
return [name];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const extensions = pathExtValue
|
|
23
|
+
.split(';')
|
|
24
|
+
.map((entry) => entry.trim())
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.map((entry) => (entry.startsWith('.') ? entry : `.${entry}`))
|
|
27
|
+
.map((entry) => entry.toLowerCase());
|
|
28
|
+
|
|
29
|
+
return [name, ...extensions.map((entry) => `${name}${entry}`)];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function findExecutableInPath(name, {
|
|
33
|
+
pathValue = process.env.PATH ?? '',
|
|
34
|
+
pathExtValue = process.env.PATHEXT ?? '',
|
|
35
|
+
} = {}) {
|
|
36
|
+
if (!pathValue) return null;
|
|
37
|
+
|
|
38
|
+
for (const dir of pathValue.split(delimiter)) {
|
|
39
|
+
if (!dir) continue;
|
|
40
|
+
for (const candidate of getExecutableCandidates(name, pathExtValue)) {
|
|
41
|
+
const candidatePath = join(dir, candidate);
|
|
42
|
+
if (existsSync(candidatePath)) {
|
|
43
|
+
return candidatePath;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function resolveInstalledCloudflaredCliPath({
|
|
52
|
+
resolvePackageJsonPath = defaultResolveCloudflaredPackageJsonPath,
|
|
53
|
+
} = {}) {
|
|
54
|
+
let packageJsonPath;
|
|
55
|
+
try {
|
|
56
|
+
packageJsonPath = resolvePackageJsonPath();
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let packageJson;
|
|
62
|
+
try {
|
|
63
|
+
packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const relativeBinPath = typeof packageJson.bin === 'string'
|
|
69
|
+
? packageJson.bin
|
|
70
|
+
: packageJson.bin?.cloudflared;
|
|
71
|
+
|
|
72
|
+
if (typeof relativeBinPath !== 'string' || !relativeBinPath) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const cliPath = isAbsolute(relativeBinPath)
|
|
77
|
+
? relativeBinPath
|
|
78
|
+
: resolve(dirname(packageJsonPath), relativeBinPath);
|
|
79
|
+
|
|
80
|
+
return existsSync(cliPath) ? cliPath : null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function resolveCloudflaredLaunchSpec({
|
|
84
|
+
pathValue = process.env.PATH ?? '',
|
|
85
|
+
pathExtValue = process.env.PATHEXT ?? '',
|
|
86
|
+
resolvePackageJsonPath,
|
|
87
|
+
} = {}) {
|
|
88
|
+
const directPath = findExecutableInPath('cloudflared', { pathValue, pathExtValue });
|
|
89
|
+
if (directPath) {
|
|
90
|
+
return {
|
|
91
|
+
command: directPath,
|
|
92
|
+
args: [],
|
|
93
|
+
source: 'path',
|
|
94
|
+
description: directPath,
|
|
95
|
+
urlTimeoutMs: 30_000,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const dependencyCliPath = resolveInstalledCloudflaredCliPath({ resolvePackageJsonPath });
|
|
100
|
+
if (dependencyCliPath) {
|
|
101
|
+
return {
|
|
102
|
+
command: process.execPath,
|
|
103
|
+
args: [dependencyCliPath],
|
|
104
|
+
source: 'dependency',
|
|
105
|
+
description: dependencyCliPath,
|
|
106
|
+
urlTimeoutMs: 90_000,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
command: npmFallbackCommand,
|
|
112
|
+
args: [...npmFallbackArgs],
|
|
113
|
+
source: 'npm',
|
|
114
|
+
description: npmFallbackDescription,
|
|
115
|
+
urlTimeoutMs: 90_000,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function summarizeCloudflaredLog(logContent, {
|
|
120
|
+
maxLines = 8,
|
|
121
|
+
maxChars = 1200,
|
|
122
|
+
} = {}) {
|
|
123
|
+
const lines = logContent
|
|
124
|
+
.split(/\r?\n/u)
|
|
125
|
+
.map((line) => line.trimEnd())
|
|
126
|
+
.filter(Boolean);
|
|
127
|
+
|
|
128
|
+
if (lines.length === 0) {
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const tail = lines.slice(-maxLines).join('\n');
|
|
133
|
+
if (tail.length <= maxChars) {
|
|
134
|
+
return tail;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return tail.slice(tail.length - maxChars);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function formatCloudflaredFailureMessage({
|
|
141
|
+
launchSpec,
|
|
142
|
+
logContent = '',
|
|
143
|
+
logPath,
|
|
144
|
+
err = null,
|
|
145
|
+
phase = 'exit',
|
|
146
|
+
}) {
|
|
147
|
+
const launchSuffix = launchSpec?.source === 'npm'
|
|
148
|
+
? ' via npm fallback (npx --yes --package=cloudflared cloudflared)'
|
|
149
|
+
: launchSpec?.source === 'dependency'
|
|
150
|
+
? ' via bundled cloudflared dependency'
|
|
151
|
+
: '';
|
|
152
|
+
|
|
153
|
+
if (phase === 'spawn') {
|
|
154
|
+
return `Failed to start cloudflared${launchSuffix}: ${err?.message ?? 'unknown error'}`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (phase === 'timeout') {
|
|
158
|
+
const summary = summarizeCloudflaredLog(logContent);
|
|
159
|
+
if (summary) {
|
|
160
|
+
return `Timed out waiting for tunnel URL (${Math.round((launchSpec?.urlTimeoutMs ?? 30_000) / 1000)}s)${launchSuffix}.\nRecent stderr:\n${summary}`;
|
|
161
|
+
}
|
|
162
|
+
return `Timed out waiting for tunnel URL (${Math.round((launchSpec?.urlTimeoutMs ?? 30_000) / 1000)}s)${launchSuffix}. Check network/proxy settings and ${logPath}.`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const summary = summarizeCloudflaredLog(logContent);
|
|
166
|
+
if (summary) {
|
|
167
|
+
return `cloudflared exited before producing a tunnel URL${launchSuffix}.\nRecent stderr:\n${summary}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return `cloudflared exited before producing a tunnel URL${launchSuffix}. Check ${logPath}.`;
|
|
171
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function shouldReuseHealthyDaemon({
|
|
2
|
+
command,
|
|
3
|
+
daemonHealthy,
|
|
4
|
+
hasExplicitConfigOverrides,
|
|
5
|
+
}) {
|
|
6
|
+
if (!daemonHealthy) return false;
|
|
7
|
+
if (command !== 'default' && command !== 'start') return false;
|
|
8
|
+
return !hasExplicitConfigOverrides;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function doesHealthMatchRequestedConnectionConfig({
|
|
12
|
+
health,
|
|
13
|
+
relayUrl = '',
|
|
14
|
+
canonicalHost = '',
|
|
15
|
+
fallbackHosts = '',
|
|
16
|
+
localMode = false,
|
|
17
|
+
}) {
|
|
18
|
+
if (!health) return false;
|
|
19
|
+
|
|
20
|
+
const currentRelayUrl = typeof health.relayUrl === 'string' ? health.relayUrl : '';
|
|
21
|
+
if (relayUrl) {
|
|
22
|
+
return currentRelayUrl === relayUrl;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (localMode) {
|
|
26
|
+
return currentRelayUrl === '';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (canonicalHost) {
|
|
30
|
+
if (fallbackHosts) return false;
|
|
31
|
+
return currentRelayUrl === '' && health.canonicalHost === canonicalHost;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (fallbackHosts) return false;
|
|
35
|
+
return currentRelayUrl === '';
|
|
36
|
+
}
|
package/bin/vibelet.cjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { realpathSync } = require('node:fs');
|
|
4
|
+
const { dirname, join } = require('node:path');
|
|
5
|
+
const { pathToFileURL } = require('node:url');
|
|
6
|
+
|
|
7
|
+
const entryPath = join(dirname(realpathSync(__filename)), 'vibelet.mjs');
|
|
8
|
+
|
|
9
|
+
import(pathToFileURL(entryPath).href).catch((error) => {
|
|
10
|
+
console.error(error);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|