| 2026-04-10 |
Fix ssh_exec: is_closing() → is_closed() (asyncssh API)
...
SSHClientConnection has no is_closing() — that's asyncio Transport.
The correct public method is is_closed().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 10 Apr
|
Fix ssh_exec error reporting + circular import in switch_profile
...
ssh_exec:
- Non-zero exit status: output (stdout/stderr) now included in error
field so model can actually see why the command failed
- All error cases: error field now contains human-readable message
instead of short code (no_target, permission_denied, timeout)
- Named connections from ssh_hosts.json: default known_hosts=none
same as ad-hoc connections (was missing, caused host key failures)
switch_profile:
- Move ProfileSwitched import inside execute() to break circular
import: tools.__init__ → switch_profile → core.events → core.agent
→ core.registry → tools
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 10 Apr
|
| 2026-04-09 |
SSH connection pooling: per-session, 20-minute TTL
...
- Pool keyed by session_id:host:port:username — parallel sessions share
no state even when targeting the same server
- Per-key asyncio.Lock prevents concurrent connection creation races
- TTL (20 min) and is_closing() checked on every access; expired/closed
connections are evicted and replaced transparently
- On disconnect error during command execution: evict + retry once with
fresh connection
- current_session_id ContextVar (set by Agent before tool calls) is read
in ssh_exec to build the pool key without changing tool signatures
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 9 Apr
|
| 2026-04-08 |
Wire self-extension tools into all profiles; improve tool descriptions
...
All profiles now include write_tool, list_tools, tool_manual, reload_tools.
User tools from enabled.json merged in at runtime via Agent._tool_list().
Built-in tool descriptions rewritten to be more LLM-actionable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
on 8 Apr
|
ssh_exec: accept credentials directly as tool parameters
...
host, username, password, port, key_path are now first-class parameters.
No config file needed — user can pass creds in the chat message.
Ad-hoc connections skip host key verification by default.
Named connections in ssh_hosts.json still work as a shortcut.
Eugene Sukhodolskiy
committed
on 8 Apr
|
Fix SSH password auth: disable key lookup when password is configured
...
asyncssh tried ~/.ssh/* keys before the password, causing PermissionDenied
on hosts that only accept password auth. Now when 'password' is set and no
'client_keys', key auth is disabled entirely.
Eugene Sukhodolskiy
committed
on 8 Apr
|
Unrestricted terminal mode and SSH tool
...
- Terminal: TERMINAL_ALLOWED_COMMANDS=* (default) runs via shell,
supports pipes, redirects, subshells; allowlist mode still available
- FS_ALLOWED_PATHS expanded to cover /home /etc /var /opt
- New ssh_exec tool: execute commands on remote hosts via asyncssh,
supports named connections (ssh_hosts.json) and inline user@host
- ssh_hosts.json gitignored, ssh_hosts.json.example added as reference
- ssh_exec added to server_admin and smart_home profiles
Eugene Sukhodolskiy
committed
on 8 Apr
|