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.
Files changed (323) hide show
  1. package/README.md +80 -0
  2. package/bin/cloudflared-quick-tunnel.mjs +11 -0
  3. package/bin/cloudflared-resolver.mjs +171 -0
  4. package/bin/vibelet-runtime-policy.mjs +36 -0
  5. package/bin/vibelet.cjs +12 -0
  6. package/bin/vibelet.mjs +1235 -0
  7. package/dist/index.cjs +126 -0
  8. package/package.json +24 -22
  9. package/app.json +0 -5
  10. package/dist/advertised-hosts.d.ts +0 -34
  11. package/dist/advertised-hosts.d.ts.map +0 -1
  12. package/dist/advertised-hosts.js +0 -176
  13. package/dist/advertised-hosts.js.map +0 -1
  14. package/dist/advertised-hosts.test.d.ts +0 -2
  15. package/dist/advertised-hosts.test.d.ts.map +0 -1
  16. package/dist/advertised-hosts.test.js +0 -96
  17. package/dist/advertised-hosts.test.js.map +0 -1
  18. package/dist/audit.d.ts +0 -30
  19. package/dist/audit.d.ts.map +0 -1
  20. package/dist/audit.js +0 -73
  21. package/dist/audit.js.map +0 -1
  22. package/dist/audit.test.d.ts +0 -2
  23. package/dist/audit.test.d.ts.map +0 -1
  24. package/dist/audit.test.js +0 -33
  25. package/dist/audit.test.js.map +0 -1
  26. package/dist/auth.d.ts +0 -6
  27. package/dist/auth.d.ts.map +0 -1
  28. package/dist/auth.js +0 -27
  29. package/dist/auth.js.map +0 -1
  30. package/dist/claude-hooks.d.ts +0 -58
  31. package/dist/claude-hooks.d.ts.map +0 -1
  32. package/dist/claude-hooks.js +0 -129
  33. package/dist/claude-hooks.js.map +0 -1
  34. package/dist/cli-version.d.ts +0 -3
  35. package/dist/cli-version.d.ts.map +0 -1
  36. package/dist/cli-version.js +0 -35
  37. package/dist/cli-version.js.map +0 -1
  38. package/dist/cli-version.test.d.ts +0 -2
  39. package/dist/cli-version.test.d.ts.map +0 -1
  40. package/dist/cli-version.test.js +0 -38
  41. package/dist/cli-version.test.js.map +0 -1
  42. package/dist/config.d.ts +0 -30
  43. package/dist/config.d.ts.map +0 -1
  44. package/dist/config.js +0 -327
  45. package/dist/config.js.map +0 -1
  46. package/dist/config.test.d.ts +0 -2
  47. package/dist/config.test.d.ts.map +0 -1
  48. package/dist/config.test.js +0 -184
  49. package/dist/config.test.js.map +0 -1
  50. package/dist/dev-auth.test.d.ts +0 -2
  51. package/dist/dev-auth.test.d.ts.map +0 -1
  52. package/dist/dev-auth.test.js +0 -154
  53. package/dist/dev-auth.test.js.map +0 -1
  54. package/dist/dev-script.test.d.ts +0 -2
  55. package/dist/dev-script.test.d.ts.map +0 -1
  56. package/dist/dev-script.test.js +0 -412
  57. package/dist/dev-script.test.js.map +0 -1
  58. package/dist/drivers/claude.d.ts +0 -34
  59. package/dist/drivers/claude.d.ts.map +0 -1
  60. package/dist/drivers/claude.js +0 -413
  61. package/dist/drivers/claude.js.map +0 -1
  62. package/dist/drivers/claude.test.d.ts +0 -2
  63. package/dist/drivers/claude.test.d.ts.map +0 -1
  64. package/dist/drivers/claude.test.js +0 -951
  65. package/dist/drivers/claude.test.js.map +0 -1
  66. package/dist/drivers/codex.d.ts +0 -38
  67. package/dist/drivers/codex.d.ts.map +0 -1
  68. package/dist/drivers/codex.js +0 -771
  69. package/dist/drivers/codex.js.map +0 -1
  70. package/dist/drivers/codex.test.d.ts +0 -2
  71. package/dist/drivers/codex.test.d.ts.map +0 -1
  72. package/dist/drivers/codex.test.js +0 -939
  73. package/dist/drivers/codex.test.js.map +0 -1
  74. package/dist/drivers/types.d.ts +0 -14
  75. package/dist/drivers/types.d.ts.map +0 -1
  76. package/dist/drivers/types.js +0 -2
  77. package/dist/drivers/types.js.map +0 -1
  78. package/dist/e2e.test.d.ts +0 -2
  79. package/dist/e2e.test.d.ts.map +0 -1
  80. package/dist/e2e.test.js +0 -111
  81. package/dist/e2e.test.js.map +0 -1
  82. package/dist/identity.d.ts +0 -10
  83. package/dist/identity.d.ts.map +0 -1
  84. package/dist/identity.js +0 -66
  85. package/dist/identity.js.map +0 -1
  86. package/dist/identity.test.d.ts +0 -2
  87. package/dist/identity.test.d.ts.map +0 -1
  88. package/dist/identity.test.js +0 -25
  89. package/dist/identity.test.js.map +0 -1
  90. package/dist/index-entry.test.d.ts +0 -2
  91. package/dist/index-entry.test.d.ts.map +0 -1
  92. package/dist/index-entry.test.js +0 -272
  93. package/dist/index-entry.test.js.map +0 -1
  94. package/dist/index.d.ts +0 -2
  95. package/dist/index.d.ts.map +0 -1
  96. package/dist/index.js +0 -707
  97. package/dist/index.js.map +0 -1
  98. package/dist/logger.d.ts +0 -31
  99. package/dist/logger.d.ts.map +0 -1
  100. package/dist/logger.js +0 -75
  101. package/dist/logger.js.map +0 -1
  102. package/dist/metrics.d.ts +0 -52
  103. package/dist/metrics.d.ts.map +0 -1
  104. package/dist/metrics.js +0 -89
  105. package/dist/metrics.js.map +0 -1
  106. package/dist/pairing-store.d.ts +0 -29
  107. package/dist/pairing-store.d.ts.map +0 -1
  108. package/dist/pairing-store.js +0 -131
  109. package/dist/pairing-store.js.map +0 -1
  110. package/dist/pairing-store.test.d.ts +0 -2
  111. package/dist/pairing-store.test.d.ts.map +0 -1
  112. package/dist/pairing-store.test.js +0 -47
  113. package/dist/pairing-store.test.js.map +0 -1
  114. package/dist/paths.d.ts +0 -16
  115. package/dist/paths.d.ts.map +0 -1
  116. package/dist/paths.js +0 -18
  117. package/dist/paths.js.map +0 -1
  118. package/dist/perf-compare.d.ts +0 -13
  119. package/dist/perf-compare.d.ts.map +0 -1
  120. package/dist/perf-compare.js +0 -125
  121. package/dist/perf-compare.js.map +0 -1
  122. package/dist/port-conflict.d.ts +0 -9
  123. package/dist/port-conflict.d.ts.map +0 -1
  124. package/dist/port-conflict.js +0 -33
  125. package/dist/port-conflict.js.map +0 -1
  126. package/dist/port-conflict.test.d.ts +0 -2
  127. package/dist/port-conflict.test.d.ts.map +0 -1
  128. package/dist/port-conflict.test.js +0 -38
  129. package/dist/port-conflict.test.js.map +0 -1
  130. package/dist/process-scanner.d.ts +0 -43
  131. package/dist/process-scanner.d.ts.map +0 -1
  132. package/dist/process-scanner.js +0 -453
  133. package/dist/process-scanner.js.map +0 -1
  134. package/dist/process-scanner.perf.test.d.ts +0 -2
  135. package/dist/process-scanner.perf.test.d.ts.map +0 -1
  136. package/dist/process-scanner.perf.test.js +0 -186
  137. package/dist/process-scanner.perf.test.js.map +0 -1
  138. package/dist/process-scanner.test.d.ts +0 -2
  139. package/dist/process-scanner.test.d.ts.map +0 -1
  140. package/dist/process-scanner.test.js +0 -399
  141. package/dist/process-scanner.test.js.map +0 -1
  142. package/dist/push-protocol.d.ts +0 -15
  143. package/dist/push-protocol.d.ts.map +0 -1
  144. package/dist/push-protocol.js +0 -23
  145. package/dist/push-protocol.js.map +0 -1
  146. package/dist/push-protocol.test.d.ts +0 -2
  147. package/dist/push-protocol.test.d.ts.map +0 -1
  148. package/dist/push-protocol.test.js +0 -57
  149. package/dist/push-protocol.test.js.map +0 -1
  150. package/dist/push-store.d.ts +0 -22
  151. package/dist/push-store.d.ts.map +0 -1
  152. package/dist/push-store.js +0 -103
  153. package/dist/push-store.js.map +0 -1
  154. package/dist/push-store.test.d.ts +0 -2
  155. package/dist/push-store.test.d.ts.map +0 -1
  156. package/dist/push-store.test.js +0 -79
  157. package/dist/push-store.test.js.map +0 -1
  158. package/dist/push.d.ts +0 -65
  159. package/dist/push.d.ts.map +0 -1
  160. package/dist/push.js +0 -202
  161. package/dist/push.js.map +0 -1
  162. package/dist/push.test.d.ts +0 -2
  163. package/dist/push.test.d.ts.map +0 -1
  164. package/dist/push.test.js +0 -199
  165. package/dist/push.test.js.map +0 -1
  166. package/dist/safe-stdio.d.ts +0 -3
  167. package/dist/safe-stdio.d.ts.map +0 -1
  168. package/dist/safe-stdio.js +0 -46
  169. package/dist/safe-stdio.js.map +0 -1
  170. package/dist/scanner.d.ts +0 -30
  171. package/dist/scanner.d.ts.map +0 -1
  172. package/dist/scanner.js +0 -859
  173. package/dist/scanner.js.map +0 -1
  174. package/dist/scanner.perf.test.d.ts +0 -2
  175. package/dist/scanner.perf.test.d.ts.map +0 -1
  176. package/dist/scanner.perf.test.js +0 -320
  177. package/dist/scanner.perf.test.js.map +0 -1
  178. package/dist/scanner.test.d.ts +0 -2
  179. package/dist/scanner.test.d.ts.map +0 -1
  180. package/dist/scanner.test.js +0 -948
  181. package/dist/scanner.test.js.map +0 -1
  182. package/dist/session-inventory.d.ts +0 -63
  183. package/dist/session-inventory.d.ts.map +0 -1
  184. package/dist/session-inventory.js +0 -525
  185. package/dist/session-inventory.js.map +0 -1
  186. package/dist/session-inventory.perf.test.d.ts +0 -2
  187. package/dist/session-inventory.perf.test.d.ts.map +0 -1
  188. package/dist/session-inventory.perf.test.js +0 -220
  189. package/dist/session-inventory.perf.test.js.map +0 -1
  190. package/dist/session-inventory.test.d.ts +0 -2
  191. package/dist/session-inventory.test.d.ts.map +0 -1
  192. package/dist/session-inventory.test.js +0 -712
  193. package/dist/session-inventory.test.js.map +0 -1
  194. package/dist/session-manager.d.ts +0 -75
  195. package/dist/session-manager.d.ts.map +0 -1
  196. package/dist/session-manager.js +0 -1515
  197. package/dist/session-manager.js.map +0 -1
  198. package/dist/session-manager.test.d.ts +0 -2
  199. package/dist/session-manager.test.d.ts.map +0 -1
  200. package/dist/session-manager.test.js +0 -2861
  201. package/dist/session-manager.test.js.map +0 -1
  202. package/dist/session-store.d.ts +0 -42
  203. package/dist/session-store.d.ts.map +0 -1
  204. package/dist/session-store.js +0 -163
  205. package/dist/session-store.js.map +0 -1
  206. package/dist/session-store.test.d.ts +0 -2
  207. package/dist/session-store.test.d.ts.map +0 -1
  208. package/dist/session-store.test.js +0 -236
  209. package/dist/session-store.test.js.map +0 -1
  210. package/dist/session-title.d.ts +0 -6
  211. package/dist/session-title.d.ts.map +0 -1
  212. package/dist/session-title.js +0 -105
  213. package/dist/session-title.js.map +0 -1
  214. package/dist/session-title.perf.test.d.ts +0 -2
  215. package/dist/session-title.perf.test.d.ts.map +0 -1
  216. package/dist/session-title.perf.test.js +0 -99
  217. package/dist/session-title.perf.test.js.map +0 -1
  218. package/dist/session-title.test.d.ts +0 -2
  219. package/dist/session-title.test.d.ts.map +0 -1
  220. package/dist/session-title.test.js +0 -199
  221. package/dist/session-title.test.js.map +0 -1
  222. package/dist/shutdown-endpoint.test.d.ts +0 -2
  223. package/dist/shutdown-endpoint.test.d.ts.map +0 -1
  224. package/dist/shutdown-endpoint.test.js +0 -93
  225. package/dist/shutdown-endpoint.test.js.map +0 -1
  226. package/dist/storage-housekeeping.d.ts +0 -28
  227. package/dist/storage-housekeeping.d.ts.map +0 -1
  228. package/dist/storage-housekeeping.js +0 -76
  229. package/dist/storage-housekeeping.js.map +0 -1
  230. package/dist/storage-housekeeping.test.d.ts +0 -2
  231. package/dist/storage-housekeeping.test.d.ts.map +0 -1
  232. package/dist/storage-housekeeping.test.js +0 -65
  233. package/dist/storage-housekeeping.test.js.map +0 -1
  234. package/dist/test-daemon-harness.d.ts +0 -31
  235. package/dist/test-daemon-harness.d.ts.map +0 -1
  236. package/dist/test-daemon-harness.js +0 -337
  237. package/dist/test-daemon-harness.js.map +0 -1
  238. package/dist/token-auth.test.d.ts +0 -2
  239. package/dist/token-auth.test.d.ts.map +0 -1
  240. package/dist/token-auth.test.js +0 -52
  241. package/dist/token-auth.test.js.map +0 -1
  242. package/dist/utils.d.ts +0 -4
  243. package/dist/utils.d.ts.map +0 -1
  244. package/dist/utils.js +0 -40
  245. package/dist/utils.js.map +0 -1
  246. package/dist/utils.test.d.ts +0 -2
  247. package/dist/utils.test.d.ts.map +0 -1
  248. package/dist/utils.test.js +0 -54
  249. package/dist/utils.test.js.map +0 -1
  250. package/dist/ws-data.d.ts +0 -4
  251. package/dist/ws-data.d.ts.map +0 -1
  252. package/dist/ws-data.js +0 -20
  253. package/dist/ws-data.js.map +0 -1
  254. package/dist/ws-data.test.d.ts +0 -2
  255. package/dist/ws-data.test.d.ts.map +0 -1
  256. package/dist/ws-data.test.js +0 -17
  257. package/dist/ws-data.test.js.map +0 -1
  258. package/perf-reporter.mjs +0 -138
  259. package/scripts/build-release.mjs +0 -41
  260. package/scripts/dev.mjs +0 -537
  261. package/src/advertised-hosts.test.ts +0 -125
  262. package/src/advertised-hosts.ts +0 -225
  263. package/src/audit.test.ts +0 -38
  264. package/src/audit.ts +0 -117
  265. package/src/auth.ts +0 -31
  266. package/src/claude-hooks.ts +0 -195
  267. package/src/cli-version.test.ts +0 -36
  268. package/src/cli-version.ts +0 -46
  269. package/src/config.test.ts +0 -254
  270. package/src/config.ts +0 -324
  271. package/src/dev-auth.test.ts +0 -183
  272. package/src/dev-script.test.ts +0 -511
  273. package/src/drivers/claude.test.ts +0 -1186
  274. package/src/drivers/claude.ts +0 -443
  275. package/src/drivers/codex.test.ts +0 -1096
  276. package/src/drivers/codex.ts +0 -879
  277. package/src/drivers/types.ts +0 -15
  278. package/src/e2e.test.ts +0 -139
  279. package/src/identity.test.ts +0 -26
  280. package/src/identity.ts +0 -82
  281. package/src/index-entry.test.ts +0 -336
  282. package/src/index.ts +0 -781
  283. package/src/logger.ts +0 -112
  284. package/src/metrics.ts +0 -117
  285. package/src/pairing-store.test.ts +0 -53
  286. package/src/pairing-store.ts +0 -154
  287. package/src/paths.ts +0 -19
  288. package/src/perf-compare.ts +0 -164
  289. package/src/port-conflict.test.ts +0 -45
  290. package/src/port-conflict.ts +0 -44
  291. package/src/process-scanner.perf.test.ts +0 -222
  292. package/src/process-scanner.test.ts +0 -575
  293. package/src/process-scanner.ts +0 -514
  294. package/src/push-protocol.test.ts +0 -74
  295. package/src/push-protocol.ts +0 -36
  296. package/src/push-store.test.ts +0 -89
  297. package/src/push-store.ts +0 -126
  298. package/src/push.test.ts +0 -234
  299. package/src/push.ts +0 -318
  300. package/src/safe-stdio.ts +0 -51
  301. package/src/scanner.perf.test.ts +0 -359
  302. package/src/scanner.test.ts +0 -1045
  303. package/src/scanner.ts +0 -924
  304. package/src/session-inventory.perf.test.ts +0 -250
  305. package/src/session-inventory.test.ts +0 -1002
  306. package/src/session-inventory.ts +0 -721
  307. package/src/session-manager.test.ts +0 -3430
  308. package/src/session-manager.ts +0 -1775
  309. package/src/session-store.test.ts +0 -276
  310. package/src/session-store.ts +0 -202
  311. package/src/session-title.perf.test.ts +0 -118
  312. package/src/session-title.test.ts +0 -286
  313. package/src/session-title.ts +0 -108
  314. package/src/shutdown-endpoint.test.ts +0 -95
  315. package/src/storage-housekeeping.test.ts +0 -78
  316. package/src/storage-housekeeping.ts +0 -111
  317. package/src/test-daemon-harness.ts +0 -410
  318. package/src/token-auth.test.ts +0 -67
  319. package/src/utils.test.ts +0 -65
  320. package/src/utils.ts +0 -47
  321. package/src/ws-data.test.ts +0 -20
  322. package/src/ws-data.ts +0 -26
  323. 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
+ }
@@ -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
+ });