package main import ( "context" "encoding/json" "errors" "strings" "git.soma.salesforce.com/chatbots/realtime-media-conductor/rmc" ) // MessageStatsAgent is trusted, embedded Go code. It receives filtered room // input but is not sandboxed from the host's filesystem or network. type MessageStatsAgent struct{} func (MessageStatsAgent) Descriptor() rmc.RoomAgentDescriptor { return rmc.RoomAgentDescriptor{ ID: "example.message-stats", Version: "1", Role: "processor", Subscriptions: []rmc.ChannelSubscription{{ ChannelID: "chat", EventTypes: []string{"text.message.committed"}, }}, Grants: []rmc.Grant{ {Action: "event:subscribe", Resource: "chat"}, {Action: "event:publish", Resource: "measurements"}, }, TimeoutMillis: 1000, } } func (MessageStatsAgent) Handle(ctx context.Context, request rmc.RoomAgentRequest) ([]rmc.EventInput, error) { if err := ctx.Err(); err != nil { return nil, err } var message struct { Text string `json:"text"` } if err := json.Unmarshal(request.Event.Payload, &message); err != nil { return nil, err } if strings.TrimSpace(message.Text) == "" { return nil, errors.New("message text is required") } payload, err := json.Marshal(struct { SourceEventID string `json:"source_event_id"` WordCount int `json:"word_count"` }{request.Event.ID, len(strings.Fields(message.Text))}) if err != nil { return nil, err } return []rmc.EventInput{{ ChannelID: "measurements", Type: "demo.message.measured", CausationID: request.Event.ID, Visibility: request.Event.Visibility, Payload: payload, }}, nil }