Skip to content
This repository was archived by the owner on Nov 21, 2025. It is now read-only.

Latest commit

 

History

History
482 lines (370 loc) · 11.9 KB

File metadata and controls

482 lines (370 loc) · 11.9 KB

v2.3 Plugin Architecture - Implementation Status

Date: 2025-11-18 Version Target: v2.3.0 Status: 🚧 IN PROGRESS - Foundation Complete (Day 1)


Progress Summary

✅ Completed Tasks (Day 1)

1. Plugin Module Structure ✅

Created complete plugin module in midimon-core/src/plugin/:

  • mod.rs - Module exports and documentation
  • action_plugin.rs - ActionPlugin trait (335 lines)
  • trigger_plugin.rs - TriggerPlugin trait (95 lines, future feature)
  • capability.rs - Permission system (160 lines)
  • metadata.rs - Plugin metadata structures (150 lines)

Total: ~740 lines of foundation code

2. ActionPlugin Trait Implementation ✅

pub trait ActionPlugin: Send + Sync {
    fn name(&self) -> &str;
    fn version(&self) -> &str;
    fn description(&self) -> &str;
    fn execute(&mut self, params: Value, context: TriggerContext) -> Result<(), Box<dyn Error>>;
    fn capabilities(&self) -> Vec<Capability> { vec![] }
    fn initialize(&mut self) -> Result<(), Box<dyn Error>> { Ok(()) }
    fn shutdown(&mut self) -> Result<(), Box<dyn Error>> { Ok(()) }
}

Features:

  • Thread-safe with Send + Sync bounds
  • TriggerContext includes velocity and mode
  • Optional initialize/shutdown lifecycle methods
  • Capability-based permission system
  • Comprehensive documentation and examples

3. TriggerContext Structure ✅

pub struct TriggerContext {
    pub velocity: Option<u8>,
    pub current_mode: Option<usize>,
    pub timestamp: Instant,
}

Helper Methods:

  • new(), with_velocity(), with_velocity_and_mode()
  • Default implementation

4. Capability System ✅

6 capability types with risk levels:

  • Network (Medium risk) - HTTP/HTTPS requests
  • Filesystem (High risk) - File read/write
  • Audio (Low risk) - Audio device access
  • Midi (Low risk) - MIDI send/receive
  • Subprocess (High risk) - Process execution
  • SystemControl (Medium risk) - System settings

Features:

  • Risk level classification (Low, Medium, High)
  • Human-readable names and descriptions
  • Color coding for UI display
  • Serialization support

5. PluginMetadata Structure ✅

pub struct PluginMetadata {
    pub name: String,
    pub version: String,
    pub description: String,
    pub author: String,
    pub homepage: Option<String>,
    pub license: String,
    pub plugin_type: PluginType,
    pub capabilities: Vec<Capability>,
    pub binary_path: PathBuf,
    pub checksum: String,
    pub signature: Option<String>,
    pub enabled: bool,
}

Features:

  • Builder pattern support
  • Dangerous capability detection
  • Serialization for manifest parsing

6. Plugin Action Type Added to Core ✅

Added Action::Plugin variant to midimon-core/src/actions.rs:

Plugin {
    plugin: String,  // Plugin identifier
    params: serde_json::Value,  // JSON parameters
}

Integration: Seamlessly integrated with existing Action enum

7. Test Coverage ✅

16 unit tests passing (100% pass rate):

  • ActionPlugin trait: 4 tests
  • TriggerContext: 3 tests
  • Capability system: 7 tests
  • PluginMetadata: 3 tests

Test Categories:

  • Metadata validation
  • Plugin execution
  • Context creation
  • Risk level ordering
  • Capability serialization
  • Dangerous capability detection

8. Build Configuration ✅

  • Added serde_json to workspace dependencies
  • Updated midimon-core Cargo.toml
  • Export plugin module from lib.rs
  • Zero compiler warnings
  • Zero compilation errors

Current Architecture

midimon-core/
└── src/
    ├── plugin/
    │   ├── mod.rs                   ✅ Module exports
    │   ├── action_plugin.rs          ✅ ActionPlugin trait
    │   ├── trigger_plugin.rs         ✅ TriggerPlugin trait (future)
    │   ├── capability.rs             ✅ Permission system
    │   └── metadata.rs               ✅ Plugin metadata
    ├── actions.rs                    ✅ Updated with Action::Plugin
    └── lib.rs                        ✅ Exports plugin module

