solace-agent-mesh 1.3.0__py3-none-any.whl → 1.3.2__py3-none-any.whl

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.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (145) hide show
  1. solace_agent_mesh/agent/adk/setup.py +141 -34
  2. solace_agent_mesh/agent/protocol/event_handlers.py +91 -0
  3. solace_agent_mesh/agent/sac/app.py +3 -2
  4. solace_agent_mesh/agent/tools/__init__.py +1 -0
  5. solace_agent_mesh/agent/tools/dynamic_tool.py +362 -0
  6. solace_agent_mesh/assets/docs/404.html +3 -3
  7. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.d97b8e94.js +1 -0
  8. solace_agent_mesh/assets/docs/assets/js/483cef9a.03d5dceb.js +1 -0
  9. solace_agent_mesh/assets/docs/assets/js/55f47984.cf3781c4.js +1 -0
  10. solace_agent_mesh/assets/docs/assets/js/664b740a.1b744a32.js +1 -0
  11. solace_agent_mesh/assets/docs/assets/js/75384d09.c193a8f0.js +1 -0
  12. solace_agent_mesh/assets/docs/assets/js/9a09e75d.d6607c56.js +1 -0
  13. solace_agent_mesh/assets/docs/assets/js/aba87c2f.071e2d94.js +1 -0
  14. solace_agent_mesh/assets/docs/assets/js/ae0e903d.4d8dda10.js +1 -0
  15. solace_agent_mesh/assets/docs/assets/js/c835a94d.146e3186.js +1 -0
  16. solace_agent_mesh/assets/docs/assets/js/f284c35a.7334119c.js +1 -0
  17. solace_agent_mesh/assets/docs/assets/js/main.4adc477a.js +2 -0
  18. solace_agent_mesh/assets/docs/assets/js/runtime~main.cf0229ea.js +1 -0
  19. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/installation/index.html +29 -0
  20. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/single-sign-on/index.html +25 -0
  21. solace_agent_mesh/assets/docs/docs/documentation/{migration-guides/a2a-upgrade-to-0.3.0/a2a-gateway-upgrade-to-0.3.0/index.html → Migrations/A2A Upgrade To 0.3.0/a2a-gateway-upgrade-to-0.3.0/index.html } +6 -6
  22. solace_agent_mesh/assets/docs/docs/documentation/{migration-guides/a2a-upgrade-to-0.3.0/a2a-technical-migration-map/index.html → Migrations/A2A Upgrade To 0.3.0/a2a-technical-migration-map/index.html } +6 -6
  23. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +19 -27
  24. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +4 -4
  25. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +4 -4
  26. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +4 -4
  27. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +4 -4
  28. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +4 -4
  29. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +4 -4
  30. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +4 -4
  31. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +4 -4
  32. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +4 -4
  33. solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/index.html +4 -4
  34. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +4 -4
  35. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
  36. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +4 -4
  37. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +4 -4
  38. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +4 -4
  39. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +4 -4
  40. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +4 -4
  41. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +4 -4
  42. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rag-integration/index.html +4 -4
  43. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +4 -4
  44. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +4 -4
  45. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +4 -4
  46. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +4 -4
  47. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +4 -4
  48. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +4 -4
  49. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +4 -4
  50. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +4 -4
  51. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +5 -4
  52. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +4 -4
  53. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-python-tools/index.html +63 -0
  54. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +4 -4
  55. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +4 -4
  56. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +4 -4
  57. solace_agent_mesh/assets/docs/lunr-index-1757704179464.json +1 -0
  58. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  59. solace_agent_mesh/assets/docs/search-doc-1757704179464.json +1 -0
  60. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  61. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  62. solace_agent_mesh/cli/__init__.py +1 -1
  63. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-vY5eu2lI.js → authCallback-CAX9u8a7.js} +1 -1
  64. solace_agent_mesh/client/webui/frontend/static/assets/{client-BeBkzgWW.js → client-DXU9SPI5.js} +1 -1
  65. solace_agent_mesh/client/webui/frontend/static/assets/{main-Bjys1KQs.js → main-DjoMeldu.js} +26 -26
  66. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CE0AeXyK.js → vendor-B0BEKoAR.js} +69 -74
  67. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  68. solace_agent_mesh/client/webui/frontend/static/index.html +3 -3
  69. solace_agent_mesh/common/a2a/__init__.py +4 -0
  70. solace_agent_mesh/common/a2a/protocol.py +20 -0
  71. solace_agent_mesh/common/sac/sam_component_base.py +29 -9
  72. solace_agent_mesh/common/sam_events/__init__.py +9 -0
  73. solace_agent_mesh/common/sam_events/event_service.py +207 -0
  74. solace_agent_mesh/gateway/http_sse/alembic/env.py +1 -1
  75. solace_agent_mesh/gateway/http_sse/component.py +45 -35
  76. solace_agent_mesh/gateway/http_sse/dependencies.py +129 -66
  77. solace_agent_mesh/gateway/http_sse/main.py +22 -35
  78. solace_agent_mesh/gateway/http_sse/repository/__init__.py +37 -0
  79. solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +9 -0
  80. solace_agent_mesh/gateway/http_sse/repository/entities/message.py +41 -0
  81. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +45 -0
  82. solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +16 -0
  83. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +64 -0
  84. solace_agent_mesh/gateway/http_sse/repository/message_repository.py +78 -0
  85. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +9 -0
  86. solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
  87. solace_agent_mesh/gateway/http_sse/repository/models/message_model.py +27 -0
  88. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +27 -0
  89. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +139 -0
  90. solace_agent_mesh/gateway/http_sse/routers/{agents.py → agent_cards.py} +7 -7
  91. solace_agent_mesh/gateway/http_sse/routers/config.py +1 -0
  92. solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +20 -0
  93. solace_agent_mesh/gateway/http_sse/{api → routers}/dto/requests/session_requests.py +1 -8
  94. solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +16 -0
  95. solace_agent_mesh/gateway/http_sse/{api → routers}/dto/responses/session_responses.py +3 -30
  96. solace_agent_mesh/gateway/http_sse/{api/controllers/session_controller.py → routers/sessions.py} +20 -77
  97. solace_agent_mesh/gateway/http_sse/routers/tasks.py +42 -49
  98. solace_agent_mesh/gateway/http_sse/{api/controllers/user_controller.py → routers/users.py} +1 -1
  99. solace_agent_mesh/gateway/http_sse/services/{agent_service.py → agent_card_service.py} +19 -19
  100. solace_agent_mesh/gateway/http_sse/services/session_service.py +245 -0
  101. solace_agent_mesh/gateway/http_sse/session_manager.py +0 -3
  102. solace_agent_mesh/gateway/http_sse/shared/enums.py +0 -5
  103. {solace_agent_mesh-1.3.0.dist-info → solace_agent_mesh-1.3.2.dist-info}/METADATA +1 -1
  104. {solace_agent_mesh-1.3.0.dist-info → solace_agent_mesh-1.3.2.dist-info}/RECORD +109 -110
  105. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.8ccb9901.js +0 -1
  106. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +0 -1
  107. solace_agent_mesh/assets/docs/assets/js/6e0db977.39a79ca9.js +0 -1
  108. solace_agent_mesh/assets/docs/assets/js/75384d09.bf78fbdb.js +0 -1
  109. solace_agent_mesh/assets/docs/assets/js/90dd9cf6.88f385ea.js +0 -1
  110. solace_agent_mesh/assets/docs/assets/js/aba87c2f.76376d7c.js +0 -1
  111. solace_agent_mesh/assets/docs/assets/js/f284c35a.fb68323a.js +0 -1
  112. solace_agent_mesh/assets/docs/assets/js/main.08d30374.js +0 -2
  113. solace_agent_mesh/assets/docs/assets/js/runtime~main.458efb1d.js +0 -1
  114. solace_agent_mesh/assets/docs/lunr-index-1757433031159.json +0 -1
  115. solace_agent_mesh/assets/docs/search-doc-1757433031159.json +0 -1
  116. solace_agent_mesh/gateway/http_sse/ARCHITECTURE_GUIDE.md +0 -676
  117. solace_agent_mesh/gateway/http_sse/api/__init__.py +0 -11
  118. solace_agent_mesh/gateway/http_sse/api/controllers/__init__.py +0 -9
  119. solace_agent_mesh/gateway/http_sse/api/controllers/task_controller.py +0 -279
  120. solace_agent_mesh/gateway/http_sse/api/dto/requests/__init__.py +0 -37
  121. solace_agent_mesh/gateway/http_sse/api/dto/requests/task_requests.py +0 -66
  122. solace_agent_mesh/gateway/http_sse/api/dto/responses/__init__.py +0 -43
  123. solace_agent_mesh/gateway/http_sse/api/dto/responses/task_responses.py +0 -74
  124. solace_agent_mesh/gateway/http_sse/application/__init__.py +0 -3
  125. solace_agent_mesh/gateway/http_sse/application/services/__init__.py +0 -3
  126. solace_agent_mesh/gateway/http_sse/application/services/session_service.py +0 -135
  127. solace_agent_mesh/gateway/http_sse/domain/entities/__init__.py +0 -3
  128. solace_agent_mesh/gateway/http_sse/domain/entities/session.py +0 -90
  129. solace_agent_mesh/gateway/http_sse/domain/repositories/__init__.py +0 -3
  130. solace_agent_mesh/gateway/http_sse/domain/repositories/session_repository.py +0 -54
  131. solace_agent_mesh/gateway/http_sse/infrastructure/__init__.py +0 -4
  132. solace_agent_mesh/gateway/http_sse/infrastructure/dependency_injection/__init__.py +0 -3
  133. solace_agent_mesh/gateway/http_sse/infrastructure/dependency_injection/container.py +0 -123
  134. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/__init__.py +0 -4
  135. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/database_persistence_service.py +0 -16
  136. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/database_service.py +0 -119
  137. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/models.py +0 -31
  138. solace_agent_mesh/gateway/http_sse/infrastructure/persistence_service.py +0 -12
  139. solace_agent_mesh/gateway/http_sse/infrastructure/repositories/__init__.py +0 -3
  140. solace_agent_mesh/gateway/http_sse/infrastructure/repositories/session_repository.py +0 -174
  141. /solace_agent_mesh/assets/docs/assets/js/{main.08d30374.js.LICENSE.txt → main.4adc477a.js.LICENSE.txt} +0 -0
  142. /solace_agent_mesh/gateway/http_sse/{api → routers}/dto/__init__.py +0 -0
  143. {solace_agent_mesh-1.3.0.dist-info → solace_agent_mesh-1.3.2.dist-info}/WHEEL +0 -0
  144. {solace_agent_mesh-1.3.0.dist-info → solace_agent_mesh-1.3.2.dist-info}/entry_points.txt +0 -0
  145. {solace_agent_mesh-1.3.0.dist-info → solace_agent_mesh-1.3.2.dist-info}/licenses/LICENSE +0 -0
