feat: Mattermost plugin + daemon integration (Phases 2-5)

Plugin (Go server + React webapp):
- Custom post type 'custom_livestatus' with terminal-style rendering
- WebSocket broadcasts for real-time updates (no PUT, no '(edited)')
- KV store for session persistence across reconnects
- Shared secret auth for daemon-to-plugin communication
- Auto-scroll terminal with user scroll override
- Collapsible sub-agent sections
- Theme-compatible CSS (light/dark)

Daemon integration:
- PluginClient for structured data push to plugin
- Auto-detection: GET /health on startup + periodic re-check
- Graceful fallback: if plugin unavailable, uses REST API (PUT)
- Per-session mode tracking: sessions created via plugin stay on plugin
- Mid-session fallback: if plugin update fails, auto-switch to REST

Plugin deployed and active on Mattermost v11.4.0.
This commit is contained in:
sol
2026-03-07 22:11:06 +00:00
parent 868574d939
commit c724e57276
9 changed files with 282 additions and 1958 deletions

View File

@@ -82,6 +82,15 @@ function buildConfig() {
// Feature flags
enableFsWatch: getEnvBool('ENABLE_FS_WATCH', true),
// Mattermost plugin integration (optional)
// When configured, updates are sent to the plugin instead of using PUT on posts
plugin: {
url: getEnv('PLUGIN_URL', null), // e.g. https://slack.solio.tech/plugins/com.openclaw.livestatus
secret: getEnv('PLUGIN_SECRET', null),
enabled: getEnvBool('PLUGIN_ENABLED', true),
detectIntervalMs: getEnvInt('PLUGIN_DETECT_INTERVAL_MS', 60000),
},
};
// Validate MM base URL