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
@@ -0,0 +1,370 @@
1
+ """
2
+ Utility functions for copying project artifacts to sessions.
3
+ """
4
+
5
+ import logging
6
+ from datetime import datetime, timezone
7
+ from typing import TYPE_CHECKING
8
+
9
+ from sqlalchemy.orm import Session as DbSession
10
+
11
+ from ....agent.utils.artifact_helpers import (
12
+ get_artifact_info_list,
13
+ load_artifact_content_or_metadata,
14
+ save_artifact_with_metadata,
15
+ )
16
+
17
+ if TYPE_CHECKING:
18
+ from ....gateway.http_sse.component import WebUIBackendComponent
19
+ from ....gateway.http_sse.services.project_service import ProjectService
20
+
21
+ try:
22
+ from google.adk.artifacts import BaseArtifactService
23
+ except ImportError:
24
+ class BaseArtifactService:
25
+ pass
26
+
27
+
28
+ log = logging.getLogger(__name__)
29
+
30
+
31
+ async def has_pending_project_context(
32
+ user_id: str,
33
+ session_id: str,
34
+ artifact_service: BaseArtifactService,
35
+ app_name: str,
36
+ db: DbSession,
37
+ ) -> bool:
38
+ """
39
+ Check if session has any artifacts with pending project context.
40
+
41
+ This is used to determine if we should inject full project context
42
+ on the next user message after a session has been moved to a project.
43
+
44
+ Args:
45
+ user_id: User ID
46
+ session_id: Session ID
47
+ artifact_service: Artifact service instance
48
+ app_name: Application name for artifact storage
49
+ db: Database session
50
+
51
+ Returns:
52
+ True if any artifacts have project_context_pending=True metadata
53
+ """
54
+ try:
55
+ session_artifacts = await get_artifact_info_list(
56
+ artifact_service=artifact_service,
57
+ app_name=app_name,
58
+ user_id=user_id,
59
+ session_id=session_id,
60
+ )
61
+
62
+ # Check each artifact's metadata to see if it has pending project context
63
+ for artifact_info in session_artifacts:
64
+ loaded_metadata = await load_artifact_content_or_metadata(
65
+ artifact_service=artifact_service,
66
+ app_name=app_name,
67
+ user_id=user_id,
68
+ session_id=session_id,
69
+ filename=artifact_info.filename,
70
+ load_metadata_only=True,
71
+ version="latest",
72
+ )
73
+
74
+ if loaded_metadata.get("status") == "success":
75
+ metadata = loaded_metadata.get("metadata", {})
76
+ if metadata.get("project_context_pending"):
77
+ return True
78
+
79
+ return False
80
+ except Exception as e:
81
+ log.warning("Failed to check for pending project context: %s", e)
82
+ return False
83
+
84
+
85
+ async def clear_pending_project_context(
86
+ user_id: str,
87
+ session_id: str,
88
+ artifact_service: BaseArtifactService,
89
+ app_name: str,
90
+ db: DbSession,
91
+ log_prefix: str = "",
92
+ ) -> None:
93
+ """
94
+ Clear the project_context_pending flag from all artifacts in a session.
95
+
96
+ This should be called after project context has been injected to the agent.
97
+
98
+ Args:
99
+ user_id: User ID
100
+ session_id: Session ID
101
+ artifact_service: Artifact service instance
102
+ app_name: Application name for artifact storage
103
+ db: Database session
104
+ log_prefix: Optional prefix for log messages
105
+ """
106
+ try:
107
+ session_artifacts = await get_artifact_info_list(
108
+ artifact_service=artifact_service,
109
+ app_name=app_name,
110
+ user_id=user_id,
111
+ session_id=session_id,
112
+ )
113
+
114
+ for artifact_info in session_artifacts:
115
+ loaded_metadata = await load_artifact_content_or_metadata(
116
+ artifact_service=artifact_service,
117
+ app_name=app_name,
118
+ user_id=user_id,
119
+ session_id=session_id,
120
+ filename=artifact_info.filename,
121
+ load_metadata_only=True,
122
+ version="latest",
123
+ )
124
+
125
+ if loaded_metadata.get("status") == "success":
126
+ metadata = loaded_metadata.get("metadata", {})
127
+
128
+ # Only update if the artifact has the pending flag
129
+ if metadata.get("project_context_pending"):
130
+ log.debug(
131
+ "%sClearing project_context_pending flag for artifact %s",
132
+ log_prefix,
133
+ artifact_info.filename,
134
+ )
135
+
136
+ # Remove the pending flag
137
+ metadata.pop("project_context_pending", None)
138
+
139
+ loaded_artifact = await load_artifact_content_or_metadata(
140
+ artifact_service=artifact_service,
141
+ app_name=app_name,
142
+ user_id=user_id,
143
+ session_id=session_id,
144
+ filename=artifact_info.filename,
145
+ return_raw_bytes=True,
146
+ version="latest",
147
+ )
148
+
149
+ if loaded_artifact.get("status") == "success":
150
+ await save_artifact_with_metadata(
151
+ artifact_service=artifact_service,
152
+ app_name=app_name,
153
+ user_id=user_id,
154
+ session_id=session_id,
155
+ filename=artifact_info.filename,
156
+ content_bytes=loaded_artifact.get("raw_bytes"),
157
+ mime_type=loaded_artifact.get("mime_type"),
158
+ metadata_dict=metadata,
159
+ timestamp=datetime.now(timezone.utc),
160
+ )
161
+ except Exception as e:
162
+ log.warning("%sFailed to clear pending project context flags: %s", log_prefix, e)
163
+
164
+
165
+ async def copy_project_artifacts_to_session(
166
+ project_id: str,
167
+ user_id: str,
168
+ session_id: str,
169
+ project_service: "ProjectService",
170
+ component: "WebUIBackendComponent",
171
+ db: "DbSession",
172
+ log_prefix: str = "",
173
+ ) -> tuple[int, list[str]]:
174
+ """
175
+ Copy all artifacts from a project to a session.
176
+
177
+ This function handles:
178
+ - Loading artifacts from the project storage
179
+ - Checking which artifacts already exist in the session
180
+ - Copying new artifacts to the session
181
+ - Setting the 'source' metadata field to 'project'
182
+
183
+ Args:
184
+ project_id: ID of the project containing artifacts
185
+ user_id: ID of the user (for session artifact storage)
186
+ session_id: ID of the session to copy artifacts to
187
+ project_service: ProjectService instance for accessing projects
188
+ component: WebUIBackendComponent for accessing artifact service
189
+ db: Database session to use for queries
190
+ log_prefix: Optional prefix for log messages
191
+
192
+ Returns:
193
+ Tuple of (artifacts_copied_count, list_of_new_artifact_names)
194
+
195
+ Raises:
196
+ Exception: If project or artifact service is not available
197
+ """
198
+ if not project_id:
199
+ log.debug("%sNo project_id provided, skipping artifact copy", log_prefix)
200
+ return 0, []
201
+
202
+ if db is None:
203
+ log.warning("%sArtifact copy skipped: database session not provided", log_prefix)
204
+ return 0, []
205
+
206
+ try:
207
+ project = project_service.get_project(db, project_id, user_id)
208
+ if not project:
209
+ log.warning("%sProject %s not found for user %s", log_prefix, project_id, user_id)
210
+ return 0, []
211
+
212
+ artifact_service = component.get_shared_artifact_service()
213
+ if not artifact_service:
214
+ log.warning("%sArtifact service not available", log_prefix)
215
+ return 0, []
216
+
217
+ source_user_id = project.user_id
218
+ project_artifacts_session_id = f"project-{project.id}"
219
+
220
+ log.info(
221
+ "%sChecking for artifacts in project %s (storage session: %s)",
222
+ log_prefix,
223
+ project.id,
224
+ project_artifacts_session_id,
225
+ )
226
+
227
+ # Get list of artifacts in the project
228
+ project_artifacts = await get_artifact_info_list(
229
+ artifact_service=artifact_service,
230
+ app_name=project_service.app_name,
231
+ user_id=source_user_id,
232
+ session_id=project_artifacts_session_id,
233
+ )
234
+
235
+ if not project_artifacts:
236
+ log.info("%sNo artifacts found in project %s", log_prefix, project.id)
237
+ return 0, []
238
+
239
+ log.info(
240
+ "%sFound %d artifacts in project %s to process",
241
+ log_prefix,
242
+ len(project_artifacts),
243
+ project.id,
244
+ )
245
+
246
+ try:
247
+ session_artifacts = await get_artifact_info_list(
248
+ artifact_service=artifact_service,
249
+ app_name=project_service.app_name,
250
+ user_id=user_id,
251
+ session_id=session_id,
252
+ )
253
+ session_artifact_names = {art.filename for art in session_artifacts}
254
+ log.debug(
255
+ "%sSession %s currently has %d artifacts",
256
+ log_prefix,
257
+ session_id,
258
+ len(session_artifact_names),
259
+ )
260
+ except Exception as e:
261
+ log.warning(
262
+ "%sFailed to get session artifacts, will copy all project artifacts: %s",
263
+ log_prefix,
264
+ e,
265
+ )
266
+ session_artifact_names = set()
267
+
268
+ artifacts_copied = 0
269
+ new_artifact_names = []
270
+
271
+ for artifact_info in project_artifacts:
272
+ # Skip if artifact already exists in session
273
+ if artifact_info.filename in session_artifact_names:
274
+ log.debug(
275
+ "%sSkipping artifact %s - already exists in session",
276
+ log_prefix,
277
+ artifact_info.filename,
278
+ )
279
+ continue
280
+
281
+ new_artifact_names.append(artifact_info.filename)
282
+
283
+ log.info(
284
+ "%sCopying artifact %s to session %s",
285
+ log_prefix,
286
+ artifact_info.filename,
287
+ session_id,
288
+ )
289
+
290
+ try:
291
+ # Load artifact content from project storage
292
+ loaded_artifact = await load_artifact_content_or_metadata(
293
+ artifact_service=artifact_service,
294
+ app_name=project_service.app_name,
295
+ user_id=source_user_id,
296
+ session_id=project_artifacts_session_id,
297
+ filename=artifact_info.filename,
298
+ return_raw_bytes=True,
299
+ version="latest",
300
+ )
301
+
302
+ # Load the full metadata separately
303
+ loaded_metadata = await load_artifact_content_or_metadata(
304
+ artifact_service=artifact_service,
305
+ app_name=project_service.app_name,
306
+ user_id=source_user_id,
307
+ session_id=project_artifacts_session_id,
308
+ filename=artifact_info.filename,
309
+ load_metadata_only=True,
310
+ version="latest",
311
+ )
312
+
313
+ # Save a copy to the current chat session
314
+ if loaded_artifact.get("status") == "success":
315
+ full_metadata = (
316
+ loaded_metadata.get("metadata", {})
317
+ if loaded_metadata.get("status") == "success"
318
+ else {}
319
+ )
320
+
321
+ # This flag will be checked on the next user message to inject full context
322
+ full_metadata["project_context_pending"] = True
323
+
324
+ await save_artifact_with_metadata(
325
+ artifact_service=artifact_service,
326
+ app_name=project_service.app_name,
327
+ user_id=user_id,
328
+ session_id=session_id,
329
+ filename=artifact_info.filename,
330
+ content_bytes=loaded_artifact.get("raw_bytes"),
331
+ mime_type=loaded_artifact.get("mime_type"),
332
+ metadata_dict=full_metadata,
333
+ timestamp=datetime.now(timezone.utc),
334
+ )
335
+ artifacts_copied += 1
336
+ log.info(
337
+ "%sSuccessfully copied artifact %s to session",
338
+ log_prefix,
339
+ artifact_info.filename,
340
+ )
341
+ else:
342
+ log.warning(
343
+ "%sFailed to load artifact %s: %s",
344
+ log_prefix,
345
+ artifact_info.filename,
346
+ loaded_artifact.get("status"),
347
+ )
348
+ except Exception as e:
349
+ log.error(
350
+ "%sError copying artifact %s to session: %s",
351
+ log_prefix,
352
+ artifact_info.filename,
353
+ e,
354
+ )
355
+
356
+ if artifacts_copied > 0:
357
+ log.info(
358
+ "%sCopied %d new artifacts to session %s",
359
+ log_prefix,
360
+ artifacts_copied,
361
+ session_id,
362
+ )
363
+ else:
364
+ log.debug("%sNo new artifacts to copy to session %s", log_prefix, session_id)
365
+
366
+ return artifacts_copied, new_artifact_names
367
+
368
+ except Exception as e:
369
+ log.warning("%sFailed to copy project artifacts to session: %s", log_prefix, e)
370
+ return 0, []
@@ -2,7 +2,7 @@
2
2
  Utility functions for creating .stim file structures.
