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
@@ -1,24 +1,32 @@
1
1
  """
2
2
  API Router for providing frontend configuration.
3
3
  """
4
+ from __future__ import annotations
4
5
 
5
6
  import logging
6
- from fastapi import APIRouter, Depends, HTTPException, status
7
7
  from typing import Dict, Any
8
+ from typing import TYPE_CHECKING
9
+
10
+ from fastapi import APIRouter, Depends, HTTPException, status
8
11
 
12
+ from ..routers.dto.requests.project_requests import CreateProjectRequest
9
13
  from ....gateway.http_sse.dependencies import get_sac_component, get_api_config
10
- from ..routers.dto.requests.project_requests import CreateProjectRequest, UpdateProjectRequest
11
- from typing import TYPE_CHECKING
12
14
 
13
15
  if TYPE_CHECKING:
14
- from gateway.http_sse.component import WebUIBackendComponent
16
+ from ..component import WebUIBackendComponent
15
17
 
16
18
  log = logging.getLogger(__name__)
17
19
 
18
20
  router = APIRouter()
19
21
 
20
22
 
21
- def _get_validation_limits() -> Dict[str, Any]:
23
+ # Default max upload size (50MB) - matches gateway_max_upload_size_bytes default
24
+ DEFAULT_MAX_UPLOAD_SIZE_BYTES = 52428800
25
+ # Default max ZIP upload size (100MB) - for project import ZIP files
26
+ DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES = 104857600
27
+
28
+
29
+ def _get_validation_limits(component: "WebUIBackendComponent" = None) -> Dict[str, Any]:
22
30
  """
23
31
  Extract validation limits from Pydantic models to expose to frontend.
24
32
  This ensures frontend and backend validation limits stay in sync.
@@ -26,13 +34,69 @@ def _get_validation_limits() -> Dict[str, Any]:
26
34
  # Extract limits from CreateProjectRequest model
27
35
  create_fields = CreateProjectRequest.model_fields
28
36
 
37
+ # Get max upload size from component config, with fallback to default
38
+ max_upload_size_bytes = (
39
+ component.get_config("gateway_max_upload_size_bytes", DEFAULT_MAX_UPLOAD_SIZE_BYTES)
40
+ if component else DEFAULT_MAX_UPLOAD_SIZE_BYTES
41
+ )
42
+
43
+ # Get max ZIP upload size from component config, with fallback to default (100MB)
44
+ max_zip_upload_size_bytes = (
45
+ component.get_config("gateway_max_zip_upload_size_bytes", DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES)
46
+ if component else DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES
47
+ )
48
+
29
49
  return {
30
50
  "projectNameMax": create_fields["name"].metadata[1].max_length if create_fields["name"].metadata else 255,
31
51
  "projectDescriptionMax": create_fields["description"].metadata[0].max_length if create_fields["description"].metadata else 1000,
32
52
  "projectInstructionsMax": create_fields["system_prompt"].metadata[0].max_length if create_fields["system_prompt"].metadata else 4000,
53
+ "maxUploadSizeBytes": max_upload_size_bytes,
54
+ "maxZipUploadSizeBytes": max_zip_upload_size_bytes,
33
55
  }
34
56
 
35
57
 
58
+ def _get_background_tasks_config(
59
+ component: "WebUIBackendComponent",
60
+ log_prefix: str
61
+ ) -> Dict[str, Any]:
62
+ """
63
+ Extracts background tasks configuration for the frontend.
64
+
65
+ Returns:
66
+ Dict with background tasks non-boolean settings:
67
+ - default_timeout_ms: Default timeout for background tasks
68
+
69
+ Note: The 'enabled' flag is now in frontend_feature_enablement.background_tasks
70
+ """
71
+ background_config = component.get_config("background_tasks", {})
72
+ default_timeout_ms = background_config.get("default_timeout_ms", 3600000) # 1 hour default
73
+
74
+ return {
75
+ "default_timeout_ms": default_timeout_ms,
76
+ }
77
+
78
+
79
+ def _determine_background_tasks_enabled(
80
+ component: "WebUIBackendComponent",
81
+ log_prefix: str
82
+ ) -> bool:
83
+ """
84
+ Determines if background tasks feature should be enabled.
85
+
86
+ Returns:
87
+ bool: True if background tasks should be enabled
88
+ """
89
+ feature_flags = component.get_config("frontend_feature_enablement", {})
90
+ enabled = feature_flags.get("background_tasks", False)
91
+
92
+ if enabled:
93
+ log.debug("%s Background tasks enabled globally for all agents", log_prefix)
94
+ else:
95
+ log.debug("%s Background tasks disabled", log_prefix)
96
+
97
+ return enabled
98
+
99
+
36
100
  def _determine_projects_enabled(
37
101
  component: "WebUIBackendComponent",
38
102
  api_config: Dict[str, Any],
@@ -96,6 +160,80 @@ async def get_app_config(
96
160
  feature_enablement["taskLogging"] = True
97
161
  log.debug("%s taskLogging feature flag is enabled.", log_prefix)
98
162
 
163
+ # Determine if prompt library should be enabled
164
+ # Prompts require SQL session storage for persistence
165
+ prompt_library_config = component.get_config("prompt_library", {})
166
+ prompt_library_explicitly_enabled = prompt_library_config.get("enabled", True)
167
+
168
+ if prompt_library_explicitly_enabled:
169
+ # Check if SQL persistence is available (REQUIRED for prompts)
170
+ session_config = component.get_config("session_service", {})
171
+ session_type = session_config.get("type", "memory")
172
+
173
+ if session_type != "sql":
174
+ log.warning(
175
+ "%s Prompt library is configured but session_service type is '%s' (not 'sql'). "
176
+ "Disabling prompt library for frontend.",
177
+ log_prefix,
178
+ session_type
179
+ )
180
+ prompt_library_enabled = False
181
+ else:
182
+ prompt_library_enabled = True
183
+ feature_enablement["promptLibrary"] = True
184
+ log.debug("%s promptLibrary feature flag is enabled.", log_prefix)
185
+
186
+ # Check AI-assisted sub-feature (only if parent is enabled)
187
+ ai_assisted_config = prompt_library_config.get("ai_assisted", {})
188
+ ai_assisted_enabled = ai_assisted_config.get("enabled", True)
189
+
190
+ if ai_assisted_enabled:
191
+ # Verify LLM is configured through the model config
192
+ model_config = component.get_config("model", {})
193
+
194
+ llm_model = None
195
+ if isinstance(model_config, dict):
196
+ llm_model = model_config.get("model")
197
+
198
+ if llm_model:
199
+ feature_enablement["promptAIAssisted"] = True
200
+ log.debug("%s promptAIAssisted feature flag is enabled.", log_prefix)
201
+ else:
202
+ feature_enablement["promptAIAssisted"] = False
203
+ log.warning(
204
+ "%s AI-assisted prompts disabled: model not configured",
205
+ log_prefix
206
+ )
207
+ else:
208
+ feature_enablement["promptAIAssisted"] = False
209
+
210
+ # Check version history sub-feature (only if parent is enabled)
211
+ version_history_config = prompt_library_config.get("version_history", {})
212
+ version_history_enabled = version_history_config.get("enabled", True)
213
+
214
+ if version_history_enabled:
215
+ feature_enablement["promptVersionHistory"] = True
216
+ log.debug("%s promptVersionHistory feature flag is enabled.", log_prefix)
217
+ else:
218
+ feature_enablement["promptVersionHistory"] = False
219
+
220
+ # Check prompt sharing sub-feature (only if parent is enabled)
221
+ sharing_config = prompt_library_config.get("sharing", {})
222
+ sharing_enabled = sharing_config.get("enabled", False)
223
+
224
+ if sharing_enabled:
225
+ feature_enablement["promptSharing"] = True
226
+ log.debug("%s promptSharing feature flag is enabled.", log_prefix)
227
+ else:
228
+ feature_enablement["promptSharing"] = False
229
+ else:
230
+ # Explicitly set to false when disabled
231
+ feature_enablement["promptLibrary"] = False
232
+ feature_enablement["promptAIAssisted"] = False
233
+ feature_enablement["promptVersionHistory"] = False
234
+ feature_enablement["promptSharing"] = False
235
+ log.info("%s Prompt library feature is explicitly disabled.", log_prefix)
236
+
99
237
  # Determine if feedback should be enabled
100
238
  # Feedback requires SQL session storage for persistence
101
239
  feedback_enabled = component.get_config("frontend_collect_feedback", False)
@@ -119,24 +257,111 @@ async def get_app_config(
119
257
  log.debug("%s Projects feature flag is enabled.", log_prefix)
120
258
  else:
121
259
  log.debug("%s Projects feature flag is disabled.", log_prefix)
260
+
261
+
262
+ # Determine if background tasks should be enabled
263
+ background_tasks_enabled = _determine_background_tasks_enabled(component, log_prefix)
264
+ feature_enablement["background_tasks"] = background_tasks_enabled
265
+ if background_tasks_enabled:
266
+ log.debug("%s Background tasks feature flag is enabled.", log_prefix)
267
+ else:
268
+ log.debug("%s Background tasks feature flag is disabled.", log_prefix)
269
+
270
+ # Check tool configuration status
271
+ tool_config_status = {}
272
+
273
+ # Check TTS configuration from component config (not environment variables)
274
+ speech_config = component.get_config("speech", {})
275
+ tts_config = speech_config.get("tts", {})
276
+
277
+ # Check if speech/TTS section is defined in config
278
+ # If not defined, disable TTS even if keys might be present elsewhere
279
+ if not speech_config or not tts_config:
280
+ log.debug("%s TTS disabled: speech.tts section not configured", log_prefix)
281
+ tts_configured = False
282
+ tts_provider = "gemini" # Default fallback
283
+ else:
284
+ # Get provider from config (with fallback to default)
285
+ preferred_provider = tts_config.get("provider", "gemini").lower()
286
+
287
+ # Check which providers are configured
288
+ gemini_config = tts_config.get("gemini", {})
289
+ azure_config = tts_config.get("azure", {})
290
+ polly_config = tts_config.get("polly", {})
291
+
292
+ gemini_key = gemini_config.get("api_key")
293
+ azure_speech_key = azure_config.get("api_key")
294
+ azure_speech_region = azure_config.get("region")
295
+ aws_access_key = polly_config.get("aws_access_key_id")
296
+ aws_secret_key = polly_config.get("aws_secret_access_key")
297
+
298
+ # Determine which providers are available
299
+ gemini_available = bool(gemini_key)
300
+ azure_available = bool(azure_speech_key and azure_speech_region)
301
+ polly_available = bool(aws_access_key and aws_secret_key)
302
+ tts_configured = gemini_available or azure_available or polly_available
303
+ tool_config_status["text_to_speech"] = tts_configured
304
+
305
+ # Determine TTS provider based on preference and availability
306
+ if preferred_provider == "azure" and azure_available:
307
+ tts_provider = "azure"
308
+ elif preferred_provider == "gemini" and gemini_available:
309
+ tts_provider = "gemini"
310
+ elif preferred_provider == "polly" and polly_available:
311
+ tts_provider = "polly"
312
+ elif gemini_available:
313
+ # Default to Gemini if available
314
+ tts_provider = "gemini"
315
+ elif azure_available:
316
+ # Fall back to Azure if Gemini not available
317
+ tts_provider = "azure"
318
+ elif polly_available:
319
+ # Fall back to Polly if others not available
320
+ tts_provider = "polly"
321
+ else:
322
+ # No provider available, default to gemini (will use browser fallback)
323
+ tts_provider = "gemini"
324
+
325
+ if tts_configured:
326
+ log.debug("%s TTS is configured (API keys present, provider: %s)", log_prefix, tts_provider)
327
+ if preferred_provider and preferred_provider != tts_provider:
328
+ log.warning(
329
+ "%s TTS_PROVIDER set to '%s' but using '%s' (preferred provider not available)",
330
+ log_prefix, preferred_provider, tts_provider
331
+ )
332
+ else:
333
+ log.debug("%s TTS not configured (no API keys found)", log_prefix)
334
+
335
+ # TTS settings - enable if API keys are present
336
+ tts_settings = {
337
+ "textToSpeech": tts_configured,
338
+ "engineTTS": "external" if tts_configured else "browser",
339
+ "ttsProvider": tts_provider,
340
+ }
341
+
342
+ platform_config = component.get_config("platform_service", {})
343
+ platform_service_url = platform_config.get("url", "")
122
344
 
123
345
  config_data = {
124
- "frontend_server_url": "",
346
+ "frontend_server_url": component.frontend_server_url,
347
+ "frontend_platform_server_url": platform_service_url,
125
348
  "frontend_auth_login_url": component.get_config(
126
349
  "frontend_auth_login_url", ""
127
350
  ),
128
- "frontend_use_authorization": component.get_config(
129
- "frontend_use_authorization", False
130
- ),
351
+ "frontend_use_authorization": component.get_config("frontend_use_authorization", False),
131
352
  "frontend_welcome_message": component.get_config(
132
353
  "frontend_welcome_message", ""
133
354
  ),
134
355
  "frontend_redirect_url": component.get_config("frontend_redirect_url", ""),
135
356
  "frontend_collect_feedback": feedback_enabled,
136
357
  "frontend_bot_name": component.get_config("frontend_bot_name", "A2A Agent"),
358
+ "frontend_logo_url": component.get_config("frontend_logo_url", ""),
137
359
  "frontend_feature_enablement": feature_enablement,
138
360
  "persistence_enabled": api_config.get("persistence_enabled", False),
139
- "validation_limits": _get_validation_limits(),
361
+ "validation_limits": _get_validation_limits(component),
362
+ "tool_config_status": tool_config_status,
363
+ "tts_settings": tts_settings,
364
+ "background_tasks_config": _get_background_tasks_config(component, log_prefix),
140
365
  }
141
366
  log.debug("%sReturning frontend configuration.", log_prefix)
142
367
  return config_data
@@ -0,0 +1,69 @@
1
+ """
2
+ Project export/import DTOs.
3
+ """
4
+
5
+ from typing import Optional, List, Dict, Any
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class ArtifactMetadata(BaseModel):
10
+ """Metadata for an artifact in export"""
11
+ filename: str
12
+ mime_type: str = Field(alias="mimeType")
13
+ size: int
14
+ metadata: Dict[str, Any] = {}
15
+
16
+ model_config = {"populate_by_name": True}
17
+
18
+
19
+ class ProjectExportMetadata(BaseModel):
20
+ """Metadata for exported project"""
21
+ original_created_at: int = Field(alias="originalCreatedAt")
22
+ artifact_count: int = Field(alias="artifactCount")
23
+ total_size_bytes: int = Field(alias="totalSizeBytes")
24
+
25
+ model_config = {"populate_by_name": True}
26
+
27
+
28
+ class ProjectExportData(BaseModel):
29
+ """Project data in export format"""
30
+ name: str
31
+ description: Optional[str] = None
32
+ system_prompt: Optional[str] = Field(default=None, alias="systemPrompt")
33
+ default_agent_id: Optional[str] = Field(default=None, alias="defaultAgentId")
34
+ metadata: ProjectExportMetadata
35
+
36
+ model_config = {"populate_by_name": True}
37
+
38
+
39
+ class ProjectExportFormat(BaseModel):
40
+ """Complete export format"""
41
+ version: str = "1.0"
42
+ exported_at: int = Field(alias="exportedAt")
43
+ project: ProjectExportData
44
+ artifacts: List[ArtifactMetadata] = []
45
+
46
+ model_config = {"populate_by_name": True}
47
+
48
+
49
+ class ProjectImportOptions(BaseModel):
50
+ """Options for project import"""
51
+ preserve_name: bool = Field(default=False, alias="preserveName")
52
+ custom_name: Optional[str] = Field(default=None, alias="customName")
53
+
54
+ model_config = {"populate_by_name": True}
55
+
56
+
57
+ class ProjectImportRequest(BaseModel):
58
+ """Request for importing project"""
59
+ options: ProjectImportOptions
60
+
61
+
62
+ class ProjectImportResponse(BaseModel):
63
+ """Response after importing project"""
64
+ project_id: str = Field(alias="projectId")
65
+ name: str
66
+ artifacts_imported: int = Field(alias="artifactsImported")
67
+ warnings: List[str] = []
68
+
69
+ model_config = {"populate_by_name": True}
@@ -0,0 +1,255 @@
1
+ """
2
+ Pydantic models for prompt library API.
3
+ """
4
+
5
+ from typing import Any, Dict, List, Optional
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class PromptBase(BaseModel):
10
+ """Base schema for Prompt"""
11
+ prompt_text: str = Field(
12
+ ...,
13
+ min_length=1,
14
+ max_length=10000,
15
+ description="The prompt text content",
16
+ alias="promptText"
17
+ )
18
+
19
+ class Config:
20
+ populate_by_name = True
21
+
22
+
23
+ class PromptCreate(PromptBase):
24
+ """Schema for creating a new prompt version"""
25
+ pass
26
+
27
+
28
+ class PromptResponse(PromptBase):
29
+ """Schema for prompt response"""
30
+ id: str
31
+ group_id: str = Field(alias="groupId")
32
+ user_id: str = Field(alias="userId")
33
+ version: int
34
+ # Versioned metadata fields
35
+ name: Optional[str] = Field(None, description="Prompt name at this version")
36
+ description: Optional[str] = Field(None, description="Prompt description at this version")
37
+ category: Optional[str] = Field(None, description="Prompt category at this version")
38
+ command: Optional[str] = Field(None, description="Prompt command at this version")
39
+ created_at: int = Field(alias="createdAt") # epoch milliseconds
40
+ updated_at: int = Field(alias="updatedAt") # epoch milliseconds
41
+
42
+ class Config:
43
+ from_attributes = True
44
+ populate_by_name = True
45
+
46
+
47
+ class PromptGroupBase(BaseModel):
48
+ """Base schema for PromptGroup"""
49
+ name: str = Field(
50
+ ...,
51
+ min_length=1,
52
+ max_length=255,
53
+ description="Name of the prompt group"
54
+ )
55
+ description: Optional[str] = Field(
56
+ None,
57
+ max_length=1000,
58
+ description="Short description"
59
+ )
60
+ category: Optional[str] = Field(
61
+ None,
62
+ max_length=100,
63
+ description="Category for organization"
64
+ )
65
+ command: Optional[str] = Field(
66
+ None,
67
+ min_length=1,
68
+ max_length=50,
69
+ pattern="^[a-zA-Z0-9_-]+$",
70
+ description="Shorthand command (alphanumeric, dash, underscore only)"
71
+ )
72
+
73
+
74
+ class PromptGroupCreate(PromptGroupBase):
75
+ """Schema for creating a new prompt group"""
76
+ initial_prompt: str = Field(
77
+ ...,
78
+ min_length=1,
79
+ max_length=10000,
80
+ description="Initial prompt text"
81
+ )
82
+
83
+
84
+ class PromptGroupUpdate(BaseModel):
85
+ """Schema for updating a prompt group"""
86
+ name: Optional[str] = Field(None, min_length=1, max_length=255)
87
+ description: Optional[str] = Field(None, max_length=1000)
88
+ category: Optional[str] = Field(None, max_length=100)
89
+ command: Optional[str] = Field(
90
+ None,
91
+ min_length=1,
92
+ max_length=50,
93
+ pattern="^[a-zA-Z0-9_-]+$"
94
+ )
95
+ initial_prompt: Optional[str] = Field(
96
+ None,
97
+ min_length=1,
98
+ max_length=10000,
99
+ description="Updated prompt text (creates new version if changed)"
100
+ )
101
+
102
+
103
+ class PromptGroupResponse(PromptGroupBase):
104
+ """Schema for prompt group response"""
105
+ id: str
106
+ user_id: str = Field(alias="userId")
107
+ author_name: Optional[str] = Field(None, alias="authorName")
108
+ production_prompt_id: Optional[str] = Field(None, alias="productionPromptId")
109
+ is_shared: bool = Field(alias="isShared")
110
+ is_pinned: bool = Field(alias="isPinned")
111
+ created_at: int = Field(alias="createdAt") # epoch milliseconds
112
+ updated_at: int = Field(alias="updatedAt") # epoch milliseconds
113
+
114
+ # Include production prompt if available
115
+ production_prompt: Optional[PromptResponse] = Field(None, alias="productionPrompt")
116
+
117
+ class Config:
118
+ from_attributes = True
119
+ populate_by_name = True
120
+
121
+
122
+ class PromptGroupListResponse(BaseModel):
123
+ """Schema for paginated prompt group list"""
124
+ groups: List[PromptGroupResponse]
125
+ total: int
126
+ skip: int
127
+ limit: int
128
+
129
+
130
+ # AI-Assisted Prompt Builder Models
131
+
132
+ class ChatMessage(BaseModel):
133
+ """Schema for a chat message"""
134
+ role: str = Field(
135
+ ...,
136
+ pattern="^(user|assistant)$",
137
+ description="Message role"
138
+ )
139
+ content: str = Field(..., min_length=1, description="Message content")
140
+
141
+
142
+ class PromptBuilderChatRequest(BaseModel):
143
+ """Schema for prompt builder chat request"""
144
+ message: str = Field(
145
+ ...,
146
+ min_length=1,
147
+ max_length=200000,
148
+ description="User message (supports long conversation histories for template creation)"
149
+ )
150
+ conversation_history: List[ChatMessage] = Field(
151
+ default_factory=list,
152
+ description="Previous messages"
153
+ )
154
+ current_template: Optional[Dict[str, Any]] = Field(
155
+ None,
156
+ description="Current template state"
157
+ )
158
+
159
+
160
+ class PromptBuilderChatResponse(BaseModel):
161
+ """Schema for prompt builder chat response"""
162
+ message: str = Field(..., description="Assistant's response message")
163
+ template_updates: Dict[str, Any] = Field(
164
+ default_factory=dict,
165
+ description="Updates to template config"
166
+ )
167
+ confidence: float = Field(
168
+ 0.0,
169
+ ge=0.0,
170
+ le=1.0,
171
+ description="Confidence score"
172
+ )
173
+ ready_to_save: bool = Field(
174
+ False,
175
+ description="Whether template is ready to save"
176
+ )
177
+
178
+
179
+ # Export/Import Models
180
+
181
+ class PromptExportMetadata(BaseModel):
182
+ """Metadata for exported prompt"""
183
+ author_name: Optional[str] = Field(None, alias="authorName")
184
+ original_version: int = Field(alias="originalVersion")
185
+ original_created_at: int = Field(alias="originalCreatedAt")
186
+
187
+ class Config:
188
+ populate_by_name = True
189
+
190
+
191
+ class PromptExportData(BaseModel):
192
+ """Data structure for exported prompt"""
193
+ name: str
194
+ description: Optional[str] = None
195
+ category: Optional[str] = None
196
+ command: Optional[str] = None
197
+ prompt_text: str = Field(alias="promptText")
198
+ metadata: PromptExportMetadata
199
+
200
+ class Config:
201
+ populate_by_name = True
202
+
203
+
204
+ class PromptExportResponse(BaseModel):
205
+ """Schema for exported prompt file"""
206
+ version: str = "1.0"
207
+ exported_at: int = Field(alias="exportedAt")
208
+ prompt: PromptExportData
209
+
210
+ class Config:
211
+ populate_by_name = True
212
+ by_alias = True
213
+
214
+
215
+ class PromptImportOptions(BaseModel):
216
+ """Options for importing a prompt"""
217
+ preserve_command: bool = Field(
218
+ False,
219
+ alias="preserveCommand",
220
+ description="If true, attempt to keep original command (may be modified if conflict exists)"
221
+ )
222
+ preserve_category: bool = Field(
223
+ True,
224
+ alias="preserveCategory",
225
+ description="If true, keep the original category"
226
+ )
227
+
228
+ class Config:
229
+ populate_by_name = True
230
+
231
+
232
+ class PromptImportRequest(BaseModel):
233
+ """Schema for importing a prompt"""
234
+ prompt_data: Dict[str, Any] = Field(
235
+ ...,
236
+ description="The exported prompt JSON data"
237
+ )
238
+ options: Optional[PromptImportOptions] = Field(
239
+ default_factory=PromptImportOptions,
240
+ description="Import options"
241
+ )
242
+
243
+
244
+ class PromptImportResponse(BaseModel):
245
+ """Schema for import response"""
246
+ success: bool
247
+ prompt_group_id: str = Field(alias="promptGroupId")
248
+ warnings: List[str] = Field(
249
+ default_factory=list,
250
+ description="Any warnings generated during import (e.g., command conflicts)"
251
+ )
252
+
253
+ class Config:
254
+ populate_by_name = True
255
+ by_alias = True
@@ -5,7 +5,7 @@ Session-related request DTOs.
5
5
  from typing import Optional
6
6
  from pydantic import BaseModel, Field
7
7
 
8
- from ....shared.types import SessionId, UserId
8
+ from solace_agent_mesh.shared.utils.types import SessionId, UserId
9
9
 
10
10
 
11
11
  class GetSessionRequest(BaseModel):
@@ -6,7 +6,7 @@ from typing import Any
6
6
 
7
7
  from pydantic import BaseModel, ConfigDict
8
8
 
9
- from ....shared import epoch_ms_to_iso8601
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import epoch_ms_to_iso8601
10
10
 
11
11
 
12
12
  class BaseTimestampResponse(BaseModel):
@@ -17,6 +17,7 @@ class ProjectResponse(BaseTimestampResponse):
17
17
  description: Optional[str] = None
18
18
  system_prompt: Optional[str] = Field(default=None, alias="systemPrompt")
19
19
  default_agent_id: Optional[str] = Field(default=None, alias="defaultAgentId")
20
+ artifact_count: Optional[int] = Field(default=None, alias="artifactCount")
20
21
  created_at: int = Field(alias="createdAt")
21
22
  updated_at: Optional[int] = Field(default=None, alias="updatedAt")
22
23
 
@@ -4,8 +4,8 @@ Session-related response DTOs.
4
4
 
5
5
  from pydantic import BaseModel, ConfigDict, Field
6
6
 
7
- from ....shared.pagination import PaginationMeta
8
- from ....shared.types import SessionId, UserId
7
+ from solace_agent_mesh.shared.api.pagination import PaginationMeta
8
+ from solace_agent_mesh.shared.utils.types import SessionId, UserId
9
9
  from .base_responses import BaseTimestampResponse
10
10
 
11
11
 
@@ -18,6 +18,7 @@ class SessionResponse(BaseTimestampResponse):
18
18
  agent_id: str | None = Field(default=None, alias="agentId")
19
19
  project_id: str | None = Field(default=None, alias="projectId")
20
20
  project_name: str | None = Field(default=None, alias="projectName")
21
+ has_running_background_task: bool = Field(default=False, alias="hasRunningBackgroundTask")
21
22
  created_time: int = Field(alias="createdTime")
22
23
  updated_time: int | None = Field(default=None, alias="updatedTime")
23
24