@provos/ironcurtain 0.5.1 → 0.6.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 (74) hide show
  1. package/README.md +66 -66
  2. package/dist/cli.js +9 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/types.d.ts +6 -0
  5. package/dist/docker/adapters/claude-code.js +1 -1
  6. package/dist/docker/adapters/claude-code.js.map +1 -1
  7. package/dist/docker/docker-infrastructure.js +10 -3
  8. package/dist/docker/docker-infrastructure.js.map +1 -1
  9. package/dist/docker/mitm-proxy.d.ts +5 -2
  10. package/dist/docker/mitm-proxy.js +169 -46
  11. package/dist/docker/mitm-proxy.js.map +1 -1
  12. package/dist/docker/oauth-credentials.d.ts +15 -2
  13. package/dist/docker/oauth-credentials.js +92 -8
  14. package/dist/docker/oauth-credentials.js.map +1 -1
  15. package/dist/docker/oauth-token-manager.d.ts +80 -0
  16. package/dist/docker/oauth-token-manager.js +133 -0
  17. package/dist/docker/oauth-token-manager.js.map +1 -0
  18. package/dist/docker/pty-session.d.ts +2 -0
  19. package/dist/docker/pty-session.js +10 -4
  20. package/dist/docker/pty-session.js.map +1 -1
  21. package/dist/escalation/escalation-watcher.js +2 -0
  22. package/dist/escalation/escalation-watcher.js.map +1 -1
  23. package/dist/escalation/listener-command.js +9 -58
  24. package/dist/escalation/listener-command.js.map +1 -1
  25. package/dist/escalation/listener-lock.d.ts +20 -0
  26. package/dist/escalation/listener-lock.js +69 -0
  27. package/dist/escalation/listener-lock.js.map +1 -0
  28. package/dist/index.js +21 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/mux/mux-app.d.ts +24 -0
  31. package/dist/mux/mux-app.js +445 -0
  32. package/dist/mux/mux-app.js.map +1 -0
  33. package/dist/mux/mux-command.d.ts +7 -0
  34. package/dist/mux/mux-command.js +93 -0
  35. package/dist/mux/mux-command.js.map +1 -0
  36. package/dist/mux/mux-escalation-manager.d.ts +48 -0
  37. package/dist/mux/mux-escalation-manager.js +162 -0
  38. package/dist/mux/mux-escalation-manager.js.map +1 -0
  39. package/dist/mux/mux-input-handler.d.ts +49 -0
  40. package/dist/mux/mux-input-handler.js +457 -0
  41. package/dist/mux/mux-input-handler.js.map +1 -0
  42. package/dist/mux/mux-renderer.d.ts +86 -0
  43. package/dist/mux/mux-renderer.js +758 -0
  44. package/dist/mux/mux-renderer.js.map +1 -0
  45. package/dist/mux/mux-splash.d.ts +17 -0
  46. package/dist/mux/mux-splash.js +322 -0
  47. package/dist/mux/mux-splash.js.map +1 -0
  48. package/dist/mux/pty-bridge.d.ts +79 -0
  49. package/dist/mux/pty-bridge.js +151 -0
  50. package/dist/mux/pty-bridge.js.map +1 -0
  51. package/dist/mux/trusted-input.d.ts +27 -0
  52. package/dist/mux/trusted-input.js +27 -0
  53. package/dist/mux/trusted-input.js.map +1 -0
  54. package/dist/mux/types.d.ts +92 -0
  55. package/dist/mux/types.js +45 -0
  56. package/dist/mux/types.js.map +1 -0
  57. package/dist/sandbox/index.js +4 -0
  58. package/dist/sandbox/index.js.map +1 -1
  59. package/dist/session/agent-session.js +3 -0
  60. package/dist/session/agent-session.js.map +1 -1
  61. package/dist/session/index.js +14 -7
  62. package/dist/session/index.js.map +1 -1
  63. package/dist/session/types.d.ts +6 -0
  64. package/dist/session/workspace-validation.d.ts +17 -0
  65. package/dist/session/workspace-validation.js +65 -0
  66. package/dist/session/workspace-validation.js.map +1 -0
  67. package/dist/trusted-process/auto-approver.d.ts +13 -4
  68. package/dist/trusted-process/auto-approver.js +12 -5
  69. package/dist/trusted-process/auto-approver.js.map +1 -1
  70. package/dist/trusted-process/escalation.js +5 -0
  71. package/dist/trusted-process/escalation.js.map +1 -1
  72. package/dist/trusted-process/mcp-proxy-server.js +39 -16
  73. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  74. package/package.json +6 -1
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Lock management for single-instance enforcement.
3
+ *
4
+ * Shared between `ironcurtain escalation-listener` and `ironcurtain mux`.
5
+ * Uses O_EXCL for atomic lock file creation with PID liveness checks
6
+ * to handle stale locks from crashed processes.
7
+ */
8
+ import { existsSync, readFileSync, unlinkSync, openSync, writeSync, closeSync, constants } from 'node:fs';
9
+ /**
10
+ * Acquires the listener lock file using O_EXCL for atomicity.
11
+ * Returns true if the lock was acquired, false if another instance holds it.
12
+ */
13
+ export function acquireLock(lockPath) {
14
+ if (existsSync(lockPath)) {
15
+ // Check if the PID in the lock file is still alive
16
+ try {
17
+ const content = readFileSync(lockPath, 'utf-8');
18
+ const pid = parseInt(content.trim(), 10);
19
+ if (!isNaN(pid) && isPidAlive(pid)) {
20
+ return false; // Another instance is running
21
+ }
22
+ // Stale lock -- remove and try again
23
+ unlinkSync(lockPath);
24
+ }
25
+ catch {
26
+ // If we can't read the lock, try to recreate it
27
+ try {
28
+ unlinkSync(lockPath);
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ }
35
+ try {
36
+ const fd = openSync(lockPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
37
+ const content = Buffer.from(String(process.pid));
38
+ writeSync(fd, content);
39
+ closeSync(fd);
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Releases the listener lock file. Best-effort -- ignores errors.
48
+ */
49
+ export function releaseLock(lockPath) {
50
+ try {
51
+ unlinkSync(lockPath);
52
+ }
53
+ catch {
54
+ /* best effort */
55
+ }
56
+ }
57
+ /**
58
+ * Checks if a PID is alive using signal 0.
59
+ */
60
+ export function isPidAlive(pid) {
61
+ try {
62
+ process.kill(pid, 0);
63
+ return true;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ //# sourceMappingURL=listener-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener-lock.js","sourceRoot":"","sources":["../../src/escalation/listener-lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE1G;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,mDAAmD;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,CAAC,8BAA8B;YAC9C,CAAC;YACD,qCAAqC;YACrC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,IAAI,CAAC;gBACH,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvB,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -10,12 +10,14 @@ import * as logger from './logger.js';
10
10
  import { CliTransport } from './session/cli-transport.js';
11
11
  import { createSession } from './session/index.js';
12
12
  import { resolveSessionMode } from './session/preflight.js';
13
+ import { validateWorkspacePath } from './session/workspace-validation.js';
13
14
  export async function main(args) {
14
15
  const { values, positionals } = parseArgs({
15
16
  args: args ?? process.argv.slice(2),
16
17
  options: {
17
18
  resume: { type: 'string', short: 'r' },
18
19
  agent: { type: 'string', short: 'a' },
20
+ workspace: { type: 'string', short: 'w' },
19
21
  pty: { type: 'boolean' },
20
22
  'list-agents': { type: 'boolean' },
21
23
  },
@@ -40,7 +42,24 @@ export async function main(args) {
40
42
  const task = positionals.join(' ');
41
43
  const resumeSessionId = values.resume;
42
44
  const agentName = values.agent;
45
+ const rawWorkspace = values.workspace;
43
46
  const config = loadConfig();
47
+ // Disallow combining --resume with --workspace
48
+ if (resumeSessionId && rawWorkspace) {
49
+ process.stderr.write(chalk.red('Error: --resume and --workspace cannot be used together.\n'));
50
+ process.exit(1);
51
+ }
52
+ // Validate --workspace before anything else that uses config
53
+ let workspacePath;
54
+ if (rawWorkspace) {
55
+ try {
56
+ workspacePath = validateWorkspacePath(rawWorkspace, config.protectedPaths);
57
+ }
58
+ catch (error) {
59
+ process.stderr.write(chalk.red(`Invalid workspace: ${error instanceof Error ? error.message : String(error)}\n`));
60
+ process.exit(1);
61
+ }
62
+ }
44
63
  // Pre-flight: resolve session mode (auto-detect or validate explicit --agent)
45
64
  const preflight = await resolveSessionMode({
46
65
  config,
@@ -65,7 +84,7 @@ export async function main(args) {
65
84
  process.exit(1);
66
85
  }
67
86
  const { runPtySession } = await import('./docker/pty-session.js');
68
- await runPtySession({ config, mode });
87
+ await runPtySession({ config, mode, workspacePath });
69
88
  process.exit(0);
70
89
  }
71
90
  // Create the transport first so we can wire its callbacks into the session.
@@ -81,6 +100,7 @@ export async function main(args) {
81
100
  config,
82
101
  mode,
83
102
  resumeSessionId,
103
+ workspacePath,
84
104
  onEscalation: transport.createEscalationHandler(),
85
105
  onEscalationExpired: transport.createEscalationExpiredHandler(),
86
106
  onDiagnostic: transport.createDiagnosticHandler(),
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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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * MuxApp -- top-level orchestrator for the terminal multiplexer.
3
+ *
4
+ * Creates and owns all child components. Handles MuxAction dispatch,
5
+ * tab lifecycle, resize events, trusted input flow, and cleanup.
6
+ */
7
+ export interface MuxApp {
8
+ /** Starts the multiplexer (enters fullscreen, spawns initial session). */
9
+ start(): Promise<void>;
10
+ /** Graceful shutdown: kills all child processes, restores terminal. */
11
+ shutdown(): Promise<void>;
12
+ }
13
+ export interface MuxAppOptions {
14
+ /** Agent to use for PTY sessions. Defaults to 'claude-code'. */
15
+ readonly agent?: string;
16
+ /** Whether to auto-spawn an initial session. Default: true. */
17
+ readonly autoSpawn?: boolean;
18
+ /** Protected paths for workspace validation. */
19
+ readonly protectedPaths?: string[];
20
+ }
21
+ /**
22
+ * Creates and returns a MuxApp.
23
+ */
24
+ export declare function createMuxApp(options: MuxAppOptions): MuxApp;
@@ -0,0 +1,445 @@
1
+ /**
2
+ * MuxApp -- top-level orchestrator for the terminal multiplexer.
3
+ *
4
+ * Creates and owns all child components. Handles MuxAction dispatch,
5
+ * tab lifecycle, resize events, trusted input flow, and cleanup.
6
+ */
7
+ /* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */
8
+ import { createPtyBridge } from './pty-bridge.js';
9
+ import { createMuxInputHandler } from './mux-input-handler.js';
10
+ import { createMuxEscalationManager } from './mux-escalation-manager.js';
11
+ import { createMuxRenderer } from './mux-renderer.js';
12
+ import { writeTrustedUserContext } from './trusted-input.js';
13
+ import { validateWorkspacePath } from '../session/workspace-validation.js';
14
+ import * as logger from '../logger.js';
15
+ /**
16
+ * Creates and returns a MuxApp.
17
+ */
18
+ export function createMuxApp(options) {
19
+ const agent = options.agent ?? 'claude-code';
20
+ const autoSpawn = options.autoSpawn ?? true;
21
+ const protectedPaths = options.protectedPaths ?? [];
22
+ const tabs = [];
23
+ let activeTabIndex = 0;
24
+ let nextTabNumber = 1;
25
+ let running = false;
26
+ // Mouse event constants
27
+ const MOUSE_WHEEL_UP = 'MOUSE_WHEEL_UP';
28
+ const MOUSE_WHEEL_DOWN = 'MOUSE_WHEEL_DOWN';
29
+ const SCROLL_LINES = 3;
30
+ // Components (initialized in start())
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ let term;
33
+ let inputHandler;
34
+ let escalationManager;
35
+ let renderer;
36
+ function getActiveTab() {
37
+ return tabs[activeTabIndex];
38
+ }
39
+ function resolveIroncurtainBin() {
40
+ const script = process.argv[1];
41
+ // If the entry point is a .ts file, we're running via tsx/ts-node --
42
+ // spawn the child through the same runtime. process.execArgv contains
43
+ // the loader flags (e.g. --import tsx/loader) that make .ts imports work.
44
+ if (script && script.endsWith('.ts')) {
45
+ return { bin: process.argv[0], prefixArgs: [...process.execArgv, script] };
46
+ }
47
+ // If running a compiled JS file or via an installed bin, use it directly
48
+ return { bin: script || 'ironcurtain', prefixArgs: [] };
49
+ }
50
+ async function spawnSession(workspacePath) {
51
+ const { columns } = process.stdout;
52
+ const ptyRows = renderer.layout.ptyViewportRows;
53
+ const ptyCols = columns || 80;
54
+ const { bin, prefixArgs } = resolveIroncurtainBin();
55
+ const bridge = await createPtyBridge({
56
+ cols: ptyCols,
57
+ rows: ptyRows,
58
+ ironcurtainBin: bin,
59
+ prefixArgs,
60
+ agent,
61
+ workspacePath,
62
+ });
63
+ const tab = {
64
+ number: nextTabNumber++,
65
+ bridge,
66
+ label: agent,
67
+ status: 'running',
68
+ escalationAvailable: false,
69
+ scrollOffset: null,
70
+ };
71
+ tabs.push(tab);
72
+ // Wire bridge events
73
+ bridge.onOutput(() => {
74
+ // Snap back to live when new output arrives
75
+ if (tab.scrollOffset !== null) {
76
+ tab.scrollOffset = null;
77
+ }
78
+ if (getActiveTab() === tab) {
79
+ renderer.scheduleRedraw();
80
+ }
81
+ });
82
+ bridge.onExit((exitCode) => {
83
+ tab.status = 'exited';
84
+ tab.exitCode = exitCode;
85
+ // Skip UI effects if the mux is shutting down or the tab was already removed
86
+ if (!running || !tabs.includes(tab))
87
+ return;
88
+ if (bridge.sessionId) {
89
+ escalationManager.removeSession(bridge.sessionId);
90
+ }
91
+ renderer.redrawTabBar();
92
+ if (getActiveTab() === tab) {
93
+ showMessage(`Session #${tab.number} exited with code ${exitCode}`);
94
+ }
95
+ process.stderr.write('\x07');
96
+ });
97
+ bridge.onSessionDiscovered((registration) => {
98
+ if (registration && tab.status === 'running') {
99
+ tab.escalationAvailable = true;
100
+ escalationManager.addSession(registration);
101
+ tab.label = registration.label;
102
+ renderer.redrawTabBar();
103
+ }
104
+ else if (!registration) {
105
+ logger.warn(`Could not discover session registration for tab #${tab.number}`);
106
+ tab.escalationAvailable = false;
107
+ }
108
+ });
109
+ return tab;
110
+ }
111
+ function switchTab(index) {
112
+ if (index < 0 || index >= tabs.length)
113
+ return;
114
+ activeTabIndex = index;
115
+ renderer.fullRedraw();
116
+ }
117
+ function closeTab(tabNumber) {
118
+ const index = tabs.findIndex((t) => t.number === tabNumber);
119
+ if (index === -1) {
120
+ showMessage(`No tab #${tabNumber}`);
121
+ return;
122
+ }
123
+ const tab = tabs[index];
124
+ tab.bridge.kill();
125
+ if (tab.bridge.sessionId) {
126
+ escalationManager.removeSession(tab.bridge.sessionId);
127
+ }
128
+ tabs.splice(index, 1);
129
+ if (tabs.length === 0) {
130
+ doShutdown();
131
+ return;
132
+ }
133
+ if (activeTabIndex >= tabs.length) {
134
+ activeTabIndex = tabs.length - 1;
135
+ }
136
+ renderer.fullRedraw();
137
+ }
138
+ /** Adjusts scroll offset by delta lines (negative = up, positive = down). */
139
+ function adjustScroll(tab, delta) {
140
+ const baseY = tab.bridge.terminal.buffer.active.baseY;
141
+ if (baseY === 0)
142
+ return; // no scrollback available
143
+ const current = tab.scrollOffset ?? baseY;
144
+ const newOffset = current + delta;
145
+ if (newOffset >= baseY) {
146
+ tab.scrollOffset = null; // snap to live
147
+ }
148
+ else {
149
+ tab.scrollOffset = Math.max(0, newOffset);
150
+ }
151
+ }
152
+ function showMessage(message) {
153
+ logger.info(message);
154
+ renderer.showMessage(message);
155
+ }
156
+ async function handleAction(action) {
157
+ switch (action.kind) {
158
+ case 'none':
159
+ break;
160
+ case 'write-pty': {
161
+ const active = getActiveTab();
162
+ if (active && active.bridge.alive) {
163
+ active.bridge.write(action.data);
164
+ }
165
+ break;
166
+ }
167
+ case 'enter-command-mode':
168
+ case 'enter-pty-mode':
169
+ renderer.fullRedraw();
170
+ break;
171
+ case 'command':
172
+ handleCommand(action.command, action.args);
173
+ break;
174
+ case 'trusted-input': {
175
+ const active = getActiveTab();
176
+ if (active && active.bridge.alive) {
177
+ if (active.bridge.escalationDir) {
178
+ writeTrustedUserContext(active.bridge.escalationDir, action.text);
179
+ }
180
+ else {
181
+ logger.warn(`Tab #${active.number}: escalation dir not yet available, skipping user-context write`);
182
+ process.stderr.write('\x07');
183
+ }
184
+ // Write text first, then \r separately after a short delay so
185
+ // Claude Code's Ink UI processes them as distinct input events.
186
+ // A single write of "text\r" arrives as one chunk and Ink may
187
+ // not trigger Enter when \r is bundled with preceding text.
188
+ active.bridge.write(action.text);
189
+ const bridge = active.bridge;
190
+ setTimeout(() => {
191
+ if (bridge.alive)
192
+ bridge.write('\r');
193
+ }, 50);
194
+ }
195
+ // Return to PTY mode after sending trusted input
196
+ inputHandler.handleKey('CTRL_A');
197
+ renderer.fullRedraw();
198
+ break;
199
+ }
200
+ case 'redraw-input':
201
+ renderer.redrawCommandArea();
202
+ break;
203
+ case 'enter-picker-mode':
204
+ renderer.fullRedraw();
205
+ break;
206
+ case 'picker-spawn': {
207
+ let validatedPath;
208
+ if (action.workspacePath) {
209
+ try {
210
+ validatedPath = validateWorkspacePath(action.workspacePath, protectedPaths);
211
+ }
212
+ catch (err) {
213
+ inputHandler.enterBrowseWithError(action.workspacePath, err instanceof Error ? err.message : String(err));
214
+ renderer.fullRedraw();
215
+ break;
216
+ }
217
+ }
218
+ const tab = await spawnSession(validatedPath);
219
+ activeTabIndex = tabs.length - 1;
220
+ const suffix = validatedPath ? ` in ${validatedPath}` : '';
221
+ showMessage(`Spawned session #${tab.number}${suffix}`);
222
+ inputHandler.exitPickerMode();
223
+ renderer.fullRedraw();
224
+ break;
225
+ }
226
+ case 'picker-cancel':
227
+ renderer.fullRedraw();
228
+ break;
229
+ case 'redraw-picker':
230
+ renderer.redrawCommandArea();
231
+ break;
232
+ case 'scroll-up':
233
+ case 'scroll-down': {
234
+ const active = getActiveTab();
235
+ if (!active)
236
+ break;
237
+ const delta = action.kind === 'scroll-up' ? -action.amount : action.amount;
238
+ adjustScroll(active, delta);
239
+ renderer.scheduleRedraw();
240
+ break;
241
+ }
242
+ case 'quit':
243
+ doShutdown();
244
+ break;
245
+ }
246
+ }
247
+ function handleCommand(command, args) {
248
+ switch (command) {
249
+ case 'approve':
250
+ case 'deny': {
251
+ const decision = command === 'approve' ? 'approved' : 'denied';
252
+ const arg = args[0];
253
+ if (!arg) {
254
+ showMessage(`Usage: /${command} <number> or /${command} all`);
255
+ break;
256
+ }
257
+ let message;
258
+ if (arg === 'all') {
259
+ message = escalationManager.resolveAll(decision);
260
+ }
261
+ else {
262
+ const num = parseInt(arg, 10);
263
+ if (isNaN(num)) {
264
+ showMessage('Invalid escalation number');
265
+ break;
266
+ }
267
+ message = escalationManager.resolve(num, decision);
268
+ }
269
+ showMessage(message);
270
+ renderer.redrawTabBar();
271
+ renderer.redrawCommandArea();
272
+ break;
273
+ }
274
+ case 'new': {
275
+ inputHandler.enterPickerMode();
276
+ renderer.fullRedraw();
277
+ break;
278
+ }
279
+ case 'tab': {
280
+ const num = parseInt(args[0], 10);
281
+ if (isNaN(num)) {
282
+ showMessage('Usage: /tab <number>');
283
+ break;
284
+ }
285
+ const index = tabs.findIndex((t) => t.number === num);
286
+ if (index === -1) {
287
+ showMessage(`No tab #${num}`);
288
+ break;
289
+ }
290
+ switchTab(index);
291
+ break;
292
+ }
293
+ case 'close': {
294
+ const num = args[0] ? parseInt(args[0], 10) : getActiveTab()?.number;
295
+ if (num === undefined || isNaN(num)) {
296
+ showMessage('Usage: /close [number]');
297
+ break;
298
+ }
299
+ closeTab(num);
300
+ break;
301
+ }
302
+ case 'sessions': {
303
+ const sessionInfo = [...escalationManager.state.sessions.values()]
304
+ .map((s) => ` [${s.displayNumber}] ${s.registration.sessionId.substring(0, 8)} ${s.registration.label}`)
305
+ .join('\n');
306
+ showMessage(sessionInfo || 'No active sessions');
307
+ break;
308
+ }
309
+ case 'quit':
310
+ case 'q':
311
+ doShutdown();
312
+ break;
313
+ default:
314
+ showMessage(`Unknown command: /${command}`);
315
+ }
316
+ }
317
+ function doShutdown() {
318
+ if (!running)
319
+ return;
320
+ running = false;
321
+ for (const tab of tabs) {
322
+ if (tab.bridge.alive) {
323
+ tab.bridge.kill();
324
+ }
325
+ }
326
+ escalationManager.stop();
327
+ if (term) {
328
+ term.grabInput(false);
329
+ term.hideCursor(false);
330
+ term.fullscreen(false);
331
+ term.styleReset();
332
+ }
333
+ renderer.destroy();
334
+ }
335
+ return {
336
+ async start() {
337
+ running = true;
338
+ const terminalKit = await import('terminal-kit');
339
+ // CJS interop: terminal lives on the default export object
340
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
341
+ term = terminalKit.default.terminal ?? terminalKit.terminal;
342
+ term.fullscreen(true);
343
+ term.hideCursor(true);
344
+ term.grabInput({ mouse: 'button' });
345
+ inputHandler = createMuxInputHandler({ initialMode: autoSpawn ? 'pty' : 'command' });
346
+ escalationManager = createMuxEscalationManager();
347
+ const { columns, rows } = process.stdout;
348
+ const cols = columns || 80;
349
+ const totalRows = rows || 24;
350
+ renderer = createMuxRenderer(term, cols, totalRows, {
351
+ getActiveTab,
352
+ getTabs: () => tabs,
353
+ getActiveTabIndex: () => activeTabIndex,
354
+ getMode: () => inputHandler.mode,
355
+ getInputBuffer: () => inputHandler.inputBuffer,
356
+ getCursorPos: () => inputHandler.cursorPos,
357
+ getEscalationState: () => escalationManager.state,
358
+ getPendingCount: () => escalationManager.pendingCount,
359
+ getPickerState: () => inputHandler.pickerState,
360
+ getScrollOffset: () => {
361
+ const active = getActiveTab();
362
+ return active?.scrollOffset ?? null;
363
+ },
364
+ });
365
+ term.on('key', (key) => {
366
+ if (!running)
367
+ return;
368
+ const action = inputHandler.handleKey(key);
369
+ void handleAction(action);
370
+ });
371
+ // Mouse events come through a separate 'mouse' emitter, not 'key'
372
+ term.on('mouse', (name) => {
373
+ if (!running)
374
+ return;
375
+ if (name === MOUSE_WHEEL_UP) {
376
+ void handleAction({ kind: 'scroll-up', amount: SCROLL_LINES });
377
+ }
378
+ else if (name === MOUSE_WHEEL_DOWN) {
379
+ void handleAction({ kind: 'scroll-down', amount: SCROLL_LINES });
380
+ }
381
+ });
382
+ process.stdout.on('resize', () => {
383
+ const { columns: newCols, rows: newRows } = process.stdout;
384
+ if (!newCols || !newRows)
385
+ return;
386
+ renderer.resize(newCols, newRows);
387
+ const layout = renderer.layout;
388
+ for (const tab of tabs) {
389
+ if (tab.bridge.alive) {
390
+ tab.bridge.resize(newCols, layout.ptyViewportRows);
391
+ }
392
+ }
393
+ renderer.fullRedraw();
394
+ });
395
+ escalationManager.onChange(() => {
396
+ renderer.redrawTabBar();
397
+ renderer.redrawCommandArea();
398
+ });
399
+ escalationManager.startRegistryPolling();
400
+ // Back-fill bridge registrations that timed out during initial
401
+ // discovery. When registry polling finds a session whose PID
402
+ // matches a bridge that still has no registration, push it in.
403
+ escalationManager.onSessionDiscovered((reg) => {
404
+ for (const tab of tabs) {
405
+ if (tab.bridge.pid === reg.pid && !tab.bridge.sessionId) {
406
+ tab.bridge.updateRegistration(reg);
407
+ tab.escalationAvailable = true;
408
+ tab.label = reg.label;
409
+ escalationManager.claimSession(reg.sessionId);
410
+ renderer.redrawTabBar();
411
+ break;
412
+ }
413
+ }
414
+ });
415
+ const handleSignal = () => {
416
+ doShutdown();
417
+ };
418
+ process.on('SIGINT', handleSignal);
419
+ process.on('SIGTERM', handleSignal);
420
+ process.on('SIGHUP', handleSignal);
421
+ process.on('exit', () => {
422
+ if (term) {
423
+ term.grabInput(false);
424
+ }
425
+ });
426
+ if (autoSpawn) {
427
+ await spawnSession();
428
+ }
429
+ renderer.fullRedraw();
430
+ await new Promise((resolve) => {
431
+ const checkInterval = setInterval(() => {
432
+ if (!running) {
433
+ clearInterval(checkInterval);
434
+ resolve();
435
+ }
436
+ }, 100);
437
+ });
438
+ },
439
+ // eslint-disable-next-line @typescript-eslint/require-await
440
+ async shutdown() {
441
+ doShutdown();
442
+ },
443
+ };
444
+ }
445
+ //# sourceMappingURL=mux-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mux-app.js","sourceRoot":"","sources":["../../src/mux/mux-app.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2IAA2I;AAE3I,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAA6B,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAkBvC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;IAEpD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,wBAAwB;IACxB,MAAM,cAAc,GAAG,gBAAgB,CAAC;IACxC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;IAC5C,MAAM,YAAY,GAAG,CAAC,CAAC;IAEvB,sCAAsC;IACtC,8DAA8D;IAC9D,IAAI,IAAS,CAAC;IACd,IAAI,YAA8B,CAAC;IACnC,IAAI,iBAAwC,CAAC;IAC7C,IAAI,QAAsB,CAAC;IAE3B,SAAS,YAAY;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,qBAAqB;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,qEAAqE;QACrE,sEAAsE;QACtE,0EAA0E;QAC1E,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,yEAAyE;QACzE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,aAAsB;QAChD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;QAE9B,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,qBAAqB,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,cAAc,EAAE,GAAG;YACnB,UAAU;YACV,KAAK;YACL,aAAa;SACd,CAAC,CAAC;QAEH,MAAM,GAAG,GAAW;YAClB,MAAM,EAAE,aAAa,EAAE;YACvB,MAAM;YACN,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS;YACjB,mBAAmB,EAAE,KAAK;YAC1B,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEf,qBAAqB;QACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;YACnB,4CAA4C;YAC5C,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC9B,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,IAAI,YAAY,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC3B,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,QAAgB,EAAE,EAAE;YACjC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;YACtB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAExB,6EAA6E;YAC7E,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO;YAE5C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,iBAAiB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpD,CAAC;YAED,QAAQ,CAAC,YAAY,EAAE,CAAC;YAExB,IAAI,YAAY,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC3B,WAAW,CAAC,YAAY,GAAG,CAAC,MAAM,qBAAqB,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,mBAAmB,CAAC,CAAC,YAAY,EAAE,EAAE;YAC1C,IAAI,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7C,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAC/B,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC3C,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;gBAC/B,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;iBAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,oDAAoD,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9E,GAAG,CAAC,mBAAmB,GAAG,KAAK,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,SAAS,CAAC,KAAa;QAC9B,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAC9C,cAAc,GAAG,KAAK,CAAC;QACvB,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IAED,SAAS,QAAQ,CAAC,SAAiB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,WAAW,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAElB,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACzB,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IAED,6EAA6E;IAC7E,SAAS,YAAY,CAAC,GAAW,EAAE,KAAa;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACtD,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,CAAC,0BAA0B;QACnD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC;QAC1C,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;QAClC,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,eAAe;QAC1C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,SAAS,WAAW,CAAC,OAAe;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,MAAiB;QAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,MAAM;YAER,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,oBAAoB,CAAC;YAC1B,KAAK,gBAAgB;gBACnB,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YAER,KAAK,SAAS;gBACZ,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM;YAER,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClC,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;wBAChC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpE,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,iEAAiE,CAAC,CAAC;wBACpG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;oBACD,8DAA8D;oBAC9D,gEAAgE;oBAChE,8DAA8D;oBAC9D,4DAA4D;oBAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBAC7B,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,MAAM,CAAC,KAAK;4BAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACT,CAAC;gBACD,iDAAiD;gBACjD,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACjC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YACR,CAAC;YAED,KAAK,cAAc;gBACjB,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM;YAER,KAAK,mBAAmB;gBACtB,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YAER,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,IAAI,aAAiC,CAAC;gBACtC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;oBAC9E,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC1G,QAAQ,CAAC,UAAU,EAAE,CAAC;wBACtB,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC9C,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,WAAW,CAAC,oBAAoB,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;gBACvD,YAAY,CAAC,cAAc,EAAE,CAAC;gBAC9B,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YACR,CAAC;YAED,KAAK,eAAe;gBAClB,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YAER,KAAK,eAAe;gBAClB,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM;YAER,KAAK,WAAW,CAAC;YACjB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM;oBAAE,MAAM;gBACnB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC3E,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC5B,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;YAED,KAAK,MAAM;gBACT,UAAU,EAAE,CAAC;gBACb,MAAM;QACV,CAAC;IACH,CAAC;IAED,SAAS,aAAa,CAAC,OAAe,EAAE,IAAc;QACpD,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,WAAW,CAAC,WAAW,OAAO,iBAAiB,OAAO,MAAM,CAAC,CAAC;oBAC9D,MAAM;gBACR,CAAC;gBACD,IAAI,OAAe,CAAC;gBACpB,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;oBAClB,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBACf,WAAW,CAAC,2BAA2B,CAAC,CAAC;wBACzC,MAAM;oBACR,CAAC;oBACD,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACrD,CAAC;gBACD,WAAW,CAAC,OAAO,CAAC,CAAC;gBACrB,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACxB,QAAQ,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,YAAY,CAAC,eAAe,EAAE,CAAC;gBAC/B,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM;YACR,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACf,WAAW,CAAC,sBAAsB,CAAC,CAAC;oBACpC,MAAM;gBACR,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;gBACtD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjB,WAAW,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;oBAC9B,MAAM;gBACR,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,MAAM;YACR,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC;gBACrE,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,WAAW,CAAC,wBAAwB,CAAC,CAAC;oBACtC,MAAM;gBACR,CAAC;gBACD,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,WAAW,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;qBAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;qBACxG,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,WAAW,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC;gBACjD,MAAM;YACR,CAAC;YAED,KAAK,MAAM,CAAC;YACZ,KAAK,GAAG;gBACN,UAAU,EAAE,CAAC;gBACb,MAAM;YAER;gBACE,WAAW,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,SAAS,UAAU;QACjB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,GAAG,KAAK,CAAC;QAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAED,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAEzB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAED,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK;YACT,OAAO,GAAG,IAAI,CAAC;YAEf,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACjD,2DAA2D;YAC3D,8DAA8D;YAC9D,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAK,WAAmB,CAAC,QAAQ,CAAC;YAErE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEpC,YAAY,GAAG,qBAAqB,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACrF,iBAAiB,GAAG,0BAA0B,EAAE,CAAC;YAEjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YACzC,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAE7B,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;gBAClD,YAAY;gBACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;gBACnB,iBAAiB,EAAE,GAAG,EAAE,CAAC,cAAc;gBACvC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI;gBAChC,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW;gBAC9C,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS;gBAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK;gBACjD,eAAe,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,YAAY;gBACrD,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW;gBAC9C,eAAe,EAAE,GAAG,EAAE;oBACpB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;oBAC9B,OAAO,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;gBACtC,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE;gBAC7B,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC3C,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,kEAAkE;YAClE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;gBAChC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;oBAC5B,KAAK,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACrC,KAAK,YAAY,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC3D,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAEjC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAElC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBACrB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC9B,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACxB,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,iBAAiB,CAAC,oBAAoB,EAAE,CAAC;YAEzC,+DAA+D;YAC/D,6DAA6D;YAC7D,+DAA+D;YAC/D,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;wBACxD,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;wBACnC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;wBAC/B,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;wBACtB,iBAAiB,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC9C,QAAQ,CAAC,YAAY,EAAE,CAAC;wBACxB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,GAAS,EAAE;gBAC9B,UAAU,EAAE,CAAC;YACf,CAAC,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACpC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAEnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,YAAY,EAAE,CAAC;YACvB,CAAC;YAED,QAAQ,CAAC,UAAU,EAAE,CAAC;YAEtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;oBACrC,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,aAAa,CAAC,aAAa,CAAC,CAAC;wBAC7B,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC;QAED,4DAA4D;QAC5D,KAAK,CAAC,QAAQ;YACZ,UAAU,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI entry point for `ironcurtain mux`.
3
+ *
4
+ * Parses command-line options, loads config, acquires the listener lock,
5
+ * creates the MuxApp, and runs until quit.
6
+ */
7
+ export declare function main(args?: string[]): Promise<void>;