3
3
  """
4
4
 
5
- from typing import List
5
+ from typing import Dict, List
6
6
 
7
7
  from ..repository.entities import Task, TaskEvent
8
8
 
@@ -30,3 +30,43 @@ def create_stim_from_task_data(task: Task, events: List[TaskEvent]) -> dict:
30
30
  },
31
31
  "invocation_flow": [event.model_dump() for event in events],
32
32
  }
33
+
34
+
35
+ def create_stim_from_task_hierarchy(
36
+ tasks: Dict[str, Task], all_events: Dict[str, List[TaskEvent]], root_task_id: str
37
+ ) -> dict:
38
+ """
39
+ Formats a task hierarchy (parent + children) and all their events into the .stim file structure.
40
+
41
+ Args:
42
+ tasks: Dictionary of task_id -> Task entity for all tasks in hierarchy.
43
+ all_events: Dictionary of task_id -> List[TaskEvent] for all tasks.
44
+ root_task_id: The root task ID (used for invocation_details).
45
+
46
+ Returns:
47
+ A dictionary representing the .stim file content with all task events.
48
+ """
49
+ root_task = tasks[root_task_id]
50
+
51
+ # Collect all events from all tasks and sort by created_time
52
+ combined_events = []
53
+ for task_id, events in all_events.items():
54
+ combined_events.extend(events)
55
+
56
+ # Sort all events chronologically
57
+ combined_events.sort(key=lambda e: e.created_time)
58
+
59
+ return {
60
+ "invocation_details": {
61
+ "log_file_version": "2.0", # New version for gateway-generated logs
62
+ "task_id": root_task.id,
63
+ "user_id": root_task.user_id,
64
+ "start_time": root_task.start_time,
65
+ "end_time": root_task.end_time,
66
+ "status": root_task.status,
67
+ "initial_request_text": root_task.initial_request_text,
68
+ "includes_child_tasks": len(tasks) > 1,
69
+ "total_tasks": len(tasks),
70
+ },
71
+ "invocation_flow": [event.model_dump() for event in combined_events],
72
+ }
File without changes
@@ -0,0 +1,29 @@
1
+ """
2
+ Platform Service for Solace Agent Mesh.
3
+
4
+ ARCHITECTURE: Service vs Gateway
5
+ --------------------------------
6
+ SERVICES provide internal platform functionality (this component).
7
+ GATEWAYS handle external communication channels (http_sse, slack, webhook, etc.).
8
+
9
+ Platform Service Responsibilities:
10
+ - REST API for platform configuration management
11
+ - Agent Builder (CRUD operations on agents)
12
+ - Connector management (CRUD operations on connectors)
13
+ - Toolset discovery and management
14
+ - Deployment orchestration (deploy/update/undeploy agents)
15
+ - AI Assistant (AI-powered configuration help)
16
+ - Deployer heartbeat monitoring (track deployer availability)
17
+ - Background deployment status checking (verify agent deployments succeed)
18
+
19
+ Message Communication (Direct Messaging - Not A2A Protocol):
20
+ - PUBLISHES: Deployment commands (direct publishing) to deployer ({namespace}/deployer/agent/...)
21
+ - RECEIVES: Deployer heartbeats ({namespace}/deployer/heartbeat)
22
+ - RECEIVES: Agent cards for deployment monitoring ({namespace}/a2a/agent-cards)
23
+
24
+ What Platform Service is NOT:
25
+ - NOT a chat interface (no user sessions)
26
+ - NOT for task submission to agents (no orchestration of user tasks)
27
+ - NOT for artifact management (no chat artifacts or embeds)
28
+ - NOT for end-user communication (admin/platform operations only)
29
+ """
@@ -0,0 +1,85 @@
1
+ from alembic import context
2
+ from sqlalchemy import engine_from_config, pool
3
+ from sqlalchemy.ext.declarative import declarative_base
4
+
5
+ # this is the Alembic Config object, which provides
6
+ # access to the values within the .ini file in use.
7
+ config = context.config
8
+
9
+ # Create a placeholder Base for future community platform models
10
+ # When community models are added, import them here to ensure they are registered
11
+ Base = declarative_base()
12
+
13
+ # Import all models here to ensure they are registered with the Base
14
+ # Example:
15
+ # from solace_agent_mesh.services.platform.models.example_model import ExampleModel
16
+
17
+ target_metadata = Base.metadata
18
+
19
+ # other values from the config, defined by the needs of env.py,
20
+ # can be acquired:
21
+ # my_important_option = config.get_main_option("my_important_option")
22
+ # ... etc.
23
+
24
+ SQLALCHEMY_URL_KEY = "sqlalchemy.url"
25
+
26
+
27
+ def run_migrations_offline() -> None:
28
+ """Run migrations in 'offline' mode.
29
+
30
+ This configures the context with just a URL
31
+ and not an Engine, though an Engine is acceptable
32
+ here as well. By skipping the Engine creation
33
+ we don't even need a DBAPI to be available.
34
+
35
+ Calls to context.execute() here emit the given string to the
36
+ script output.
37
+
38
+ """
39
+ url = config.get_main_option(SQLALCHEMY_URL_KEY)
40
+ context.configure(
41
+ url=url,
42
+ target_metadata=target_metadata,
43
+ literal_binds=True,
44
+ dialect_opts={"paramstyle": "named"},
45
+ )
46
+
47
+ with context.begin_transaction():
48
+ context.run_migrations()
49
+
50
+
51
+ def run_migrations_online() -> None:
52
+ """Run migrations in 'online' mode.
53
+
54
+ In this scenario we need to create an Engine
55
+ and associate a connection with the context.
56
+
57
+ """
58
+ # Get the database URL from the Alembic config
59
+ url = config.get_main_option(SQLALCHEMY_URL_KEY)
60
+ if not url:
61
+ raise ValueError(
62
+ f"Database URL is not set. Please set {SQLALCHEMY_URL_KEY} in alembic.ini or via command line."
63
+ )
64
+
65
+ # Create a configuration dictionary for the engine
66
+ # This ensures that the URL is correctly picked up by engine_from_config
67
+ engine_config = {SQLALCHEMY_URL_KEY: url}
68
+
69
+ connectable = engine_from_config(
70
+ engine_config,
71
+ prefix="sqlalchemy.",
72
+ poolclass=pool.NullPool,
73
+ )
74
+
75
+ with connectable.connect() as connection:
76
+ context.configure(connection=connection, target_metadata=target_metadata)
77
+
78
+ with context.begin_transaction():
79
+ context.run_migrations()
80
+
81
+
82
+ if context.is_offline_mode():
83
+ run_migrations_offline()
84
+ else:
85
+ run_migrations_online()
@@ -0,0 +1,28 @@
1
+ """${message}
2
+
3
+ Revision ID: ${up_revision}
4
+ Revises: ${down_revision | comma,n}
5
+ Create Date: ${create_date}
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+ ${imports if imports else ""}
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = ${repr(up_revision)}
16
+ down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)}
17
+ branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
18
+ depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade schema."""
23
+ ${upgrades if upgrades else "pass"}
24
+
25
+
26
+ def downgrade() -> None:
27
+ """Downgrade schema."""
28
+ ${downgrades if downgrades else "pass"}
@@ -0,0 +1,109 @@
1
+ # A generic, single database configuration.
2
+
3
+ [alembic]
4
+ # path to migration scripts.
5
+ # this is typically a path given in POSIX (e.g. forward slashes)
6
+ # format, relative to the token %(here)s which refers to the location of this
7
+ # ini file
8
+ script_location = %(here)s/alembic
9
+
10
+ # Template used to generate migration file names
11
+ # Format: YYYYMMDD_revision_description
12
+ file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s_%%(slug)s
13
+
14
+ # sys.path path, will be prepended to sys.path if present.
15
+ # defaults to the current working directory. for multiple paths, the path separator
16
+ # is defined by "path_separator" below.
17
+ prepend_sys_path = .
18
+
19
+
20
+ # timezone to use when rendering the date within the migration file
21
+ # as well as the filename.
22
+ # If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library.
23
+ # Any required deps can installed by adding `alembic[tz]` to the pip requirements
24
+ # string value is passed to ZoneInfo()
25
+ # leave blank for localtime
26
+ # timezone =
27
+
28
+ # max length of characters to apply to the "slug" field
29
+ # truncate_slug_length = 40
30
+
31
+ # set to 'true' to run the environment during
32
+ # the 'revision' command, regardless of autogenerate
33
+ # revision_environment = false
34
+
35
+ # set to 'true' to allow .pyc and .pyo files without
36
+ # a source .py file to be detected as revisions in the
37
+ # versions/ directory
38
+ # sourceless = false
39
+
40
+ # version location specification; This defaults
41
+ # to <script_location>/versions. When using multiple version
42
+ # directories, initial revisions must be specified with --version-path.
43
+ # The path separator used here should be the separator specified by "path_separator"
44
+ # below.
45
+ # version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions
46
+
47
+ # path_separator; This indicates what character is used to split lists of file
48
+ # paths, including version_locations and prepend_sys_path within configparser
49
+ # files such as alembic.ini.
50
+ # The default rendered in new alembic.ini files is "os", which uses os.pathsep
51
+ # to provide os-dependent path splitting.
52
+ #
53
+ # Note that in order to support legacy alembic.ini files, this default does NOT
54
+ # take place if path_separator is not present in alembic.ini. If this
55
+ # option is omitted entirely, fallback logic is as follows:
56
+ #
57
+ # 1. Parsing of the version_locations option falls back to using the legacy
58
+ # "version_path_separator" key, which if absent then falls back to the legacy
59
+ # behavior of splitting on spaces and/or commas.
60
+ # 2. Parsing of the prepend_sys_path option falls back to the legacy
61
+ # behavior of splitting on spaces, commas, or colons.
62
+ #
63
+ # Valid values for path_separator are:
64
+ #
65
+ # path_separator = :
66
+ # path_separator = ;
67
+ # path_separator = space
68
+ # path_separator = newline
69
+ #
70
+ # Use os.pathsep. Default configuration used for new projects.
71
+ path_separator = os
72
+
73
+ # set to 'true' to search source files recursively
74
+ # in each "version_locations" directory
75
+ # new in Alembic version 1.10
76
+ # recursive_version_locations = false
77
+
78
+ # the output encoding used when revision files
79
+ # are written from script.py.mako
80
+ # output_encoding = utf-8
81
+
82
+ # database URL. This is consumed by the user-maintained env.py script only.
83
+ # other means of configuring database URLs may be customized within the env.py
84
+ # file.
85
+ # sqlalchemy.url = sqlite:////Users/mradwan/solace_agent_mesh.db
86
+
87
+
88
+ [post_write_hooks]
89
+ # post_write_hooks defines scripts or Python functions that are run
90
+ # on newly generated revision scripts. See the documentation for further
91
+ # detail and examples
92
+
93
+ # format using "black" - use the console_scripts runner, against the "black" entrypoint
94
+ # hooks = black
95
+ # black.type = console_scripts
96
+ # black.entrypoint = black
97
+ # black.options = -l 79 REVISION_SCRIPT_FILENAME
98
+
99
+ # lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module
100
+ # hooks = ruff
101
+ # ruff.type = module
102
+ # ruff.module = ruff
103
+ # ruff.options = check --fix REVISION_SCRIPT_FILENAME
104
+
105
+ # Alternatively, use the exec runner to execute a binary found on your PATH
106
+ # hooks = ruff
107
+ # ruff.type = exec
108
+ # ruff.executable = ruff
109
+ # ruff.options = check --fix REVISION_SCRIPT_FILENAME
@@ -0,0 +1,3 @@
1
+ """
2
+ Platform Service FastAPI application and supporting modules.
3
+ """