solace-agent-mesh 1.0.1__py3-none-any.whl → 1.0.3__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 (117) hide show
  1. solace_agent_mesh/__init__.py +5 -0
  2. solace_agent_mesh/agent/adk/callbacks.py +23 -1
  3. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +34 -41
  4. solace_agent_mesh/agent/adk/runner.py +10 -6
  5. solace_agent_mesh/agent/adk/services.py +141 -60
  6. solace_agent_mesh/agent/protocol/event_handlers.py +84 -155
  7. solace_agent_mesh/agent/sac/app.py +12 -2
  8. solace_agent_mesh/agent/sac/component.py +182 -38
  9. solace_agent_mesh/agent/sac/task_execution_context.py +15 -6
  10. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +8 -1
  11. solace_agent_mesh/agent/tools/general_agent_tools.py +4 -2
  12. solace_agent_mesh/agent/tools/peer_agent_tool.py +97 -88
  13. solace_agent_mesh/agent/utils/artifact_helpers.py +148 -14
  14. solace_agent_mesh/assets/docs/404.html +3 -3
  15. solace_agent_mesh/assets/docs/assets/js/{04989206.674a8007.js → 04989206.da8246cd.js} +1 -1
  16. solace_agent_mesh/assets/docs/assets/js/1023fc19.8e6d174c.js +1 -0
  17. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
  18. solace_agent_mesh/assets/docs/assets/js/{3d406171.f722eaf5.js → 3d406171.9b081d5f.js} +1 -1
  19. solace_agent_mesh/assets/docs/assets/js/75384d09.c3991823.js +1 -0
  20. solace_agent_mesh/assets/docs/assets/js/9eff14a2.036c35ea.js +1 -0
  21. solace_agent_mesh/assets/docs/assets/js/{aba87c2f.d3e2dcc3.js → aba87c2f.a6b84da6.js} +1 -1
  22. solace_agent_mesh/assets/docs/assets/js/{ae4415af.8e279b5d.js → ae4415af.96189a93.js} +1 -1
  23. solace_agent_mesh/assets/docs/assets/js/b7006a3a.38c0cf3d.js +1 -0
  24. solace_agent_mesh/assets/docs/assets/js/bb2ef573.56931473.js +1 -0
  25. solace_agent_mesh/assets/docs/assets/js/{cc969b05.954186d4.js → cc969b05.bd3e0d6c.js} +1 -1
  26. solace_agent_mesh/assets/docs/assets/js/f284c35a.5aff74ab.js +1 -0
  27. solace_agent_mesh/assets/docs/assets/js/f897a61a.862b0514.js +1 -0
  28. solace_agent_mesh/assets/docs/assets/js/main.dc7db184.js +2 -0
  29. solace_agent_mesh/assets/docs/assets/js/runtime~main.aa687c82.js +1 -0
  30. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +3 -3
  31. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +3 -3
  32. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +8 -6
  33. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +4 -4
  34. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +3 -3
  35. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +3 -3
  36. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +21 -4
  37. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +3 -3
  38. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +3 -3
  39. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +3 -3
  40. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +3 -3
  41. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +3 -3
  42. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +3 -3
  43. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +10 -10
  44. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +4 -4
  45. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +5 -5
  46. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +4 -4
  47. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +4 -4
  48. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +5 -5
  49. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rag-integration/index.html +140 -0
  50. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +4 -4
  51. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +4 -4
  52. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +4 -4
  53. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +4 -4
  54. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +3 -3
  55. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +5 -5
  56. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +3 -3
  57. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +3 -3
  58. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +3 -3
  59. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +3 -3
  60. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +3 -3
  61. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +3 -3
  62. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +3 -3
  63. solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
  64. solace_agent_mesh/assets/docs/lunr-index-1755120326601.json +1 -0
  65. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  66. solace_agent_mesh/assets/docs/search-doc-1755120326601.json +1 -0
  67. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  68. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  69. solace_agent_mesh/cli/__init__.py +1 -1
  70. solace_agent_mesh/cli/commands/init_cmd/env_step.py +8 -0
  71. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +21 -1
  72. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  73. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +2 -1
  74. solace_agent_mesh/cli/commands/run_cmd.py +42 -3
  75. solace_agent_mesh/cli/main.py +1 -3
  76. solace_agent_mesh/client/webui/frontend/static/assets/main-BCpII1-0.css +1 -0
  77. solace_agent_mesh/client/webui/frontend/static/assets/main-DzKPMTRs.js +673 -0
  78. solace_agent_mesh/client/webui/frontend/static/index.html +2 -2
  79. solace_agent_mesh/common/exceptions.py +25 -0
  80. solace_agent_mesh/common/utils/initializer.py +51 -0
  81. solace_agent_mesh/common/utils/message_utils.py +79 -0
  82. solace_agent_mesh/config_portal/backend/common.py +1 -1
  83. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +2 -1
  84. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +6 -2
  85. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +1 -5
  86. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +1 -0
  87. solace_agent_mesh/config_portal/backend/server.py +1 -0
  88. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-xSu2leR8.js +48 -0
  89. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-d2b54a97.js → manifest-950eb3be.js} +1 -1
  90. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  91. solace_agent_mesh/gateway/base/component.py +15 -2
  92. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +9 -3
  93. solace_agent_mesh/gateway/http_sse/sse_manager.py +23 -1
  94. solace_agent_mesh/templates/gateway_component_template.py +75 -44
  95. solace_agent_mesh/templates/logging_config_template.ini +64 -0
  96. solace_agent_mesh/templates/plugin_agent_config_template.yaml +1 -1
  97. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/METADATA +56 -46
  98. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/RECORD +102 -96
  99. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +0 -1
  100. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +0 -1
  101. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +0 -1
  102. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +0 -1
  103. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +0 -1
  104. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +0 -1
  105. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +0 -1
  106. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +0 -2
  107. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +0 -1
  108. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  109. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +0 -1
  110. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +0 -1
  111. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +0 -663
  112. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +0 -1
  113. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +0 -48
  114. /solace_agent_mesh/assets/docs/assets/js/{main.7ed3319f.js.LICENSE.txt → main.dc7db184.js.LICENSE.txt} +0 -0
  115. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/WHEEL +0 -0
  116. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/entry_points.txt +0 -0
  117. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -27,7 +27,7 @@ class TaskExecutionContext:
