tmuxes 0.1.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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/bin/tmuxes.js +40 -0
  4. package/dist/config.js +31 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/exe.js +37 -0
  7. package/dist/exe.js.map +1 -0
  8. package/dist/exec.js +43 -0
  9. package/dist/exec.js.map +1 -0
  10. package/dist/files.js +250 -0
  11. package/dist/files.js.map +1 -0
  12. package/dist/foldersStore.js +101 -0
  13. package/dist/foldersStore.js.map +1 -0
  14. package/dist/index.js +73 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/logger.js +16 -0
  17. package/dist/logger.js.map +1 -0
  18. package/dist/openBrowser.js +31 -0
  19. package/dist/openBrowser.js.map +1 -0
  20. package/dist/platform.js +5 -0
  21. package/dist/platform.js.map +1 -0
  22. package/dist/rest/router.js +178 -0
  23. package/dist/rest/router.js.map +1 -0
  24. package/dist/targets.js +131 -0
  25. package/dist/targets.js.map +1 -0
  26. package/dist/tmux/builder.js +128 -0
  27. package/dist/tmux/builder.js.map +1 -0
  28. package/dist/tmux/formats.js +55 -0
  29. package/dist/tmux/formats.js.map +1 -0
  30. package/dist/tmux/sessions.js +99 -0
  31. package/dist/tmux/sessions.js.map +1 -0
  32. package/dist/validate.js +65 -0
  33. package/dist/validate.js.map +1 -0
  34. package/dist/winshell/manager.js +258 -0
  35. package/dist/winshell/manager.js.map +1 -0
  36. package/dist/ws/protocol.js +4 -0
  37. package/dist/ws/protocol.js.map +1 -0
  38. package/dist/ws/sshState.js +35 -0
  39. package/dist/ws/sshState.js.map +1 -0
  40. package/dist/ws/terminalSession.js +204 -0
  41. package/dist/ws/terminalSession.js.map +1 -0
  42. package/dist/ws/wsServer.js +151 -0
  43. package/dist/ws/wsServer.js.map +1 -0
  44. package/dist/wsl.js +35 -0
  45. package/dist/wsl.js.map +1 -0
  46. package/package.json +61 -0
  47. package/public/assets/index-CfimUdwq.js +44 -0
  48. package/public/assets/index-DeKxLCiY.css +1 -0
  49. package/public/index.html +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { promises as fsp } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, dirname } from 'node:path';
