solace-agent-mesh 1.5.0__py3-none-any.whl → 1.6.0__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 (326) hide show
  1. solace_agent_mesh/agent/adk/callbacks.py +14 -17
  2. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -1
  3. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +2 -1
  4. solace_agent_mesh/agent/adk/mcp_content_processor.py +2 -1
  5. solace_agent_mesh/agent/adk/models/lite_llm.py +123 -8
  6. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +245 -0
  7. solace_agent_mesh/agent/adk/runner.py +3 -1
  8. solace_agent_mesh/agent/adk/services.py +4 -1
  9. solace_agent_mesh/agent/adk/setup.py +3 -1
  10. solace_agent_mesh/agent/adk/tool_wrapper.py +2 -2
  11. solace_agent_mesh/agent/protocol/event_handlers.py +42 -2
  12. solace_agent_mesh/agent/proxies/__init__.py +0 -0
  13. solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
  14. solace_agent_mesh/agent/proxies/a2a/app.py +55 -0
  15. solace_agent_mesh/agent/proxies/a2a/component.py +1115 -0
  16. solace_agent_mesh/agent/proxies/a2a/config.py +140 -0
  17. solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
  18. solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
  19. solace_agent_mesh/agent/proxies/base/app.py +99 -0
  20. solace_agent_mesh/agent/proxies/base/component.py +619 -0
  21. solace_agent_mesh/agent/proxies/base/config.py +85 -0
  22. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +17 -0
  23. solace_agent_mesh/agent/sac/app.py +12 -4
  24. solace_agent_mesh/agent/sac/component.py +164 -9
  25. solace_agent_mesh/agent/tools/audio_tools.py +127 -9
  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/web_tools.py +12 -6
  35. solace_agent_mesh/agent/utils/artifact_helpers.py +144 -4
  36. solace_agent_mesh/agent/utils/config_parser.py +3 -1
  37. solace_agent_mesh/assets/docs/404.html +3 -3
  38. solace_agent_mesh/assets/docs/assets/js/{b7006a3a.73a79653.js → 032c2d61.f3d37824.js} +1 -1
  39. solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
  40. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +1 -0
  41. solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
  42. solace_agent_mesh/assets/docs/assets/js/{2334.622a6395.js → 2334.1cf50a20.js} +1 -1
  43. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
  45. solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/{3624.b524e433.js → 3624.0eaa1fd0.js} +1 -1
  47. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/509e993c.4c7a1a6d.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js → 8591.5d015485.js} +2 -2
  68. solace_agent_mesh/assets/docs/assets/js/{8731.49e930c2.js → 8731.6c1dbf0c.js} +1 -1
  69. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/e3d9abda.2b916f9e.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/main.20feee82.js +2 -0
  91. solace_agent_mesh/assets/docs/assets/js/runtime~main.0d198646.js +1 -0
  92. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
  93. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/artifact-management/index.html +7 -7
  94. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/audio-tools/index.html +7 -7
  95. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/data-analysis-tools/index.html +8 -8
  96. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/embeds/index.html +6 -6
  97. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → components}/builtin-tools/index.html +11 -11
  98. solace_agent_mesh/assets/docs/docs/documentation/{concepts → components}/cli/index.html +25 -25
  99. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +91 -0
  100. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
  101. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
  102. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
  103. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +262 -0
  104. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +104 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +85 -0
  106. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
  107. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +59 -0
  108. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-agents/index.html +113 -152
  109. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/create-gateways/index.html +10 -10
  110. solace_agent_mesh/assets/docs/docs/documentation/{user-guide → developing}/creating-python-tools/index.html +12 -12
  111. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
  112. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -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 +12 -12
  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/installing-and-configuring/configurations/index.html +81 -0
  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 +160 -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-1761165361160.json +1 -0
  141. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  142. solace_agent_mesh/assets/docs/search-doc-1761165361160.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/cli/commands/add_cmd/agent_cmd.py +2 -69
  147. solace_agent_mesh/cli/commands/eval_cmd.py +11 -49
  148. solace_agent_mesh/cli/commands/init_cmd/__init__.py +0 -5
  149. solace_agent_mesh/cli/commands/init_cmd/env_step.py +10 -12
  150. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +9 -61
  151. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +9 -49
  152. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +1 -2
  153. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-DwrxZE0E.js → authCallback-BTf6dqwp.js} +1 -1
  154. solace_agent_mesh/client/webui/frontend/static/assets/{client-DarGQzyw.js → client-CaY59VuC.js} +1 -1
  155. solace_agent_mesh/client/webui/frontend/static/assets/main-BGTaW0uv.js +342 -0
  156. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +1 -0
  157. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BKIeiHj_.js → vendor-BEmvJSYz.js} +1 -1
  158. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  159. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  160. solace_agent_mesh/common/a2a/__init__.py +24 -0
  161. solace_agent_mesh/common/a2a/artifact.py +41 -1
  162. solace_agent_mesh/common/a2a/events.py +29 -0
  163. solace_agent_mesh/common/a2a/message.py +68 -0
  164. solace_agent_mesh/common/a2a/protocol.py +76 -3
  165. solace_agent_mesh/common/a2a/translation.py +3 -1
  166. solace_agent_mesh/common/agent_registry.py +83 -3
  167. solace_agent_mesh/common/constants.py +3 -1
  168. solace_agent_mesh/common/middleware/config_resolver.py +3 -1
  169. solace_agent_mesh/common/middleware/registry.py +3 -1
  170. solace_agent_mesh/common/sac/sam_component_base.py +2 -1
  171. solace_agent_mesh/common/sam_events/event_service.py +3 -2
  172. solace_agent_mesh/common/services/employee_service.py +3 -1
  173. solace_agent_mesh/common/services/identity_service.py +2 -1
  174. solace_agent_mesh/common/services/providers/local_file_identity_service.py +2 -1
  175. solace_agent_mesh/common/utils/artifact_utils.py +3 -1
  176. solace_agent_mesh/common/utils/asyncio_macos_fix.py +3 -1
  177. solace_agent_mesh/common/utils/embeds/converter.py +3 -1
  178. solace_agent_mesh/common/utils/embeds/evaluators.py +2 -1
  179. solace_agent_mesh/common/utils/embeds/modifiers.py +3 -2
  180. solace_agent_mesh/common/utils/embeds/resolver.py +2 -1
  181. solace_agent_mesh/common/utils/initializer.py +3 -1
  182. solace_agent_mesh/common/utils/message_utils.py +2 -1
  183. solace_agent_mesh/common/utils/push_notification_auth.py +3 -2
  184. solace_agent_mesh/common/utils/pydantic_utils.py +12 -0
  185. solace_agent_mesh/config_portal/backend/common.py +1 -1
  186. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +98 -0
  187. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-44d62be6.js → manifest-61038fc6.js} +1 -1
  188. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  189. solace_agent_mesh/core_a2a/service.py +2 -2
  190. solace_agent_mesh/evaluation/evaluator.py +128 -104
  191. solace_agent_mesh/evaluation/message_organizer.py +116 -110
  192. solace_agent_mesh/evaluation/report_data_processor.py +84 -86
  193. solace_agent_mesh/evaluation/report_generator.py +73 -79
  194. solace_agent_mesh/evaluation/run.py +421 -235
  195. solace_agent_mesh/evaluation/shared/__init__.py +92 -0
  196. solace_agent_mesh/evaluation/shared/constants.py +47 -0
  197. solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
  198. solace_agent_mesh/evaluation/shared/helpers.py +35 -0
  199. solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
  200. solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
  201. solace_agent_mesh/evaluation/subscriber.py +111 -232
  202. solace_agent_mesh/evaluation/summary_builder.py +227 -117
  203. solace_agent_mesh/gateway/base/app.py +3 -2
  204. solace_agent_mesh/gateway/base/component.py +11 -2
  205. solace_agent_mesh/gateway/base/task_context.py +2 -1
  206. solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
  207. solace_agent_mesh/gateway/http_sse/app.py +2 -1
  208. solace_agent_mesh/gateway/http_sse/component.py +102 -3
  209. solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +3 -2
  210. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +3 -1
  211. solace_agent_mesh/gateway/http_sse/dependencies.py +7 -5
  212. solace_agent_mesh/gateway/http_sse/main.py +5 -2
  213. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +12 -13
  214. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +15 -18
  215. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +25 -18
  216. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +30 -26
  217. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +35 -44
  218. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +7 -5
  219. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +97 -205
  220. solace_agent_mesh/gateway/http_sse/routers/auth.py +3 -1
  221. solace_agent_mesh/gateway/http_sse/routers/config.py +3 -2
  222. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +4 -3
  223. solace_agent_mesh/gateway/http_sse/routers/people.py +3 -1
  224. solace_agent_mesh/gateway/http_sse/routers/sessions.py +5 -3
  225. solace_agent_mesh/gateway/http_sse/routers/sse.py +3 -2
  226. solace_agent_mesh/gateway/http_sse/routers/tasks.py +35 -42
  227. solace_agent_mesh/gateway/http_sse/routers/users.py +3 -1
  228. solace_agent_mesh/gateway/http_sse/routers/visualization.py +19 -12
  229. solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +3 -1
  230. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +6 -5
  231. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +53 -44
  232. solace_agent_mesh/gateway/http_sse/services/people_service.py +2 -2
  233. solace_agent_mesh/gateway/http_sse/services/session_service.py +23 -21
  234. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +10 -9
  235. solace_agent_mesh/gateway/http_sse/services/task_service.py +3 -2
  236. solace_agent_mesh/gateway/http_sse/session_manager.py +2 -1
  237. solace_agent_mesh/gateway/http_sse/shared/base_repository.py +45 -71
  238. solace_agent_mesh/gateway/http_sse/shared/types.py +0 -18
  239. solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +2 -1
  240. solace_agent_mesh/gateway/http_sse/sse_manager.py +2 -2
  241. solace_agent_mesh/templates/gateway_app_template.py +4 -2
  242. solace_agent_mesh/templates/gateway_component_template.py +3 -1
  243. solace_agent_mesh/templates/gateway_config_template.yaml +0 -5
  244. solace_agent_mesh/templates/logging_config_template.ini +27 -46
  245. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +0 -3
  246. solace_agent_mesh/templates/plugin_tools_template.py +2 -2
  247. solace_agent_mesh/templates/shared_config.yaml +40 -0
  248. {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/METADATA +47 -21
  249. {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/RECORD +254 -225
  250. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  251. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  252. solace_agent_mesh/assets/docs/assets/js/04989206.a248f00c.js +0 -1
  253. solace_agent_mesh/assets/docs/assets/js/0e682baa.d54b8668.js +0 -1
  254. solace_agent_mesh/assets/docs/assets/js/1023fc19.8a8a9309.js +0 -1
  255. solace_agent_mesh/assets/docs/assets/js/1523c6b4.2645ef68.js +0 -1
  256. solace_agent_mesh/assets/docs/assets/js/166ab619.e27886d9.js +0 -1
  257. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.e056b7e0.js +0 -1
  258. solace_agent_mesh/assets/docs/assets/js/21ceee5f.3bf39250.js +0 -1
  259. solace_agent_mesh/assets/docs/assets/js/2a9cab12.2afaee76.js +0 -1
  260. solace_agent_mesh/assets/docs/assets/js/332e10b5.f7629851.js +0 -1
  261. solace_agent_mesh/assets/docs/assets/js/3d406171.5560fdf9.js +0 -1
  262. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.508ae8db.js +0 -1
  263. solace_agent_mesh/assets/docs/assets/js/442a8107.b5c2532a.js +0 -1
  264. solace_agent_mesh/assets/docs/assets/js/453a82a6.3c6bb61d.js +0 -1
  265. solace_agent_mesh/assets/docs/assets/js/483cef9a.bf9398af.js +0 -1
  266. solace_agent_mesh/assets/docs/assets/js/4c2787c2.c1290a40.js +0 -1
  267. solace_agent_mesh/assets/docs/assets/js/55f47984.bcd00a86.js +0 -1
  268. solace_agent_mesh/assets/docs/assets/js/5b4258a4.fdfd2325.js +0 -1
  269. solace_agent_mesh/assets/docs/assets/js/664b740a.ba305a89.js +0 -1
  270. solace_agent_mesh/assets/docs/assets/js/75384d09.c19e8b51.js +0 -1
  271. solace_agent_mesh/assets/docs/assets/js/768e31b0.9abcdc48.js +0 -1
  272. solace_agent_mesh/assets/docs/assets/js/85387663.be2bc838.js +0 -1
  273. solace_agent_mesh/assets/docs/assets/js/945fb41e.16e00776.js +0 -1
  274. solace_agent_mesh/assets/docs/assets/js/9a09e75d.92de8cf5.js +0 -1
  275. solace_agent_mesh/assets/docs/assets/js/9eff14a2.d62aad71.js +0 -1
  276. solace_agent_mesh/assets/docs/assets/js/a12a4955.25fbed32.js +0 -1
  277. solace_agent_mesh/assets/docs/assets/js/a3a92b25.af35e313.js +0 -1
  278. solace_agent_mesh/assets/docs/assets/js/aba87c2f.4ddf32f2.js +0 -1
  279. solace_agent_mesh/assets/docs/assets/js/ae0e903d.5fe5203f.js +0 -1
  280. solace_agent_mesh/assets/docs/assets/js/ae4415af.16cc58d3.js +0 -1
  281. solace_agent_mesh/assets/docs/assets/js/bac0be12.17de4316.js +0 -1
  282. solace_agent_mesh/assets/docs/assets/js/c2c06897.87cb1f47.js +0 -1
  283. solace_agent_mesh/assets/docs/assets/js/c835a94d.ce21f0bf.js +0 -1
  284. solace_agent_mesh/assets/docs/assets/js/cc969b05.feef7dcc.js +0 -1
  285. solace_agent_mesh/assets/docs/assets/js/cd3d4052.a19e7d78.js +0 -1
  286. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +0 -1
  287. solace_agent_mesh/assets/docs/assets/js/cee5d587.47904f5e.js +0 -1
  288. solace_agent_mesh/assets/docs/assets/js/d6a81ee7.829198f1.js +0 -1
  289. solace_agent_mesh/assets/docs/assets/js/f284c35a.ed8dd236.js +0 -1
  290. solace_agent_mesh/assets/docs/assets/js/f897a61a.126663fe.js +0 -1
  291. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.e144b16c.js +0 -1
  292. solace_agent_mesh/assets/docs/assets/js/main.0c149855.js +0 -2
  293. solace_agent_mesh/assets/docs/assets/js/runtime~main.c66557e4.js +0 -1
  294. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/installation/index.html +0 -46
  295. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/rbac-setup-guilde/index.html +0 -201
  296. solace_agent_mesh/assets/docs/docs/documentation/Enterprise/single-sign-on/index.html +0 -29
  297. 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
  298. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +0 -144
  299. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +0 -91
  300. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +0 -91
  301. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +0 -55
  302. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +0 -111
  303. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +0 -77
  304. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +0 -48
  305. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +0 -54
  306. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +0 -45
  307. solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/index.html +0 -74
  308. solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/litellm_models/index.html +0 -49
  309. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +0 -76
  310. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +0 -73
  311. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +0 -72
  312. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +0 -54
  313. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +0 -69
  314. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +0 -59
  315. solace_agent_mesh/assets/docs/lunr-index-1760032255022.json +0 -1
  316. solace_agent_mesh/assets/docs/search-doc-1760032255022.json +0 -1
  317. solace_agent_mesh/client/webui/frontend/static/assets/main-CZbpmwfA.css +0 -1
  318. solace_agent_mesh/client/webui/frontend/static/assets/main-C__uuUkB.js +0 -339
  319. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-BNuqpWDc.js +0 -98
  320. solace_agent_mesh/evaluation/config_loader.py +0 -657
  321. solace_agent_mesh/evaluation/test_case_loader.py +0 -714
  322. /solace_agent_mesh/assets/docs/assets/js/{8591.d7c16be6.js.LICENSE.txt → 8591.5d015485.js.LICENSE.txt} +0 -0
  323. /solace_agent_mesh/assets/docs/assets/js/{main.0c149855.js.LICENSE.txt → main.20feee82.js.LICENSE.txt} +0 -0
  324. {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/WHEEL +0 -0
  325. {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/entry_points.txt +0 -0
  326. {solace_agent_mesh-1.5.0.dist-info → solace_agent_mesh-1.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -4,8 +4,10 @@ Repository interfaces defining contracts for data access.
4
4
 
5
5
  from abc import ABC, abstractmethod
6
6
  from typing import TYPE_CHECKING, Optional
7
+ from sqlalchemy.orm import Session as DBSession
7
8
 
8
- from ..shared.types import PaginationInfo, PaginationParams, SessionId, UserId
9
+ from ..shared.pagination import PaginationParams
10
+ from ..shared.types import SessionId, UserId
9
11
  from .entities import Feedback, Session, Task, TaskEvent
10
12
 
11
13
  if TYPE_CHECKING:
@@ -14,33 +16,33 @@ if TYPE_CHECKING:
14
16
 
15
17
  class ISessionRepository(ABC):
16
18
  """Interface for session data access operations."""
17
-
19
+
18
20
  @abstractmethod
19
21
  def find_by_user(
20
- self, user_id: UserId, pagination: PaginationParams | None = None
22
+ self, session: DBSession, user_id: UserId, pagination: PaginationParams | None = None
21
23
  ) -> list[Session]:
22
24
  """Find all sessions for a specific user."""
23
25
  pass
24
26
 
25
27
  @abstractmethod
26
- def count_by_user(self, user_id: UserId) -> int:
28
+ def count_by_user(self, session: DBSession, user_id: UserId) -> int:
27
29
  """Count total sessions for a specific user."""
28
30
  pass
29
31
 
30
32
  @abstractmethod
31
33
  def find_user_session(
32
- self, session_id: SessionId, user_id: UserId
34
+ self, session: DBSession, session_id: SessionId, user_id: UserId
33
35
  ) -> Session | None:
34
36
  """Find a specific session belonging to a user."""
35
37
  pass
36
38
 
37
39
  @abstractmethod
38
- def save(self, session: Session) -> Session:
40
+ def save(self, session: DBSession, session_obj: Session) -> Session:
39
41
  """Save or update a session."""
40
42
  pass
41
43
 
42
44
  @abstractmethod
43
- def delete(self, session_id: SessionId, user_id: UserId) -> bool:
45
+ def delete(self, session: DBSession, session_id: SessionId, user_id: UserId) -> bool:
44
46
  """Delete a session belonging to a user."""
45
47
  pass
46
48
 
@@ -49,28 +51,31 @@ class ITaskRepository(ABC):
49
51
  """Interface for task data access operations."""
50
52
 
51
53
  @abstractmethod
52
- def save_task(self, task: Task) -> Task:
54
+ def save_task(self, session: DBSession, task: Task) -> Task:
53
55
  """Create or update a task."""
54
56
  pass
55
57
 
56
58
  @abstractmethod
57
- def save_event(self, event: TaskEvent) -> TaskEvent:
59
+ def save_event(self, session: DBSession, event: TaskEvent) -> TaskEvent:
58
60
  """Save a task event."""
59
61
  pass
60
62
 
61
63
  @abstractmethod
62
- def find_by_id(self, task_id: str) -> Task | None:
64
+ def find_by_id(self, session: DBSession, task_id: str) -> Task | None:
63
65
  """Find a task by its ID."""
64
66
  pass
65
67
 
66
68
  @abstractmethod
67
- def find_by_id_with_events(self, task_id: str) -> tuple[Task, list[TaskEvent]] | None:
69
+ def find_by_id_with_events(
70
+ self, session: DBSession, task_id: str
71
+ ) -> tuple[Task, list[TaskEvent]] | None:
68
72
  """Find a task with all its events."""
69
73
  pass
70
74
 
71
75
  @abstractmethod
72
76
  def search(
73
77
  self,
78
+ session: DBSession,
74
79
  user_id: UserId,
75
80
  start_date: int | None = None,
76
81
  end_date: int | None = None,
@@ -81,7 +86,7 @@ class ITaskRepository(ABC):
81
86
  pass
82
87
 
83
88
  @abstractmethod
84
- def delete_tasks_older_than(self, cutoff_time_ms: int, batch_size: int) -> int:
89
+ def delete_tasks_older_than(self, session: DBSession, cutoff_time_ms: int, batch_size: int) -> int:
85
90
  """Delete tasks older than cutoff time using batch deletion."""
86
91
  pass
87
92
 
@@ -90,12 +95,12 @@ class IFeedbackRepository(ABC):
90
95
  """Interface for feedback data access operations."""
91
96
 
92
97
  @abstractmethod
93
- def save(self, feedback: Feedback) -> Feedback:
98
+ def save(self, session: DBSession, feedback: Feedback) -> Feedback:
94
99
  """Save feedback."""
95
100
  pass
96
101
 
97
102
  @abstractmethod
98
- def delete_feedback_older_than(self, cutoff_time_ms: int, batch_size: int) -> int:
103
+ def delete_feedback_older_than(self, session: DBSession, cutoff_time_ms: int, batch_size: int) -> int:
99
104
  """Delete feedback older than cutoff time using batch deletion."""
100
105
  pass
101
106
 
@@ -104,21 +109,23 @@ class IChatTaskRepository(ABC):
104
109
  """Interface for chat task data access operations."""
105
110
 
106
111
  @abstractmethod
107
- def save(self, task: "ChatTask") -> "ChatTask":
112
+ def save(self, session: DBSession, task: "ChatTask") -> "ChatTask":
108
113
  """Save or update a chat task (upsert)."""
109
114
  pass
110
115
 
111
116
  @abstractmethod
112
- def find_by_session(self, session_id: SessionId, user_id: UserId) -> list["ChatTask"]:
117
+ def find_by_session(
118
+ self, session: DBSession, session_id: SessionId, user_id: UserId
119
+ ) -> list["ChatTask"]:
113
120
  """Find all tasks for a session."""
114
121
  pass
115
122
 
116
123
  @abstractmethod
117
- def find_by_id(self, task_id: str, user_id: UserId) -> Optional["ChatTask"]:
124
+ def find_by_id(self, session: DBSession, task_id: str, user_id: UserId) -> Optional["ChatTask"]:
118
125
  """Find a specific task."""
119
126
  pass
120
127
 
121
128
  @abstractmethod
122
- def delete_by_session(self, session_id: SessionId) -> bool:
129
+ def delete_by_session(self, session: DBSession, session_id: SessionId) -> bool:
123
130
  """Delete all tasks for a session."""
124
131
  pass
@@ -6,22 +6,17 @@ from sqlalchemy.orm import Session as DBSession
6
6
 
7
7
  from ..shared.base_repository import PaginatedRepository
8
8
  from ..shared.pagination import PaginationParams
9
- from ..shared.types import PaginationInfo, SessionId, UserId
9
+ from ..shared.types import SessionId, UserId
10
10
  from .entities import Session
11
11
  from .interfaces import ISessionRepository
12
- from .models import (
13
- SessionModel,
14
- CreateSessionModel,
15
- UpdateSessionModel,
16
- )
12
+ from .models import CreateSessionModel, SessionModel, UpdateSessionModel
17
13
 
18
14
 
19
15
  class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepository):
20
16
  """SQLAlchemy implementation of session repository using BaseRepository."""
21
17
 
22
- def __init__(self, db: DBSession):
18
+ def __init__(self):
23
19
  super().__init__(SessionModel, Session)
24
- self.db = db
25
20
 
26
21
  @property
27
22
  def entity_name(self) -> str:
@@ -29,29 +24,30 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
29
24
  return "session"
30
25
 
31
26
  def find_by_user(
32
- self, user_id: UserId, pagination: PaginationParams | None = None
27
+ self, session: DBSession, user_id: UserId, pagination: PaginationParams | None = None
33
28
  ) -> list[Session]:
34
29
  """Find all sessions for a specific user."""
35
- query = self.db.query(SessionModel).filter(SessionModel.user_id == user_id)
30
+ query = session.query(SessionModel).filter(SessionModel.user_id == user_id)
36
31
  query = query.order_by(SessionModel.updated_time.desc())
37
32
 
38
33
  if pagination:
39
- offset = (pagination.page_number - 1) * pagination.page_size
40
- query = query.offset(offset).limit(pagination.page_size)
34
+ query = query.offset(pagination.offset).limit(pagination.page_size)
41
35
 
42
36
  models = query.all()
43
37
  return [Session.model_validate(model) for model in models]
44
38
 
45
- def count_by_user(self, user_id: UserId) -> int:
39
+ def count_by_user(self, session: DBSession, user_id: UserId) -> int:
46
40
  """Count total sessions for a specific user."""
47
- return self.db.query(SessionModel).filter(SessionModel.user_id == user_id).count()
41
+ return (
42
+ session.query(SessionModel).filter(SessionModel.user_id == user_id).count()
43
+ )
48
44
 
49
45
  def find_user_session(
50
- self, session_id: SessionId, user_id: UserId
46
+ self, session: DBSession, session_id: SessionId, user_id: UserId
51
47
  ) -> Session | None:
52
48
  """Find a specific session belonging to a user."""
53
49
  model = (
54
- self.db.query(SessionModel)
50
+ session.query(SessionModel)
55
51
  .filter(
56
52
  SessionModel.id == session_id,
57
53
  SessionModel.user_id == user_id,
@@ -60,9 +56,11 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
60
56
  )
61
57
  return Session.model_validate(model) if model else None
62
58
 
63
- def save(self, session: Session) -> Session:
59
+ def save(self, db_session: DBSession, session: Session) -> Session:
64
60
  """Save or update a session."""
65
- existing_model = self.db.query(SessionModel).filter(SessionModel.id == session.id).first()
61
+ existing_model = (
62
+ db_session.query(SessionModel).filter(SessionModel.id == session.id).first()
63
+ )
66
64
 
67
65
  if existing_model:
68
66
  update_model = UpdateSessionModel(
@@ -70,7 +68,9 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
70
68
  agent_id=session.agent_id,
71
69
  updated_time=session.updated_time,
72
70
  )
73
- return self.update(self.db, session.id, update_model.model_dump(exclude_none=True))
71
+ return self.update(
72
+ db_session, session.id, update_model.model_dump(exclude_none=True)
73
+ )
74
74
  else:
75
75
  create_model = CreateSessionModel(
76
76
  id=session.id,
@@ -80,19 +80,23 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
80
80
  created_time=session.created_time,
81
81
  updated_time=session.updated_time,
82
82
  )
83
- return self.create(self.db, create_model.model_dump())
83
+ return self.create(db_session, create_model.model_dump())
84
84
 
85
- def delete(self, session_id: SessionId, user_id: UserId) -> bool:
85
+ def delete(self, db_session: DBSession, session_id: SessionId, user_id: UserId) -> bool:
86
86
  """Delete a session belonging to a user."""
87
87
  # Check if session belongs to user first
88
- session_model = self.db.query(SessionModel).filter(
89
- SessionModel.id == session_id,
90
- SessionModel.user_id == user_id,
91
- ).first()
88
+ session_model = (
89
+ db_session.query(SessionModel)
90
+ .filter(
91
+ SessionModel.id == session_id,
92
+ SessionModel.user_id == user_id,
93
+ )
94
+ .first()
95
+ )
92
96
 
93
97
  if not session_model:
94
98
  return False
95
99
 
96
100
  # Use BaseRepository delete method
97
- super().delete(self.db, session_id)
101
+ super().delete(db_session, session_id)
98
102
  return True
@@ -4,7 +4,8 @@ Task repository implementation using SQLAlchemy.
4
4
 
5
5
  from sqlalchemy.orm import Session as DBSession
6
6
 
7
- from ..shared.types import PaginationInfo, PaginationParams, UserId
7
+ from ..shared.pagination import PaginationParams
8
+ from ..shared.types import UserId
8
9
  from .entities import Task, TaskEvent
9
10
  from .interfaces import ITaskRepository
10
11
  from .models import TaskEventModel, TaskModel
@@ -13,15 +14,11 @@ from .models import TaskEventModel, TaskModel
13
14
  class TaskRepository(ITaskRepository):
14
15
  """SQLAlchemy implementation of task repository."""
15
16
 
16
- def __init__(self, db: DBSession):
17
- self.db = db
18
-
19
- def save_task(self, task: Task) -> Task:
17
+ def save_task(self, session: DBSession, task: Task) -> Task:
20
18
  """Create or update a task."""
21
- model = self.db.query(TaskModel).filter(TaskModel.id == task.id).first()
19
+ model = session.query(TaskModel).filter(TaskModel.id == task.id).first()
22
20
 
23
21
  if model:
24
- # Update existing
25
22
  model.end_time = task.end_time
26
23
  model.status = task.status
27
24
  model.total_input_tokens = task.total_input_tokens
@@ -29,7 +26,6 @@ class TaskRepository(ITaskRepository):
29
26
  model.total_cached_input_tokens = task.total_cached_input_tokens
30
27
  model.token_usage_details = task.token_usage_details
31
28
  else:
32
- # Create new
33
29
  model = TaskModel(
34
30
  id=task.id,
35
31
  user_id=task.user_id,
@@ -42,13 +38,13 @@ class TaskRepository(ITaskRepository):
42
38
  total_cached_input_tokens=task.total_cached_input_tokens,
43
39
  token_usage_details=task.token_usage_details,
44
40
  )
45
- self.db.add(model)
41
+ session.add(model)
46
42
 
47
- self.db.commit()
48
- self.db.refresh(model)
43
+ session.flush()
44
+ session.refresh(model)
49
45
  return self._task_model_to_entity(model)
50
46
 
51
- def save_event(self, event: TaskEvent) -> TaskEvent:
47
+ def save_event(self, session: DBSession, event: TaskEvent) -> TaskEvent:
52
48
  """Save a task event."""
53
49
  model = TaskEventModel(
54
50
  id=event.id,
@@ -59,26 +55,26 @@ class TaskRepository(ITaskRepository):
59
55
  direction=event.direction,
60
56
  payload=event.payload,
61
57
  )
62
- self.db.add(model)
63
- self.db.commit()
64
- self.db.refresh(model)
58
+ session.add(model)
59
+ session.flush()
60
+ session.refresh(model)
65
61
  return self._event_model_to_entity(model)
66
62
 
67
- def find_by_id(self, task_id: str) -> Task | None:
63
+ def find_by_id(self, session: DBSession, task_id: str) -> Task | None:
68
64
  """Find a task by its ID."""
69
- model = self.db.query(TaskModel).filter(TaskModel.id == task_id).first()
65
+ model = session.query(TaskModel).filter(TaskModel.id == task_id).first()
70
66
  return self._task_model_to_entity(model) if model else None
71
67
 
72
68
  def find_by_id_with_events(
73
- self, task_id: str
69
+ self, session: DBSession, task_id: str
74
70
  ) -> tuple[Task, list[TaskEvent]] | None:
75
71
  """Find a task with all its events."""
76
- task_model = self.db.query(TaskModel).filter(TaskModel.id == task_id).first()
72
+ task_model = session.query(TaskModel).filter(TaskModel.id == task_id).first()
77
73
  if not task_model:
78
74
  return None
79
75
 
80
76
  event_models = (
81
- self.db.query(TaskEventModel)
77
+ session.query(TaskEventModel)
82
78
  .filter(TaskEventModel.task_id == task_id)
83
79
  .order_by(TaskEventModel.created_time.asc())
84
80
  .all()
@@ -90,36 +86,31 @@ class TaskRepository(ITaskRepository):
90
86
 
91
87
  def search(
92
88
  self,
89
+ session: DBSession,
93
90
  user_id: UserId,
94
91
  start_date: int | None = None,
95
92
  end_date: int | None = None,
96
- search_query: str | None = None,
97
93
  pagination: PaginationParams | None = None,
98
94
  ) -> list[Task]:
99
95
  """Search for tasks with filters."""
100
- query = self.db.query(TaskModel)
101
- if user_id != "*": # Allow wildcard for admin/system searches
96
+ query = session.query(TaskModel)
97
+ if user_id != "*":
102
98
  query = query.filter(TaskModel.user_id == user_id)
103
99
 
104
100
  if start_date:
105
101
  query = query.filter(TaskModel.start_time >= start_date)
106
102
  if end_date:
107
103
  query = query.filter(TaskModel.start_time <= end_date)
108
- if search_query:
109
- query = query.filter(
110
- TaskModel.initial_request_text.ilike(f"%{search_query}%")
111
- )
112
104
 
113
105
  query = query.order_by(TaskModel.start_time.desc())
114
106
 
115
107
  if pagination:
116
- offset = (pagination.page - 1) * pagination.page_size
117
- query = query.offset(offset).limit(pagination.page_size)
108
+ query = query.offset(pagination.offset).limit(pagination.page_size)
118
109
 
119
110
  models = query.all()
120
111
  return [self._task_model_to_entity(model) for model in models]
121
112
 
122
- def delete_tasks_older_than(self, cutoff_time_ms: int, batch_size: int) -> int:
113
+ def delete_tasks_older_than(self, session: DBSession, cutoff_time_ms: int, batch_size: int) -> int:
123
114
  """
124
115
  Delete tasks (and their events via cascade) older than the cutoff time.
125
116
  Uses batch deletion to avoid long-running transactions.
@@ -130,38 +121,38 @@ class TaskRepository(ITaskRepository):
130
121
 
131
122
  Returns:
132
123
  Total number of tasks deleted
124
+
125
+ Note:
126
+ This method commits each batch internally due to the nature of batch processing.
127
+ Each batch is an atomic operation to prevent long-running transactions.
133
128
  """
134
129
  total_deleted = 0
135
-
130
+
136
131
  while True:
137
- # Find a batch of task IDs to delete
138
132
  task_ids_to_delete = (
139
- self.db.query(TaskModel.id)
133
+ session.query(TaskModel.id)
140
134
  .filter(TaskModel.start_time < cutoff_time_ms)
141
135
  .limit(batch_size)
142
136
  .all()
143
137
  )
144
-
138
+
145
139
  if not task_ids_to_delete:
146
140
  break
147
-
148
- # Extract IDs from the result tuples
141
+
149
142
  ids = [task_id[0] for task_id in task_ids_to_delete]
150
-
151
- # Delete this batch
143
+
152
144
  deleted_count = (
153
- self.db.query(TaskModel)
145
+ session.query(TaskModel)
154
146
  .filter(TaskModel.id.in_(ids))
155
147
  .delete(synchronize_session=False)
156
148
  )
157
-
158
- self.db.commit()
149
+
150
+ session.commit()
159
151
  total_deleted += deleted_count
160
-
161
- # If we deleted fewer than batch_size, we're done
152
+
162
153
  if deleted_count < batch_size:
163
154
  break
164
-
155
+
165
156
  return total_deleted
166
157
 
167
158
  def _task_model_to_entity(self, model: TaskModel) -> Task:
@@ -1,15 +1,17 @@
1
1
  """
2
- API Router for agent discovery.
2
+ API Router for agent discovery and management.
3
3
  """
4
4
 
5
+ import logging
5
6
  from fastapi import APIRouter, Depends, HTTPException, status
6
- from typing import List
7
-
8
- from solace_ai_connector.common.log import log
7
+ from typing import Dict, List
9
8
 
10
9
  from ....common.agent_registry import AgentRegistry
11
10
  from a2a.types import AgentCard
12
- from ..dependencies import get_agent_registry
11
+ from ..dependencies import get_agent_registry, get_sac_component
12
+ from ..component import WebUIBackendComponent
13
+
14
+ log = logging.getLogger(__name__)
13
15
 
14
16
  router = APIRouter()
15
17