@@ -11,14 +11,14 @@ from ....common.agent_registry import AgentRegistry
11
11
  from a2a.types import AgentCard
12
12
 
13
13
 
14
- class AgentService:
14
+ class AgentCardService:
15
15
  """
16
- Provides methods for accessing information about discovered A2A agents.
16
+ Provides methods for accessing information about discovered A2A agents' cards.
17
17
  """
18
18
 
19
19
  def __init__(self, agent_registry: AgentRegistry):
20
20
  """
21
- Initializes the AgentService.
21
+ Initializes the AgentCardService.
22
22
 
23
23
  Args:
24
24
  agent_registry: An instance of the shared AgentRegistry.
@@ -26,33 +26,33 @@ class AgentService:
26
26
  if not isinstance(agent_registry, AgentRegistry):
27
27
  raise TypeError("agent_registry must be an instance of AgentRegistry")
28
28
  self._agent_registry = agent_registry
29
- log.info("[AgentService] Initialized.")
29
+ log.info("[AgentCardService] Initialized.")
30
30
 
31
- def get_all_agents(self) -> List[AgentCard]:
31
+ def get_all_agent_cards(self) -> List[AgentCard]:
32
32
  """
33
33
  Retrieves all currently discovered and registered agent cards.
34
34
 
35
35
  Returns:
