codevf 1.0.0 → 1.0.2

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 (203) hide show
  1. package/LICENSE +30 -21
  2. package/README.md +7 -2
  3. package/bin/codevf-mcp.js +11 -0
  4. package/dist/commands/fix.d.ts +5 -1
  5. package/dist/commands/fix.d.ts.map +1 -1
  6. package/dist/commands/fix.js +170 -13
  7. package/dist/commands/fix.js.map +1 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +72 -2
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/mcp-tools.d.ts +17 -0
  12. package/dist/commands/mcp-tools.d.ts.map +1 -0
  13. package/dist/commands/mcp-tools.js +237 -0
  14. package/dist/commands/mcp-tools.js.map +1 -0
  15. package/dist/commands/setup.d.ts +8 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +250 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/welcome.d.ts +9 -0
  20. package/dist/commands/welcome.d.ts.map +1 -0
  21. package/dist/commands/welcome.js +175 -0
  22. package/dist/commands/welcome.js.map +1 -0
  23. package/dist/index.js +263 -207
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/api/client.d.ts +28 -0
  26. package/dist/lib/api/client.d.ts.map +1 -0
  27. package/dist/lib/api/client.js +66 -0
  28. package/dist/lib/api/client.js.map +1 -0
  29. package/dist/lib/api/projects.d.ts +32 -0
  30. package/dist/lib/api/projects.d.ts.map +1 -0
  31. package/dist/lib/api/projects.js +61 -0
  32. package/dist/lib/api/projects.js.map +1 -0
  33. package/dist/lib/api/tasks.d.ts +36 -0
  34. package/dist/lib/api/tasks.d.ts.map +1 -0
  35. package/dist/lib/api/tasks.js +62 -0
  36. package/dist/lib/api/tasks.js.map +1 -0
  37. package/dist/lib/api/websocket.d.ts +50 -0
  38. package/dist/lib/api/websocket.d.ts.map +1 -0
  39. package/dist/lib/api/websocket.js +153 -0
  40. package/dist/lib/api/websocket.js.map +1 -0
  41. package/dist/lib/auth/oauth-flow.d.ts +37 -0
  42. package/dist/lib/auth/oauth-flow.d.ts.map +1 -0
  43. package/dist/lib/auth/oauth-flow.js +119 -0
  44. package/dist/lib/auth/oauth-flow.js.map +1 -0
  45. package/dist/lib/auth/token-manager.d.ts +26 -0
  46. package/dist/lib/auth/token-manager.d.ts.map +1 -0
  47. package/dist/lib/auth/token-manager.js +87 -0
  48. package/dist/lib/auth/token-manager.js.map +1 -0
  49. package/dist/lib/config/manager.d.ts +50 -0
  50. package/dist/lib/config/manager.d.ts.map +1 -0
  51. package/dist/lib/config/manager.js +84 -0
  52. package/dist/lib/config/manager.js.map +1 -0
  53. package/dist/lib/utils/errors.d.ts +28 -0
  54. package/dist/lib/utils/errors.d.ts.map +1 -0
  55. package/dist/lib/utils/errors.js +44 -0
  56. package/dist/lib/utils/errors.js.map +1 -0
  57. package/dist/lib/utils/logger.d.ts +20 -0
  58. package/dist/lib/utils/logger.d.ts.map +1 -0
  59. package/dist/lib/utils/logger.js +40 -0
  60. package/dist/lib/utils/logger.js.map +1 -0
  61. package/dist/mcp/index.d.ts +7 -0
  62. package/dist/mcp/index.d.ts.map +1 -0
  63. package/dist/mcp/index.js +160 -0
  64. package/dist/mcp/index.js.map +1 -0
  65. package/dist/mcp/tools/chat.d.ts +30 -0
  66. package/dist/mcp/tools/chat.d.ts.map +1 -0
  67. package/dist/mcp/tools/chat.js +82 -0
  68. package/dist/mcp/tools/chat.js.map +1 -0
  69. package/dist/mcp/tools/instant.d.ts +38 -0
  70. package/dist/mcp/tools/instant.d.ts.map +1 -0
  71. package/dist/mcp/tools/instant.js +106 -0
  72. package/dist/mcp/tools/instant.js.map +1 -0
  73. package/dist/modules/aiAgent.d.ts +75 -0
  74. package/dist/modules/aiAgent.d.ts.map +1 -0
  75. package/dist/modules/aiAgent.js +707 -0
  76. package/dist/modules/aiAgent.js.map +1 -0
  77. package/dist/modules/api.d.ts +7 -0
  78. package/dist/modules/api.d.ts.map +1 -1
  79. package/dist/modules/api.js +13 -4
  80. package/dist/modules/api.js.map +1 -1
  81. package/dist/modules/commandHandler.d.ts +40 -0
  82. package/dist/modules/commandHandler.d.ts.map +1 -0
  83. package/dist/modules/commandHandler.js +328 -0
  84. package/dist/modules/commandHandler.js.map +1 -0
  85. package/dist/modules/config.d.ts +2 -0
  86. package/dist/modules/config.d.ts.map +1 -1
  87. package/dist/modules/config.js +9 -0
  88. package/dist/modules/config.js.map +1 -1
  89. package/dist/modules/constants.d.ts +83 -0
  90. package/dist/modules/constants.d.ts.map +1 -0
  91. package/dist/modules/constants.js +75 -0
  92. package/dist/modules/constants.js.map +1 -0
  93. package/dist/modules/permissions.d.ts +14 -0
  94. package/dist/modules/permissions.d.ts.map +1 -1
  95. package/dist/modules/permissions.js +94 -0
  96. package/dist/modules/permissions.js.map +1 -1
  97. package/dist/modules/toolRegistry.d.ts +50 -0
  98. package/dist/modules/toolRegistry.d.ts.map +1 -0
  99. package/dist/modules/toolRegistry.js +114 -0
  100. package/dist/modules/toolRegistry.js.map +1 -0
  101. package/dist/modules/tunnel.d.ts +33 -0
  102. package/dist/modules/tunnel.d.ts.map +1 -0
  103. package/dist/modules/tunnel.js +79 -0
  104. package/dist/modules/tunnel.js.map +1 -0
  105. package/dist/modules/vibeHelper.d.ts +16 -0
  106. package/dist/modules/vibeHelper.d.ts.map +1 -0
  107. package/dist/modules/vibeHelper.js +38 -0
  108. package/dist/modules/vibeHelper.js.map +1 -0
  109. package/dist/modules/websocket.d.ts +9 -0
  110. package/dist/modules/websocket.d.ts.map +1 -1
  111. package/dist/modules/websocket.js +70 -0
  112. package/dist/modules/websocket.js.map +1 -1
  113. package/dist/tools/consultEngineer.d.ts +13 -0
  114. package/dist/tools/consultEngineer.d.ts.map +1 -0
  115. package/dist/tools/consultEngineer.js +161 -0
  116. package/dist/tools/consultEngineer.js.map +1 -0
  117. package/dist/tools/realtimeChat.d.ts +9 -0
  118. package/dist/tools/realtimeChat.d.ts.map +1 -0
  119. package/dist/tools/realtimeChat.js +101 -0
  120. package/dist/tools/realtimeChat.js.map +1 -0
  121. package/dist/types/index.d.ts +183 -0
  122. package/dist/types/index.d.ts.map +1 -1
  123. package/dist/types/index.js.map +1 -1
  124. package/dist/ui/InteractiveApp.d.ts +13 -0
  125. package/dist/ui/InteractiveApp.d.ts.map +1 -0
  126. package/dist/ui/InteractiveApp.js +84 -0
  127. package/dist/ui/InteractiveApp.js.map +1 -0
  128. package/dist/ui/InteractivePrompt.d.ts +53 -0
  129. package/dist/ui/InteractivePrompt.d.ts.map +1 -0
  130. package/dist/ui/InteractivePrompt.js +422 -0
  131. package/dist/ui/InteractivePrompt.js.map +1 -0
  132. package/dist/ui/LiveSession.d.ts +2 -0
  133. package/dist/ui/LiveSession.d.ts.map +1 -1
  134. package/dist/ui/LiveSession.js +461 -180
  135. package/dist/ui/LiveSession.js.map +1 -1
  136. package/dist/ui/PromptInput.d.ts +14 -0
  137. package/dist/ui/PromptInput.d.ts.map +1 -0
  138. package/dist/ui/PromptInput.js +206 -0
  139. package/dist/ui/PromptInput.js.map +1 -0
  140. package/dist/ui/SessionUI.d.ts +40 -0
  141. package/dist/ui/SessionUI.d.ts.map +1 -0
  142. package/dist/ui/SessionUI.js +218 -0
  143. package/dist/ui/SessionUI.js.map +1 -0
  144. package/dist/ui/input/Command.d.ts +22 -0
  145. package/dist/ui/input/Command.d.ts.map +1 -0
  146. package/dist/ui/input/Command.js +30 -0
  147. package/dist/ui/input/Command.js.map +1 -0
  148. package/dist/ui/input/CustomInput.d.ts +15 -0
  149. package/dist/ui/input/CustomInput.d.ts.map +1 -0
  150. package/dist/ui/input/CustomInput.js +182 -0
  151. package/dist/ui/input/CustomInput.js.map +1 -0
  152. package/dist/ui/input/handlers/handleCursor.d.ts +22 -0
  153. package/dist/ui/input/handlers/handleCursor.d.ts.map +1 -0
  154. package/dist/ui/input/handlers/handleCursor.js +53 -0
  155. package/dist/ui/input/handlers/handleCursor.js.map +1 -0
  156. package/dist/ui/input/handlers/handleEdit.d.ts +18 -0
  157. package/dist/ui/input/handlers/handleEdit.d.ts.map +1 -0
  158. package/dist/ui/input/handlers/handleEdit.js +55 -0
  159. package/dist/ui/input/handlers/handleEdit.js.map +1 -0
  160. package/dist/ui/input/handlers/handleHistory.d.ts +18 -0
  161. package/dist/ui/input/handlers/handleHistory.d.ts.map +1 -0
  162. package/dist/ui/input/handlers/handleHistory.js +85 -0
  163. package/dist/ui/input/handlers/handleHistory.js.map +1 -0
  164. package/dist/ui/input/handlers/handlePaste.d.ts +19 -0
  165. package/dist/ui/input/handlers/handlePaste.d.ts.map +1 -0
  166. package/dist/ui/input/handlers/handlePaste.js +49 -0
  167. package/dist/ui/input/handlers/handlePaste.js.map +1 -0
  168. package/dist/ui/input/handlers/handleSubmit.d.ts +18 -0
  169. package/dist/ui/input/handlers/handleSubmit.d.ts.map +1 -0
  170. package/dist/ui/input/handlers/handleSubmit.js +39 -0
  171. package/dist/ui/input/handlers/handleSubmit.js.map +1 -0
  172. package/dist/ui/input/helpers.d.ts +4 -0
  173. package/dist/ui/input/helpers.d.ts.map +1 -0
  174. package/dist/ui/input/helpers.js +13 -0
  175. package/dist/ui/input/helpers.js.map +1 -0
  176. package/dist/ui/input/keyMatchers.d.ts +14 -0
  177. package/dist/ui/input/keyMatchers.d.ts.map +1 -0
  178. package/dist/ui/input/keyMatchers.js +49 -0
  179. package/dist/ui/input/keyMatchers.js.map +1 -0
  180. package/dist/ui/input/types.d.ts +33 -0
  181. package/dist/ui/input/types.d.ts.map +1 -0
  182. package/dist/ui/input/types.js +2 -0
  183. package/dist/ui/input/types.js.map +1 -0
  184. package/dist/ui/promptWithModes.d.ts +12 -0
  185. package/dist/ui/promptWithModes.d.ts.map +1 -0
  186. package/dist/ui/promptWithModes.js +24 -0
  187. package/dist/ui/promptWithModes.js.map +1 -0
  188. package/dist/ui/renderPrompt.d.ts +12 -0
  189. package/dist/ui/renderPrompt.d.ts.map +1 -0
  190. package/dist/ui/renderPrompt.js +14 -0
  191. package/dist/ui/renderPrompt.js.map +1 -0
  192. package/dist/ui/simplePrompt.d.ts +7 -0
  193. package/dist/ui/simplePrompt.d.ts.map +1 -0
  194. package/dist/ui/simplePrompt.js +38 -0
  195. package/dist/ui/simplePrompt.js.map +1 -0
  196. package/dist/ui/spinner.d.ts +7 -0
  197. package/dist/ui/spinner.d.ts.map +1 -0
  198. package/dist/ui/spinner.js +13 -0
  199. package/dist/ui/spinner.js.map +1 -0
  200. package/package.json +36 -26
  201. package/ARCHITECTURE.md +0 -285
  202. package/BUILD_SUMMARY.md +0 -340
  203. package/QUICKSTART.md +0 -180
