MCPcopy Create free account
hub / github.com/dtormoen/tsk-tsk / execute

Method execute

src/commands/shell.rs:22–87  ·  view source on GitHub ↗
(&self, ctx: &AppContext)

Source from the content-addressed store, hash-verified

20#[async_trait]
21impl Command for ShellCommand {
22 async fn execute(&self, ctx: &AppContext) -> Result<(), Box<dyn Error>> {
23 let args = &self.task_args;
24 let name = args.resolved_name();
25
26 let prompt = args.resolve_prompt()?;
27 let repo_root = args.resolve_repo_root()?;
28
29 let task = args
30 .configure_builder(repo_root, name.clone(), args.agent.clone(), prompt)
31 .with_interactive(true) // Shell sessions are always interactive
32 .build(ctx)
33 .await?;
34
35 println!(
36 "Shell {} ({}, {}){}",
37 task.id,
38 task.stack,
39 task.agent,
40 args.branch_suffix()
41 );
42
43 // Update terminal title for the shell session
44 ctx.terminal_operations()
45 .set_title(&format!("TSK Shell: {name}"));
46
47 // Execute the task
48 let docker_client: Arc<dyn crate::context::docker_client::DockerClient> = Arc::new(
49 DefaultDockerClient::new(&ctx.tsk_config().container_engine)
50 .map_err(|e| -> Box<dyn Error> { e.into() })?,
51 );
52 let docker_manager = DockerManager::new(ctx, docker_client.clone(), None);
53 let task_runner = TaskRunner::new(ctx, docker_manager, None);
54
55 // Set up signal handler for cancellation.
56 // During the active interactive session, Ctrl+C is forwarded to the container
57 // via raw mode stdin, so this handler primarily catches SIGTERM signals
58 // and Ctrl+C during setup/teardown windows.
59 let storage = ctx.task_storage();
60 let task_id = task.id.clone();
61 let container_name = format!("tsk-interactive-{}", task.id);
62 let cancel_client = docker_client.clone();
63 let cancel_storage = storage.clone();
64
65 tokio::spawn(async move {
66 let mut sigterm =
67 signal(SignalKind::terminate()).expect("Failed to listen for SIGTERM");
68 tokio::select! {
69 _ = tokio::signal::ctrl_c() => {},
70 _ = sigterm.recv() => {},
71 }
72 let _ = cancel_storage.mark_cancelled(&task_id).await;
73 let _ = cancel_client.kill_container(&container_name).await;
74 });
75
76 let result = task_runner
77 .store_and_run(&task)
78 .await
79 .map_err(|e| e.message);

Callers

nothing calls this directly

Calls 14

resolved_nameMethod · 0.80
resolve_promptMethod · 0.80
resolve_repo_rootMethod · 0.80
configure_builderMethod · 0.80
set_titleMethod · 0.80
terminal_operationsMethod · 0.80
tsk_configMethod · 0.80
task_storageMethod · 0.80
mark_cancelledMethod · 0.80
store_and_runMethod · 0.80
restore_titleMethod · 0.80
buildMethod · 0.45

Tested by

no test coverage detected