ttyd-mux 0.3.0 → 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.
- package/README.md +105 -1
- package/dist/caddy/client.d.ts +3 -55
- package/dist/caddy/client.d.ts.map +1 -1
- package/dist/caddy/client.js +0 -73
- package/dist/caddy/client.js.map +1 -1
- package/dist/caddy/route-builder.d.ts +49 -0
- package/dist/caddy/route-builder.d.ts.map +1 -0
- package/dist/caddy/route-builder.js +175 -0
- package/dist/caddy/route-builder.js.map +1 -0
- package/dist/caddy/types.d.ts +27 -0
- package/dist/caddy/types.d.ts.map +1 -0
- package/dist/caddy/types.js +3 -0
- package/dist/caddy/types.js.map +1 -0
- package/dist/client/api-client.d.ts +26 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +62 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/daemon-client.d.ts +48 -0
- package/dist/client/daemon-client.d.ts.map +1 -0
- package/dist/client/daemon-client.js +205 -0
- package/dist/client/daemon-client.js.map +1 -0
- package/dist/client/index.d.ts +2 -10
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -136
- package/dist/client/index.js.map +1 -1
- package/dist/commands/attach.js +3 -4
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/caddy.d.ts +2 -1
- package/dist/commands/caddy.d.ts.map +1 -1
- package/dist/commands/caddy.js +227 -75
- package/dist/commands/caddy.js.map +1 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +100 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +180 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +11 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/reload.d.ts +14 -0
- package/dist/commands/reload.d.ts.map +1 -0
- package/dist/commands/reload.js +50 -0
- package/dist/commands/reload.js.map +1 -0
- package/dist/commands/shutdown.d.ts +2 -1
- package/dist/commands/shutdown.d.ts.map +1 -1
- package/dist/commands/shutdown.js +8 -2
- package/dist/commands/shutdown.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +16 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/up.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +9 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/state-store.d.ts +27 -0
- package/dist/config/state-store.d.ts.map +1 -0
- package/dist/config/state-store.js +55 -0
- package/dist/config/state-store.js.map +1 -0
- package/dist/config/state.d.ts +6 -0
- package/dist/config/state.d.ts.map +1 -1
- package/dist/config/state.js +49 -14
- package/dist/config/state.js.map +1 -1
- package/dist/config/types.d.ts +35 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +23 -1
- package/dist/config/types.js.map +1 -1
- package/dist/daemon/api-handler.d.ts +5 -0
- package/dist/daemon/api-handler.d.ts.map +1 -0
- package/dist/daemon/api-handler.js +97 -0
- package/dist/daemon/api-handler.js.map +1 -0
- package/dist/daemon/config-manager.d.ts +43 -0
- package/dist/daemon/config-manager.d.ts.map +1 -0
- package/dist/daemon/config-manager.js +154 -0
- package/dist/daemon/config-manager.js.map +1 -0
- package/dist/daemon/http-proxy.d.ts +27 -0
- package/dist/daemon/http-proxy.d.ts.map +1 -0
- package/dist/daemon/http-proxy.js +110 -0
- package/dist/daemon/http-proxy.js.map +1 -0
- package/dist/daemon/ime-helper.d.ts +1 -1
- package/dist/daemon/ime-helper.d.ts.map +1 -1
- package/dist/daemon/ime-helper.js +284 -10
- package/dist/daemon/ime-helper.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +134 -29
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/portal-utils.d.ts +20 -0
- package/dist/daemon/portal-utils.d.ts.map +1 -0
- package/dist/daemon/portal-utils.js +109 -0
- package/dist/daemon/portal-utils.js.map +1 -0
- package/dist/daemon/portal.d.ts.map +1 -1
- package/dist/daemon/portal.js +20 -77
- package/dist/daemon/portal.js.map +1 -1
- package/dist/daemon/pwa.d.ts +52 -0
- package/dist/daemon/pwa.d.ts.map +1 -0
- package/dist/daemon/pwa.js +229 -0
- package/dist/daemon/pwa.js.map +1 -0
- package/dist/daemon/router.d.ts +15 -0
- package/dist/daemon/router.d.ts.map +1 -0
- package/dist/daemon/router.js +164 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +15 -3
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +23 -271
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +44 -10
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +125 -49
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/daemon/session-resolver.d.ts +1 -1
- package/dist/daemon/session-resolver.d.ts.map +1 -1
- package/dist/daemon/session-resolver.js.map +1 -1
- package/dist/daemon/toolbar/config.d.ts +13 -0
- package/dist/daemon/toolbar/config.d.ts.map +1 -0
- package/dist/daemon/toolbar/config.js +13 -0
- package/dist/daemon/toolbar/config.js.map +1 -0
- package/dist/daemon/toolbar/index.d.ts +43 -0
- package/dist/daemon/toolbar/index.d.ts.map +1 -0
- package/dist/daemon/toolbar/index.js +835 -0
- package/dist/daemon/toolbar/index.js.map +1 -0
- package/dist/daemon/toolbar/styles.d.ts +5 -0
- package/dist/daemon/toolbar/styles.d.ts.map +1 -0
- package/dist/daemon/toolbar/styles.js +278 -0
- package/dist/daemon/toolbar/styles.js.map +1 -0
- package/dist/daemon/toolbar/template.d.ts +6 -0
- package/dist/daemon/toolbar/template.d.ts.map +1 -0
- package/dist/daemon/toolbar/template.js +45 -0
- package/dist/daemon/toolbar/template.js.map +1 -0
- package/dist/daemon/ws-proxy.d.ts +17 -0
- package/dist/daemon/ws-proxy.d.ts.map +1 -0
- package/dist/daemon/ws-proxy.js +95 -0
- package/dist/daemon/ws-proxy.js.map +1 -0
- package/dist/deploy/caddyfile.d.ts +8 -0
- package/dist/deploy/caddyfile.d.ts.map +1 -0
- package/dist/deploy/caddyfile.js +62 -0
- package/dist/deploy/caddyfile.js.map +1 -0
- package/dist/deploy/deploy-script.d.ts +8 -0
- package/dist/deploy/deploy-script.d.ts.map +1 -0
- package/dist/deploy/deploy-script.js +72 -0
- package/dist/deploy/deploy-script.js.map +1 -0
- package/dist/deploy/static-portal.d.ts +3 -0
- package/dist/deploy/static-portal.d.ts.map +1 -0
- package/dist/deploy/static-portal.js +59 -0
- package/dist/deploy/static-portal.js.map +1 -0
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/test-setup.d.ts +19 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +33 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tmux.d.ts +28 -1
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +37 -32
- package/dist/tmux.js.map +1 -1
- package/dist/ui.d.ts +2 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +16 -9
- package/dist/ui.js.map +1 -1
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +9 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process-runner.d.ts +50 -0
- package/dist/utils/process-runner.d.ts.map +1 -0
- package/dist/utils/process-runner.js +73 -0
- package/dist/utils/process-runner.js.map +1 -0
- package/dist/utils/socket-client.d.ts +24 -0
- package/dist/utils/socket-client.d.ts.map +1 -0
- package/dist/utils/socket-client.js +30 -0
- package/dist/utils/socket-client.js.map +1 -0
- package/dist/utils/tmux-client.d.ts +57 -0
- package/dist/utils/tmux-client.d.ts.map +1 -0
- package/dist/utils/tmux-client.js +117 -0
- package/dist/utils/tmux-client.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -2
- package/dist/daemon/proxy.d.ts +0 -7
- package/dist/daemon/proxy.d.ts.map +0 -1
- package/dist/daemon/proxy.js +0 -17
- package/dist/daemon/proxy.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-portal.d.ts","sourceRoot":"","sources":["../../src/deploy/static-portal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQ9D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CA2DzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getFullPath, normalizeBasePath } from '../config/config.js';
|
|
2
|
+
import { escapeHtml, generatePwaHead, generateSwRegistration, portalStyles } from '../daemon/portal-utils.js';
|
|
3
|
+
export function generateStaticPortalHtml(config, sessions) {
|
|
4
|
+
const basePath = normalizeBasePath(config.base_path);
|
|
5
|
+
const sessionItems = sessions
|
|
6
|
+
.map((session) => {
|
|
7
|
+
const fullPath = getFullPath(config, session.path);
|
|
8
|
+
return ` <li class="session">
|
|
9
|
+
<a href="${fullPath}/" target="_blank">
|
|
10
|
+
<span class="name">${escapeHtml(session.name)}</span>
|
|
11
|
+
<span class="info">:${session.port} - ${escapeHtml(session.dir)}</span>
|
|
12
|
+
</a>
|
|
13
|
+
</li>`;
|
|
14
|
+
})
|
|
15
|
+
.join('\n');
|
|
16
|
+
const noSessions = sessions.length === 0
|
|
17
|
+
? '<p class="no-sessions">No active sessions. Use <code>ttyd-mux up</code> to start one, then run <code>ttyd-mux deploy</code> again.</p>'
|
|
18
|
+
: '';
|
|
19
|
+
const generatedAt = new Date().toISOString();
|
|
20
|
+
return `<!DOCTYPE html>
|
|
21
|
+
<html lang="en">
|
|
22
|
+
<head>
|
|
23
|
+
<meta charset="UTF-8">
|
|
24
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
25
|
+
<title>ttyd-mux</title>${generatePwaHead(basePath)}
|
|
26
|
+
<style>${portalStyles}
|
|
27
|
+
.footer {
|
|
28
|
+
margin-top: 2rem;
|
|
29
|
+
text-align: center;
|
|
30
|
+
color: #555;
|
|
31
|
+
font-size: 0.8rem;
|
|
32
|
+
}
|
|
33
|
+
.mode-badge {
|
|
34
|
+
display: inline-block;
|
|
35
|
+
background: #2d4a22;
|
|
36
|
+
color: #7cb342;
|
|
37
|
+
padding: 0.2rem 0.5rem;
|
|
38
|
+
border-radius: 4px;
|
|
39
|
+
font-size: 0.75rem;
|
|
40
|
+
margin-left: 0.5rem;
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
43
|
+
</head>
|
|
44
|
+
<body>
|
|
45
|
+
<h1>ttyd-mux <span class="mode-badge">static mode</span></h1>
|
|
46
|
+
<p class="subtitle">Terminal Sessions</p>
|
|
47
|
+
<ul>
|
|
48
|
+
${sessionItems}
|
|
49
|
+
</ul>
|
|
50
|
+
${noSessions}
|
|
51
|
+
<div class="footer">
|
|
52
|
+
<p>Static portal generated at ${generatedAt}</p>
|
|
53
|
+
<p>Run <code>ttyd-mux deploy</code> to update after session changes</p>
|
|
54
|
+
</div>${generateSwRegistration(basePath)}
|
|
55
|
+
</body>
|
|
56
|
+
</html>
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=static-portal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-portal.js","sourceRoot":"","sources":["../../src/deploy/static-portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EACL,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,QAAwB;IAC/E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO;mBACM,QAAQ;+BACI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;gCACvB,OAAO,CAAC,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;;YAE7D,CAAC;IACT,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GACd,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,wIAAwI;QAC1I,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE7C,OAAO;;;;;2BAKkB,eAAe,CAAC,QAAQ,CAAC;WACzC,YAAY;;;;;;;;;;;;;;;;;;;;;;EAsBrB,YAAY;;IAEV,UAAU;;oCAEsB,WAAW;;UAErC,sBAAsB,CAAC,QAAQ,CAAC;;;CAGzC,CAAC;AACF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +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
|
-
import { caddyRemoveCommand, caddySetupCommand, caddySnippetCommand, caddyStatusCommand } from './commands/caddy.js';
|
|
4
|
+
import { caddyRemoveCommand, caddySetupCommand, caddySnippetCommand, caddyStatusCommand, caddySyncCommand } from './commands/caddy.js';
|
|
6
5
|
import { daemonCommand } from './commands/daemon.js';
|
|
6
|
+
import { deployCommand } from './commands/deploy.js';
|
|
7
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
7
8
|
import { downCommand } from './commands/down.js';
|
|
9
|
+
import { reloadCommand } from './commands/reload.js';
|
|
8
10
|
import { shutdownCommand } from './commands/shutdown.js';
|
|
9
11
|
import { startCommand } from './commands/start.js';
|
|
10
12
|
import { statusCommand } from './commands/status.js';
|
|
11
13
|
import { stopCommand } from './commands/stop.js';
|
|
12
14
|
import { upCommand } from './commands/up.js';
|
|
15
|
+
import { NAME, VERSION } from './version.js';
|
|
13
16
|
program
|
|
14
|
-
.name(
|
|
17
|
+
.name(NAME)
|
|
15
18
|
.description('ttyd session multiplexer - manage multiple ttyd+tmux sessions')
|
|
16
|
-
.version(
|
|
19
|
+
.version(VERSION);
|
|
17
20
|
// === Main commands ===
|
|
18
21
|
program
|
|
19
22
|
.command('up')
|
|
@@ -63,7 +66,26 @@ program
|
|
|
63
66
|
.command('shutdown')
|
|
64
67
|
.description('Stop the daemon')
|
|
65
68
|
.option('-c, --config <path>', 'Config file path')
|
|
69
|
+
.option('-s, --stop-sessions', 'Stop all sessions before shutting down')
|
|
66
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));
|
|
81
|
+
// === Deployment (static mode) ===
|
|
82
|
+
program
|
|
83
|
+
.command('deploy')
|
|
84
|
+
.description('Generate static files for static mode deployment')
|
|
85
|
+
.option('--hostname <hostname>', 'Server hostname (or set in config.yaml)')
|
|
86
|
+
.option('-o, --output <dir>', 'Output directory')
|
|
87
|
+
.option('-c, --config <path>', 'Config file path')
|
|
88
|
+
.action((options) => deployCommand(options));
|
|
67
89
|
// === Caddy integration ===
|
|
68
90
|
const caddy = program.command('caddy').description('Caddy reverse proxy integration');
|
|
69
91
|
caddy
|
|
@@ -74,21 +96,28 @@ caddy
|
|
|
74
96
|
caddy
|
|
75
97
|
.command('setup')
|
|
76
98
|
.description('Add ttyd-mux route via Caddy Admin API')
|
|
77
|
-
.
|
|
78
|
-
.option('--admin-api <url>', 'Caddy Admin API URL'
|
|
99
|
+
.option('--hostname <hostname>', 'Server hostname (or set in config.yaml)')
|
|
100
|
+
.option('--admin-api <url>', 'Caddy Admin API URL')
|
|
79
101
|
.option('-c, --config <path>', 'Config file path')
|
|
80
102
|
.action((options) => caddySetupCommand(options));
|
|
81
103
|
caddy
|
|
82
104
|
.command('remove')
|
|
83
105
|
.description('Remove ttyd-mux route via Caddy Admin API')
|
|
84
|
-
.
|
|
85
|
-
.option('--admin-api <url>', 'Caddy Admin API URL'
|
|
106
|
+
.option('--hostname <hostname>', 'Server hostname (or set in config.yaml)')
|
|
107
|
+
.option('--admin-api <url>', 'Caddy Admin API URL')
|
|
86
108
|
.option('-c, --config <path>', 'Config file path')
|
|
87
109
|
.action((options) => caddyRemoveCommand(options));
|
|
110
|
+
caddy
|
|
111
|
+
.command('sync')
|
|
112
|
+
.description('Sync session routes with Caddy (static mode only)')
|
|
113
|
+
.option('--hostname <hostname>', 'Server hostname (or set in config.yaml)')
|
|
114
|
+
.option('--admin-api <url>', 'Caddy Admin API URL')
|
|
115
|
+
.option('-c, --config <path>', 'Config file path')
|
|
116
|
+
.action((options) => caddySyncCommand(options));
|
|
88
117
|
caddy
|
|
89
118
|
.command('status')
|
|
90
119
|
.description('Show ttyd-mux routes in Caddy')
|
|
91
|
-
.option('--admin-api <url>', 'Caddy Admin API URL'
|
|
120
|
+
.option('--admin-api <url>', 'Caddy Admin API URL')
|
|
92
121
|
.option('-c, --config <path>', 'Config file path')
|
|
93
122
|
.action((options) => caddyStatusCommand(options));
|
|
94
123
|
// Parse arguments
|
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,
|
|
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
|
|
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
|
package/dist/tmux.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
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 {
|
|
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
|
|
8
|
+
return defaultTmuxClient.isInsideTmux();
|
|
5
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if tmux is installed
|
|
12
|
+
*/
|
|
6
13
|
export function isTmuxInstalled() {
|
|
7
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
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 './
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
104
|
+
}
|
|
105
|
+
case 'move': {
|
|
102
106
|
selectedIndex = calculateNewIndex(selectedIndex, action.direction, sessions.length - 1);
|
|
103
107
|
renderSessions(sessions, selectedIndex);
|
|
104
108
|
break;
|
|
105
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -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
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -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,
|
|
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
|