guardianhub 0.1.330__tar.gz → 0.1.332__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. {guardianhub-0.1.330 → guardianhub-0.1.332}/PKG-INFO +3 -1
  2. {guardianhub-0.1.330 → guardianhub-0.1.332}/pyproject.toml +3 -2
  3. guardianhub-0.1.332/src/guardianhub/_version.py +1 -0
  4. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/specialist_base.py +40 -10
  5. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/workflows/mission_skeleton.py +18 -10
  6. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/config/settings.py +1 -1
  7. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/agent_plan.py +14 -2
  8. guardianhub-0.1.330/src/guardianhub/_version.py +0 -1
  9. {guardianhub-0.1.330 → guardianhub-0.1.332}/.gitignore +0 -0
  10. {guardianhub-0.1.330 → guardianhub-0.1.332}/LICENSE +0 -0
  11. {guardianhub-0.1.330 → guardianhub-0.1.332}/README.md +0 -0
  12. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/__init__.py +0 -0
  13. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/AgentDesign.md +0 -0
  14. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/README.md +0 -0
  15. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/runtime.py +0 -0
  16. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/services/EpisodicManager.md +0 -0
  17. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/services/MemoryManager.md +0 -0
  18. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/services/episodic_manager.py +0 -0
  19. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/services/memory_manager.py +0 -0
  20. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/services/prompt_manager.py +0 -0
  21. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/workflows/__init__.py +0 -0
  22. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/workflows/agent_contract.py +0 -0
  23. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/workflows/constants.py +0 -0
  24. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/agents/workflows/muscle_factory.py +0 -0
  25. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/auth/token_provider.py +0 -0
  26. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/__init__.py +0 -0
  27. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/a2a_client.py +0 -0
  28. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/classification_client.py +0 -0
  29. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/consul_client.py +0 -0
  30. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/graph_db_client.py +0 -0
  31. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse/dataset_client.py +0 -0
  32. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse/manager.py +0 -0
  33. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse/prompt_client.py +0 -0
  34. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse/score_evaluation_client.py +0 -0
  35. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse/tracing_client.py +0 -0
  36. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/langfuse_client.py +0 -0
  37. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/llm_client.py +0 -0
  38. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/llm_worker.py +0 -0
  39. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/ocr_client.py +0 -0
  40. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/paperless_client.py +0 -0
  41. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/sovereign_base_client.py +0 -0
  42. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/text_cleaner_client.py +0 -0
  43. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/tool_registry_client.py +0 -0
  44. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/clients/vector_client.py +0 -0
  45. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/config/__init__.py +0 -0
  46. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/config/config_development.json +0 -0
  47. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/config/config_prod.json +0 -0
  48. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/http/http_client.py +0 -0
  49. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/logging/__init__.py +0 -0
  50. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/logging/logging.py +0 -0
  51. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/logging/logging_filters.py +0 -0
  52. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/__init__.py +0 -0
  53. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/__init__.py +0 -0
  54. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/__init__.py +0 -0
  55. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/action.py +0 -0
  56. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/attainment.py +0 -0
  57. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/base.py +0 -0
  58. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/completion.py +0 -0
  59. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/debrief.py +0 -0
  60. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/discovery.py +0 -0
  61. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/history.py +0 -0
  62. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/learning.py +0 -0
  63. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/support.py +0 -0
  64. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent/contracts/tactical.py +0 -0
  65. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/agent_models.py +0 -0
  66. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/base.py +0 -0
  67. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/builtins/vector_models.py +0 -0
  68. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/common/__init__.py +0 -0
  69. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/common/common.py +0 -0
  70. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/mission_blueprint.py +0 -0
  71. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/registry/client.py +0 -0
  72. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/registry/dynamic_loader.py +0 -0
  73. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/registry/loader.py +0 -0
  74. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/registry/registry.py +0 -0
  75. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/registry/signing.py +0 -0
  76. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/__init__.py +0 -0
  77. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/agent_response_evaluation.py +0 -0
  78. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/extraction.py +0 -0
  79. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/reflection_critique.py +0 -0
  80. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/semantic_tool.py +0 -0
  81. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/template/suggestion.py +0 -0
  82. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/tools/__init__.py +0 -0
  83. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/tools/tool_enrichment.py +0 -0
  84. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/web_search/__init__.py +0 -0
  85. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/models/web_search/search.py +0 -0
  86. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/__init__.py +0 -0
  87. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/auth_middleware.py +0 -0
  88. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/context_utils.py +0 -0
  89. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/instrumentation.py +0 -0
  90. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/otel_helper.py +0 -0
  91. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/otel_middlewares.py +0 -0
  92. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/observability/script.sh +0 -0
  93. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/persistence/__init__.py +0 -0
  94. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/persistence/manager.py +0 -0
  95. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/prompts/base.py +0 -0
  96. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/prompts/providers/langfuse_provider.py +0 -0
  97. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/prompts/providers/local_provider.py +0 -0
  98. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/prompts/registry.py +0 -0
  99. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/scripts/script.sh +0 -0
  100. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/services/base.py +0 -0
  101. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/template/__init__.py +0 -0
  102. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/tools/gh_registry_cli.py +0 -0
  103. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/utils/__init__.py +0 -0
  104. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/utils/app_state.py +0 -0
  105. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/utils/fastapi_utils.py +0 -0
  106. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/utils/json_utils.py +0 -0
  107. {guardianhub-0.1.330 → guardianhub-0.1.332}/src/guardianhub/utils/metrics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: guardianhub
