ttyd-mux 0.3.1 → 0.4.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 (188) hide show
  1. package/README.md +52 -1
  2. package/dist/caddy/client.d.ts +3 -78
  3. package/dist/caddy/client.d.ts.map +1 -1
  4. package/dist/caddy/client.js +0 -170
  5. package/dist/caddy/client.js.map +1 -1
  6. package/dist/caddy/route-builder.d.ts +49 -0
  7. package/dist/caddy/route-builder.d.ts.map +1 -0
  8. package/dist/caddy/route-builder.js +175 -0
  9. package/dist/caddy/route-builder.js.map +1 -0
  10. package/dist/caddy/types.d.ts +27 -0
  11. package/dist/caddy/types.d.ts.map +1 -0
  12. package/dist/caddy/types.js +3 -0
  13. package/dist/caddy/types.js.map +1 -0
  14. package/dist/client/api-client.d.ts +26 -0
  15. package/dist/client/api-client.d.ts.map +1 -0
  16. package/dist/client/api-client.js +62 -0
  17. package/dist/client/api-client.js.map +1 -0
  18. package/dist/client/daemon-client.d.ts +48 -0
  19. package/dist/client/daemon-client.d.ts.map +1 -0
  20. package/dist/client/daemon-client.js +205 -0
  21. package/dist/client/daemon-client.js.map +1 -0
  22. package/dist/client/index.d.ts +2 -10
  23. package/dist/client/index.d.ts.map +1 -1
  24. package/dist/client/index.js +4 -149
  25. package/dist/client/index.js.map +1 -1
  26. package/dist/commands/attach.js +3 -4
  27. package/dist/commands/attach.js.map +1 -1
  28. package/dist/commands/caddy.d.ts.map +1 -1
  29. package/dist/commands/caddy.js +73 -108
  30. package/dist/commands/caddy.js.map +1 -1
  31. package/dist/commands/daemon.js.map +1 -1
  32. package/dist/commands/deploy.d.ts.map +1 -1
  33. package/dist/commands/deploy.js +3 -8
  34. package/dist/commands/deploy.js.map +1 -1
  35. package/dist/commands/doctor.d.ts +8 -0
  36. package/dist/commands/doctor.d.ts.map +1 -0
  37. package/dist/commands/doctor.js +180 -0
  38. package/dist/commands/doctor.js.map +1 -0
  39. package/dist/commands/down.d.ts.map +1 -1
  40. package/dist/commands/down.js +11 -0
  41. package/dist/commands/down.js.map +1 -1
  42. package/dist/commands/reload.d.ts +14 -0
  43. package/dist/commands/reload.d.ts.map +1 -0
  44. package/dist/commands/reload.js +50 -0
  45. package/dist/commands/reload.js.map +1 -0
  46. package/dist/commands/shutdown.d.ts +2 -1
  47. package/dist/commands/shutdown.d.ts.map +1 -1
  48. package/dist/commands/shutdown.js +8 -2
  49. package/dist/commands/shutdown.js.map +1 -1
  50. package/dist/commands/start.d.ts.map +1 -1
  51. package/dist/commands/start.js +16 -3
  52. package/dist/commands/start.js.map +1 -1
  53. package/dist/commands/status.js.map +1 -1
  54. package/dist/commands/stop.js.map +1 -1
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/config/config.d.ts.map +1 -1
  57. package/dist/config/config.js +9 -2
  58. package/dist/config/config.js.map +1 -1
  59. package/dist/config/index.d.ts +3 -3
  60. package/dist/config/index.d.ts.map +1 -1
  61. package/dist/config/index.js +6 -3
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/config/state-store.d.ts +27 -0
  64. package/dist/config/state-store.d.ts.map +1 -0
  65. package/dist/config/state-store.js +55 -0
  66. package/dist/config/state-store.js.map +1 -0
  67. package/dist/config/state.d.ts +6 -0
  68. package/dist/config/state.d.ts.map +1 -1
  69. package/dist/config/state.js +49 -14
  70. package/dist/config/state.js.map +1 -1
  71. package/dist/config/types.d.ts +29 -0
  72. package/dist/config/types.d.ts.map +1 -1
  73. package/dist/config/types.js +20 -1
  74. package/dist/config/types.js.map +1 -1
  75. package/dist/daemon/api-handler.d.ts +5 -0
  76. package/dist/daemon/api-handler.d.ts.map +1 -0
  77. package/dist/daemon/api-handler.js +97 -0
  78. package/dist/daemon/api-handler.js.map +1 -0
  79. package/dist/daemon/config-manager.d.ts +43 -0
  80. package/dist/daemon/config-manager.d.ts.map +1 -0
  81. package/dist/daemon/config-manager.js +154 -0
  82. package/dist/daemon/config-manager.js.map +1 -0
  83. package/dist/daemon/http-proxy.d.ts +27 -0
  84. package/dist/daemon/http-proxy.d.ts.map +1 -0
  85. package/dist/daemon/http-proxy.js +110 -0
  86. package/dist/daemon/http-proxy.js.map +1 -0
  87. package/dist/daemon/ime-helper.d.ts +1 -1
  88. package/dist/daemon/ime-helper.d.ts.map +1 -1
  89. package/dist/daemon/ime-helper.js +24 -53
  90. package/dist/daemon/ime-helper.js.map +1 -1
  91. package/dist/daemon/index.d.ts.map +1 -1
  92. package/dist/daemon/index.js +134 -29
  93. package/dist/daemon/index.js.map +1 -1
  94. package/dist/daemon/portal-utils.d.ts +20 -0
  95. package/dist/daemon/portal-utils.d.ts.map +1 -0
  96. package/dist/daemon/portal-utils.js +109 -0
  97. package/dist/daemon/portal-utils.js.map +1 -0
  98. package/dist/daemon/portal.d.ts.map +1 -1
  99. package/dist/daemon/portal.js +20 -77
  100. package/dist/daemon/portal.js.map +1 -1
  101. package/dist/daemon/pwa.d.ts +52 -0
  102. package/dist/daemon/pwa.d.ts.map +1 -0
  103. package/dist/daemon/pwa.js +229 -0
  104. package/dist/daemon/pwa.js.map +1 -0
  105. package/dist/daemon/router.d.ts +15 -0
  106. package/dist/daemon/router.d.ts.map +1 -0
  107. package/dist/daemon/router.js +164 -0
  108. package/dist/daemon/router.js.map +1 -0
  109. package/dist/daemon/server.d.ts +15 -3
  110. package/dist/daemon/server.d.ts.map +1 -1
  111. package/dist/daemon/server.js +23 -271
  112. package/dist/daemon/server.js.map +1 -1
  113. package/dist/daemon/session-manager.d.ts +44 -10
  114. package/dist/daemon/session-manager.d.ts.map +1 -1
  115. package/dist/daemon/session-manager.js +125 -49
  116. package/dist/daemon/session-manager.js.map +1 -1
  117. package/dist/daemon/session-resolver.d.ts +1 -1
  118. package/dist/daemon/session-resolver.d.ts.map +1 -1
  119. package/dist/daemon/session-resolver.js.map +1 -1
  120. package/dist/daemon/toolbar/config.d.ts +13 -0
  121. package/dist/daemon/toolbar/config.d.ts.map +1 -0
  122. package/dist/daemon/toolbar/config.js +13 -0
  123. package/dist/daemon/toolbar/config.js.map +1 -0
  124. package/dist/daemon/toolbar/index.d.ts +43 -0
  125. package/dist/daemon/toolbar/index.d.ts.map +1 -0
  126. package/dist/daemon/toolbar/index.js +835 -0
  127. package/dist/daemon/toolbar/index.js.map +1 -0
  128. package/dist/daemon/toolbar/styles.d.ts +5 -0
  129. package/dist/daemon/toolbar/styles.d.ts.map +1 -0
  130. package/dist/daemon/toolbar/styles.js +278 -0
  131. package/dist/daemon/toolbar/styles.js.map +1 -0
  132. package/dist/daemon/toolbar/template.d.ts +6 -0
  133. package/dist/daemon/toolbar/template.d.ts.map +1 -0
  134. package/dist/daemon/toolbar/template.js +45 -0
  135. package/dist/daemon/toolbar/template.js.map +1 -0
  136. package/dist/daemon/ws-proxy.d.ts +17 -0
  137. package/dist/daemon/ws-proxy.d.ts.map +1 -0
  138. package/dist/daemon/ws-proxy.js +95 -0
  139. package/dist/daemon/ws-proxy.js.map +1 -0
  140. package/dist/deploy/caddyfile.d.ts.map +1 -1
  141. package/dist/deploy/caddyfile.js.map +1 -1
  142. package/dist/deploy/deploy-script.d.ts.map +1 -1
  143. package/dist/deploy/static-portal.d.ts.map +1 -1
  144. package/dist/deploy/static-portal.js +6 -77
  145. package/dist/deploy/static-portal.js.map +1 -1
  146. package/dist/index.js +16 -3
  147. package/dist/index.js.map +1 -1
  148. package/dist/test-setup.d.ts +19 -0
  149. package/dist/test-setup.d.ts.map +1 -0
  150. package/dist/test-setup.js +33 -0
  151. package/dist/test-setup.js.map +1 -0
  152. package/dist/tmux.d.ts +28 -1
  153. package/dist/tmux.d.ts.map +1 -1
  154. package/dist/tmux.js +37 -32
  155. package/dist/tmux.js.map +1 -1
  156. package/dist/ui.d.ts +2 -1
  157. package/dist/ui.d.ts.map +1 -1
  158. package/dist/ui.js +16 -9
  159. package/dist/ui.js.map +1 -1
  160. package/dist/utils/errors.d.ts +4 -0
  161. package/dist/utils/errors.d.ts.map +1 -1
  162. package/dist/utils/errors.js +9 -1
  163. package/dist/utils/errors.js.map +1 -1
  164. package/dist/utils/logger.d.ts +14 -0
  165. package/dist/utils/logger.d.ts.map +1 -0
  166. package/dist/utils/logger.js +53 -0
  167. package/dist/utils/logger.js.map +1 -0
  168. package/dist/utils/process-runner.d.ts +50 -0
  169. package/dist/utils/process-runner.d.ts.map +1 -0
  170. package/dist/utils/process-runner.js +73 -0
  171. package/dist/utils/process-runner.js.map +1 -0
  172. package/dist/utils/socket-client.d.ts +24 -0
  173. package/dist/utils/socket-client.d.ts.map +1 -0
  174. package/dist/utils/socket-client.js +30 -0
  175. package/dist/utils/socket-client.js.map +1 -0
  176. package/dist/utils/tmux-client.d.ts +57 -0
  177. package/dist/utils/tmux-client.d.ts.map +1 -0
  178. package/dist/utils/tmux-client.js +117 -0
  179. package/dist/utils/tmux-client.js.map +1 -0
  180. package/dist/version.d.ts +3 -0
  181. package/dist/version.d.ts.map +1 -0
  182. package/dist/version.js +4 -0
  183. package/dist/version.js.map +1 -0
  184. package/package.json +6 -2
  185. package/dist/daemon/proxy.d.ts +0 -7
  186. package/dist/daemon/proxy.d.ts.map +0 -1
  187. package/dist/daemon/proxy.js +0 -17
  188. package/dist/daemon/proxy.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,20 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { program } from 'commander';
