solace-agent-mesh 0.2.4__py3-none-any.whl → 1.0.1__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 (518) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  2. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +1694 -0
  4. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  5. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  6. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  7. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  8. solace_agent_mesh/agent/adk/runner.py +353 -0
  9. solace_agent_mesh/agent/adk/services.py +240 -0
  10. solace_agent_mesh/agent/adk/setup.py +751 -0
  11. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  12. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  13. solace_agent_mesh/agent/agent_llm.txt +41 -0
  14. solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
  15. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  16. solace_agent_mesh/agent/sac/app.py +640 -0
  17. solace_agent_mesh/agent/sac/component.py +3388 -0
  18. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  19. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  20. solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
  21. solace_agent_mesh/agent/testing/__init__.py +3 -0
  22. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  23. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  24. solace_agent_mesh/agent/tools/__init__.py +14 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  28. solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
  29. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  30. solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
  31. solace_agent_mesh/agent/tools/registry.py +36 -0
  32. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  33. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  34. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  35. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  36. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  37. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  38. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  39. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  40. solace_agent_mesh/assets/docs/404.html +16 -0
  41. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  42. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  43. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  54. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  57. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  104. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
  132. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
  133. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  165. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  167. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  168. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  170. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  171. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
  172. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  173. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  175. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  176. solace_agent_mesh/cli/__init__.py +1 -1
  177. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  178. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  179. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  180. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  181. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  183. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  184. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  185. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  186. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  187. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  188. solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
  189. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  190. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
  191. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  192. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  193. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  194. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  201. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  202. solace_agent_mesh/cli/main.py +17 -294
  203. solace_agent_mesh/cli/utils.py +135 -204
  204. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  205. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  210. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  211. solace_agent_mesh/common/__init__.py +1 -0
  212. solace_agent_mesh/common/a2a_protocol.py +564 -0
  213. solace_agent_mesh/common/agent_registry.py +42 -0
  214. solace_agent_mesh/common/client/__init__.py +4 -0
  215. solace_agent_mesh/common/client/card_resolver.py +21 -0
  216. solace_agent_mesh/common/client/client.py +85 -0
  217. solace_agent_mesh/common/client/client_llm.txt +133 -0
  218. solace_agent_mesh/common/common_llm.txt +144 -0
  219. solace_agent_mesh/common/constants.py +1 -14
  220. solace_agent_mesh/common/middleware/__init__.py +12 -0
  221. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  222. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  223. solace_agent_mesh/common/middleware/registry.py +125 -0
  224. solace_agent_mesh/common/server/__init__.py +4 -0
  225. solace_agent_mesh/common/server/server.py +122 -0
  226. solace_agent_mesh/common/server/server_llm.txt +169 -0
  227. solace_agent_mesh/common/server/task_manager.py +291 -0
  228. solace_agent_mesh/common/server/utils.py +28 -0
  229. solace_agent_mesh/common/services/__init__.py +4 -0
  230. solace_agent_mesh/common/services/employee_service.py +162 -0
  231. solace_agent_mesh/common/services/identity_service.py +129 -0
  232. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  233. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  234. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  235. solace_agent_mesh/common/services/services_llm.txt +132 -0
  236. solace_agent_mesh/common/types.py +411 -0
  237. solace_agent_mesh/common/utils/__init__.py +7 -0
  238. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  239. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  240. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  241. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  242. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  243. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  244. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  245. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  246. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  247. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  248. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  249. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  250. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  251. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  252. solace_agent_mesh/config_portal/backend/common.py +66 -24
  253. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
  254. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
  258. solace_agent_mesh/config_portal/backend/server.py +550 -181
  259. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
  260. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  267. solace_agent_mesh/core_a2a/__init__.py +1 -0
  268. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  269. solace_agent_mesh/core_a2a/service.py +331 -0
  270. solace_agent_mesh/evaluation/config_loader.py +657 -0
  271. solace_agent_mesh/evaluation/evaluator.py +667 -0
  272. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  273. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  274. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  275. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  276. solace_agent_mesh/evaluation/report/modal.html +59 -0
  277. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  278. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  279. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  280. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  281. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  282. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  283. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  284. solace_agent_mesh/evaluation/report_generator.py +613 -0
  285. solace_agent_mesh/evaluation/run.py +613 -0
  286. solace_agent_mesh/evaluation/subscriber.py +872 -0
  287. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  288. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  289. solace_agent_mesh/gateway/base/__init__.py +1 -0
  290. solace_agent_mesh/gateway/base/app.py +266 -0
  291. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  292. solace_agent_mesh/gateway/base/component.py +1542 -0
  293. solace_agent_mesh/gateway/base/task_context.py +74 -0
  294. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  295. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  296. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  297. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  298. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  299. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  300. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  301. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  302. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  303. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  304. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  305. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
  306. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  307. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  308. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  309. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  310. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  311. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  312. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  313. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  314. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  315. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  316. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  317. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  318. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  319. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  320. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  321. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  322. solace_agent_mesh/llm.txt +228 -0
  323. solace_agent_mesh/llm_detail.txt +2835 -0
  324. solace_agent_mesh/templates/agent_template.yaml +53 -0
  325. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  326. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  327. solace_agent_mesh/templates/gateway_component_template.py +400 -0
  328. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  329. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  330. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  331. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  332. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  333. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  334. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  335. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  336. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  337. solace_agent_mesh/templates/shared_config.yaml +66 -0
  338. solace_agent_mesh/templates/templates_llm.txt +147 -0
  339. solace_agent_mesh/templates/webui.yaml +53 -0
  340. solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
  341. solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
  342. solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
  343. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -256
  345. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  346. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  347. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  348. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  349. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  350. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  351. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  352. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  353. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  354. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  355. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  356. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  357. solace_agent_mesh/agents/slack/__init__.py +0 -1
  358. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  359. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  360. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  361. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  362. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  363. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  364. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  365. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  366. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  367. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  368. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  369. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  370. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  371. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  372. solace_agent_mesh/cli/commands/add/add.py +0 -88
  373. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  374. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  375. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  376. solace_agent_mesh/cli/commands/build.py +0 -670
  377. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  378. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  379. solace_agent_mesh/cli/commands/config.py +0 -29
  380. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  382. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  383. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  384. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  385. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  386. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  387. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  388. solace_agent_mesh/cli/commands/init/init.py +0 -92
  389. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  390. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  391. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  392. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  393. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  394. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  395. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  396. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  397. solace_agent_mesh/cli/commands/run.py +0 -68
  398. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  399. solace_agent_mesh/cli/config.py +0 -85
  400. solace_agent_mesh/common/action.py +0 -91
  401. solace_agent_mesh/common/action_list.py +0 -37
  402. solace_agent_mesh/common/action_response.py +0 -340
  403. solace_agent_mesh/common/mysql_database.py +0 -40
  404. solace_agent_mesh/common/postgres_database.py +0 -85
  405. solace_agent_mesh/common/prompt_templates.py +0 -28
  406. solace_agent_mesh/common/stimulus_utils.py +0 -152
  407. solace_agent_mesh/common/time.py +0 -24
  408. solace_agent_mesh/common/utils.py +0 -712
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  414. solace_agent_mesh/configs/agent_global.yaml +0 -74
  415. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  416. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  417. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  418. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  419. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  420. solace_agent_mesh/configs/monitor.yaml +0 -0
  421. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  422. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  423. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  424. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  425. solace_agent_mesh/configs/service_llm.yaml +0 -265
  426. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  427. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  428. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  429. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  430. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  431. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  432. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  433. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  434. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  435. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  436. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  437. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  438. solace_agent_mesh/orchestrator/__init__.py +0 -0
  439. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  440. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  441. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  442. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  443. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  444. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  445. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  446. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  447. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  448. solace_agent_mesh/services/__init__.py +0 -0
  449. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  450. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  451. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  452. solace_agent_mesh/services/common/__init__.py +0 -4
  453. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  454. solace_agent_mesh/services/common/singleton.py +0 -18
  455. solace_agent_mesh/services/file_service/__init__.py +0 -14
  456. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  457. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  458. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  459. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  460. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  461. solace_agent_mesh/services/file_service/file_service.py +0 -437
  462. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  463. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  464. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  465. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  466. solace_agent_mesh/services/history_service/__init__.py +0 -3
  467. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  468. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  469. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  470. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  471. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  472. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  473. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  474. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  475. solace_agent_mesh/services/history_service/history_service.py +0 -413
  476. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  477. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  478. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  479. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  480. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  481. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  482. solace_agent_mesh/templates/action.py +0 -38
  483. solace_agent_mesh/templates/agent.py +0 -29
  484. solace_agent_mesh/templates/agent.yaml +0 -70
  485. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  486. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  487. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  488. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  489. solace_agent_mesh/templates/gateway_base.py +0 -15
  490. solace_agent_mesh/templates/gateway_input.py +0 -98
  491. solace_agent_mesh/templates/gateway_output.py +0 -71
  492. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  493. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  494. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  495. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  496. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  497. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  498. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  499. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  500. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  501. solace_agent_mesh/templates/web-flows.yaml +0 -76
  502. solace_agent_mesh/tools/__init__.py +0 -0
  503. solace_agent_mesh/tools/components/__init__.py +0 -0
  504. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  505. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  506. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  507. solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
  508. solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
  510. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  511. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  512. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  513. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  517. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  518. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,183 @@
