{"contractVersion":"0.1.0-alpha.1","pluginId":"plg_media","publisher":{"id":"pub_fcb267e3-08ca-4755-9fe0-ceb6142544cd","handle":"al-amr-technical"},"slug":"media","name":"Media","version":"0.1.0-alpha.29","shortDescription":"Direct calls, meetings, large audio stages, and screen sharing for independent web environments.","category":"communication","kind":"full_stack","runtimeClass":"trusted_library","frontendAdapters":[{"id":"react","runtime":"react","exportPath":".","exports":["createMediaV2Runtime","mediaV2ProblemMessageFa","mediaV2MicrophoneMessageFa","mediaV2PlaybackMessageFa","mediaV2TransportMessageFa","mediaV2BootstrapMessageFa","mediaV2SelfMember","mediaV2IsJoined","mediaV2IsModerator","mediaV2ActiveMembers","mediaV2PendingSpeakerOfferForSelf","mediaV2RaisedHandQueue","mediaV2MicrophoneButton","mediaV2CallableActorKeySet","mediaV2RecoveryOffer","MediaV2RuntimeProvider","useMediaV2","mediaPluginManifest","MediaV2ClientMessageSchema","MediaV2ServerMessageSchema","MediaSpacePolicyV2Schema","MediaEnvironmentConfigV2Schema","MediaV2ActionError","mediaV2AudioGate","mediaV2MediaTransportMessageFa","mediaV2ConnectionQualityMessageFa"],"capabilities":["media:direct-call","media:meeting","media:stage","media:screen-share"],"peerDependencies":{"react":">=18"},"semanticPorts":{"provides":[],"requires":[]}}],"backendComponents":[{"id":"control","name":"Media control plane","protocol":"websocket","protocolArtifactId":"media-v2-data-plane","hostCallbacks":[{"id":"publisher-authority","description":"Asks the owning Environment backend whether the scope-bound actor may publish in a configured Media space.","target":"environment_backend","endpointConfigPointer":"/spaces/*/policy/roleAuthorityUrl","protocolArtifactId":"publisher-authority-api","operationId":"authorizePublisher","authorization":{"kind":"forwarded_plugin_grant","requiredScopes":["media:publish"],"location":"json_body","field":"grant"},"timeoutMs":2000,"maxResponseBytes":4096,"redirectPolicy":"error","failureMode":"deny"}],"capabilities":["call:signaling","space:membership","media:authorization","moderation"],"grantScopes":["media:connect","media:direct-call","media:join-space","media:request-speak","media:publish"],"contextSchema":{"type":"object","properties":{"scope":{"type":"string","minLength":1,"maxLength":96,"pattern":"^[A-Za-z0-9][A-Za-z0-9:_-]{0,95}$"}},"required":["scope"],"additionalProperties":false},"limits":{"maxConcurrentSessions":1,"maxParticipantsPerContext":150,"maxMessageBytes":16384,"requestsPerMinute":600}}],"protocolArtifacts":[{"id":"media-v2-data-plane","kind":"asyncapi","specificationVersion":"3.0.0","path":"./protocol/media-v2.asyncapi.json","digest":"sha256:65a7407f65fedb42a32d93e61d5406473816653b6d8aa73edf39378f4e4327cc","mediaType":"application/vnd.aai.asyncapi+json"},{"id":"publisher-authority-api","kind":"openapi","specificationVersion":"3.1.0","path":"./protocol/publisher-authority.openapi.json","digest":"sha256:db7cb99f3b43fe3e71a8d5849597eb4529fa7a877231e0357ba56d6b8db613ff","mediaType":"application/vnd.oai.openapi+json"}],"settings":{"schemaVersion":"1.0.0","type":"object","properties":{"volume":{"title":"Volume","x-al-amr-scopes":["plugin_default","user","user_environment"],"type":"number","default":0.8,"minimum":0,"maximum":1,"multipleOf":0.05},"defaultMuted":{"title":"Join muted","x-al-amr-scopes":["plugin_default","user","user_environment"],"type":"boolean","default":true},"inputDeviceId":{"title":"Input device","x-al-amr-scopes":["session"],"type":"string","maxLength":512},"outputDeviceId":{"title":"Output device","x-al-amr-scopes":["session"],"type":"string","maxLength":512}},"additionalProperties":false},"environmentConfigSchema":{"title":"Media installation configuration","description":"Media v2 policies keep interaction mode, capacity, floor control, screen sharing, encryption, reconnection, and spatial audio explicit per space. Registry validates this bounded structural schema and the Media service applies the stricter cross-field policy contract.","type":"object","properties":{"spaces":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[a-z][a-z0-9_-]{0,79}$"},"policy":{"type":"object","properties":{"mode":{"type":"string","enum":["stage","meeting"],"maxLength":16},"raiseHand":{"type":"string","enum":["disabled","enabled"],"maxLength":8},"encryption":{"type":"string","enum":["transport","sfu_blind"],"maxLength":10},"guestPolicy":{"type":"string","enum":["account_required","allowed"],"maxLength":16},"screenShare":{"type":"string","enum":["disabled","owners","speakers"],"maxLength":8},"floorControl":{"type":"string","enum":["fixed","moderated","open"],"maxLength":16},"spatialAudio":{"type":"string","enum":["disabled","distance_attenuation"],"maxLength":20},"screenProfile":{"type":"string","enum":["slides","motion"],"maxLength":8},"maxParticipants":{"type":"integer","minimum":2,"maximum":150},"maxSpeakerSeats":{"type":"integer","minimum":1,"maximum":16},"roleAuthorityUrl":{"type":"string","maxLength":2048},"reconnectGraceSeconds":{"type":"integer","minimum":5,"maximum":120}},"required":["mode","maxParticipants","maxSpeakerSeats","floorControl","raiseHand","screenShare","guestPolicy","encryption","reconnectGraceSeconds"],"additionalProperties":false}},"required":["id","policy"],"additionalProperties":false},"maxItems":64},"directCalls":{"type":"object","properties":{"policy":{"type":"object","properties":{"mode":{"type":"string","const":"direct_call","maxLength":16},"raiseHand":{"type":"string","const":"disabled","maxLength":8},"encryption":{"type":"string","const":"sfu_blind","maxLength":10},"guestPolicy":{"type":"string","enum":["account_required","callee_only"],"maxLength":16},"screenShare":{"type":"string","const":"disabled","maxLength":8},"floorControl":{"type":"string","const":"open","maxLength":16},"spatialAudio":{"type":"string","const":"disabled","maxLength":20},"maxParticipants":{"type":"integer","const":2},"maxSpeakerSeats":{"type":"integer","const":2},"roleAuthorityUrl":{"type":"string","maxLength":2048},"reconnectGraceSeconds":{"type":"integer","minimum":5,"maximum":120}},"required":["mode","maxParticipants","maxSpeakerSeats","floorControl","raiseHand","screenShare","guestPolicy","encryption","reconnectGraceSeconds"],"additionalProperties":false},"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false}},"required":["directCalls"],"additionalProperties":false},"platformPermissions":["identity:read","profile:read","settings:read","settings:write","plugin-grant:request"],"browserRequirements":[{"name":"microphone","reason":"Requested only when the participant chooses to speak.","required":false},{"name":"display-capture","reason":"Requested only when the participant explicitly starts screen sharing.","required":false}],"networkAccess":{"origins":["https://media.al-amr.com","wss://rtc.al-amr.com"],"reason":"Authenticated control traffic and self-hosted LiveKit WebRTC media transport."},"dataHandling":{"collected":["pairwise plugin actor","authoritative display profile","environment and scope","session membership","connection diagnostics"],"shared":[],"retention":"Invitations and session state are ephemeral. Security audit events follow platform retention policy. Media is not recorded or transcribed, and Media does not collect movement or position data.","privacyPolicyUrl":"https://developer.al-amr.com/legal/privacy"},"compat":{"contracts":"^0.1.0-alpha.1","sdk":"^0.1.0-alpha.1"},"documentation":{"canonicalUrl":"https://developer.al-amr.com/plugins/al-amr/media","integrationUrl":"https://developer.al-amr.com/plugins/al-amr/media/integration.md","repositoryUrl":"https://github.com/al-amr/al-amr/tree/main/plugins/media","license":"MIT"}}