solace-agent-mesh 1.7.1__py3-none-any.whl → 1.13.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (447) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +164 -0
  7. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  8. solace_agent_mesh/agent/adk/callbacks.py +752 -127
  9. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
  10. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  11. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  12. solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
  13. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  14. solace_agent_mesh/agent/adk/runner.py +66 -8
  15. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  16. solace_agent_mesh/agent/adk/services.py +41 -1
  17. solace_agent_mesh/agent/adk/setup.py +220 -32
  18. solace_agent_mesh/agent/adk/stream_parser.py +229 -40
  19. solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
  20. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  21. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  22. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  23. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  24. solace_agent_mesh/agent/sac/app.py +37 -12
  25. solace_agent_mesh/agent/sac/component.py +322 -52
  26. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  27. solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
  28. solace_agent_mesh/agent/tools/__init__.py +3 -0
  29. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  30. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +698 -24
  31. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  32. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  33. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  34. solace_agent_mesh/agent/tools/tool_config_types.py +54 -2
  35. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +243 -5
  38. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  39. solace_agent_mesh/assets/docs/404.html +6 -6
  40. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  41. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  42. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  43. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  44. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  45. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  46. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  47. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  56. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  87. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  88. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  89. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  90. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  91. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  92. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +75 -75
  93. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  94. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  95. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  96. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  97. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  98. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  99. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  100. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  101. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  102. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +98 -112
  103. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  104. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  105. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  106. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -28
  107. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
  108. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  109. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  110. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +67 -53
  112. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
  113. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  114. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  115. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +87 -87
  116. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  117. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  118. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  119. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  120. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  121. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  122. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  123. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  124. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  125. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  126. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  127. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  128. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  129. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  130. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +50 -23
  132. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
  133. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
  134. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  135. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +96 -66
  137. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
  138. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
  139. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
  140. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  141. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +135 -114
  146. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
  147. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  148. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  149. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  150. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  151. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +112 -112
  152. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
  153. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  154. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  155. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  156. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  157. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  158. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  159. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  160. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  161. solace_agent_mesh/cli/__init__.py +1 -1
  162. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  163. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  164. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  165. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  166. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  167. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  168. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  169. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  170. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  171. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  172. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  173. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  174. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  175. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  176. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  177. solace_agent_mesh/cli/main.py +15 -0
  178. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-tcIFZLis.js → authCallback-KnKMP_vb.js} +1 -1
  179. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  180. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  181. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  182. solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
  183. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  184. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  185. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  186. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  187. solace_agent_mesh/common/a2a/types.py +1 -1
  188. solace_agent_mesh/common/agent_registry.py +38 -11
  189. solace_agent_mesh/common/data_parts.py +124 -0
  190. solace_agent_mesh/common/error_handlers.py +83 -0
  191. solace_agent_mesh/common/exceptions.py +24 -0
  192. solace_agent_mesh/common/oauth/__init__.py +17 -0
  193. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  194. solace_agent_mesh/common/oauth/utils.py +50 -0
  195. solace_agent_mesh/common/rag_dto.py +156 -0
  196. solace_agent_mesh/common/sac/sam_component_base.py +73 -1
  197. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  198. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  199. solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
  200. solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
  201. solace_agent_mesh/common/utils/embeds/types.py +1 -0
  202. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  203. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  204. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  205. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  206. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  207. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  208. solace_agent_mesh/config_portal/backend/common.py +12 -0
  209. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  210. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  211. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  212. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  213. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  214. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  215. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  216. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  217. solace_agent_mesh/core_a2a/service.py +3 -2
  218. solace_agent_mesh/gateway/adapter/base.py +28 -1
  219. solace_agent_mesh/gateway/adapter/types.py +9 -0
  220. solace_agent_mesh/gateway/base/app.py +10 -0
  221. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  222. solace_agent_mesh/gateway/base/component.py +451 -10
  223. solace_agent_mesh/gateway/generic/component.py +274 -30
  224. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  225. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
  226. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
  227. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  228. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  229. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  230. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  231. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  232. solace_agent_mesh/gateway/http_sse/app.py +23 -6
  233. solace_agent_mesh/gateway/http_sse/component.py +158 -73
  234. solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
  235. solace_agent_mesh/gateway/http_sse/main.py +58 -482
  236. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  237. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
  238. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
  239. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
  240. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  241. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
  242. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
  243. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -0
  244. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  245. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
  246. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  247. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
  248. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
  249. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
  250. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  251. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  252. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +113 -7
  253. solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
  254. solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
  255. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  256. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  257. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
  258. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  259. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +1 -0
  260. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
  261. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  262. solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
  263. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  264. solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
  265. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  266. solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
  267. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  268. solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
  269. solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
  270. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  271. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  272. solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
  273. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  274. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  275. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  276. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  277. solace_agent_mesh/gateway/http_sse/services/project_service.py +539 -12
  278. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  279. solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
  280. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  281. solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
  282. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  283. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  284. solace_agent_mesh/services/__init__.py +0 -0
  285. solace_agent_mesh/services/platform/__init__.py +29 -0
  286. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  287. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  288. solace_agent_mesh/services/platform/alembic.ini +109 -0
  289. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  290. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  291. solace_agent_mesh/services/platform/api/main.py +314 -0
  292. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  293. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  294. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  295. solace_agent_mesh/services/platform/app.py +215 -0
  296. solace_agent_mesh/services/platform/component.py +777 -0
  297. solace_agent_mesh/shared/__init__.py +14 -0
  298. solace_agent_mesh/shared/api/__init__.py +42 -0
  299. solace_agent_mesh/shared/auth/__init__.py +26 -0
  300. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  301. solace_agent_mesh/shared/auth/middleware.py +347 -0
  302. solace_agent_mesh/shared/database/__init__.py +20 -0
  303. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  304. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  305. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  306. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  307. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
  308. solace_agent_mesh/shared/utils/__init__.py +21 -0
  309. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  310. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  311. solace_agent_mesh/templates/platform.yaml +49 -0
  312. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  313. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  314. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  315. solace_agent_mesh/templates/webui.yaml +148 -6
  316. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  317. solace_agent_mesh/tools/web_search/base.py +84 -0
  318. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  319. solace_agent_mesh/tools/web_search/models.py +99 -0
  320. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
  321. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
  322. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  323. solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
  324. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  325. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  326. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
  327. solace_agent_mesh/agent/agent_llm.txt +0 -369
  328. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  329. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  330. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  331. solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
  332. solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
  333. solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
  334. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  335. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  336. solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
  337. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  338. solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
  339. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
  340. solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
  341. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  342. solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
  343. solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
  344. solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
  345. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  346. solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.js +0 -1
  347. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  348. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  349. solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +0 -1
  350. solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
  351. solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
  352. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  353. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
  354. solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
  355. solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
  356. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  357. solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
  358. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  359. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  360. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  361. solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +0 -1
  362. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  363. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  364. solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
  365. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  366. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
  367. solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
  368. solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
  369. solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
  370. solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
  371. solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
  372. solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
  373. solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
  374. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
  375. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
  376. solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
  377. solace_agent_mesh/assets/docs/search-doc-1762283454666.json +0 -1
  378. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  379. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  380. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  381. solace_agent_mesh/client/webui/frontend/static/assets/client-CRYdKo2Q.js +0 -25
  382. solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
  383. solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
  384. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
  385. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  386. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
  387. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  388. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
  389. solace_agent_mesh/common/common_llm.txt +0 -230
  390. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  391. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  392. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  393. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  394. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  395. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  396. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  397. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
  398. solace_agent_mesh/common/services/services_llm.txt +0 -368
  399. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  400. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  401. solace_agent_mesh/common/utils/utils_llm.txt +0 -335
  402. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  403. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  404. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  405. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  406. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  407. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  408. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  409. solace_agent_mesh/gateway/base/base_llm.txt +0 -226
  410. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  411. solace_agent_mesh/gateway/gateway_llm.txt +0 -369
  412. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  413. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
  414. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
  415. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
  416. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  417. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  418. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  419. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
  420. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
  421. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
  422. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
  423. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
  424. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
  425. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
  426. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
  427. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  428. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
  429. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  430. solace_agent_mesh/llm.txt +0 -228
  431. solace_agent_mesh/llm_detail.txt +0 -2835
  432. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  433. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  434. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  435. solace_agent_mesh/templates/templates_llm.txt +0 -147
  436. /solace_agent_mesh/assets/docs/assets/js/{main.f213fe0c.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  437. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  438. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  439. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  440. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  441. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  442. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  443. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  444. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  445. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  446. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  447. {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -5,7 +5,7 @@ Project domain entity.
5
5
  from typing import Optional
6
6
  from pydantic import BaseModel, Field
7
7
 
8
- from ...shared import now_epoch_ms
8
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
9
9
 
10
10
 
11
11
  class Project(BaseModel):
@@ -5,7 +5,7 @@ Project user access domain entity.
5
5
  from typing import Optional
6
6
  from pydantic import BaseModel, Field
7
7
 
8
- from ...shared import now_epoch_ms
8
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
9
9
 
10
10
 
11
11
  class ProjectUser(BaseModel):
@@ -4,8 +4,8 @@ Session domain entity.
4
4
 
5
5
  from pydantic import BaseModel, ConfigDict
6
6
 
7
- from ...shared import now_epoch_ms
8
- from ...shared.types import AgentId, SessionId, UserId
7
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
8
+ from solace_agent_mesh.shared.utils.types import AgentId, SessionId, UserId
9
9
 
10
10
 
11
11
  class Session(BaseModel):
@@ -19,6 +19,7 @@ class Session(BaseModel):
19
19
  agent_id: AgentId | None = None
20
20
  project_id: str | None = None
21
21
  project_name: str | None = None
22
+ has_running_background_task: bool = False # Enriched field, not stored in DB
22
23
  created_time: int
23
24
  updated_time: int | None = None
24
25
  deleted_at: int | None = None
@@ -10,6 +10,7 @@ class Task(BaseModel):
10
10
 
11
11
  id: str
12
12
  user_id: str
13
+ parent_task_id: str | None = None
13
14
  start_time: int
14
15
  end_time: int | None = None
15
16
  status: str | None = None
@@ -20,6 +21,12 @@ class Task(BaseModel):
20
21
  total_output_tokens: int | None = None
21
22
  total_cached_input_tokens: int | None = None
22
23
  token_usage_details: dict | None = None
24
+
25
+ # Background task execution fields
26
+ execution_mode: str | None = "foreground"
27
+ last_activity_time: int | None = None
28
+ background_execution_enabled: bool | None = False
29
+ max_execution_time_ms: int | None = None
23
30
 
24
31
  class Config:
25
32
  from_attributes = True
@@ -4,8 +4,8 @@ Feedback repository implementation using SQLAlchemy.
4
4
 
5
5
  from sqlalchemy.orm import Session as DBSession
6
6
 
7
- from ..shared.pagination import PaginationParams
8
- from ..shared.types import UserId
7
+ from solace_agent_mesh.shared.api.pagination import PaginationParams
8
+ from solace_agent_mesh.shared.utils.types import UserId
9
9
  from .entities import Feedback
10
10
  from .interfaces import IFeedbackRepository
11
11
  from .models import FeedbackModel
@@ -6,8 +6,8 @@ from abc import ABC, abstractmethod
6
6
  from typing import TYPE_CHECKING, Optional
7
7
  from sqlalchemy.orm import Session as DBSession
8
8
 
9
- from ..shared.pagination import PaginationParams
10
- from ..shared.types import SessionId, UserId
9
+ from solace_agent_mesh.shared.api.pagination import PaginationParams
10
+ from solace_agent_mesh.shared.utils.types import SessionId, UserId
11
11
  from .entities import Feedback, Session, Task, TaskEvent
12
12
  from .entities.project import Project
13
13
  from ..routers.dto.requests.project_requests import ProjectFilter
@@ -10,6 +10,7 @@ from .project_user_model import ProjectUserModel, CreateProjectUserModel, Update
10
10
  from .session_model import SessionModel, CreateSessionModel, UpdateSessionModel
11
11
  from .task_event_model import TaskEventModel
12
12
  from .task_model import TaskModel
13
+ from .prompt_model import PromptGroupModel, PromptModel, PromptGroupUserModel
13
14
 
14
15
  __all__ = [
15
16
  "Base",
@@ -26,4 +27,8 @@ __all__ = [
26
27
  "UpdateSessionModel",
27
28
  "TaskEventModel",
28
29
  "TaskModel",
30
+ "FeedbackModel",
31
+ "PromptGroupModel",
32
+ "PromptModel",
33
+ "PromptGroupUserModel",
29
34
  ]
@@ -0,0 +1,159 @@
1
+ """
2
+ Prompt SQLAlchemy models for prompt library feature.
3
+ """
4
+
5
+ from enum import Enum
6
+ from sqlalchemy import BigInteger, Column, String, Text, Integer, Boolean, ForeignKey, UniqueConstraint, Enum as SQLEnum
7
+ from sqlalchemy.orm import relationship
8
+
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
10
+ from .base import Base
11
+
12
+
13
+ class PromptGroupRole(str, Enum):
14
+ """Valid roles for prompt group users."""
15
+ OWNER = "owner"
16
+ EDITOR = "editor"
17
+ VIEWER = "viewer"
18
+
19
+
20
+ class PromptGroupModel(Base):
21
+ """SQLAlchemy model for prompt groups"""
22
+
23
+ __tablename__ = "prompt_groups"
24
+
25
+ # Primary key - String type (not UUID)
26
+ id = Column(String, primary_key=True)
27
+
28
+ # Core fields
29
+ name = Column(String(255), nullable=False, index=True)
30
+ description = Column(Text, nullable=True)
31
+ category = Column(String(100), nullable=True, index=True)
32
+ command = Column(String(50), nullable=True, unique=True, index=True)
33
+
34
+ # Ownership
35
+ user_id = Column(String, nullable=False, index=True)
36
+ author_name = Column(String(255), nullable=True)
37
+
38
+ # Production prompt reference
39
+ production_prompt_id = Column(
40
+ String,
41
+ ForeignKey("prompts.id", ondelete="SET NULL"),
42
+ nullable=True
43
+ )
44
+
45
+ # Sharing (optional - for future enhancement)
46
+ is_shared = Column(Boolean, default=False, nullable=False)
47
+
48
+ # User preferences
49
+ is_pinned = Column(Boolean, default=False, nullable=False, index=True)
50
+
51
+ # Timestamps - BigInteger (epoch milliseconds) to match SAM convention
52
+ created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
53
+ updated_at = Column(
54
+ BigInteger,
55
+ nullable=False,
56
+ default=now_epoch_ms,
57
+ onupdate=now_epoch_ms
58
+ )
59
+
60
+ # Relationships
61
+ prompts = relationship(
62
+ "PromptModel",
63
+ back_populates="group",
64
+ foreign_keys="PromptModel.group_id",
65
+ cascade="all, delete-orphan"
66
+ )
67
+ production_prompt = relationship(
68
+ "PromptModel",
69
+ foreign_keys=[production_prompt_id],
70
+ post_update=True
71
+ )
72
+ prompt_group_users = relationship(
73
+ "PromptGroupUserModel",
74
+ back_populates="prompt_group",
75
+ cascade="all, delete-orphan"
76
+ )
77
+
78
+ def __repr__(self):
79
+ return f"<PromptGroupModel(id={self.id}, name={self.name}, command={self.command})>"
80
+
81
+
82
+ class PromptModel(Base):
83
+ """SQLAlchemy model for individual prompt versions"""
84
+
85
+ __tablename__ = "prompts"
86
+
87
+ # Primary key - String type (not UUID)
88
+ id = Column(String, primary_key=True)
89
+
90
+ # Content
91
+ prompt_text = Column(Text, nullable=False)
92
+
93
+ # Versioned metadata fields (copied from group at version creation time)
94
+ name = Column(String(255), nullable=True)
95
+ description = Column(Text, nullable=True)
96
+ category = Column(String(100), nullable=True)
97
+ command = Column(String(50), nullable=True)
98
+
99
+ # Group relationship
100
+ group_id = Column(
101
+ String,
102
+ ForeignKey("prompt_groups.id", ondelete="CASCADE"),
103
+ nullable=False,
104
+ index=True
105
+ )
106
+
107
+ # Ownership
108
+ user_id = Column(String, nullable=False, index=True)
109
+
110
+ # Versioning
111
+ version = Column(Integer, default=1, nullable=False)
112
+
113
+ # Timestamps - BigInteger (epoch milliseconds)
114
+ created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
115
+ updated_at = Column(
116
+ BigInteger,
117
+ nullable=False,
118
+ default=now_epoch_ms,
119
+ onupdate=now_epoch_ms
120
+ )
121
+
122
+ # Relationships
123
+ group = relationship(
124
+ "PromptGroupModel",
125
+ back_populates="prompts",
126
+ foreign_keys=[group_id]
127
+ )
128
+
129
+ def __repr__(self):
130
+ return f"<PromptModel(id={self.id}, group_id={self.group_id}, version={self.version})>"
131
+
132
+
133
+ class PromptGroupUserModel(Base):
134
+ """
135
+ SQLAlchemy model for prompt group user access.
136
+
137
+ This junction table tracks which users have access to which prompt groups,
138
+ enabling multi-user collaboration on prompts with role-based permissions.
139
+ """
140
+
141
+ __tablename__ = "prompt_group_users"
142
+
143
+ id = Column(String, primary_key=True)
144
+ prompt_group_id = Column(String, ForeignKey("prompt_groups.id", ondelete="CASCADE"), nullable=False)
145
+ user_id = Column(String, nullable=False)
146
+ role = Column(SQLEnum(PromptGroupRole), nullable=False, default=PromptGroupRole.VIEWER)
147
+ added_at = Column(BigInteger, nullable=False) # Epoch timestamp in milliseconds
148
+ added_by_user_id = Column(String, nullable=False) # User who granted access
149
+
150
+ # Ensure a user can only be added once per prompt group
151
+ __table_args__ = (
152
+ UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user'),
153
+ )
154
+
155
+ # Relationships
156
+ prompt_group = relationship("PromptGroupModel", back_populates="prompt_group_users")
157
+
158
+ def __repr__(self):
159
+ return f"<PromptGroupUserModel(id={self.id}, prompt_group_id={self.prompt_group_id}, user_id={self.user_id}, role={self.role})>"
@@ -6,7 +6,7 @@ from sqlalchemy import BigInteger, Column, String, ForeignKey
6
6
  from pydantic import BaseModel
7
7
  from sqlalchemy.orm import relationship
8
8
 
9
- from ...shared import now_epoch_ms
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
10
10
  from .base import Base
11
11
 
12
12
 
@@ -2,7 +2,7 @@
2
2
  Task SQLAlchemy model.
3
3
  """
4
4
 
5
- from sqlalchemy import BigInteger, Column, Integer, JSON, String, Text
5
+ from sqlalchemy import BigInteger, Boolean, Column, Integer, JSON, String, Text
6
6
  from sqlalchemy.orm import relationship
7
7
 
8
8
  from .base import Base
@@ -15,6 +15,7 @@ class TaskModel(Base):
15
15
 
16
16
  id = Column(String, primary_key=True)
17
17
  user_id = Column(String, nullable=False, index=True)
18
+ parent_task_id = Column(String, nullable=True, index=True)
18
19
  start_time = Column(BigInteger, nullable=False)
19
20
  end_time = Column(BigInteger, nullable=True)
20
21
  status = Column(String, nullable=True)
@@ -25,6 +26,12 @@ class TaskModel(Base):
25
26
  total_output_tokens = Column(Integer, nullable=True)
26
27
  total_cached_input_tokens = Column(Integer, nullable=True)
27
28
  token_usage_details = Column(JSON, nullable=True)
29
+
30
+ # Background task execution columns
31
+ execution_mode = Column(String(20), nullable=True, default="foreground", index=True)
32
+ last_activity_time = Column(BigInteger, nullable=True, index=True)
33
+ background_execution_enabled = Column(Boolean, nullable=True, default=False)
34
+ max_execution_time_ms = Column(BigInteger, nullable=True)
28
35
 
29
36
  # Relationship to events
30
37
  events = relationship(
@@ -11,7 +11,7 @@ from .interfaces import IProjectRepository
11
11
  from .models import ProjectModel, ProjectUserModel
12
12
  from .entities.project import Project
13
13
  from ..routers.dto.requests.project_requests import ProjectFilter
14
- from ..shared import now_epoch_ms
14
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
15
15
 
16
16
 
17
17
  class ProjectRepository(IProjectRepository):
@@ -8,7 +8,7 @@ from sqlalchemy.orm import Session as DBSession
8
8
 
9
9
  from .models import ProjectUserModel
10
10
  from .entities.project_user import ProjectUser
11
- from ..shared import now_epoch_ms
11
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
12
12
 
13
13
 
14
14
  class ProjectUserRepository:
@@ -5,14 +5,13 @@ Session repository implementation using SQLAlchemy.
5
5
  from sqlalchemy import or_, func
6
6
  from sqlalchemy.orm import Session as DBSession, joinedload
7
7
 
8
- from ..shared.base_repository import PaginatedRepository
9
- from ..shared.pagination import PaginationParams
10
- from ..shared.types import SessionId, UserId
11
- from ..shared import now_epoch_ms
8
+ from solace_agent_mesh.shared.database.base_repository import PaginatedRepository
9
+ from solace_agent_mesh.shared.api.pagination import PaginationParams
10
+ from solace_agent_mesh.shared.utils.types import SessionId, UserId
11
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
12
12
  from .entities import Session
13
13
  from .interfaces import ISessionRepository
14
14
  from .models import CreateSessionModel, SessionModel, UpdateSessionModel
15
- from .models.chat_task_model import ChatTaskModel
16
15
 
17
16
 
18
17
  class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepository):
@@ -217,10 +216,7 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
217
216
  project_id: str | None = None
218
217
  ) -> list[Session]:
219
218
  """
220
- Search sessions by name or content.
221
-
222
- Uses PostgreSQL full-text search when available (for queries >= 3 chars),
223
- falls back to ILIKE for SQLite or short queries.
219
+ Search sessions by name/title only using ILIKE.
224
220
  """
225
221
  # Base query - only non-deleted sessions for the user
226
222
  base_query = db_session.query(SessionModel).filter(
@@ -232,54 +228,9 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
232
228
  if project_id is not None:
233
229
  base_query = base_query.filter(SessionModel.project_id == project_id)
234
230
 
235
- # Detect database dialect
236
- dialect_name = db_session.bind.dialect.name
237
- use_fts = dialect_name == 'postgresql' and len(query.strip()) >= 3
238
-
239
- if use_fts:
240
- # PostgreSQL full-text search for better performance
241
- matching_chat_tasks = (
242
- db_session.query(ChatTaskModel.session_id)
243
- .filter(
244
- or_(
245
- func.to_tsvector('english', func.coalesce(ChatTaskModel.user_message, ''))
246
- .op('@@')(func.plainto_tsquery('english', query)),
247
- func.to_tsvector('english', ChatTaskModel.message_bubbles)
248
- .op('@@')(func.plainto_tsquery('english', query))
249
- )
250
- )
251
- .distinct()
252
- .subquery()
253
- )
254
-
255
- search_query = base_query.filter(
256
- or_(
257
- func.to_tsvector('english', func.coalesce(SessionModel.name, ''))
258
- .op('@@')(func.plainto_tsquery('english', query)),
259
- SessionModel.id.in_(matching_chat_tasks)
260
- )
261
- )
262
- else:
263
- # ILIKE search for SQLite or short queries
264
- search_pattern = f"%{query}%"
265
- matching_chat_tasks = (
266
- db_session.query(ChatTaskModel.session_id)
267
- .filter(
268
- or_(
269
- ChatTaskModel.user_message.ilike(search_pattern),
270
- ChatTaskModel.message_bubbles.ilike(search_pattern)
271
- )
272
- )
273
- .distinct()
274
- .subquery()
275
- )
276
-
277
- search_query = base_query.filter(
278
- or_(
279
- SessionModel.name.ilike(search_pattern),
280
- SessionModel.id.in_(matching_chat_tasks)
281
- )
282
- )
231
+ # ILIKE search on session name
232
+ search_pattern = f"%{query}%"
233
+ search_query = base_query.filter(SessionModel.name.ilike(search_pattern))
283
234
 
284
235
  # Eager load project relationship
285
236
  search_query = search_query.options(joinedload(SessionModel.project))
@@ -299,9 +250,7 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
299
250
  project_id: str | None = None
300
251
  ) -> int:
301
252
  """
302
- Count search results for pagination.
303
-
304
- Uses same database-agnostic logic as search() method for consistency.
253
+ Count search results for pagination (title-only search).
305
254
  """
306
255
  # Base query - only non-deleted sessions for the user
307
256
  base_query = db_session.query(SessionModel).filter(
@@ -312,52 +261,8 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
312
261
  if project_id is not None:
313
262
  base_query = base_query.filter(SessionModel.project_id == project_id)
314
263
 
315
- dialect_name = db_session.bind.dialect.name
316
- use_fts = dialect_name == 'postgresql' and len(query.strip()) >= 3
317
-
318
- if use_fts:
319
- # PostgreSQL full-text search
320
- matching_chat_tasks = (
321
- db_session.query(ChatTaskModel.session_id)
322
- .filter(
323
- or_(
324
- func.to_tsvector('english', func.coalesce(ChatTaskModel.user_message, ''))
325
- .op('@@')(func.plainto_tsquery('english', query)),
326
- func.to_tsvector('english', ChatTaskModel.message_bubbles)
327
- .op('@@')(func.plainto_tsquery('english', query))
328
- )
329
- )
330
- .distinct()
331
- .subquery()
332
- )
333
-
334
- search_query = base_query.filter(
335
- or_(
336
- func.to_tsvector('english', func.coalesce(SessionModel.name, ''))
337
- .op('@@')(func.plainto_tsquery('english', query)),
338
- SessionModel.id.in_(matching_chat_tasks)
339
- )
340
- )
341
- else:
342
- # ILIKE search for SQLite or short queries
343
- search_pattern = f"%{query}%"
344
- matching_chat_tasks = (
345
- db_session.query(ChatTaskModel.session_id)
346
- .filter(
347
- or_(
348
- ChatTaskModel.user_message.ilike(search_pattern),
349
- ChatTaskModel.message_bubbles.ilike(search_pattern)
350
- )
351
- )
352
- .distinct()
353
- .subquery()
354
- )
355
-
356
- search_query = base_query.filter(
357
- or_(
358
- SessionModel.name.ilike(search_pattern),
359
- SessionModel.id.in_(matching_chat_tasks)
360
- )
361
- )
264
+ # ILIKE search on session name
265
+ search_pattern = f"%{query}%"
266
+ search_query = base_query.filter(SessionModel.name.ilike(search_pattern))
362
267
 
363
268
  return search_query.count()
@@ -4,8 +4,8 @@ Task repository implementation using SQLAlchemy.
4
4
 
5
5
  from sqlalchemy.orm import Session as DBSession
6
6
 
7
- from ..shared.pagination import PaginationParams
8
- from ..shared.types import UserId
7
+ from solace_agent_mesh.shared.api.pagination import PaginationParams
8
+ from solace_agent_mesh.shared.utils.types import UserId
9
9
  from .entities import Task, TaskEvent
10
10
  from .interfaces import ITaskRepository
11
11
  from .models import TaskEventModel, TaskModel
@@ -25,10 +25,15 @@ class TaskRepository(ITaskRepository):
25
25
  model.total_output_tokens = task.total_output_tokens
26
26
  model.total_cached_input_tokens = task.total_cached_input_tokens
27
27
  model.token_usage_details = task.token_usage_details
28
+ model.execution_mode = task.execution_mode
29
+ model.last_activity_time = task.last_activity_time
30
+ model.background_execution_enabled = task.background_execution_enabled
31
+ model.max_execution_time_ms = task.max_execution_time_ms
28
32
  else:
29
33
  model = TaskModel(
30
34
  id=task.id,
31
35
  user_id=task.user_id,
36
+ parent_task_id=task.parent_task_id,
32
37
  start_time=task.start_time,
33
38
  end_time=task.end_time,
34
39
  status=task.status,
@@ -37,6 +42,10 @@ class TaskRepository(ITaskRepository):
37
42
  total_output_tokens=task.total_output_tokens,
38
43
  total_cached_input_tokens=task.total_cached_input_tokens,
39
44
  token_usage_details=task.token_usage_details,
45
+ execution_mode=task.execution_mode,
46
+ last_activity_time=task.last_activity_time,
47
+ background_execution_enabled=task.background_execution_enabled,
48
+ max_execution_time_ms=task.max_execution_time_ms,
40
49
  )
41
50
  session.add(model)
42
51
 
@@ -155,6 +164,81 @@ class TaskRepository(ITaskRepository):
155
164
 
156
165
  return total_deleted
157
166
 
167
+ def find_all_by_parent_chain(self, session: DBSession, task_id: str) -> list[str]:
168
+ """
169
+ Returns all task IDs in the hierarchy starting from task_id.
170
+ Traverses up to find root, then traverses down to find all descendants.
171
+
172
+ Args:
173
+ session: Database session
174
+ task_id: Starting task ID
175
+
176
+ Returns:
177
+ List of all task IDs in the hierarchy (including the starting task)
178
+ """
179
+ # Find root task (traverse up parent chain)
180
+ root_task_id = task_id
181
+ current_id = task_id
182
+ visited = set()
183
+
184
+ while current_id and current_id not in visited:
185
+ visited.add(current_id)
186
+ task_model = (
187
+ session.query(TaskModel).filter(TaskModel.id == current_id).first()
188
+ )
189
+ if not task_model or not task_model.parent_task_id:
190
+ root_task_id = current_id
191
+ break
192
+ current_id = task_model.parent_task_id
193
+
194
+ # Find all descendants of root (BFS)
195
+ all_task_ids = {root_task_id}
196
+ to_process = [root_task_id]
197
+
198
+ while to_process:
199
+ current = to_process.pop(0)
200
+ # Find children
201
+ children = (
202
+ session.query(TaskModel)
203
+ .filter(TaskModel.parent_task_id == current)
204
+ .all()
205
+ )
206
+ for child in children:
207
+ if child.id not in all_task_ids:
208
+ all_task_ids.add(child.id)
209
+ to_process.append(child.id)
210
+
211
+ return list(all_task_ids)
212
+
213
+ def find_background_tasks_by_status(
214
+ self, session: DBSession, status: str | None = None
215
+ ) -> list[Task]:
216
+ """Find all background tasks, optionally filtered by status."""
217
+ query = session.query(TaskModel).filter(
218
+ TaskModel.execution_mode == "background"
219
+ )
220
+
221
+ if status:
222
+ query = query.filter(TaskModel.status == status)
223
+
224
+ models = query.all()
225
+ return [self._task_model_to_entity(model) for model in models]
226
+
227
+ def find_timed_out_background_tasks(
228
+ self, session: DBSession, cutoff_time_ms: int
229
+ ) -> list[Task]:
230
+ """Find background tasks that have exceeded their timeout."""
231
+ models = (
232
+ session.query(TaskModel)
233
+ .filter(
234
+ TaskModel.execution_mode == "background",
235
+ TaskModel.status.in_(["running", "pending"]),
236
+ TaskModel.last_activity_time < cutoff_time_ms
237
+ )
238
+ .all()
239
+ )
240
+ return [self._task_model_to_entity(model) for model in models]
241
+
158
242
  def _task_model_to_entity(self, model: TaskModel) -> Task:
159
243
  """Convert SQLAlchemy task model to domain entity."""
160
244
  return Task.model_validate(model)
@@ -4,12 +4,12 @@ API Router for agent discovery and management.
4
4
 
5
5
  import logging
6
6
  from fastapi import APIRouter, Depends, HTTPException, status
7
- from typing import Dict, List
7
+ from typing import Any, Dict, List
8
8
 
9
9
  from ....common.agent_registry import AgentRegistry
10
+ from ....common.middleware.registry import MiddlewareRegistry
10
11
  from a2a.types import AgentCard
11
- from ..dependencies import get_agent_registry, get_sac_component
12
- from ..component import WebUIBackendComponent
12
+ from ..dependencies import get_agent_registry, get_user_config
13
13
 
14
14
  log = logging.getLogger(__name__)
15
15
 
@@ -19,22 +19,53 @@ router = APIRouter()
19
19
  @router.get("/agentCards", response_model=List[AgentCard])
20
20
  async def get_discovered_agent_cards(
21
21
  agent_registry: AgentRegistry = Depends(get_agent_registry),
22
+ user_config: Dict[str, Any] = Depends(get_user_config),
22
23
  ):
23
24
  """
24
- Retrieves a list of all currently discovered A2A agents' cards.
25
+ Retrieves a list of discovered A2A agents filtered by user permissions.
26
+
27
+ Agents are filtered based on the user's agent:*:delegate scopes to ensure
28
+ users only see agents they have permission to access.
25
29
  """
26
30
  log_prefix = "[GET /api/v1/agentCards] "
27
31
  log.info("%sRequest received.", log_prefix)
28
32
  try:
29
33
  agent_names = agent_registry.get_agent_names()
30
- agents = [
34
+ all_agents = [
31
35
  agent_registry.get_agent(name)
32
36
  for name in agent_names
33
37
  if agent_registry.get_agent(name)
34
38
  ]
35
39
 
36
- log.debug("%sReturning %d discovered agent cards.", log_prefix, len(agents))
37
- return agents
40
+ # Filter agents by user's access permissions
41
+ config_resolver = MiddlewareRegistry.get_config_resolver()
42
+ filtered_agents = []
43
+
44
+ for agent in all_agents:
45
+ operation_spec = {
46
+ "operation_type": "agent_access",
47
+ "target_agent": agent.name,
48
+ }
49
+ validation_result = config_resolver.validate_operation_config(
50
+ user_config, operation_spec, {"source": "agent_cards_endpoint"}
51
+ )
52
+ if validation_result.get("valid", False):
53
+ filtered_agents.append(agent)
54
+ else:
55
+ log.debug(
56
+ "%sAgent '%s' filtered out for user. Required scopes: %s",
57
+ log_prefix,
58
+ agent.name,
59
+ validation_result.get("required_scopes", []),
60
+ )
61
+
62
+ log.debug(
63
+ "%sReturning %d/%d agents after filtering.",
64
+ log_prefix,
65
+ len(filtered_agents),
66
+ len(all_agents),
67
+ )
68
+ return filtered_agents
38
69
  except Exception as e:
39
70
  log.exception("%sError retrieving discovered agent cards: %s", log_prefix, e)
40
71
  raise HTTPException(