@@ -0,0 +1,422 @@
1
+ import readline from 'readline';
2
+ import chalk from 'chalk';
3
+ import { PASTE_DETECTION, KEYBOARD } from '../modules/constants.js';
4
+ /**
5
+ * Interactive prompt handler with advanced paste detection and mode switching
6
+ */
7
+ export class InteractivePrompt {
8
+ constructor(options) {
9
+ this.rl = null;
10
+ this.wasRaw = false;
11
+ this.options = options;
12
+ this.state = {
13
+ buffer: '',
14
+ historyIndex: options.history?.length || 0,
15
+ ctrlCPressed: false,
16
+ inPasteMode: false,
17
+ lastKeyTime: 0,
18
+ blockReturnsUntil: 0,
19
+ autoAccept: options.autoAcceptMode,
20
+ pasteBuffer: '',
21
+ bracketedPaste: false,
22
+ hasNewlines: false,
23
+ };
24
+ }
25
+ /**
26
+ * Read a line of input with tab toggle support for mode switching
27
+ */
28
+ async readLine() {
29
+ return new Promise((resolve) => {
30
+ this.enableBracketedPasteMode();
31
+ this.setupReadline();
32
+ this.attachKeyPressListener(resolve);
33
+ this.render();
34
+ });
35
+ }
36
+ enableBracketedPasteMode() {
37
+ if (process.stdout.isTTY) {
38
+ process.stdout.write('\x1b[?2004h');
39
+ }
40
+ }
41
+ disableBracketedPasteMode() {
42
+ if (process.stdout.isTTY) {
43
+ process.stdout.write('\x1b[?2004l');
44
+ }
45
+ }
46
+ setupReadline() {
47
+ this.rl = readline.createInterface({
48
+ input: process.stdin,
49
+ output: process.stdout,
50
+ terminal: true,
51
+ });
52
+ readline.emitKeypressEvents(process.stdin, this.rl);
53
+ this.wasRaw = process.stdin.isTTY ? process.stdin.isRaw : false;
54
+ if (process.stdin.isTTY) {
55
+ process.stdin.setRawMode(true);
56
+ }
57
+ }
58
+ attachKeyPressListener(resolve) {
59
+ const onKeyPress = (str, key) => {
60
+ this.handleKeyPress(str, key, resolve);
61
+ };
62
+ process.stdin.on('keypress', onKeyPress);
63
+ }
64
+ handleKeyPress(str, key, resolve) {
65
+ const now = Date.now();
66
+ // Handle bracketed paste mode
67
+ if (this.handleBracketedPaste(key, now)) {
68
+ return;
69
+ }
70
+ // Detect paste mode
71
+ this.detectPasteMode(str, now);
72
+ // Handle specific keys
73
+ if (this.handleSpecialKeys(str, key, now, resolve)) {
74
+ return;
75
+ }
76
+ // Handle regular character input
77
+ this.handleCharacterInput(str, key, now);
78
+ }
79
+ handleBracketedPaste(key, now) {
80
+ if (key.sequence === '\x1b[200~' || key.name === 'paste-start') {
81
+ this.state.inPasteMode = true;
82
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.EXTENDED_BLOCK_MS;
83
+ this.state.pasteBuffer = '';
84
+ this.state.bracketedPaste = true;
85
+ this.state.lastKeyTime = now;
86
+ return true;
87
+ }
88
+ if (key.sequence === '\x1b[201~' || key.name === 'paste-end') {
89
+ this.state.inPasteMode = false;
90
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.POST_PASTE_BLOCK_MS;
91
+ if (this.state.pasteBuffer) {
92
+ this.state.buffer += this.state.pasteBuffer;
93
+ this.state.pasteBuffer = '';
94
+ this.updateMultilineState();
95
+ }
96
+ this.state.bracketedPaste = false;
97
+ this.state.lastKeyTime = now;
98
+ this.render();
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ detectPasteMode(str, now) {
104
+ const timeSinceLastKey = now - this.state.lastKeyTime;
105
+ // Multi-character input at once is definitely paste
106
+ if (str && str.length > 1 && !this.state.inPasteMode) {
107
+ this.state.inPasteMode = true;
108
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.EXTENDED_BLOCK_MS;
109
+ this.state.pasteBuffer = '';
110
+ }
111
+ // Rapid input detection (keys arriving faster than threshold)
112
+ if (timeSinceLastKey < KEYBOARD.RAPID_KEY_THRESHOLD_MS &&
113
+ timeSinceLastKey > 0 &&
114
+ !this.state.inPasteMode) {
115
+ this.state.inPasteMode = true;
116
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.EXTENDED_BLOCK_MS;
117
+ this.state.pasteBuffer = '';
118
+ }
119
+ // Extend paste mode if keys keep arriving
120
+ if (this.state.inPasteMode && !this.state.bracketedPaste && timeSinceLastKey < PASTE_DETECTION.GAP_MS) {
121
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.EXTENDED_BLOCK_MS;
122
+ }
123
+ // End paste mode after gap threshold
124
+ if (this.state.inPasteMode && !this.state.bracketedPaste && timeSinceLastKey >= PASTE_DETECTION.GAP_MS) {
125
+ this.state.inPasteMode = false;
126
+ this.state.lastKeyTime = now;
127
+ if (this.state.pasteBuffer) {
128
+ this.state.buffer += this.state.pasteBuffer;
129
+ this.state.pasteBuffer = '';
130
+ this.updateMultilineState();
131
+ }
132
+ setTimeout(() => this.render(), 0);
133
+ return;
134
+ }
135
+ this.state.lastKeyTime = now;
136
+ }
137
+ handleSpecialKeys(str, key, now, resolve) {
138
+ if (key.sequence === '\u0003') {
139
+ return this.handleCtrlC(resolve);
140
+ }
141
+ if (key.name === 'up') {
142
+ return this.handleHistoryUp();
143
+ }
144
+ if (key.name === 'down') {
145
+ return this.handleHistoryDown();
146
+ }
147
+ if (key.name === 'tab') {
148
+ return this.handleTab(key);
149
+ }
150
+ if (key.name === 'return') {
151
+ return this.handleReturn(now, resolve);
152
+ }
153
+ if (key.name === 'backspace' || key.sequence === '\u007f') {
154
+ return this.handleBackspace();
155
+ }
156
+ return false;
157
+ }
158
+ handleCtrlC(resolve) {
159
+ if (this.state.buffer.length > 0) {
160
+ this.state.buffer = '';
161
+ this.state.ctrlCPressed = false;
162
+ this.render();
163
+ }
164
+ else if (this.state.ctrlCPressed) {
165
+ process.stdout.write('\n');
166
+ readline.clearLine(process.stdout, 0);
167
+ readline.cursorTo(process.stdout, 0);
168
+ console.log(chalk.dim(' Exiting...'));
169
+ process.exit(0);
170
+ }
171
+ else {
172
+ this.state.ctrlCPressed = true;
173
+ setTimeout(() => {
174
+ this.state.ctrlCPressed = false;
175
+ }, KEYBOARD.CTRL_C_TIMEOUT_MS);
176
+ }
177
+ return true;
178
+ }
179
+ handleHistoryUp() {
180
+ const history = this.options.history || [];
181
+ if (this.state.historyIndex > 0) {
182
+ this.state.historyIndex--;
183
+ this.state.buffer = history[this.state.historyIndex];
184
+ this.render();
185
+ }
186
+ return true;
187
+ }
188
+ handleHistoryDown() {
189
+ const history = this.options.history || [];
190
+ if (this.state.historyIndex < history.length - 1) {
191
+ this.state.historyIndex++;
192
+ this.state.buffer = history[this.state.historyIndex];
193
+ this.render();
194
+ }
195
+ else if (this.state.historyIndex === history.length - 1) {
196
+ this.state.historyIndex = history.length;
197
+ this.state.buffer = '';
198
+ this.render();
199
+ }
200
+ return true;
201
+ }
202
+ handleTab(key) {
203
+ if (this.state.inPasteMode) {
204
+ this.state.buffer += '\t';
205
+ return true;
206
+ }
207
+ if (key.shift) {
208
+ this.toggleAutoAccept();
209
+ }
210
+ else {
211
+ this.toggleMode();
212
+ }
213
+ this.render();
214
+ return true;
215
+ }
216
+ toggleAutoAccept() {
217
+ this.state.autoAccept = !this.state.autoAccept;
218
+ this.options.onAutoAcceptToggle(this.state.autoAccept);
219
+ console.log(chalk.yellow(`\n [!] Auto-accept mode ${this.state.autoAccept ? 'activated' : 'deactivated'}`));
220
+ console.log(this.state.autoAccept
221
+ ? chalk.dim(' AI responses will be automatically accepted')
222
+ : chalk.dim(' AI responses will ask for confirmation'));
223
+ }
224
+ toggleMode() {
225
+ if (!this.options.aiEnabled) {
226
+ console.log(chalk.yellow('\n [!] AI mode not available'));
227
+ console.log(chalk.dim(' Run ') + chalk.white('codevf init') + chalk.dim(' to enable'));
228
+ return;
229
+ }
230
+ // Cycle through: hybrid -> ai -> human -> hybrid
231
+ if (this.options.routingMode === 'hybrid') {
232
+ this.options.routingMode = 'ai';
233
+ }
234
+ else if (this.options.routingMode === 'ai') {
235
+ this.options.routingMode = 'human';
236
+ }
237
+ else {
238
+ // From human, go to hybrid if AI enabled, otherwise stay human
239
+ this.options.routingMode = this.options.aiEnabled ? 'hybrid' : 'human';
240
+ }
241
+ this.options.onToggle(this.options.routingMode);
242
+ }
243
+ handleReturn(now, resolve) {
244
+ // Block returns if we recently received text input
245
+ if (now < this.state.blockReturnsUntil) {
246
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.BLOCK_RETURNS_MS;
247
+ this.state.inPasteMode = true;
248
+ return true;
249
+ }
250
+ // Process the return
251
+ this.state.inPasteMode = false;
252
+ process.stdout.write('\n');
253
+ readline.clearLine(process.stdout, 0);
254
+ readline.cursorTo(process.stdout, 0);
255
+ this.close();
256
+ resolve(this.state.buffer.trim());
257
+ return true;
258
+ }
259
+ handleBackspace() {
260
+ this.state.buffer = this.state.buffer.slice(0, -1);
261
+ this.updateMultilineState();
262
+ this.render();
263
+ return true;
264
+ }
265
+ handleCharacterInput(str, key, now) {
266
+ if (str && !key.ctrl && !key.meta) {
267
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.BLOCK_RETURNS_MS;
268
+ if (this.state.inPasteMode) {
269
+ // Sanitize pasted content to prevent issues
270
+ const sanitized = str.replace(/[\r\n]/g, ' ');
271
+ this.state.pasteBuffer += sanitized;
272
+ }
273
+ else {
274
+ const sanitized = str.replace(/[\r\n]/g, ' ');
275
+ this.state.buffer += sanitized;
276
+ this.updateMultilineState();
277
+ }
278
+ if (!this.state.inPasteMode) {
279
+ this.render();
280
+ }
281
+ }
282
+ else if (key.sequence && !key.ctrl && !key.meta) {
283
+ this.state.blockReturnsUntil = now + PASTE_DETECTION.BLOCK_RETURNS_MS;
284
+ if (this.state.inPasteMode) {
285
+ // Sanitize pasted content to prevent issues
286
+ const sanitized = key.sequence.replace(/[\r\n]/g, ' ');
287
+ this.state.pasteBuffer += sanitized;
288
+ }
289
+ else {
290
+ const sanitized = key.sequence.replace(/[\r\n]/g, ' ');
291
+ this.state.buffer += sanitized;
292
+ this.updateMultilineState();
293
+ }
294
+ if (!this.state.inPasteMode) {
295
+ this.render();
296
+ }
297
+ }
298
+ }
299
+ updateMultilineState() {
300
+ this.state.hasNewlines = /[\r\n]/.test(this.state.buffer);
301
+ }
302
+ render() {
303
+ // Skip rendering during paste mode to avoid visual spam
304
+ if (this.state.inPasteMode) {
305
+ return;
306
+ }
307
+ // More aggressive clearing: clear current line and several lines below
308
+ readline.cursorTo(process.stdout, 0);
309
+ readline.clearLine(process.stdout, 0);
310
+ // Clear up to 5 lines below (in case of wrapping or previous multi-line content)
311
+ for (let i = 0; i < 5; i++) {
312
+ process.stdout.write('\n');
313
+ readline.clearLine(process.stdout, 0);
314
+ }
315
+ // Move back up to starting position
316
+ process.stdout.write('\x1b[5A');
317
+ readline.cursorTo(process.stdout, 0);
318
+ const modeIndicator = this.getModeIndicator();
319
+ const multilineIndicator = this.state.hasNewlines ? chalk.yellow(' [↵]') : '';
320
+ const promptLabel = chalk.dim(' ') + modeIndicator + multilineIndicator + chalk.dim(' › ');
321
+ if (this.state.hasNewlines) {
322
+ this.renderMultilineInput(promptLabel);
323
+ }
324
+ else {
325
+ this.renderSingleLineInput(promptLabel);
326
+ }
327
+ }
328
+ getModeIndicator() {
329
+ const mode = this.options.routingMode;
330
+ switch (mode) {
331
+ case 'hybrid':
332
+ return chalk.green('[Hybrid]');
333
+ case 'ai':
334
+ return chalk.cyan('[AI]');
335
+ case 'human':
336
+ return chalk.magenta('[Human]');
337
+ default:
338
+ return chalk.white('[Unknown]');
339
+ }
340
+ }
341
+ renderMultilineInput(promptLabel) {
342
+ const lines = this.state.buffer.split('\n');
343
+ process.stdout.write(promptLabel + lines[0]);
344
+ const modeText = this.getModeText();
345
+ const indentWidth = 2 + modeText.length + (this.state.hasNewlines ? 4 : 0) + 3;
346
+ const indent = ' '.repeat(indentWidth);
347
+ // Render remaining lines with indent
348
+ for (let i = 1; i < lines.length; i++) {
349
+ process.stdout.write('\n' + chalk.dim(indent) + lines[i]);
350
+ }
351
+ // Calculate cursor position at end of last line
352
+ const lastLine = lines[lines.length - 1];
353
+ const lastLinePos = indentWidth + lastLine.length;
354
+ // Render status line below all content
355
+ process.stdout.write('\n');
356
+ readline.clearLine(process.stdout, 0);
357
+ process.stdout.write(chalk.dim(` Tab to switch modes • Shift+Tab auto-accept: ${this.state.autoAccept ? 'on' : 'off'}`));
358
+ // Move cursor back up to end of last input line
359
+ // We need to go up 1 line (the status line)
360
+ process.stdout.write('\x1b[1A');
361
+ // Position cursor at end of last line of input
362
+ process.stdout.write(`\x1b[${lastLinePos + 1}G`);
363
+ }
364
+ renderSingleLineInput(promptLabel) {
365
+ const modeText = this.getModeText();
366
+ const promptWidth = 2 + modeText.length + 3; // " " + mode + " › "
367
+ const terminalWidth = process.stdout.columns || 80;
368
+ const availableWidth = terminalWidth - promptWidth;
369
+ // Truncate buffer if it's too long to prevent wrapping issues
370
+ let displayBuffer = this.state.buffer;
371
+ let truncated = false;
372
+ if (displayBuffer.length > availableWidth - 10) {
373
+ displayBuffer = '...' + displayBuffer.slice(-(availableWidth - 10));
374
+ truncated = true;
375
+ }
376
+ // Render the input line
377
+ process.stdout.write(`${promptLabel}${displayBuffer}`);
378
+ // Calculate cursor position
379
+ const cursorPos = promptWidth + displayBuffer.length;
380
+ // Move to next line and render status
381
+ process.stdout.write('\n');
382
+ readline.clearLine(process.stdout, 0);
383
+ const statusText = truncated
384
+ ? chalk.dim(` [${this.state.buffer.length} chars] Tab to switch modes • Shift+Tab auto-accept: ${this.state.autoAccept ? 'on' : 'off'}`)
385
+ : chalk.dim(` Tab to switch modes • Shift+Tab auto-accept: ${this.state.autoAccept ? 'on' : 'off'}`);
386
+ process.stdout.write(statusText);
387
+ // Move cursor back up to input line and position at end of input
388
+ process.stdout.write('\x1b[1A'); // Move up 1 line
389
+ process.stdout.write(`\x1b[${cursorPos + 1}G`); // Move to column (1-indexed)
390
+ }
391
+ getModeText() {
392
+ const mode = this.options.routingMode;
393
+ switch (mode) {
394
+ case 'hybrid':
395
+ return '[Hybrid]';
396
+ case 'ai':
397
+ return '[AI]';
398
+ case 'human':
399
+ return '[Human]';
400
+ default:
401
+ return '[Unknown]';
402
+ }
403
+ }
404
+ close() {
405
+ if (this.rl) {
406
+ process.stdin.removeAllListeners('keypress');
407
+ this.rl.close();
408
+ if (process.stdin.isTTY) {
409
+ process.stdin.setRawMode(this.wasRaw || false);
410
+ }
411
+ this.disableBracketedPasteMode();
412
+ }
413
+ }
414
+ }
415
+ /**
416
+ * Read a line of input with tab toggle support for mode switching
417
+ */
418
+ export async function readLineWithTabToggle(options) {
419
+ const prompt = new InteractivePrompt(options);
420
+ return prompt.readLine();
421
+ }
422
+ //# sourceMappingURL=InteractivePrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractivePrompt.js","sourceRoot":"","sources":["../../src/ui/InteractivePrompt.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,13 @@ import React from 'react';
2
2
  import { WebSocketClient } from '../modules/websocket.js';
3
3
  import { PermissionManager } from '../modules/permissions.js';
4
4
  import { ApiClient } from '../modules/api.js';
5
+ import { TunnelManager } from '../modules/tunnel.js';
5
6
  interface LiveSessionProps {
6
7
  taskId: string;
7
8
  wsClient: WebSocketClient;
8
9
  apiClient: ApiClient;
9
10
  permissionManager: PermissionManager;
11
+ tunnelManager: TunnelManager;
10
12
  }
11
13
  export declare const LiveSession: React.FC<LiveSessionProps>;
12
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"LiveSession.d.ts","sourceRoot":"","sources":["../../src/ui/LiveSession.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsB9C,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAyelD,CAAC"}
1
+ {"version":3,"file":"LiveSession.d.ts","sourceRoot":"","sources":["../../src/ui/LiveSession.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA4BrD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAq0BlD,CAAC"}