Remaining Work

Phase 1: Plugin Loading & Discovery (Next 2-3 days)

Task 1: Plugin Loader ⏳

File: midimon-core/src/plugin/loader.rs

Requirements:

  • Dynamic library loading with libloading crate
  • Symbol resolution for plugin entry points
  • Platform-specific loading (.so/.dylib/.dll)
  • Error handling for missing/invalid plugins
  • Plugin validation (version compat, required symbols)

Estimated: 1-2 days

Task 2: Plugin Discovery ⏳

File: midimon-daemon/src/plugin_discovery.rs

Requirements:

  • Scan ~/.midimon/plugins/ directory
  • Parse plugin.toml manifests
  • Build plugin registry
  • Detect duplicates
  • Version conflict resolution

Estimated: 1 day

Task 3: Manifest Format ⏳

Define and implement plugin.toml schema:

[plugin]
name = "http_request"
version = "1.0.0"
description = "Make HTTP requests as actions"
author = "MIDIMon Team"
license = "MIT"
type = "action"
binary = "http_request.so"
checksum = "sha256:..."

[plugin.capabilities]
network = true

Estimated: 0.5 days (part of discovery)


Phase 2: Plugin Manager & Lifecycle (Next 3-4 days)

Task 4: PluginManager ⏳

File: midimon-daemon/src/plugin_manager.rs

Requirements:

  • Install/uninstall plugins
  • Enable/disable plugins
  • Load plugins on daemon startup
  • Initialize plugins (call ActionPlugin::initialize())
  • Shutdown plugins gracefully
  • Hot-reload support
  • Plugin state persistence

Estimated: 2-3 days

Task 5: Plugin Security ⏳

Files:

  • midimon-daemon/src/plugin_security.rs
  • midimon-daemon/src/plugin_permissions.rs

Requirements:

  • Permission system (prompt user for dangerous capabilities)
  • SHA256 checksum verification
  • Resource limits (timeout, memory monitoring)
  • Sandbox execution (if feasible)

Estimated: 1-2 days


Phase 3: ActionExecutor Integration (Next 2 days)

Task 6: Route Plugin Actions ⏳

File: midimon-daemon/src/action_executor.rs

Requirements:

  • Add Action::Plugin handling in execute()
  • Route to PluginManager
  • Pass TriggerContext to plugin execute()
  • Error handling (log, notify user)
  • Integration tests

Estimated: 1-2 days


Phase 4: Example Plugins (Next 3-4 days)

Task 7: HTTP Request Plugin ⏳

Directory: plugins/http_request/

Features:

  • GET/POST/PUT/DELETE methods
  • Custom headers, body, auth
  • Timeout configuration
  • Tests and README

Estimated: 1-1.5 days

Task 8: Spotify Plugin ⏳

Directory: plugins/spotify/

Features:

  • Play/pause/next/previous
  • Volume control
  • Playlist selection
  • OAuth setup guide

Estimated: 1-1.5 days

Task 9: Home Automation Plugin ⏳

Directory: plugins/home_automation/

Features:

  • MQTT client
  • Publish messages
  • Home Assistant integration
  • Broker configuration

Estimated: 1 day


Phase 5: GUI Integration (Next 2-3 days)

Task 10: Plugin Manager UI ⏳

Files:

  • midimon-gui/ui/src/lib/components/PluginManagerView.svelte
  • midimon-gui/ui/src/lib/components/PluginConfigEditor.svelte

Features:

  • List installed plugins
  • Install plugin (file picker, drag-drop)
  • Uninstall plugin (confirmation)
  • Enable/disable toggle
  • Configure plugin (dynamic form from schema)

Estimated: 2 days

Task 11: Tauri Commands ⏳

File: midimon-gui/src-tauri/src/commands.rs

Commands to Add:

  • list_plugins()
  • install_plugin(path: String)
  • uninstall_plugin(name: String)
  • enable_plugin(name: String)
  • get_plugin_config(name: String)
  • save_plugin_config(name: String, config: Value)

Estimated: 1 day


Phase 6: Documentation (Next 2 days)

Task 12: User Documentation ⏳

Files:

  • docs-site/src/guides/using-plugins.md
  • docs-site/src/configuration/actions.md (update)

Estimated: 0.5 days

Task 13: Developer Documentation ⏳

Files:

  • docs-site/src/developers/plugin-guide.md
  • docs-site/src/developers/action-plugin-api.md
  • docs-site/src/developers/trigger-plugin-api.md
  • docs-site/src/developers/plugin-security.md

