@vibelet/cli 0.1.37 → 1.0.0

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 +1062 -0
  7. package/dist/index.cjs +126 -0
  8. package/package.json +25 -24
  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
@@ -1,58 +0,0 @@
1
- export declare const CLAUDE_HOOK_APPROVAL_PREFIX = "claude-hook:";
2
- export declare const CLAUDE_HOOK_SECRET_HEADER = "x-vibelet-claude-hook-secret";
3
- export type ClaudeSessionHookData = {
4
- session_id?: string;
5
- sessionId?: string;
6
- transcript_path?: string;
7
- transcriptPath?: string;
8
- cwd?: string;
9
- hook_event_name?: string;
10
- hookEventName?: string;
11
- source?: string;
12
- [key: string]: unknown;
13
- };
14
- export type ClaudePermissionHookData = {
15
- session_id?: string;
16
- sessionId?: string;
17
- transcript_path?: string;
18
- transcriptPath?: string;
19
- cwd?: string;
20
- hook_event_name?: string;
21
- hookEventName?: string;
22
- permission_mode?: string;
23
- permissionMode?: string;
24
- tool_name?: string;
25
- toolName?: string;
26
- tool_input?: unknown;
27
- toolInput?: unknown;
28
- tool_use_id?: string;
29
- toolUseId?: string;
30
- permission_suggestions?: unknown;
31
- permissionSuggestions?: unknown;
32
- [key: string]: unknown;
33
- };
34
- export type ClaudePermissionHookResponse = {
35
- continue: boolean;
36
- suppressOutput?: boolean;
37
- stopReason?: string;
38
- systemMessage?: string;
39
- hookSpecificOutput?: {
40
- hookEventName?: 'PreToolUse';
41
- permissionDecision?: 'allow' | 'deny' | 'ask';
42
- permissionDecisionReason?: string;
43
- updatedInput?: unknown;
44
- [key: string]: unknown;
45
- };
46
- [key: string]: unknown;
47
- };
48
- export type ClaudeHookFiles = {
49
- secret: string;
50
- dirPath: string;
51
- settingsPath: string;
52
- sessionScriptPath: string;
53
- permissionScriptPath: string;
54
- };
55
- export declare const DEFAULT_CLAUDE_PERMISSION_HOOK_RESPONSE: ClaudePermissionHookResponse;
56
- export declare function createClaudeHookFiles(port: number, secret: string): ClaudeHookFiles;
57
- export declare function cleanupClaudeHookFiles(hookFiles: ClaudeHookFiles | null | undefined): void;
58
- //# sourceMappingURL=claude-hooks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-hooks.d.ts","sourceRoot":"","sources":["../src/claude-hooks.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAC1D,eAAO,MAAM,yBAAyB,iCAAiC,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE;QACnB,aAAa,CAAC,EAAE,YAAY,CAAC;QAC7B,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QAC9C,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,uCAAuC,EAAE,4BAMrD,CAAC;AAmEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAgDnF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAO1F"}
@@ -1,129 +0,0 @@
1
- import { mkdirSync, rmSync, writeFileSync } from 'fs';
2
- import { tmpdir } from 'os';
3
- import { join } from 'path';
4
- import { randomUUID } from 'crypto';
5
- export const CLAUDE_HOOK_APPROVAL_PREFIX = 'claude-hook:';
6
- export const CLAUDE_HOOK_SECRET_HEADER = 'x-vibelet-claude-hook-secret';
7
- export const DEFAULT_CLAUDE_PERMISSION_HOOK_RESPONSE = {
8
- continue: true,
9
- suppressOutput: true,
10
- hookSpecificOutput: {
11
- hookEventName: 'PreToolUse',
12
- },
13
- };
14
- function buildSessionForwarderScript(port, secret) {
15
- return `#!/usr/bin/env node
16
- const http = require('http');
17
- const chunks = [];
18
- process.stdin.on('data', (chunk) => chunks.push(chunk));
19
- process.stdin.on('end', () => {
20
- const body = Buffer.concat(chunks);
21
- const req = http.request({
22
- host: '127.0.0.1',
23
- port: ${port},
24
- method: 'POST',
25
- path: '/hook/claude/session-start',
26
- headers: {
27
- 'Content-Type': 'application/json',
28
- 'Content-Length': body.length,
29
- '${CLAUDE_HOOK_SECRET_HEADER}': ${JSON.stringify(secret)}
30
- }
31
- }, (res) => { res.resume(); });
32
- req.on('error', () => {});
33
- req.end(body);
34
- });
35
- process.stdin.resume();
36
- `;
37
- }
38
- function buildPermissionForwarderScript(port, secret) {
39
- return `#!/usr/bin/env node
40
- const http = require('http');
41
- const fallback = ${JSON.stringify(JSON.stringify(DEFAULT_CLAUDE_PERMISSION_HOOK_RESPONSE))};
42
- const chunks = [];
43
- process.stdin.on('data', (chunk) => chunks.push(chunk));
44
- process.stdin.on('end', () => {
45
- const body = Buffer.concat(chunks);
46
- const req = http.request({
47
- host: '127.0.0.1',
48
- port: ${port},
49
- method: 'POST',
50
- path: '/hook/claude/permission-request',
51
- headers: {
52
- 'Content-Type': 'application/json',
53
- 'Content-Length': body.length,
54
- '${CLAUDE_HOOK_SECRET_HEADER}': ${JSON.stringify(secret)}
55
- }
56
- }, (res) => {
57
- const responseChunks = [];
58
- res.on('data', (chunk) => responseChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
59
- res.on('end', () => {
60
- const statusCode = res.statusCode || 0;
61
- if (statusCode < 200 || statusCode >= 300) {
62
- process.stdout.write(fallback);
63
- return;
64
- }
65
- const payload = Buffer.concat(responseChunks).toString('utf8').trim();
66
- process.stdout.write(payload || fallback);
67
- });
68
- });
69
- req.on('error', () => {
70
- process.stdout.write(fallback);
71
- });
72
- req.end(body);
73
- });
74
- process.stdin.resume();
75
- `;
76
- }
77
- export function createClaudeHookFiles(port, secret) {
78
- const dirPath = join(tmpdir(), `vibelet-claude-hooks-${process.pid}-${randomUUID()}`);
79
- mkdirSync(dirPath, { recursive: true });
80
- const settingsPath = join(dirPath, 'settings.json');
81
- const sessionScriptPath = join(dirPath, 'session_hook_forwarder.cjs');
82
- const permissionScriptPath = join(dirPath, 'permission_hook_forwarder.cjs');
83
- writeFileSync(sessionScriptPath, buildSessionForwarderScript(port, secret), 'utf8');
84
- writeFileSync(permissionScriptPath, buildPermissionForwarderScript(port, secret), 'utf8');
85
- writeFileSync(settingsPath, JSON.stringify({
86
- hooks: {
87
- SessionStart: [
88
- {
89
- matcher: '*',
90
- hooks: [
91
- {
92
- type: 'command',
93
- command: `${JSON.stringify(process.execPath)} ${JSON.stringify(sessionScriptPath)}`,
94
- },
95
- ],
96
- },
97
- ],
98
- PreToolUse: [
99
- {
100
- matcher: '*',
101
- hooks: [
102
- {
103
- type: 'command',
104
- command: `${JSON.stringify(process.execPath)} ${JSON.stringify(permissionScriptPath)}`,
105
- },
106
- ],
107
- },
108
- ],
109
- },
110
- }, null, 2), 'utf8');
111
- return {
112
- secret,
113
- dirPath,
114
- settingsPath,
115
- sessionScriptPath,
116
- permissionScriptPath,
117
- };
118
- }
119
- export function cleanupClaudeHookFiles(hookFiles) {
120
- if (!hookFiles)
121
- return;
122
- try {
123
- rmSync(hookFiles.dirPath, { recursive: true, force: true });
124
- }
125
- catch {
126
- // best effort cleanup
127
- }
128
- }
129
- //# sourceMappingURL=claude-hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-hooks.js","sourceRoot":"","sources":["../src/claude-hooks.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export declare function resolveCliVersion(): string;
2
- export declare const CLI_VERSION: string;
3
- //# sourceMappingURL=cli-version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-version.d.ts","sourceRoot":"","sources":["../src/cli-version.ts"],"names":[],"mappings":"AAuBA,wBAAgB,iBAAiB,IAAI,MAAM,CAoB1C;AAED,eAAO,MAAM,WAAW,QAAsB,CAAC"}
@@ -1,35 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- const ROOT_PACKAGE_NAME = '@vibelet/cli';
4
- function readVersionFromPackageJson(path) {
5
- try {
6
- const packageJson = JSON.parse(readFileSync(path, 'utf8'));
7
- if (packageJson.name === ROOT_PACKAGE_NAME && typeof packageJson.version === 'string' && packageJson.version.length > 0) {
8
- return packageJson.version;
9
- }
10
- }
11
- catch {
12
- // Continue through the fallback chain.
13
- }
14
- return null;
15
- }
16
- export function resolveCliVersion() {
17
- if (process.env.VIBELET_CLI_VERSION) {
18
- return process.env.VIBELET_CLI_VERSION;
19
- }
20
- let currentDir = process.cwd();
21
- for (let depth = 0; depth < 4; depth += 1) {
22
- const version = readVersionFromPackageJson(resolve(currentDir, 'package.json'));
23
- if (version) {
24
- return version;
25
- }
26
- const parentDir = resolve(currentDir, '..');
27
- if (parentDir === currentDir) {
28
- break;
29
- }
30
- currentDir = parentDir;
31
- }
32
- return '0.0.0';
33
- }
34
- export const CLI_VERSION = resolveCliVersion();
35
- //# sourceMappingURL=cli-version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-version.js","sourceRoot":"","sources":["../src/cli-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEzC,SAAS,0BAA0B,CAAC,IAAY;IAC9C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAoB,CAAC;QAC9E,IAAI,WAAW,CAAC,IAAI,KAAK,iBAAiB,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxH,OAAO,WAAW,CAAC,OAAO,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACzC,CAAC;IAED,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QAChF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=cli-version.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-version.test.d.ts","sourceRoot":"","sources":["../src/cli-version.test.ts"],"names":[],"mappings":""}
@@ -1,38 +0,0 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { createRequire } from 'node:module';
4
- import { fileURLToPath } from 'node:url';
5
- import { resolveCliVersion } from './cli-version.js';
6
- const require = createRequire(import.meta.url);
7
- const packageJson = require('../../../package.json');
8
- const daemonPackageDir = fileURLToPath(new URL('..', import.meta.url));
9
- test('resolveCliVersion prefers VIBELET_CLI_VERSION when provided', () => {
10
- const original = process.env.VIBELET_CLI_VERSION;
11
- process.env.VIBELET_CLI_VERSION = '9.9.9-test';
12
- try {
13
- assert.equal(resolveCliVersion(), '9.9.9-test');
14
- }
15
- finally {
16
- if (original === undefined)
17
- delete process.env.VIBELET_CLI_VERSION;
18
- else
19
- process.env.VIBELET_CLI_VERSION = original;
20
- }
21
- });
22
- test('resolveCliVersion falls back to the root package version', () => {
23
- const original = process.env.VIBELET_CLI_VERSION;
24
- const originalCwd = process.cwd();
25
- delete process.env.VIBELET_CLI_VERSION;
26
- process.chdir(daemonPackageDir);
27
- try {
28
- assert.equal(resolveCliVersion(), packageJson.version);
29
- }
30
- finally {
31
- process.chdir(originalCwd);
32
- if (original === undefined)
33
- delete process.env.VIBELET_CLI_VERSION;
34
- else
35
- process.env.VIBELET_CLI_VERSION = original;
36
- }
37
- });
38
- //# sourceMappingURL=cli-version.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-version.test.js","sourceRoot":"","sources":["../src/cli-version.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAyB,CAAC;AAC7E,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvE,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,YAAY,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;;YAC9D,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACvC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;;YAC9D,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IAClD,CAAC;AACH,CAAC,CAAC,CAAC"}
package/dist/config.d.ts DELETED
@@ -1,30 +0,0 @@
1
- export declare function isTransientPath(p: string): boolean;
2
- export declare function buildSanitizedEnv(): Record<string, string>;
3
- export declare function execViaLoginShell(cmd: string, args: string[]): {
4
- command: string;
5
- args: string[];
6
- };
7
- export declare const config: {
8
- port: number;
9
- legacyToken: string;
10
- canonicalHost: string;
11
- fallbackHosts: string;
12
- /** Public relay URL (e.g. https://abc.trycloudflare.com). Overrides host/port in QR pairing payload. */
13
- relayUrl: string;
14
- /** Idle timeout in ms before a driver is automatically released. Default: 30 minutes. 0 = disabled. */
15
- idleTimeoutMs: number;
16
- /** Maximum inactivity in ms for an in-flight turn before it is failed and the driver is stopped. 0 = disabled. */
17
- turnStallTimeoutMs: number;
18
- /** Maximum size for ~/.vibelet/data/audit.jsonl before it is trimmed in place. */
19
- auditMaxBytes: number;
20
- /** Maximum size for each ~/.vibelet/logs/daemon.*.log file before it is trimmed in place. */
21
- daemonLogMaxBytes: number;
22
- /** How often the daemon trims its own stdout/stderr logs. */
23
- storageHousekeepingIntervalMs: number;
24
- readonly claudePath: string;
25
- readonly codexPath: string;
26
- isTransientPath: typeof isTransientPath;
27
- execViaLoginShell: typeof execViaLoginShell;
28
- buildSanitizedEnv: typeof buildSanitizedEnv;
29
- };
30
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAgFD,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc1D;AAqLD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAWlG;AAED,eAAO,MAAM,MAAM;;;;;IAKjB,wGAAwG;;IAExG,uGAAuG;;IAEvG,kHAAkH;;IAElH,kFAAkF;;IAElF,6FAA6F;;IAE7F,6DAA6D;;;;;;;CAO9D,CAAC"}
package/dist/config.js DELETED
@@ -1,327 +0,0 @@
1
- import { execFileSync } from 'child_process';
2
- import { existsSync } from 'fs';
3
- import { join, delimiter } from 'path';
4
- import { homedir } from 'os';
5
- import { logger as rootLogger } from './logger.js';
6
- const TRANSIENT_PATH_MARKERS = ['fnm_multishells'];
7
- const CACHE_TTL = 60_000;
8
- const IS_WIN32 = process.platform === 'win32';
9
- const log = rootLogger.child({ module: 'config' });
10
- export function isTransientPath(p) {
11
- return TRANSIENT_PATH_MARKERS.some(marker => p.includes(marker));
12
- }
13
- function getLoginShellCandidates() {
14
- if (IS_WIN32)
15
- return []; // No login shell on Windows
16
- return [process.env.SHELL, '/bin/zsh', '/bin/bash', '/bin/sh']
17
- .filter((s) => !!s)
18
- .filter((s, i, a) => a.indexOf(s) === i);
19
- }
20
- // ===== Shell Environment =====
21
- let cachedShellEnv = null;
22
- function loadUserShellEnv() {
23
- if (cachedShellEnv && !isTransientPath(cachedShellEnv.PATH ?? ''))
24
- return cachedShellEnv;
25
- for (const shell of getLoginShellCandidates()) {
26
- try {
27
- const result = execFileSync(shell, ['-ilc', 'env'], {
28
- timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
29
- });
30
- const env = {};
31
- for (const line of result.split('\n')) {
32
- const idx = line.indexOf('=');
33
- if (idx > 0)
34
- env[line.slice(0, idx)] = line.slice(idx + 1);
35
- }
36
- if (!isTransientPath(env.PATH ?? '')) {
37
- cachedShellEnv = env;
38
- }
39
- else {
40
- cachedShellEnv = null;
41
- }
42
- return env;
43
- }
44
- catch { /* next */ }
45
- }
46
- cachedShellEnv = {};
47
- return {};
48
- }
49
- function getExpandedPath(shellEnv = loadUserShellEnv()) {
50
- const home = homedir();
51
- const pnpmHome = shellEnv.PNPM_HOME || process.env.PNPM_HOME || (IS_WIN32 ? join(home, 'pnpm') : join(home, 'Library', 'pnpm'));
52
- const basePath = shellEnv.PATH || process.env.PATH || '';
53
- const extra = IS_WIN32
54
- ? [
55
- join(home, '.npm-global', 'bin'),
56
- join(home, '.local', 'bin'),
57
- join(home, '.claude', 'bin'),
58
- pnpmHome,
59
- join(home, 'AppData', 'Roaming', 'npm'),
60
- join(home, 'AppData', 'Local', 'Programs', 'node'),
61
- ]
62
- : [
63
- '/usr/local/bin', '/opt/homebrew/bin', '/usr/bin', '/bin',
64
- join(home, '.npm-global', 'bin'),
65
- join(home, '.local', 'bin'),
66
- join(home, '.claude', 'bin'),
67
- pnpmHome,
68
- ];
69
- const current = basePath.split(delimiter).filter(Boolean);
70
- const seen = new Set(current);
71
- for (const p of extra) {
72
- if (!seen.has(p)) {
73
- current.push(p);
74
- seen.add(p);
75
- }
76
- }
77
- return current.join(delimiter);
78
- }
79
- function getPositiveNumberEnv(name, fallback) {
80
- const raw = process.env[name];
81
- if (!raw)
82
- return fallback;
83
- const parsed = Number(raw);
84
- return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
85
- }
86
- function getNonNegativeNumberEnv(name, fallback) {
87
- const raw = process.env[name];
88
- if (raw == null || raw === '')
89
- return fallback;
90
- const parsed = Number(raw);
91
- return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : fallback;
92
- }
93
- export function buildSanitizedEnv() {
94
- const shellEnv = loadUserShellEnv();
95
- const merged = {};
96
- for (const [k, v] of Object.entries(process.env)) {
97
- if (typeof v === 'string')
98
- merged[k] = v;
99
- }
100
- for (const [k, v] of Object.entries(shellEnv)) {
101
- if (typeof v === 'string')
102
- merged[k] = v;
103
- }
104
- merged.PATH = getExpandedPath(shellEnv);
105
- if (!merged.HOME)
106
- merged.HOME = homedir();
107
- delete merged.CLAUDE_CODE_ENTRYPOINT;
108
- delete merged.CLAUDECODE;
109
- return merged;
110
- }
111
- // ===== Binary Detection =====
112
- /**
113
- * On Windows, resolve a bare command name like "codex" to its real executable
114
- * path (e.g. codex.exe) using `where.exe`. This avoids the common issue where
115
- * Node's `spawn('codex')` fails with ENOENT because it doesn't search PATH
116
- * for `.cmd`/`.ps1`/`.exe` extensions the way PowerShell/cmd do.
117
- */
118
- function resolveViaWhere(name) {
119
- if (!IS_WIN32)
120
- return undefined;
121
- try {
122
- const output = execFileSync('where.exe', [name], {
123
- timeout: 3000, stdio: 'pipe', encoding: 'utf-8',
124
- }).trim();
125
- // `where` returns one result per line. Prefer .exe over .cmd/.ps1
126
- const lines = output.split(/\r?\n/).filter(Boolean);
127
- const exe = lines.find(l => l.endsWith('.exe'));
128
- return exe ?? lines[0];
129
- }
130
- catch {
131
- return undefined;
132
- }
133
- }
134
- function runVersionSync(binaryPath, timeout = 3000) {
135
- try {
136
- return execFileSync(binaryPath, ['--version'], {
137
- timeout, stdio: 'pipe', encoding: 'utf-8', env: buildSanitizedEnv(),
138
- ...(IS_WIN32 ? { shell: true } : {}),
139
- }).trim() || null;
140
- }
141
- catch {
142
- return null;
143
- }
144
- }
145
- function runViaLoginShellSync(cmd, args, timeout = 5000) {
146
- for (const shell of getLoginShellCandidates()) {
147
- try {
148
- return execFileSync(shell, ['-ilc', `command -v ${cmd} >/dev/null 2>&1 && exec ${cmd} "$@"`, '--', ...args], {
149
- timeout, stdio: ['pipe', 'pipe', 'pipe'], encoding: 'utf-8',
150
- }).trim() || null;
151
- }
152
- catch { /* next */ }
153
- }
154
- return null;
155
- }
156
- function findViaLoginShell(cmd) {
157
- for (const shell of getLoginShellCandidates()) {
158
- try {
159
- const result = execFileSync(shell, ['-ilc', `command -v ${cmd}`], {
160
- timeout: 5000, stdio: ['pipe', 'pipe', 'pipe'], encoding: 'utf-8',
161
- }).trim();
162
- if (result)
163
- return result;
164
- }
165
- catch { /* next */ }
166
- }
167
- return undefined;
168
- }
169
- // ===== Claude Detection =====
170
- function getClaudeCandidates() {
171
- const home = homedir();
172
- return [
173
- join(home, '.local', 'bin', 'claude'),
174
- join(home, '.claude', 'bin', 'claude'),
175
- '/usr/local/bin/claude',
176
- '/opt/homebrew/bin/claude',
177
- join(home, '.npm-global', 'bin', 'claude'),
178
- ];
179
- }
180
- function findClaudeUncached() {
181
- // On Windows, use `where.exe` instead of known Unix paths
182
- if (IS_WIN32) {
183
- const found = resolveViaWhere('claude');
184
- if (found && runVersionSync(found))
185
- return found;
186
- return undefined;
187
- }
188
- // Check known paths
189
- for (const p of getClaudeCandidates()) {
190
- if (runVersionSync(p))
191
- return p;
192
- }
193
- // which (with sanitized env that has expanded PATH)
194
- try {
195
- const result = execFileSync('/usr/bin/which', ['claude'], {
196
- timeout: 3000, stdio: 'pipe', encoding: 'utf-8', env: buildSanitizedEnv(),
197
- }).trim();
198
- // Skip cmux wrappers
199
- if (result && !result.includes('cmux') && runVersionSync(result))
200
- return result;
201
- }
202
- catch { /* not found */ }
203
- return undefined;
204
- }
205
- // ===== Codex Detection =====
206
- function getCodexCandidates() {
207
- const home = homedir();
208
- const pnpmHomes = [process.env.PNPM_HOME, join(home, 'Library', 'pnpm')]
209
- .filter((p) => !!p);
210
- return [
211
- '/usr/local/bin/codex',
212
- '/opt/homebrew/bin/codex',
213
- join(home, '.npm-global', 'bin', 'codex'),
214
- join(home, '.local', 'bin', 'codex'),
215
- ...pnpmHomes.map(p => join(p, 'codex')),
216
- ];
217
- }
218
- function findCodexUncached() {
219
- // On Windows, use `where.exe` to find the real executable
220
- if (IS_WIN32) {
221
- const found = resolveViaWhere('codex');
222
- if (found && runVersionSync(found))
223
- return found;
224
- return undefined;
225
- }
226
- let transientFallback;
227
- // Check known paths
228
- for (const p of getCodexCandidates()) {
229
- if (!runVersionSync(p))
230
- continue;
231
- if (!isTransientPath(p))
232
- return p;
233
- transientFallback = p;
234
- }
235
- // which with sanitized env
236
- try {
237
- const result = execFileSync('/usr/bin/which', ['codex'], {
238
- timeout: 3000, stdio: 'pipe', encoding: 'utf-8', env: buildSanitizedEnv(),
239
- }).trim();
240
- if (result && runVersionSync(result)) {
241
- if (!isTransientPath(result))
242
- return result;
243
- transientFallback = transientFallback ?? result;
244
- }
245
- }
246
- catch { /* not found */ }
247
- // Login shell fallback
248
- const found = findViaLoginShell('codex');
249
- if (found && runVersionSync(found)) {
250
- if (!isTransientPath(found))
251
- return found;
252
- transientFallback = transientFallback ?? found;
253
- }
254
- return transientFallback;
255
- }
256
- // ===== Cached Resolvers =====
257
- function createCachedResolver(finder, name) {
258
- let cached = null;
259
- let timestamp = 0;
260
- return () => {
261
- const envKey = name === 'claude' ? 'CLAUDE_PATH' : 'CODEX_PATH';
262
- if (process.env[envKey])
263
- return process.env[envKey];
264
- const now = Date.now();
265
- // Re-resolve if expired, missing, or transient
266
- if (!cached || now - timestamp > CACHE_TTL || !existsSync(cached) || isTransientPath(cached)) {
267
- const found = finder();
268
- cached = found ?? name;
269
- timestamp = now;
270
- log.info({ name, path: cached, transient: isTransientPath(cached) }, 'binary resolved');
271
- }
272
- return cached;
273
- };
274
- }
275
- const resolveClaude = createCachedResolver(findClaudeUncached, 'claude');
276
- const resolveCodex = createCachedResolver(findCodexUncached, 'codex');
277
- // ===== CLI Args =====
278
- function parseCliArgs() {
279
- const result = {};
280
- const args = process.argv.slice(2);
281
- for (let i = 0; i < args.length; i++) {
282
- const arg = args[i];
283
- if (arg.startsWith('--') && i + 1 < args.length) {
284
- const key = arg.slice(2);
285
- result[key] = args[++i];
286
- }
287
- }
288
- return result;
289
- }
290
- const cliArgs = parseCliArgs();
291
- // ===== Export =====
292
- export function execViaLoginShell(cmd, args) {
293
- if (IS_WIN32) {
294
- // On Windows, resolve via where.exe and spawn directly
295
- const resolved = resolveViaWhere(cmd);
296
- return { command: resolved ?? cmd, args };
297
- }
298
- const shell = getLoginShellCandidates()[0] ?? '/bin/zsh';
299
- return {
300
- command: shell,
301
- args: ['-lc', `command -v ${cmd} >/dev/null 2>&1 && exec ${cmd} "$@"`, '--', ...args],
302
- };
303
- }
304
- export const config = {
305
- port: Number(process.env.VIBE_PORT) || 9876,
306
- legacyToken: process.env.VIBE_TOKEN || '',
307
- canonicalHost: cliArgs['host'] || process.env.VIBELET_CANONICAL_HOST || process.env.VIBELET_HOST || '',
308
- fallbackHosts: cliArgs['fallback-hosts'] || process.env.VIBELET_FALLBACK_HOSTS || '',
309
- /** Public relay URL (e.g. https://abc.trycloudflare.com). Overrides host/port in QR pairing payload. */
310
- relayUrl: process.env.VIBELET_RELAY_URL || '',
311
- /** Idle timeout in ms before a driver is automatically released. Default: 30 minutes. 0 = disabled. */
312
- idleTimeoutMs: getNonNegativeNumberEnv('VIBE_IDLE_TIMEOUT_MS', 30 * 60 * 1000),
313
- /** Maximum inactivity in ms for an in-flight turn before it is failed and the driver is stopped. 0 = disabled. */
314
- turnStallTimeoutMs: getNonNegativeNumberEnv('VIBE_TURN_STALL_TIMEOUT_MS', 5 * 60 * 1000),
315
- /** Maximum size for ~/.vibelet/data/audit.jsonl before it is trimmed in place. */
316
- auditMaxBytes: getPositiveNumberEnv('VIBE_AUDIT_MAX_BYTES', 8 * 1024 * 1024),
317
- /** Maximum size for each ~/.vibelet/logs/daemon.*.log file before it is trimmed in place. */
318
- daemonLogMaxBytes: getPositiveNumberEnv('VIBE_DAEMON_LOG_MAX_BYTES', 16 * 1024 * 1024),
319
- /** How often the daemon trims its own stdout/stderr logs. */
320
- storageHousekeepingIntervalMs: getPositiveNumberEnv('VIBE_STORAGE_HOUSEKEEPING_INTERVAL_MS', 5 * 60 * 1000),
321
- get claudePath() { return resolveClaude(); },
322
- get codexPath() { return resolveCodex(); },
323
- isTransientPath,
324
- execViaLoginShell,
325
- buildSanitizedEnv,
326
- };
327
- //# sourceMappingURL=config.js.map