Skip to content

action handler: SSH executor target (ExecuteCommand-over-SSH) + recovered B2 docs#124

Merged
AdaWorldAPI merged 3 commits into
mainfrom
claude/actionhandler-ssh-executor
Jun 24, 2026
Merged

action handler: SSH executor target (ExecuteCommand-over-SSH) + recovered B2 docs#124
AdaWorldAPI merged 3 commits into
mainfrom
claude/actionhandler-ssh-executor

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

What

Adds the SSH executor — arago's canonical ExecuteCommand-over-SSH — and recovers two doc commits that #123 merged without (the B2-transport + REST scorecard reflections).

SSH executor (ogar-action-handler::SshExecutor)

The native executor made remote. It shells out to the system ssh binary — dep-free (exactly like NativeCommandExecutor shells out to sh; no SSH-library / C dependency) — and returns the same output/stderr/exitcode resultParameters shape:

  • Non-interactive by constructionBatchMode=yes (never prompt for a password/passphrase; a connection that would prompt fails fast), StrictHostKeyChecking=accept-new.
  • An ssh connection failure surfaces as exitcode 255 (a reported result), not an executor error — same convention as the native one for a failed command.
  • Clone, so it composes into the Daemon/run_gated as a gated route.
  • build_args is the pure, testable half: BatchMode=yes always, optional -i/-p, the target, then -- so the remote command is never re-parsed as an ssh flag.

4 tests: argv is non-interactive + well-ordered; -i/-p threaded; missing command is an error before spawn (no host needed); unknown capability rejected. End-to-end remote exec needs a live sshd (absent in CI) — documented honestly.

Executor family split: the Command-based dep-free executors (native + SSH) live in OGAR ogar-action-handler; the library-based network executor (REST, ureq) lives in rs-graph-llm. WinRM is the one executor target left.

Recovered doc commits

#123 merged at the applicabilities commit, orphaning the later B2-transport and REST scorecard reflections — recovered here (the graph-flow-action-ogar::daemon + RestExecutor parity rows), plus the SSH reflection (D-ACTIONHANDLER-SSH).

Tests

11 ogar-action-handler tests (native + SSH + B2-lift parse) + doctest, clippy-clean on new code.

Sources: github.com/arago/ActionHandlers, arago/python-hiro-stonebranch-actionhandler, and the HIRO 7 Action API spec.

🤖 Generated with Claude Code


Generated by Claude Code

claude added 3 commits June 24, 2026 10:57
…edge)

The live action daemon shipped in rs-graph-llm's graph-flow-action-ogar::daemon:
a transport-agnostic core (Daemon::react/serve) + a Transport trait + the
action-ws WebSocket edge (WsTransport), proven by a mock-server roundtrip. HIRO
distributes actions over both a WebSocket and an internal Kafka bus, so the
dispatch is written once and the wire is a thin Transport shell — Kafka is the
reserved second edge. Connection identity is an Auth type shaped after OGIT
NTO/Auth/Configuration (auth_store 0x0B01): the principal that connects is the
actor the gate authorizes.

- ARAGO-ACTIONHANDLER-PARITY: B2-transport §3 bullet + two scorecard rows
  (daemon+ws SHIPPED, kafka edge remaining), verdict, cross-ref to daemon.rs.
- DISCOVERY-MAP: D-ACTIONHANDLER-TRANSPORT (G core+ws / H kafka).
- EPIPHANIES: E-ACTIONHANDLER-TRANSPORT — multi-wire ⇒ transport-agnostic core;
  OGIT Auth unifies connect-identity with gate-actor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
rs-graph-llm graph-flow-action-ogar::rest::RestExecutor (feature = "rest", ureq)
POSTs bound params to an HTTP endpoint and returns the response as
resultParameters — the arago HTTP-callout handler shape, run only behind the
hard gate. Completes the executor family alongside native; SSH/WinRM remain.

- ARAGO-ACTIONHANDLER-PARITY: B1 §3 bullet (REST shipped), executor scorecard
  row split (REST SHIPPED / SSH+WinRM remaining), verdict, cross-ref to rest.rs.
- DISCOVERY-MAP: D-ACTIONHANDLER-REST (G / CODED).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
The native executor made remote. ogar-action-handler::SshExecutor shells out to
the system `ssh` binary (dep-free, exactly like NativeCommandExecutor shells to
`sh` — no SSH-library / C dep), non-interactive by construction (BatchMode=yes,
StrictHostKeyChecking=accept-new), and returns the same output/stderr/exitcode
resultParameters shape. An ssh connection failure surfaces as exitcode 255 (a
reported result), not an executor error — same convention as the native one for
a failed command. Clone, so it composes into Daemon / run_gated as a gated route.

- build_args is the pure, testable half: BatchMode=yes always, optional -i/-p,
  the target, then `--` so the remote command is never re-parsed as an ssh flag.
- 4 tests: argv is non-interactive + well-ordered; -i/-p threaded; missing
  command is an error before spawn (no host needed); unknown capability rejected.
  End-to-end remote exec needs a live sshd (absent in CI) — documented.

Executor family split: the Command-based dep-free executors (native + SSH) live
in OGAR ogar-action-handler; the library-based network executor (REST, ureq)
lives in rs-graph-llm. WinRM is the one executor target left.

Also recovers two doc commits orphaned when #123 merged before they landed
(B2-transport + REST scorecard reflections), and adds the SSH reflection:
ARAGO-ACTIONHANDLER-PARITY (SSH §3 bullet + scorecard row + verdict + cross-ref),
D-ACTIONHANDLER-SSH discovery row.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@AdaWorldAPI AdaWorldAPI merged commit ea19e0e into main Jun 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants