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,154 @@
1
+ """
2
+ FastAPI dependency injection for Platform Service.
3
+
4
+ Provides database sessions, component instance access, and user authentication.
5
+ """
6
+
7
+ import logging
8
+ from typing import TYPE_CHECKING, Generator
9
+
10
+ from fastapi import HTTPException, status
11
+ from sqlalchemy import create_engine, event, pool
12
+ from sqlalchemy.engine.url import make_url
13
+ from sqlalchemy.orm import Session, sessionmaker
14
+
15
+ if TYPE_CHECKING:
16
+ from ..component import PlatformServiceComponent
17
+
18
+ log = logging.getLogger(__name__)
19
+
20
+ # Global state
21
+ platform_component_instance: "PlatformServiceComponent" = None
22
+ PlatformSessionLocal: sessionmaker = None
23
+
24
+
25
+ def set_component_instance(component: "PlatformServiceComponent"):
26
+ """
27
+ Store the component reference for dependency injection.
28
+
29
+ Called by setup_dependencies during component startup.
30
+
31
+ Args:
32
+ component: The PlatformServiceComponent instance.
33
+ """
34
+ global platform_component_instance
35
+ if platform_component_instance is None:
36
+ platform_component_instance = component
37
+ log.info("Platform component instance provided.")
38
+ else:
39
+ log.warning("Platform component instance already set.")
40
+
41
+
42
+ def init_database(database_url: str):
43
+ """
44
+ Initialize database connection with dialect-specific configuration.
45
+
46
+ Configures appropriate connection pooling and settings for:
47
+ - SQLite: StaticPool, foreign key enforcement
48
+ - PostgreSQL/MySQL: Connection pooling with pre-ping
49
+
50
+ Args:
51
+ database_url: SQLAlchemy database URL string.
52
+ """
53
+ global PlatformSessionLocal
54
+ if PlatformSessionLocal is None:
55
+ url = make_url(database_url)
56
+ dialect_name = url.get_dialect().name
57
+
58
+ engine_kwargs = {}
59
+
60
+ if dialect_name == "sqlite":
61
+ engine_kwargs = {
62
+ "poolclass": pool.StaticPool,
63
+ "connect_args": {"check_same_thread": False},
64
+ }
65
+ log.info("Configuring SQLite database (single-connection mode)")
66
+
67
+ elif dialect_name in ("postgresql", "mysql"):
68
+ engine_kwargs = {
69
+ "pool_size": 10,
70
+ "max_overflow": 20,
71
+ "pool_timeout": 30,
72
+ "pool_recycle": 1800,
73
+ "pool_pre_ping": True,
74
+ }
75
+ log.info(f"Configuring {dialect_name} database with connection pooling")
76
+
77
+ else:
78
+ log.warning(f"Using default configuration for dialect: {dialect_name}")
79
+
80
+ engine = create_engine(database_url, **engine_kwargs)
81
+
82
+ @event.listens_for(engine, "connect")
83
+ def set_sqlite_pragma(dbapi_conn, connection_record):
84
+ """Enable foreign key constraints for SQLite."""
85
+ if dialect_name == "sqlite":
86
+ cursor = dbapi_conn.cursor()
87
+ cursor.execute("PRAGMA foreign_keys=ON")
88
+ cursor.close()
89
+
90
+ PlatformSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
91
+ log.info("Database initialized successfully")
92
+ else:
93
+ log.warning("Database already initialized.")
94
+
95
+
96
+ def get_platform_db() -> Generator[Session, None, None]:
97
+ """
98
+ FastAPI dependency for platform database session management.
99
+
100
+ Provides a database session with automatic commit/rollback:
101
+ - Commits on success
102
+ - Rolls back on exception
103
+ - Always closes the session
104
+
105
+ Yields:
106
+ SQLAlchemy database session for platform database.
107
+
108
+ Raises:
109
+ HTTPException: 503 if database is not initialized.
110
+ """
111
+ if PlatformSessionLocal is None:
112
+ raise HTTPException(
113
+ status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
114
+ detail="Database not initialized.",
115
+ )
116
+ db = PlatformSessionLocal()
117
+ try:
118
+ yield db
119
+ db.commit()
120
+ except Exception:
121
+ db.rollback()
122
+ raise
123
+ finally:
124
+ db.close()
125
+
126
+
127
+ def get_heartbeat_tracker():
128
+ """
129
+ Get the heartbeat tracker from platform component.
130
+
131
+ Used by deployer status endpoint to check if deployer is online.
132
+
133
+ Returns:
134
+ HeartbeatTracker instance if initialized, None otherwise.
135
+ """
136
+ if platform_component_instance is None:
137
+ log.warning("Platform component not initialized - heartbeat tracker unavailable")
138
+ return None
139
+ return platform_component_instance.get_heartbeat_tracker()
140
+
141
+
142
+ def get_agent_registry():
143
+ """
144
+ Get the agent registry from platform component.
145
+
146
+ Used for deployment status monitoring.
147
+
148
+ Returns:
149
+ AgentRegistry instance if initialized, None otherwise.
150
+ """
151
+ if platform_component_instance is None:
152
+ log.warning("Platform component not initialized - agent registry unavailable")
153
+ return None
154
+ return platform_component_instance.get_agent_registry()
@@ -0,0 +1,314 @@
1
+ """
2
+ FastAPI application for Platform Service.
3
+ """
4
+
5
+ import logging
6
+ import os
7
+ from typing import TYPE_CHECKING
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import command
11
+ from alembic.config import Config
12
+ from fastapi import FastAPI
13
+ from fastapi.middleware.cors import CORSMiddleware
14
+
15
+ if TYPE_CHECKING:
16
+ from ..component import PlatformServiceComponent
17
+
18
+ log = logging.getLogger(__name__)
19
+
20
+ app = FastAPI(
21
+ title="Platform Service API",
22
+ version="1.0.0",
23
+ description="Platform configuration management API (agents, connectors, toolsets, deployments)",
24
+ )
25
+
26
+
27
+
28
+ def _setup_alembic_config(database_url: str) -> Config:
29
+ """
30
+ Create and configure an Alembic Config object for community platform migrations.
31
+
32
+ Args:
33
+ database_url: Database connection string.
34
+
35
+ Returns:
36
+ Configured Alembic Config object.
37
+ """
38
+ alembic_cfg = Config()
39
+ # Note: __file__ is in api/main.py, so we go up one level (..) to get to platform/
40
+ alembic_cfg.set_main_option(
41
+ "script_location",
42
+ os.path.join(os.path.dirname(__file__), "..", "alembic"),
43
+ )
44
+ alembic_cfg.set_main_option("sqlalchemy.url", database_url)
45
+ return alembic_cfg
46
+
47
+
48
+ def _run_community_migrations(database_url: str) -> None:
49
+ """
50
+ Run Alembic migrations for the community platform database schema.
51
+ This includes any base tables defined in the community repo.
52
+
53
+ Args:
54
+ database_url: Database connection string.
55
+ """
56
+ try:
57
+ from sqlalchemy import create_engine
58
+
59
+ log.info("Starting community platform migrations...")
60
+ engine = create_engine(database_url)
61
+ inspector = sa.inspect(engine)
62
+ existing_tables = inspector.get_table_names()
63
+
64
+ if not existing_tables:
65
+ log.info("Running initial community platform database setup")
66
+ alembic_cfg = _setup_alembic_config(database_url)
67
+ command.upgrade(alembic_cfg, "head")
68
+ log.info("Community platform database migrations completed")
69
+ else:
70
+ log.info("Checking for community platform schema updates")
71
+ alembic_cfg = _setup_alembic_config(database_url)
72
+ command.upgrade(alembic_cfg, "head")
73
+ log.info("Community platform database schema is current")
74
+ except Exception as e:
75
+ log.warning(
76
+ "Community platform migration check failed: %s - attempting to run migrations",
77
+ e,
78
+ )
79
+ try:
80
+ alembic_cfg = _setup_alembic_config(database_url)
81
+ command.upgrade(alembic_cfg, "head")
82
+ log.info("Community platform database migrations completed")
83
+ except Exception as migration_error:
84
+ log.error("Community platform migration failed: %s", migration_error)
85
+ log.error("Check database connectivity and permissions")
86
+ raise RuntimeError(
87
+ f"Community platform database migration failed: {migration_error}"
88
+ ) from migration_error
89
+
90
+
91
+ def _run_enterprise_migrations(database_url: str) -> None:
92
+ """
93
+ Run migrations for enterprise platform features.
94
+ This is optional and only runs if the enterprise package is available.
95
+
96
+ Args:
97
+ database_url: Database connection string.
98
+ """
99
+ try:
100
+ from solace_agent_mesh_enterprise.platform_service.migration_runner import run_migrations
101
+
102
+ log.info("[Platform Service] Starting enterprise migrations...")
103
+ run_migrations(database_url)
104
+ log.info("[Platform Service] Enterprise migrations completed successfully")
105
+ except ImportError:
106
+ log.debug("[Platform Service] Enterprise module not found - skipping enterprise migrations")
107
+ except Exception as e:
108
+ log.error("[Platform Service] Enterprise migration failed: %s", e)
109
+ log.error("[Platform Service] Enterprise features may be unavailable")
110
+ raise RuntimeError(f"Enterprise platform database migration failed: {e}") from e
111
+
112
+
113
+ def _setup_database(database_url: str) -> None:
114
+ """Initialize database and run migrations."""
115
+ log.info("[Platform Service] Initializing database and running migrations...")
116
+ _run_enterprise_migrations(database_url)
117
+ log.info("[Platform Service] Database initialization complete")
118
+
119
+
120
+ def setup_dependencies(component: "PlatformServiceComponent"):
121
+ """
122
+ Initialize FastAPI dependencies (middleware, routers).
123
+ Database migrations are handled in component.__init__().
124
+
125
+ Args:
126
+ component: PlatformServiceComponent instance
127
+ """
128
+ log.info("Initializing Platform Service dependencies...")
129
+
130
+ from . import dependencies
131
+ dependencies.set_component_instance(component)
132
+
133
+ _setup_middleware(component)
134
+ _setup_routers()
135
+
136
+ log.info("Platform Service dependencies initialized successfully")
137
+
138
+
139
+ async def _start_enterprise_platform_tasks(component: "PlatformServiceComponent") -> None:
140
+ """
141
+ Start enterprise platform background tasks if enterprise package is available.
142
+
143
+ This follows the exact same pattern as WebUI Gateway:
144
+ - Community calls enterprise function
145
+ - Enterprise owns all background task logic
146
+ - Graceful degradation if enterprise not available
147
+
148
+ Background tasks (enterprise-only):
149
+ - Heartbeat listener (deployer monitoring)
150
+ - Deployment status checker (agent deployment monitoring)
151
+ - Agent registry (tracks deployed agents)
152
+
153
+ Args:
154
+ component: PlatformServiceComponent instance
155
+ """
156
+ try:
157
+ from solace_agent_mesh_enterprise.init_enterprise import (
158
+ start_platform_background_tasks,
159
+ )
160
+
161
+ log.info("Starting enterprise platform background tasks...")
162
+ await start_platform_background_tasks(component)
163
+ log.info("Enterprise platform background tasks started successfully")
164
+
165
+ except ImportError:
166
+ log.info(
167
+ "Enterprise package not available - platform background tasks will not start. "
168
+ "Platform Service will run without deployment monitoring and deployer heartbeat tracking."
169
+ )
170
+ except RuntimeError as enterprise_err:
171
+ log.warning(
172
+ "Enterprise platform tasks disabled: %s - Platform Service will continue without deployment monitoring",
173
+ enterprise_err,
174
+ )
175
+ except Exception as enterprise_err:
176
+ log.error(
177
+ "Failed to start enterprise platform tasks: %s - Platform Service will continue",
178
+ enterprise_err,
179
+ exc_info=True,
180
+ )
181
+
182
+
183
+ def _setup_middleware(component: "PlatformServiceComponent"):
184
+ """
185
+ Add middleware to the FastAPI application.
186
+
187
+ 1. CORS middleware - allows cross-origin requests
188
+ 2. OAuth2 middleware - authentication (real token validation)
189
+
190
+ Args:
191
+ component: PlatformServiceComponent instance for configuration access.
192
+ """
193
+ # CORS middleware - automatically trust configured UI origins
194
+ configured_origins = component.get_cors_origins().copy()
195
+
196
+ # Automatically add frontend and platform service URLs as trusted origins
197
+ # These are admin-controlled values that should always be trusted
198
+ frontend_url = os.getenv("FRONTEND_SERVER_URL", "").strip()
199
+ platform_url = os.getenv("PLATFORM_SERVICE_URL", "").strip()
200
+
201
+ # Auto-construct frontend URL if not provided
202
+ if not frontend_url:
203
+ # Read WebUI Gateway configuration from environment variables
204
+ fastapi_host = os.getenv("FASTAPI_HOST", "127.0.0.1").strip()
205
+ fastapi_port = os.getenv("FASTAPI_PORT", "8000").strip()
206
+ ssl_keyfile = os.getenv("SSL_KEYFILE", "").strip()
207
+ ssl_certfile = os.getenv("SSL_CERTFILE", "").strip()
208
+
209
+ # Determine protocol and port based on SSL configuration
210
+ if ssl_keyfile and ssl_certfile:
211
+ protocol = "https"
212
+ port = os.getenv("FASTAPI_HTTPS_PORT", "8443").strip()
213
+ else:
214
+ protocol = "http"
215
+ port = fastapi_port
216
+
217
+ # Use 'localhost' if host is 127.0.0.1 for better compatibility
218
+ host = "localhost" if fastapi_host == "127.0.0.1" else fastapi_host
219
+ frontend_url = f"{protocol}://{host}:{port}"
220
+
221
+ log.info(
222
+ "FRONTEND_SERVER_URL not configured, auto-constructed from WebUI Gateway settings: %s",
223
+ frontend_url
224
+ )
225
+
226
+ auto_trusted_origins = []
227
+ if frontend_url:
228
+ auto_trusted_origins.append(frontend_url)
229
+ if platform_url:
230
+ auto_trusted_origins.append(platform_url)
231
+
232
+ # Combine and deduplicate
233
+ allowed_origins = list(set(auto_trusted_origins + configured_origins))
234
+
235
+ # Get optional regex pattern for CORS origins (useful for local dev with dynamic ports)
236
+ cors_origin_regex = component.get_cors_origin_regex()
237
+
238
+ app.add_middleware(
239
+ CORSMiddleware,
240
+ allow_origins=allowed_origins,
241
+ allow_origin_regex=cors_origin_regex if cors_origin_regex else None,
242
+ allow_credentials=True,
243
+ allow_methods=["*"],
244
+ allow_headers=["*"],
245
+ )
246
+ log.info(f"CORS middleware added with origins: {allowed_origins}")
247
+ if cors_origin_regex:
248
+ log.info(f" CORS origin regex pattern: {cors_origin_regex}")
249
+ if auto_trusted_origins:
250
+ log.info(f" Auto-added trusted origins: {auto_trusted_origins}")
251
+
252
+ # OAuth2 authentication middleware
253
+ from solace_agent_mesh.shared.auth.middleware import create_oauth_middleware
254
+
255
+ oauth_middleware_class = create_oauth_middleware(component)
256
+ app.add_middleware(oauth_middleware_class, component=component)
257
+
258
+ use_auth = component.get_config("frontend_use_authorization", False)
259
+ if use_auth:
260
+ log.info("OAuth2 middleware added (real token validation enabled)")
261
+ else:
262
+ log.info("OAuth2 middleware added (development mode - frontend_use_authorization=false)")
263
+
264
+
265
+ def _setup_routers():
266
+ """
267
+ Mount community and enterprise routers to the FastAPI application.
268
+
269
+ All platform service routers (both community and enterprise) are mounted
270
+ under the PLATFORM_SERVICE_PREFIX. This ensures a consistent API structure
271
+ where /api/v1/platform/* contains all platform management endpoints.
272
+
273
+ Community routers: Loaded from .routers
274
+ Enterprise routers: Dynamically loaded from enterprise package if available
275
+ """
276
+ # Define the platform service API prefix
277
+ # This is the single source of truth for all platform service endpoints
278
+ PLATFORM_SERVICE_PREFIX = "/api/v1/platform"
279
+
280
+ # Load community platform routers
281
+ from .routers import get_community_platform_routers
282
+
283
+ community_routers = get_community_platform_routers()
284
+ for router_config in community_routers:
285
+ app.include_router(
286
+ router_config["router"],
287
+ prefix=PLATFORM_SERVICE_PREFIX,
288
+ tags=router_config["tags"],
289
+ )
290
+ log.info(f"Mounted {len(community_routers)} community platform routers")
291
+
292
+ # Try to load enterprise platform routers
293
+ try:
294
+ from solace_agent_mesh_enterprise.platform_service.routers import get_enterprise_routers
295
+
296
+ enterprise_routers = get_enterprise_routers()
297
+ for router_config in enterprise_routers:
298
+ app.include_router(
299
+ router_config["router"],
300
+ prefix=PLATFORM_SERVICE_PREFIX,
301
+ tags=router_config["tags"],
302
+ )
303
+ log.info(f"Mounted {len(enterprise_routers)} enterprise platform routers under {PLATFORM_SERVICE_PREFIX}")
304
+
305
+ except ImportError:
306
+ log.info(
307
+ "No enterprise package detected - running in community mode (no platform endpoints available)"
308
+ )
309
+ except Exception as e:
310
+ log.warning(f"Failed to load enterprise platform routers: {e}")
311
+
312
+ from solace_agent_mesh.shared.exceptions.exception_handlers import register_exception_handlers
313
+ register_exception_handlers(app)
314
+ log.info("Registered shared exception handlers")
@@ -0,0 +1,51 @@
1
+ """
2
+ OAuth2 authentication middleware for Platform Service.
3
+
4
+ Phase 1: Stub implementation for testing.
5
+ Phase 2: Will be replaced with real OAuth2 token validation.
6
+ """
7
+
8
+ import logging
9
+
10
+ from fastapi import Request
11
+
12
+ log = logging.getLogger(__name__)
13
+
14
+
15
+ async def oauth2_stub_middleware(request: Request, call_next):
16
+ """
17
+ STUB OAuth2 middleware for Phase 1 development and testing.
18
+
19
+ This middleware always sets a fake authenticated user for testing purposes.
20
+ It allows the Platform Service to start and accept requests without requiring
21
+ a real OAuth2 service during initial development.
22
+
23
+ **TODO Phase 2:** Replace this with real OAuth2 token validation:
24
+ 1. Extract token from Authorization header
25
+ 2. Validate token with external OAuth2 service
26
+ 3. Parse user info from token validation response
27
+ 4. Set request.state.user with real user details
28
+ 5. Raise HTTPException(401) if token is invalid/missing
29
+
30
+ Args:
31
+ request: FastAPI Request object.
32
+ call_next: Next middleware/handler in the chain.
33
+
34
+ Returns:
35
+ Response from the next handler.
36
+ """
37
+ # Set stub user data (always authenticated for Phase 1)
38
+ request.state.user = {
39
+ "id": "stub_user",
40
+ "user_id": "stub_user",
41
+ "email": "stub@example.com",
42
+ "name": "Stub User (Phase 1)",
43
+ }
44
+
45
+ log.debug(
46
+ "OAuth2 stub middleware: Set stub user (Phase 1 - REPLACE IN PHASE 2 WITH REAL VALIDATION)"
47
+ )
48
+
49
+ # Call the next handler
50
+ response = await call_next(request)
51
+ return response
@@ -0,0 +1,33 @@
1
+ """
2
+ Community platform routers for Platform Service.
3
+
4
+ Provides foundational platform service endpoints available to all deployments.
5
+ """
6
+
7
+
8
+ def get_community_platform_routers() -> list:
9
+ """
10
+ Return list of community platform routers.
11
+
12
+ Format:
13
+ [
14
+ {
15
+ "router": router_instance,
16
+ "tags": ["Platform"]
17
+ },
18
+ ...
19
+ ]
20
+
21
+ Note: The prefix "/api/v1/platform" is applied by main.py when mounting these routers.
22
+
23
+ Returns:
24
+ Community platform routers list.
25
+ """
26
+ from .health_router import router as health_router
27
+
28
+ return [
29
+ {
30
+ "router": health_router,
31
+ "tags": ["Health"],
32
+ }
33
+ ]
@@ -0,0 +1,31 @@
1
+ """
2
+ Platform Service health check router.
3
+
4
+ Provides health status endpoint for monitoring and load balancer health checks.
5
+ """
6
+
7
+ import logging
8
+ from fastapi import APIRouter
9
+
10
+ log = logging.getLogger(__name__)
11
+
12
+ router = APIRouter()
13
+
14
+
15
+ @router.get("/health", tags=["Health"])
16
+ async def health_check():
17
+ """
18
+ Platform Service health check endpoint.
19
+
20
+ This endpoint is used by:
21
+ - Kubernetes liveness/readiness probes
22
+ - Load balancer health checks (ALB, NGINX)
23
+ - External monitoring systems
24
+
25
+ Returns:
26
+ dict: Health status with service name.
27
+ - status (str): "healthy" if service is operational
28
+ - service (str): Service identifier
29
+ """
30
+ log.debug("Health check endpoint '/api/v1/platform/health' called")
31
+ return {"status": "healthy", "service": "Platform Service"}