3
- import pkg from '../package.json' with { type: 'json' };
4
3
  import { attachCommand } from './commands/attach.js';
5
4
  import { caddyRemoveCommand, caddySetupCommand, caddySnippetCommand, caddyStatusCommand, caddySyncCommand } from './commands/caddy.js';
6
5
  import { daemonCommand } from './commands/daemon.js';
7
6
  import { deployCommand } from './commands/deploy.js';
7
+ import { doctorCommand } from './commands/doctor.js';
8
8
  import { downCommand } from './commands/down.js';
9
+ import { reloadCommand } from './commands/reload.js';
9
10
  import { shutdownCommand } from './commands/shutdown.js';
10
11
  import { startCommand } from './commands/start.js';
11
12
  import { statusCommand } from './commands/status.js';
12
13
  import { stopCommand } from './commands/stop.js';
13
14
  import { upCommand } from './commands/up.js';
15
+ import { NAME, VERSION } from './version.js';
14
16
  program
15
- .name('ttyd-mux')
17
+ .name(NAME)
16
18
  .description('ttyd session multiplexer - manage multiple ttyd+tmux sessions')
17
- .version(pkg.version);
19
+ .version(VERSION);
18
20
  // === Main commands ===
19
21
  program
20
22
  .command('up')
@@ -64,7 +66,18 @@ program
64
66
  .command('shutdown')
