Release Notes
All notable changes to MetaOne Platform, organized by version.
For the full diff, see CHANGELOG.md in the repository root.
[Unreleased]
✨ New Features
Dynamic Extension Configuration
Extensions declare a configuration schema (ConfigManifest) in their manifest. The platform stores per-workspace config values in the database, encrypts secrets using AES-256-GCM, and validates required fields before allowing an extension to be enabled.
- New
PENDING_CONFIGextension status for extensions with unconfigured required fields - REST API:
GET/PUT /admin/workspaces/{wsId}/extensions/{extKey}/configandPOST .../validate - Secret values masked as
••••••••in API responses ExtensionConfigProviderSDK interface for plugins to read config at runtime
Chatwoot IN_PROCESS Plugin
The Chatwoot extension has been converted from a standalone Spring Boot application to a PF4J plugin. Chat capabilities now route through the platform's capability system.
New capabilities:
chat.conversation.*— Conversation managementchat.message.*— Message operationschat.member.*— Team member managementchat.widget.*— Widget config and identity token
Additional features:
- Webhook handler with HMAC-SHA256 signature validation
platform.notificationevent handler — routes cross-extension notifications to Chatwoot messages- Conversation mapping with race condition handling (
DataIntegrityViolationExceptionretry) - Frontend widget integration (
chatwoot-widget.js)
Generic Webhook Controller
POST /api/webhooks/{extensionKey} routes incoming webhooks to the matching WebhookHandler plugin. Returns HTTP 401 on signature validation failure.
New SDK Interfaces
WebhookHandler— Extension point for receiving authenticated external webhooksWebhookAuthenticationException— Throw to signal signature validation failure (→ HTTP 401)ChatwootUnavailableException— Thrown when the Chatwoot API is unreachable
🔄 Changed
- Chatwoot extension runtime type changed:
EXTERNAL_SERVICE→IN_PROCESS - Chatwoot configuration moved from environment variables to dynamic per-workspace config via
ExtensionConfigProvider - Chatwoot manifest updated:
serviceBaseUrlremoved; widget capabilities added
⚠️ Deprecated
chat-extension— Replaced bychatwoot-extension. Source is preserved inchat-extension/withDEPRECATED.md. Removed from Maven reactor build.
🗑 Removed
- Standalone Spring Boot application class from
chatwoot-extension - REST controllers from
chatwoot-extension(capabilities now route via PF4J) chat-extensionfrom parentpom.xmlmodules list
Known Issues (Current)
| Issue | Severity | Workaround |
|---|---|---|
Full mvn test fails on Spring context startup | P1 | Run mvn -pl metaone-core -Dtest=ExtensionInstallerServiceTest test |
Stale CRM manifest permissions in MarketplaceServiceStub | P2 | Documentation/informational only — no runtime impact for in-process extensions |
tenantId / workspaceId naming inconsistency in SDK | P2 | Treat as equivalent; cleanup planned |
Plugin DB schemas use ddl-auto: update (not Flyway) | P2 | Acceptable for development; production deployment should use proper migrations |
requiresPlatformVersion not strictly enforced | P2 | Manifest field is parsed; enforcement planned |
Planned (Next Release)
| Feature | Priority | Notes |
|---|---|---|
Fix mvn test context startup failure | P1 | Add missing CapabilityException to metaone-sdk |
Fix stale CRM manifest in MarketplaceServiceStub | P2 | Permission list cleanup |
| Unit tests: CRM event publishing + Chat notification handling | P2 | Zero coverage currently |
Enforce requiresPlatformVersion compatibility check | P2 | Wire up CompatibilityService |
tenantId → workspaceId SDK naming cleanup | P2 | With deprecation alias |
Extract getOrCreateSystemChannel helper in ChatService | P3 | ~70 lines of duplicated code |
| Maven archetype for extension scaffolding | P3 | mvn archetype:generate to scaffold a new extension |
| Flyway/Liquibase for plugin database schemas | P2 | Replace ddl-auto: update |
| Per-workspace Chatwoot configuration | P3 | Allow different Chatwoot instances per workspace |
| Chatwoot API rate limiting / circuit breaker | P3 | Retry-after parsing + circuit breaker |