MCPcopy Create free account
hub / github.com/OperationT00/T-Code / CliTaskRunner

Class CliTaskRunner

src/main/java/com/tcode/cli/CliTaskRunner.java:16–73  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

14import java.util.concurrent.TimeUnit;
15
16final class CliTaskRunner {
17 private CliTaskRunner() {
18 }
19
20 static String run(Terminal terminal, Callable<String> task) {
21 CancellationToken token = CancellationContext.startRun();
22 ExecutorService executor = Executors.newSingleThreadExecutor(r -> {
23 Thread thread = new Thread(r, "tcode-agent-runner");
24 thread.setDaemon(true);
25 return thread;
26 });
27 Future<String> future = executor.submit(task);
28 Attributes original = null;
29 try {
30 if (terminal != null) {
31 try {
32 original = terminal.enterRawMode();
33 } catch (Exception ignored) {
34 // Non-interactive terminals continue without ESC monitoring.
35 }
36 }
37 while (!future.isDone()) {
38 if (original != null && CliTerminalInput.readEscCancel(terminal)) {
39 token.cancel();
40 future.cancel(true);
41 executor.shutdownNow();
42 return "⏹️ 已请求取消当前任务。";
43 }
44 try {
45 return future.get(150, TimeUnit.MILLISECONDS);
46 } catch (java.util.concurrent.TimeoutException ignored) {
47 // Continue monitoring ESC.
48 }
49 }
50 return future.get();
51 } catch (CancellationException e) {
52 return "⏹️ 已取消当前任务。";
53 } catch (InterruptedException e) {
54 Thread.currentThread().interrupt();
55 token.cancel();
56 future.cancel(true);
57 return "⏹️ 已取消当前任务。";
58 } catch (ExecutionException e) {
59 Throwable cause = e.getCause();
60 String message = cause == null || cause.getMessage() == null ? "未知错误" : cause.getMessage();
61 return "❌ 执行失败: " + message;
62 } finally {
63 if (terminal != null && original != null) {
64 try {
65 terminal.setAttributes(original);
66 } catch (Exception ignored) {
67 }
68 }
69 CancellationContext.clear(token);
70 executor.shutdownNow();
71 }
72 }
73}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected