Skip to content

Commit a13a94b

Browse files
authored
feat(plugins): Complete and enhance WASM plugin system for open-source developers (#9)
* feat(cli): add plugin developer commands (new/dev/build/validate/publish) Add new subcommands to the plugin CLI: - `cortex plugin new <name>` - Scaffold a new plugin project - `cortex plugin dev [--watch]` - Start development server with hot-reload - `cortex plugin build` - Build the plugin WASM file - `cortex plugin validate` - Validate plugin manifest and structure - `cortex plugin publish` - Prepare plugin for publication (dry-run only) Features: - Support for basic and advanced (TUI hooks) Rust templates - TypeScript plugin template support - File watching with notify crate for hot-reload - Comprehensive manifest validation - Tarball creation for distribution * feat(engine): add plugin integration layer for cortex-plugins hooks Add PluginIntegration struct that bridges cortex-engine and cortex-plugins hook systems, enabling: - Tool execution hooks (before/after) - Session lifecycle hooks (start/end) - Permission decision hooks - Chat message hooks Includes PluginIntegrationBuilder for flexible construction and comprehensive test coverage for all hook trigger methods. * feat(plugins): add WASM host functions for plugin communication Implements the host-side functions that WASM plugins can call: - log(level, msg_ptr, msg_len) - Log at specified level - get_context() -> i64 - Get execution context as JSON - register_widget(region, type_ptr, type_len) -> i32 - Register UI widget - register_keybinding(key_ptr, key_len, action_ptr, action_len) -> i32 - Register keybinding - show_toast(level, msg_ptr, msg_len, duration_ms) -> i32 - Show toast notification - emit_event(name_ptr, name_len, data_ptr, data_len) -> i32 - Emit custom event The host functions are wired to the WASM runtime via wasmtime's Linker, allowing plugins to call back into the host system. * feat(examples): add hello-world and code-stats example plugins Add two example plugins demonstrating plugin capabilities: 1. hello-world (basic): - Command: /hello [name] - greets the user - Hook: tool_execute_before - logs tool executions - Config: greeting_prefix setting 2. code-stats (advanced): - Commands: /stats, /stats-reset, /stats-export - Hooks: file_operation_after, session_end, widget_register - UI widget: Status bar showing code statistics - Event system: Custom events for integrations Both plugins include complete manifest, Cargo.toml, and documentation. * feat(plugins): add remote registry discovery and plugin signing - Add RemoteRegistry and PluginIndexEntry types for remote plugin discovery - Add PluginSigner for ed25519 signature verification - Add checksum (SHA256) verification for downloaded plugins - Add registry methods: fetch_remote_index, search, check_updates, download_plugin - Add SignatureError, NetworkError, ChecksumMismatch, RegistryError to PluginError - Export new types from lib.rs * docs(plugins): add comprehensive plugin development documentation Add documentation in /docs/plugins/: - README.md: Main plugin development guide with architecture, manifest, and capabilities - GETTING_STARTED.md: Step-by-step tutorial for creating first plugin - HOOKS.md: Complete reference for all 35+ hook types - SECURITY.md: Security model including WASM sandboxing, resource limits, and best practices * fix(plugins): address Greptile security and deadlock concerns Security fixes: - Add SSRF protection in registry.rs: validate download URLs to block private IPs (10.x, 172.16-31.x, 192.168.x, 169.254.x, 127.x), localhost, dangerous ports, and non-HTTPS protocols before downloading plugins - Add directory traversal protection: validate plugin IDs to prevent '../' and path separator attacks that could write outside the target directory - Add ValidationError type for security validation failures Concurrency fixes: - Replace tokio::sync::RwLock with std::sync::Mutex in PluginHostState for widgets, keybindings, events, and toasts collections - Remove block_on() calls in WASM host functions (register_widget, register_keybinding, show_toast, emit_event) to prevent potential deadlocks when tokio runtime is already blocked on the WASM call - Add proper error handling for poisoned mutex locks Code clarity: - Add clarifying comments for JSON validation in emit_event to explain why empty data strings are intentionally allowed (represents 'no data' case) - Add comprehensive documentation for security measures Tests: - Add tests for SSRF protection (private IPs, dangerous ports, non-HTTPS) - Add tests for directory traversal prevention - All 108 tests pass * fix(plugins): fix clippy and formatting issues for CI compliance - Fix collapsible if statements in plugin_cmd.rs validation functions - Apply cargo fmt formatting to registry.rs SSRF tests - Refactor nested conditionals to satisfy clippy warnings - All 108 cortex-plugins tests pass * fix(plugins): disable async_support to match sync host functions Address Greptile review feedback: async_support(true) was incompatible with the synchronous Mutex-based host functions. Disabled async support since all WASM host functions now use std::sync::Mutex instead of async locks to prevent potential deadlocks. * fix: resolve flaky tests in CI for config_discovery and batch handlers - test_caching: Remove race-prone assertion checking cache_size() after clear_cache() call. The test now properly verifies cache behavior by checking that cached results match original results and that clear_cache() properly empties the cache. - test_parallel_execution_performance: Increase timing threshold from 100ms to 500ms to account for slower CI runners (especially Windows VMs) and system load variability. The test still validates that parallel execution is significantly faster than sequential would be. Fixes CI failures on: - PR #12 (fix/macos-cache-detection) - Ubuntu test_caching assertion - PR #9 (feature/complete-plugin-system) - Windows timing assertion - PR #12 (fix/macos-cache-detection) - Windows timing assertion
1 parent a16537e commit a13a94b

File tree

26 files changed

+8372
-20
lines changed

26 files changed

+8372
-20
lines changed

Cargo.lock

Lines changed: 108 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)