65
67
  .description('Stop the daemon')
66
68
  .option('-c, --config <path>', 'Config file path')
69
+ .option('-s, --stop-sessions', 'Stop all sessions before shutting down')
67
70
  .action((options) => shutdownCommand(options));
71
+ program
72
+ .command('reload')
73
+ .description('Reload daemon configuration without restart')
74
+ .option('-c, --config <path>', 'Config file path')
75
+ .action((options) => reloadCommand(options));
76
+ program
77
+ .command('doctor')
78
+ .description('Check dependencies and configuration')
79
+ .option('-c, --config <path>', 'Config file path')
80
+ .action((options) => doctorCommand(options));
68
81
  // === Deployment (static mode) ===
69
82
  program
70
83
  .command('deploy')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,wBAAwB;AAExB,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC;KAC/D,MAAM,CAAC,cAAc,EAAE,mDAAmD,CAAC;KAC3E,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAE3C,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7C,6BAA6B;AAE7B,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1D,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;KACxC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzD,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/C,wBAAwB;AAExB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,yBAAyB;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/C,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AAEjD,mCAAmC;AAEnC,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;KAC1E,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/C,4BAA4B;AAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC;AAEtF,KAAK;KACF,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAErD,KAAK;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;KAC1E,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;AAEnD,KAAK;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;KAC1E,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpD,KAAK;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;KAC1E,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AAElD,KAAK;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpD,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Test setup - sets environment variables before any modules are loaded
