# Package: dirigent_matrix
Matrix integration for Dirigent session sharing.
## Quick Facts
- **Type**: Library
- **Main Entry**: src/lib.rs
- **Dependencies**: matrix-sdk, dirigent_protocol, tokio, serde, thiserror, async-trait
- **Status**: Phase 1 -- Bot-mode session sharing
## Purpose
Provides bidirectional bridging between Dirigent sessions and Matrix rooms.
A session can be "shared" to a Matrix room, allowing Matrix users to send
messages to the agent and see responses in real-time.
## Architecture
### MatrixService (`service.rs`)
Central singleton owning the matrix-sdk Client. Handles:
- Bot authentication (login with username/password, session restore via SQLite store)
- Background sync loop for receiving Matrix events
- Share registry (tracks active session shares by connector_id + session_id)
- Room message dispatch to appropriate shares
### MatrixSessionShare (`share.rs`)
Bidirectional bridge for one (connector_id, session_id) to one Matrix room:
- **Dirigent to Matrix**: Subscribes to connector events, forwards completed assistant messages as m.notice
- **Matrix to Dirigent**: Receives room messages via MatrixService dispatch, sends ConnectorCommandProxy through mpsc channel
- Implements the `SessionShare` trait from dirigent_protocol
### MatrixConfig (`config.rs`)
Configuration parsed from `[matrix]` section in dirigent.toml:
- Homeserver URL, username, password source (env var or inline)
- Device ID for session persistence across restarts
- Display name, default invite list, store path
### Room Management (`room.rs`)
- Private, non-federated room creation for session shares
- Room naming conventions (`"Dirigent:
"`)
## Configuration
Identity and credentials live in an Account; sharing behavior in `[matrix]`:
```toml
[accounts.matrix-bot]
type = "matrix"
homeserver = "https://matrix.example.com"
username = "dirigent_bot"
device_id = "DIRIGENT_01"
display_name = "Dirigent Bot"
[accounts.matrix-bot.credentials.password]
source = "env"
key = "DIRIGENT_MATRIX_PASSWORD"
[matrix]
account = "matrix-bot"
default_invite = ["@user:example.com"]
store_path = "matrix/bot/store"
```
## Key Types
- `MatrixService` -- Singleton service, owns Client and share registry
- `MatrixSessionShare` -- Bidirectional session-to-room bridge
- `MatrixBehaviorConfig` -- Sharing behavior (account ref, invites, store path)
- `ConnectorCommandProxy` -- Message proxy decoupling from dirigent_core types
- `CreateRoomOptions` -- Room creation parameters
## Integration with CoreRuntime
The MatrixService is wired into CoreRuntime as an optional component (like archivist):
- `CoreRuntime::start_matrix_service()` -- Resolves Account from config, creates and starts service
- `CoreRuntime::create_matrix_share()` -- Creates room, starts bridge, spawns command proxy task
- `CoreRuntime::matrix_service()` -- Accessor for the running service
## Event Flow
```
Connector emits Event::MessageCompleted (role=assistant)
-> MatrixSessionShare event forwarder task
-> Sends m.notice to Matrix room
Matrix user sends message in room
-> MatrixService sync loop receives SyncRoomMessageEvent
-> Looks up share by room_id
-> share.inject_message(text) -> ConnectorCommandProxy
-> Proxy task translates to ConnectorCommand::SendMessage
-> Connector processes message
```
## Related Packages
- **dirigent_protocol**: SessionShare trait, Event types consumed by share forwarder
- **dirigent_core**: CoreRuntime integration, ConnectorCommand, ConnectorHandle
- **dirigent_config**: Path resolution (DIRIGENT_DATA_DIR for SQLite store)