3
- Version: 0.1.330
3
+ Version: 0.1.332
4
4
  Summary: Unified SDK for YantramOps Operating System
5
5
  Project-URL: Homepage, https://github.com/yantramai/guardianhub-sdk
6
6
  Project-URL: Source, https://github.com/yantramai/guardianhub-sdk
@@ -50,6 +50,7 @@ Requires-Dist: python-multipart>=0.0.6; extra == 'full'
50
50
  Requires-Dist: pytz>=2024.1; extra == 'full'
51
51
  Requires-Dist: sqlalchemy>=2.0.0; extra == 'full'
52
52
  Requires-Dist: temporalio>=1.5.0; extra == 'full'
53
+ Requires-Dist: toposort>=1.0.0; extra == 'full'
53
54
  Requires-Dist: uvicorn>=0.23.0; extra == 'full'
54
55
  Provides-Extra: mind
55
56
  Requires-Dist: backoff>=2.2.1; extra == 'mind'
@@ -67,6 +68,7 @@ Requires-Dist: python-dateutil>=2.9.0; extra == 'mind'
67
68
  Requires-Dist: pytz>=2024.1; extra == 'mind'
68
69
  Provides-Extra: muscle
69
70
  Requires-Dist: temporalio>=1.5.0; extra == 'muscle'
71
+ Requires-Dist: toposort>=1.0.0; extra == 'muscle'
70
72
  Provides-Extra: obs
71
73
  Requires-Dist: langfuse==3.10.1; extra == 'obs'
72
74
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.38.0; extra == 'obs'
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "guardianhub"
7
- version = "0.1.330" # This will be overridden by Hatch's dynamic version
7
+ version = "0.1.332" # This will be overridden by Hatch's dynamic version
8
8
  # Note: Keep _version.py as the source of truth for version
9
9
  description = "Unified SDK for YantramOps Operating System"