3
+ * This file is imported first by test files to ensure proper test isolation
4
+ */
5
+ export declare const TEST_STATE_DIR: string;
6
+ export declare const TEST_CONFIG_DIR: string;
7
+ /**
8
+ * Reset test state directory - call in beforeEach
9
+ * This ensures each test starts with a clean state directory.
10
+ */
11
+ export declare function resetTestState(): void;
12
+ /**
13
+ * Cleanup test state directory - call in afterAll
14
+ * This removes the test directory after all tests in the suite complete.
15
+ * Note: beforeEach already handles cleanup before each test, so this is
16
+ * only needed for final cleanup after the test suite.
17
+ */
18
+ export declare function cleanupTestState(): void;
19
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAGlE,eAAO,MAAM,eAAe,QAA6C,CAAC;AAK1E;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Test setup - sets environment variables before any modules are loaded
3
+ * This file is imported first by test files to ensure proper test isolation
4
+ */
5
+ import { existsSync, mkdirSync, rmSync } from 'node:fs';
6
+ // Use a shared test state directory for all tests
7
+ export const TEST_STATE_DIR = `/tmp/ttyd-mux-test-${process.pid}`;
8
+ // Use a shared test config directory for config tests
9
+ export const TEST_CONFIG_DIR = `/tmp/ttyd-mux-test-config-${process.pid}`;
10
+ // Set test state directory immediately when this module is loaded
11
+ process.env['TTYD_MUX_STATE_DIR'] = TEST_STATE_DIR;
12
+ /**
13
+ * Reset test state directory - call in beforeEach
14
+ * This ensures each test starts with a clean state directory.
15
+ */
16
+ export function resetTestState() {
17
+ if (existsSync(TEST_STATE_DIR)) {
18
+ rmSync(TEST_STATE_DIR, { recursive: true });
19
+ }
20
+ mkdirSync(TEST_STATE_DIR, { recursive: true });
21
+ }
22
+ /**
23
+ * Cleanup test state directory - call in afterAll
24
+ * This removes the test directory after all tests in the suite complete.
25
+ * Note: beforeEach already handles cleanup before each test, so this is
26
+ * only needed for final cleanup after the test suite.
27
+ */
28
+ export function cleanupTestState() {
29
+ if (existsSync(TEST_STATE_DIR)) {
30
+ rmSync(TEST_STATE_DIR, { recursive: true });
31
+ }
32
+ }
33
+ //# sourceMappingURL=test-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExD,kDAAkD;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC;AAElE,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,6BAA6B,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1E,kEAAkE;AAClE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
package/dist/tmux.d.ts CHANGED
@@ -1,8 +1,35 @@
1
- import type { TmuxSession } from './types.js';
1
+ import { type TmuxSession } from './utils/tmux-client.js';
2
+ export type { TmuxSession };
3
+ /**
4
+ * Check if currently inside a tmux session
5
+ */
2
6
  export declare function isInsideTmux(): boolean;
7
+ /**
8
+ * Check if tmux is installed
9
+ */
3
10
  export declare function isTmuxInstalled(): boolean;
