// Package protocol defines the wire format shared between the control plane // and agents. Keep this small — anything that goes over HTTP or WebSocket // between us and an agent lives here. package protocol // Event is what an agent streams back to the control plane over its outbound // WebSocket. The control plane fans these out to dashboard clients and // persists them (log lines to .log, progress snapshots to SQLite). type Event struct { DeploymentID string `json:"deploymentId"` Kind string `json:"kind"` // progress | log | status State string `json:"state,omitempty"` // QUEUED, FETCHING, ... RUNNING, FAILED, STOPPED Stage string `json:"stage,omitempty"` // human label, e.g. "git fetch" Line string `json:"line,omitempty"` // log line (for kind=log) ContainerID string `json:"containerId,omitempty"` At int64 `json:"at"` // unix millis } // DeployRequest is what the control plane POSTs to an agent to start work. // Credentials are passed per-operation; agents MUST NOT log or persist them. type DeployRequest struct { DeploymentID string `json:"deploymentId"` SandboxID string `json:"sandboxId,omitempty"` // owning sandbox (Slice 2) Repository string `json:"repository"` // name from agent's repo config Branch string `json:"branch"` HostPort int `json:"hostPort,omitempty"` // host port to bind the container to Env map[string]string `json:"env,omitempty"` // injected into container Username string `json:"username"` Password string `json:"password"` } // DeployResponse is the agent's immediate ack to a DeployRequest. // Actual progress streams over the WS. type DeployResponse struct { OK bool `json:"ok"` Error string `json:"error,omitempty"` } // RepoInfo describes one repository the agent knows about. type RepoInfo struct { Name string `json:"name"` Path string `json:"path"` // DefaultBranch is best-effort; empty if the repo is empty or unreadable. DefaultBranch string `json:"defaultBranch,omitempty"` } // RouteOverride is a single "_url" line the gateway agent should // rewrite in the API gateway's config.php. The key is the PHP array key // (e.g. "haven_url"); the value is the new URL (e.g. // "http://172.18.136.92:9001"). TargetOCP=true means "leave it alone / // point back at the OCP URL"; in that case the agent should restore the // original value from its snapshot. type RouteOverride struct { Key string `json:"key"` // e.g. "haven_url" Value string `json:"value"` // new URL, e.g. "http://172.18.136.92:9001" TargetOCP bool `json:"targetOcp"` // if true, restore OCP URL from snapshot }