44import inspect
55import re
66import time
7+ from pathlib import Path
78from typing import Any , Callable
89
910from minicode .config import describe_fallback_guidance , describe_provider_channel
@@ -361,7 +362,7 @@ def _register_tool_capabilities(tools: ToolRegistry) -> None:
361362 description = tool_def .description or f"Tool: { tool_name } " ,
362363 tags = ["tool" , tool_name ],
363364 )
364- registry .register (metadata , lambda ** kw : tools .execute (tool_name , kw , ToolContext ()), None )
365+ registry .register (metadata , lambda ** kw : tools .execute (tool_name , kw , ToolContext (cwd = str ( Path . cwd ()) )), None )
365366 except Exception as e :
366367 logger .debug ("Failed to register tool %s as capability: %s" , tool_name , e )
367368
@@ -615,24 +616,27 @@ def _apply_control_signal(
615616 and hasattr (context_compactor , "_tool_budget" )
616617 and context_compactor ._tool_budget
617618 ):
619+ tb = context_compactor ._tool_budget
618620 new_budget = max (
619621 1000 ,
620622 int (
621- context_compactor . _tool_budget . budget_per_message
623+ getattr ( tb , " budget_per_message" , 2000 )
622624 * control_signal .adjust_token_budget
623625 ),
624626 )
625- context_compactor ._tool_budget .budget_per_message = new_budget
627+ if hasattr (tb , "budget_per_message" ):
628+ tb .budget_per_message = new_budget
626629 logger .info (
627630 "FeedbackController: token budget adjusted to %d (mult=%.2f)" ,
628631 new_budget , control_signal .adjust_token_budget ,
629632 )
630633
631634 if control_signal .reduce_parallelism :
632- tool_scheduler ._force_max_workers = min (
633- getattr (tool_scheduler , "_force_max_workers" , 2 ) or 2 ,
634- 2 ,
635- )
635+ if hasattr (tool_scheduler , "_force_max_workers" ):
636+ tool_scheduler ._force_max_workers = min (
637+ getattr (tool_scheduler , "_force_max_workers" , 2 ) or 2 ,
638+ 2 ,
639+ )
636640 logger .info (
637641 "FeedbackController: reduce_parallelism -> max_workers=2 "
638642 "(oscillation=%.2f)" ,
@@ -641,7 +645,8 @@ def _apply_control_signal(
641645
642646 if control_signal .adjust_concurrency != 0 :
643647 cap = max (1 , 4 + control_signal .adjust_concurrency )
644- tool_scheduler ._force_max_workers = cap
648+ if hasattr (tool_scheduler , "_force_max_workers" ):
649+ tool_scheduler ._force_max_workers = cap
645650 logger .info (
646651 "FeedbackController: adjust_concurrency=%+d -> max_workers=%d" ,
647652 control_signal .adjust_concurrency , cap ,
@@ -654,7 +659,8 @@ def _apply_control_signal(
654659 system_state .performance_score (),
655660 )
656661 if model_switcher :
657- model_switcher ._pending_upgrade = True
662+ if hasattr (model_switcher , '_pending_upgrade' ):
663+ model_switcher ._pending_upgrade = True # type: ignore[attr-defined]
658664
659665 if control_signal .decrease_model_level :
660666 logger .info (
@@ -666,7 +672,8 @@ def _apply_control_signal(
666672 logger .info ("FeedbackController: persisting working memory" )
667673 if context_compactor and hasattr (context_compactor , "_tool_budget" ):
668674 try :
669- context_compactor ._tool_budget .flush ()
675+ if hasattr (context_compactor ._tool_budget , "flush" ):
676+ context_compactor ._tool_budget .flush ()
670677 except Exception :
671678 pass
672679
@@ -676,29 +683,32 @@ def _apply_control_signal(
676683 system_state .pattern_reuse_rate ,
677684 )
678685 # Queue skill update for next maintenance cycle
679- if not hasattr (tool_scheduler , ' _pending_skill_update' ):
680- tool_scheduler ._pending_skill_update = True
686+ if not hasattr (tool_scheduler , " _pending_skill_update" ):
687+ tool_scheduler ._pending_skill_update = True # type: ignore[attr-defined]
681688 logger .info ("FeedbackController: skill update queued for next maintenance cycle" )
682689
683690 if control_signal .reduce_tool_timeout :
684691 new_timeout = max (5.0 , control_signal .reduce_tool_timeout )
685- tool_scheduler ._force_tool_timeout = new_timeout
692+ if hasattr (tool_scheduler , "_force_tool_timeout" ):
693+ tool_scheduler ._force_tool_timeout = new_timeout # type: ignore[attr-defined]
686694 logger .info (
687695 "FeedbackController: tool timeout reduced to %.1fs (high error rate)" ,
688696 new_timeout ,
689697 )
690698 elif hasattr (tool_scheduler , '_force_tool_timeout' ):
691699 # Reset timeout when signal no longer active
692- del tool_scheduler ._force_tool_timeout
700+ if hasattr (tool_scheduler , '_force_tool_timeout' ):
701+ del tool_scheduler ._force_tool_timeout
693702
694703 if control_signal .increase_nudge_frequency :
695- tool_scheduler ._force_nudge_frequency = True
704+ tool_scheduler ._force_nudge_frequency = True # type: ignore[attr-defined]
696705 logger .info (
697706 "FeedbackController: nudge frequency increased (stability=%.2f)" ,
698707 system_state .stability_score (),
699708 )
700709 elif hasattr (tool_scheduler , '_force_nudge_frequency' ):
701- del tool_scheduler ._force_nudge_frequency
710+ if hasattr (tool_scheduler , '_force_nudge_frequency' ):
711+ del tool_scheduler ._force_nudge_frequency
702712
703713 if control_signal .promote_pattern :
704714 if feedback_controller :
@@ -712,7 +722,7 @@ def _apply_control_signal(
712722
713723 if control_signal .force_compaction and context_compactor :
714724 try :
715- compacted = context_compactor .compact_messages ()
725+ compacted = context_compactor .compact_messages () if hasattr ( context_compactor , 'compact_messages' ) else False
716726 logger .info (
717727 "FeedbackController: forced compaction completed (%d messages)" ,
718728 len (compacted ) if compacted else 0 ,
@@ -1156,7 +1166,7 @@ def emit_runtime_event(
11561166 if compaction_breaker .is_allowed ():
11571167 try :
11581168 logger .warning ("Context near limit, auto-compacting..." )
1159- current_messages = context_manager . compact_messages ()
1169+ current_messages = getattr ( context_manager , ' compact_messages' , lambda : current_messages ) ()
11601170 compaction_breaker .record_success ()
11611171 except Exception as exc :
11621172 compaction_breaker .record_failure ()
@@ -1187,7 +1197,7 @@ def emit_runtime_event(
11871197 and compaction_breaker .is_allowed ()
11881198 ):
11891199 try :
1190- current_messages = context_manager . compact_messages ()
1200+ current_messages = getattr ( context_manager , ' compact_messages' , lambda : current_messages ) ()
11911201 compaction_breaker .record_success ()
11921202 except Exception as exc :
11931203 compaction_breaker .record_failure ()
@@ -2077,7 +2087,7 @@ def emit_runtime_event(
20772087 pass
20782088 elif reflection_engine and prelude .task :
20792089 try :
2080- execution_trace : list [dict [str , Any ]] = [
2090+ _trace : list [dict [str , Any ]] = [
20812091 {"type" : "tool_call" , "count" : turn_state .step },
20822092 {
20832093 "type" : "error" ,
@@ -2119,13 +2129,15 @@ def emit_runtime_event(
21192129 try :
21202130 scope = MemoryScope (scope_name )
21212131 if scope in _mgr .memories :
2122- entry = _mgr .memories [scope ]._id_index .get (mem .id )
2123- if entry :
2124- entry .usage_count += (
2125- 2 if turn_state .tool_error_count == 0 else - 1
2126- )
2127- entry .last_accessed = time .time ()
2128- break
2132+ mem_store = _mgr .memories [scope ]
2133+ if hasattr (mem_store , "_id_index" ):
2134+ entry = mem_store ._id_index .get (mem .id )
2135+ if entry :
2136+ entry .usage_count += (
2137+ 2 if turn_state .tool_error_count == 0 else - 1
2138+ )
2139+ entry .last_accessed = time .time ()
2140+ break
21292141 entry .last_accessed = time .time ()
21302142 break
21312143 except (ValueError , KeyError ):
@@ -2292,7 +2304,8 @@ def emit_runtime_event(
22922304 system_state .error_frequency , system_state .performance_score (),
22932305 )
22942306 if model_switcher :
2295- model_switcher ._pending_upgrade = True
2307+ if hasattr (model_switcher , '_pending_upgrade' ):
2308+ model_switcher ._pending_upgrade = True # type: ignore[attr-defined]
22962309 if control_signal .decrease_model_level :
22972310 logger .info (
22982311 "FeedbackController: model downgrade recommended (efficiency=%.2f)" ,
@@ -2313,22 +2326,25 @@ def emit_runtime_event(
23132326
23142327 if control_signal .reduce_tool_timeout :
23152328 new_timeout = max (5.0 , control_signal .reduce_tool_timeout )
2316- tool_scheduler ._force_tool_timeout = new_timeout
2329+ if hasattr (tool_scheduler , "_force_tool_timeout" ):
2330+ tool_scheduler ._force_tool_timeout = new_timeout # type: ignore[attr-defined]
23172331 logger .info (
23182332 "FeedbackController: tool timeout reduced to %.1fs" ,
23192333 new_timeout ,
23202334 )
23212335 elif hasattr (tool_scheduler , '_force_tool_timeout' ):
2322- del tool_scheduler ._force_tool_timeout
2336+ if hasattr (tool_scheduler , '_force_tool_timeout' ):
2337+ del tool_scheduler ._force_tool_timeout
23232338
23242339 if control_signal .increase_nudge_frequency :
2325- tool_scheduler ._force_nudge_frequency = True
2340+ tool_scheduler ._force_nudge_frequency = True # type: ignore[attr-defined]
23262341 logger .info (
23272342 "FeedbackController: nudge frequency increased (stability=%.2f)" ,
23282343 system_state .stability_score (),
23292344 )
23302345 elif hasattr (tool_scheduler , '_force_nudge_frequency' ):
2331- del tool_scheduler ._force_nudge_frequency
2346+ if hasattr (tool_scheduler , '_force_nudge_frequency' ):
2347+ del tool_scheduler ._force_nudge_frequency
23322348
23332349 if control_signal .promote_pattern :
23342350 feedback_controller .record_pattern_effectiveness (
@@ -2341,7 +2357,7 @@ def emit_runtime_event(
23412357
23422358 if control_signal .force_compaction and context_compactor :
23432359 try :
2344- compacted = context_compactor .compact_messages ()
2360+ compacted = context_compactor .compact_messages () if hasattr ( context_compactor , 'compact_messages' ) else False
23452361 logger .info (
23462362 "FeedbackController: forced compaction (%d messages)" ,
23472363 len (compacted ) if compacted else 0 ,
0 commit comments