Skip to main content

Persistent telnet/MUD session manager you drive by hand or with an agent. No LLM, no API key.

Project description

AutoMUD

A persistent telnet/MUD session you drive with small, discrete commands. There is no language model and no API key inside it: the intelligence is whoever runs it, a person, a script, or an autonomous agent. It exists because a raw telnet session is interactive and blocking, so it cannot be held open across separate shell commands. AutoMUD keeps the connection alive in a small background daemon and exposes simple verbs against it.

Install

pipx install git+https://github.com/CharlesCNorton/automud

Or from a clone:

pip install .

Standard library only, Python 3.8+.

Use

automud connect --demo achaea       # or: automud connect <host> <port>
automud send 2                       # send a line, print the reply
automud send Maelvorn
automud recv                          # drain any new output
automud wait --for "You are hungry"   # block until output matches a regex
automud state                         # structured game state (GMCP) as JSON
automud status
automud close
verb what it does
connect HOST PORT / --demo NAME open a session and start the daemon (--tls, --encoding ENC, --idle-exit SEC, --debug)
send [TEXT] send one line, print what comes back (omit TEXT for a blank line; --stdin reads the text from stdin)
recv print any new output (--nowait returns whatever is buffered immediately)
wait --for REGEX / --gmcp PKG block until output matches, or a GMCP package updates
gmcp PACKAGE [JSON] send a GMCP message (e.g. Char.Skills.Get)
state [--key PKG] [--times] captured GMCP state as JSON (--times: seconds since each package updated)
status connection, options, vitals summary
log [--tail N] session transcript (last N lines with --tail)
close end the session and stop the daemon
kill force-stop a wedged daemon and clear the session

Built-in demo targets: achaea, zork (telehack.com), chess (freechess.org).

Every reading verb takes --json and prints one structured object (data, prompt, connected, elapsed, ...) instead of raw text, which is the natural mode for driving it from a program. A minimal agent loop is just:

automud connect example.com 4000 --json
automud send look --json                 # {"ok": true, "data": "...", "prompt": true, ...}
automud wait --for "^You (win|die)" --max 120 --json

Exit codes: 0 ok, 1 failure, 2 usage error, 3 the operation succeeded but the connection is closed.

Behaviour

  • Smart waiting. send and recv return as soon as the server stops talking, either a telnet GA/EOR prompt marker or output going quiet, so you never guess a sleep duration. --max caps the wait and --quiet sets the idle threshold. wait extends this to regex/GMCP conditions.
  • GMCP. It negotiates GMCP and parses the structured state modern MUDs push (health, room, exits, skills) into JSON for state. Standard list deltas (Room.AddPlayer, Char.Afflictions.Add, ...) are applied to their lists, and Comm.Channel.Text is kept as a bounded Comm.Channel.History. TTYPE, NAWS and CHARSET negotiation are answered; options it does not implement (compression, MSDP, MXP) are refused rather than mishandled.
  • Encodings and TLS. --encoding sets the wire charset (default utf-8; use latin-1 or cp437 for older servers), and telnet CHARSET negotiation can switch it when the server asks. --tls wraps the connection (--tls-insecure for self-signed certificates).
  • One session per name, held by a background daemon; a new connect replaces it, and -s NAME gives you independent parallel sessions. Session state and transcripts live under a per-user state directory (override with AUTOMUD_DIR); the previous session's transcript is kept as out.prev.log.
  • Robust lifecycle. TCP keepalive is enabled, a dead daemon is detected by pid and its stale session cleared, concurrent connects are serialized by a lock, a wedged daemon is force-killed on reconnect (or by kill), and --idle-exit stops a forgotten daemon.

Security

The control channel is a localhost-only socket authenticated by a per-session random token. State lives in a per-user directory ($XDG_RUNTIME_DIR/automud, else <tempdir>/automud-<uid> on POSIX, %TEMP%\automud on Windows) that is created 0700 and refused if another user owns it. Prefer automud send --stdin for passwords: argv is visible to other local processes, and shell history persists. Plain telnet is cleartext; use --tls where the server offers it.

Tests

python -m unittest discover -s tests -t .

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

automud-0.2.0.tar.gz (24.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

automud-0.2.0-py3-none-any.whl (20.9 kB view details)

Uploaded Python 3

File details

Details for the file automud-0.2.0.tar.gz.

File metadata

  • Download URL: automud-0.2.0.tar.gz
  • Upload date:
  • Size: 24.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for automud-0.2.0.tar.gz
Algorithm Hash digest
SHA256 daf48f36ca4e1c8e7ee7e00bc3112409e71d62e580f93d7eca5522c38d9c3db9
MD5 3b7546f98cfc10435bd96d6dfb520f0b
BLAKE2b-256 d6e3b75e6f9d929989113104e51f426887820346e2f96c96e527ef8d3d5724b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for automud-0.2.0.tar.gz:

Publisher: publish.yml on CharlesCNorton/automud

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file automud-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: automud-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 20.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for automud-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d6a22a6f74b413a351c5263b1b43b15fe3e822b6caf24c9b5fdbcebe2d59639e
MD5 19e829968f790a1d4eb4f95dcb424333
BLAKE2b-256 0120390311ae8fa26b780ad9b6d379b52274fb0d1538c2536873f02ed6b42e78

See more details on using hashes here.

Provenance

The following attestation bundles were made for automud-0.2.0-py3-none-any.whl:

Publisher: publish.yml on CharlesCNorton/automud

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page