27
27
  self.cancellation_event: asyncio.Event = asyncio.Event()
28
28
  self.streaming_buffer: str = ""
29
29
  self.run_based_response_buffer: str = ""
30
- self.peer_sub_tasks: List[Dict[str, Any]] = []
30
+ self.active_peer_sub_tasks: Dict[str, Dict[str, Any]] = {}
31
31
  self.parallel_tool_calls: Dict[str, Dict[str, Any]] = {}
32
32
  self.produced_artifacts: List[Dict[str, Any]] = []
33
33
  self.artifact_signals_to_return: List[Dict[str, Any]] = []
@@ -64,12 +64,21 @@ class TaskExecutionContext:
64
64
  with self.lock:
65
65
  self.run_based_response_buffer += text
66
66
 
67
- def register_peer_sub_task(self, sub_task_id: str, peer_agent_name: str) -> None:
68
- """Adds a new peer sub-task to the tracking list."""
67
+ def register_peer_sub_task(
68
+ self, sub_task_id: str, correlation_data: Dict[str, Any]
69
+ ) -> None:
70
+ """Adds a new peer sub-task's correlation data to the tracking dictionary."""
69
71
  with self.lock:
70
- self.peer_sub_tasks.append(
71
- {"sub_task_id": sub_task_id, "peer_agent_name": peer_agent_name}
72
- )
72
+ self.active_peer_sub_tasks[sub_task_id] = correlation_data
73
+
74
+ def claim_sub_task_completion(self, sub_task_id: str) -> Optional[Dict[str, Any]]:
75
+ """
76
+ Atomically retrieves and removes a sub-task's correlation data.
77
+ This is the core atomic operation to prevent race conditions.
78
+ Returns the correlation data if the claim is successful, otherwise None.
79
+ """
80
+ with self.lock:
81
+ return self.active_peer_sub_tasks.pop(sub_task_id, None)
73
82
 
74
83
  def register_parallel_call_sent(self, invocation_id: str) -> None:
