solace-agent-mesh 1.4.12__py3-none-any.whl → 1.5.1__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 (359) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +3 -4
  2. solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
  3. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +1 -1
  4. solace_agent_mesh/agent/adk/callbacks.py +56 -5
  5. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -1
  6. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +2 -1
  7. solace_agent_mesh/agent/adk/mcp_content_processor.py +2 -1
  8. solace_agent_mesh/agent/adk/models/lite_llm.py +1 -0
  9. solace_agent_mesh/agent/adk/models/models_llm.txt +1 -2
  10. solace_agent_mesh/agent/adk/runner.py +3 -1
  11. solace_agent_mesh/agent/adk/services.py +4 -1
  12. solace_agent_mesh/agent/adk/setup.py +3 -1
  13. solace_agent_mesh/agent/adk/tool_wrapper.py +2 -2
  14. solace_agent_mesh/agent/agent_llm.txt +1 -1
  15. solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
  16. solace_agent_mesh/agent/protocol/event_handlers.py +4 -14
  17. solace_agent_mesh/agent/protocol/protocol_llm.txt +15 -2
  18. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
  19. solace_agent_mesh/agent/sac/app.py +3 -1
  20. solace_agent_mesh/agent/sac/component.py +55 -22
  21. solace_agent_mesh/agent/sac/sac_llm.txt +15 -1
  22. solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
  23. solace_agent_mesh/agent/sac/task_execution_context.py +73 -0
  24. solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +2 -1
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +3 -1
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +3 -1
  28. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -1
  29. solace_agent_mesh/agent/tools/general_agent_tools.py +2 -1
  30. solace_agent_mesh/agent/tools/image_tools.py +2 -1
  31. solace_agent_mesh/agent/tools/peer_agent_tool.py +2 -1
  32. solace_agent_mesh/agent/tools/registry.py +3 -1
  33. solace_agent_mesh/agent/tools/test_tools.py +2 -1
  34. solace_agent_mesh/agent/tools/tools_llm.txt +148 -154
  35. solace_agent_mesh/agent/tools/tools_llm_detail.txt +274 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +2 -1
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +3 -1
  38. solace_agent_mesh/agent/utils/config_parser.py +3 -1
  39. solace_agent_mesh/agent/utils/utils_llm.txt +1 -1
  40. solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
  41. solace_agent_mesh/assets/docs/404.html +3 -3
  42. solace_agent_mesh/assets/docs/assets/js/{b7006a3a.73a79653.js → 032c2d61.f3d37824.js} +1 -1
  43. solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +1 -0
  45. solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/{2334.622a6395.js → 2334.1cf50a20.js} +1 -1
  47. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/{3624.b524e433.js → 3624.0eaa1fd0.js} +1 -1
  51. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/509e993c.4c7a1a6d.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.e49689dd.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.39d5851d.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/71da7b71.804d6567.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/77cf947d.64c9bd6c.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js → 8591.5d015485.js} +2 -2
  72. solace_agent_mesh/assets/docs/assets/js/{8731.49e930c2.js → 8731.6c1dbf0c.js} +1 -1
  73. solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/9e9d0a82.dd810042.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/ad71b5ed.60668e9e.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/da0b5bad.9d369087.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/db924877.cbc66f02.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/de915948.139b4b9c.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/e3d9abda.2b916f9e.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/e6f9706b.582a78ca.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/f284c35a.5766a13d.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.9c0297a6.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/main.bd3c34f3.js +2 -0
  93. solace_agent_mesh/assets/docs/assets/js/runtime~main.18dc45dd.js +1 -0
  94. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +143 -0
  95. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/artifact-management/index.html +7 -7
  96. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/audio-tools/index.html +7 -7
  97. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/data-analysis-tools/index.html +8 -8
  98. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/embeds/index.html +6 -6
  99. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/index.html +11 -11
  100. solace_agent_mesh/assets/docs/docs/documentation/{concepts → components}/cli/index.html +25 -25
  101. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +91 -0
  102. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
  103. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
  104. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +104 -0
  106. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +57 -0
  107. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
  108. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +59 -0
  109. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-agents/index.html +113 -152
  110. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-gateways/index.html +9 -9
  111. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/creating-python-tools/index.html +12 -12
  112. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +32 -0
  114. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
  115. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/bedrock-agents/index.html +25 -25
  116. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/custom-agent/index.html +13 -13
  117. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/event-mesh-gateway/index.html +11 -11
  118. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/mcp-integration/index.html +10 -10
  119. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/mongodb-integration/index.html +13 -13
  120. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/rag-integration/index.html +13 -13
  121. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/rest-gateway/index.html +10 -10
  122. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/{tutorials → developing/tutorials}/sql-database/index.html +14 -14
  124. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +33 -0
  125. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +83 -0
  126. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +222 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +161 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +53 -0
  130. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +35 -100
  131. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
  132. solace_agent_mesh/assets/docs/docs/documentation/{getting-started → installing-and-configuring}/configurations/index.html +56 -50
  133. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +76 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +63 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/{Migrations/A2A Upgrade To 0.3.0/a2a-technical-migration-map/index.html → migrations/a2a-upgrade/a2a-technical-migration-map/index.html} +10 -11
  139. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  140. solace_agent_mesh/assets/docs/lunr-index-1760121512891.json +1 -0
  141. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  142. solace_agent_mesh/assets/docs/search-doc-1760121512891.json +1 -0
  143. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  144. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  145. solace_agent_mesh/cli/__init__.py +1 -1
  146. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-j1LW-wlq.js → authCallback-DwrxZE0E.js} +1 -1
  147. solace_agent_mesh/client/webui/frontend/static/assets/{client-B9p_nFNA.js → client-DarGQzyw.js} +1 -1
  148. solace_agent_mesh/client/webui/frontend/static/assets/main-2nd1gbaH.js +339 -0
  149. solace_agent_mesh/client/webui/frontend/static/assets/main-DoKXctCM.css +1 -0
  150. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CS5YMf8a.js → vendor-BKIeiHj_.js} +80 -70
  151. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  152. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  153. solace_agent_mesh/common/a2a/a2a_llm.txt +1 -1
  154. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
  155. solace_agent_mesh/common/a2a/artifact.py +2 -1
  156. solace_agent_mesh/common/a2a/protocol.py +3 -2
  157. solace_agent_mesh/common/a2a/translation.py +3 -1
  158. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +1 -1
  159. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
  160. solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +23 -0
  161. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +93 -15
  162. solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +23 -0
  163. solace_agent_mesh/common/common_llm.txt +24 -39
  164. solace_agent_mesh/common/common_llm_detail.txt +2562 -0
  165. solace_agent_mesh/common/data_parts.py +9 -1
  166. solace_agent_mesh/common/middleware/config_resolver.py +3 -1
  167. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
  168. solace_agent_mesh/common/middleware/registry.py +3 -1
  169. solace_agent_mesh/common/sac/sac_llm.txt +1 -1
  170. solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
  171. solace_agent_mesh/common/sac/sam_component_base.py +2 -1
  172. solace_agent_mesh/common/sam_events/event_service.py +3 -2
  173. solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
  174. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
  175. solace_agent_mesh/common/services/employee_service.py +3 -1
  176. solace_agent_mesh/common/services/identity_service.py +2 -1
  177. solace_agent_mesh/common/services/providers/local_file_identity_service.py +2 -1
  178. solace_agent_mesh/common/services/services_llm.txt +57 -6
  179. solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
  180. solace_agent_mesh/common/utils/artifact_utils.py +3 -1
  181. solace_agent_mesh/common/utils/asyncio_macos_fix.py +3 -1
  182. solace_agent_mesh/common/utils/embeds/converter.py +3 -1
  183. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +1 -1
  184. solace_agent_mesh/common/utils/embeds/evaluators.py +2 -1
  185. solace_agent_mesh/common/utils/embeds/modifiers.py +3 -2
  186. solace_agent_mesh/common/utils/embeds/resolver.py +2 -1
  187. solace_agent_mesh/common/utils/initializer.py +3 -1
  188. solace_agent_mesh/common/utils/message_utils.py +2 -1
  189. solace_agent_mesh/common/utils/push_notification_auth.py +3 -2
  190. solace_agent_mesh/common/utils/utils_llm.txt +75 -87
  191. solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
  192. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
  193. solace_agent_mesh/core_a2a/service.py +2 -2
  194. solace_agent_mesh/gateway/base/app.py +3 -2
  195. solace_agent_mesh/gateway/base/base_llm.txt +1 -1
  196. solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
  197. solace_agent_mesh/gateway/base/component.py +3 -1
  198. solace_agent_mesh/gateway/base/task_context.py +2 -1
  199. solace_agent_mesh/gateway/gateway_llm.txt +242 -235
  200. solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
  201. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +295 -0
  202. solace_agent_mesh/gateway/http_sse/alembic/env.py +10 -1
  203. solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
  204. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +155 -0
  205. solace_agent_mesh/gateway/http_sse/alembic.ini +1 -1
  206. solace_agent_mesh/gateway/http_sse/app.py +150 -3
  207. solace_agent_mesh/gateway/http_sse/component.py +372 -61
  208. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +46 -6
  209. solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
  210. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +4 -2
  211. solace_agent_mesh/gateway/http_sse/dependencies.py +119 -27
  212. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +172 -172
  213. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
  214. solace_agent_mesh/gateway/http_sse/main.py +149 -42
  215. solace_agent_mesh/gateway/http_sse/repository/__init__.py +3 -12
  216. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +103 -0
  217. solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +5 -3
  218. solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
  219. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +263 -0
  220. solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
  221. solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -16
  222. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +25 -0
  223. solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
  224. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +81 -0
  225. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +73 -18
  226. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +9 -5
  227. solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
  228. solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
  229. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +266 -0
  230. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +3 -3
  231. solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
  232. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +32 -0
  233. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +340 -0
  234. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -53
  235. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +173 -0
  236. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +3 -2
  237. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +3 -3
  238. solace_agent_mesh/gateway/http_sse/routers/auth.py +3 -1
  239. solace_agent_mesh/gateway/http_sse/routers/config.py +29 -6
  240. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +346 -0
  241. solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +3 -3
  242. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +83 -0
  243. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +2 -10
  244. solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
  245. solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +5 -3
  246. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +107 -0
  247. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +1 -15
  248. solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
  249. solace_agent_mesh/gateway/http_sse/routers/feedback.py +37 -0
  250. solace_agent_mesh/gateway/http_sse/routers/people.py +3 -1
  251. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +255 -204
  252. solace_agent_mesh/gateway/http_sse/routers/sessions.py +223 -41
  253. solace_agent_mesh/gateway/http_sse/routers/sse.py +3 -2
  254. solace_agent_mesh/gateway/http_sse/routers/tasks.py +170 -43
  255. solace_agent_mesh/gateway/http_sse/routers/users.py +3 -1
  256. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  257. solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +3 -1
  258. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
  259. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +242 -0
  260. solace_agent_mesh/gateway/http_sse/services/people_service.py +2 -82
  261. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +177 -13
  262. solace_agent_mesh/gateway/http_sse/services/session_service.py +154 -85
  263. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +318 -0
  264. solace_agent_mesh/gateway/http_sse/services/task_service.py +3 -2
  265. solace_agent_mesh/gateway/http_sse/session_manager.py +2 -1
  266. solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +25 -14
  267. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +285 -0
  268. solace_agent_mesh/gateway/http_sse/shared/types.py +7 -0
  269. solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +2 -1
  270. solace_agent_mesh/gateway/http_sse/sse_manager.py +2 -2
  271. solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
  272. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +32 -0
  273. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
  274. solace_agent_mesh/solace_agent_mesh_llm.txt +1 -1
  275. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
  276. solace_agent_mesh/templates/gateway_app_template.py +4 -2
  277. solace_agent_mesh/templates/gateway_component_template.py +3 -1
  278. solace_agent_mesh/templates/logging_config_template.ini +22 -45
  279. solace_agent_mesh/templates/plugin_tools_template.py +2 -2
  280. {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/METADATA +2 -2
  281. solace_agent_mesh-1.5.1.dist-info/RECORD +504 -0
  282. solace_agent_mesh/agent/adk/invocation_monitor.py +0 -295
  283. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  284. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  285. solace_agent_mesh/assets/docs/assets/js/04989206.a248f00c.js +0 -1
  286. solace_agent_mesh/assets/docs/assets/js/0e682baa.d54b8668.js +0 -1
  287. solace_agent_mesh/assets/docs/assets/js/1023fc19.8a8a9309.js +0 -1
  288. solace_agent_mesh/assets/docs/assets/js/1523c6b4.2645ef68.js +0 -1
  289. solace_agent_mesh/assets/docs/assets/js/166ab619.e27886d9.js +0 -1
  290. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.e056b7e0.js +0 -1
  291. solace_agent_mesh/assets/docs/assets/js/21ceee5f.3bf39250.js +0 -1
  292. solace_agent_mesh/assets/docs/assets/js/2a9cab12.2afaee76.js +0 -1
  293. solace_agent_mesh/assets/docs/assets/js/332e10b5.f7629851.js +0 -1
  294. solace_agent_mesh/assets/docs/assets/js/3d406171.5560fdf9.js +0 -1
  295. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.508ae8db.js +0 -1
  296. solace_agent_mesh/assets/docs/assets/js/442a8107.b5c2532a.js +0 -1
  297. solace_agent_mesh/assets/docs/assets/js/453a82a6.3c6bb61d.js +0 -1
  298. solace_agent_mesh/assets/docs/assets/js/483cef9a.4736f2d8.js +0 -1
  299. solace_agent_mesh/assets/docs/assets/js/4c2787c2.c1290a40.js +0 -1
  300. solace_agent_mesh/assets/docs/assets/js/55f47984.bcd00a86.js +0 -1
  301. solace_agent_mesh/assets/docs/assets/js/5b4258a4.fdfd2325.js +0 -1
  302. solace_agent_mesh/assets/docs/assets/js/664b740a.ba305a89.js +0 -1
  303. solace_agent_mesh/assets/docs/assets/js/75384d09.c19e8b51.js +0 -1
  304. solace_agent_mesh/assets/docs/assets/js/768e31b0.9abcdc48.js +0 -1
  305. solace_agent_mesh/assets/docs/assets/js/85387663.be2bc838.js +0 -1
  306. solace_agent_mesh/assets/docs/assets/js/945fb41e.16e00776.js +0 -1
  307. solace_agent_mesh/assets/docs/assets/js/9a09e75d.92de8cf5.js +0 -1
  308. solace_agent_mesh/assets/docs/assets/js/9eff14a2.d62aad71.js +0 -1
  309. solace_agent_mesh/assets/docs/assets/js/a12a4955.25fbed32.js +0 -1
  310. solace_agent_mesh/assets/docs/assets/js/a3a92b25.af35e313.js +0 -1
  311. solace_agent_mesh/assets/docs/assets/js/aba87c2f.4ddf32f2.js +0 -1
  312. solace_agent_mesh/assets/docs/assets/js/ae0e903d.5fe5203f.js +0 -1
  313. solace_agent_mesh/assets/docs/assets/js/ae4415af.16cc58d3.js +0 -1
  314. solace_agent_mesh/assets/docs/assets/js/bac0be12.17de4316.js +0 -1
  315. solace_agent_mesh/assets/docs/assets/js/c2c06897.87cb1f47.js +0 -1
  316. solace_agent_mesh/assets/docs/assets/js/c835a94d.ce21f0bf.js +0 -1
  317. solace_agent_mesh/assets/docs/assets/js/cc969b05.feef7dcc.js +0 -1
  318. solace_agent_mesh/assets/docs/assets/js/cd3d4052.a19e7d78.js +0 -1
  319. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +0 -1
  320. solace_agent_mesh/assets/docs/assets/js/cee5d587.47904f5e.js +0 -1
  321. solace_agent_mesh/assets/docs/assets/js/d6a81ee7.829198f1.js +0 -1
  322. solace_agent_mesh/assets/docs/assets/js/f284c35a.ed8dd236.js +0 -1
  323. solace_agent_mesh/assets/docs/assets/js/f897a61a.126663fe.js +0 -1
  324. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.e144b16c.js +0 -1
  325. solace_agent_mesh/assets/docs/assets/js/main.f67fc9f4.js +0 -2
  326. solace_agent_mesh/assets/docs/assets/js/runtime~main.40527046.js +0 -1
  327. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/installation/index.html +0 -46
  328. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/rbac-setup-guilde/index.html +0 -201
  329. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/single-sign-on/index.html +0 -25
  330. solace_agent_mesh/assets/docs/docs/documentation/Migrations/A2A Upgrade To 0.3.0/a2a-gateway-upgrade-to-0.3.0/index.html +0 -105
  331. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +0 -144
  332. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +0 -91
  333. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +0 -91
  334. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +0 -55
  335. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +0 -111
  336. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +0 -77
  337. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +0 -48
  338. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +0 -54
  339. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +0 -45
  340. solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/litellm_models/index.html +0 -49
  341. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +0 -76
  342. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +0 -73
  343. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +0 -72
  344. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +0 -54
  345. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +0 -69
  346. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +0 -59
  347. solace_agent_mesh/assets/docs/lunr-index-1759936913198.json +0 -1
  348. solace_agent_mesh/assets/docs/search-doc-1759936913198.json +0 -1
  349. solace_agent_mesh/client/webui/frontend/static/assets/main-ChRwcV89.css +0 -1
  350. solace_agent_mesh/client/webui/frontend/static/assets/main-DnnE01OM.js +0 -339
  351. solace_agent_mesh/gateway/http_sse/repository/entities/message.py +0 -41
  352. solace_agent_mesh/gateway/http_sse/repository/message_repository.py +0 -84
  353. solace_agent_mesh/gateway/http_sse/repository/models/message_model.py +0 -45
  354. solace_agent_mesh-1.4.12.dist-info/RECORD +0 -448
  355. /solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js.LICENSE.txt → 8591.5d015485.js.LICENSE.txt} +0 -0
  356. /solace_agent_mesh/assets/docs/assets/js/{main.f67fc9f4.js.LICENSE.txt → main.bd3c34f3.js.LICENSE.txt} +0 -0
  357. {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/WHEEL +0 -0
  358. {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/entry_points.txt +0 -0
  359. {solace_agent_mesh-1.4.12.dist-info → solace_agent_mesh-1.5.1.dist-info}/licenses/LICENSE +0 -0
@@ -2,6 +2,7 @@
2
2
  Custom Solace AI Connector Component to host the FastAPI backend for the Web UI.
3
3
  """
4
4
 
5
+ import logging
5
6
  import asyncio
6
7
  import json
7
8
  import queue
@@ -14,7 +15,7 @@ from typing import Any
14
15
  import uvicorn
15
16
  from fastapi import FastAPI, UploadFile
16
17
  from fastapi import Request as FastAPIRequest
17
- from solace_ai_connector.common.log import log
18
+
18
19
  from solace_ai_connector.components.inputs_outputs.broker_input import BrokerInput
19
20
  from solace_ai_connector.flow.app import App as SACApp
20
21
  from solace_ai_connector.common.event import Event, EventType
@@ -26,6 +27,12 @@ from ...gateway.http_sse.session_manager import SessionManager
26
27
  from ...gateway.http_sse.sse_manager import SSEManager
27
28
  from .sse_event_buffer import SSEEventBuffer
28
29
  from .components import VisualizationForwarderComponent
30
+ from .components.task_logger_forwarder import TaskLoggerForwarderComponent
31
+ from .services.feedback_service import FeedbackService
32
+ from .services.task_logger_service import TaskLoggerService
33
+ from . import dependencies
34
+
35
+ log = logging.getLogger(__name__)
29
36
 
30
37
  try:
31
38
  from google.adk.artifacts import BaseArtifactService
@@ -153,6 +160,23 @@ class WebUIBackendComponent(BaseGatewayComponent):
153
160
  else:
154
161
  # Memory storage or no explicit configuration - no persistence service needed
155
162
  self.database_url = None
163
+
164
+ # Validate that features requiring database persistence are not enabled
165
+ task_logging_config = self.get_config("task_logging", {})
166
+ if task_logging_config.get("enabled", False):
167
+ raise ValueError(
168
+ f"{self.log_identifier} Task logging requires SQL session storage. "
169
+ "Either set session_service.type='sql' with a valid database_url, "
170
+ "or disable task_logging.enabled."
171
+ )
172
+
173
+ feedback_config = self.get_config("feedback_publishing", {})
174
+ if feedback_config.get("enabled", False):
175
+ log.warning(
176
+ "%s Feedback publishing is enabled but database persistence is not configured. "
177
+ "Feedback will only be published to the broker, not stored locally.",
178
+ self.log_identifier
179
+ )
156
180
 
157
181
  component_config = self.get_config("component_config", {})
158
182
  app_config = component_config.get("app_config", {})
@@ -170,12 +194,18 @@ class WebUIBackendComponent(BaseGatewayComponent):
170
194
  self._visualization_internal_app: SACApp | None = None
171
195
  self._visualization_broker_input: BrokerInput | None = None
172
196
  self._visualization_message_queue: queue.Queue = queue.Queue(maxsize=200)
197
+ self._task_logger_queue: queue.Queue = queue.Queue(maxsize=200)
173
198
  self._active_visualization_streams: dict[str, dict[str, Any]] = {}
174
199
  self._visualization_locks: dict[asyncio.AbstractEventLoop, asyncio.Lock] = {}
175
200
  self._visualization_locks_lock = threading.Lock()
176
201
  self._global_visualization_subscriptions: dict[str, int] = {}
177
202
  self._visualization_processor_task: asyncio.Task | None = None
178
203
 
204
+ self._task_logger_internal_app: SACApp | None = None
205
+ self._task_logger_broker_input: BrokerInput | None = None
206
+ self._task_logger_processor_task: asyncio.Task | None = None
207
+ self.task_logger_service: TaskLoggerService | None = None
208
+
179
209
  # Initialize SAM Events service for system events
180
210
  from ...common.sam_events import SamEventService
181
211
 
@@ -185,14 +215,75 @@ class WebUIBackendComponent(BaseGatewayComponent):
185
215
  publish_func=self.publish_a2a,
186
216
  )
187
217
 
218
+ # Initialize data retention service and timer
219
+ self.data_retention_service = None
220
+ self._data_retention_timer_id = None
221
+ data_retention_config = self.get_config("data_retention", {})
222
+ if data_retention_config.get("enabled", True):
223
+ log.info("%s Data retention is enabled. Initializing service and timer...", self.log_identifier)
224
+
225
+ # Import and initialize the DataRetentionService
226
+ from .services.data_retention_service import DataRetentionService
227
+
228
+ session_factory = None
229
+ if self.database_url:
230
+ # SessionLocal will be initialized later in setup_dependencies
231
+ # We'll pass a lambda that returns SessionLocal when called
232
+ session_factory = lambda: dependencies.SessionLocal() if dependencies.SessionLocal else None
233
+
234
+ self.data_retention_service = DataRetentionService(
235
+ session_factory=session_factory,
236
+ config=data_retention_config
237
+ )
238
+
239
+ # Create and start the cleanup timer
240
+ cleanup_interval_hours = data_retention_config.get("cleanup_interval_hours", 24)
241
+ cleanup_interval_ms = cleanup_interval_hours * 60 * 60 * 1000
242
+ self._data_retention_timer_id = f"data_retention_cleanup_{self.gateway_id}"
243
+
244
+ self.add_timer(
245
+ delay_ms=cleanup_interval_ms,
246
+ timer_id=self._data_retention_timer_id,
247
+ interval_ms=cleanup_interval_ms,
248
+ )
249
+ log.info(
250
+ "%s Data retention timer created with ID '%s' and interval %d hours.",
251
+ self.log_identifier,
252
+ self._data_retention_timer_id,
253
+ cleanup_interval_hours,
254
+ )
255
+ else:
256
+ log.info("%s Data retention is disabled via configuration.", self.log_identifier)
257
+
188
258
  log.info("%s Web UI Backend Component initialized.", self.log_identifier)
189
259
 
190
260
  def process_event(self, event: Event):
191
261
  if event.event_type == EventType.TIMER:
192
- if event.data.get("timer_id") == self._sse_cleanup_timer_id:
262
+ timer_id = event.data.get("timer_id")
263
+
264
+ if timer_id == self._sse_cleanup_timer_id:
193
265
  log.debug("%s SSE buffer cleanup timer triggered.", self.log_identifier)
194
266
  self.sse_event_buffer.cleanup_stale_buffers()
195
267
  return
268
+
269
+ if timer_id == self._data_retention_timer_id:
270
+ log.debug("%s Data retention cleanup timer triggered.", self.log_identifier)
271
+ if self.data_retention_service:
272
+ try:
273
+ self.data_retention_service.cleanup_old_data()
274
+ except Exception as e:
275
+ log.error(
276
+ "%s Error during data retention cleanup: %s",
277
+ self.log_identifier,
278
+ e,
279
+ exc_info=True,
280
+ )
281
+ else:
282
+ log.warning(
283
+ "%s Data retention timer fired but service is not initialized.",
284
+ self.log_identifier,
285
+ )
286
+ return
196
287
 
197
288
  super().process_event(event)
198
289
 
@@ -270,9 +361,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
270
361
  forwarder_cfg = {
271
362
  "component_class": VisualizationForwarderComponent,
272
363
  "component_name": f"{self.gateway_id}_viz_forwarder",
273
- "component_config": {
274
- "target_queue_ref": self._visualization_message_queue
275
- },
364
+ "component_config": {"target_queue_ref": self._visualization_message_queue},
276
365
  }
277
366
 
278
367
  flow_config = {
@@ -355,6 +444,121 @@ class WebUIBackendComponent(BaseGatewayComponent):
355
444
  self._visualization_broker_input = None
356
445
  raise
357
446
 
447
+ def _ensure_task_logger_flow_is_running(self) -> None:
448
+ """
449
+ Ensures the internal SAC flow for A2A task logging is created and running.
450
+ """
451
+ log_id_prefix = f"{self.log_identifier}[EnsureTaskLogFlow]"
452
+ if self._task_logger_internal_app is not None:
453
+ log.debug("%s Task logger flow already running.", log_id_prefix)
454
+ return
455
+
456
+ log.info("%s Initializing internal A2A task logger flow...", log_id_prefix)
457
+ try:
458
+ main_app = self.get_app()
459
+ if not main_app or not main_app.connector:
460
+ raise RuntimeError(
461
+ "Main app or connector not available for internal flow creation."
462
+ )
463
+
464
+ main_broker_config = main_app.app_info.get("broker", {})
465
+ if not main_broker_config:
466
+ raise ValueError("Main app broker configuration is missing.")
467
+
468
+ # The task logger needs to see ALL messages.
469
+ subscriptions = [{"topic": f"{self.namespace.rstrip('/')}/a2a/>"}]
470
+
471
+ broker_input_cfg = {
472
+ "component_module": "broker_input",
473
+ "component_name": f"{self.gateway_id}_task_log_broker_input",
474
+ "broker_queue_name": f"{self.namespace.strip('/')}/q/gdk/task_log/{self.gateway_id}/{uuid.uuid4().hex}",
475
+ "create_queue_on_start": True,
476
+ "component_config": {
477
+ "broker_url": main_broker_config.get("broker_url"),
478
+ "broker_username": main_broker_config.get("broker_username"),
479
+ "broker_password": main_broker_config.get("broker_password"),
480
+ "broker_vpn": main_broker_config.get("broker_vpn"),
481
+ "trust_store_path": main_broker_config.get("trust_store_path"),
482
+ "dev_mode": main_broker_config.get("dev_mode"),
483
+ "broker_subscriptions": subscriptions,
484
+ "reconnection_strategy": main_broker_config.get(
485
+ "reconnection_strategy"
486
+ ),
487
+ "retry_interval": main_broker_config.get("retry_interval"),
488
+ "retry_count": main_broker_config.get("retry_count"),
489
+ "temporary_queue": True,
490
+ },
491
+ }
492
+
493
+ forwarder_cfg = {
494
+ "component_class": TaskLoggerForwarderComponent,
495
+ "component_name": f"{self.gateway_id}_task_log_forwarder",
496
+ "component_config": {"target_queue_ref": self._task_logger_queue},
497
+ }
498
+
499
+ flow_config = {
500
+ "name": f"{self.gateway_id}_task_log_flow",
501
+ "components": [broker_input_cfg, forwarder_cfg],
502
+ }
503
+
504
+ internal_app_broker_config = main_broker_config.copy()
505
+ internal_app_broker_config["input_enabled"] = True
506
+ internal_app_broker_config["output_enabled"] = False
507
+
508
+ app_config_for_internal_flow = {
509
+ "name": f"{self.gateway_id}_task_log_internal_app",
510
+ "flows": [flow_config],
511
+ "broker": internal_app_broker_config,
512
+ "app_config": {},
513
+ }
514
+
515
+ self._task_logger_internal_app = main_app.connector.create_internal_app(
516
+ app_name=app_config_for_internal_flow["name"],
517
+ flows=app_config_for_internal_flow["flows"],
518
+ )
519
+
520
+ if (
521
+ not self._task_logger_internal_app
522
+ or not self._task_logger_internal_app.flows
523
+ ):
524
+ raise RuntimeError("Internal task logger app/flow creation failed.")
525
+
526
+ self._task_logger_internal_app.run()
527
+ log.info("%s Internal task logger app started.", log_id_prefix)
528
+
529
+ flow_instance = self._task_logger_internal_app.flows[0]
530
+ if flow_instance.component_groups and flow_instance.component_groups[0]:
531
+ self._task_logger_broker_input = flow_instance.component_groups[0][0]
532
+ if not isinstance(self._task_logger_broker_input, BrokerInput):
533
+ raise RuntimeError(
534
+ "Task logger flow setup error: BrokerInput not found."
535
+ )
536
+ log.info(
537
+ "%s Obtained reference to internal task logger BrokerInput component.",
538
+ log_id_prefix,
539
+ )
540
+ else:
541
+ raise RuntimeError(
542
+ "Task logger flow setup error: BrokerInput instance not accessible."
543
+ )
544
+
545
+ except Exception as e:
546
+ log.exception(
547
+ "%s Failed to ensure task logger flow is running: %s", log_id_prefix, e
548
+ )
549
+ if self._task_logger_internal_app:
550
+ try:
551
+ self._task_logger_internal_app.cleanup()
552
+ except Exception as cleanup_err:
553
+ log.error(
554
+ "%s Error during cleanup after task logger flow init failure: %s",
555
+ log_id_prefix,
556
+ cleanup_err,
557
+ )
558
+ self._task_logger_internal_app = None
559
+ self._task_logger_broker_input = None
560
+ raise
561
+
358
562
  def _resolve_session_config(self) -> dict:
359
563
  """
360
564
  Resolve session service configuration with backward compatibility.
@@ -390,7 +594,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
390
594
  """
391
595
  Asynchronously consumes messages from the _visualization_message_queue,
392
596
  filters them, and forwards them to relevant SSE connections.
393
- Placeholder for Phase 2: Just logs messages.
394
597
  """
395
598
  log_id_prefix = f"{self.log_identifier}[VizMsgProcessor]"
396
599
  log.info("%s Starting visualization message processor loop...", log_id_prefix)
@@ -417,7 +620,7 @@ class WebUIBackendComponent(BaseGatewayComponent):
417
620
  max_size = self._visualization_message_queue.maxsize
418
621
  if max_size > 0 and (current_size / max_size) > 0.90:
419
622
  log.warning(
420
- "%s Visualization queue is over 90%% full. Current size: %d/%d",
623
+ "%s Visualization message queue is over 90%% full. Current size: %d/%d",
421
624
  log_id_prefix,
422
625
  current_size,
423
626
  max_size,
@@ -594,6 +797,59 @@ class WebUIBackendComponent(BaseGatewayComponent):
594
797
 
595
798
  log.info("%s Visualization message processor loop finished.", log_id_prefix)
596
799
 
800
+ async def _task_logger_loop(self) -> None:
801
+ """
802
+ Asynchronously consumes messages from the _task_logger_queue and
803
+ passes them to the TaskLoggerService for persistence.
804
+ """
805
+ log_id_prefix = f"{self.log_identifier}[TaskLoggerLoop]"
806
+ log.info("%s Starting task logger loop...", log_id_prefix)
807
+ loop = asyncio.get_running_loop()
808
+
809
+ while not self.stop_signal.is_set():
810
+ msg_data = None
811
+ try:
812
+ msg_data = await loop.run_in_executor(
813
+ None,
814
+ self._task_logger_queue.get,
815
+ True,
816
+ 1.0,
817
+ )
818
+
819
+ if msg_data is None:
820
+ log.info(
821
+ "%s Received shutdown signal for task logger loop.",
822
+ log_id_prefix,
823
+ )
824
+ break
825
+
826
+ if self.task_logger_service:
827
+ self.task_logger_service.log_event(msg_data)
828
+ else:
829
+ log.warning(
830
+ "%s Task logger service not available. Cannot log event.",
831
+ log_id_prefix,
832
+ )
833
+
834
+ self._task_logger_queue.task_done()
835
+
836
+ except queue.Empty:
837
+ continue
838
+ except asyncio.CancelledError:
839
+ log.info("%s Task logger loop cancelled.", log_id_prefix)
840
+ break
841
+ except Exception as e:
842
+ log.exception(
843
+ "%s Error in task logger loop: %s",
844
+ log_id_prefix,
845
+ e,
846
+ )
847
+ if msg_data and self._task_logger_queue:
848
+ self._task_logger_queue.task_done()
849
+ await asyncio.sleep(1)
850
+
851
+ log.info("%s Task logger loop finished.", log_id_prefix)
852
+
597
853
  async def _add_visualization_subscription(
598
854
  self, topic_str: str, stream_id: str
599
855
  ) -> bool:
@@ -919,6 +1175,18 @@ class WebUIBackendComponent(BaseGatewayComponent):
919
1175
 
920
1176
  setup_dependencies(self, self.database_url)
921
1177
 
1178
+ # Instantiate services that depend on the database session factory.
1179
+ # This must be done *after* setup_dependencies has run.
1180
+ session_factory = dependencies.SessionLocal if self.database_url else None
1181
+ task_logging_config = self.get_config("task_logging", {})
1182
+ self.task_logger_service = TaskLoggerService(
1183
+ session_factory=session_factory, config=task_logging_config
1184
+ )
1185
+ log.info(
1186
+ "%s Services dependent on database session factory have been initialized.",
1187
+ self.log_identifier,
1188
+ )
1189
+
922
1190
  port = (
923
1191
  self.fastapi_https_port
924
1192
  if self.ssl_keyfile and self.ssl_certfile
@@ -976,6 +1244,35 @@ class WebUIBackendComponent(BaseGatewayComponent):
976
1244
  "%s Visualization message processor task already running.",
977
1245
  self.log_identifier,
978
1246
  )
1247
+
1248
+ task_logging_config = self.get_config("task_logging", {})
1249
+ if task_logging_config.get("enabled", False):
1250
+ log.info(
1251
+ "%s Task logging is enabled. Ensuring flow is running...",
1252
+ self.log_identifier,
1253
+ )
1254
+ self._ensure_task_logger_flow_is_running()
1255
+
1256
+ if (
1257
+ self._task_logger_processor_task is None
1258
+ or self._task_logger_processor_task.done()
1259
+ ):
1260
+ log.info(
1261
+ "%s Starting task logger processor task.",
1262
+ self.log_identifier,
1263
+ )
1264
+ self._task_logger_processor_task = (
1265
+ self.fastapi_event_loop.create_task(
1266
+ self._task_logger_loop()
1267
+ )
1268
+ )
1269
+ else:
1270
+ log.info(
1271
+ "%s Task logger processor task already running.",
1272
+ self.log_identifier,
1273
+ )
1274
+ else:
1275
+ log.info("%s Task logging is disabled.", self.log_identifier)
979
1276
  else:
980
1277
  log.error(
981
1278
  "%s FastAPI event loop not captured. Cannot start visualization processor.",
@@ -990,6 +1287,27 @@ class WebUIBackendComponent(BaseGatewayComponent):
990
1287
  )
991
1288
  self.stop_signal.set()
992
1289
 
1290
+ try:
1291
+ from solace_agent_mesh_enterprise.init_enterprise import start_enterprise_background_tasks
1292
+ log.info("%s Starting enterprise background tasks...", self.log_identifier)
1293
+ await start_enterprise_background_tasks(self)
1294
+ log.info("%s Enterprise background tasks started successfully", self.log_identifier)
1295
+ except ImportError:
1296
+ log.debug("%s Enterprise package not available - skipping background tasks", self.log_identifier)
1297
+ except RuntimeError as enterprise_err:
1298
+ log.warning(
1299
+ "%s Enterprise background tasks disabled: %s - Community features will continue normally",
1300
+ self.log_identifier,
1301
+ enterprise_err
1302
+ )
1303
+ except Exception as enterprise_err:
1304
+ log.error(
1305
+ "%s Failed to start enterprise background tasks: %s - Community features will continue normally",
1306
+ self.log_identifier,
1307
+ enterprise_err,
1308
+ exc_info=True
1309
+ )
1310
+
993
1311
  @self.fastapi_app.on_event("shutdown")
994
1312
  async def shutdown_event():
995
1313
  log.info(
@@ -997,6 +1315,21 @@ class WebUIBackendComponent(BaseGatewayComponent):
997
1315
  self.log_identifier,
998
1316
  )
999
1317
 
1318
+ try:
1319
+ from solace_agent_mesh_enterprise.init_enterprise import stop_enterprise_background_tasks
1320
+ log.info("%s Stopping enterprise background tasks...", self.log_identifier)
1321
+ await stop_enterprise_background_tasks()
1322
+ log.info("%s Enterprise background tasks stopped", self.log_identifier)
1323
+ except ImportError:
1324
+ log.debug("%s Enterprise package not available - no background tasks to stop", self.log_identifier)
1325
+ except Exception as enterprise_err:
1326
+ log.error(
1327
+ "%s Failed to stop enterprise background tasks: %s",
1328
+ self.log_identifier,
1329
+ enterprise_err,
1330
+ exc_info=True
1331
+ )
1332
+
1000
1333
  self.fastapi_thread = threading.Thread(
1001
1334
  target=self.uvicorn_server.run, daemon=True, name="FastAPI_Thread"
1002
1335
  )
@@ -1059,10 +1392,23 @@ class WebUIBackendComponent(BaseGatewayComponent):
1059
1392
  def cleanup(self):
1060
1393
  """Gracefully shuts down the component and the FastAPI server."""
1061
1394
  log.info("%s Cleaning up Web UI Backend Component...", self.log_identifier)
1395
+
1396
+ # Cancel timers
1062
1397
  self.cancel_timer(self._sse_cleanup_timer_id)
1398
+ if self._data_retention_timer_id:
1399
+ self.cancel_timer(self._data_retention_timer_id)
1400
+ log.info("%s Cancelled data retention cleanup timer.", self.log_identifier)
1401
+
1402
+ # Clean up data retention service
1403
+ if self.data_retention_service:
1404
+ self.data_retention_service = None
1405
+ log.info("%s Data retention service cleaned up.", self.log_identifier)
1406
+
1063
1407
  log.info("%s Cleaning up visualization resources...", self.log_identifier)
1064
1408
  if self._visualization_message_queue:
1065
1409
  self._visualization_message_queue.put(None)
1410
+ if self._task_logger_queue:
1411
+ self._task_logger_queue.put(None)
1066
1412
 
1067
1413
  if (
1068
1414
  self._visualization_processor_task
@@ -1073,6 +1419,10 @@ class WebUIBackendComponent(BaseGatewayComponent):
1073
1419
  )
1074
1420
  self._visualization_processor_task.cancel()
1075
1421
 
1422
+ if self._task_logger_processor_task and not self._task_logger_processor_task.done():
1423
+ log.info("%s Cancelling task logger processor task...", self.log_identifier)
1424
+ self._task_logger_processor_task.cancel()
1425
+
1076
1426
  if self._visualization_internal_app:
1077
1427
  log.info(
1078
1428
  "%s Cleaning up internal visualization app...", self.log_identifier
@@ -1086,6 +1436,17 @@ class WebUIBackendComponent(BaseGatewayComponent):
1086
1436
  e,
1087
1437
  )
1088
1438
 
1439
+ if self._task_logger_internal_app:
1440
+ log.info("%s Cleaning up internal task logger app...", self.log_identifier)
1441
+ try:
1442
+ self._task_logger_internal_app.cleanup()
1443
+ except Exception as e:
1444
+ log.error(
1445
+ "%s Error cleaning up internal task logger app: %s",
1446
+ self.log_identifier,
1447
+ e,
1448
+ )
1449
+
1089
1450
  self._active_visualization_streams.clear()
1090
1451
  self._global_visualization_subscriptions.clear()
1091
1452
  self._cleanup_visualization_locks()
@@ -1375,6 +1736,10 @@ class WebUIBackendComponent(BaseGatewayComponent):
1375
1736
  def get_session_manager(self) -> SessionManager:
1376
1737
  return self.session_manager
1377
1738
 
1739
+ def get_task_logger_service(self) -> TaskLoggerService | None:
1740
+ """Returns the shared TaskLoggerService instance."""
1741
+ return self.task_logger_service
1742
+
1378
1743
  def get_namespace(self) -> str:
1379
1744
  return self.namespace
1380
1745
 
@@ -1672,60 +2037,6 @@ class WebUIBackendComponent(BaseGatewayComponent):
1672
2037
  a2a_task_id,
1673
2038
  )
1674
2039
 
1675
- # Store final agent response in persistence layer if available
1676
- if hasattr(self, "database_url") and self.database_url:
1677
- try:
1678
- session_id = external_request_context.get("a2a_session_id")
1679
- user_id = external_request_context.get("user_id_for_a2a")
1680
- agent_name = external_request_context.get(
1681
- "target_agent_name", "agent"
1682
- )
1683
-
1684
- message_text = ""
1685
- if task_data.status and task_data.status.message:
1686
- parts = a2a.get_parts_from_message(task_data.status.message)
1687
- for part in parts:
1688
- if hasattr(part, "text") and part.text:
1689
- if message_text:
1690
- message_text += "\n"
1691
- message_text += part.text
1692
-
1693
- if message_text and session_id and user_id:
1694
- from .dependencies import SessionLocal, get_session_business_service
1695
- from ...gateway.http_sse.shared.enums import SenderType
1696
-
1697
- # For background processing, create simple session wrapper
1698
- if SessionLocal:
1699
- db = SessionLocal()
1700
- try:
1701
- session_service = get_session_business_service()
1702
- session_service.add_message_to_session(
1703
- db=db,
1704
- session_id=session_id,
1705
- user_id=user_id,
1706
- message=message_text,
1707
- sender_type=SenderType.AGENT,
1708
- sender_name=agent_name,
1709
- agent_id=agent_name,
1710
- )
1711
- db.commit()
1712
- except Exception:
1713
- db.rollback()
1714
- raise
1715
- finally:
1716
- db.close()
1717
- log.info(
1718
- "%s Final agent response stored in session %s",
1719
- log_id_prefix,
1720
- session_id,
1721
- )
1722
- except Exception as storage_error:
1723
- log.warning(
1724
- "%s Failed to store final agent response: %s",
1725
- log_id_prefix,
1726
- storage_error,
1727
- )
1728
-
1729
2040
  except Exception as e:
1730
2041
  log.exception(
1731
2042
  "%s Failed to send final_response via SSE for A2A Task ID %s: %s",
@@ -1,11 +1,13 @@
1
1
  # DEVELOPER GUIDE: components
2
2
 
3
3
  ## Quick Summary
4
- This directory contains components for the HTTP SSE (Server-Sent Events) gateway, designed to work within the Solace AI Connector (SAC) framework. The primary component forwards messages received from the Solace broker to an internal queue, enabling real-time visualization in a web-based user interface.
4
+ This directory contains SAC (Solace AI Connector) components for the HTTP SSE (Server-Sent Events) gateway. These components forward messages from Solace broker inputs to internal Python queues, enabling real-time visualization and task logging in web-based user interfaces.
5
5
 
6
6
  ## Files Overview
7
- - `__init__.py` - Makes the `VisualizationForwarderComponent` class directly importable from the `components` package
8
- - `visualization_forwarder_component.py` - Defines a SAC component that forwards messages from a broker input to a Python `queue.Queue` for visualization
7
+ - `__init__.py` - Makes the `VisualizationForwarderComponent` class directly importable from the components package
8
+ - `components_llm.txt` - Developer guide documentation for this directory
9
+ - `task_logger_forwarder.py` - SAC component that forwards messages to a task logging queue
10
+ - `visualization_forwarder_component.py` - SAC component that forwards messages to a visualization queue
9
11
 
10
12
  ## Developer API Reference
11
13
 
@@ -16,12 +18,50 @@ This directory contains components for the HTTP SSE (Server-Sent Events) gateway
16
18
  **Exports:**
17
19
  - `VisualizationForwarderComponent` - The main component class for forwarding messages to a visualization queue
18
20
 
21
+ ### task_logger_forwarder.py
22
+ **Purpose:** A SAC component that forwards messages from a BrokerInput to a target queue for task logging
23
+ **Import:** `from solace_agent_mesh.gateway.http_sse.components.task_logger_forwarder import TaskLoggerForwarderComponent`
24
+
25
+ **Classes:**
26
+ - `TaskLoggerForwarderComponent(**kwargs: Any)` - A component that forwards messages to a task logging queue, initialized with configuration parameters including `target_queue_ref`
27
+ - `invoke(message: SolaceMessage, data: Dict[str, Any]) -> None` - Core method called by SAC framework for each incoming message; formats data and places it onto the target queue
28
+ - `target_queue: queue.Queue` - The queue instance where messages are forwarded
29
+
30
+ **Constants/Variables:**
31
+ - `info: Dict` - Metadata dictionary required by SAC framework describing component configuration, input schema, and purpose
32
+
33
+ **Usage Examples:**
34
+ ```python
35
+ import queue
36
+ from solace_agent_mesh.gateway.http_sse.components.task_logger_forwarder import TaskLoggerForwarderComponent
37
+ from solace_ai_connector.common.message import Message as SolaceMessage
38
+
39
+ # 1. Create a target queue for task logging
40
+ task_logging_queue = queue.Queue()
41
+
42
+ # 2. Instantiate the component with target queue reference
43
+ task_forwarder = TaskLoggerForwarderComponent(
44
+ name="task_logger",
45
+ target_queue_ref=task_logging_queue
46
+ )
47
+
48
+ # 3. The invoke method is called automatically by SAC framework
49
+ # when messages arrive from connected BrokerInput component
50
+
51
+ # 4. Consume forwarded messages from the queue
52
+ if not task_logging_queue.empty():
53
+ forwarded_data = task_logging_queue.get()
54
+ print(f"Task Topic: {forwarded_data['topic']}")
55
+ print(f"Task Payload: {forwarded_data['payload']}")
56
+ print(f"User Properties: {forwarded_data['user_properties']}")
57
+ ```
58
+
19
59
  ### visualization_forwarder_component.py
20
- **Purpose:** A Solace AI Connector (SAC) component that listens for messages from a `BrokerInput` and forwards them to a specified Python `queue.Queue` for real-time visualization
60
+ **Purpose:** A SAC component that forwards messages from a BrokerInput to a target queue for visualization
21
61
  **Import:** `from solace_agent_mesh.gateway.http_sse.components.visualization_forwarder_component import VisualizationForwarderComponent`
22
62
 
23
63
  **Classes:**
24
- - `VisualizationForwarderComponent(**kwargs: Any)` - A component that forwards messages to a target queue, initialized with configuration parameters including `target_queue_ref`
64
+ - `VisualizationForwarderComponent(**kwargs: Any)` - A component that forwards messages to a visualization queue, initialized with configuration parameters including `target_queue_ref`
25
65
  - `invoke(message: SolaceMessage, data: Dict[str, Any]) -> None` - Core method called by SAC framework for each incoming message; formats data and places it onto the target queue
26
66
  - `target_queue: queue.Queue` - The queue instance where messages are forwarded
27
67
 
@@ -62,4 +102,4 @@ if not visualization_queue.empty():
62
102
  # }
63
103
  ```
64
104
 
65
- # content_hash: cee7f7b4ea7e87ab3f94f7e24d463f22fa045e50d54991c61b84fe95e8a7f77d
105
+ # content_hash: 6add2167cb9fdee9ed3e46635d6b4e9391cf062dde9e14dba250a3f33c6c4f73