Estimated: 1 day

Task 14: Plugin Template ⏳

Repository: midimon-plugin-template (GitHub)

Contents:

  • Minimal ActionPlugin example
  • Cargo.toml with dependencies
  • Build script
  • README with quickstart

Estimated: 0.5 days


Timeline Estimate

Optimistic (Remaining Work)

  • Phase 1: 2 days
  • Phase 2: 3 days
  • Phase 3: 1 day
  • Phase 4: 3 days
  • Phase 5: 2 days
  • Phase 6: 1.5 days
  • Total: 12.5 days (~2.5 weeks)

Realistic (Recommended)

  • Phase 1: 3 days
  • Phase 2: 4 days
  • Phase 3: 2 days
  • Phase 4: 4 days
  • Phase 5: 3 days
  • Phase 6: 2 days
  • Total: 18 days (~3.5 weeks)

With Buffer

  • Add 20% buffer: 21.6 days (~4.5 weeks)
  • Target: v2.3.0 release in 4-5 weeks from today

Risk Assessment

Low Risks ✅

  • ✅ ActionPlugin trait design (complete, well-tested)
  • ✅ Capability system (complete, straightforward)
  • ✅ Plugin metadata (complete, serializable)

Medium Risks ⚠️

  • ⏳ Dynamic library loading (platform differences)
  • ⏳ Plugin discovery (file system edge cases)
  • ⏳ UI complexity (dynamic form generation)

High Risks 🚨

  • ⏳ Plugin security (sandboxing feasibility)
  • ⏳ Performance overhead (lazy loading strategy)
  • ⏳ API stability (breaking changes impact)

Success Metrics

Launch Criteria (v2.3.0)

  • Plugin API implemented and tested (85%+ coverage)
  • ActionPlugin trait complete and tested
  • Plugin loader with dynamic loading
  • Plugin discovery system
  • 3 example plugins (HTTP, Spotify, Home Automation)
  • Plugin Manager UI functional
  • Developer documentation complete
  • Plugin template project available
  • All workspace tests passing (100%)
  • Zero regressions from v2.2

Current Progress

  • Foundation: ✅ 100% (Plugin traits, capabilities, metadata)
  • Loading: ⏳ 0% (Next task)
  • Management: ⏳ 0%
  • Integration: ⏳ 5% (Action enum updated)
  • Examples: ⏳ 0%
  • GUI: ⏳ 0%
  • Documentation: ⏳ 0%

Overall Progress: ~15% complete


Code Metrics (Current)

Lines of Code

  • Production: ~740 lines (plugin module)
  • Tests: ~200 lines (16 tests)
  • Total: ~940 lines

Test Coverage

  • Plugin Module: 16/16 tests passing (100%)
  • Workspace: Pending full test run

Build Status

  • Compilation: ✅ Success
  • Warnings: 0
  • Errors: 0

Next Session Goals

Immediate (Next 2-3 hours)

  1. Implement plugin loader with libloading
  2. Add platform-specific loading logic
  3. Write tests for plugin loading
  4. Start plugin discovery system

Short-term (Next 1-2 days)

  1. Complete plugin discovery
  2. Implement manifest parsing
  3. Build plugin registry
  4. Start PluginManager implementation

Dependencies

External Crates to Add

  • libloading - Dynamic library loading
  • sha2 - SHA256 checksum verification
  • reqwest - HTTP plugin (example)
  • rspotify - Spotify plugin (example)
  • rumqttc - MQTT plugin (example)

Blocked By

  • ✅ v2.2.0 release and validation (COMPLETE)

Blocking

  • ⏳ v2.4 Profile Marketplace (plugins should be shareable)

Notes

Design Decisions

  1. TriggerContext without Serialize/Deserialize: Instant doesn't impl Default, so we removed derives and made TriggerContext non-serializable. This is fine since it's only passed in-process.

  2. Capability-Based Permissions: Using enum instead of string flags for type safety and better error messages.

  3. Plugin Action as Enum Variant: Added Action::Plugin to core enum rather than separate registry for consistency with existing actions.

Open Questions

  1. Should we support WASM plugins in the future?
  2. How to handle plugin version conflicts?
  3. Should plugins have access to daemon state?

Status: ✅ Foundation Complete - Ready for Plugin Loader implementation Last Updated: 2025-11-18 (Day 1) Next Review: After Plugin Loader complete