75
84
  """
@@ -1888,12 +1888,19 @@ async def delete_artifact(
1888
1888
  "ArtifactService does not support deleting artifacts."
1889
1889
  )
1890
1890
 
1891
+ if version is not None:
1892
+ log.warning(
1893
+ "%s Deleting a specific version (%s) is not supported by the current artifact service interface. "
1894
+ "All versions of the artifact will be deleted.",
1895
+ log_identifier,
1896
+ version,
1897
+ )
1898
+
1891
1899
  await artifact_service.delete_artifact(
1892
1900
  app_name=app_name,
1893
1901
  user_id=user_id,
1894
1902
  session_id=session_id,
1895
1903
  filename=filename,
1896
- version=version,
1897
1904
  )
1898
1905
 
1899
1906
  log.info(
@@ -397,7 +397,8 @@ async def mermaid_diagram_generator(
397
397
  "message": "Failed to render Mermaid diagram. No image data returned.",
398
398
  }
399
399
  try:
400
- image_data = await _convert_svg_to_png_with_playwright(svg_image_data.decode("utf-8"))
400
+ scale = max(2, len(mermaid_syntax.splitlines()) // 10)
401
+ image_data = await _convert_svg_to_png_with_playwright(svg_image_data.decode("utf-8"), scale)
401
402
  except Exception as e:
402
403
  log.error(
403
404
  "%s Failed to convert SVG to PNG with Playwright: %s",
@@ -410,8 +411,9 @@ async def mermaid_diagram_generator(
410
411
  }
411
412
 
412
413
  log.debug(
413
- "%s Mermaid diagram rendered successfully, image_data length: %d bytes",
414
+ "%s Mermaid diagram rendered successfully with scale %d, image_data length: %d bytes",
414
415
  log_identifier,
416
+ scale,
415
417
  len(image_data),
416
418
  )
417
419
 
@@ -7,6 +7,7 @@ import uuid
7
7
 
8
8
  from google.adk.tools import BaseTool, ToolContext
9
9
  from google.genai import types as adk_types
10
+ from pydantic import BaseModel, Field
10
11
  from solace_ai_connector.common.log import log
11
12
 
12
13
  from ...common.types import (
@@ -16,6 +17,17 @@ from ...common.types import (
16
17
  AgentCard,
17
18
  )
18
19
  from ...common.constants import DEFAULT_COMMUNICATION_TIMEOUT
20
+ from ...common.exceptions import MessageSizeExceededError
21
+
22
+ class ArtifactIdentifier(BaseModel):
23
+ """Identifies a specific version of an artifact."""
24
+
25
+ filename: str = Field(..., description="The filename of the artifact.")
26
+ version: Union[str, int] = Field(
27
+ "latest",
28
+ description="The version of the artifact (e.g., 'latest' or a number).",
29
+ )
30
+
19
31
 
20
32
  PEER_TOOL_PREFIX = "peer_"
21
33
  CORRELATION_DATA_PREFIX = "a2a_subtask_"
@@ -24,8 +36,14 @@ CORRELATION_DATA_PREFIX = "a2a_subtask_"
24
36
  class PeerAgentTool(BaseTool):
25
37
  """
26
38
  An ADK Tool that represents a discovered peer agent and handles task delegation