36
36
  A list of AgentCard objects.
37
37
  """
38
- log_prefix = "[AgentService.get_all_agents] "
39
- log.info("%sRetrieving all agents.", log_prefix)
38
+ log_prefix = "[AgentCardService.get_all_agent_cards] "
39
+ log.info("%sRetrieving all agent cards.", log_prefix)
40
40
  agent_names = self._agent_registry.get_agent_names()
41
- agents = []
41
+ agent_cards = []
42
42
  for name in agent_names:
43
- agent = self._agent_registry.get_agent(name)
44
- if agent:
45
- agents.append(agent)
43
+ agent_card = self._agent_registry.get_agent(name)
44
+ if agent_card:
45
+ agent_cards.append(agent_card)
46
46
  else:
47
47
  log.warning(
48
48
  "%sAgent name '%s' found in list but not retrievable from registry.",
49
49
  log_prefix,
50
50
  name,
51
51
  )
52
- log.info("%sRetrieved %d agent cards.", log_prefix, len(agents))
53
- return agents
52
+ log.info("%sRetrieved %d agent cards.", log_prefix, len(agent_cards))
53
+ return agent_cards
54
54
 
55
- def get_agent_by_name(self, agent_name: str) -> Optional[AgentCard]:
55
+ def get_agent_card_by_name(self, agent_name: str) -> Optional[AgentCard]:
56
56
  """
