sen_plugin_host/permission/mod.rs
1//! Permission system for plugin capabilities
2//!
3//! This module provides a flexible, customizable permission system for controlling
4//! what capabilities plugins can access. It's designed as a framework that
5//! application developers can customize to fit their needs.
6//!
7//! # Architecture
8//!
9//! ```text
10//! ┌─────────────────────────────────────────────────────────────────────────┐
11//! │ PermissionConfig │
12//! │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│
13//! │ │ Strategy │ │ Store │ │ Prompt │ │ Audit ││
14//! │ │ │ │ │ │ │ │ ││
15//! │ │ - Default │ │ - File │ │ - Terminal │ │ - File (JSONL) ││
16//! │ │ - Strict │ │ - Memory │ │ - Auto │ │ - Memory ││
17//! │ │ - Permissive│ │ - ReadOnly │ │ - Recording │ │ - Null ││
18//! │ │ - CI │ │ │ │ │ │ - Composite ││
19//! │ │ - TrustAll │ │ │ │ │ │ ││
20//! │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────────────┘│
21//! └─────────────────────────────────────────────────────────────────────────┘
22//! ```
23//!
24//! # Quick Start
25//!
26//! ## Using Presets
27//!
28//! ```rust,ignore
29//! use sen_plugin_host::permission::PermissionPresets;
30//!
31//! // Interactive development
32//! let config = PermissionPresets::interactive("myapp")?;
33//!
34//! // CI/CD pipeline
35//! let config = PermissionPresets::ci("myapp", None)?;
36//!
37//! // Testing
38//! let config = PermissionPresets::testing();
39//! ```
40//!
41//! ## Custom Configuration
42//!
43//! ```rust,ignore
44//! use sen_plugin_host::permission::{
45//! PermissionConfigBuilder,
46//! DefaultPermissionStrategy,
47//! MemoryPermissionStore,
48//! TerminalPromptHandler,
49//! TrustFlagConfig,
50//! };
51//! use sen_plugin_host::audit::NullAuditSink;
52//!
53//! let config = PermissionConfigBuilder::new()
54//! .app_name("myapp")
55//! .strategy(DefaultPermissionStrategy)
56//! .store(MemoryPermissionStore::new())
57//! .prompt(TerminalPromptHandler::new())
58//! .audit(NullAuditSink)
59//! .trust_flags(TrustFlagConfig::default())
60//! .build()?;
61//! ```
62//!
63//! # Components
64//!
65//! ## Strategy
66//!
67//! Controls how permission decisions are made:
68//!
69//! | Strategy | Granularity | Prompts | Best For |
70//! |----------|-------------|---------|----------|
71//! | Default | Plugin | When needed | General use |
72//! | Strict | Command | Always (interactive) | Security |
73//! | Permissive | Plugin | Network only | Development |
74//! | CI | Plugin | Never | CI/CD |
75//! | TrustAll | Plugin | Never | Testing only |
76//!
77//! ## Store
78//!
79//! Persists granted permissions:
80//!
81//! - `FilePermissionStore`: JSON file in config directory
82//! - `MemoryPermissionStore`: In-memory (session only)
83//! - `ReadOnlyPermissionStore`: Wrapper that prevents writes
84//!
85//! ## Prompt
86//!
87//! Handles user interaction:
88//!
89//! - `TerminalPromptHandler`: Interactive terminal prompts
90//! - `AutoPromptHandler`: Automatic approve/deny
91//! - `RecordingPromptHandler`: Records prompts (testing)
92//!
93//! ## Trust Flags
94//!
95//! Configurable CLI flags for explicit trust:
96//!
97//! ```bash
98//! # Default format
99//! myapp --trust-plugin=hello run
100//!
101//! # Allow-style (configurable)
102//! myapp --allow-plugin=hello run
103//!
104//! # Custom aliases
105//! myapp --yolo run # Trust all (if configured)
106//! ```
107
108pub mod presets;
109pub mod prompt;
110pub mod store;
111pub mod strategy;
112pub mod trust;
113
114// Re-exports for convenience
115pub use presets::{PermissionConfig, PermissionConfigBuilder, PermissionPresets, PresetError};
116pub use prompt::{AutoPromptHandler, RecordingPromptHandler, TerminalPromptHandler};
117pub use prompt::{PromptError, PromptHandler, PromptResult};
118pub use store::{FilePermissionStore, MemoryPermissionStore, ReadOnlyPermissionStore};
119pub use store::{PermissionStore, StoreError, StoredPermission, StoredTrustLevel};
120pub use strategy::{
121 CiPermissionStrategy, DefaultPermissionStrategy, PermissivePermissionStrategy,
122 StrictPermissionStrategy, TrustAllStrategy,
123};
124pub use strategy::{
125 PermissionContext, PermissionDecision, PermissionGranularity, PermissionStrategy,
126};
127pub use trust::{
128 TrustDirectives, TrustEffect, TrustFlagAlias, TrustFlagConfig, TrustFlagPresets, TrustTarget,
129};