1
+ import click
2
+ from pathlib import Path
3
+
4
+ from ...utils import ask_if_not_provided, ask_yes_no_question, load_template
5
+
6
+ WEBUI_GATEWAY_DEFAULTS = {
7
+ "webui_frontend_welcome_message": "",
8
+ "webui_frontend_bot_name": "Solace Agent Mesh",
9
+ "webui_frontend_collect_feedback": False,
10
+ "webui_session_secret_key": "please_change_me_in",
11
+ "webui_fastapi_host": "127.0.0.1",
12
+ "webui_fastapi_port": 8000, # Store as int if CLI option is int
13
+ "webui_fastapi_https_port": 8443, # Store as int if CLI option is int
14
+ "webui_ssl_keyfile": "",
15
+ "webui_ssl_certfile": "",
16
+ "webui_ssl_keyfile_password": "",
17
+ "webui_enable_embed_resolution": True,
18
+ }
19
+
20
+
21
+ def create_webui_gateway_config(
22
+ project_root: Path, options: dict, skip_interactive: bool, default_values: dict
23
+ ) -> bool:
24
+ """
25
+ Gathers WebUI Gateway options and creates the configuration file (configs/gateways/webui.yaml)
26
+ if the user opts in. It customizes the template based on user input or defaults.
27
+ Returns True on success or if skipped, False on failure.
28
+ """
29
+ click.echo("Configuring Web UI Gateway options...")
30
+
31
+ add_gateway = options.get("add_webui_gateway")
32
+ if not skip_interactive and add_gateway is None:
33
+ add_gateway = ask_yes_no_question(
34
+ "Do you want to add a default Web UI gateway?",
35
+ default=default_values.get("add_webui_gateway", True),
36
+ )
37
+ elif add_gateway is None:
38
+ add_gateway = default_values.get("add_webui_gateway", True)
39
+
40
+ options["add_webui_gateway"] = add_gateway
41
+
42
+ options["webui_session_secret_key"] = ask_if_not_provided(
43
+ options,
44
+ "webui_session_secret_key",
45
+ "Enter Web UI Session Secret Key",
46
+ default=default_values.get(
47
+ "webui_session_secret_key",
48
+ WEBUI_GATEWAY_DEFAULTS["webui_session_secret_key"],
49
+ ),
50
+ none_interactive=skip_interactive,
51
+ hide_input=True,
52
+ )
53
+ options["webui_fastapi_host"] = ask_if_not_provided(
54
+ options,
55
+ "webui_fastapi_host",
56
+ "Enter Web UI FastAPI Host",
57
+ default=default_values.get(
58
+ "webui_fastapi_host", WEBUI_GATEWAY_DEFAULTS["webui_fastapi_host"]
59
+ ),
60
+ none_interactive=skip_interactive,
61
+ )
62
+ options["webui_fastapi_port"] = ask_if_not_provided(
63
+ options,
64
+ "webui_fastapi_port",
65
+ "Enter Web UI FastAPI Port",
66
+ default=default_values.get(
67
+ "webui_fastapi_port", WEBUI_GATEWAY_DEFAULTS["webui_fastapi_port"]
68
+ ),
69
+ none_interactive=skip_interactive,
70
+ )
71
+ options["webui_fastapi_https_port"] = ask_if_not_provided(
72
+ options, "webui_fastapi_https_port", "Enter Web UI FastAPI HTTPS Port",
73
+ default=default_values.get("webui_fastapi_https_port", 8443),
74
+ none_interactive=skip_interactive
75
+ )
76
+ options["webui_enable_embed_resolution"] = ask_if_not_provided(
77
+ options,
78
+ "webui_enable_embed_resolution",
79
+ "Enable Embed Resolution for Web UI? (true/false)",
80
+ default=default_values.get(
81
+ "webui_enable_embed_resolution",
82
+ WEBUI_GATEWAY_DEFAULTS["webui_enable_embed_resolution"],
83
+ ),
84
+ none_interactive=skip_interactive,
85
+ is_bool=True,
86
+ )
87
+ options["webui_ssl_keyfile"] = ask_if_not_provided(
88
+ options, "webui_ssl_keyfile", "Enter SSL Key File Path",
89
+ default=default_values.get("webui_ssl_keyfile", ""),
90
+ none_interactive=skip_interactive
91
+ )
92
+ options["webui_ssl_certfile"] = ask_if_not_provided(
93
+ options, "webui_ssl_certfile", "Enter SSL Certificate File Path",
94
+ default=default_values.get("webui_ssl_certfile", ""),
95
+ none_interactive=skip_interactive
96
+ )
97
+ options["webui_ssl_keyfile_password"] = ask_if_not_provided(
98
+ options, "webui_ssl_keyfile_password", "Enter SSL Key File Passphrase",
99
+ default=default_values.get("webui_ssl_keyfile_password", ""),
100
+ none_interactive=skip_interactive, hide_input=True
101
+ )
102
+
103
+ options["webui_frontend_welcome_message"] = ask_if_not_provided(
104
+ options,
105
+ "webui_frontend_welcome_message",
106
+ "Enter Frontend Welcome Message for Web UI",
107
+ default=default_values.get(
108
+ "webui_frontend_welcome_message",
109
+ WEBUI_GATEWAY_DEFAULTS["webui_frontend_welcome_message"],
110
+ ),
111
+ none_interactive=skip_interactive,
112
+ )
113
+ options["webui_frontend_bot_name"] = ask_if_not_provided(
114
+ options,
115
+ "webui_frontend_bot_name",
116
+ "Enter Frontend Bot Name for Web UI",
117
+ default=default_values.get(
118
+ "webui_frontend_bot_name", WEBUI_GATEWAY_DEFAULTS["webui_frontend_bot_name"]
119
+ ),
120
+ none_interactive=skip_interactive,
121
+ )
122
+ options["webui_frontend_collect_feedback"] = ask_if_not_provided(
123
+ options,
124
+ "webui_frontend_collect_feedback",
125
+ "Enable Frontend Feedback Collection for Web UI? (true/false)",
126
+ default=default_values.get(
127
+ "webui_frontend_collect_feedback",
128
+ WEBUI_GATEWAY_DEFAULTS["webui_frontend_collect_feedback"],
129
+ ),
130
+ none_interactive=skip_interactive,
131
+ is_bool=True,
132
+ )
133
+
134
+ if not add_gateway:
135
+ click.echo(click.style(" Skipping Web UI Gateway file creation.", fg="yellow"))
136
+ return True
137
+
138
+ click.echo("Creating Web UI Gateway configuration file...")
139
+ destination_path = project_root / "configs" / "gateways" / "webui.yaml"
140
+
141
+ try:
142
+ template_content = load_template("webui.yaml")
143
+ replacements = {
144
+ "__FRONTEND_WELCOME_MESSAGE__": str(
145
+ options.get("webui_frontend_welcome_message", "")
146
+ ),
147
+ "__FRONTEND_BOT_NAME__": str(
148
+ options.get("webui_frontend_bot_name", "Solace Agent Mesh")
149
+ ),
150
+ "__FRONTEND_COLLECT_FEEDBACK__": str(
151
+ options.get("webui_frontend_collect_feedback", False)
152
+ ).lower(),
153
+ }
154
+
155
+ modified_content = template_content
156
+ for placeholder, value in replacements.items():
157
+ modified_content = modified_content.replace(placeholder, value)
158
+
159
+ destination_path.parent.mkdir(parents=True, exist_ok=True)
160
+ with open(destination_path, "w", encoding="utf-8") as f:
161
+ f.write(modified_content)
162
+
163
+ click.echo(f" Created: {destination_path.relative_to(project_root)}")
164
+ return True
165
+
166
+ except FileNotFoundError:
167
+ click.echo(click.style(f"Error: Template file not found.", fg="red"), err=True)
168
+ return False
169
+ except IOError as e:
170
+ click.echo(
171
+ click.style(f"Error writing file {destination_path}: {e}", fg="red"),
172
+ err=True,
173
+ )
174
+ return False
175
+ except Exception as e:
176
+ click.echo(
177
+ click.style(
178
+ f"An unexpected error occurred during Web UI Gateway configuration: {e}",
179
+ fg="red",
180
+ ),
181
+ err=True,
182
+ )
183
+ return False
@@ -0,0 +1,18 @@
1
+ import click
2
+
3
+ from .create_cmd import create_plugin_cmd
4
+ from .add_cmd import add_plugin_component_cmd
5
+ from .build_cmd import build_plugin_cmd
6
+ from .catalog_cmd import catalog
7
+
8
+
9
+ @click.group("plugin")
10
+ def plugin():
11
+ """Manage SAM plugins: create, add components, and build."""
12
+ pass
13
+
14
+
15
+ plugin.add_command(create_plugin_cmd, name="create")
16
+ plugin.add_command(add_plugin_component_cmd, name="add")
17
+ plugin.add_command(build_plugin_cmd, name="build")
18
+ plugin.add_command(catalog, name="catalog")
@@ -0,0 +1,372 @@
1
+ import click
2
+ import pathlib
3
+ import subprocess
4
+ import tempfile
5
+ import shutil
6
+ import os
7
+ import re
8
+ import toml
9
+
10
+ from cli.utils import get_formatted_names, get_module_path, error_exit
11
+ from .official_registry import get_official_plugin_url
12
+
13
+
14
+ def ensure_directory_exists(path: pathlib.Path):
15
+ """Creates a directory if it doesn't exist."""
16
+ path.mkdir(parents=True, exist_ok=True)
17
+
18
+
19
+ def _check_command_exists(command: str) -> bool:
20
+ """Checks if a command exists on the system."""
21
+ return shutil.which(command) is not None
22
+
23
+
24
+ def _get_plugin_name_from_source_pyproject(source_path: pathlib.Path) -> str | None:
25
+ """Reads pyproject.toml from source_path and returns the project name."""
26
+ pyproject_path = source_path / "pyproject.toml"
27
+ if not pyproject_path.is_file():
28
+ click.echo(
29
+ click.style(
30
+ f"Warning: pyproject.toml not found at {pyproject_path}. Cannot determine module name automatically.",
31
+ fg="yellow",
32
+ )
33
+ )
34
+ return None
35
+ try:
36
+ with open(pyproject_path, "r", encoding="utf-8") as f:
37
+ data = toml.load(f)
38
+ project_name = data.get("project", {}).get("name")
39
+ if project_name:
40
+ return project_name.strip().replace("-", "_") # Normalize to snake_case
41
+ click.echo(
42
+ click.style(
43
+ f"Warning: Could not find 'project.name' in {pyproject_path}.",
44
+ fg="yellow",
45
+ )
46
+ )
47
+ return None
48
+ except Exception as e:
49
+ click.echo(click.style(f"Error parsing {pyproject_path}: {e}", fg="red"))
50
+ return None
51
+
52
+
53
+ def _get_plugin_type_from_pyproject(source_path: pathlib.Path) -> str | None:
54
+ """Reads pyproject.toml from source_path and returns the plugin type."""
55
+ pyproject_path = source_path / "pyproject.toml"
56
+ if not pyproject_path.is_file():
57
+ click.echo(
58
+ click.style(
59
+ f"Warning: pyproject.toml not found at {pyproject_path}. Cannot determine plugin type automatically.",
60
+ fg="yellow",
61
+ )
62
+ )
63
+ return None
64
+ try:
65
+ with open(pyproject_path, "r", encoding="utf-8") as f:
66
+ data = toml.load(f)
67
+ project_name = data.get("project", {}).get("name", "").strip().replace("-", "_")
68
+ plugin_type = (
69
+ data.get("tool", {}).get(project_name, {}).get("metadata", {}).get("type")
70
+ )
71
+ if plugin_type:
72
+ return plugin_type.strip()
73
+ click.echo(
74
+ click.style(
75
+ f"Warning: Could not find plugin type for '{project_name}' in {pyproject_path}.",
76
+ fg="yellow",
77
+ )
78
+ )
79
+ return None
80
+ except Exception as e:
81
+ click.echo(click.style(f"Error parsing {pyproject_path}: {e}", fg="red"))
82
+ return None
83
+
84
+
85
+ def _run_install(
86
+ install_command, install_target: str | pathlib.Path, operation_desc: str
87
+ ) -> str | None:
88
+ """Runs install for the given target."""
89
+ click.echo(
90
+ f"Attempting to install plugin using {install_command} from {operation_desc}..."
91
+ )
92
+ try:
93
+ process = subprocess.run(
94
+ install_command.format(package=str(install_target)).split(),
95
+ capture_output=True,
96
+ text=True,
97
+ check=False,
98
+ )
99
+ if process.returncode == 0:
100
+ click.echo(
101
+ click.style(
102
+ f"Plugin successfully installed via from {operation_desc}.",
103
+ fg="green",
104
+ )
105
+ )
106
+ if process.stdout:
107
+ click.echo(f"install output:\n{process.stdout}")
108
+ return None
109
+ else:
110
+ return f"Error: 'install {install_target}' failed.\nstdout:\n{process.stdout}\nstderr:\n{process.stderr}"
111
+ except FileNotFoundError:
112
+ return "Error: 'python' or command not found. Ensure Python and command are installed and in your PATH."
113
+ except Exception as e:
114
+ return f"An unexpected error occurred during install: {e}"
115
+
116
+
117
+ @click.command("add")
118
+ @click.argument("component_name")
119
+ @click.option(
120
+ "--plugin",
121
+ "plugin_source",
122
+ required=True,
123
+ help="Plugin source: installed module name, local path, or Git URL.",
124
+ )
125
+ @click.option(
126
+ "--install-command",
127
+ "installer_command",
128
+ help="Command to use to install a python package. Must follow the format 'command {package} args', by default 'pip3 install {package}'. Can also be set through the environment variable SAM_PLUGIN_INSTALL_COMMAND.",
129
+ )
130
+ def add_plugin_component_cmd(
131
+ component_name: str, plugin_source: str, installer_command: str | None = None
132
+ ):
133
+ """Creates a new component instance from a specified plugin source."""
134
+
135
+ click.echo(
136
+ f"Attempting to add component '{component_name}' using plugin source '{plugin_source}'..."
137
+ )
138
+ if not installer_command:
139
+ installer_command = os.environ.get(
140
+ "SAM_PLUGIN_INSTALL_COMMAND", "pip3 install {package}"
141
+ )
142
+ try:
143
+ installer_command.format(package="dummy") # Test if the command is valid
144
+ except (KeyError, ValueError):
145
+ return error_exit(
146
+ "Error: The installer command must contain a placeholder '{package}' to be replaced with the actual package name."
147
+ )
148
+
149
+ official_plugin_url = get_official_plugin_url(plugin_source)
150
+ if official_plugin_url:
151
+ click.echo(f"Found official plugin '{plugin_source}' at: {official_plugin_url}")
152
+ plugin_source = official_plugin_url
153
+
154
+ install_type = None # "module", "local", "git"
155
+ module_name_to_load = None
156
+ install_target = None
157
+ source_path_for_name_extraction = None
158
+
159
+ if plugin_source.startswith(("http://", "https://")) and plugin_source.endswith(
160
+ ".git"
161
+ ):
162
+ install_type = "repository"
163
+ install_target = plugin_source
164
+ elif plugin_source.startswith(("git+")):
165
+ install_type = "git"
166
+ install_target = plugin_source
167
+ elif os.path.exists(plugin_source):
168
+ local_path = pathlib.Path(plugin_source).resolve()
169
+ if local_path.is_dir():
170
+ install_type = "local"
171
+ install_target = str(local_path)
172
+ source_path_for_name_extraction = local_path
173
+ elif local_path.is_file() and local_path.suffix in [".whl", ".tar.gz"]:
174
+ install_type = "wheel"
175
+ install_target = str(local_path)
176
+ else:
177
+ return error_exit(
178
+ f"Error: Local path '{plugin_source}' exists but is not a directory or wheel."
179
+ )
180
+ elif not re.search(r"[/\\]", plugin_source):
181
+ install_type = "module"
182
+ module_name_to_load = plugin_source.strip().replace("-", "_")
183
+ else:
184
+ return error_exit(
185
+ f"Error: Invalid plugin source '{plugin_source}'. Not a recognized module name, local path, or Git URL."
186
+ )
187
+
188
+ if install_type in ["local", "git", "repository", "wheel"]:
189
+ if install_type == "repository":
190
+ if not _check_command_exists("git"):
191
+ return error_exit(
192
+ "Error: 'git' command not found. Please install Git or install the plugin manually."
193
+ )
194
+
195
+ with tempfile.TemporaryDirectory() as temp_dir:
196
+ temp_dir_path = pathlib.Path(temp_dir)
197
+ cloned_repo_path = temp_dir_path / "plugin_repo"
198
+ click.echo(
199
+ f"Cloning Git repository '{plugin_source}' to temporary directory {cloned_repo_path}..."
200
+ )
201
+ try:
202
+ subprocess.run(
203
+ ["git", "clone", plugin_source, str(cloned_repo_path)],
204
+ capture_output=True,
205
+ text=True,
206
+ check=True,
207
+ )
208
+ source_path_for_name_extraction = cloned_repo_path
209
+ except subprocess.CalledProcessError as e:
210
+ return error_exit(f"Error cloning Git repository: {e.stderr}")
211
+ except FileNotFoundError:
212
+ return error_exit("Error: 'git' command not found during clone.")
213
+
214
+ module_name_from_pyproject = _get_plugin_name_from_source_pyproject(
215
+ source_path_for_name_extraction
216
+ )
217
+ if not module_name_from_pyproject:
218
+ return error_exit(
219
+ "Could not determine module name from pyproject.toml in the Git repo. Aborting."
220
+ )
221
+
222
+ err = _run_install(
223
+ installer_command, install_target, f"Git URL ({plugin_source})"
224
+ )
225
+ if err:
226
+ return error_exit(err)
227
+ module_name_to_load = module_name_from_pyproject
228
+
229
+ elif install_type == "git":
230
+ module_name_from_url = (
231
+ plugin_source.split("#")[0]
232
+ .split("?")[0]
233
+ .split("/")[-1]
234
+ .replace(".git", "")
235
+ .replace("-", "_")
236
+ )
237
+ if "#subdirectory=" in plugin_source:
238
+ module_name_from_url = (
239
+ plugin_source.split("#subdirectory=")[-1]
240
+ .split("?")[0]
241
+ .replace(".git", "")
242
+ .replace("-", "_")
243
+ )
244
+
245
+ if not module_name_from_url:
246
+ return error_exit(
247
+ f"Could not determine module name from the Git URL {plugin_source}. Aborting."
248
+ )
249
+
250
+ err = _run_install(
251
+ installer_command, install_target, f"Git URL ({plugin_source})"
252
+ )
253
+ if err:
254
+ return error_exit(err)
255
+ module_name_to_load = module_name_from_url
256
+
257
+ elif install_type == "local":
258
+ module_name_from_pyproject = _get_plugin_name_from_source_pyproject(
259
+ source_path_for_name_extraction
260
+ )
261
+ if not module_name_from_pyproject:
262
+ return error_exit(
263
+ f"Could not determine module name from pyproject.toml at {source_path_for_name_extraction}. Aborting."
264
+ )
265
+
266
+ err = _run_install(
267
+ installer_command, install_target, f"local path ({install_target})"
268
+ )
269
+ if err:
270
+ return error_exit(err)
271
+ module_name_to_load = module_name_from_pyproject
272
+
273
+ elif install_type == "wheel":
274
+ module_name_from_wheel = (
275
+ pathlib.Path(install_target).stem.split("-")[0]
276
+ )
277
+ if not module_name_from_wheel:
278
+ return error_exit(
279
+ f"Could not determine module name from the wheel file {install_target}. Aborting."
280
+ )
281
+
282
+ err = _run_install(
283
+ installer_command, install_target, f"wheel file ({install_target})"
284
+ )
285
+ if err:
286
+ return error_exit(err)
287
+ module_name_to_load = module_name_from_wheel
288
+
289
+ if not module_name_to_load:
290
+ return error_exit("Error: Could not determine the plugin module name to load.")
291
+
292
+ click.echo(f"Proceeding to load plugin module '{module_name_to_load}'...")
293
+ try:
294
+ plugin_root_path = pathlib.Path(get_module_path(module_name_to_load))
295
+ except ImportError:
296
+ return error_exit(
297
+ f"Error: Plugin module '{module_name_to_load}' not found after potential installation. Please check installation logs or install manually."
298
+ )
299
+
300
+ if not plugin_root_path or not plugin_root_path.exists():
301
+ return error_exit(
302
+ f"Error: Could not determine a valid root path for plugin module '{module_name_to_load}'. Path: {plugin_root_path}"
303
+ )
304
+
305
+ plugin_config_path = plugin_root_path / "config.yaml"
306
+ plugin_pyproject_path = plugin_root_path / "pyproject.toml"
307
+
308
+ if not plugin_pyproject_path.is_file():
309
+ return error_exit(
310
+ f"Error: pyproject.toml not found in plugin '{module_name_to_load}' at expected path {plugin_pyproject_path}"
311
+ )
312
+
313
+ if not plugin_config_path.is_file():
314
+ return error_exit(
315
+ f"Error: config.yaml not found in plugin '{module_name_to_load}' at expected path {plugin_config_path}"
316
+ )
317
+
318
+ try:
319
+ plugin_config_content = plugin_config_path.read_text(encoding="utf-8")
320
+ except Exception as e:
321
+ return error_exit(
322
+ f"Error reading plugin config.yaml from {plugin_config_path}: {e}"
323
+ )
324
+
325
+ component_formats = get_formatted_names(component_name)
326
+
327
+ component_replacements = {
328
+ "__COMPONENT_SNAKE_CASE_NAME__": component_formats["SNAKE_CASE_NAME"],
329
+ "__COMPONENT_UPPER_SNAKE_CASE_NAME__": component_formats[
330
+ "SNAKE_UPPER_CASE_NAME"
331
+ ],
332
+ "__COMPONENT_KEBAB_CASE_NAME__": component_formats["KEBAB_CASE_NAME"],
333
+ "__COMPONENT_PASCAL_CASE_NAME__": component_formats["PASCAL_CASE_NAME"],
334
+ "__COMPONENT_SPACED_NAME__": component_formats["SPACED_NAME"],
335
+ "__COMPONENT_SPACED_CAPITALIZED_NAME__": component_formats[
336
+ "SPACED_CAPITALIZED_NAME"
337
+ ],
338
+ }
339
+
340
+ processed_config_content = plugin_config_content
341
+ for placeholder, value in component_replacements.items():
342
+ processed_config_content = processed_config_content.replace(placeholder, value)
343
+
344
+ plugin_type = _get_plugin_type_from_pyproject(plugin_root_path)
345
+ if plugin_type == "agent":
346
+ target_dir = pathlib.Path("configs/agents")
347
+ elif plugin_type == "gateway":
348
+ target_dir = pathlib.Path("configs/gateways")
349
+ else:
350
+ target_dir = pathlib.Path("configs/plugins")
351
+ try:
352
+ ensure_directory_exists(target_dir)
353
+ except Exception as e:
354
+ return error_exit(f"Error creating target directory {target_dir}: {e}")
355
+
356
+ target_filename = f"{component_formats['KEBAB_CASE_NAME']}.yaml"
357
+ target_path = target_dir / target_filename
358
+
359
+ try:
360
+ with open(target_path, "w", encoding="utf-8") as f:
361
+ f.write(processed_config_content)
362
+ click.echo(f" Created component configuration: {target_path}")
363
+ click.echo(
364
+ click.style(
365
+ f"Component '{component_name}' created successfully from plugin '{module_name_to_load}'.",
366
+ fg="green",
367
+ )
368
+ )
369
+ except IOError as e:
370
+ return error_exit(
371
+ f"Error writing component configuration file {target_path}: {e}"
372
+ )
@@ -0,0 +1,86 @@
1
+ import click
2
+ import subprocess
3
+ import os
4
+ from pathlib import Path
5
+ from cli.utils import error_exit
6
+
7
+
8
+ @click.command("build")
9
+ @click.argument(
10
+ "plugin_path_arg",
11
+ type=click.Path(exists=True, file_okay=False, dir_okay=True, resolve_path=True),
12
+ default=".",
13
+ metavar="PLUGIN_PATH",
14
+ )
15
+ def build_plugin_cmd(plugin_path_arg: str):
16
+ """
17
+ Builds the SAM plugin in the specified directory (defaults to current directory).
18
+ This command requires the 'build' package to be installed (pip install build).
19
+ """
20
+ target_path = Path(plugin_path_arg)
21
+ pyproject_file = target_path / "pyproject.toml"
22
+
23
+ if not pyproject_file.is_file():
24
+ click.echo(
25
+ click.style(f"Error: pyproject.toml not found in {target_path}", fg="red")
26
+ )
27
+ click.echo(
28
+ click.style(
29
+ "Please ensure you are in the root directory of the plugin or provide the correct path.",
30
+ fg="yellow",
31
+ )
32
+ )
33
+ error_exit()
34
+
35
+ click.echo(f"Building plugin in {target_path}...")
36
+ click.echo(
37
+ click.style(
38
+ "Note: This command uses 'python -m build'. Ensure 'build' package is installed ('pip install build').",
39
+ fg="cyan",
40
+ )
41
+ )
42
+
43
+ original_cwd = Path.cwd()
44
+ error_exit_msg = None
45
+ try:
46
+ os.chdir(target_path)
47
+ process = subprocess.run(
48
+ ["python", "-m", "build"], capture_output=True, text=True, check=False
49
+ )
50
+
51
+ if process.stdout:
52
+ click.echo("--- Build Output ---")
53
+ click.echo(process.stdout)
54
+ click.echo("--- End of Build Output ---")
55
+
56
+ if process.stderr:
57
+ click.echo(click.style("--- Build Errors/Warnings ---", fg="yellow"))
58
+ click.echo(click.style(process.stderr, fg="yellow"))
59
+ click.echo(click.style("--- End of Build Errors/Warnings ---", fg="yellow"))
60
+
61
+ if process.returncode == 0:
62
+ dist_path = target_path / "dist"
63
+ click.echo(
64
+ click.style(
65
+ f"Plugin built successfully! Artifacts are in: {dist_path}",
66
+ fg="green",
67
+ )
68
+ )
69
+ if dist_path.exists() and dist_path.is_dir():
70
+ click.echo("Generated files:")
71
+ for item in sorted(dist_path.iterdir()):
72
+ click.echo(f" - {item.name}")
73
+ else:
74
+ error_exit_msg = (
75
+ f"Error: 'python -m build' failed with exit code {process.returncode}."
76
+ )
77
+ error_exit_msg += "\nPlease check the build output above for details."
78
+
79
+ except FileNotFoundError:
80
+ error_exit_msg = f"Error: Python executable not found. Ensure Python is installed and in your PATH."
81
+ except Exception as e:
82
+ error_exit_msg = f"An unexpected error occurred during the build process: {e}"
83
+ finally:
84
+ os.chdir(original_cwd)
85
+ if error_exit_msg:
86
+ error_exit(error_exit_msg)