57
57
  Retrieves a specific agent card by its name.
58
58
 
@@ -62,8 +62,8 @@ class AgentService:
62
62
  Returns:
63
63
  The AgentCard object if found, otherwise None.
64
64
  """
65
- log_prefix = "[AgentService.get_agent_by_name] "
66
- log.info("%sRetrieving agent by name '%s'.", log_prefix, agent_name)
67
- agent = self._agent_registry.get_agent(agent_name)
68
- log.info("%sFound: %s", log_prefix, agent is not None)
69
- return agent
65
+ log_prefix = "[AgentCardService.get_agent_card_by_name] "
66
+ log.info("%sRetrieving agent card by name '%s'.", log_prefix, agent_name)
67
+ agent_card = self._agent_registry.get_agent(agent_name)
68
+ log.info("%sFound: %s", log_prefix, agent_card is not None)
69
+ return agent_card
@@ -0,0 +1,245 @@
1
+ import uuid
2
+ from datetime import datetime, timezone
3
+ from typing import TYPE_CHECKING
4
+
5
+ from solace_ai_connector.common.log import log
6
+
7
+ from ..repository import (
8
+ IMessageRepository,
9
+ ISessionRepository,
10
+ Message,
11
+ Session,
12
+ SessionHistory,
13
+ )
14
+ from ..shared.enums import MessageType, SenderType
15
+ from ..shared.types import PaginationInfo, SessionId, UserId
16
+
17
+ if TYPE_CHECKING:
18
+ from ..component import WebUIBackendComponent
19
+
20
+
21
+ class SessionService:
22
+ def __init__(
23
+ self,
24
+ session_repository: ISessionRepository,
25
+ message_repository: IMessageRepository,
26
+ component: "WebUIBackendComponent" = None,
27
+ ):
28
+ self.session_repository = session_repository
29
+ self.message_repository = message_repository
30
+ self.component = component
31
+
32
+ def get_user_sessions(
33
+ self, user_id: UserId, pagination: PaginationInfo | None = None
34
+ ) -> list[Session]:
35
+ if not user_id or user_id.strip() == "":
36
+ raise ValueError("User ID cannot be empty")
37
+
38
+ return self.session_repository.find_by_user(user_id, pagination)
39
+
40
+ def get_session_details(
41
+ self, session_id: SessionId, user_id: UserId
42
+ ) -> Session | None:
43
+ if not self._is_valid_session_id(session_id):
44
+ return None
45
+
46
+ return self.session_repository.find_user_session(session_id, user_id)
47
+
48
+ def get_session_history(
49
+ self,
50
+ session_id: SessionId,
51
+ user_id: UserId,
52
+ pagination: PaginationInfo | None = None,
53
+ ) -> SessionHistory | None:
54
+ if not self._is_valid_session_id(session_id):
55
+ return None
56
+
57
+ result = self.session_repository.find_user_session_with_messages(
58
+ session_id, user_id, pagination
59
+ )
60
+ if not result:
61
+ return None
62
+
63
+ session, messages = result
64
+ return SessionHistory(
65
+ session=session,
66
+ messages=messages,
67
+ total_message_count=len(messages),
68
+ )
69
+
70
+ def create_session(
71
+ self,
72
+ user_id: UserId,
73
+ name: str | None = None,
74
+ agent_id: str | None = None,
75
+ session_id: str | None = None,
76
+ ) -> Session:
77
+ if not user_id or user_id.strip() == "":
78
+ raise ValueError("User ID cannot be empty")
79
+
80
+ if not session_id:
81
+ session_id = str(uuid.uuid4())
82
+
83
+ # Leave name as None/empty - frontend will generate display name if needed
84
+
85
+ now = datetime.now(timezone.utc)
86
+ session = Session(
87
+ id=session_id,
88
+ user_id=user_id,
89
+ name=name,
90
+ agent_id=agent_id,
91
+ created_at=now,
92
+ updated_at=now,
93
+ last_activity=now,
94
+ )
95
+
96
+ created_session = self.session_repository.save(session)
97
+ log.info("Created new session %s for user %s", created_session.id, user_id)
98
+
99
+ return created_session
100
+
101
+ def update_session_name(
102
+ self, session_id: SessionId, user_id: UserId, name: str
103
+ ) -> Session | None:
104
+ if not self._is_valid_session_id(session_id):
105
+ raise ValueError("Invalid session ID")
106
+
107
+ if not name or len(name.strip()) == 0:
108
+ raise ValueError("Session name cannot be empty")
109
+
110
+ if len(name.strip()) > 255:
111
+ raise ValueError("Session name cannot exceed 255 characters")
112
+
113
+ session = self.session_repository.find_user_session(session_id, user_id)
114
+ if not session:
115
+ return None
116
+
117
+ session.update_name(name)
118
+ updated_session = self.session_repository.save(session)
119
+
120
+ log.info("Updated session %s name to '%s'", session_id, name)
121
+ return updated_session
122
+
123
+ def delete_session_with_notifications(
124
+ self, session_id: SessionId, user_id: UserId
125
+ ) -> bool:
126
+ if not self._is_valid_session_id(session_id):
127
+ raise ValueError("Invalid session ID")
128
+
129
+ session = self.session_repository.find_user_session(session_id, user_id)
130
+ if not session:
131
+ log.warning(
132
+ "Attempted to delete non-existent session %s by user %s",
133
+ session_id,
134
+ user_id,
135
+ )
136
+ return False
137
+
138
+ agent_id = session.agent_id
139
+
140
+ if not session.can_be_deleted_by_user(user_id):
141
+ log.warning(
142
+ "User %s not authorized to delete session %s", user_id, session_id
143
+ )
144
+ return False
145
+
146
+ deleted = self.session_repository.delete(session_id, user_id)
147
+ if not deleted:
148
+ return False
149
+
150
+ log.info("Session %s deleted successfully by user %s", session_id, user_id)
151
+
152
+ if agent_id and self.component:
153
+ self._notify_agent_of_session_deletion(session_id, user_id, agent_id)
154
+
155
+ return True
156
+
157
+ def add_message_to_session(
158
+ self,
159
+ session_id: SessionId,
160
+ user_id: UserId,
161
+ message: str,
162
+ sender_type: SenderType,
163
+ sender_name: str,
164
+ agent_id: str | None = None,
165
+ message_type: MessageType = MessageType.TEXT,
166
+ ) -> Message:
167
+ if not self._is_valid_session_id(session_id):
168
+ raise ValueError("Invalid session ID")
169
+
170
+ if not message or message.strip() == "":
171
+ raise ValueError("Message cannot be empty")
172
+
173
+ session = self.session_repository.find_user_session(session_id, user_id)
174
+ if not session:
175
+ session = self.create_session(
176
+ user_id=user_id,
177
+ agent_id=agent_id,
178
+ session_id=session_id,
179
+ )
180
+
181
+ message_entity = Message(
182
+ id=str(uuid.uuid4()),
183
+ session_id=session_id,
184
+ message=message.strip(),
185
+ sender_type=sender_type,
186
+ sender_name=sender_name,
187
+ message_type=message_type,
188
+ created_at=datetime.now(timezone.utc),
189
+ )
190
+
191
+ saved_message = self.message_repository.save(message_entity)
192
+
193
+ session.mark_activity()
194
+ self.session_repository.save(session)
195
+
196
+ log.info("Added message to session %s from %s", session_id, sender_name)
197
+ return saved_message
198
+
199
+ def _is_valid_session_id(self, session_id: SessionId) -> bool:
200
+ return (
201
+ session_id is not None
202
+ and session_id.strip() != ""
203
+ and session_id not in ["null", "undefined"]
204
+ )
205
+
206
+ def _notify_agent_of_session_deletion(
207
+ self, session_id: SessionId, user_id: UserId, agent_id: str
208
+ ) -> None:
209
+ try:
210
+ log.info(
211
+ "Publishing session deletion event for session %s (agent %s, user %s)",
212
+ session_id,
213
+ agent_id,
214
+ user_id,
215
+ )
216
+
217
+ if hasattr(self.component, "sam_events"):
218
+ success = self.component.sam_events.publish_session_deleted(
219
+ session_id=session_id,
220
+ user_id=user_id,
221
+ agent_id=agent_id,
222
+ gateway_id=self.component.gateway_id,
223
+ )
224
+
225
+ if success:
226
+ log.info(
227
+ "Successfully published session deletion event for session %s",
228
+ session_id,
229
+ )
230
+ else:
231
+ log.warning(
232
+ "Failed to publish session deletion event for session %s",
233
+ session_id,
234
+ )
235
+ else:
236
+ log.warning(
237
+ "SAM Events not available for session deletion notification"
238
+ )
239
+
240
+ except Exception as e:
241
+ log.warning(
242
+ "Failed to publish session deletion event to agent %s: %s",
243
+ agent_id,
244
+ e,
245
+ )
@@ -9,7 +9,6 @@ from typing import Any
9
9
  from solace_ai_connector.common.log import log
10
10
  from starlette.requests import Request
11
11
 
12
- from .infrastructure.persistence_service import PersistenceService
13
12
 
14
13
  SESSION_KEY_CLIENT_ID = "a2a_client_id"
15
14
  SESSION_KEY_SESSION_ID = "a2a_session_id"
@@ -28,14 +27,12 @@ class SessionManager:
28
27
  self,
29
28
  secret_key: str,
30
29
  app_config: dict[str, Any],
31
- persistence_service: "PersistenceService",
32
30
  ):
33
31
  if not secret_key:
34
32
  raise ValueError("Session secret key cannot be empty.")
35
33
  self.secret_key = secret_key
36
34
  self.force_user_identity = app_config.get("force_user_identity")
37
35
  self.use_authorization = app_config.get("frontend_use_authorization", False)
38
- self.persistence_service = persistence_service
39
36
  self._temp_code_cache = {}
40
37
  log.info("[SessionManager] Initialized.")
41
38
  if self.force_user_identity:
@@ -21,11 +21,6 @@ class TaskStatus(str, Enum):
21
21
  CANCELLED = "cancelled"
22
22
 
23
23
 
24
- class SessionStatus(str, Enum):
25
- """Session status."""
26
- ACTIVE = "active"
27
- INACTIVE = "inactive"
28
- ARCHIVED = "archived"
29
24
 
30
25
 
31
26
  class MessageType(str, Enum):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solace-agent-mesh
3
- Version: 1.3.0
3
+ Version: 1.3.2
4
4
  Summary: Solace Agent Mesh is an open-source framework for building event-driven, multi-agent AI systems where specialized agents collaborate on complex tasks.
5
5
  Project-URL: Homepage, https://github.com/SolaceLabs/solace-agent-mesh
6
6
  Project-URL: Repository, https://github.com/SolaceLabs/solace-agent-mesh