package nodes import "time" // Capability matrix reported by each node agent. type Capabilities struct { Run bool `json:"run"` Invoke bool `json:"invoke"` Model bool `json:"model"` Camera bool `json:"camera"` Screen bool `json:"screen"` Location bool `json:"location"` Canvas bool `json:"canvas"` } // AgentInfo describes an enabled agent exposed by a remote clawgo node. type AgentInfo struct { ID string `json:"id"` DisplayName string `json:"display_name,omitempty"` Role string `json:"role,omitempty"` Type string `json:"type,omitempty"` Transport string `json:"transport,omitempty"` ParentAgentID string `json:"parent_agent_id,omitempty"` } // Artifact describes a file/media payload returned from a node action. type Artifact struct { ID string `json:"id,omitempty"` Name string `json:"name,omitempty"` Kind string `json:"kind,omitempty"` MIMEType string `json:"mime_type,omitempty"` Storage string `json:"storage,omitempty"` Path string `json:"path,omitempty"` URL string `json:"url,omitempty"` ContentText string `json:"content_text,omitempty"` ContentB64 string `json:"content_base64,omitempty"` SizeBytes int64 `json:"size_bytes,omitempty"` SourcePath string `json:"source_path,omitempty"` } // NodeInfo is the runtime descriptor for cross-device scheduling. type NodeInfo struct { ID string `json:"id"` Name string `json:"name,omitempty"` Tags []string `json:"tags,omitempty"` OS string `json:"os,omitempty"` Arch string `json:"arch,omitempty"` Version string `json:"version,omitempty"` Endpoint string `json:"endpoint,omitempty"` Token string `json:"token,omitempty"` Capabilities Capabilities `json:"capabilities"` Actions []string `json:"actions,omitempty"` Models []string `json:"models,omitempty"` Agents []AgentInfo `json:"agents,omitempty"` RegisteredAt time.Time `json:"registered_at,omitempty"` LastSeenAt time.Time `json:"last_seen_at"` Online bool `json:"online"` } // Envelope for node commands. type Request struct { Action string `json:"action"` Node string `json:"node,omitempty"` Task string `json:"task,omitempty"` Model string `json:"model,omitempty"` Args map[string]interface{} `json:"args,omitempty"` } // Envelope for node responses. type Response struct { OK bool `json:"ok"` Code string `json:"code,omitempty"` Error string `json:"error,omitempty"` Node string `json:"node,omitempty"` Action string `json:"action,omitempty"` Payload map[string]interface{} `json:"payload,omitempty"` } // WireMessage is the websocket envelope for node lifecycle messages. type WireMessage struct { Type string `json:"type"` ID string `json:"id,omitempty"` From string `json:"from,omitempty"` To string `json:"to,omitempty"` Session string `json:"session,omitempty"` Node *NodeInfo `json:"node,omitempty"` Request *Request `json:"request,omitempty"` Response *Response `json:"response,omitempty"` Payload map[string]interface{} `json:"payload,omitempty"` } // WireAck is the websocket response envelope for node lifecycle messages. type WireAck struct { OK bool `json:"ok"` Type string `json:"type"` ID string `json:"id,omitempty"` Error string `json:"error,omitempty"` }