@provos/ironcurtain 0.5.1 → 0.7.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 +85 -66
- package/dist/cli-help.d.ts +63 -0
- package/dist/cli-help.js +102 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.js +78 -52
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +136 -2
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/generated/tool-annotations.json +487 -338
- package/dist/config/index.d.ts +21 -1
- package/dist/config/index.js +12 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -8
- package/dist/config/paths.d.ts +30 -0
- package/dist/config/paths.js +58 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/tool-description-hints.json +15 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/user-config.d.ts +21 -0
- package/dist/config/user-config.js +8 -0
- package/dist/config/user-config.js.map +1 -1
- package/dist/cron/compile-task-policy.d.ts +17 -0
- package/dist/cron/compile-task-policy.js +39 -0
- package/dist/cron/compile-task-policy.js.map +1 -0
- package/dist/cron/cron-scheduler.d.ts +65 -0
- package/dist/cron/cron-scheduler.js +184 -0
- package/dist/cron/cron-scheduler.js.map +1 -0
- package/dist/cron/file-lock.d.ts +41 -0
- package/dist/cron/file-lock.js +156 -0
- package/dist/cron/file-lock.js.map +1 -0
- package/dist/cron/format-utils.d.ts +18 -0
- package/dist/cron/format-utils.js +145 -0
- package/dist/cron/format-utils.js.map +1 -0
- package/dist/cron/git-sync.d.ts +22 -0
- package/dist/cron/git-sync.js +121 -0
- package/dist/cron/git-sync.js.map +1 -0
- package/dist/cron/headless-transport.d.ts +27 -0
- package/dist/cron/headless-transport.js +43 -0
- package/dist/cron/headless-transport.js.map +1 -0
- package/dist/cron/job-commands.d.ts +39 -0
- package/dist/cron/job-commands.js +522 -0
- package/dist/cron/job-commands.js.map +1 -0
- package/dist/cron/job-store.d.ts +35 -0
- package/dist/cron/job-store.js +111 -0
- package/dist/cron/job-store.js.map +1 -0
- package/dist/cron/types.d.ts +127 -0
- package/dist/cron/types.js +25 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/daemon/control-socket.d.ts +127 -0
- package/dist/daemon/control-socket.js +261 -0
- package/dist/daemon/control-socket.js.map +1 -0
- package/dist/daemon/daemon-command.d.ts +13 -0
- package/dist/daemon/daemon-command.js +230 -0
- package/dist/daemon/daemon-command.js.map +1 -0
- package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
- package/dist/daemon/ironcurtain-daemon.js +548 -0
- package/dist/daemon/ironcurtain-daemon.js.map +1 -0
- package/dist/docker/adapters/claude-code.js +8 -48
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/goose.d.ts +58 -0
- package/dist/docker/adapters/goose.js +250 -0
- package/dist/docker/adapters/goose.js.map +1 -0
- package/dist/docker/adapters/shared-scripts.d.ts +29 -0
- package/dist/docker/adapters/shared-scripts.js +80 -0
- package/dist/docker/adapters/shared-scripts.js.map +1 -0
- package/dist/docker/agent-adapter.d.ts +12 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.d.ts +6 -1
- package/dist/docker/agent-registry.js +10 -1
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +2 -25
- package/dist/docker/docker-agent-session.js +7 -106
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +8 -0
- package/dist/docker/docker-infrastructure.js +22 -14
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/mitm-proxy.d.ts +5 -2
- package/dist/docker/mitm-proxy.js +169 -46
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/oauth-credentials.d.ts +15 -2
- package/dist/docker/oauth-credentials.js +92 -8
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/oauth-token-manager.d.ts +80 -0
- package/dist/docker/oauth-token-manager.js +133 -0
- package/dist/docker/oauth-token-manager.js.map +1 -0
- package/dist/docker/pty-session.d.ts +2 -0
- package/dist/docker/pty-session.js +17 -8
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/escalation/escalation-watcher.d.ts +2 -0
- package/dist/escalation/escalation-watcher.js +5 -0
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/escalation/listener-command.js +9 -58
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/escalation/listener-lock.d.ts +20 -0
- package/dist/escalation/listener-lock.js +69 -0
- package/dist/escalation/listener-lock.js.map +1 -0
- package/dist/escalation/session-registry.js +1 -14
- package/dist/escalation/session-registry.js.map +1 -1
- package/dist/index.js +51 -2
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-app.d.ts +24 -0
- package/dist/mux/mux-app.js +450 -0
- package/dist/mux/mux-app.js.map +1 -0
- package/dist/mux/mux-command.d.ts +7 -0
- package/dist/mux/mux-command.js +104 -0
- package/dist/mux/mux-command.js.map +1 -0
- package/dist/mux/mux-escalation-manager.d.ts +48 -0
- package/dist/mux/mux-escalation-manager.js +162 -0
- package/dist/mux/mux-escalation-manager.js.map +1 -0
- package/dist/mux/mux-input-handler.d.ts +54 -0
- package/dist/mux/mux-input-handler.js +512 -0
- package/dist/mux/mux-input-handler.js.map +1 -0
- package/dist/mux/mux-renderer.d.ts +106 -0
- package/dist/mux/mux-renderer.js +850 -0
- package/dist/mux/mux-renderer.js.map +1 -0
- package/dist/mux/mux-splash.d.ts +17 -0
- package/dist/mux/mux-splash.js +323 -0
- package/dist/mux/mux-splash.js.map +1 -0
- package/dist/mux/paste-interceptor.d.ts +22 -0
- package/dist/mux/paste-interceptor.js +143 -0
- package/dist/mux/paste-interceptor.js.map +1 -0
- package/dist/mux/pty-bridge.d.ts +79 -0
- package/dist/mux/pty-bridge.js +151 -0
- package/dist/mux/pty-bridge.js.map +1 -0
- package/dist/mux/trusted-input.d.ts +27 -0
- package/dist/mux/trusted-input.js +27 -0
- package/dist/mux/trusted-input.js.map +1 -0
- package/dist/mux/types.d.ts +99 -0
- package/dist/mux/types.js +57 -0
- package/dist/mux/types.js.map +1 -0
- package/dist/pipeline/annotate.js +2 -1
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +4 -34
- package/dist/pipeline/compile.js +29 -568
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.js +1 -1
- package/dist/pipeline/mcp-connections.d.ts +16 -0
- package/dist/pipeline/mcp-connections.js +61 -0
- package/dist/pipeline/mcp-connections.js.map +1 -0
- package/dist/pipeline/pipeline-runner.d.ts +86 -0
- package/dist/pipeline/pipeline-runner.js +554 -0
- package/dist/pipeline/pipeline-runner.js.map +1 -0
- package/dist/pipeline/pipeline-shared.d.ts +29 -2
- package/dist/pipeline/pipeline-shared.js +68 -12
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +38 -12
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.js +2 -1
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/tool-annotator.d.ts +3 -3
- package/dist/pipeline/tool-annotator.js +96 -4
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/pipeline/types.d.ts +52 -0
- package/dist/sandbox/index.js +40 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/session/agent-session.d.ts +3 -0
- package/dist/session/agent-session.js +13 -1
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/index.js +65 -9
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.js +26 -6
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +14 -0
- package/dist/session/prompts.js +39 -2
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +105 -0
- package/dist/session/session-manager.js +134 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/types.d.ts +33 -0
- package/dist/session/workspace-validation.d.ts +19 -0
- package/dist/session/workspace-validation.js +66 -0
- package/dist/session/workspace-validation.js.map +1 -0
- package/dist/signal/bot-command.d.ts +2 -0
- package/dist/signal/bot-command.js +8 -0
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/format.d.ts +27 -0
- package/dist/signal/format.js +59 -0
- package/dist/signal/format.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +27 -25
- package/dist/signal/signal-bot-daemon.js +145 -130
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.js +63 -19
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/signal/signal-transport.js +3 -8
- package/dist/signal/signal-transport.js.map +1 -1
- package/dist/trusted-process/auto-approver.d.ts +13 -4
- package/dist/trusted-process/auto-approver.js +12 -5
- package/dist/trusted-process/auto-approver.js.map +1 -1
- package/dist/trusted-process/domain-utils.d.ts +38 -4
- package/dist/trusted-process/domain-utils.js +118 -11
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/escalation.js +5 -0
- package/dist/trusted-process/escalation.js.map +1 -1
- package/dist/trusted-process/index.js +6 -2
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/mcp-client-manager.js +11 -5
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +2 -0
- package/dist/trusted-process/mcp-proxy-server.js +98 -32
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
- package/dist/trusted-process/permissive-output-validator.js +10 -0
- package/dist/trusted-process/permissive-output-validator.js.map +1 -0
- package/dist/trusted-process/policy-engine.d.ts +27 -4
- package/dist/trusted-process/policy-engine.js +152 -57
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/tool-description-hints.d.ts +19 -0
- package/dist/trusted-process/tool-description-hints.js +53 -0
- package/dist/trusted-process/tool-description-hints.js.map +1 -0
- package/dist/types/argument-roles.d.ts +33 -1
- package/dist/types/argument-roles.js +129 -1
- package/dist/types/argument-roles.js.map +1 -1
- package/docker/Dockerfile.goose +34 -0
- package/docker/entrypoint-goose.sh +30 -0
- package/package.json +6 -1
- package/src/config/generated/tool-annotations.json +487 -338
- package/src/config/mcp-servers.json +2 -8
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MuxInputHandler -- key routing state machine for the terminal multiplexer.
|
|
3
|
+
*
|
|
4
|
+
* Two input modes:
|
|
5
|
+
* - PTY mode: all keystrokes go to the active PtyBridge except Ctrl-A
|
|
6
|
+
* - Command mode: keystrokes collected in a line buffer, dispatched on Enter
|
|
7
|
+
*
|
|
8
|
+
* Ctrl-A toggles between modes (following screen/tmux convention).
|
|
9
|
+
* Pressing Ctrl-A in PTY mode enters command mode; pressing it again
|
|
10
|
+
* returns to PTY mode.
|
|
11
|
+
*/
|
|
12
|
+
import { readdirSync } from 'node:fs';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { expandTilde } from '../types/argument-roles.js';
|
|
15
|
+
import { PASTE_START, PASTE_END } from './paste-interceptor.js';
|
|
16
|
+
/** terminal-kit key names for special keys. */
|
|
17
|
+
const CTRL_A = 'CTRL_A';
|
|
18
|
+
const ENTER = 'ENTER';
|
|
19
|
+
const ESCAPE = 'ESCAPE';
|
|
20
|
+
const CTRL_C = 'CTRL_C';
|
|
21
|
+
const BACKSPACE = 'BACKSPACE';
|
|
22
|
+
const DELETE = 'DELETE';
|
|
23
|
+
const LEFT = 'LEFT';
|
|
24
|
+
const RIGHT = 'RIGHT';
|
|
25
|
+
const UP = 'UP';
|
|
26
|
+
const DOWN = 'DOWN';
|
|
27
|
+
const TAB = 'TAB';
|
|
28
|
+
const HOME = 'HOME';
|
|
29
|
+
const END = 'END';
|
|
30
|
+
/**
|
|
31
|
+
* Maps terminal-kit key names to raw escape sequences for the PTY.
|
|
32
|
+
* terminal-kit emits human-readable names (e.g. 'ENTER'), but the
|
|
33
|
+
* child PTY expects raw bytes (e.g. '\r').
|
|
34
|
+
*/
|
|
35
|
+
const KEY_TO_SEQUENCE = {
|
|
36
|
+
ENTER: '\r',
|
|
37
|
+
BACKSPACE: '\x7f',
|
|
38
|
+
ESCAPE: '\x1b',
|
|
39
|
+
DELETE: '\x1b[3~',
|
|
40
|
+
TAB: '\t',
|
|
41
|
+
UP: '\x1b[A',
|
|
42
|
+
DOWN: '\x1b[B',
|
|
43
|
+
RIGHT: '\x1b[C',
|
|
44
|
+
LEFT: '\x1b[D',
|
|
45
|
+
HOME: '\x1b[H',
|
|
46
|
+
END: '\x1b[F',
|
|
47
|
+
PAGE_UP: '\x1b[5~',
|
|
48
|
+
PAGE_DOWN: '\x1b[6~',
|
|
49
|
+
INSERT: '\x1b[2~',
|
|
50
|
+
// Ctrl keys -> raw bytes
|
|
51
|
+
...Object.fromEntries(Array.from({ length: 26 }, (_, i) => [`CTRL_${String.fromCharCode(65 + i)}`, String.fromCharCode(i + 1)])),
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Splits a path input into the directory portion and the filename prefix.
|
|
55
|
+
*/
|
|
56
|
+
function splitDirPrefix(inputPath) {
|
|
57
|
+
const lastSlash = inputPath.lastIndexOf('/');
|
|
58
|
+
if (lastSlash === -1) {
|
|
59
|
+
return { dir: homedir(), prefix: inputPath };
|
|
60
|
+
}
|
|
61
|
+
return { dir: inputPath.slice(0, lastSlash) || '/', prefix: inputPath.slice(lastSlash + 1) };
|
|
62
|
+
}
|
|
63
|
+
// Cache for directory listings to avoid re-reading on every keystroke
|
|
64
|
+
// when only the prefix (filename portion) changes.
|
|
65
|
+
let _cachedDir = null;
|
|
66
|
+
let _cachedDirents = [];
|
|
67
|
+
/**
|
|
68
|
+
* Reads directory entries for the picker's browse phase.
|
|
69
|
+
* Returns entries matching the prefix, with trailing `/` for directories.
|
|
70
|
+
* Directories are sorted first, then alphabetical.
|
|
71
|
+
* Caches the raw directory listing; only re-reads when the directory changes.
|
|
72
|
+
*/
|
|
73
|
+
function refreshEntries(inputPath) {
|
|
74
|
+
const { dir: rawDir, prefix } = splitDirPrefix(inputPath);
|
|
75
|
+
const dir = expandTilde(rawDir);
|
|
76
|
+
try {
|
|
77
|
+
if (dir !== _cachedDir) {
|
|
78
|
+
_cachedDirents = readdirSync(dir, { withFileTypes: true });
|
|
79
|
+
_cachedDir = dir;
|
|
80
|
+
}
|
|
81
|
+
const entries = [];
|
|
82
|
+
for (const ent of _cachedDirents) {
|
|
83
|
+
if (!ent.name.startsWith(prefix))
|
|
84
|
+
continue;
|
|
85
|
+
if (ent.name.startsWith('.') && !prefix.startsWith('.'))
|
|
86
|
+
continue;
|
|
87
|
+
entries.push({ name: ent.name, isDir: ent.isDirectory() });
|
|
88
|
+
}
|
|
89
|
+
entries.sort((a, b) => {
|
|
90
|
+
if (a.isDir !== b.isDir)
|
|
91
|
+
return a.isDir ? -1 : 1;
|
|
92
|
+
return a.name.localeCompare(b.name);
|
|
93
|
+
});
|
|
94
|
+
return entries.map((e) => (e.isDir ? e.name + '/' : e.name));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Finds the longest common prefix among a list of strings.
|
|
102
|
+
*/
|
|
103
|
+
function longestCommonPrefix(strings) {
|
|
104
|
+
if (strings.length === 0)
|
|
105
|
+
return '';
|
|
106
|
+
let prefix = strings[0];
|
|
107
|
+
for (let i = 1; i < strings.length; i++) {
|
|
108
|
+
while (!strings[i].startsWith(prefix)) {
|
|
109
|
+
prefix = prefix.slice(0, -1);
|
|
110
|
+
if (prefix.length === 0)
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return prefix;
|
|
115
|
+
}
|
|
116
|
+
export function createMuxInputHandler(options) {
|
|
117
|
+
let _mode = options?.initialMode ?? 'pty';
|
|
118
|
+
let _inputBuffer = '';
|
|
119
|
+
let _cursorPos = 0;
|
|
120
|
+
let _pickerState = null;
|
|
121
|
+
function enterPickerMode() {
|
|
122
|
+
_mode = 'picker';
|
|
123
|
+
_pickerState = {
|
|
124
|
+
phase: 'menu',
|
|
125
|
+
menuSelection: 0,
|
|
126
|
+
inputPath: '',
|
|
127
|
+
cursorPos: 0,
|
|
128
|
+
entries: [],
|
|
129
|
+
selectedIndex: 0,
|
|
130
|
+
scrollOffset: 0,
|
|
131
|
+
inList: false,
|
|
132
|
+
error: null,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Resets entry selection and scroll after refreshing entries. */
|
|
136
|
+
function resetEntrySelection(ps) {
|
|
137
|
+
ps.entries = refreshEntries(ps.inputPath);
|
|
138
|
+
ps.selectedIndex = 0;
|
|
139
|
+
ps.scrollOffset = 0;
|
|
140
|
+
}
|
|
141
|
+
function initBrowsePhase(path) {
|
|
142
|
+
if (!_pickerState)
|
|
143
|
+
return;
|
|
144
|
+
const browsePath = path ?? homedir() + '/';
|
|
145
|
+
_pickerState.phase = 'browse';
|
|
146
|
+
_pickerState.inputPath = browsePath;
|
|
147
|
+
_pickerState.cursorPos = browsePath.length;
|
|
148
|
+
_pickerState.inList = false;
|
|
149
|
+
_pickerState.error = null;
|
|
150
|
+
resetEntrySelection(_pickerState);
|
|
151
|
+
}
|
|
152
|
+
function enterBrowseWithError(path, error) {
|
|
153
|
+
_mode = 'picker';
|
|
154
|
+
_pickerState = {
|
|
155
|
+
phase: 'browse',
|
|
156
|
+
menuSelection: 0,
|
|
157
|
+
inputPath: path,
|
|
158
|
+
cursorPos: path.length,
|
|
159
|
+
entries: [],
|
|
160
|
+
selectedIndex: 0,
|
|
161
|
+
scrollOffset: 0,
|
|
162
|
+
inList: false,
|
|
163
|
+
error,
|
|
164
|
+
};
|
|
165
|
+
resetEntrySelection(_pickerState);
|
|
166
|
+
}
|
|
167
|
+
function exitPickerMode() {
|
|
168
|
+
_mode = 'pty';
|
|
169
|
+
_pickerState = null;
|
|
170
|
+
}
|
|
171
|
+
function executeMenuSelection(selection) {
|
|
172
|
+
if (selection === 0) {
|
|
173
|
+
_mode = 'pty';
|
|
174
|
+
_pickerState = null;
|
|
175
|
+
return { kind: 'picker-spawn' };
|
|
176
|
+
}
|
|
177
|
+
initBrowsePhase();
|
|
178
|
+
return { kind: 'redraw-picker' };
|
|
179
|
+
}
|
|
180
|
+
function handleMenuKey(key) {
|
|
181
|
+
const ps = _pickerState;
|
|
182
|
+
if (!ps)
|
|
183
|
+
return { kind: 'none' };
|
|
184
|
+
if (key === '1')
|
|
185
|
+
return executeMenuSelection(0);
|
|
186
|
+
if (key === '2')
|
|
187
|
+
return executeMenuSelection(1);
|
|
188
|
+
if (key === ENTER)
|
|
189
|
+
return executeMenuSelection(ps.menuSelection);
|
|
190
|
+
if (key === UP || key === DOWN) {
|
|
191
|
+
ps.menuSelection = ps.menuSelection === 0 ? 1 : 0;
|
|
192
|
+
return { kind: 'redraw-picker' };
|
|
193
|
+
}
|
|
194
|
+
if (key === ESCAPE || key === CTRL_C) {
|
|
195
|
+
_mode = 'command';
|
|
196
|
+
_pickerState = null;
|
|
197
|
+
return { kind: 'picker-cancel' };
|
|
198
|
+
}
|
|
199
|
+
return { kind: 'none' };
|
|
200
|
+
}
|
|
201
|
+
function handleBrowseKey(key) {
|
|
202
|
+
const ps = _pickerState;
|
|
203
|
+
if (!ps)
|
|
204
|
+
return { kind: 'none' };
|
|
205
|
+
ps.error = null;
|
|
206
|
+
if (key === ESCAPE || key === CTRL_C) {
|
|
207
|
+
if (ps.inList) {
|
|
208
|
+
// Return from list to input field
|
|
209
|
+
ps.inList = false;
|
|
210
|
+
return { kind: 'redraw-picker' };
|
|
211
|
+
}
|
|
212
|
+
// Return to menu phase
|
|
213
|
+
ps.phase = 'menu';
|
|
214
|
+
ps.menuSelection = 0;
|
|
215
|
+
return { kind: 'redraw-picker' };
|
|
216
|
+
}
|
|
217
|
+
// Tab completion (only when in input field)
|
|
218
|
+
if (key === TAB && !ps.inList) {
|
|
219
|
+
if (ps.entries.length === 0) {
|
|
220
|
+
return { kind: 'none' };
|
|
221
|
+
}
|
|
222
|
+
const { dir: dirPart, prefix } = splitDirPrefix(ps.inputPath);
|
|
223
|
+
const base = dirPart === homedir() && !ps.inputPath.includes('/') ? '' : dirPart + '/';
|
|
224
|
+
if (ps.entries.length === 1) {
|
|
225
|
+
ps.inputPath = base + ps.entries[0];
|
|
226
|
+
ps.cursorPos = ps.inputPath.length;
|
|
227
|
+
resetEntrySelection(ps);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
const names = ps.entries.map((e) => e.replace(/\/$/, ''));
|
|
231
|
+
const lcp = longestCommonPrefix(names);
|
|
232
|
+
if (lcp.length > prefix.length) {
|
|
233
|
+
ps.inputPath = base + lcp;
|
|
234
|
+
ps.cursorPos = ps.inputPath.length;
|
|
235
|
+
resetEntrySelection(ps);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return { kind: 'redraw-picker' };
|
|
239
|
+
}
|
|
240
|
+
// Up/Down navigation
|
|
241
|
+
if (key === DOWN) {
|
|
242
|
+
if (!ps.inList) {
|
|
243
|
+
// Move focus from input field into the entry list
|
|
244
|
+
if (ps.entries.length > 0) {
|
|
245
|
+
ps.inList = true;
|
|
246
|
+
ps.selectedIndex = 0;
|
|
247
|
+
ps.scrollOffset = 0;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else if (ps.selectedIndex < ps.entries.length - 1) {
|
|
251
|
+
ps.selectedIndex++;
|
|
252
|
+
}
|
|
253
|
+
return { kind: 'redraw-picker' };
|
|
254
|
+
}
|
|
255
|
+
if (key === UP) {
|
|
256
|
+
if (ps.inList) {
|
|
257
|
+
if (ps.selectedIndex > 0) {
|
|
258
|
+
ps.selectedIndex--;
|
|
259
|
+
if (ps.selectedIndex < ps.scrollOffset) {
|
|
260
|
+
ps.scrollOffset = ps.selectedIndex;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// At top of list — return focus to input field
|
|
265
|
+
ps.inList = false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return { kind: 'redraw-picker' };
|
|
269
|
+
}
|
|
270
|
+
// When in list mode, Enter picks the entry into the input field
|
|
271
|
+
if (key === ENTER && ps.inList) {
|
|
272
|
+
if (ps.selectedIndex < ps.entries.length) {
|
|
273
|
+
const selected = ps.entries[ps.selectedIndex];
|
|
274
|
+
const { dir: dirPart } = splitDirPrefix(ps.inputPath);
|
|
275
|
+
ps.inputPath = dirPart + '/' + selected;
|
|
276
|
+
ps.cursorPos = ps.inputPath.length;
|
|
277
|
+
ps.inList = false;
|
|
278
|
+
resetEntrySelection(ps);
|
|
279
|
+
}
|
|
280
|
+
return { kind: 'redraw-picker' };
|
|
281
|
+
}
|
|
282
|
+
// When in input field, Enter submits the current path
|
|
283
|
+
if (key === ENTER && !ps.inList) {
|
|
284
|
+
if (ps.inputPath.trim()) {
|
|
285
|
+
const workspacePath = ps.inputPath.replace(/\/+$/, '');
|
|
286
|
+
_mode = 'pty';
|
|
287
|
+
_pickerState = null;
|
|
288
|
+
return { kind: 'picker-spawn', workspacePath };
|
|
289
|
+
}
|
|
290
|
+
return { kind: 'redraw-picker' };
|
|
291
|
+
}
|
|
292
|
+
// Keys below only apply when focus is on the input field
|
|
293
|
+
if (ps.inList) {
|
|
294
|
+
return { kind: 'none' };
|
|
295
|
+
}
|
|
296
|
+
// Cursor movement within input path
|
|
297
|
+
if (key === LEFT) {
|
|
298
|
+
if (ps.cursorPos > 0)
|
|
299
|
+
ps.cursorPos--;
|
|
300
|
+
return { kind: 'redraw-picker' };
|
|
301
|
+
}
|
|
302
|
+
if (key === RIGHT) {
|
|
303
|
+
if (ps.cursorPos < ps.inputPath.length)
|
|
304
|
+
ps.cursorPos++;
|
|
305
|
+
return { kind: 'redraw-picker' };
|
|
306
|
+
}
|
|
307
|
+
// Backspace
|
|
308
|
+
if (key === BACKSPACE) {
|
|
309
|
+
if (ps.cursorPos > 0) {
|
|
310
|
+
ps.inputPath = ps.inputPath.slice(0, ps.cursorPos - 1) + ps.inputPath.slice(ps.cursorPos);
|
|
311
|
+
ps.cursorPos--;
|
|
312
|
+
resetEntrySelection(ps);
|
|
313
|
+
}
|
|
314
|
+
return { kind: 'redraw-picker' };
|
|
315
|
+
}
|
|
316
|
+
// Delete
|
|
317
|
+
if (key === DELETE) {
|
|
318
|
+
if (ps.cursorPos < ps.inputPath.length) {
|
|
319
|
+
ps.inputPath = ps.inputPath.slice(0, ps.cursorPos) + ps.inputPath.slice(ps.cursorPos + 1);
|
|
320
|
+
resetEntrySelection(ps);
|
|
321
|
+
}
|
|
322
|
+
return { kind: 'redraw-picker' };
|
|
323
|
+
}
|
|
324
|
+
// Printable character
|
|
325
|
+
if (key.length === 1 && key.charCodeAt(0) >= 32) {
|
|
326
|
+
ps.inputPath = ps.inputPath.slice(0, ps.cursorPos) + key + ps.inputPath.slice(ps.cursorPos);
|
|
327
|
+
ps.cursorPos++;
|
|
328
|
+
resetEntrySelection(ps);
|
|
329
|
+
return { kind: 'redraw-picker' };
|
|
330
|
+
}
|
|
331
|
+
return { kind: 'none' };
|
|
332
|
+
}
|
|
333
|
+
function handlePickerKey(key) {
|
|
334
|
+
if (!_pickerState)
|
|
335
|
+
return { kind: 'none' };
|
|
336
|
+
if (_pickerState.phase === 'menu')
|
|
337
|
+
return handleMenuKey(key);
|
|
338
|
+
return handleBrowseKey(key);
|
|
339
|
+
}
|
|
340
|
+
function handlePtyKey(key) {
|
|
341
|
+
if (key === CTRL_A) {
|
|
342
|
+
_mode = 'command';
|
|
343
|
+
_inputBuffer = '';
|
|
344
|
+
_cursorPos = 0;
|
|
345
|
+
return { kind: 'enter-command-mode' };
|
|
346
|
+
}
|
|
347
|
+
return { kind: 'write-pty', data: KEY_TO_SEQUENCE[key] ?? key };
|
|
348
|
+
}
|
|
349
|
+
function handleCommandKey(key) {
|
|
350
|
+
// Ctrl-A in command mode returns to PTY mode
|
|
351
|
+
if (key === CTRL_A) {
|
|
352
|
+
_mode = 'pty';
|
|
353
|
+
_inputBuffer = '';
|
|
354
|
+
_cursorPos = 0;
|
|
355
|
+
return { kind: 'enter-pty-mode' };
|
|
356
|
+
}
|
|
357
|
+
// Escape or Ctrl-C: clear buffer, stay in command mode
|
|
358
|
+
if (key === ESCAPE || key === CTRL_C) {
|
|
359
|
+
_inputBuffer = '';
|
|
360
|
+
_cursorPos = 0;
|
|
361
|
+
return { kind: 'redraw-input' };
|
|
362
|
+
}
|
|
363
|
+
// Enter: dispatch command or trusted input
|
|
364
|
+
if (key === ENTER) {
|
|
365
|
+
const text = _inputBuffer.trim();
|
|
366
|
+
_inputBuffer = '';
|
|
367
|
+
_cursorPos = 0;
|
|
368
|
+
if (!text) {
|
|
369
|
+
return { kind: 'redraw-input' };
|
|
370
|
+
}
|
|
371
|
+
// Commands start with /
|
|
372
|
+
if (text.startsWith('/')) {
|
|
373
|
+
const parts = text.slice(1).split(/\s+/);
|
|
374
|
+
const command = parts[0].toLowerCase();
|
|
375
|
+
const args = parts.slice(1);
|
|
376
|
+
return { kind: 'command', command, args };
|
|
377
|
+
}
|
|
378
|
+
// Non-command text -> trusted input
|
|
379
|
+
return { kind: 'trusted-input', text };
|
|
380
|
+
}
|
|
381
|
+
// Backspace
|
|
382
|
+
if (key === BACKSPACE) {
|
|
383
|
+
if (_cursorPos > 0) {
|
|
384
|
+
_inputBuffer = _inputBuffer.slice(0, _cursorPos - 1) + _inputBuffer.slice(_cursorPos);
|
|
385
|
+
_cursorPos--;
|
|
386
|
+
return { kind: 'redraw-input' };
|
|
387
|
+
}
|
|
388
|
+
return { kind: 'none' };
|
|
389
|
+
}
|
|
390
|
+
// Delete
|
|
391
|
+
if (key === DELETE) {
|
|
392
|
+
if (_cursorPos < _inputBuffer.length) {
|
|
393
|
+
_inputBuffer = _inputBuffer.slice(0, _cursorPos) + _inputBuffer.slice(_cursorPos + 1);
|
|
394
|
+
return { kind: 'redraw-input' };
|
|
395
|
+
}
|
|
396
|
+
return { kind: 'none' };
|
|
397
|
+
}
|
|
398
|
+
// Arrow keys
|
|
399
|
+
if (key === LEFT) {
|
|
400
|
+
if (_cursorPos > 0) {
|
|
401
|
+
_cursorPos--;
|
|
402
|
+
return { kind: 'redraw-input' };
|
|
403
|
+
}
|
|
404
|
+
return { kind: 'none' };
|
|
405
|
+
}
|
|
406
|
+
if (key === RIGHT) {
|
|
407
|
+
if (_cursorPos < _inputBuffer.length) {
|
|
408
|
+
_cursorPos++;
|
|
409
|
+
return { kind: 'redraw-input' };
|
|
410
|
+
}
|
|
411
|
+
return { kind: 'none' };
|
|
412
|
+
}
|
|
413
|
+
// Up: move to same column on previous line
|
|
414
|
+
if (key === UP) {
|
|
415
|
+
const lastNl = _inputBuffer.lastIndexOf('\n', _cursorPos - 1);
|
|
416
|
+
if (lastNl === -1)
|
|
417
|
+
return { kind: 'none' }; // already on first line
|
|
418
|
+
const col = _cursorPos - lastNl - 1;
|
|
419
|
+
const prevNl = _inputBuffer.lastIndexOf('\n', lastNl - 1);
|
|
420
|
+
const prevLineLen = lastNl - (prevNl + 1);
|
|
421
|
+
_cursorPos = prevNl + 1 + Math.min(col, prevLineLen);
|
|
422
|
+
return { kind: 'redraw-input' };
|
|
423
|
+
}
|
|
424
|
+
// Down: move to same column on next line
|
|
425
|
+
if (key === DOWN) {
|
|
426
|
+
const lastNl = _inputBuffer.lastIndexOf('\n', _cursorPos - 1);
|
|
427
|
+
const col = lastNl === -1 ? _cursorPos : _cursorPos - lastNl - 1;
|
|
428
|
+
const nextNl = _inputBuffer.indexOf('\n', _cursorPos);
|
|
429
|
+
if (nextNl === -1)
|
|
430
|
+
return { kind: 'none' }; // already on last line
|
|
431
|
+
const nextNextNl = _inputBuffer.indexOf('\n', nextNl + 1);
|
|
432
|
+
const nextLineLen = nextNextNl === -1 ? _inputBuffer.length - nextNl - 1 : nextNextNl - nextNl - 1;
|
|
433
|
+
_cursorPos = nextNl + 1 + Math.min(col, nextLineLen);
|
|
434
|
+
return { kind: 'redraw-input' };
|
|
435
|
+
}
|
|
436
|
+
// Home: move cursor to beginning
|
|
437
|
+
if (key === HOME) {
|
|
438
|
+
_cursorPos = 0;
|
|
439
|
+
return { kind: 'redraw-input' };
|
|
440
|
+
}
|
|
441
|
+
// End: move cursor to end
|
|
442
|
+
if (key === END) {
|
|
443
|
+
_cursorPos = _inputBuffer.length;
|
|
444
|
+
return { kind: 'redraw-input' };
|
|
445
|
+
}
|
|
446
|
+
// Alt-1 through Alt-9: quick tab switching
|
|
447
|
+
const altMatch = /^ALT_(\d)$/.exec(key);
|
|
448
|
+
if (altMatch) {
|
|
449
|
+
return { kind: 'command', command: 'tab', args: [altMatch[1]] };
|
|
450
|
+
}
|
|
451
|
+
// Regular printable character
|
|
452
|
+
if (key.length === 1 && key.charCodeAt(0) >= 32) {
|
|
453
|
+
_inputBuffer = _inputBuffer.slice(0, _cursorPos) + key + _inputBuffer.slice(_cursorPos);
|
|
454
|
+
_cursorPos++;
|
|
455
|
+
return { kind: 'redraw-input' };
|
|
456
|
+
}
|
|
457
|
+
return { kind: 'none' };
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
get mode() {
|
|
461
|
+
return _mode;
|
|
462
|
+
},
|
|
463
|
+
get inputBuffer() {
|
|
464
|
+
return _inputBuffer;
|
|
465
|
+
},
|
|
466
|
+
get cursorPos() {
|
|
467
|
+
return _cursorPos;
|
|
468
|
+
},
|
|
469
|
+
get pickerState() {
|
|
470
|
+
return _pickerState;
|
|
471
|
+
},
|
|
472
|
+
enterPickerMode,
|
|
473
|
+
enterBrowseWithError,
|
|
474
|
+
exitPickerMode,
|
|
475
|
+
handleKey(key) {
|
|
476
|
+
if (_mode === 'pty') {
|
|
477
|
+
return handlePtyKey(key);
|
|
478
|
+
}
|
|
479
|
+
if (_mode === 'picker') {
|
|
480
|
+
return handlePickerKey(key);
|
|
481
|
+
}
|
|
482
|
+
return handleCommandKey(key);
|
|
483
|
+
},
|
|
484
|
+
handlePaste(text) {
|
|
485
|
+
if (!text)
|
|
486
|
+
return { kind: 'none' };
|
|
487
|
+
if (_mode === 'pty') {
|
|
488
|
+
return { kind: 'write-pty', data: PASTE_START + text + PASTE_END };
|
|
489
|
+
}
|
|
490
|
+
if (_mode === 'command') {
|
|
491
|
+
// Preserve newlines (normalize line endings to \n)
|
|
492
|
+
const sanitized = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
493
|
+
_inputBuffer = _inputBuffer.slice(0, _cursorPos) + sanitized + _inputBuffer.slice(_cursorPos);
|
|
494
|
+
_cursorPos += sanitized.length;
|
|
495
|
+
return { kind: 'redraw-input' };
|
|
496
|
+
}
|
|
497
|
+
if (_pickerState?.phase === 'browse' && !_pickerState.inList) {
|
|
498
|
+
// Paths are single-line: strip all newlines
|
|
499
|
+
const sanitized = text.replace(/[\r\n]+/g, ' ');
|
|
500
|
+
_pickerState.inputPath =
|
|
501
|
+
_pickerState.inputPath.slice(0, _pickerState.cursorPos) +
|
|
502
|
+
sanitized +
|
|
503
|
+
_pickerState.inputPath.slice(_pickerState.cursorPos);
|
|
504
|
+
_pickerState.cursorPos += sanitized.length;
|
|
505
|
+
resetEntrySelection(_pickerState);
|
|
506
|
+
return { kind: 'redraw-picker' };
|
|
507
|
+
}
|
|
508
|
+
return { kind: 'none' };
|
|
509
|
+
},
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=mux-input-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mux-input-handler.js","sourceRoot":"","sources":["../../src/mux/mux-input-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MuxRenderer -- composes all UI regions into terminal output
|
|
3
|
+
* and draws to the real terminal with throttled rendering.
|
|
4
|
+
*
|
|
5
|
+
* UI regions (top to bottom):
|
|
6
|
+
* [tab bar] 1 row
|
|
7
|
+
* [pty viewport] variable height (fills remaining space)
|
|
8
|
+
* [escalation panel] 0 or N rows (only in command mode with pending escalations)
|
|
9
|
+
* [hint bar] 1 row
|
|
10
|
+
* [input line] 0 or 1 row (only in command mode)
|
|
11
|
+
*
|
|
12
|
+
* The PTY viewport size is constant regardless of input mode.
|
|
13
|
+
* Command-mode UI overlays the bottom of the viewport.
|
|
14
|
+
*/
|
|
15
|
+
import type { Terminal as TerminalType } from '@xterm/headless';
|
|
16
|
+
import { type InputMode, type Layout, type MuxTab } from './types.js';
|
|
17
|
+
import type { ListenerState } from '../escalation/listener-state.js';
|
|
18
|
+
import type { PickerState } from './mux-input-handler.js';
|
|
19
|
+
/** Color type compatible with terminal-kit ScreenBufferHD. */
|
|
20
|
+
export type TermkitColor = number | {
|
|
21
|
+
r: number;
|
|
22
|
+
g: number;
|
|
23
|
+
b: number;
|
|
24
|
+
} | 'default';
|
|
25
|
+
/** A cell translated from xterm.js buffer to terminal-kit format. */
|
|
26
|
+
export interface TranslatedCell {
|
|
27
|
+
readonly char: string;
|
|
28
|
+
readonly width: number;
|
|
29
|
+
readonly fg: TermkitColor;
|
|
30
|
+
readonly bg: TermkitColor;
|
|
31
|
+
readonly bold: boolean;
|
|
32
|
+
readonly italic: boolean;
|
|
33
|
+
readonly underline: boolean;
|
|
34
|
+
readonly dim: boolean;
|
|
35
|
+
readonly inverse: boolean;
|
|
36
|
+
readonly strikethrough: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A visual line produced by soft-wrapping the input buffer. */
|
|
39
|
+
export interface VisualLine {
|
|
40
|
+
/** Content of this visual line (no trailing \n). */
|
|
41
|
+
readonly text: string;
|
|
42
|
+
/** Character offset in the original buffer where this visual line starts. */
|
|
43
|
+
readonly bufferOffset: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Splits the input buffer into visual lines by honoring hard newlines
|
|
47
|
+
* and soft-wrapping at `contentWidth` characters.
|
|
48
|
+
*/
|
|
49
|
+
export declare function computeVisualLines(buffer: string, contentWidth: number): VisualLine[];
|
|
50
|
+
/**
|
|
51
|
+
* Maps a buffer cursor position to a visual row and column
|
|
52
|
+
* within the visual lines array.
|
|
53
|
+
*/
|
|
54
|
+
export declare function cursorToVisualPosition(lines: VisualLine[], cursorPos: number): {
|
|
55
|
+
row: number;
|
|
56
|
+
col: number;
|
|
57
|
+
};
|
|
58
|
+
type TerminalKit = any;
|
|
59
|
+
export interface MuxRenderer {
|
|
60
|
+
/** Full redraw of all regions. */
|
|
61
|
+
fullRedraw(): void;
|
|
62
|
+
/** Incremental redraw of only the PTY viewport. */
|
|
63
|
+
redrawPty(): void;
|
|
64
|
+
/** Redraws just the tab bar. */
|
|
65
|
+
redrawTabBar(): void;
|
|
66
|
+
/** Redraws the command area (escalation panel + hint bar + input). */
|
|
67
|
+
redrawCommandArea(): void;
|
|
68
|
+
/** Handles terminal resize. */
|
|
69
|
+
resize(cols: number, rows: number): void;
|
|
70
|
+
/** Cleans up resources. */
|
|
71
|
+
destroy(): void;
|
|
72
|
+
/** Schedule a throttled PTY redraw. */
|
|
73
|
+
scheduleRedraw(): void;
|
|
74
|
+
/** Shows a transient message in the footer that auto-clears. */
|
|
75
|
+
showMessage(message: string): void;
|
|
76
|
+
/** Current layout. */
|
|
77
|
+
readonly layout: Layout;
|
|
78
|
+
}
|
|
79
|
+
export interface MuxRendererDeps {
|
|
80
|
+
getActiveTab: () => MuxTab | undefined;
|
|
81
|
+
getTabs: () => MuxTab[];
|
|
82
|
+
getActiveTabIndex: () => number;
|
|
83
|
+
getMode: () => InputMode;
|
|
84
|
+
getInputBuffer: () => string;
|
|
85
|
+
getCursorPos: () => number;
|
|
86
|
+
getEscalationState: () => ListenerState;
|
|
87
|
+
getPendingCount: () => number;
|
|
88
|
+
getPickerState: () => PickerState | null;
|
|
89
|
+
/** Returns the active tab's scroll offset (null = live/bottom). */
|
|
90
|
+
getScrollOffset: () => number | null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Creates a MuxRenderer.
|
|
94
|
+
*/
|
|
95
|
+
export declare function createMuxRenderer(term: TerminalKit, cols: number, rows: number, deps: MuxRendererDeps): MuxRenderer;
|
|
96
|
+
/**
|
|
97
|
+
* Reads the headless terminal buffer and translates each cell.
|
|
98
|
+
*/
|
|
99
|
+
export declare function readTerminalBuffer(terminal: TerminalType, startRow: number, rows: number, cols: number): TranslatedCell[][];
|
|
100
|
+
/**
|
|
101
|
+
* Builds the SGR parameter string for a cell's style attributes.
|
|
102
|
+
*/
|
|
103
|
+
export declare function buildSgrSequence(cell: TranslatedCell): string;
|
|
104
|
+
export declare function colorEquals(a: TermkitColor, b: TermkitColor): boolean;
|
|
105
|
+
export declare function cellStyleEquals(a: TranslatedCell, b: TranslatedCell): boolean;
|
|
106
|
+
export {};
|