27
- via the A2A protocol over Solace. Uses an asyncio Queue to block and wait for
28
- the asynchronous response. Handles artifact passthrough from peer responses.
39
+ via the A2A protocol over Solace.
40
+
41
+ This tool is long-running and operates in a "fire-and-forget" manner. It sends a
42
+ task to a peer agent, including a `task_description` and an optional list of
43
+ `artifacts` to provide context. The artifact identifiers are passed in the
44
+ A2A message metadata, and the peer agent is responsible for fetching them.
45
+
46
+ The response from the peer is handled asynchronously by the agent's event handlers.
29
47
  """
30
48
 
31
49
  is_long_running = True
@@ -85,10 +103,24 @@ class PeerAgentTool(BaseTool):
85
103
  type=adk_types.Type.STRING,
86
104
  description="The original user query or relevant context.",
87
105
  ),
88
- "data_artifacts": adk_types.Schema(
106
+ "artifacts": adk_types.Schema(
89
107
  type=adk_types.Type.ARRAY,
90
- items=adk_types.Schema(type=adk_types.Type.STRING),
91
- description="A list of artifact filenames to be sent to the peer agent for context.",
108
+ items=adk_types.Schema(
109
+ type=adk_types.Type.OBJECT,
110
+ properties={
111
+ "filename": adk_types.Schema(
112
+ type=adk_types.Type.STRING,
113
+ description="The filename of the artifact.",
114
+ ),
115
+ "version": adk_types.Schema(
116
+ type=adk_types.Type.STRING,
117
+ description="The version of the artifact (e.g., 'latest' or a number). Defaults to 'latest'.",
118
+ nullable=True,
119
+ ),
120
+ },
121
+ required=["filename"],
122
+ ),
123
+ description="A list of artifacts to provide as context to the peer agent.",
92
124
  nullable=True,
93
125
  ),
94
126
  },
@@ -106,11 +138,11 @@ class PeerAgentTool(BaseTool):
106
138
  parameters=parameters_schema,
107
139
  )
108
140
 
109
- async def _prepare_a2a_parts(
141
+ def _prepare_a2a_parts(
110
142
  self, args: Dict[str, Any], tool_context: ToolContext
111
- ) -> List[Union[TextPart, FilePart]]:
143
+ ) -> List[TextPart]:
112
144
  """