10
10
  authors = [
@@ -72,7 +72,8 @@ mind = [
72
72
  ]
73
73
  # MUSCLE: Execution and Workflow
74
74
  muscle = [
75
- "temporalio>=1.5.0"
75
+ "temporalio>=1.5.0",
76
+ "toposort>=1.0.0"
76
77
  ]
77
78
  # ALL: For local development convenience
78
79
  full = [
@@ -0,0 +1 @@
1
+ __version__ = '0.1.332'
@@ -78,6 +78,7 @@ class SovereignSpecialistBase:
78
78
 
79
79
  # 4. Domain Activity Instance (The Muscle)
80
80
  self.activities_instance = activities_instance
81
+ self.workflow_instance = kwargs.get('workflow_instance')
81
82
 
82
83
  # 🧬 THE FUSION MOVE
83
84
  if hasattr(self.activities_instance, "fuse_with_base"):
@@ -87,6 +88,15 @@ class SovereignSpecialistBase:
87
88
  self.router = APIRouter(prefix="/v1/mission")
88
89
  self._setup_routes()
89
90
 
91
+ def _get_val(self, obj: Any, key: str, default: Any = None) -> Any:
92
+ """Sovereign helper to extract values from Pydantic models or Dicts safely."""
93
+ if hasattr(obj, key):
94
+ return getattr(obj, key)
95
+ if isinstance(obj, dict):
96
+ return obj.get(key, default)
97
+ return default
98
+
99
+
90
100
  def get_client(self, client_name: str, client_type: Optional[T] = None) -> Optional[T]:
91
101
  """
92
102
  Retrieves an extension client from the custom registry.
@@ -96,6 +106,30 @@ class SovereignSpecialistBase:
96
106
  raise TypeError(f"Client {client_name} is not of type {client_type.__name__}")
97
107
  return client
98
108
 
109
+ def get_workflows(self) -> list:
110
+ """
111
+ Standardizes the discovery of the Agent's custom Intervention Workflow.
112
+ """
113
+ workflows = []
114
+
115
+ # 1. Harvest the Parent Skeleton (The SDK Law)
116
+ from .workflows.mission_skeleton import SpecialistMissionWorkflow
117
+ workflows.append(SpecialistMissionWorkflow)
118
+
119
+ # 2. Harvest the Agent's Muscle Workflow (The Specialist Expertise)
120
+ if self.workflow_instance:
121
+ # If the user passed a module or a class
122
+ import inspect
123
+ if inspect.isclass(self.workflow_instance):
124
+ workflows.append(self.workflow_instance)
125
+ else:
126
+ # Module scanning
127
+ for _, obj in inspect.getmembers(self.workflow_instance, inspect.isclass):
128
+ if hasattr(obj, "__temporal_workflow_definition"):
129
+ workflows.append(obj)
130
+
131
+ return workflows
132
+
99
133
 
100
134
  def get_activities(self) -> list:
101
135
  from temporalio import activity
@@ -520,24 +554,20 @@ class SovereignSpecialistBase:
520
554
  outcomes_str_list = []
521
555
 
522
556
  for report in brief.step_results:
523
- # 🚀 OBJECT ACCESS: report is likely AttainmentReport
524
- # Aggregate metrics safely
525
- metrics = getattr(report, "telemetry", {})
557
+ # 🚀 FIX: Use the class-level helper
558
+ metrics = self._get_val(report, "telemetry", {})
526
559
  for k, v in metrics.items():
527
560
  if isinstance(v, (int, float)):
528
561
  total_metrics[k] = total_metrics.get(k, 0.0) + v
529
562
 
530
- # Build narrative strings using object attributes
531
- status_label = "✅ SUCCESS" if getattr(report, "attained", False) else "❌ FAILED"
532
-
533
- # Use getattr for maximum resilience if fields might be missing
534
- step_id = getattr(report, "step_id", "unknown")
535
- score = getattr(report, "certainty_score", 0.0)
563
+ attained = self._get_val(report, "attained", False)
564
+ status_label = "✅ SUCCESS" if attained else "❌ FAILED"
565
+ step_id = self._get_val(report, "step_id", "unknown")
566
+ score = self._get_val(report, "certainty_score", 0.0)
536
567
 
537
568
  outcomes_str_list.append(
538
569
  f"- Step ID: {step_id} | Status: {status_label} | Certainty: {score}"
539
570
  )
540
-
541
571
  # 3. LLM Input Construction
542
572
  outcomes_str = "\n".join(outcomes_str_list)
543
573
  manual_user_input = f"""
@@ -10,7 +10,7 @@ from guardianhub.models.agent.contracts.action import ActionOutcome
10
10
  from guardianhub.models.agent.contracts.attainment import AttainmentCheck,AttainmentReport
11
11
  from guardianhub.models.agent.contracts.debrief import SummaryBrief,IntelligenceReport
12
12
  from guardianhub.models.agent.contracts.learning import AfterActionReport,LearningAnchor
13
- from guardianhub.models.agent.contracts.completion import MissionManifest,CallbackAck
13
+ from guardianhub.models.agent.contracts.completion import MissionManifest, CallbackAck, TacticalExecutionReport
14
14
 
15
15
  from .agent_contract import ActivityRoles
16
16
  from .constants import get_activity_options
@@ -91,16 +91,24 @@ class SpecialistMissionWorkflow:
91
91
  "reason": "Safety Audit Violation"
92
92
  }
93
93
 
94
- # 5. 🚀 ITERATIVE INTERVENTION: The Hands (Vamana/Parashurama)
95
- # SpecialistMissionWorkflow.run
96
- # 5. 🚀 MISSION EXECUTION: The Hands (Universal Intervention)
97
- # Instead of a loop, we pass the ENTIRE plan to the Agent once.
94
+ # Inside SpecialistMissionWorkflow.run (Step 5)
98
95
 
99
- mission_outcome = await workflow.execute_activity(
100
- mapping[ActivityRoles.INTERVENTION],
101
- arg=request, # 🎯 Pass the whole MissionRequest!
102
- **get_activity_options(ActivityRoles.INTERVENTION)
103
- )
96
+ # 🚀 THE MAGIC MOMENT
97
+ # Instead of execute_activity, we trigger the Agent's private Workflow.
98
+ workflow.logger.info(f"🛰️ Delegating intervention to Child Workflow: {request.effective_intervention_workflow}")
99
+
100
+ try:
101
+ mission_outcome: TacticalExecutionReport = await workflow.execute_child_workflow(
102
+ request.effective_intervention_workflow,
103
+ arg=request,
104
+ id=f"intervention-{request.session_id}",
105
+ # Ensures that if the Parent is cancelled, the Child is cleaned up.
106
+ parent_close_policy=workflow.ParentClosePolicy.TERMINATE
107
+ )
108
+ except Exception as e:
109
+ workflow.logger.error(f"❌ Child Workflow '{request.effective_intervention_workflow}' failed: {str(e)}")
110
+ # Fallback logic to continue the AAR/Debrief with failure state
111
+ mission_outcome = TacticalExecutionReport(status="FAILED", error_message=str(e))
104
112
 
105
113
  # Execution results are now synthesized inside the agent's response
106
114
  # 🚀 RESILIENT ACCESS
@@ -187,7 +187,7 @@ class ServiceEndpoints(BaseModel):
187
187
  TOOL_EXECUTOR_URL: str = "http://localhost:8003"
188
188
  VECTOR_SERVICE_URL: str = "http://localhost:8005"
189
189
  TEMPORAL_HOST_URL: str = "localhost:7233"
190
- SUTRAM_CALLBACK_URL: str = "http://localhost:8000/v1/agent/callback"
190
+ SUTRAM_CALLBACK_URL: str = "http://localhost:7002/v1/agent/callback"
191
191
  CLASSIFICATION_SERVICE_URL: str = "http://localhost:8000/v1/agent/callback"
192
192
  METADATA_EXTRACTION_SERVICE_URL: str = "http://localhost:8000/v1/agent/callback"
193
193
  PAPERLESS_SERVICE_URL: str = "http://localhost:8000/v1/agent/callback"
@@ -126,6 +126,11 @@ class MissionRequest(BaseModel):
126
126
  session_id: str
127
127
  trace_id: Optional[str] = None
128
128
  agent_name: str = "specialist"
129
+ # 🎯 THE DYNAMIC LINK:
130
+ # Allows the Parent to call the Agent's custom Child Workflow.
131
+ # Default follows the convention: {agent_name}_InterventionWorkflow
132
+ intervention_workflow_name: Optional[str] = None
133
+
129
134
  is_dry_run: bool = False
130
135
  template_id: str = "NO_TEMPLATE_ID"
131
136
  sub_objective: str = "NO_SUB_OBJECTIVE"
@@ -150,7 +155,13 @@ class MissionRequest(BaseModel):
150
155
  raise ValueError("Mission rejected: Sutram provided an empty MacroPlan.")
151
156
  return v
152
157
 
153
- # 🚀 ADD THIS PROPERTY HERE
158
+ @property
159
+ def effective_intervention_workflow(self) -> str:
160
+ """Resolves the workflow name: explicit override > convention."""
161
+ if self.intervention_workflow_name:
162
+ return self.intervention_workflow_name
163
+ return f"{self.agent_name}_InterventionWorkflow"
164
+
154
165
  @property
155
166
  def technical_context(self) -> Dict[str, Any]:
156
167
  """Provides a unified bundle for activity arguments."""
@@ -159,6 +170,7 @@ class MissionRequest(BaseModel):
159
170
  "trace_id": self.trace_id,
160
171
  "template_id": self.active_template_id,
161
172
  "agent_name": self.agent_name,
162
- "is_dry_run": self.is_dry_run
173
+ "is_dry_run": self.is_dry_run,
174
+ "workflow_name": self.effective_intervention_workflow # 🚀 Carry the link
163
175
  }
164
176
 
@@ -1 +0,0 @@
1
- __version__ = '0.1.330'
File without changes
File without changes
File without changes