11
+ /**
12
+ * List all tmux sessions
13
+ */
4
14
  export declare function listSessions(): TmuxSession[];
15
+ /**
16
+ * Check if a session exists
17
+ */
18
+ export declare function sessionExists(sessionName: string): boolean;
19
+ /**
20
+ * Ensure a session exists, creating it if necessary
21
+ */
22
+ export declare function ensureSession(sessionName: string, cwd?: string): void;
23
+ /**
24
+ * Attach to a tmux session (interactive, spawns child process)
25
+ */
5
26
  export declare function attachSession(sessionName: string): Promise<number>;
27
+ /**
28
+ * Get session name from current working directory
29
+ */
6
30
  export declare function getCwdSessionName(): string;
31
+ /**
32
+ * Create or attach to a session named after current directory (interactive)
33
+ */
7
34
  export declare function createSessionFromCwd(): Promise<number>;
8
35
  //# sourceMappingURL=tmux.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAQzC;AAcD,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAY5C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYtD"}
1
+ {"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,wBAAwB,CAAC;AAG7E,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,WAAW,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAelE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYtD"}
package/dist/tmux.js CHANGED
@@ -1,44 +1,43 @@
1
- import { execSync, spawn } from 'node:child_process';
1
+ import { spawn } from 'node:child_process';
2
2
  import { basename } from 'node:path';
3
+ import { defaultTmuxClient } from './utils/tmux-client.js';
4
+ /**
5
+ * Check if currently inside a tmux session
6
+ */
3
7
  export function isInsideTmux() {
4
- return !!process.env['TMUX'];
8
+ return defaultTmuxClient.isInsideTmux();
5
9
  }
10
+ /**
11
+ * Check if tmux is installed
12
+ */
6
13
  export function isTmuxInstalled() {
7
- try {
8
- execSync('which tmux', { stdio: 'ignore' });
9
- return true;
10
- }
11
- catch {
12
- // Expected: tmux is not installed
13
- return false;
14
- }
15
- }
16
- const SESSION_FORMAT = '#{session_name}|#{session_windows}|#{session_created}|#{session_attached}';
17
- function parseSessionLine(line) {
18
- const [name = '', windows = '0', created = '0', attached] = line.split('|');
19
- return {
20
- name,
21
- windows: Number.parseInt(windows, 10),
22
- created: new Date(Number.parseInt(created, 10) * 1000),
23
- attached: attached === '1'
24
- };
14
+ return defaultTmuxClient.isInstalled();
25
15
  }
16
+ /**
17
+ * List all tmux sessions
18
+ */
26
19
  export function listSessions() {
27
- try {
28
- const output = execSync(`tmux list-sessions -F "${SESSION_FORMAT}"`, { encoding: 'utf-8' });
29
- return output
30
- .trim()
31
- .split('\n')
32
- .filter((line) => line.length > 0)
33
- .map(parseSessionLine);
34
- }
35
- catch {
36
- // Expected: no tmux server running or no sessions
37
- return [];
38
- }
20
+ return defaultTmuxClient.listSessions();
21
+ }
22
+ /**
23
+ * Check if a session exists
24
+ */
25
+ export function sessionExists(sessionName) {
26
+ return defaultTmuxClient.sessionExists(sessionName);
27
+ }
28
+ /**
29
+ * Ensure a session exists, creating it if necessary
30
+ */
31
+ export function ensureSession(sessionName, cwd) {
32
+ defaultTmuxClient.ensureSession(sessionName, cwd);
39
33
  }