113
- Prepares the A2A message parts from tool arguments, including text and artifacts.
145
+ Prepares the A2A message parts from tool arguments.
114
146
  """
115
147
  task_description = args.get("task_description", "No description provided.")
116
148
  calling_agent_name = self.host_component.agent_name or "Unknown Agent"
@@ -118,73 +150,16 @@ class PeerAgentTool(BaseTool):
118
150
  # Create the multi-agent context message
119
151
  context_message = (
120
152
  f"You are part of a multi-agent AI platform. The task below is being sent to you by agent '{calling_agent_name}'. "
121
- f"You must perform this task to the best of your abilities. All artifacts that you create will automatically be "
122
- f"returned to the calling agent, but you must provide context and description for which artifacts are important "
123
- f"and how they should be used. Note that the calling agent will not see any of your history - only the text "
124
- f"that you respond with.\n\n"
153
+ "You must perform this task to the best of your abilities. All artifacts that you create will automatically be "
154
+ "returned to the calling agent, but you must provide context and description for which artifacts are important "
155
+ "and how they should be used. Note that the calling agent will not see any of your history - only the text "
156
+ "that you respond with.\n\n"
157
+ "Note that if the request has not provided the information you need to do your job, you must ask for it. "
158
+ "You must not 'make up' data unless specifically instructed to do so.\n\n"
125
159
  f"Now please execute this task that was given to you:\n\n{task_description}"
126
160
  )
127
161
 
128
- a2a_message_parts = [TextPart(text=context_message)]
129
-
130
- artifact_names = args.get("data_artifacts", [])
131
- if not isinstance(artifact_names, list):
132
- log.warning(
133
- "%s 'data_artifacts' argument is not a list, ignoring. Value: %s",
134
- self.log_identifier,
135
- artifact_names,
136
- )
137
- artifact_names = []
138
-
139
- if artifact_names:
140
- log.debug(
141
- "%s Preparing to include %d artifacts in peer request.",
142
- self.log_identifier,
143
- len(artifact_names),
144
- )
145
- a2a_context = tool_context.state.get("a2a_context", {})
146
- for artifact_name in artifact_names:
147
- try:
148
- loaded_part = (
149
- await self.host_component.artifact_service.load_artifact(
150
- app_name=tool_context._invocation_context.app_name,
151
- user_id=tool_context._invocation_context.user_id,
152
- session_id=tool_context._invocation_context.session.id,
153
- filename=artifact_name,
154
- version=None,
155
- )
156
- )
157
- if loaded_part:
158
- a2a_file_part = await self.host_component._translate_adk_part_to_a2a_filepart(
159
- loaded_part, artifact_name, a2a_context
160
- )
161
- if a2a_file_part:
162
- a2a_message_parts.append(a2a_file_part)
163
- log.info(
164
- "%s Included latest artifact '%s' in peer request.",
165
- self.log_identifier,
166
- artifact_name,
167
- )
168
- else:
169
- log.warning(
170
- "%s Failed to translate loaded artifact '%s' to A2A part. Skipping.",
171
- self.log_identifier,
172
- artifact_name,
173
- )
174
- else:
175
- log.warning(
176
- "%s Could not load artifact '%s' to include in peer request. Skipping.",
177
- self.log_identifier,
178
- artifact_name,
179
- )
180
- except Exception as e:
181
- log.exception(
182
- "%s Error loading artifact '%s' for peer request: %s",
183
- self.log_identifier,
184
- artifact_name,
185
- e,
186
- )
187
- return a2a_message_parts
162
+ return [TextPart(text=context_message)]
188
163
 
189
164
  async def run_async(
190
165
  self, *, args: Dict[str, Any], tool_context: ToolContext
@@ -236,38 +211,72 @@ class PeerAgentTool(BaseTool):
236
211
  task_context_obj.parallel_tool_calls.get(invocation_id),
237
212
  )
238
213
 
239
- a2a_message_parts = await self._prepare_a2a_parts(args, tool_context)
240
- a2a_message = A2AMessage(role="user", parts=a2a_message_parts)
214
+ a2a_message_parts = self._prepare_a2a_parts(args, tool_context)
215
+ a2a_metadata = {}
216
+ raw_artifacts = args.get("artifacts", [])
217
+ if raw_artifacts and isinstance(raw_artifacts, list):
218
+ try:
219
+ # The ADK gives us a list of dicts, not Pydantic models
220
+ # so we can use them directly.
221
+ a2a_metadata["invoked_with_artifacts"] = raw_artifacts
222
+ log.debug(
223
+ "%s Included %d artifact identifiers in A2A message metadata.",
224
+ log_identifier,
225
+ len(raw_artifacts),
226
+ )
227
+ except Exception as e:
228
+ log.warning(
229
+ "%s Failed to serialize artifact identifiers: %s. Proceeding without them.",
230
+ log_identifier,
231
+ e,
232
+ )
233
+
234
+ a2a_message = A2AMessage(
235
+ role="user", parts=a2a_message_parts, metadata=a2a_metadata
236
+ )
241
237
 
242
238
  correlation_data = {
243
239
  "adk_function_call_id": tool_context.function_call_id,
244
240
  "original_task_context": original_task_context,
245
241
  "peer_tool_name": self.name,
242
+ "peer_agent_name": self.target_agent_name,
246
243
  "logical_task_id": main_logical_task_id,
247
244
  "invocation_id": invocation_id,
248
245
  }
249
246
 
247
+ # Register the sub-task's state within the parent task's context.
248
+ task_context_obj.register_peer_sub_task(sub_task_id, correlation_data)
249
+
250
+ # Add a simple mapping to the cache for timeout tracking.
250
251
  self.host_component.cache_service.add_data(
251
252
  key=sub_task_id,
252
- value=correlation_data,
253
+ value=main_logical_task_id,
253
254
  expiry=timeout_sec,
254
255
  component=self.host_component,
255
256
  )
256
257
 
257
- self.host_component.submit_a2a_task(
258
- target_agent_name=self.target_agent_name,
259
- a2a_message=a2a_message,
260
- original_session_id=original_session_id,
261
- main_logical_task_id=main_logical_task_id,
262
- user_id=user_id,
263
- user_config=user_config,
264
- sub_task_id=sub_task_id,
265
- function_call_id=tool_context.function_call_id,
266
- )
258
+ try:
259
+ self.host_component.submit_a2a_task(
260
+ target_agent_name=self.target_agent_name,
261
+ a2a_message=a2a_message,
262
+ original_session_id=original_session_id,
263
+ main_logical_task_id=main_logical_task_id,
264
+ user_id=user_id,
265
+ user_config=user_config,
266
+ sub_task_id=sub_task_id,
267
+ function_call_id=tool_context.function_call_id,
268
+ )
269
+ except MessageSizeExceededError as e:
270
+ log.error(
271
+ "%s Message size exceeded for peer agent request: %s",
272
+ log_identifier,
273
+ e,
274
+ )
275
+ return {
276
+ "status": "error",
277
+ "message": f"Error: {str(e)}. Message size exceeded for peer agent request.",
278
+ }
267
279
 
268
- task_context_obj.register_peer_sub_task(
269
- sub_task_id=sub_task_id, peer_agent_name=self.target_agent_name
270
- )
271
280
  log.info(
272
281
  "%s Registered active peer sub-task %s for main task %s.",
273
282
  log_identifier,
@@ -8,17 +8,21 @@ import json
8
8
  import csv
9
9
  import io
10
10
  import inspect
11
- import datetime
12
11
  import os
12
+ import yaml
13
+ import traceback
14
+ from datetime import datetime, timezone
13
15
  from typing import Any, Dict, Optional, Tuple, List, Union, TYPE_CHECKING
14
- from datetime import timezone
15
16
  from google.adk.artifacts import BaseArtifactService
16
17
  from google.genai import types as adk_types
17
18
  from solace_ai_connector.common.log import log
19
+ from ...common.types import ArtifactInfo
18
20
  from ...common.utils.mime_helpers import is_text_based_mime_type, is_text_based_file
21
+ from ...agent.utils.context_helpers import get_original_session_id
19
22
 
20
23
  if TYPE_CHECKING:
21
24
  from google.adk.tools import ToolContext
25
+ from ...agent.sac.component import SamAgentComponent
22
26
 
23
27
  METADATA_SUFFIX = ".metadata.json"
24
28
  DEFAULT_SCHEMA_MAX_KEYS = 20
@@ -155,13 +159,9 @@ def _infer_schema(
155
159
  "text/x-yaml",
156
160
  ]:
157
161
  try:
158
- import yaml
159
-
160
162
  data = yaml.safe_load(content_bytes)
161
163
  schema_info["structure"] = _inspect_structure(data, depth, max_keys)
162
164
  schema_info["inferred"] = True
163
- except ImportError:
164
- schema_info["error"] = "YAML inference skipped: PyYAML not installed."
165
165
  except (yaml.YAMLError, UnicodeDecodeError) as e:
166
166
  schema_info["error"] = f"YAML structure inference failed: {e}"
167
167
  except Exception as e:
@@ -188,7 +188,7 @@ async def save_artifact_with_metadata(
188
188
  content_bytes: bytes,
189
189
  mime_type: str,
190
190
  metadata_dict: Dict[str, Any],
191
- timestamp: datetime.datetime,
191
+ timestamp: datetime,
192
192
  explicit_schema: Optional[Dict] = None,
193
193
  schema_inference_depth: int = 2,
194
194
  schema_max_keys: int = DEFAULT_SCHEMA_MAX_KEYS,
@@ -399,6 +399,143 @@ def format_metadata_for_llm(metadata: Dict[str, Any]) -> str:
399
399
  return "\n".join(lines)
400
400
 
401
401
 
402
+ async def generate_artifact_metadata_summary(
403
+ component: "SamAgentComponent",
404
+ artifact_identifiers: List[Dict[str, Any]],
405
+ user_id: str,
406
+ session_id: str,
407
+ app_name: str,
408
+ header_text: Optional[str] = None,
409
+ ) -> str:
410
+ """
411
+ Loads metadata for a list of artifacts and formats it into a human-readable
412
+ YAML summary string, suitable for LLM context.
413
+ """
414
+ if not artifact_identifiers:
415
+ return ""
416
+
417
+ log_identifier = f"{component.log_identifier}[ArtifactSummary]"
418
+ summary_parts = []
419
+ if header_text:
420
+ summary_parts.append(header_text)
421
+
422
+ if not (component.artifact_service and user_id and session_id):
423
+ log.warning(
424
+ "%s Cannot load artifact metadata: missing artifact_service or context.",
425
+ log_identifier,
426
+ )
427
+ for artifact_ref in artifact_identifiers:
428
+ filename = artifact_ref.get("filename", "unknown")
429
+ version = artifact_ref.get("version", "latest")
430
+ summary_parts.append(
431
+ f"---\nArtifact: '{filename}' (version: {version})\nError: Could not load metadata. Host component context missing."
432
+ )
433
+ return "\n\n".join(summary_parts)
434
+
435
+ for artifact_ref in artifact_identifiers:
436
+ filename = artifact_ref.get("filename")
437
+ version = artifact_ref.get("version", "latest")
438
+ if not filename:
439
+ log.warning(
440
+ "%s Skipping artifact with no filename in identifier: %s",
441
+ log_identifier,
442
+ artifact_ref,
443
+ )
444
+ continue
445
+
446
+ try:
447
+ metadata_result = await load_artifact_content_or_metadata(
448
+ artifact_service=component.artifact_service,
449
+ app_name=app_name,
450
+ user_id=user_id,
451
+ session_id=get_original_session_id(session_id),
452
+ filename=filename,
453
+ version=version,
454
+ load_metadata_only=True,
455
+ )
456
+ if metadata_result.get("status") == "success":
457
+ metadata = metadata_result.get("metadata", {})
458
+ resolved_version = metadata_result.get("version", version)
459
+ artifact_header = (
460
+ f"Artifact: '{filename}' (version: {resolved_version})"
461
+ )
462
+
463
+ # Remove redundant fields before dumping to YAML
464
+ metadata.pop("filename", None)
465
+ metadata.pop("version", None)
466
+
467
+ TRUNCATION_LIMIT_BYTES = 1024
468
+ TRUNCATION_MESSAGE = "\n... [truncated] ..."
469
+
470
+ try:
471
+ formatted_metadata_str = yaml.safe_dump(
472
+ metadata,
473
+ default_flow_style=False,
474
+ sort_keys=False,
475
+ allow_unicode=True,
476
+ )
477
+
478
+ if (
479
+ len(formatted_metadata_str.encode("utf-8"))
480
+ > TRUNCATION_LIMIT_BYTES
481
+ ):
482
+ cutoff = TRUNCATION_LIMIT_BYTES - len(
483
+ TRUNCATION_MESSAGE.encode("utf-8")
484
+ )
485
+ # Ensure we don't cut in the middle of a multi-byte character
486
+ encoded_str = formatted_metadata_str.encode("utf-8")
487
+ if cutoff > 0:
488
+ truncated_encoded = encoded_str[:cutoff]
489
+ formatted_metadata_str = (
490
+ truncated_encoded.decode("utf-8", "ignore")
491
+ + TRUNCATION_MESSAGE
492
+ )
493
+ else:
494
+ formatted_metadata_str = TRUNCATION_MESSAGE
495
+
496
+ summary_parts.append(
497
+ f"---\n{artifact_header}\n{formatted_metadata_str}"
498
+ )
499
+ except Exception as e_format:
500
+ log.error(
501
+ "%s Error formatting metadata for %s v%s: %s",
502
+ log_identifier,
503
+ filename,
504
+ version,
505
+ e_format,
506
+ )
507
+ summary_parts.append(
508
+ f"---\n{artifact_header}\nError: Could not format metadata."
509
+ )
510
+ else:
511
+ error_message = metadata_result.get(
512
+ "message", "Could not load metadata."
513
+ )
514
+ log.warning(
515
+ "%s Failed to load metadata for %s v%s: %s",
516
+ log_identifier,
517
+ filename,
518
+ version,
519
+ error_message,
520
+ )
521
+ artifact_header = f"Artifact: '{filename}' (version: {version})"
522
+ summary_parts.append(f"---\n{artifact_header}\nError: {error_message}")
523
+ except Exception as e_meta:
524
+ log.error(
525
+ "%s Unexpected error loading metadata for %s v%s: %s",
526
+ log_identifier,
527
+ filename,
528
+ version,
529
+ e_meta,
530
+ )
531
+ artifact_header = f"Artifact: '{filename}' (version: {version})"
532
+ summary_parts.append(
533
+ f"---\n{artifact_header}\nError: An unexpected error occurred while loading metadata."
534
+ )
535
+
536
+ return "\n\n".join(summary_parts)
537
+
538
+
402
539
  def decode_and_get_bytes(
403
540
  content_str: str, mime_type: str, log_identifier: str
404
541
  ) -> Tuple[bytes, str]:
@@ -441,12 +578,6 @@ def decode_and_get_bytes(
441
578
  return file_bytes, final_mime_type
442
579
 
443
580
 
444
- from google.adk.artifacts import BaseArtifactService
445
- from datetime import datetime, timezone
446
- import traceback
447
- from ...common.types import ArtifactInfo
448
-
449
-
450
581
  async def get_latest_artifact_version(
451
582
  artifact_service: BaseArtifactService,
452
583
  app_name: str,
@@ -476,7 +607,10 @@ async def get_latest_artifact_version(
476
607
  return None
477
608
 
478
609
  versions = await artifact_service.list_versions(
479
- app_name=app_name, user_id=user_id, session_id=session_id, filename=filename
610
+ app_name=app_name,
611
+ user_id=user_id,
612
+ session_id=session_id,
613
+ filename=filename,
480
614
  )
481
615
  if not versions:
482
616
  log.debug("%s No versions found for artifact.", log_identifier)
@@ -4,13 +4,13 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="generator" content="Docusaurus v3.8.1">
6
6
  <title data-rh="true">Page Not Found | Solace Agent Mesh</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://solacelabs.github.io/solace-agent-mesh/img/logo.png"><meta data-rh="true" name="twitter:image" content="https://solacelabs.github.io/solace-agent-mesh/img/logo.png"><meta data-rh="true" property="og:url" content="https://solacelabs.github.io/solace-agent-mesh/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Page Not Found | Solace Agent Mesh"><link data-rh="true" rel="icon" href="/solace-agent-mesh/img/logo.png"><link data-rh="true" rel="canonical" href="https://solacelabs.github.io/solace-agent-mesh/404.html"><link data-rh="true" rel="alternate" href="https://solacelabs.github.io/solace-agent-mesh/404.html" hreflang="en"><link data-rh="true" rel="alternate" href="https://solacelabs.github.io/solace-agent-mesh/404.html" hreflang="x-default"><link rel="stylesheet" href="/solace-agent-mesh/assets/css/styles.906a1503.css">
7
- <script src="/solace-agent-mesh/assets/js/runtime~main.d9520ae2.js" defer="defer"></script>
8
- <script src="/solace-agent-mesh/assets/js/main.7ed3319f.js" defer="defer"></script>
7
+ <script src="/solace-agent-mesh/assets/js/runtime~main.aa687c82.js" defer="defer"></script>
8
+ <script src="/solace-agent-mesh/assets/js/main.dc7db184.js" defer="defer"></script>
9
9
  </head>
10
10
  <body class="navigation-with-keyboard">
11
11
  <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
12
12
  <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
13
13
  </defs></svg>
14
- <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/solace-agent-mesh/img/logo.png"><link rel="preload" as="image" href="/solace-agent-mesh/img/solace-logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/solace-agent-mesh/docs/documentation/getting-started/introduction"><div class="navbar__logo"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Solace Agent Mesh</b></a><a class="navbar__item navbar__link" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Solace Agent Mesh</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh-core-plugins/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Official Plugins<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Company</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://solace.com/products/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Products<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/contact/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contact<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/support/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Support<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/legal/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy and Legal<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.linkedin.com/company/solacedotcom/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/SolaceSystems" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://twitter.com/solacedotcom" target="_blank" rel="noopener noreferrer" class="footer__link-item">X<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width="10%" height="10%"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width="10%" height="10%"></div><div class="footer__copyright">Solace Agent Mesh. Copyright © 2025 Solace. Version: 1.0.1</div></div></div></footer></div>
14
+ <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/solace-agent-mesh/img/logo.png"><link rel="preload" as="image" href="/solace-agent-mesh/img/solace-logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/solace-agent-mesh/docs/documentation/getting-started/introduction"><div class="navbar__logo"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Solace Agent Mesh</b></a><a class="navbar__item navbar__link" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Solace Agent Mesh</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh-core-plugins/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Official Plugins<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Company</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://solace.com/products/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Products<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/contact/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contact<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/support/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Support<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/legal/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy and Legal<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.linkedin.com/company/solacedotcom/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/SolaceSystems" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://twitter.com/solacedotcom" target="_blank" rel="noopener noreferrer" class="footer__link-item">X<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width="10%" height="10%"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width="10%" height="10%"></div><div class="footer__copyright">Solace Agent Mesh. Copyright © 2025 Solace. Version: 1.0.3</div></div></div></footer></div>
15
15
  </body>
16
16
  </html>