Commit Graph
1 Commits
Author SHA1 Message Date
Claude 88c45dae04 refactor(cluster): route MAIN→node calls through NodeRpc and NodeActions
The last two Phase 0 seams:

- Core\Cluster\NodeRpc wraps every ApiClient::systemRequest() and
  asyncRequest() call. It covers 37 call sites across the admin
  controllers, the admin API wrapper, ServerRepository/ServerService,
  StreamService, DiagnosticsService and AuthRepository. The HTTP transport
  is unchanged. In Phase 4 these become node.rpc{action} commands.
- Core\Cluster\NodeActions wraps every SignalDispatcher::rootAction() call
  (26 sites) with typed methods: reboot, restartServices, update,
  rollback, updateBinaries, setRamdisk, setPorts, setServices,
  setGovernor, setSysctl, flushBlocklist, certbot. send() takes payloads
  the caller builds (modules, OPENSSL_EXTRA). The queued JSON is
  byte-for-byte what the callers wrote. In Phase 4 these become
  node.root{action} commands.

Each seam refuses an action outside its catalogue (NodeRpc::ACTIONS,
NodeActions::ROOT_ACTIONS). NodeRpcActionsTest checks that:
- every call site uses a catalogued RPC action;
- RootSignalsCronJob handles every catalogued root action;
- nothing outside Core\Cluster calls the raw functions.

docs/en/development/cluster-seams.md lists all the Phase 0 seams, their
legacy backends and the rules for new code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Es8UhyPS8MNjuYTagqfGWi
2026-09-25 10:07:47 +00:00