11/// Claude Code Session-Persistent Architecture Demonstration
2- ///
2+ ///
33/// This example demonstrates the Session-Persistent Agent Architecture
44/// using only Claude Code provider for simplicity:
55/// - tmux-based session management with pause/resume/detach
@@ -15,9 +15,7 @@ use tracing::info;
1515
1616// Import ccswarm core features
1717use ccswarm:: auto_accept:: { AutoAcceptConfig , OperationType } ;
18- use ccswarm:: identity:: {
19- default_backend_role, default_devops_role, default_frontend_role,
20- } ;
18+ use ccswarm:: identity:: { default_backend_role, default_devops_role, default_frontend_role} ;
2119use ccswarm:: monitoring:: { MonitoringSystem , OutputType } ;
2220use ccswarm:: session:: { AgentSession , SessionManager } ;
2321use ccswarm:: workspace:: SimpleWorkspaceManager ;
@@ -76,13 +74,13 @@ async fn main() -> Result<()> {
7674 // Initialize session manager and monitoring
7775 let session_manager = SessionManager :: new ( ) ?;
7876 let monitoring_system = MonitoringSystem :: new ( ) ;
79-
77+
8078 // Configure auto-accept with custom safety rules for Claude Code
8179 let auto_accept_config = AutoAcceptConfig {
8280 enabled : true ,
8381 max_file_changes : 10 ,
8482 require_tests_pass : true ,
85- max_execution_time : 600 , // 10 minutes
83+ max_execution_time : 600 , // 10 minutes
8684 require_clean_git : false , // Allow dirty git for demo
8785 emergency_stop : false ,
8886 trusted_operations : vec ! [
@@ -111,31 +109,27 @@ async fn main() -> Result<()> {
111109 2 , // Very low risk
112110 DemoTaskType :: Development ,
113111 ) ,
114-
115112 // Documentation task - ideal for Claude Code
116113 DemoTask :: new(
117114 "cc-docs-1" ,
118115 "Generate comprehensive API documentation with examples" ,
119116 1 , // Extremely low risk
120117 DemoTaskType :: Documentation ,
121118 ) ,
122-
123119 // Code refactoring - medium risk
124120 DemoTask :: new(
125121 "cc-refactor-1" ,
126122 "Refactor authentication middleware for better error handling" ,
127123 4 , // Medium risk
128124 DemoTaskType :: Development ,
129125 ) ,
130-
131126 // Testing task - good for auto-accept
132127 DemoTask :: new(
133128 "cc-test-1" ,
134129 "Write comprehensive unit tests for payment service" ,
135130 3 , // Low-medium risk
136131 DemoTaskType :: Testing ,
137132 ) ,
138-
139133 // Infrastructure configuration - higher risk
140134 DemoTask :: new(
141135 "cc-infra-1" ,
@@ -146,7 +140,10 @@ async fn main() -> Result<()> {
146140 ] ;
147141
148142 for task in & demo_tasks {
149- info ! ( "📝 Task: {} (Risk: {}/10)" , task. description, task. risk_level) ;
143+ info ! (
144+ "📝 Task: {} (Risk: {}/10)" ,
145+ task. description, task. risk_level
146+ ) ;
150147 }
151148
152149 info ! ( "\n 🤖 Creating Claude Code agent sessions..." ) ;
@@ -160,7 +157,7 @@ async fn main() -> Result<()> {
160157 false , // foreground mode
161158 ) ,
162159 (
163- "Claude Code Backend" ,
160+ "Claude Code Backend" ,
164161 default_backend_role( ) ,
165162 true , // auto_accept for API tasks
166163 false , // foreground mode
@@ -183,7 +180,12 @@ async fn main() -> Result<()> {
183180 format ! ( "{}-session" , name. to_lowercase( ) . replace( " " , "-" ) ) ,
184181 role. clone ( ) ,
185182 project_dir
186- . join ( & name. to_lowercase ( ) . replace ( " " , "_" ) . replace ( "claude_code_" , "" ) )
183+ . join (
184+ & name
185+ . to_lowercase ( )
186+ . replace ( " " , "_" )
187+ . replace ( "claude_code_" , "" ) ,
188+ )
187189 . to_string_lossy ( )
188190 . to_string ( ) ,
189191 Some ( format ! ( "{} session using Claude Code provider" , name) ) ,
@@ -202,24 +204,29 @@ async fn main() -> Result<()> {
202204 }
203205
204206 // Register with monitoring
205- let _ = monitoring_system. register_agent ( session. agent_id . clone ( ) ) . map_err ( |e| anyhow:: anyhow!( e) ) ?;
207+ let _ = monitoring_system
208+ . register_agent ( session. agent_id . clone ( ) )
209+ . map_err ( |e| anyhow:: anyhow!( e) ) ?;
206210
207211 sessions. push ( ( name. to_string ( ) , session) ) ;
208212 }
209213
210214 // Demonstrate Claude Code session persistence
211215 info ! ( "\n 🔄 Demonstrating Claude Code Session Persistence..." ) ;
212-
216+
213217 // Simulate session pause and resume with Claude Code
214218 if let Some ( ( name, session) ) = sessions. get ( 0 ) {
215219 info ! ( "Pausing {} Claude Code session..." , name) ;
216220 session_manager. pause_session ( & session. id ) ?;
217-
221+
218222 tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
219-
220- info ! ( "Resuming {} Claude Code session (context preserved)..." , name) ;
223+
224+ info ! (
225+ "Resuming {} Claude Code session (context preserved)..." ,
226+ name
227+ ) ;
221228 session_manager. resume_session ( & session. id ) ?;
222-
229+
223230 info ! ( "✅ Claude Code session context preserved - no token regeneration!" ) ;
224231 }
225232
@@ -236,28 +243,34 @@ async fn main() -> Result<()> {
236243
237244 // Select Claude Code agent based on task type
238245 let agent_index = select_claude_code_agent ( & task, & sessions) ;
239-
246+
240247 if let Some ( index) = agent_index {
241248 let ( name, session) = & sessions[ index] ;
242-
249+
243250 // Get current session state for Claude Code
244- let current_session = session_manager. get_session ( & session. id )
251+ let current_session = session_manager
252+ . get_session ( & session. id )
245253 . unwrap_or_else ( || session. clone ( ) ) ;
246-
254+
247255 // Claude Code specific risk assessment
248- let should_auto_accept = task. risk_level <= 4
249- && current_session. auto_accept
250- && matches ! ( task. task_type,
251- DemoTaskType :: Development |
252- DemoTaskType :: Documentation |
253- DemoTaskType :: Testing
256+ let should_auto_accept = task. risk_level <= 4
257+ && current_session. auto_accept
258+ && matches ! (
259+ task. task_type,
260+ DemoTaskType :: Development | DemoTaskType :: Documentation | DemoTaskType :: Testing
254261 ) ;
255-
262+
256263 if should_auto_accept {
257- info ! ( " ✅ Claude Code auto-accepting task (risk: {})" , task. risk_level) ;
264+ info ! (
265+ " ✅ Claude Code auto-accepting task (risk: {})" ,
266+ task. risk_level
267+ ) ;
258268 auto_accepted += 1 ;
259269 } else {
260- info ! ( " 🔍 Claude Code requires manual review (risk: {})" , task. risk_level) ;
270+ info ! (
271+ " 🔍 Claude Code requires manual review (risk: {})" ,
272+ task. risk_level
273+ ) ;
261274 manual_review += 1 ;
262275 }
263276
@@ -286,7 +299,7 @@ async fn main() -> Result<()> {
286299 Some ( task. id . clone ( ) ) ,
287300 session. id . clone ( ) ,
288301 ) ;
289-
302+
290303 tokio:: time:: sleep ( std:: time:: Duration :: from_millis ( 400 ) ) . await ;
291304 }
292305
@@ -302,7 +315,7 @@ async fn main() -> Result<()> {
302315
303316 completed += 1 ;
304317 }
305-
318+
306319 tokio:: time:: sleep ( std:: time:: Duration :: from_millis ( 200 ) ) . await ;
307320 }
308321
@@ -311,19 +324,26 @@ async fn main() -> Result<()> {
311324 info ! ( "Claude Code Provider: ✅ Active" ) ;
312325 info ! ( "Total Tasks: {}" , demo_tasks_len) ;
313326 info ! ( "Completed: {}" , completed) ;
314- info ! ( "Auto-Accepted: {} ({}% efficiency gain)" ,
315- auto_accepted,
316- if completed > 0 { ( auto_accepted as f64 / completed as f64 * 100.0 ) as u32 } else { 0 }
327+ info ! (
328+ "Auto-Accepted: {} ({}% efficiency gain)" ,
329+ auto_accepted,
330+ if completed > 0 {
331+ ( auto_accepted as f64 / completed as f64 * 100.0 ) as u32
332+ } else {
333+ 0
334+ }
317335 ) ;
318336 info ! ( "Manual Review: {}" , manual_review) ;
319337
320338 // Demonstrate Claude Code token savings
321339 let traditional_tokens = demo_tasks_len * 45_000 ; // Claude Code typical context
322340 let persistent_tokens = 45_000 + ( demo_tasks_len * 800 ) ; // Claude Code efficiency
323- let savings = if traditional_tokens > 0 {
324- ( ( traditional_tokens - persistent_tokens) as f64 / traditional_tokens as f64 * 100.0 ) as u32
325- } else { 0 } ;
326-
341+ let savings = if traditional_tokens > 0 {
342+ ( ( traditional_tokens - persistent_tokens) as f64 / traditional_tokens as f64 * 100.0 ) as u32
343+ } else {
344+ 0
345+ } ;
346+
327347 info ! ( "\n 💰 Claude Code Token Usage:" ) ;
328348 info ! ( "Traditional: ~{} tokens" , traditional_tokens) ;
329349 info ! ( "Session-Persistent: ~{} tokens" , persistent_tokens) ;
@@ -332,13 +352,28 @@ async fn main() -> Result<()> {
332352 // Show Claude Code session statistics
333353 info ! ( "\n 🔄 Claude Code Session Statistics:" ) ;
334354 for ( name, session) in & sessions {
335- let current_session = session_manager. get_session ( & session. id )
355+ let current_session = session_manager
356+ . get_session ( & session. id )
336357 . unwrap_or_else ( || session. clone ( ) ) ;
337358 info ! ( "{}:" , name) ;
338359 info ! ( " - Provider: Claude Code" ) ;
339360 info ! ( " - Status: {:?}" , current_session. status) ;
340- info ! ( " - Auto-Accept: {}" , if current_session. auto_accept { "✅ Enabled" } else { "❌ Disabled" } ) ;
341- info ! ( " - Background: {}" , if current_session. background_mode { "Yes" } else { "No" } ) ;
361+ info ! (
362+ " - Auto-Accept: {}" ,
363+ if current_session. auto_accept {
364+ "✅ Enabled"
365+ } else {
366+ "❌ Disabled"
367+ }
368+ ) ;
369+ info ! (
370+ " - Background: {}" ,
371+ if current_session. background_mode {
372+ "Yes"
373+ } else {
374+ "No"
375+ }
376+ ) ;
342377 info ! ( " - Tasks: {}" , current_session. tasks_processed) ;
343378 }
344379
@@ -347,10 +382,10 @@ async fn main() -> Result<()> {
347382 if let Some ( ( name, session) ) = sessions. get ( 0 ) {
348383 info ! ( "Detaching {} Claude Code session..." , name) ;
349384 session_manager. detach_session ( & session. id ) ?;
350-
385+
351386 info ! ( "Claude Code session running detached - no context loss" ) ;
352387 tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
353-
388+
354389 info ! ( "Reattaching to Claude Code session..." ) ;
355390 session_manager. attach_session ( & session. id ) ?;
356391 info ! ( "✅ Claude Code session reattached successfully!" ) ;
@@ -374,42 +409,52 @@ async fn main() -> Result<()> {
374409 }
375410
376411 info ! ( "\n 🎉 Claude Code Session-Persistent Demo Complete!" ) ;
377- info ! ( "✨ Achieved {}% token reduction with Claude Code only!" , savings) ;
412+ info ! (
413+ "✨ Achieved {}% token reduction with Claude Code only!" ,
414+ savings
415+ ) ;
378416 info ! ( "🤖 Claude Code provider successfully demonstrated session persistence" ) ;
379417
380418 Ok ( ( ) )
381419}
382420
383421/// Select Claude Code agent based on task type and availability
384- fn select_claude_code_agent (
385- task : & DemoTask ,
386- sessions : & [ ( String , AgentSession ) ] ,
387- ) -> Option < usize > {
422+ fn select_claude_code_agent ( task : & DemoTask , sessions : & [ ( String , AgentSession ) ] ) -> Option < usize > {
388423 let description = task. description . to_lowercase ( ) ;
389-
424+
390425 for ( index, ( name, session) ) in sessions. iter ( ) . enumerate ( ) {
391426 let name_lower = name. to_lowercase ( ) ;
392-
427+
393428 let matches = match task. task_type {
394429 DemoTaskType :: Development => {
395- if description. contains ( "react" ) || description. contains ( "component" ) || description. contains ( "typescript" ) {
430+ if description. contains ( "react" )
431+ || description. contains ( "component" )
432+ || description. contains ( "typescript" )
433+ {
396434 name_lower. contains ( "frontend" )
397- } else if description. contains ( "api" ) || description. contains ( "middleware" ) || description. contains ( "auth" ) {
435+ } else if description. contains ( "api" )
436+ || description. contains ( "middleware" )
437+ || description. contains ( "auth" )
438+ {
398439 name_lower. contains ( "backend" )
399440 } else {
400441 true // Any Claude Code agent can handle general development
401442 }
402443 }
403444 DemoTaskType :: Infrastructure => name_lower. contains ( "devops" ) ,
404445 DemoTaskType :: Documentation => true , // Claude Code excels at documentation
405- DemoTaskType :: Testing => name_lower. contains ( "backend" ) || name_lower. contains ( "frontend" ) , // Both can handle testing
446+ DemoTaskType :: Testing => {
447+ name_lower. contains ( "backend" ) || name_lower. contains ( "frontend" )
448+ } // Both can handle testing
406449 } ;
407-
450+
408451 if matches && session. is_runnable ( ) {
409452 return Some ( index) ;
410453 }
411454 }
412-
455+
413456 // Fallback to first available Claude Code agent
414- sessions. iter ( ) . position ( |( _, session) | session. is_runnable ( ) )
415- }
457+ sessions
458+ . iter ( )
459+ . position ( |( _, session) | session. is_runnable ( ) )
460+ }
0 commit comments