mockforge_core/ai_studio/
config.rs

1//! Configuration for AI Studio
2//!
3//! This module defines configuration structures for the AI Studio, including
4//! deterministic mode settings, budget controls, and feature toggles.
5
6use serde::{Deserialize, Serialize};
7
8/// AI Studio configuration
9#[derive(Debug, Clone, Serialize, Deserialize, Default)]
10#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
11pub struct AiStudioConfig {
12    /// Deterministic mode configuration
13    #[serde(default)]
14    pub deterministic_mode: DeterministicModeConfig,
15
16    /// Budget and cost controls
17    #[serde(default)]
18    pub budgets: BudgetConfig,
19
20    /// Feature toggles
21    #[serde(default)]
22    pub features: FeatureConfig,
23}
24
25/// Deterministic mode configuration
26///
27/// When enabled, AI-generated artifacts are automatically frozen to
28/// deterministic YAML/JSON files for version control and reproducible testing.
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
31pub struct DeterministicModeConfig {
32    /// Whether deterministic mode is enabled
33    #[serde(default = "default_false")]
34    pub enabled: bool,
35
36    /// Automatically freeze AI-generated artifacts after creation
37    #[serde(default = "default_true")]
38    pub auto_freeze: bool,
39
40    /// Format for frozen artifacts (yaml or json)
41    #[serde(default = "default_freeze_format")]
42    pub freeze_format: String,
43
44    /// Directory to store frozen artifacts
45    #[serde(default = "default_freeze_directory")]
46    pub freeze_directory: String,
47}
48
49impl Default for DeterministicModeConfig {
50    fn default() -> Self {
51        Self {
52            enabled: false,
53            auto_freeze: true,
54            freeze_format: "yaml".to_string(),
55            freeze_directory: ".mockforge/frozen".to_string(),
56        }
57    }
58}
59
60/// Budget configuration for AI usage
61#[derive(Debug, Clone, Serialize, Deserialize)]
62#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
63pub struct BudgetConfig {
64    /// Maximum tokens per workspace
65    #[serde(default = "default_max_tokens")]
66    pub max_tokens_per_workspace: u64,
67
68    /// Maximum AI calls per day
69    #[serde(default = "default_max_calls")]
70    pub max_ai_calls_per_day: u64,
71
72    /// Rate limit per minute
73    #[serde(default = "default_rate_limit")]
74    pub rate_limit_per_minute: u64,
75
76    /// Budget alerts threshold (percentage)
77    #[serde(default = "default_alert_threshold")]
78    pub alert_threshold: f64,
79}
80
81impl Default for BudgetConfig {
82    fn default() -> Self {
83        Self {
84            max_tokens_per_workspace: 100_000,
85            max_ai_calls_per_day: 1_000,
86            rate_limit_per_minute: 10,
87            alert_threshold: 0.8, // Alert at 80% usage
88        }
89    }
90}
91
92/// Feature configuration for enabling/disabling specific AI features
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
95pub struct FeatureConfig {
96    /// Enable mock generation from natural language
97    #[serde(default = "default_true")]
98    pub mock_generation: bool,
99
100    /// Enable AI contract diff analysis
101    #[serde(default = "default_true")]
102    pub contract_diff: bool,
103
104    /// Enable persona generation
105    #[serde(default = "default_true")]
106    pub persona_generation: bool,
107
108    /// Enable free-form generation (general chat)
109    #[serde(default = "default_true")]
110    pub free_form_generation: bool,
111
112    /// Enable AI-guided debugging
113    #[serde(default = "default_true")]
114    pub debug_analysis: bool,
115}
116
117impl Default for FeatureConfig {
118    fn default() -> Self {
119        Self {
120            mock_generation: true,
121            contract_diff: true,
122            persona_generation: true,
123            free_form_generation: true,
124            debug_analysis: true,
125        }
126    }
127}
128
129// Helper functions for default values
130
131fn default_false() -> bool {
132    false
133}
134
135fn default_true() -> bool {
136    true
137}
138
139fn default_freeze_format() -> String {
140    "yaml".to_string()
141}
142
143fn default_freeze_directory() -> String {
144    ".mockforge/frozen".to_string()
145}
146
147fn default_max_tokens() -> u64 {
148    100_000
149}
150
151fn default_max_calls() -> u64 {
152    1_000
153}
154
155fn default_rate_limit() -> u64 {
156    10
157}
158
159fn default_alert_threshold() -> f64 {
160    0.8
161}