34
+ /**
35
+ * Attach to a tmux session (interactive, spawns child process)
36
+ */
40
37
  export function attachSession(sessionName) {
41
38
  return new Promise((resolve) => {
39
+ // Ensure session exists before attaching
40
+ ensureSession(sessionName);
42
41
  const command = isInsideTmux() ? 'switch-client' : 'attach-session';
43
42
  const tmux = spawn('tmux', [command, '-t', sessionName], {
44
43
  stdio: 'inherit'
@@ -48,9 +47,15 @@ export function attachSession(sessionName) {
48
47
  });
49
48
  });
50
49
  }
50
+ /**
51
+ * Get session name from current working directory
52
+ */
51
53
  export function getCwdSessionName() {
52
54
  return basename(process.cwd());
53
55
  }
56
+ /**
57
+ * Create or attach to a session named after current directory (interactive)
58
+ */
54
59
  export function createSessionFromCwd() {
55
60
  return new Promise((resolve) => {
56
61
  const sessionName = getCwdSessionName();
package/dist/tmux.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAoB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK7E;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,iBAAiB,CAAC,YAAY,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,iBAAiB,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,iBAAiB,CAAC,YAAY,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,iBAAiB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,GAAY;IAC7D,iBAAiB,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,yCAAyC;QACzC,aAAa,CAAC,WAAW,CAAC,CAAC;QAE3B,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAEpE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;YACvD,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;YAC3D,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/ui.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import type { TmuxSession } from './types.js';
1
+ import type { TmuxSession } from './tmux.js';
2
2
  export declare function formatDate(date: Date): string;
3
+ export declare function formatSessionLine(session: TmuxSession, index: number, isSelected: boolean): string;
3
4
  export interface SelectResult {
4
5
  action: 'attach' | 'quit';
5
6
  session?: TmuxSession;
package/dist/ui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiB9C,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AA2BD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAWrB,wBAAgB,cAAc,CAC5B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAClD,aAAa,EAAE,MAAM,GACpB,SAAS,CAgBX;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,IAAI,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAoD5E"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAiB7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GAClB,MAAM,CAYR;AAaD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAWrB,wBAAgB,cAAc,CAC5B,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,EAClD,aAAa,EAAE,MAAM,GACpB,SAAS,CAoBX;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAGhE;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,IAAI,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAyD5E"}
package/dist/ui.js CHANGED
@@ -1,4 +1,4 @@
1
- import * as readline from 'node:readline';
1
+ import { emitKeypressEvents } from 'node:readline';
2
2
  // ANSI escape codes
3
3
  const ansi = {
4
4
  clearScreen: '\x1b[2J\x1b[H',
@@ -19,7 +19,7 @@ export function formatDate(date) {
19
19
  const minutes = pad2(date.getMinutes());
20
20
  return `${month}/${day} ${hours}:${minutes}`;
21
21
  }
22
- function formatSessionLine(session, index, isSelected) {
22
+ export function formatSessionLine(session, index, isSelected) {
23
23
  const prefix = isSelected ? `${ansi.cyan}>${ansi.reset}` : ' ';
24
24
  const num = `${ansi.yellow}[${index + 1}]${ansi.reset}`;
25
25
  const name = isSelected
@@ -48,14 +48,16 @@ const keyBindings = {
48
48
  return: { type: 'select', index: -1 }
49
49
  };
50
50
  export function handleKeypress(key, sessionsCount) {
51
- if (!key?.name)
51
+ if (!key?.name) {
52
52
  return { type: 'none' };
53
+ }
53
54
  if (key.ctrl && key.name === 'c') {
54
55
  return { type: 'quit' };
55
56
  }
56
57
  const binding = keyBindings[key.name];
57
- if (binding)
58
+ if (binding) {
58
59
  return binding;
60
+ }
59
61
  const num = Number.parseInt(key.name, 10);
60
62
  if (num >= 1 && num <= 9 && num <= sessionsCount) {
61
63
  return { type: 'select', index: num - 1 };
@@ -79,7 +81,7 @@ export function selectSession(sessions) {
79
81
  let selectedIndex = findInitialIndex(sessions);
80
82
  process.stdout.write(ansi.hideCursor);
81
83
  renderSessions(sessions, selectedIndex);
82
- readline.emitKeypressEvents(process.stdin);
84
+ emitKeypressEvents(process.stdin);
83
85
  if (process.stdin.isTTY) {
84
86
  process.stdin.setRawMode(true);
85
87
  }
@@ -94,22 +96,27 @@ export function selectSession(sessions) {
94
96
  };
95
97
  const onKeypress = (_str, key) => {
96
98
  const action = handleKeypress(key, sessions.length);
99
+ // biome-ignore lint/style/useDefaultSwitchClause: KeyAction union is exhaustively matched
97
100
  switch (action.type) {
98
- case 'quit':
101
+ case 'quit': {
99
102
  cleanupAndResolve({ action: 'quit' });
100
103
  break;
101
- case 'move':
104
+ }
105
+ case 'move': {
102
106
  selectedIndex = calculateNewIndex(selectedIndex, action.direction, sessions.length - 1);
103
107
  renderSessions(sessions, selectedIndex);
104
108
  break;
105
- case 'select':
109
+ }
110
+ case 'select': {
106
111
  cleanupAndResolve({
107
112
  action: 'attach',
108
113
  session: sessions[action.index === -1 ? selectedIndex : action.index]
109
114
  });
110
115
  break;
111
- case 'none':
116
+ }
117
+ case 'none': {
112
118
  break;
119
+ }
113
120
  }
114
121
  };
115
122
  process.stdin.on('keypress', onKeypress);
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG7D,oBAAoB;AACpB,MAAM,IAAI,GAAG;IACX,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,WAAW;IACvB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,UAAU;CACT,CAAC;AAEX,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAE/D,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACxC,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAoB,EACpB,KAAa,EACb,UAAmB;IAEnB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;QACxD,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,OAAO,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,QAAuB,EAAE,aAAqB;IACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,yDAAyD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAClG,CAAC;AAaD,MAAM,WAAW,GAA8B;IAC7C,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACnB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACrC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACpC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;IACzC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;IACtC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE;CACtC,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,GAAkD,EAClD,aAAqB;IAErB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,SAAwB,EACxB,QAAgB;IAEhB,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAuB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAExC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,iBAAiB,GAAG,CAAC,MAAoB,EAAQ,EAAE;YACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,GAAQ,EAAQ,EAAE;YAClD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEpD,0FAA0F;YAC1F,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBACtC,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,aAAa,GAAG,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACxF,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;oBACxC,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,iBAAiB,CAAC;wBAChB,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBACtE,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -22,4 +22,8 @@ export declare function handleCliError(prefix: string, error: unknown): void;
22
22
  * Wrap a function with error handling
23
23
  */
24
24
  export declare function withErrorHandling<T>(fn: () => Promise<T>, errorPrefix: string): Promise<T | null>;
25
+ /**
26
+ * Assert that hostname is provided, exit if not
27
+ */
28
+ export declare function requireHostname(hostname: string | undefined): asserts hostname is string;
25
29
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAM3D,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ;CAGtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAErE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAM3D,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ;CAGtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAErE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAKxF"}
@@ -34,7 +34,6 @@ export function formatCliError(prefix, error) {
34
34
  * Handle CLI command errors consistently
35
35
  */
36
36
  export function handleCliError(prefix, error) {
37
- // biome-ignore lint/suspicious/noConsole: CLI error output is intentional
38
37
  console.error(formatCliError(prefix, error));
39
38
  }
40
39
  /**
@@ -49,4 +48,13 @@ export async function withErrorHandling(fn, errorPrefix) {
49
48
  return null;
50
49
  }
51
50
  }
51
+ /**
52
+ * Assert that hostname is provided, exit if not
53
+ */
54
+ export function requireHostname(hostname) {
55
+ if (!hostname) {
56
+ console.error('Error: --hostname is required (or set hostname in config.yaml)');
57
+ process.exit(1);
58
+ }
59
+ }
52
60
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAa,EAAE,KAAe;QACzD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,OAAe,EAAE,IAAa;QACxD,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAc;IAC3D,OAAO,GAAG,MAAM,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAc;IAC3D,0EAA0E;IAC1E,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAoB,EACpB,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAa,EAAE,KAAe;QACzD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,OAAe,EAAE,IAAa;QACxD,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAc;IAC3D,OAAO,GAAG,MAAM,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAc;IAC3D,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAoB,EACpB,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAA4B;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Simple logger with timestamps and log levels
3
+ */
4
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
5
+ export declare function setLogLevel(level: LogLevel): void;
6
+ export declare function getLogLevel(): LogLevel;
7
+ export declare function createLogger(component: string): {
8
+ debug(message: string, ...args: unknown[]): void;
9
+ info(message: string, ...args: unknown[]): void;
10
+ warn(message: string, ...args: unknown[]): void;
11
+ error(message: string, ...args: unknown[]): void;
12
+ };
13
+ export type Logger = ReturnType<typeof createLogger>;
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA0B3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM;mBAE3B,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;kBAMlC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;kBAMjC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;mBAMhC,MAAM,WAAW,OAAO,EAAE,GAAG,IAAI;EAMnD;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Simple logger with timestamps and log levels
3
+ */
4
+ const LOG_LEVEL_PRIORITY = {
5
+ debug: 0,
6
+ info: 1,
7
+ warn: 2,
8
+ error: 3
9
+ };
10
+ // Default log level (can be overridden by environment variable)
11
+ let currentLevel = process.env['TTYD_MUX_LOG_LEVEL'] || 'info';
12
+ function formatTimestamp() {
13
+ return new Date().toISOString();
14
+ }
15
+ function shouldLog(level) {
16
+ return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[currentLevel];
17
+ }
18
+ function formatMessage(level, component, message) {
19
+ const timestamp = formatTimestamp();
20
+ const levelUpper = level.toUpperCase().padEnd(5);
21
+ return `[${timestamp}] ${levelUpper} [${component}] ${message}`;
22
+ }
23
+ export function setLogLevel(level) {
24
+ currentLevel = level;
25
+ }
26
+ export function getLogLevel() {
27
+ return currentLevel;
28
+ }
29
+ export function createLogger(component) {
30
+ return {
31
+ debug(message, ...args) {
32
+ if (shouldLog('debug')) {
33
+ console.log(formatMessage('debug', component, message), ...args);
34
+ }
35
+ },
36
+ info(message, ...args) {
37
+ if (shouldLog('info')) {
38
+ console.log(formatMessage('info', component, message), ...args);
39
+ }
40
+ },
41
+ warn(message, ...args) {
42
+ if (shouldLog('warn')) {
43
+ console.warn(formatMessage('warn', component, message), ...args);
44
+ }
45
+ },
46
+ error(message, ...args) {
47
+ if (shouldLog('error')) {
48
+ console.error(formatMessage('error', component, message), ...args);
49
+ }
50
+ }
51
+ };
52
+ }
53
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,kBAAkB,GAA6B;IACnD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,gEAAgE;AAChE,IAAI,YAAY,GAAc,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAc,IAAI,MAAM,CAAC;AAEvF,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,SAAiB,EAAE,OAAe;IACxE,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,SAAS,KAAK,UAAU,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO;QACL,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;YACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;YACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;YACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;YACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ProcessRunner interface for abstracting process spawning
3
+ * Allows mocking in tests without actually spawning processes
4
+ */
5
+ import { type ChildProcess, type SpawnOptions, type SpawnSyncReturns } from 'node:child_process';
6
+ export interface ExecSyncOptions {
7
+ cwd?: string;
8
+ encoding?: 'utf-8' | 'utf8' | 'ascii' | 'base64' | 'hex' | 'latin1' | 'binary';
9
+ stdio?: 'pipe' | 'ignore' | 'inherit';
10
+ }
11
+ export interface SpawnSyncOptions {
12
+ cwd?: string;
13
+ stdio?: 'pipe' | 'ignore' | 'inherit';
14
+ }
15
+ export interface ProcessRunner {
16
+ /**
17
+ * Spawn a child process
18
+ */
19
+ spawn(command: string, args: string[], options?: SpawnOptions): ChildProcess;
20
+ /**
21
+ * Spawn a command synchronously with array arguments (safe from injection)
22
+ */
23
+ spawnSync(command: string, args: string[], options?: SpawnSyncOptions): SpawnSyncReturns<string>;
24
+ /**
25
+ * Execute a command synchronously
26
+ * @deprecated Use spawnSync with array arguments to prevent command injection
27
+ */
28
+ execSync(command: string, options?: ExecSyncOptions): string;
29
+ /**
30
+ * Check if a process with the given PID is running
31
+ */
32
+ isProcessRunning(pid: number): boolean;
33
+ /**
34
+ * Send a signal to a process
35
+ */
36
+ kill(pid: number, signal?: NodeJS.Signals | number): void;
37
+ /**
38
+ * Check if a port is available (not in use)
39
+ */
40
+ isPortAvailable(port: number): Promise<boolean>;
41
+ }
42
+ /**
43
+ * Default implementation using Node.js child_process
44
+ */
45
+ export declare const defaultProcessRunner: ProcessRunner;
46
+ /**
47
+ * Create a mock ProcessRunner for testing
48
+ */
49
+ export declare function createMockProcessRunner(overrides?: Partial<ProcessRunner>): ProcessRunner;
50
+ //# sourceMappingURL=process-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-runner.d.ts","sourceRoot":"","sources":["../../src/utils/process-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAItB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IAE7E;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEjG;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;IAE7D;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEvC;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IAE1D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aA8ClC,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAmBzF"}