"""Transports: how agentd reaches a terminal's machine (files, detached launch, kill). Interface (duck-typed, see docs/executor-contract.md): os, join(*parts), quote(s), default_run_root() mkdir(path, clean=False), write_text(path, text), read_text(path) -> str|None, grep_first(path, needle) -> str|None, tail(path, n) -> str runner(run_dir, cwd, command, stdout_name) -> (script_name, script_text) launch(task, script_path, run_dir), kill(task, run_dir), forget(task) process_count(name) -> int|None (None = unreachable)""" class TransportError(Exception): pass def make_transport(cfg, terminal): kind = cfg.terminals[terminal]["transport"] if kind == "local": from .local import LocalTransport return LocalTransport(cfg, terminal) if kind == "warpgate-ssh": from .warpgate_ssh import WarpgateSshTransport return WarpgateSshTransport(cfg, terminal) raise TransportError("unknown transport %s" % kind)