- Expanded the testing guide with detailed sections on widget registration, state introspection, and integration with AI agents for automated testing. - Added a new comprehensive readme for the z3ed agent, outlining its architecture, capabilities, and quick start instructions for AI-driven ROM hacking. - Updated the changelog to reflect recent enhancements in GUI and UX, including a theme system and modular architecture for the Overworld Editor. - Removed outdated networking documentation to streamline resources and improve clarity.
9.4 KiB
Networking and Collaboration
Version: 0.2.0-alpha Last Updated: October 5, 2025
1. Overview
This document provides a comprehensive overview of the networking, collaboration, and remote access features within the z3ed ecosystem. These systems are designed to enable everything from real-time collaborative ROM hacking to powerful AI-driven remote automation.
The architecture is composed of three main communication layers:
- WebSocket Protocol: A real-time messaging layer for multi-user collaboration, managed by the
yaze-server. - gRPC Service: A high-performance RPC layer for programmatic remote ROM manipulation, primarily used by the
z3edCLI and automated testing harnesses. - Collaboration Service: A high-level C++ API within the YAZE application that integrates version management with the networking protocols.
2. Architecture
2.1. System Diagram
┌─────────────┐ WebSocket ┌──────────────┐
│ yaze app │◄────────────────────────────►│ yaze-server │
│ (GUI) │ │ (Node.js) │
└─────────────┘ └──────────────┘
▲ ▲
│ gRPC (for GUI testing) │ WebSocket
│ │
└─────────────┐ │
│ │
┌──────▼──────┐ │
│ z3ed CLI │◄──────────────────────┘
│ │
└─────────────┘
2.2. Core Components
The collaboration system is built on two key C++ components:
-
ROM Version Manager (
app/net/rom_version_manager.h)- Purpose: Protects the ROM from corruption and unwanted changes.
- Features:
- Automatic periodic snapshots and manual checkpoints.
- "Safe points" to mark host-verified versions.
- Corruption detection and automatic recovery to the last safe point.
- Ability to roll back to any previous version.
-
Proposal Approval Manager (
app/net/rom_version_manager.h)- Purpose: Manages a collaborative voting system for applying changes.
- Features:
- Multiple approval modes:
Host-Only(default),Majority, andUnanimous. - Automatically creates snapshots before and after a proposal is applied.
- Handles the submission, voting, and application/rejection of proposals.
- Multiple approval modes:
-
Collaboration Panel (
app/gui/widgets/collaboration_panel.h)- Purpose: Provides a dedicated UI within the YAZE editor for managing collaboration.
- Features:
- Version history timeline with one-click restore.
- ROM synchronization tracking.
- Visual snapshot gallery.
- A voting and approval interface for pending proposals.
3. Protocols
3.1. WebSocket Protocol (yaze-server v2.0)
Used for real-time, multi-user collaboration.
Connection:
const ws = new WebSocket('ws://localhost:8765');
Message Types:
| Type | Sender | Payload Description |
|---|---|---|
host_session |
Client | Initiates a new session with a name, username, and optional ROM hash. |
join_session |
Client | Joins an existing session using a 6-character code. |
rom_sync |
Client | Broadcasts a base64-encoded ROM diff to all participants. |
proposal_share |
Client | Shares a new proposal (e.g., from an AI agent) with the group. |
proposal_vote |
Client | Submits a vote (approve/reject) for a specific proposal. |
snapshot_share |
Client | Shares a snapshot (e.g., a screenshot) with the group. |
proposal_update |
Server | Broadcasts the new status of a proposal (approved, rejected). |
proposal_vote_received |
Server | Confirms a vote was received and shows the current vote tally. |
session_hosted |
Server | Confirms a session was created and returns its code. |
session_joined |
Server | Confirms a user joined and provides session state (participants, history). |
3.2. gRPC Service (Remote ROM Manipulation)
Provides a high-performance API for programmatic access to the ROM, used by the z3ed CLI and test harnesses.
Status: ✅ Designed and Implemented. Pending final build system integration.
Protocol Buffer (protos/rom_service.proto):
service RomService {
// Core
rpc ReadBytes(ReadBytesRequest) returns (ReadBytesResponse);
rpc WriteBytes(WriteBytesRequest) returns (WriteBytesResponse);
rpc GetRomInfo(GetRomInfoRequest) returns (GetRomInfoResponse);
// Overworld
rpc ReadOverworldMap(ReadOverworldMapRequest) returns (ReadOverworldMapResponse);
rpc WriteOverworldTile(WriteOverworldTileRequest) returns (WriteOverworldTileResponse);
// Dungeon
rpc ReadDungeonRoom(ReadDungeonRoomRequest) returns (ReadDungeonRoomResponse);
rpc WriteDungeonTile(WriteDungeonTileRequest) returns (WriteDungeonTileResponse);
// Proposals
rpc SubmitRomProposal(SubmitRomProposalRequest) returns (SubmitRomProposalResponse);
rpc GetProposalStatus(GetProposalStatusRequest) returns (GetProposalStatusResponse);
// Version Management
rpc CreateSnapshot(CreateSnapshotRequest) returns (CreateSnapshotResponse);
rpc RestoreSnapshot(RestoreSnapshotRequest) returns (RestoreSnapshotResponse);
rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse);
}
Use Case: Write with Approval via z3ed
The z3ed CLI can submit a change as a proposal via gRPC and wait for a host to approve it in the YAZE GUI.
# 1. CLI connects and submits a proposal via gRPC
z3ed net connect --host server.example.com --port 50051
z3ed agent run --prompt "Make dungeon 5 harder" --submit-grpc-proposal
# 2. The YAZE GUI receives the proposal and the host approves it.
# 3. The z3ed CLI polls for the status and receives the approval.
4. Client Integration
4.1. YAZE App Integration
The CollaborationService provides a high-level API that integrates the version manager, approval manager, and WebSocket client.
#include "app/net/collaboration_service.h"
// High-level service that integrates everything
auto collab_service = std::make_unique<net::CollaborationService>(rom);
// Initialize with managers
collab_service->Initialize(config, version_mgr, approval_mgr);
// Connect and host
collab_service->Connect("localhost", 8765);
collab_service->HostSession("My Hack", "username");
// Submit local changes as a proposal to the group
collab_service->SubmitChangesAsProposal("Modified dungeon room 5", "username");
4.2. z3ed CLI Integration
The CLI provides net commands for interacting with the collaboration server.
# Connect to a collaboration server
z3ed net connect --host localhost --port 8765
# Join an existing session
z3ed net join --code ABC123 --username myname
# Submit an AI-generated change as a proposal and wait for it to be approved
z3ed agent run --prompt "Make boss room more challenging" --submit-proposal --wait-approval
# Manually check a proposal's status
z3ed net proposal status --id prop_123
5. Best Practices & Troubleshooting
Best Practices
- For Hosts: Enable auto-backups, mark safe points after playtesting, and use
Host-Onlyapproval mode for maximum control. - For Participants: Submit all changes as proposals, wait for approval, and use descriptive names.
- For Everyone: Test changes in an emulator before submitting, make small atomic changes, and communicate with the team.
Troubleshooting
- "Failed to connect": Check that the
yaze-serveris running and the port is not blocked by a firewall. - "Corruption detected": Use
version_mgr->AutoRecover()or manually restore the last known safe point from the Collaboration Panel. - "Snapshot not found": Verify the snapshot ID is correct and wasn't deleted due to storage limits.
- "SSL handshake failed": Ensure you are using a
wss://URL and that a valid SSL certificate is configured on the server.
6. Security Considerations
- Transport Security: Production environments should use WebSocket Secure (
wss://) with a valid SSL/TLS certificate. - Approval Security:
Host-Onlymode is the safest. For more open collaboration, consider a token-based authentication system. - ROM Protection: The
RomVersionManageris the primary defense. Always create snapshots before applying proposals and mark safe points often.- Rate Limiting: The
yaze-serverenforces a rate limit (default: 100 messages/minute) to prevent abuse.
- Rate Limiting: The
7. Future Enhancements
- Encrypted WebSocket (WSS) support
- Diff visualization in UI
- Merge conflict resolution
- Branch/fork support for experimental changes
- AI-assisted proposal review
- Cloud snapshot backup
- Multi-host sessions
- Access control lists (ACLs)
- WebRTC for peer-to-peer connections
- Binary protocol for faster ROM syncs
- Automatic reconnection with exponential backoff
- Connection pooling for multiple sessions
- NAT traversal for home networks
- End-to-end encryption for proposals