4
+ import { runCommand } from './exec.js';
5
+ import { config } from './config.js';
6
+ import { sshQuote } from './tmux/builder.js';
7
+ import { sshDestination } from './targets.js';
8
+ import { TmuxError } from './tmux/sessions.js';
9
+ /**
10
+ * Sidebar folder organization, stored ON THE TARGET so it follows the cluster:
11
+ * every client connecting to the same target reads/writes the same file, so the
12
+ * folder tree syncs across browsers and machines (like the tmux sessions do).
13
+ *
14
+ * Path: $HOME/.config/tmuxes/folders.json on the target.
15
+ * - local / winlocal → the server's own filesystem (fs).
16
+ * - ssh → the remote $HOME (ssh runs commands from $HOME).
17
+ * - wsl → the distro's $HOME (`wsl --cd ~`).
18
+ */
19
+ const REL = '.config/tmuxes/folders.json';
20
+ const REMOTE_TIMEOUT_MS = 15_000;
21
+ const MAX_BYTES = 500_000;
22
+ const EMPTY = { folders: [], assign: {} };
23
+ function localPath() {
24
+ return join(homedir(), '.config', 'tmuxes', 'folders.json');
25
+ }
26
+ function remoteArgv(t, script) {
27
+ if (t.kind === 'wsl') {
28
+ // --cd ~ → run from the distro home; sh -c handles the redirections.
29
+ return { file: 'wsl.exe', args: ['-d', t.distro ?? '', '--cd', '~', '--exec', 'sh', '-c', script] };
30
+ }
31
+ // ssh: wrap in `sh -c '<script>'` so it works regardless of the remote login
32
+ // shell, and runs from the default cwd ($HOME).
33
+ return {
34
+ file: 'ssh',
35
+ args: [
36
+ '-o',
37
+ 'BatchMode=yes',
38
+ '-o',
39
+ `ConnectTimeout=${config.ssh.connectTimeoutMgmt}`,
40
+ ...(t.port ? ['-p', String(t.port)] : []),
41
+ sshDestination(t),
42
+ 'sh',
43
+ '-c',
44
+ sshQuote(script),
45
+ ],
46
+ };
47
+ }
48
+ async function readRaw(t) {
49
+ if (t.kind === 'local' || t.kind === 'winlocal') {
50
+ try {
51
+ return await fsp.readFile(localPath(), 'utf8');
52
+ }
53
+ catch (e) {
54
+ if (e.code === 'ENOENT')
55
+ return '';
56
+ throw new TmuxError(502, 'cannot read folders');
57
+ }
58
+ }
59
+ // `2>/dev/null` so a missing file produces empty stdout + no stderr; a real
60
+ // transport failure (ssh down) prints to stderr → surfaced as 502.
61
+ const { file, args } = remoteArgv(t, `cat ${REL} 2>/dev/null`);
62
+ const r = await runCommand(file, args, { timeoutMs: REMOTE_TIMEOUT_MS });
63
+ if (r.code === 0)
64
+ return r.stdout;
65
+ if (r.stderr.trim())
66
+ throw new TmuxError(502, r.stderr.trim().split('\n')[0]);
67
+ return ''; // missing file
68
+ }
69
+ async function writeRaw(t, raw) {
70
+ if (t.kind === 'local' || t.kind === 'winlocal') {
71
+ await fsp.mkdir(dirname(localPath()), { recursive: true });
72
+ await fsp.writeFile(localPath(), raw, 'utf8');
73
+ return;
74
+ }
75
+ const { file, args } = remoteArgv(t, `mkdir -p .config/tmuxes && cat > ${REL}`);
76
+ const r = await runCommand(file, args, { timeoutMs: REMOTE_TIMEOUT_MS, input: raw });
77
+ if (r.code !== 0)
78
+ throw new TmuxError(502, r.stderr.trim().split('\n')[0] || 'cannot write folders');
79
+ }
80
+ export async function readFolders(t) {
81
+ const raw = await readRaw(t);
82
+ if (!raw.trim())
83
+ return EMPTY;
84
+ try {
85
+ const o = JSON.parse(raw);
86
+ if (o && Array.isArray(o.folders) && o.assign && typeof o.assign === 'object') {
87
+ return { folders: o.folders, assign: o.assign };
88
+ }
89
+ }
90
+ catch {
91
+ /* corrupt file → treat as empty */
92
+ }
93
+ return EMPTY;
94
+ }
95
+ export async function writeFolders(t, payload) {
96
+ const raw = JSON.stringify({ folders: payload.folders, assign: payload.assign });
97
+ if (Buffer.byteLength(raw, 'utf8') > MAX_BYTES)
98
+ throw new TmuxError(413, 'folders payload too large');
99
+ await writeRaw(t, raw);
100
+ }
101
+ //# sourceMappingURL=foldersStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foldersStore.js","sourceRoot":"","sources":["../src/foldersStore.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,73 @@
1
+ import express from 'express';
2
+ import { createServer } from 'node:http';
3
+ import { existsSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { dirname, join } from 'node:path';
6
+ import { config } from './config.js';
7
+ import { log } from './logger.js';
8
+ import { apiRouter } from './rest/router.js';
9
+ import { attachWebSocket } from './ws/wsServer.js';
10
+ import { disposeAll } from './ws/terminalSession.js';
11
+ import { refreshTargets } from './targets.js';
12
+ import { winShell } from './winshell/manager.js';
13
+ import { openBrowser } from './openBrowser.js';
14
+ const app = express();
15
+ app.use(express.json({ limit: '5mb' }));
16
+ app.use('/api', apiRouter);
17
+ // Serve the built client. Published npm package bundles it at <pkg>/public;
18
+ // in the dev monorepo it lives at server/../../client/dist.
19
+ const here = dirname(fileURLToPath(import.meta.url));
20
+ const clientDist = [join(here, '..', 'public'), join(here, '..', '..', 'client', 'dist')].find(existsSync);
21
+ if (clientDist) {
22
+ app.use(express.static(clientDist));
23
+ // SPA fallback for non-API GET routes (avoids path-to-regexp '*' quirks in Express 5).
24
+ app.use((req, res, next) => {
25
+ if (req.method !== 'GET' || req.path.startsWith('/api'))
26
+ return next();
27
+ res.sendFile(join(clientDist, 'index.html'));
28
+ });
29
+ log.info(`serving client from ${clientDist}`);
30
+ }
31
+ const server = createServer(app);
32
+ attachWebSocket(server);
33
+ server.listen(config.port, config.host, () => {
34
+ const url = `http://${config.host}:${config.port}`;
35
+ log.info(`tmuxes listening on ${url}`);
36
+ // Warm the target cache (discovers WSL distros on Windows) ahead of any WS.
37
+ void refreshTargets().catch((e) => log.warn(`initial target discovery failed: ${e}`));
38
+ // One-click launchers set TMUXES_OPEN=1 to pop the browser open.
39
+ if (process.env.TMUXES_OPEN)
40
+ openBrowser(url);
41
+ });
42
+ let shuttingDown = false;
43
+ function shutdown(signal) {
44
+ if (shuttingDown)
45
+ return;
46
+ shuttingDown = true;
47
+ log.info(`received ${signal}, shutting down`);
48
+ disposeAll();
49
+ winShell.disposeAll();
50
+ server.close(() => process.exit(0));
51
+ // Don't wait forever for lingering sockets.
52
+ setTimeout(() => process.exit(0), 3000).unref();
53
+ }
54
+ process.on('SIGINT', () => shutdown('SIGINT'));
55
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
56
+ // Console window closed (Windows) / terminal hangup (POSIX) → free the port.
57
+ process.on('SIGHUP', () => shutdown('SIGHUP'));
58
+ // Windows Ctrl+Break.
59
+ if (process.platform === 'win32')
60
+ process.on('SIGBREAK', () => shutdown('SIGBREAK'));
61
+ // If the port is already held (e.g. a previous run is still alive), exit with a
62
+ // clear message instead of an unhandled-error stack trace.
63
+ server.on('error', (err) => {
64
+ if (err.code === 'EADDRINUSE') {
65
+ log.error(`port ${config.port} is already in use — another tmuxes instance is still running. ` +
66
+ `Close it (or its window), then start again.`);
67
+ }
68
+ else {
69
+ log.error(`server error: ${err.message}`);
70
+ }
71
+ process.exit(1);
72
+ });
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/logger.js ADDED
@@ -0,0 +1,16 @@
1
+ /** Tiny timestamped console logger — no external dependency. */
2
+ function ts() {
3
+ return new Date().toISOString();
4
+ }
5
+ export const log = {
6
+ info(msg, ...rest) {
7
+ console.log(`[${ts()}] ${msg}`, ...rest);
8
+ },
9
+ warn(msg, ...rest) {
10
+ console.warn(`[${ts()}] WARN ${msg}`, ...rest);
11
+ },
12
+ error(msg, ...rest) {
13
+ console.error(`[${ts()}] ERROR ${msg}`, ...rest);
14
+ },
15
+ };
16
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,SAAS,EAAE;IACT,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,CAAC,GAAW,EAAE,GAAG,IAAe;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,GAAG,IAAe;QAClC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,GAAG,IAAe;QACnC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACnD,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { isWindows, isMac } from './platform.js';
3
+ import { log } from './logger.js';
4
+ /** Open `url` in the default browser (best-effort, detached). Used by the
5
+ * one-click launchers when TMUXES_OPEN is set. */
6
+ export function openBrowser(url) {
7
+ try {
8
+ let file;
9
+ let args;
10
+ if (isWindows) {
11
+ // `cmd /c start "" "<url>"` — the empty "" is the window title start needs.
12
+ file = 'cmd.exe';
13
+ args = ['/c', 'start', '', url];
14
+ }
15
+ else if (isMac) {
16
+ file = 'open';
17
+ args = [url];
18
+ }
19
+ else {
20
+ file = 'xdg-open';
21
+ args = [url];
22
+ }
23
+ const child = spawn(file, args, { detached: true, stdio: 'ignore' });
24
+ child.on('error', (e) => log.warn(`could not open browser: ${e.message}`));
25
+ child.unref();
26
+ }
27
+ catch (e) {
28
+ log.warn(`could not open browser: ${e instanceof Error ? e.message : String(e)}`);
29
+ }
30
+ }
31
+ //# sourceMappingURL=openBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBrowser.js","sourceRoot":"","sources":["../src/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC;mDACmD;AACnD,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,IAAI,IAAY,CAAC;QACjB,IAAI,IAAc,CAAC;QACnB,IAAI,SAAS,EAAE,CAAC;YACd,4EAA4E;YAC5E,IAAI,GAAG,SAAS,CAAC;YACjB,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,IAAI,GAAG,MAAM,CAAC;YACd,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,UAAU,CAAC;YAClB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Platform helpers. Windows has no native tmux, so it reaches tmux inside WSL
2
+ * via wsl.exe; macOS and Linux run tmux directly. */
3
+ export const isWindows = process.platform === 'win32';
4
+ export const isMac = process.platform === 'darwin';
5
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA;sDACsD;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { Router } from 'express';
2
+ import { getTarget, isValidTargetId, refreshTargets } from '../targets.js';
3
+ import { isValidSessionName } from '../validate.js';
4
+ import { TmuxError, listSessions, createSession, renameSession, killSession, listWindows, } from '../tmux/sessions.js';
5
+ import { getSessionCwd, listDirectory, readFilePreview, resolveScopedPath, writeFile } from '../files.js';
6
+ import { readFolders, writeFolders } from '../foldersStore.js';
7
+ import { winShell, ManagerError } from '../winshell/manager.js';
8
+ /** Cap on a saved file's size (matches the editor's text-only use). */
9
+ const MAX_WRITE_BYTES = 5_000_000;
10
+ const wrap = (fn) => (req, res, next) => {
11
+ fn(req, res).catch(next);
12
+ };
13
+ /** Resolve :id → Target or throw a TmuxError with the right status. */
14
+ function requireTarget(req) {
15
+ const id = req.params.id;
16
+ if (!isValidTargetId(id))
17
+ throw new TmuxError(400, 'invalid target id');
18
+ const target = getTarget(id);
19
+ if (!target)
20
+ throw new TmuxError(404, 'target not found');
21
+ return target;
22
+ }
23
+ function requireSessionName(raw) {
24
+ if (!isValidSessionName(raw))
25
+ throw new TmuxError(400, 'invalid session name');
26
+ return raw;
27
+ }
28
+ /** A filesystem path supplied via query. Passed as a single argv element (no
29
+ * shell), so we only sanity-check shape, not contents — this app already
30
+ * grants full shell access on the target by design. */
31
+ function requirePath(raw) {
32
+ if (typeof raw !== 'string' || raw.length === 0 || raw.length > 4096 || raw.includes('\0')) {
33
+ throw new TmuxError(400, 'invalid path');
34
+ }
35
+ return raw;
36
+ }
37
+ async function requireSessionScopedPath(target, session, path, opts = {}) {
38
+ const name = requireSessionName(session);
39
+ const rawPath = requirePath(path);
40
+ const cwd = await getSessionCwd(target, name);
41
+ return resolveScopedPath(target, cwd, rawPath, opts);
42
+ }
43
+ export const apiRouter = Router();
44
+ apiRouter.get('/health', (_req, res) => {
45
+ res.json({ ok: true });
46
+ });
47
+ apiRouter.get('/targets', wrap(async (_req, res) => {
48
+ // Re-discover (WSL distros / ssh config can change between loads).
49
+ res.json({ targets: await refreshTargets() });
50
+ }));
51
+ apiRouter.get('/targets/:id/sessions', wrap(async (req, res) => {
52
+ const target = requireTarget(req);
53
+ if (target.kind === 'winlocal') {
54
+ res.json({ sessions: winShell.list() });
55
+ return;
56
+ }
57
+ res.json({ sessions: await listSessions(target) });
58
+ }));
59
+ apiRouter.post('/targets/:id/sessions', wrap(async (req, res) => {
60
+ const target = requireTarget(req);
61
+ const body = (req.body ?? {});
62
+ const name = body.name === undefined || body.name === '' ? undefined : body.name;
63
+ if (name !== undefined && !isValidSessionName(name)) {
64
+ throw new TmuxError(400, 'invalid session name');
65
+ }
66
+ const command = typeof body.command === 'string' && body.command.length > 0 ? body.command : undefined;
67
+ if (target.kind === 'winlocal') {
68
+ const shellId = typeof body.shell === 'string' ? body.shell : undefined;
69
+ res.status(201).json(winShell.create({ name, shellId, command }));
70
+ return;
71
+ }
72
+ const result = await createSession(target, { name, command });
73
+ res.status(201).json(result);
74
+ }));
75
+ apiRouter.patch('/targets/:id/sessions/:name', wrap(async (req, res) => {
76
+ const target = requireTarget(req);
77
+ const name = requireSessionName(req.params.name);
78
+ const newName = (req.body ?? {}).newName;
79
+ if (!isValidSessionName(newName))
80
+ throw new TmuxError(400, 'invalid new session name');
81
+ if (target.kind === 'winlocal') {
82
+ winShell.rename(name, newName);
83
+ res.json({ name: newName });
84
+ return;
85
+ }
86
+ await renameSession(target, name, newName);
87
+ res.json({ name: newName });
88
+ }));
89
+ apiRouter.delete('/targets/:id/sessions/:name', wrap(async (req, res) => {
90
+ const target = requireTarget(req);
91
+ const name = requireSessionName(req.params.name);
92
+ if (target.kind === 'winlocal') {
93
+ winShell.kill(name);
94
+ res.status(204).end();
95
+ return;
96
+ }
97
+ await killSession(target, name);
98
+ res.status(204).end();
99
+ }));
100
+ apiRouter.get('/targets/:id/sessions/:name/windows', wrap(async (req, res) => {
101
+ const target = requireTarget(req);
102
+ const name = requireSessionName(req.params.name);
103
+ if (target.kind === 'winlocal') {
104
+ res.json({ windows: winShell.windows(name) });
105
+ return;
106
+ }
107
+ res.json({ windows: await listWindows(target, name) });
108
+ }));
109
+ /** The file browser relies on tmux's pane cwd; native Windows shells have none. */
110
+ function rejectIfWinlocal(target) {
111
+ if (target.kind === 'winlocal') {
112
+ throw new TmuxError(400, 'file browsing is not available for native shell sessions');
113
+ }
114
+ }
115
+ // --- File browser (current pane cwd + directory listing + file preview) ---
116
+ apiRouter.get('/targets/:id/sessions/:name/cwd', wrap(async (req, res) => {
117
+ const target = requireTarget(req);
118
+ rejectIfWinlocal(target);
119
+ const name = requireSessionName(req.params.name);
120
+ res.json({ cwd: await getSessionCwd(target, name) });
121
+ }));
122
+ apiRouter.get('/targets/:id/files', wrap(async (req, res) => {
123
+ const target = requireTarget(req);
124
+ rejectIfWinlocal(target);
125
+ const path = await requireSessionScopedPath(target, req.query.session, req.query.path);
126
+ res.json({ path, entries: await listDirectory(target, path) });
127
+ }));
128
+ apiRouter.get('/targets/:id/file', wrap(async (req, res) => {
129
+ const target = requireTarget(req);
130
+ rejectIfWinlocal(target);
131
+ const path = await requireSessionScopedPath(target, req.query.session, req.query.path);
132
+ res.json(await readFilePreview(target, path));
133
+ }));
134
+ apiRouter.put('/targets/:id/file', wrap(async (req, res) => {
135
+ const target = requireTarget(req);
136
+ rejectIfWinlocal(target);
137
+ const body = (req.body ?? {});
138
+ const path = await requireSessionScopedPath(target, body.session, body.path, { forWrite: true });
139
+ if (typeof body.content !== 'string')
140
+ throw new TmuxError(400, 'content must be a string');
141
+ if (Buffer.byteLength(body.content, 'utf8') > MAX_WRITE_BYTES) {
142
+ throw new TmuxError(413, 'file too large to save');
143
+ }
144
+ await writeFile(target, path, body.content);
145
+ res.json({ ok: true });
146
+ }));
147
+ // --- Sidebar folder organization, persisted on the target (syncs clients) ---
148
+ apiRouter.get('/targets/:id/folders', wrap(async (req, res) => {
149
+ const target = requireTarget(req);
150
+ res.json(await readFolders(target));
151
+ }));
152
+ apiRouter.put('/targets/:id/folders', wrap(async (req, res) => {
153
+ const target = requireTarget(req);
154
+ const body = req.body;
155
+ if (!body ||
156
+ typeof body !== 'object' ||
157
+ Array.isArray(body) ||
158
+ !Array.isArray(body.folders) ||
159
+ typeof body.assign !== 'object' ||
160
+ body.assign === null) {
161
+ throw new TmuxError(400, 'invalid folders payload');
162
+ }
163
+ await writeFolders(target, {
164
+ folders: body.folders,
165
+ assign: body.assign,
166
+ });
167
+ res.json({ ok: true });
168
+ }));
169
+ // Central error mapper.
170
+ apiRouter.use((err, _req, res, _next) => {
171
+ if (err instanceof TmuxError || err instanceof ManagerError) {
172
+ res.status(err.status).json({ error: err.message });
173
+ return;
174
+ }
175
+ const message = err instanceof Error ? err.message : 'internal error';
176
+ res.status(500).json({ error: message });
177
+ });
178
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/rest/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { isValidHostAlias, parseHostSpec } from './validate.js';
5
+ import { isWindows } from './platform.js';
6
+ import { listWslDistros } from './wsl.js';
7
+ import { winShell } from './winshell/manager.js';
8
+ import { log } from './logger.js';
9
+ /** Native Windows shells (PowerShell/cmd via ConPTY). Enabled on Windows, or
10
+ * anywhere via TMUXES_FAKE_WINSHELL for testing the path on Linux/macOS. */
11
+ const WINSHELL_ENABLED = isWindows || !!process.env.TMUXES_FAKE_WINSHELL;
12
+ function winlocalTarget() {
13
+ return {
14
+ id: 'winlocal',
15
+ kind: 'winlocal',
16
+ label: isWindows ? 'Windows (local)' : 'Local shell (fake)',
17
+ shells: winShell.listShells(),
18
+ };
19
+ }
20
+ const ID_RE = /^[A-Za-z0-9._-]{1,128}$/;
21
+ export function isValidTargetId(id) {
22
+ return typeof id === 'string' && ID_RE.test(id);
23
+ }
24
+ function slug(s) {
25
+ return s.replace(/[^A-Za-z0-9._-]/g, '-');
26
+ }
27
+ const LOCAL = { id: 'local', kind: 'local', label: 'Local' };
28
+ /** Best-effort, read-only parse of ~/.ssh/config Host aliases (no wildcards). */
29
+ function parseSshConfig() {
30
+ const path = join(homedir(), '.ssh', 'config');
31
+ let text;
32
+ try {
33
+ text = readFileSync(path, 'utf8');
34
+ }
35
+ catch {
36
+ return []; // no config file is normal
37
+ }
38
+ const targets = [];
39
+ const seen = new Set();
40
+ for (const rawLine of text.split('\n')) {
41
+ const line = rawLine.trim();
42
+ if (!line || line.startsWith('#'))
43
+ continue;
44
+ const m = /^Host\s+(.+)$/i.exec(line);
45
+ if (!m)
46
+ continue;
47
+ for (const token of m[1].split(/\s+/)) {
48
+ // Skip wildcard / negated patterns — they aren't concrete hosts.
49
+ if (token.includes('*') || token.includes('?') || token.startsWith('!'))
50
+ continue;
51
+ if (!isValidHostAlias(token) || seen.has(token))
52
+ continue;
53
+ seen.add(token);
54
+ targets.push({ id: `cfg-${slug(token)}`, kind: 'ssh', label: token, host: token });
55
+ }
56
+ }
57
+ return targets;
58
+ }
59
+ /** Parse the TMUXES_HOSTS="alice@web1,bob@db2:2222" override. */
60
+ function parseEnvHosts() {
61
+ const env = process.env.TMUXES_HOSTS;
62
+ if (!env)
63
+ return [];
64
+ const targets = [];
65
+ for (const part of env.split(',')) {
66
+ const spec = parseHostSpec(part);
67
+ if (!spec) {
68
+ log.warn(`ignoring invalid TMUXES_HOSTS entry: ${part.trim()}`);
69
+ continue;
70
+ }
71
+ const label = `${spec.user ? `${spec.user}@` : ''}${spec.host}${spec.port ? `:${spec.port}` : ''}`;
72
+ targets.push({
73
+ id: `env-${slug(label)}`,
74
+ kind: 'ssh',
75
+ label,
76
+ host: spec.host,
77
+ user: spec.user,
78
+ port: spec.port,
79
+ });
80
+ }
81
+ return targets;
82
+ }
83
+ function sshTargets() {
84
+ const all = [...parseEnvHosts(), ...parseSshConfig()];
85
+ const byId = new Map();
86
+ for (const t of all)
87
+ if (!byId.has(t.id))
88
+ byId.set(t.id, t);
89
+ return [...byId.values()];
90
+ }
91
+ /** The synchronous part of the target list (everything except WSL discovery). */
92
+ function baseTargets() {
93
+ const base = [];
94
+ if (WINSHELL_ENABLED)
95
+ base.push(winlocalTarget());
96
+ // Windows has no native tmux; its "local" machine is reached through WSL.
97
+ if (!isWindows)
98
+ base.push(LOCAL);
99
+ return [...base, ...sshTargets()];
100
+ }
101
+ // Cache so the (async, Windows-only) WSL discovery doesn't run on the WS
102
+ // upgrade path. The client always GETs /api/targets first, which refreshes it.
103
+ let cachedTargets = baseTargets();
104
+ /** Recompute the full target list, including WSL distros on Windows. */
105
+ export async function refreshTargets() {
106
+ if (isWindows) {
107
+ const distros = await listWslDistros();
108
+ const wsl = distros.map((name) => ({
109
+ id: `wsl-${slug(name)}`,
110
+ kind: 'wsl',
111
+ label: name,
112
+ distro: name,
113
+ }));
114
+ cachedTargets = [winlocalTarget(), ...wsl, ...sshTargets()];
115
+ }
116
+ else {
117
+ cachedTargets = baseTargets();
118
+ }
119
+ return cachedTargets;
120
+ }
121
+ export function listTargets() {
122
+ return cachedTargets;
123
+ }
124
+ export function getTarget(id) {
125
+ return cachedTargets.find((t) => t.id === id);
126
+ }
127
+ /** ssh destination string: "user@host" or just the config alias / host. */
128
+ export function sshDestination(t) {
129
+ return t.user ? `${t.user}@${t.host}` : `${t.host}`;
130
+ }
131
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}