solace-agent-mesh 1.6.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 (481) 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/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.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
+ """