ttyd-mux 0.2.1 → 0.3.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 CHANGED
@@ -6,6 +6,16 @@ A CLI tool for managing multiple ttyd+tmux web terminal sessions.
6
6
 
7
7
  ---
8
8
 
9
+ ## Motivation / 開発動機
10
+
11
+ **English:**
12
+ This tool was developed to easily access terminal sessions running AI coding assistants like [Claude Code](https://docs.anthropic.com/en/docs/claude-code) from a web browser. When running long coding sessions with AI assistants on a remote server, you can monitor and interact with them from anywhere through your browser.
13
+
14
+ **日本語:**
15
+ このツールは、[Claude Code](https://docs.anthropic.com/ja/docs/claude-code) などの AI コーディングアシスタントを実行しているターミナルセッションに、ブラウザから簡単にアクセスできるようにする目的で開発されました。リモートサーバーで AI アシスタントと長時間のコーディングセッションを実行する際、ブラウザからどこからでも監視・操作できます。
16
+
17
+ ---
18
+
9
19
  ## Overview / 概要
10
20
 
11
21
  **English:**
@@ -14,6 +24,7 @@ ttyd-mux makes it easy to manage multiple web terminal (ttyd) sessions.
14
24
  - Run `ttyd-mux up` in any directory to start a browser-accessible terminal
15
25
  - Provides a portal page to manage all sessions
16
26
  - Integrates with reverse proxies like Caddy for external access
27
+ - Perfect for monitoring AI coding assistants like Claude Code remotely
17
28
 
18
29
  **日本語:**
19
30
  ttyd-mux は、複数の Web ターミナル(ttyd)セッションを簡単に管理するためのツールです。
@@ -21,6 +32,7 @@ ttyd-mux は、複数の Web ターミナル(ttyd)セッションを簡単
21
32
  - カレントディレクトリで `ttyd-mux up` するだけでブラウザアクセス可能なターミナルを起動
22
33
  - 複数セッションを一元管理するポータルページを提供
23
34
  - Caddy などのリバースプロキシと連携して外部公開
35
+ - Claude Code などの AI コーディングアシスタントをリモートから監視するのに最適
24
36
 
25
37
  ## Installation / インストール
26
38
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAK5B,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BxD;AAED,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BrE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BpD;AAUD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAEvE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAE5E;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAK5B,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BxD;AAED,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CrE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BpD;AAUD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAEvE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAE5E;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE"}
@@ -32,16 +32,29 @@ export async function ensureDaemon(configPath) {
32
32
  if (await isDaemonRunning()) {
33
33
  return;
34
34
  }
35
- // Find the path to the daemon script
36
- const daemonScript = new URL('../daemon/index.js', import.meta.url).pathname;
37
- // Spawn daemon in background (use same runtime as current process)
38
- const child = spawn(process.execPath, [daemonScript], {
35
+ // Build command to spawn daemon in background
36
+ // For 'bun run src/index.ts': argv[1] ends with '.ts' or is 'run'
37
+ // For compiled binary: execPath is the binary itself
38
+ let executable;
39
+ let args;
40
+ const isBunRun = process.argv[1] === 'run' || process.argv[1]?.endsWith('.ts');
41
+ if (isBunRun) {
42
+ // Running via 'bun run' or 'bun src/index.ts'
43
+ executable = process.argv[0] ?? 'bun';
44
+ args = process.argv.slice(1, 3).concat(['daemon', '-f']);
45
+ }
46
+ else {
47
+ // Compiled binary - use execPath which is the actual binary path
48
+ executable = process.execPath;
49
+ args = ['daemon', '-f'];
50
+ }
51
+ if (configPath) {
52
+ args.push('-c', configPath);
53
+ }
54
+ const child = spawn(executable, args, {
39
55
  detached: true,
40
56
  stdio: 'ignore',
41
- env: {
42
- ...process.env,
43
- TTYD_MUX_CONFIG: configPath ?? ''
44
- }
57
+ env: process.env
45
58
  });
46
59
  child.unref();
47
60
  // Wait for daemon to be ready
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ export function saveState(state) {
49
49
  */
50
50
  export function withStateLock(fn) {
51
51
  ensureStateFile();
52
- lockSync(STATE_FILE, { retries: 5 });
52
+ lockSync(STATE_FILE);
53
53
  try {
54
54
  return fn();
55
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/config/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/config/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * IME Helper Script for ttyd
3
+ * Provides a pseudo copy-paste input field for Japanese IME support
4
+ * Optimized for mobile devices
5
+ */
6
+ export declare const imeHelperScript = "\n<style>\n#ttyd-ime-container {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n background: #1e1e1e;\n border-top: 2px solid #007acc;\n padding: 8px;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n box-shadow: 0 -2px 10px rgba(0,0,0,0.3);\n}\n\n#ttyd-ime-container.hidden {\n display: none;\n}\n\n#ttyd-ime-buttons {\n display: flex;\n gap: 6px;\n margin-bottom: 8px;\n flex-wrap: wrap;\n}\n\n#ttyd-ime-buttons button {\n background: #3a3a3a;\n border: 1px solid #555;\n border-radius: 6px;\n color: #fff;\n cursor: pointer;\n font-size: 13px;\n padding: 8px 12px;\n min-height: 40px;\n min-width: 44px;\n touch-action: manipulation;\n flex-shrink: 0;\n}\n\n#ttyd-ime-buttons button:hover, #ttyd-ime-buttons button:active {\n background: #4a4a4a;\n}\n\n#ttyd-ime-buttons button.active {\n background: #007acc;\n border-color: #005a9e;\n}\n\n#ttyd-ime-buttons button.modifier {\n background: #2d2d2d;\n font-weight: bold;\n}\n\n#ttyd-ime-buttons button.modifier.active {\n background: #d9534f;\n border-color: #c9302c;\n}\n\n#ttyd-ime-send {\n background: #007acc !important;\n border-color: #005a9e !important;\n font-weight: bold;\n}\n\n#ttyd-ime-send:hover, #ttyd-ime-send:active {\n background: #005a9e !important;\n}\n\n#ttyd-ime-run {\n background: #28a745 !important;\n border-color: #1e7e34 !important;\n font-weight: bold;\n}\n\n#ttyd-ime-run:hover, #ttyd-ime-run:active {\n background: #1e7e34 !important;\n}\n\n#ttyd-ime-input-row {\n display: flex;\n gap: 8px;\n align-items: flex-end;\n}\n\n#ttyd-ime-input {\n flex: 1;\n background: #2d2d2d;\n border: 1px solid #555;\n border-radius: 8px;\n color: #fff;\n font-family: monospace;\n font-size: 16px;\n padding: 12px;\n outline: none;\n resize: none;\n min-height: 44px;\n max-height: 120px;\n line-height: 1.4;\n}\n\n#ttyd-ime-input:focus {\n border-color: #007acc;\n}\n\n#ttyd-ime-input::placeholder {\n color: #888;\n}\n\n#ttyd-ime-toggle {\n position: fixed;\n bottom: 16px;\n right: 16px;\n background: #007acc;\n border: 2px solid #005a9e;\n border-radius: 50%;\n color: #fff;\n cursor: pointer;\n font-size: 20px;\n width: 56px;\n height: 56px;\n z-index: 10001;\n touch-action: manipulation;\n box-shadow: 0 2px 8px rgba(0,0,0,0.3);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n#ttyd-ime-toggle:hover, #ttyd-ime-toggle:active {\n background: #005a9e;\n transform: scale(1.05);\n}\n\n#ttyd-ime-container.hidden ~ #ttyd-ime-toggle {\n bottom: 16px;\n}\n\n/* Adjust terminal height when IME bar is visible */\nbody:has(#ttyd-ime-container:not(.hidden)) .xterm {\n height: calc(100vh - 140px) !important;\n}\n\n/* Mobile optimizations */\n@media (max-width: 768px) {\n #ttyd-ime-container {\n padding: 6px;\n }\n\n #ttyd-ime-buttons {\n gap: 4px;\n margin-bottom: 6px;\n }\n\n #ttyd-ime-buttons button {\n font-size: 12px;\n padding: 6px 10px;\n min-height: 36px;\n min-width: 40px;\n }\n\n #ttyd-ime-input {\n font-size: 16px;\n padding: 10px;\n }\n\n #ttyd-ime-toggle {\n width: 64px;\n height: 64px;\n font-size: 24px;\n }\n\n body:has(#ttyd-ime-container:not(.hidden)) .xterm {\n height: calc(100vh - 130px) !important;\n }\n}\n</style>\n\n<div id=\"ttyd-ime-container\" class=\"hidden\">\n <div id=\"ttyd-ime-buttons\">\n <button id=\"ttyd-ime-ctrl\" class=\"modifier\">Ctrl</button>\n <button id=\"ttyd-ime-alt\" class=\"modifier\">Alt</button>\n <button id=\"ttyd-ime-esc\">Esc</button>\n <button id=\"ttyd-ime-tab\">Tab</button>\n <button id=\"ttyd-ime-up\">\u2191</button>\n <button id=\"ttyd-ime-down\">\u2193</button>\n <button id=\"ttyd-ime-enter\">Enter</button>\n <button id=\"ttyd-ime-zoomout\">A-</button>\n <button id=\"ttyd-ime-zoomin\">A+</button>\n <button id=\"ttyd-ime-send\">Send</button>\n <button id=\"ttyd-ime-run\">Run</button>\n </div>\n <div id=\"ttyd-ime-input-row\">\n <textarea id=\"ttyd-ime-input\" rows=\"1\" placeholder=\"\u65E5\u672C\u8A9E\u5165\u529B (Enter: \u9001\u4FE1)\"></textarea>\n </div>\n</div>\n<button id=\"ttyd-ime-toggle\">\u2328</button>\n\n<script>\n(function() {\n const container = document.getElementById('ttyd-ime-container');\n const input = document.getElementById('ttyd-ime-input');\n const sendBtn = document.getElementById('ttyd-ime-send');\n const enterBtn = document.getElementById('ttyd-ime-enter');\n const zoomInBtn = document.getElementById('ttyd-ime-zoomin');\n const zoomOutBtn = document.getElementById('ttyd-ime-zoomout');\n const runBtn = document.getElementById('ttyd-ime-run');\n const toggleBtn = document.getElementById('ttyd-ime-toggle');\n const ctrlBtn = document.getElementById('ttyd-ime-ctrl');\n const altBtn = document.getElementById('ttyd-ime-alt');\n const escBtn = document.getElementById('ttyd-ime-esc');\n const tabBtn = document.getElementById('ttyd-ime-tab');\n const upBtn = document.getElementById('ttyd-ime-up');\n const downBtn = document.getElementById('ttyd-ime-down');\n\n let ws = null;\n let ctrlActive = false;\n let altActive = false;\n\n // Detect mobile device\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n\n // Find the WebSocket connection\n function findWebSocket() {\n if (ws && ws.readyState === WebSocket.OPEN) return ws;\n\n if (window.socket && window.socket.readyState === WebSocket.OPEN) {\n ws = window.socket;\n return ws;\n }\n\n return null;\n }\n\n // Intercept WebSocket creation to capture the connection\n const OriginalWebSocket = window.WebSocket;\n window.WebSocket = function(url, protocols) {\n const socket = new OriginalWebSocket(url, protocols);\n if (url.includes('/ws')) {\n ws = socket;\n }\n return socket;\n };\n window.WebSocket.prototype = OriginalWebSocket.prototype;\n window.WebSocket.CONNECTING = OriginalWebSocket.CONNECTING;\n window.WebSocket.OPEN = OriginalWebSocket.OPEN;\n window.WebSocket.CLOSING = OriginalWebSocket.CLOSING;\n window.WebSocket.CLOSED = OriginalWebSocket.CLOSED;\n\n function sendText(text) {\n const socket = findWebSocket();\n if (!socket) {\n console.error('[IME Helper] WebSocket not found');\n return false;\n }\n\n // ttyd protocol: binary data with '0' (input command) as first byte\n const encoder = new TextEncoder();\n const textBytes = encoder.encode(text);\n const data = new Uint8Array(textBytes.length + 1);\n data[0] = '0'.charCodeAt(0); // Input command\n data.set(textBytes, 1);\n socket.send(data);\n return true;\n }\n\n function sendKey(key) {\n // Apply modifiers\n if (ctrlActive && key.length === 1) {\n // Ctrl+key: send as control character (A=1, B=2, ..., Z=26)\n const code = key.toUpperCase().charCodeAt(0) - 64;\n if (code > 0 && code < 32) {\n sendBytes([code]);\n }\n resetModifiers();\n } else if (altActive && key.length === 1) {\n // Alt+key: send ESC + key\n const keyCode = key.charCodeAt(0);\n sendBytes([0x1B, keyCode]);\n resetModifiers();\n } else {\n sendText(key);\n }\n }\n\n function resetModifiers() {\n ctrlActive = false;\n altActive = false;\n ctrlBtn.classList.remove('active');\n altBtn.classList.remove('active');\n }\n\n // Send raw bytes for special keys\n function sendBytes(bytes) {\n const socket = findWebSocket();\n if (!socket) {\n console.error('[IME Helper] WebSocket not found');\n return false;\n }\n const data = new Uint8Array(bytes.length + 1);\n data[0] = 0x30; // '0' = input command\n data.set(bytes, 1);\n socket.send(data);\n return true;\n }\n\n function sendEnter() {\n sendBytes([0x0D]); // CR\n }\n\n function sendEsc() {\n sendBytes([0x1B]); // ESC\n }\n\n function sendTab() {\n sendBytes([0x09]); // TAB\n }\n\n function sendUp() {\n sendBytes([0x1B, 0x5B, 0x41]); // ESC [ A\n }\n\n function sendDown() {\n sendBytes([0x1B, 0x5B, 0x42]); // ESC [ B\n }\n\n function fitTerminal() {\n if (window.fitAddon && typeof window.fitAddon.fit === 'function') {\n window.fitAddon.fit();\n console.log('[IME Helper] Terminal fitted via fitAddon');\n return;\n }\n\n if (window.term && window.term.fitAddon && typeof window.term.fitAddon.fit === 'function') {\n window.term.fitAddon.fit();\n console.log('[IME Helper] Terminal fitted via term.fitAddon');\n return;\n }\n\n window.dispatchEvent(new Event('resize'));\n console.log('[IME Helper] Dispatched resize event');\n }\n\n function zoomTerminal(delta) {\n // Try to find the terminal instance\n let term = window.term;\n if (!term) {\n // ttyd might store it differently\n const termEl = document.querySelector('.xterm');\n if (termEl && termEl._core) {\n term = termEl._core;\n }\n }\n\n if (term && term.options) {\n const currentSize = term.options.fontSize || 14;\n const newSize = Math.max(8, Math.min(32, currentSize + delta));\n term.options.fontSize = newSize;\n console.log('[IME Helper] Font size changed to ' + newSize);\n fitTerminal();\n } else {\n console.log('[IME Helper] Terminal not found for zoom');\n }\n }\n\n function submitInput() {\n const text = input.value;\n if (!text) return;\n\n if (sendText(text)) {\n input.value = '';\n adjustTextareaHeight();\n }\n }\n\n function runInput() {\n const text = input.value;\n if (!text) return;\n\n if (sendText(text)) {\n input.value = '';\n adjustTextareaHeight();\n // Wait 1 second then send Enter\n setTimeout(function() {\n sendEnter();\n }, 1000);\n }\n }\n\n function toggleIME(show) {\n if (typeof show === 'boolean') {\n container.classList.toggle('hidden', !show);\n } else {\n container.classList.toggle('hidden');\n }\n\n if (!container.classList.contains('hidden')) {\n input.focus();\n // Fit terminal after showing IME bar\n setTimeout(fitTerminal, 100);\n } else {\n const terminal = document.querySelector('.xterm-helper-textarea');\n if (terminal) terminal.focus();\n setTimeout(fitTerminal, 100);\n }\n }\n\n function adjustTextareaHeight() {\n input.style.height = 'auto';\n input.style.height = Math.min(input.scrollHeight, 120) + 'px';\n }\n\n // Event listeners\n sendBtn.addEventListener('click', function(e) {\n e.preventDefault();\n submitInput();\n });\n\n enterBtn.addEventListener('click', function(e) {\n e.preventDefault();\n sendEnter();\n });\n\n runBtn.addEventListener('click', function(e) {\n e.preventDefault();\n runInput();\n });\n\n zoomInBtn.addEventListener('click', function(e) {\n e.preventDefault();\n zoomTerminal(2);\n });\n\n zoomOutBtn.addEventListener('click', function(e) {\n e.preventDefault();\n zoomTerminal(-2);\n });\n\n ctrlBtn.addEventListener('click', function(e) {\n e.preventDefault();\n ctrlActive = !ctrlActive;\n ctrlBtn.classList.toggle('active', ctrlActive);\n if (ctrlActive) {\n altActive = false;\n altBtn.classList.remove('active');\n }\n });\n\n altBtn.addEventListener('click', function(e) {\n e.preventDefault();\n altActive = !altActive;\n altBtn.classList.toggle('active', altActive);\n if (altActive) {\n ctrlActive = false;\n ctrlBtn.classList.remove('active');\n }\n });\n\n escBtn.addEventListener('click', function(e) {\n e.preventDefault();\n sendEsc();\n });\n\n tabBtn.addEventListener('click', function(e) {\n e.preventDefault();\n sendTab();\n });\n\n upBtn.addEventListener('click', function(e) {\n e.preventDefault();\n sendUp();\n });\n\n downBtn.addEventListener('click', function(e) {\n e.preventDefault();\n sendDown();\n });\n\n input.addEventListener('input', adjustTextareaHeight);\n\n input.addEventListener('keydown', function(e) {\n if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n submitInput();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n toggleIME(false);\n }\n });\n\n toggleBtn.addEventListener('click', function(e) {\n e.preventDefault();\n toggleIME();\n });\n\n // Keyboard shortcut: Ctrl+J to toggle IME\n document.addEventListener('keydown', function(e) {\n if (e.ctrlKey && e.key === 'j') {\n e.preventDefault();\n toggleIME();\n }\n });\n\n // Auto-show on mobile devices\n if (isMobile) {\n setTimeout(function() {\n toggleIME(true);\n }, 1000);\n }\n\n console.log('[IME Helper] Loaded. ' + (isMobile ? 'Mobile mode.' : 'Press Ctrl+J or click keyboard button to toggle.'));\n})();\n</script>\n";
7
+ export declare function injectImeHelper(html: string): string;
8
+ //# sourceMappingURL=ime-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ime-helper.d.ts","sourceRoot":"","sources":["../../src/daemon/ime-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,eAAe,qpZAigB3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD"}
@@ -0,0 +1,524 @@
1
+ /**
2
+ * IME Helper Script for ttyd
3
+ * Provides a pseudo copy-paste input field for Japanese IME support
4
+ * Optimized for mobile devices
5
+ */
6
+ export const imeHelperScript = `
7
+ <style>
8
+ #ttyd-ime-container {
9
+ position: fixed;
10
+ bottom: 0;
11
+ left: 0;
12
+ right: 0;
13
+ background: #1e1e1e;
14
+ border-top: 2px solid #007acc;
15
+ padding: 8px;
16
+ z-index: 10000;
17
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
18
+ box-shadow: 0 -2px 10px rgba(0,0,0,0.3);
19
+ }
20
+
21
+ #ttyd-ime-container.hidden {
22
+ display: none;
23
+ }
24
+
25
+ #ttyd-ime-buttons {
26
+ display: flex;
27
+ gap: 6px;
28
+ margin-bottom: 8px;
29
+ flex-wrap: wrap;
30
+ }
31
+
32
+ #ttyd-ime-buttons button {
33
+ background: #3a3a3a;
34
+ border: 1px solid #555;
35
+ border-radius: 6px;
36
+ color: #fff;
37
+ cursor: pointer;
38
+ font-size: 13px;
39
+ padding: 8px 12px;
40
+ min-height: 40px;
41
+ min-width: 44px;
42
+ touch-action: manipulation;
43
+ flex-shrink: 0;
44
+ }
45
+
46
+ #ttyd-ime-buttons button:hover, #ttyd-ime-buttons button:active {
47
+ background: #4a4a4a;
48
+ }
49
+
50
+ #ttyd-ime-buttons button.active {
51
+ background: #007acc;
52
+ border-color: #005a9e;
53
+ }
54
+
55
+ #ttyd-ime-buttons button.modifier {
56
+ background: #2d2d2d;
57
+ font-weight: bold;
58
+ }
59
+
60
+ #ttyd-ime-buttons button.modifier.active {
61
+ background: #d9534f;
62
+ border-color: #c9302c;
63
+ }
64
+
65
+ #ttyd-ime-send {
66
+ background: #007acc !important;
67
+ border-color: #005a9e !important;
68
+ font-weight: bold;
69
+ }
70
+
71
+ #ttyd-ime-send:hover, #ttyd-ime-send:active {
72
+ background: #005a9e !important;
73
+ }
74
+
75
+ #ttyd-ime-run {
76
+ background: #28a745 !important;
77
+ border-color: #1e7e34 !important;
78
+ font-weight: bold;
79
+ }
80
+
81
+ #ttyd-ime-run:hover, #ttyd-ime-run:active {
82
+ background: #1e7e34 !important;
83
+ }
84
+
85
+ #ttyd-ime-input-row {
86
+ display: flex;
87
+ gap: 8px;
88
+ align-items: flex-end;
89
+ }
90
+
91
+ #ttyd-ime-input {
92
+ flex: 1;
93
+ background: #2d2d2d;
94
+ border: 1px solid #555;
95
+ border-radius: 8px;
96
+ color: #fff;
97
+ font-family: monospace;
98
+ font-size: 16px;
99
+ padding: 12px;
100
+ outline: none;
101
+ resize: none;
102
+ min-height: 44px;
103
+ max-height: 120px;
104
+ line-height: 1.4;
105
+ }
106
+
107
+ #ttyd-ime-input:focus {
108
+ border-color: #007acc;
109
+ }
110
+
111
+ #ttyd-ime-input::placeholder {
112
+ color: #888;
113
+ }
114
+
115
+ #ttyd-ime-toggle {
116
+ position: fixed;
117
+ bottom: 16px;
118
+ right: 16px;
119
+ background: #007acc;
120
+ border: 2px solid #005a9e;
121
+ border-radius: 50%;
122
+ color: #fff;
123
+ cursor: pointer;
124
+ font-size: 20px;
125
+ width: 56px;
126
+ height: 56px;
127
+ z-index: 10001;
128
+ touch-action: manipulation;
129
+ box-shadow: 0 2px 8px rgba(0,0,0,0.3);
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ }
134
+
135
+ #ttyd-ime-toggle:hover, #ttyd-ime-toggle:active {
136
+ background: #005a9e;
137
+ transform: scale(1.05);
138
+ }
139
+
140
+ #ttyd-ime-container.hidden ~ #ttyd-ime-toggle {
141
+ bottom: 16px;
142
+ }
143
+
144
+ /* Adjust terminal height when IME bar is visible */
145
+ body:has(#ttyd-ime-container:not(.hidden)) .xterm {
146
+ height: calc(100vh - 140px) !important;
147
+ }
148
+
149
+ /* Mobile optimizations */
150
+ @media (max-width: 768px) {
151
+ #ttyd-ime-container {
152
+ padding: 6px;
153
+ }
154
+
155
+ #ttyd-ime-buttons {
156
+ gap: 4px;
157
+ margin-bottom: 6px;
158
+ }
159
+
160
+ #ttyd-ime-buttons button {
161
+ font-size: 12px;
162
+ padding: 6px 10px;
163
+ min-height: 36px;
164
+ min-width: 40px;
165
+ }
166
+
167
+ #ttyd-ime-input {
168
+ font-size: 16px;
169
+ padding: 10px;
170
+ }
171
+
172
+ #ttyd-ime-toggle {
173
+ width: 64px;
174
+ height: 64px;
175
+ font-size: 24px;
176
+ }
177
+
178
+ body:has(#ttyd-ime-container:not(.hidden)) .xterm {
179
+ height: calc(100vh - 130px) !important;
180
+ }
181
+ }
182
+ </style>
183
+
184
+ <div id="ttyd-ime-container" class="hidden">
185
+ <div id="ttyd-ime-buttons">
186
+ <button id="ttyd-ime-ctrl" class="modifier">Ctrl</button>
187
+ <button id="ttyd-ime-alt" class="modifier">Alt</button>
188
+ <button id="ttyd-ime-esc">Esc</button>
189
+ <button id="ttyd-ime-tab">Tab</button>
190
+ <button id="ttyd-ime-up">↑</button>
191
+ <button id="ttyd-ime-down">↓</button>
192
+ <button id="ttyd-ime-enter">Enter</button>
193
+ <button id="ttyd-ime-zoomout">A-</button>
194
+ <button id="ttyd-ime-zoomin">A+</button>
195
+ <button id="ttyd-ime-send">Send</button>
196
+ <button id="ttyd-ime-run">Run</button>
197
+ </div>
198
+ <div id="ttyd-ime-input-row">
199
+ <textarea id="ttyd-ime-input" rows="1" placeholder="日本語入力 (Enter: 送信)"></textarea>
200
+ </div>
201
+ </div>
202
+ <button id="ttyd-ime-toggle">⌨</button>
203
+
204
+ <script>
205
+ (function() {
206
+ const container = document.getElementById('ttyd-ime-container');
207
+ const input = document.getElementById('ttyd-ime-input');
208
+ const sendBtn = document.getElementById('ttyd-ime-send');
209
+ const enterBtn = document.getElementById('ttyd-ime-enter');
210
+ const zoomInBtn = document.getElementById('ttyd-ime-zoomin');
211
+ const zoomOutBtn = document.getElementById('ttyd-ime-zoomout');
212
+ const runBtn = document.getElementById('ttyd-ime-run');
213
+ const toggleBtn = document.getElementById('ttyd-ime-toggle');
214
+ const ctrlBtn = document.getElementById('ttyd-ime-ctrl');
215
+ const altBtn = document.getElementById('ttyd-ime-alt');
216
+ const escBtn = document.getElementById('ttyd-ime-esc');
217
+ const tabBtn = document.getElementById('ttyd-ime-tab');
218
+ const upBtn = document.getElementById('ttyd-ime-up');
219
+ const downBtn = document.getElementById('ttyd-ime-down');
220
+
221
+ let ws = null;
222
+ let ctrlActive = false;
223
+ let altActive = false;
224
+
225
+ // Detect mobile device
226
+ const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
227
+
228
+ // Find the WebSocket connection
229
+ function findWebSocket() {
230
+ if (ws && ws.readyState === WebSocket.OPEN) return ws;
231
+
232
+ if (window.socket && window.socket.readyState === WebSocket.OPEN) {
233
+ ws = window.socket;
234
+ return ws;
235
+ }
236
+
237
+ return null;
238
+ }
239
+
240
+ // Intercept WebSocket creation to capture the connection
241
+ const OriginalWebSocket = window.WebSocket;
242
+ window.WebSocket = function(url, protocols) {
243
+ const socket = new OriginalWebSocket(url, protocols);
244
+ if (url.includes('/ws')) {
245
+ ws = socket;
246
+ }
247
+ return socket;
248
+ };
249
+ window.WebSocket.prototype = OriginalWebSocket.prototype;
250
+ window.WebSocket.CONNECTING = OriginalWebSocket.CONNECTING;
251
+ window.WebSocket.OPEN = OriginalWebSocket.OPEN;
252
+ window.WebSocket.CLOSING = OriginalWebSocket.CLOSING;
253
+ window.WebSocket.CLOSED = OriginalWebSocket.CLOSED;
254
+
255
+ function sendText(text) {
256
+ const socket = findWebSocket();
257
+ if (!socket) {
258
+ console.error('[IME Helper] WebSocket not found');
259
+ return false;
260
+ }
261
+
262
+ // ttyd protocol: binary data with '0' (input command) as first byte
263
+ const encoder = new TextEncoder();
264
+ const textBytes = encoder.encode(text);
265
+ const data = new Uint8Array(textBytes.length + 1);
266
+ data[0] = '0'.charCodeAt(0); // Input command
267
+ data.set(textBytes, 1);
268
+ socket.send(data);
269
+ return true;
270
+ }
271
+
272
+ function sendKey(key) {
273
+ // Apply modifiers
274
+ if (ctrlActive && key.length === 1) {
275
+ // Ctrl+key: send as control character (A=1, B=2, ..., Z=26)
276
+ const code = key.toUpperCase().charCodeAt(0) - 64;
277
+ if (code > 0 && code < 32) {
278
+ sendBytes([code]);
279
+ }
280
+ resetModifiers();
281
+ } else if (altActive && key.length === 1) {
282
+ // Alt+key: send ESC + key
283
+ const keyCode = key.charCodeAt(0);
284
+ sendBytes([0x1B, keyCode]);
285
+ resetModifiers();
286
+ } else {
287
+ sendText(key);
288
+ }
289
+ }
290
+
291
+ function resetModifiers() {
292
+ ctrlActive = false;
293
+ altActive = false;
294
+ ctrlBtn.classList.remove('active');
295
+ altBtn.classList.remove('active');
296
+ }
297
+
298
+ // Send raw bytes for special keys
299
+ function sendBytes(bytes) {
300
+ const socket = findWebSocket();
301
+ if (!socket) {
302
+ console.error('[IME Helper] WebSocket not found');
303
+ return false;
304
+ }
305
+ const data = new Uint8Array(bytes.length + 1);
306
+ data[0] = 0x30; // '0' = input command
307
+ data.set(bytes, 1);
308
+ socket.send(data);
309
+ return true;
310
+ }
311
+
312
+ function sendEnter() {
313
+ sendBytes([0x0D]); // CR
314
+ }
315
+
316
+ function sendEsc() {
317
+ sendBytes([0x1B]); // ESC
318
+ }
319
+
320
+ function sendTab() {
321
+ sendBytes([0x09]); // TAB
322
+ }
323
+
324
+ function sendUp() {
325
+ sendBytes([0x1B, 0x5B, 0x41]); // ESC [ A
326
+ }
327
+
328
+ function sendDown() {
329
+ sendBytes([0x1B, 0x5B, 0x42]); // ESC [ B
330
+ }
331
+
332
+ function fitTerminal() {
333
+ if (window.fitAddon && typeof window.fitAddon.fit === 'function') {
334
+ window.fitAddon.fit();
335
+ console.log('[IME Helper] Terminal fitted via fitAddon');
336
+ return;
337
+ }
338
+
339
+ if (window.term && window.term.fitAddon && typeof window.term.fitAddon.fit === 'function') {
340
+ window.term.fitAddon.fit();
341
+ console.log('[IME Helper] Terminal fitted via term.fitAddon');
342
+ return;
343
+ }
344
+
345
+ window.dispatchEvent(new Event('resize'));
346
+ console.log('[IME Helper] Dispatched resize event');
347
+ }
348
+
349
+ function zoomTerminal(delta) {
350
+ // Try to find the terminal instance
351
+ let term = window.term;
352
+ if (!term) {
353
+ // ttyd might store it differently
354
+ const termEl = document.querySelector('.xterm');
355
+ if (termEl && termEl._core) {
356
+ term = termEl._core;
357
+ }
358
+ }
359
+
360
+ if (term && term.options) {
361
+ const currentSize = term.options.fontSize || 14;
362
+ const newSize = Math.max(8, Math.min(32, currentSize + delta));
363
+ term.options.fontSize = newSize;
364
+ console.log('[IME Helper] Font size changed to ' + newSize);
365
+ fitTerminal();
366
+ } else {
367
+ console.log('[IME Helper] Terminal not found for zoom');
368
+ }
369
+ }
370
+
371
+ function submitInput() {
372
+ const text = input.value;
373
+ if (!text) return;
374
+
375
+ if (sendText(text)) {
376
+ input.value = '';
377
+ adjustTextareaHeight();
378
+ }
379
+ }
380
+
381
+ function runInput() {
382
+ const text = input.value;
383
+ if (!text) return;
384
+
385
+ if (sendText(text)) {
386
+ input.value = '';
387
+ adjustTextareaHeight();
388
+ // Wait 1 second then send Enter
389
+ setTimeout(function() {
390
+ sendEnter();
391
+ }, 1000);
392
+ }
393
+ }
394
+
395
+ function toggleIME(show) {
396
+ if (typeof show === 'boolean') {
397
+ container.classList.toggle('hidden', !show);
398
+ } else {
399
+ container.classList.toggle('hidden');
400
+ }
401
+
402
+ if (!container.classList.contains('hidden')) {
403
+ input.focus();
404
+ // Fit terminal after showing IME bar
405
+ setTimeout(fitTerminal, 100);
406
+ } else {
407
+ const terminal = document.querySelector('.xterm-helper-textarea');
408
+ if (terminal) terminal.focus();
409
+ setTimeout(fitTerminal, 100);
410
+ }
411
+ }
412
+
413
+ function adjustTextareaHeight() {
414
+ input.style.height = 'auto';
415
+ input.style.height = Math.min(input.scrollHeight, 120) + 'px';
416
+ }
417
+
418
+ // Event listeners
419
+ sendBtn.addEventListener('click', function(e) {
420
+ e.preventDefault();
421
+ submitInput();
422
+ });
423
+
424
+ enterBtn.addEventListener('click', function(e) {
425
+ e.preventDefault();
426
+ sendEnter();
427
+ });
428
+
429
+ runBtn.addEventListener('click', function(e) {
430
+ e.preventDefault();
431
+ runInput();
432
+ });
433
+
434
+ zoomInBtn.addEventListener('click', function(e) {
435
+ e.preventDefault();
436
+ zoomTerminal(2);
437
+ });
438
+
439
+ zoomOutBtn.addEventListener('click', function(e) {
440
+ e.preventDefault();
441
+ zoomTerminal(-2);
442
+ });
443
+
444
+ ctrlBtn.addEventListener('click', function(e) {
445
+ e.preventDefault();
446
+ ctrlActive = !ctrlActive;
447
+ ctrlBtn.classList.toggle('active', ctrlActive);
448
+ if (ctrlActive) {
449
+ altActive = false;
450
+ altBtn.classList.remove('active');
451
+ }
452
+ });
453
+
454
+ altBtn.addEventListener('click', function(e) {
455
+ e.preventDefault();
456
+ altActive = !altActive;
457
+ altBtn.classList.toggle('active', altActive);
458
+ if (altActive) {
459
+ ctrlActive = false;
460
+ ctrlBtn.classList.remove('active');
461
+ }
462
+ });
463
+
464
+ escBtn.addEventListener('click', function(e) {
465
+ e.preventDefault();
466
+ sendEsc();
467
+ });
468
+
469
+ tabBtn.addEventListener('click', function(e) {
470
+ e.preventDefault();
471
+ sendTab();
472
+ });
473
+
474
+ upBtn.addEventListener('click', function(e) {
475
+ e.preventDefault();
476
+ sendUp();
477
+ });
478
+
479
+ downBtn.addEventListener('click', function(e) {
480
+ e.preventDefault();
481
+ sendDown();
482
+ });
483
+
484
+ input.addEventListener('input', adjustTextareaHeight);
485
+
486
+ input.addEventListener('keydown', function(e) {
487
+ if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {
488
+ e.preventDefault();
489
+ submitInput();
490
+ } else if (e.key === 'Escape') {
491
+ e.preventDefault();
492
+ toggleIME(false);
493
+ }
494
+ });
495
+
496
+ toggleBtn.addEventListener('click', function(e) {
497
+ e.preventDefault();
498
+ toggleIME();
499
+ });
500
+
501
+ // Keyboard shortcut: Ctrl+J to toggle IME
502
+ document.addEventListener('keydown', function(e) {
503
+ if (e.ctrlKey && e.key === 'j') {
504
+ e.preventDefault();
505
+ toggleIME();
506
+ }
507
+ });
508
+
509
+ // Auto-show on mobile devices
510
+ if (isMobile) {
511
+ setTimeout(function() {
512
+ toggleIME(true);
513
+ }, 1000);
514
+ }
515
+
516
+ console.log('[IME Helper] Loaded. ' + (isMobile ? 'Mobile mode.' : 'Press Ctrl+J or click keyboard button to toggle.'));
517
+ })();
518
+ </script>
519
+ `;
520
+ export function injectImeHelper(html) {
521
+ // Inject before </body>
522
+ return html.replace('</body>', imeHelperScript + '</body>');
523
+ }
524
+ //# sourceMappingURL=ime-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ime-helper.js","sourceRoot":"","sources":["../../src/daemon/ime-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAigB9B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,wBAAwB;IACxB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC;AAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG5E"}
@@ -1,6 +1,5 @@
1
1
  import { existsSync, mkdirSync, unlinkSync } from 'node:fs';
2
2
  import { createServer as createUnixServer } from 'node:net';
3
- import { fileURLToPath } from 'node:url';
4
3
  import { loadConfig } from '../config/config.js';
5
4
  import { clearDaemonState, getSocketPath, getStateDir, setDaemonState } from '../config/state.js';
6
5
  import { createDaemonServer } from './server.js';
@@ -91,13 +90,6 @@ export async function startDaemon(options = {}) {
91
90
  process.stdin.unref?.();
92
91
  }
93
92
  }
94
- // Run daemon if this file is executed directly
95
- const __filename = fileURLToPath(import.meta.url);
96
- if (process.argv[1] === __filename) {
97
- const foreground = process.argv.includes('-f') || process.argv.includes('--foreground');
98
- startDaemon({ foreground }).catch((err) => {
99
- console.error('Failed to start daemon:', err);
100
- process.exit(1);
101
- });
102
- }
93
+ // Note: Auto-execution removed because compiled Bun binaries always match
94
+ // process.argv[1] === __filename. Use 'ttyd-mux daemon -f' instead.
103
95
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAqC,MAAM,WAAW,CAAC;AAKjG,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA8B/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AAmJD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWzD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAqC,MAAM,WAAW,CAAC;AAOjG,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA2E/D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AAkOD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWzD"}
@@ -1,14 +1,17 @@
1
1
  import { createServer } from 'node:http';
2
+ import { gzipSync } from 'node:zlib';
2
3
  import httpProxy from 'http-proxy';
4
+ import WebSocket, { WebSocketServer } from 'ws';
3
5
  import { getFullPath, normalizeBasePath } from '../config/config.js';
4
6
  import { getDaemonState } from '../config/state.js';
5
7
  import { getErrorMessage } from '../utils/errors.js';
8
+ import { injectImeHelper } from './ime-helper.js';
6
9
  import { generateJsonResponse, generatePortalHtml } from './portal.js';
7
10
  import { allocatePort, listSessions, sessionNameFromDir, startSession, stopSession } from './session-manager.js';
8
- // Create proxy server with WebSocket support
11
+ // Create proxy server for HTTP only
9
12
  const proxy = httpProxy.createProxyServer({
10
- ws: true,
11
- changeOrigin: true
13
+ changeOrigin: true,
14
+ xfwd: true
12
15
  });
13
16
  // Handle proxy errors
14
17
  proxy.on('error', (err, _req, res) => {
@@ -21,6 +24,45 @@ proxy.on('error', (err, _req, res) => {
21
24
  }
22
25
  }
23
26
  });
27
+ // Handle selfHandleResponse for HTML injection
28
+ proxy.on('proxyRes', (proxyRes, req, res) => {
29
+ const httpRes = res;
30
+ // Check if this is a self-handled HTML response
31
+ const contentType = proxyRes.headers['content-type'] ?? '';
32
+ if (!contentType.includes('text/html')) {
33
+ // Not HTML, just pipe through
34
+ httpRes.writeHead(proxyRes.statusCode ?? 200, proxyRes.headers);
35
+ proxyRes.pipe(httpRes);
36
+ return;
37
+ }
38
+ // Check if client supports gzip (stored in custom header before deletion)
39
+ const acceptEncoding = req.originalAcceptEncoding ?? '';
40
+ const supportsGzip = acceptEncoding.includes('gzip');
41
+ // Collect HTML body and inject IME helper
42
+ const chunks = [];
43
+ proxyRes.on('data', (chunk) => chunks.push(chunk));
44
+ proxyRes.on('end', () => {
45
+ const originalHtml = Buffer.concat(chunks).toString('utf-8');
46
+ const modifiedHtml = injectImeHelper(originalHtml);
47
+ // Update headers
48
+ const headers = { ...proxyRes.headers };
49
+ delete headers['content-encoding'];
50
+ if (supportsGzip) {
51
+ // Compress with gzip
52
+ const compressed = gzipSync(modifiedHtml);
53
+ headers['content-encoding'] = 'gzip';
54
+ headers['content-length'] = String(compressed.length);
55
+ httpRes.writeHead(proxyRes.statusCode ?? 200, headers);
56
+ httpRes.end(compressed);
57
+ }
58
+ else {
59
+ // Send uncompressed
60
+ headers['content-length'] = String(Buffer.byteLength(modifiedHtml));
61
+ httpRes.writeHead(proxyRes.statusCode ?? 200, headers);
62
+ httpRes.end(modifiedHtml);
63
+ }
64
+ });
65
+ });
24
66
  export function findSessionForPath(config, path) {
25
67
  const sessions = listSessions();
26
68
  const basePath = normalizeBasePath(config.base_path);
@@ -142,22 +184,91 @@ function handleRequest(config, req, res) {
142
184
  // Try to proxy to a session
143
185
  const session = findSessionForPath(config, url);
144
186
  if (session) {
145
- proxy.web(req, res, { target: `http://localhost:${session.port}` });
187
+ const target = `http://localhost:${session.port}`;
188
+ // Store original Accept-Encoding before deletion (for gzip re-compression)
189
+ req.originalAcceptEncoding =
190
+ req.headers['accept-encoding'];
191
+ // Remove Accept-Encoding to get uncompressed response for HTML injection
192
+ delete req.headers['accept-encoding'];
193
+ // Always use selfHandleResponse to avoid conflicts with proxyRes handler
194
+ proxy.web(req, res, { target, selfHandleResponse: true });
146
195
  return;
147
196
  }
148
197
  // Not found
149
198
  res.writeHead(404, { 'Content-Type': 'text/plain' });
150
199
  res.end('Not Found');
151
200
  }
201
+ // Create WebSocket server (noServer mode for manual upgrade handling)
202
+ const wss = new WebSocketServer({ noServer: true });
152
203
  function handleUpgrade(config, req, socket, head) {
153
204
  const url = req.url ?? '/';
154
205
  const session = findSessionForPath(config, url);
155
- if (session) {
156
- proxy.ws(req, socket, head, { target: `http://localhost:${session.port}` });
157
- }
158
- else {
206
+ if (!session) {
159
207
  socket.destroy();
208
+ return;
160
209
  }
210
+ // Connect to backend WebSocket
211
+ const backendUrl = `ws://127.0.0.1:${session.port}${url}`;
212
+ const protocol = req.headers['sec-websocket-protocol'];
213
+ const backendWs = new WebSocket(backendUrl, protocol ? protocol.split(',').map((p) => p.trim()) : []);
214
+ backendWs.on('open', () => {
215
+ // Upgrade client connection once backend is ready
216
+ wss.handleUpgrade(req, socket, head, (clientWs) => {
217
+ let closed = false;
218
+ const cleanup = (initiator, code, reason) => {
219
+ if (closed)
220
+ return;
221
+ closed = true;
222
+ // Close the other side with proper code
223
+ const closeCode = code ?? 1000;
224
+ const closeReason = reason?.toString() ?? '';
225
+ if (initiator === 'client') {
226
+ if (backendWs.readyState === WebSocket.OPEN) {
227
+ backendWs.close(closeCode, closeReason);
228
+ }
229
+ else {
230
+ backendWs.terminate();
231
+ }
232
+ }
233
+ else {
234
+ if (clientWs.readyState === WebSocket.OPEN) {
235
+ clientWs.close(closeCode, closeReason);
236
+ }
237
+ else {
238
+ clientWs.terminate();
239
+ }
240
+ }
241
+ };
242
+ // Forward messages bidirectionally
243
+ clientWs.on('message', (data, isBinary) => {
244
+ if (backendWs.readyState === WebSocket.OPEN) {
245
+ backendWs.send(data, { binary: isBinary });
246
+ }
247
+ });
248
+ backendWs.on('message', (data, isBinary) => {
249
+ if (clientWs.readyState === WebSocket.OPEN) {
250
+ clientWs.send(data, { binary: isBinary });
251
+ }
252
+ });
253
+ // Handle close events
254
+ clientWs.on('close', (code, reason) => cleanup('client', code, reason));
255
+ backendWs.on('close', (code, reason) => cleanup('backend', code, reason));
256
+ // Handle errors - terminate to ensure cleanup
257
+ clientWs.on('error', () => {
258
+ clientWs.terminate();
259
+ cleanup('client', 1006);
260
+ });
261
+ backendWs.on('error', () => {
262
+ backendWs.terminate();
263
+ cleanup('backend', 1006);
264
+ });
265
+ });
266
+ });
267
+ backendWs.on('error', (err) => {
268
+ console.error(`[WebSocket] Connection error: ${err.message}`);
269
+ backendWs.terminate();
270
+ socket.destroy();
271
+ });
161
272
  }
162
273
  export function createDaemonServer(config) {
163
274
  const server = createServer((req, res) => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { program } from 'commander';
3
+ import pkg from '../package.json' with { type: 'json' };
3
4
  import { attachCommand } from './commands/attach.js';
4
5
  import { caddyRemoveCommand, caddySetupCommand, caddySnippetCommand, caddyStatusCommand } from './commands/caddy.js';
5
6
  import { daemonCommand } from './commands/daemon.js';
@@ -12,7 +13,7 @@ import { upCommand } from './commands/up.js';
12
13
  program
13
14
  .name('ttyd-mux')
14
15
  .description('ttyd session multiplexer - manage multiple ttyd+tmux sessions')
15
- .version('0.2.0');
16
+ .version(pkg.version);
16
17
  // === Main commands ===
17
18
  program
18
19
  .command('up')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ttyd-mux",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "ttyd session multiplexer - manage multiple ttyd+tmux web terminal sessions / 複数の ttyd+tmux Web ターミナルセッションを管理する CLI ツール",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -31,6 +31,7 @@
31
31
  "@types/http-proxy": "^1.17.14",
32
32
  "@types/node": "^22.0.0",
33
33
  "@types/proper-lockfile": "^4.1.4",
34
+ "@types/ws": "^8.18.1",
34
35
  "playwright": "^1.58.2",
35
36
  "typescript": "^5.6.0"
36
37
  },
@@ -63,6 +64,7 @@
63
64
  "commander": "^14.0.2",
64
65
  "http-proxy": "^1.18.1",
65
66
  "proper-lockfile": "^4.1.2",
67
+ "ws": "^8.19.0",
66
68
  "yaml": "^2.6.0",
67
69
  "zod": "^4.3.6"
68
70
  }