Skip to content

Releases: saparjohnick/agents_control

v0.3.1

Choose a tag to compare

@saparjohnick saparjohnick released this 11 Sep 13:24

Fixed

  • The daemon went permanently deaf on a routine network error.
    Network failures were translated into a retry by matching a
    hand-written list of Errno constants. EADDRNOTAVAIL — what a VPN
    reconnecting produces — wasn't on it, so it escaped every rescue and
    killed the polling thread. The process stayed up, the hook port kept
    answering, agent events kept arriving, and nothing from Telegram ever
    did again. The list is now the whole SystemCallError family, and a
    backstop catches anything still unaccounted for.

Added

  • doctor reports whether the daemon is still listening, not just
    whether it's running — the hook port answers the same either way, so
    a dead poller was indistinguishable from a healthy one. A successful
    poll leaves a timestamp; doctor reads it and says how long ago.

v0.3.0

Choose a tag to compare

@saparjohnick saparjohnick released this 11 Sep 08:31

Changed

  • /run now holds back a few destructive commands. A recursive
    force delete aimed at / or $HOME, a fork bomb, mkfs, dd to a
    raw device. They come back naming what they do, and one tap sends
    anyway.
  • Nothing else is affected: rm -rf /tmp/build, cat .env and
    git push --force go straight through. A seatbelt against the wrong
    tab number, not a filter — bash -c 'rm -rf ~' is not caught.

Added

  • Optional passphrase for those commands, instead of a tap.
    agents_control passphrase set|clear|status, offered during setup
    and from the bot itself.
    • PBKDF2-HMAC-SHA256, 210k iterations, salted; Keychain or libsecret;
      never argv.
    • The message carrying it is deleted from the chat once read.
    • Set from the chat, it guards against whoever reaches that chat
      later, not whoever has it now.
  • Files can be sent to a session — photos, video, voice, documents.
    • Saved to ~/.local/state/agents_control/inbox/; the pane gets the
      local path, never a link (the download URL contains the bot token).
    • Target: caption /run N …, or reply with the file to a session's
      message. Otherwise the path just comes back in the chat.
    • Kept telegram.inbox_keep_days (14), then swept.
  • /status, /settings and doctor report whether a passphrase is set.

Fixed

  • No panes were listed on tmux 3.5 — Debian 13's and Ubuntu
    24.10's. It prints the record separators as octal escapes where 3.7
    emits the bytes, so the parse found nothing and /tabs came back
    empty with no error.
  • The startup hook check probed whichever hook was listed first
    ours only until you have a Stop hook of your own. It replayed that
    entry's headers to its URL without TLS, sending a third party's
    bearer token in cleartext once per daemon start. Found by its marker
    now, and only probed on loopback.

Internal

  • The suite runs on Linux (554 tests, both platforms). It was green on
    macOS and 88 failures deep on Linux, which is how the tmux bug above
    survived a release.
  • The suite fails if a test is written where Minitest won't collect it.

v0.2.3

Choose a tag to compare

@saparjohnick saparjohnick released this 04 Sep 13:41

/run no longer types blindly into a busy tab

If a plain tab isn't actually at a shell prompt — stuck in less, vim, a REPL, man, anything that reads keystrokes as its own input instead of a line to submit — /run now asks for confirmation instead of sending straight in. The letters were never running as a command in that case; they were just being fed to whatever's already there (pager navigation, editor insert mode, and so on), silently.

Detection has two layers:

  • A known list of interactive programs (less, more, vim, nano, irb, psql, and a handful of others), checked against the tab's actual foreground process.
  • A fallback for anything not on that list: a bare : as the entire last line of the screen — the one convention practically every pager in the less/more lineage agrees on for "waiting on you." No real shell prompt looks like that, so it's a safe backstop for a custom $PAGER or anything else unrecognized by name.

This only applies to plain (non-agent) tabs — an agent session already gets its own separate handling, and remote (ssh/mosh) commands already had their own confirmation step.

v0.2.1

Choose a tag to compare

@saparjohnick saparjohnick released this 01 Sep 19:05

Full Changelog: v0.2.0...v0.2.1

v0.2.0

Choose a tag to compare

@saparjohnick saparjohnick released this 01 Sep 14:06

Full Changelog: v0.1.1...v0.2.0

v0.1.0

Choose a tag to compare

@saparjohnick saparjohnick released this 31 Aug 15:04