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

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

Potentially problematic release.


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

Files changed (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,159 @@
1
+ """
2
+ Prompt SQLAlchemy models for prompt library feature.
3
+ """
4
+
5
+ from enum import Enum
6
+ from sqlalchemy import BigInteger, Column, String, Text, Integer, Boolean, ForeignKey, UniqueConstraint, Enum as SQLEnum
7
+ from sqlalchemy.orm import relationship
8
+
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
10
+ from .base import Base
11
+
12
+
13
+ class PromptGroupRole(str, Enum):
14
+ """Valid roles for prompt group users."""
15
+ OWNER = "owner"
16
+ EDITOR = "editor"
17
+ VIEWER = "viewer"
18
+
19
+
20
+ class PromptGroupModel(Base):
21
+ """SQLAlchemy model for prompt groups"""
22
+
23
+ __tablename__ = "prompt_groups"
24
+
25
+ # Primary key - String type (not UUID)
26
+ id = Column(String, primary_key=True)
27
+
28
+ # Core fields
29
+ name = Column(String(255), nullable=False, index=True)
30
+ description = Column(Text, nullable=True)
31
+ category = Column(String(100), nullable=True, index=True)
32
+ command = Column(String(50), nullable=True, unique=True, index=True)
33
+
34
+ # Ownership
35
+ user_id = Column(String, nullable=False, index=True)
36
+ author_name = Column(String(255), nullable=True)
37
+
38
+ # Production prompt reference
39
+ production_prompt_id = Column(
40
+ String,
41
+ ForeignKey("prompts.id", ondelete="SET NULL"),
42
+ nullable=True
43
+ )
44
+
45
+ # Sharing (optional - for future enhancement)
46
+ is_shared = Column(Boolean, default=False, nullable=False)
47
+
48
+ # User preferences
49
+ is_pinned = Column(Boolean, default=False, nullable=False, index=True)
50
+
51
+ # Timestamps - BigInteger (epoch milliseconds) to match SAM convention
52
+ created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
53
+ updated_at = Column(
54
+ BigInteger,
55
+ nullable=False,
56
+ default=now_epoch_ms,
57
+ onupdate=now_epoch_ms
58
+ )
59
+
60
+ # Relationships
61
+ prompts = relationship(
62
+ "PromptModel",
63
+ back_populates="group",
64
+ foreign_keys="PromptModel.group_id",
65
+ cascade="all, delete-orphan"
66
+ )
67
+ production_prompt = relationship(
68
+ "PromptModel",
69
+ foreign_keys=[production_prompt_id],
70
+ post_update=True
71
+ )
72
+ prompt_group_users = relationship(
73
+ "PromptGroupUserModel",
74
+ back_populates="prompt_group",
75
+ cascade="all, delete-orphan"
76
+ )
77
+
78
+ def __repr__(self):
79
+ return f"<PromptGroupModel(id={self.id}, name={self.name}, command={self.command})>"
80
+
81
+
82
+ class PromptModel(Base):
83
+ """SQLAlchemy model for individual prompt versions"""
84
+
85
+ __tablename__ = "prompts"
86
+
87
+ # Primary key - String type (not UUID)
88
+ id = Column(String, primary_key=True)
89
+
90
+ # Content
91
+ prompt_text = Column(Text, nullable=False)
92
+
93
+ # Versioned metadata fields (copied from group at version creation time)
94
+ name = Column(String(255), nullable=True)
95
+ description = Column(Text, nullable=True)
96
+ category = Column(String(100), nullable=True)
97
+ command = Column(String(50), nullable=True)
98
+
99
+ # Group relationship
100
+ group_id = Column(
101
+ String,
102
+ ForeignKey("prompt_groups.id", ondelete="CASCADE"),
103
+ nullable=False,
104
+ index=True
105
+ )
106
+
107
+ # Ownership
108
+ user_id = Column(String, nullable=False, index=True)
109
+
110
+ # Versioning
111
+ version = Column(Integer, default=1, nullable=False)
112
+
113
+ # Timestamps - BigInteger (epoch milliseconds)
114
+ created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
115
+ updated_at = Column(
116
+ BigInteger,
117
+ nullable=False,
118
+ default=now_epoch_ms,
119
+ onupdate=now_epoch_ms
120
+ )
121
+
122
+ # Relationships
123
+ group = relationship(
124
+ "PromptGroupModel",
125
+ back_populates="prompts",
126
+ foreign_keys=[group_id]
127
+ )
128
+
129
+ def __repr__(self):
130
+ return f"<PromptModel(id={self.id}, group_id={self.group_id}, version={self.version})>"
131
+
132
+
133
+ class PromptGroupUserModel(Base):
134
+ """
135
+ SQLAlchemy model for prompt group user access.
136
+
137
+ This junction table tracks which users have access to which prompt groups,
138
+ enabling multi-user collaboration on prompts with role-based permissions.
139
+ """
140
+
141
+ __tablename__ = "prompt_group_users"
142
+
143
+ id = Column(String, primary_key=True)
144
+ prompt_group_id = Column(String, ForeignKey("prompt_groups.id", ondelete="CASCADE"), nullable=False)
145
+ user_id = Column(String, nullable=False)
146
+ role = Column(SQLEnum(PromptGroupRole), nullable=False, default=PromptGroupRole.VIEWER)
147
+ added_at = Column(BigInteger, nullable=False) # Epoch timestamp in milliseconds
148
+ added_by_user_id = Column(String, nullable=False) # User who granted access
149
+
150
+ # Ensure a user can only be added once per prompt group
151
+ __table_args__ = (
152
+ UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user'),
153
+ )
154
+
155
+ # Relationships
156
+ prompt_group = relationship("PromptGroupModel", back_populates="prompt_group_users")
157
+
158
+ def __repr__(self):
159
+ return f"<PromptGroupUserModel(id={self.id}, prompt_group_id={self.prompt_group_id}, user_id={self.user_id}, role={self.role})>"
@@ -2,11 +2,11 @@
2
2
  Session SQLAlchemy model and Pydantic models for strongly-typed operations.
3
3
  """
4
4
 
5
+ from sqlalchemy import BigInteger, Column, String, ForeignKey
5
6
  from pydantic import BaseModel
6
- from sqlalchemy import BigInteger, Column, String
7
7
  from sqlalchemy.orm import relationship
8
8
 
9
- from ...shared import now_epoch_ms
9
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
10
10
  from .base import Base
11
11
 
12
12
 
@@ -19,15 +19,19 @@ class SessionModel(Base):
19
19
  name = Column(String, nullable=True)
20
20
  user_id = Column(String, nullable=False)
21
21
  agent_id = Column(String, nullable=True)
22
+ project_id = Column(String, ForeignKey("projects.id"), nullable=True)
22
23
  created_time = Column(BigInteger, nullable=False, default=now_epoch_ms)
23
24
  updated_time = Column(
24
25
  BigInteger, nullable=False, default=now_epoch_ms, onupdate=now_epoch_ms
25
26
  )
27
+ deleted_at = Column(BigInteger, nullable=True)
28
+ deleted_by = Column(String, nullable=True)
26
29
 
27
30
  # Relationship to chat tasks
28
31
  chat_tasks = relationship(
29
32
  "ChatTaskModel", back_populates="session", cascade="all, delete-orphan"
30
33
  )
34
+ project = relationship("ProjectModel", back_populates="sessions")
31
35
 
32
36
 
33
37
  class CreateSessionModel(BaseModel):
@@ -36,6 +40,7 @@ class CreateSessionModel(BaseModel):
36
40
  name: str | None
37
41
  user_id: str
38
42
  agent_id: str | None
43
+ project_id: str | None = None
39
44
  created_time: int
40
45
  updated_time: int
41
46
 
@@ -44,4 +49,5 @@ class UpdateSessionModel(BaseModel):
44
49
  """Pydantic model for updating a session."""
45
50
  name: str | None = None
46
51
  agent_id: str | None = None
52
+ project_id: str | None = None
47
53
  updated_time: int
@@ -2,7 +2,7 @@
2
2
  Task SQLAlchemy model.
3
3
  """
4
4
 
5
- from sqlalchemy import BigInteger, Column, Integer, JSON, String, Text
5
+ from sqlalchemy import BigInteger, Boolean, Column, Integer, JSON, String, Text
6
6
  from sqlalchemy.orm import relationship
7
7
 
8
8
  from .base import Base
@@ -15,6 +15,7 @@ class TaskModel(Base):
15
15
 
16
16
  id = Column(String, primary_key=True)
17
17
  user_id = Column(String, nullable=False, index=True)
18
+ parent_task_id = Column(String, nullable=True, index=True)
18
19
  start_time = Column(BigInteger, nullable=False)
19
20
  end_time = Column(BigInteger, nullable=True)
20
21
  status = Column(String, nullable=True)
@@ -25,6 +26,12 @@ class TaskModel(Base):
25
26
  total_output_tokens = Column(Integer, nullable=True)
26
27
  total_cached_input_tokens = Column(Integer, nullable=True)
27
28
  token_usage_details = Column(JSON, nullable=True)
29
+
30
+ # Background task execution columns
31
+ execution_mode = Column(String(20), nullable=True, default="foreground", index=True)
32
+ last_activity_time = Column(BigInteger, nullable=True, index=True)
33
+ background_execution_enabled = Column(Boolean, nullable=True, default=False)
34
+ max_execution_time_ms = Column(BigInteger, nullable=True)
28
35
 
29
36
  # Relationship to events
30
37
  events = relationship(
@@ -0,0 +1,172 @@
1
+ """
2
+ Repository implementation for project data access operations.
3
+ """
4
+ from typing import List, Optional
5
+ import uuid
6
+
7
+ from sqlalchemy.orm import Session as DBSession
8
+ from sqlalchemy import or_
9
+
10
+ from .interfaces import IProjectRepository
11
+ from .models import ProjectModel, ProjectUserModel
12
+ from .entities.project import Project
13
+ from ..routers.dto.requests.project_requests import ProjectFilter
14
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
15
+
16
+
17
+ class ProjectRepository(IProjectRepository):
18
+ """SQLAlchemy implementation of project repository."""
19
+
20
+ def __init__(self, db: DBSession):
21
+ self.db = db
22
+
23
+ def create_project(self, name: str, user_id: str, description: Optional[str] = None,
24
+ system_prompt: Optional[str] = None, default_agent_id: Optional[str] = None) -> Project:
25
+ """Create a new user project."""
26
+ model = ProjectModel(
27
+ id=str(uuid.uuid4()),
28
+ name=name,
29
+ user_id=user_id,
30
+ description=description,
31
+ system_prompt=system_prompt,
32
+ default_agent_id=default_agent_id,
33
+ created_at=now_epoch_ms(),
34
+ )
35
+ self.db.add(model)
36
+ self.db.flush()
37
+ self.db.refresh(model)
38
+ return self._model_to_entity(model)
39
+
40
+ def get_user_projects(self, user_id: str) -> List[Project]:
41
+ """
42
+ Get all projects owned by a specific user.
43
+
44
+ Note: This returns only projects where the user is the owner (user_id matches).
45
+ For projects the user has access to via project_users table, use get_accessible_projects().
46
+ """
47
+ models = self.db.query(ProjectModel).filter(
48
+ ProjectModel.user_id == user_id,
49
+ ProjectModel.deleted_at.is_(None) # Exclude soft-deleted projects
50
+ ).all()
51
+ return [self._model_to_entity(model) for model in models]
52
+
53
+ def get_accessible_projects(self, user_id: str) -> List[Project]:
54
+ """
55
+ Get all projects accessible by a user (owned or shared).
56
+
57
+ This includes:
58
+ - Projects owned by the user (user_id matches)
59
+ - Projects shared with the user (via project_users table)
60
+
61
+ Args:
62
+ user_id: The user ID
63
+
64
+ Returns:
65
+ List[Project]: List of accessible projects
66
+ """
67
+ # Query for projects where user is owner OR has access via project_users
68
+ models = self.db.query(ProjectModel).outerjoin(
69
+ ProjectUserModel,
70
+ ProjectModel.id == ProjectUserModel.project_id
71
+ ).filter(
72
+ ProjectModel.deleted_at.is_(None), # Exclude soft-deleted projects
73
+ or_(
74
+ ProjectModel.user_id == user_id,
75
+ ProjectUserModel.user_id == user_id
76
+ )
77
+ ).distinct().all()
78
+
79
+ return [self._model_to_entity(model) for model in models]
80
+
81
+ def get_filtered_projects(self, project_filter: ProjectFilter) -> List[Project]:
82
+ """Get projects based on filter criteria."""
83
+ query = self.db.query(ProjectModel).filter(
84
+ ProjectModel.deleted_at.is_(None) # Exclude soft-deleted projects
85
+ )
86
+
87
+ if project_filter.user_id is not None:
88
+ query = query.filter(ProjectModel.user_id == project_filter.user_id)
89
+
90
+ models = query.all()
91
+ return [self._model_to_entity(model) for model in models]
92
+
93
+ def get_by_id(self, project_id: str, user_id: str) -> Optional[Project]:
94
+ """
95
+ Get a project by its ID, ensuring user access.
96
+
97
+ This checks if the user is the owner OR has access via project_users table.
98
+ """
99
+ model = self.db.query(ProjectModel).outerjoin(
100
+ ProjectUserModel,
101
+ ProjectModel.id == ProjectUserModel.project_id
102
+ ).filter(
103
+ ProjectModel.id == project_id,
104
+ ProjectModel.deleted_at.is_(None), # Exclude soft-deleted projects
105
+ or_(
106
+ ProjectModel.user_id == user_id,
107
+ ProjectUserModel.user_id == user_id
108
+ )
109
+ ).first()
110
+
111
+ return self._model_to_entity(model) if model else None
112
+
113
+ def update(self, project_id: str, user_id: str, update_data: dict) -> Optional[Project]:
114
+ """Update a project with the given data, ensuring user access."""
115
+ model = self.db.query(ProjectModel).filter(
116
+ ProjectModel.id == project_id,
117
+ ProjectModel.user_id == user_id, # Only allow updates to user's own projects
118
+ ProjectModel.deleted_at.is_(None) # Exclude soft-deleted projects
119
+ ).first()
120
+
121
+ if not model:
122
+ return None
123
+
124
+ for field, value in update_data.items():
125
+ if hasattr(model, field):
126
+ setattr(model, field, value)
127
+
128
+ model.updated_at = now_epoch_ms()
129
+ self.db.flush()
130
+ self.db.refresh(model)
131
+ return self._model_to_entity(model)
132
+
133
+ def delete(self, project_id: str, user_id: str) -> bool:
134
+ """Delete a project by its ID, ensuring user access."""
135
+ result = self.db.query(ProjectModel).filter(
136
+ ProjectModel.id == project_id,
137
+ ProjectModel.user_id == user_id # Only allow deletion of user's own projects
138
+ ).delete()
139
+ self.db.flush()
140
+ return result > 0
141
+
142
+ def soft_delete(self, project_id: str, user_id: str) -> bool:
143
+ """Soft delete a project by its ID, ensuring user access."""
144
+ model = self.db.query(ProjectModel).filter(
145
+ ProjectModel.id == project_id,
146
+ ProjectModel.user_id == user_id, # Only allow deletion of user's own projects
147
+ ProjectModel.deleted_at.is_(None) # Only delete if not already deleted
148
+ ).first()
149
+
150
+ if not model:
151
+ return False
152
+
153
+ model.deleted_at = now_epoch_ms()
154
+ model.deleted_by = user_id
155
+ model.updated_at = now_epoch_ms()
156
+ self.db.flush()
157
+ return True
158
+
159
+ def _model_to_entity(self, model: ProjectModel) -> Project:
160
+ """Convert SQLAlchemy model to domain entity."""
161
+ return Project(
162
+ id=model.id,
163
+ name=model.name,
164
+ user_id=model.user_id,
165
+ description=model.description,
166
+ system_prompt=model.system_prompt,
167
+ default_agent_id=model.default_agent_id,
168
+ created_at=model.created_at,
169
+ updated_at=model.updated_at,
170
+ deleted_at=model.deleted_at,
171
+ deleted_by=model.deleted_by,
172
+ )
@@ -0,0 +1,186 @@
1
+ """
2
+ Repository implementation for project user access data operations.
3
+ """
4
+ from typing import List, Optional
5
+ import uuid
6
+
7
+ from sqlalchemy.orm import Session as DBSession
8
+
9
+ from .models import ProjectUserModel
10
+ from .entities.project_user import ProjectUser
11
+ from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
12
+
13
+
14
+ class ProjectUserRepository:
15
+ """SQLAlchemy implementation of project user repository."""
16
+
17
+ def __init__(self, db: DBSession):
18
+ self.db = db
19
+
20
+ def add_user_to_project(
21
+ self,
22
+ project_id: str,
23
+ user_id: str,
24
+ role: str,
25
+ added_by_user_id: str
26
+ ) -> ProjectUser:
27
+ """
28
+ Add a user to a project with a specific role.
29
+
30
+ Args:
31
+ project_id: The project ID
32
+ user_id: The user ID to add
33
+ role: The role to assign (owner, editor, viewer)
34
+ added_by_user_id: The user ID who is granting access
35
+
36
+ Returns:
37
+ ProjectUser: The created project user access record
38
+ """
39
+ model = ProjectUserModel(
40
+ id=str(uuid.uuid4()),
41
+ project_id=project_id,
42
+ user_id=user_id,
43
+ role=role,
44
+ added_at=now_epoch_ms(),
45
+ added_by_user_id=added_by_user_id,
46
+ )
47
+ self.db.add(model)
48
+ self.db.commit()
49
+ self.db.refresh(model)
50
+ return self._model_to_entity(model)
51
+
52
+ def get_project_users(self, project_id: str) -> List[ProjectUser]:
53
+ """
54
+ Get all users who have access to a project.
55
+
56
+ Args:
57
+ project_id: The project ID
58
+
59
+ Returns:
60
+ List[ProjectUser]: List of users with access to the project
61
+ """
62
+ models = self.db.query(ProjectUserModel).filter(
63
+ ProjectUserModel.project_id == project_id
64
+ ).all()
65
+ return [self._model_to_entity(model) for model in models]
66
+
67
+ def get_user_projects_access(self, user_id: str) -> List[ProjectUser]:
68
+ """
69
+ Get all projects a user has access to.
70
+
71
+ Args:
72
+ user_id: The user ID
73
+
74
+ Returns:
75
+ List[ProjectUser]: List of project access records for the user
76
+ """
77
+ models = self.db.query(ProjectUserModel).filter(
78
+ ProjectUserModel.user_id == user_id
79
+ ).all()
80
+ return [self._model_to_entity(model) for model in models]
81
+
82
+ def get_user_project_access(
83
+ self,
84
+ project_id: str,
85
+ user_id: str
86
+ ) -> Optional[ProjectUser]:
87
+ """
88
+ Get a specific user's access to a project.
89
+
90
+ Args:
91
+ project_id: The project ID
92
+ user_id: The user ID
93
+
94
+ Returns:
95
+ Optional[ProjectUser]: The access record if found, None otherwise
96
+ """
97
+ model = self.db.query(ProjectUserModel).filter(
98
+ ProjectUserModel.project_id == project_id,
99
+ ProjectUserModel.user_id == user_id
100
+ ).first()
101
+
102
+ return self._model_to_entity(model) if model else None
103
+
104
+ def update_user_role(
105
+ self,
106
+ project_id: str,
107
+ user_id: str,
108
+ new_role: str
109
+ ) -> Optional[ProjectUser]:
110
+ """
111
+ Update a user's role for a project.
112
+
113
+ Args:
114
+ project_id: The project ID
115
+ user_id: The user ID
116
+ new_role: The new role to assign
117
+
118
+ Returns:
119
+ Optional[ProjectUser]: The updated access record if found, None otherwise
120
+ """
121
+ model = self.db.query(ProjectUserModel).filter(
122
+ ProjectUserModel.project_id == project_id,
123
+ ProjectUserModel.user_id == user_id
124
+ ).first()
125
+
126
+ if not model:
127
+ return None
128
+
129
+ model.role = new_role
130
+ self.db.commit()
131
+ self.db.refresh(model)
132
+ return self._model_to_entity(model)
133
+
134
+ def remove_user_from_project(
135
+ self,
136
+ project_id: str,
137
+ user_id: str
138
+ ) -> bool:
139
+ """
140
+ Remove a user's access to a project.
141
+
142
+ Args:
143
+ project_id: The project ID
144
+ user_id: The user ID to remove
145
+
146
+ Returns:
147
+ bool: True if removed successfully, False otherwise
148
+ """
149
+ result = self.db.query(ProjectUserModel).filter(
150
+ ProjectUserModel.project_id == project_id,
151
+ ProjectUserModel.user_id == user_id
152
+ ).delete()
153
+ self.db.commit()
154
+ return result > 0
155
+
156
+ def user_has_access(
157
+ self,
158
+ project_id: str,
159
+ user_id: str
160
+ ) -> bool:
161
+ """
162
+ Check if a user has access to a project.
163
+
164
+ Args:
165
+ project_id: The project ID
166
+ user_id: The user ID
167
+
168
+ Returns:
169
+ bool: True if user has access, False otherwise
170
+ """
171
+ count = self.db.query(ProjectUserModel).filter(
172
+ ProjectUserModel.project_id == project_id,
173
+ ProjectUserModel.user_id == user_id
174
+ ).count()
175
+ return count > 0
176
+
177
+ def _model_to_entity(self, model: ProjectUserModel) -> ProjectUser:
178
+ """Convert SQLAlchemy model to domain entity."""
179
+ return ProjectUser(
180
+ id=model.id,
181
+ project_id=model.project_id,
182
+ user_id=model.user_id,
183
+ role=model.role,
184
+ added_at=model.added_at,
185
+ added_by_user_id=model.added_by_user_id,
186
+ )