// 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"` Repository string `json:"repository"` // name from agent's repo config Branch string `json:"branch"` 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"` }