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,138 @@
1
+ import click
2
+ import multiprocessing
3
+ import webbrowser
4
+ import os
5
+ import time
6
+ from pathlib import Path
7
+ from cli.utils import error_exit
8
+
9
+ config_portal_host = "CONFIG_PORTAL_HOST"
10
+
11
+ def run_flask_plugin_catalog(host, port, shared_data):
12
+ try:
13
+ from config_portal.backend.plugin_catalog_server import (
14
+ create_plugin_catalog_app,
15
+ )
16
+ from config_portal.backend.plugin_catalog.constants import (
17
+ PLUGIN_CATALOG_TEMP_DIR,
18
+ )
19
+ except ImportError:
20
+ click.echo(
21
+ click.style(
22
+ "Error: Backend components for plugin catalog not found. Please ensure they are implemented.",
23
+ fg="red",
24
+ )
25
+ )
26
+ shared_data["status"] = "error_backend_missing"
27
+ return
28
+
29
+ temp_dir = Path(os.path.expanduser(PLUGIN_CATALOG_TEMP_DIR))
30
+ temp_dir.mkdir(parents=True, exist_ok=True)
31
+
32
+ app = create_plugin_catalog_app(shared_config=shared_data)
33
+ click.echo(
34
+ f"Starting Plugin Catalog backend on http://{host}:{port}/?config_mode=pluginCatalog"
35
+ )
36
+ try:
37
+ app.run(host=host, port=port, debug=False)
38
+ except Exception as e:
39
+ click.echo(click.style(f"Error starting Flask app: {e}", fg="red"))
40
+ shared_data["status"] = f"error_flask_start: {e}"
41
+
42
+
43
+ @click.command("catalog", help="Launch the SAM Plugin catalog web interface.")
44
+ @click.option(
45
+ "--port",
46
+ default=5003,
47
+ type=int,
48
+ show_default=True,
49
+ help="Port to run the plugin catalog web server on.",
50
+ )
51
+ @click.option(
52
+ "--install-command",
53
+ "installer_command",
54
+ help="Command to use to install a python package. Must follow the format 'command {package} args'",
55
+ )
56
+ def catalog(port: int, installer_command: str):
57
+ """Launches the SAM Plugin catalog web interface."""
58
+ host = os.environ.get(config_portal_host, "127.0.0.1")
59
+ try:
60
+ if installer_command:
61
+ installer_command.format(package="dummy") # Test if the command is valid
62
+ os.environ["SAM_PLUGIN_INSTALL_COMMAND"] = installer_command
63
+ except (KeyError, ValueError):
64
+ return error_exit(
65
+ "Error: The installer command must contain a placeholder '{package}' to be replaced with the actual package name."
66
+ )
67
+
68
+ with multiprocessing.Manager() as manager:
69
+ shared_data_from_web = manager.dict()
70
+ shared_data_from_web["status"] = "initializing"
71
+ _run_flask_target = run_flask_plugin_catalog
72
+
73
+ gui_process = multiprocessing.Process(
74
+ target=_run_flask_target, args=(host, port, shared_data_from_web)
75
+ )
76
+ gui_process.start()
77
+
78
+ # Give the server a moment to start
79
+ time.sleep(2)
80
+
81
+ if shared_data_from_web.get(
82
+ "status"
83
+ ) == "initializing" or shared_data_from_web.get("status", "").startswith(
84
+ "error_"
85
+ ):
86
+ backend_status = shared_data_from_web.get("status", "unknown_error")
87
+ if backend_status == "initializing":
88
+ click.echo(
89
+ click.style(
90
+ f"Plugin catalog backend is starting... If it takes too long, there might be an issue.",
91
+ fg="yellow",
92
+ )
93
+ )
94
+ else:
95
+ click.echo(
96
+ click.style(
97
+ f"Plugin catalog backend failed to start properly ({backend_status}). Please check logs.",
98
+ fg="red",
99
+ )
100
+ )
101
+ if gui_process.is_alive():
102
+ gui_process.terminate()
103
+ gui_process.join(timeout=2)
104
+ return # Don't open browser if backend failed
105
+
106
+ portal_url = f"http://{host}:{port}/?config_mode=pluginCatalog"
107
+ click.echo(f"Opening Plugin Catalog at: {portal_url}")
108
+
109
+ try:
110
+ webbrowser.open(portal_url)
111
+ except Exception:
112
+ click.echo(
113
+ click.style(
114
+ f"Could not automatically open browser, Please open {portal_url} manually.",
115
+ fg="yellow",
116
+ )
117
+ )
118
+
119
+ try:
120
+ gui_process.join()
121
+ except KeyboardInterrupt:
122
+ click.echo("Plugin Catalog interrupted by user. Shutting down...")
123
+ finally:
124
+ if gui_process.is_alive():
125
+ click.echo("Terminating Plugin Catalog process...")
126
+ gui_process.terminate()
127
+ gui_process.join(timeout=5)
128
+ if gui_process.is_alive():
129
+ click.echo(
130
+ click.style("Forcibly killing Plugin Catalog process.", fg="yellow")
131
+ )
132
+ gui_process.kill()
133
+
134
+ final_status = shared_data_from_web.get("status", "unknown_exit")
135
+ if final_status == "shutdown_requested":
136
+ click.echo("Plugin Catalog closed successfully.")
137
+ else:
138
+ click.echo(f"Plugin Catalog exited with status: {final_status}")
@@ -0,0 +1,309 @@
1
+ import click
2
+ import pathlib
3
+ from cli.utils import (
4
+ get_formatted_names,
5
+ ask_if_not_provided,
6
+ load_template,
7
+ error_exit,
8
+ )
9
+ from cli import __version__ as cli_version
10
+ from .official_registry import is_official_plugin
11
+
12
+ PLUGIN_TYPES = ["agent", "gateway", "custom"]
13
+
14
+ DEFAULT_PLUGIN_TYPE = "agent"
15
+ DEFAULT_AUTHOR_NAME = "Your Name"
16
+ DEFAULT_AUTHOR_EMAIL = "your.email@example.com"
17
+ DEFAULT_PLUGIN_VERSION = "0.1.0"
18
+
19
+
20
+ def ensure_directory_exists(path: pathlib.Path):
21
+ """Creates a directory if it doesn't exist."""
22
+ path.mkdir(parents=True, exist_ok=True)
23
+
24
+
25
+ def replace_placeholders(content: str, replacements: dict) -> str:
26
+ """Replaces placeholders in a string."""
27
+ for placeholder, value in replacements.items():
28
+ content = content.replace(placeholder, str(value))
29
+ return content
30
+
31
+
32
+ def load_plugin_type_config_template(plugin_type: str, replacement: dict) -> str:
33
+ """Loads the template for the specified plugin type."""
34
+ template_name = f"plugin_{plugin_type}_config_template.yaml"
35
+ try:
36
+ return load_template(template_name, replace_placeholders, replacement)
37
+ except FileNotFoundError:
38
+ error_exit(
39
+ f"Template file '{template_name}' not found. Please ensure it exists in the templates directory."
40
+ )
41
+ except Exception as e:
42
+ error_exit(f"Error loading template '{template_name}': {e}")
43
+
44
+
45
+ def setup_plugin_type_src(plugin_type: str, src_path: pathlib.Path, replacements: dict):
46
+ """Sets up the source directory for the specified plugin type."""
47
+
48
+ # --- Generate __init__.py ---
49
+ src_init_py_content = ""
50
+ try:
51
+ with open(src_path / "__init__.py", "w", encoding="utf-8") as f:
52
+ f.write(src_init_py_content)
53
+ click.echo(f" Created: {src_path / '__init__.py'}")
54
+ except IOError as e:
55
+ error_exit(f"Error writing {src_path / '__init__.py'}: {e}")
56
+
57
+ if plugin_type == "agent":
58
+ # --- Generate tools.py ---
59
+ try:
60
+ src_tools_py_content = load_template(
61
+ "plugin_tools_template.py", replace_placeholders, replacements
62
+ )
63
+ with open(src_path / "tools.py", "w", encoding="utf-8") as f:
64
+ f.write(src_tools_py_content)
65
+ click.echo(f" Created: {src_path / 'tools.py'}")
66
+ except FileNotFoundError:
67
+ error_exit(
68
+ "Template file 'plugin_tools_template.py' not found. Please ensure it exists in the templates directory."
69
+ )
70
+ except IOError as e:
71
+ error_exit(f"Error writing {src_path / 'tools.py'}: {e}")
72
+
73
+ elif plugin_type == "gateway":
74
+ placeholders = {
75
+ **replacements,
76
+ "__GATEWAY_NAME_SNAKE_CASE__": replacements["__PLUGIN_SNAKE_CASE_NAME__"],
77
+ "__GATEWAY_NAME_PASCAL_CASE__": replacements["__PLUGIN_PASCAL_CASE_NAME__"],
78
+ "__GATEWAY_NAME_UPPER_CASE__": replacements[
79
+ "__PLUGIN_UPPER_SNAKE_CASE_NAME__"
80
+ ],
81
+ "__GATEWAY_NAME_KEBAB_CASE__": replacements["__PLUGIN_KEBAB_CASE_NAME__"],
82
+ }
83
+ # --- Generate app.py ---
84
+ try:
85
+ src_gateway_py_content = load_template(
86
+ "gateway_app_template.py", replace_placeholders, placeholders
87
+ )
88
+ with open(src_path / "app.py", "w", encoding="utf-8") as f:
89
+ f.write(src_gateway_py_content)
90
+ click.echo(f" Created: {src_path / 'app.py'}")
91
+ except FileNotFoundError:
92
+ error_exit(
93
+ "Template file 'gateway_app_template.py' not found. Please ensure it exists in the templates directory."
94
+ )
95
+ except IOError as e:
96
+ error_exit(f"Error writing {src_path / 'app.py'}: {e}")
97
+ # --- Generate gateway_component_template.py ---
98
+ try:
99
+ src_gateway_component_py_content = load_template(
100
+ "gateway_component_template.py", replace_placeholders, placeholders
101
+ )
102
+ with open(src_path / "component.py", "w", encoding="utf-8") as f:
103
+ f.write(src_gateway_component_py_content)
104
+ click.echo(f" Created: {src_path / 'component.py'}")
105
+ except FileNotFoundError:
106
+ error_exit(
107
+ "Template file 'gateway_component_template.py' not found. Please ensure it exists in the templates directory."
108
+ )
109
+ except IOError as e:
110
+ error_exit(f"Error writing {src_path / 'component.py'}: {e}")
111
+
112
+ elif plugin_type == "custom":
113
+ # --- generate app.py ---
114
+ placeholders = {
115
+ **replacements,
116
+ "__COMPONENT_PASCAL_CASE_NAME__": replacements[
117
+ "__PLUGIN_PASCAL_CASE_NAME__"
118
+ ],
119
+ }
120
+ try:
121
+ src_custom_py_content = load_template(
122
+ "plugin_custom_template.py", replace_placeholders, placeholders
123
+ )
124
+ with open(src_path / "app.py", "w", encoding="utf-8") as f:
125
+ f.write(src_custom_py_content)
126
+ click.echo(f" Created: {src_path / 'app.py'}")
127
+ except FileNotFoundError:
128
+ error_exit(
129
+ "Template file 'plugin_custom_template.py' not found. Please ensure it exists in the templates directory."
130
+ )
131
+ except IOError as e:
132
+ error_exit(f"Error writing {src_path / 'app.py'}: {e}")
133
+
134
+
135
+ @click.command("create")
136
+ @click.argument("plugin_name_arg")
137
+ @click.option("--type", "type_opt", help="Plugin type. Options: agent, gateway, custom")
138
+ @click.option("--author-name", "author_name_opt", help="Author's name.")
139
+ @click.option("--author-email", "author_email_opt", help="Author's email.")
140
+ @click.option("--description", "description_opt", help="Plugin description.")
141
+ @click.option("--version", "version_opt", help="Initial plugin version.")
142
+ @click.option(
143
+ "--skip",
144
+ is_flag=True,
145
+ help="Skip interactive prompts and use defaults or provided flags.",
146
+ )
147
+ def create_plugin_cmd(
148
+ plugin_name_arg: str,
149
+ type_opt: str,
150
+ author_name_opt: str,
151
+ author_email_opt: str,
152
+ description_opt: str,
153
+ version_opt: str,
154
+ skip: bool,
155
+ ):
156
+ """Creates a new SAM plugin directory structure with interactive prompts for metadata."""
157
+
158
+ options = {
159
+ "plugin_name": plugin_name_arg,
160
+ "type": type_opt,
161
+ "author_name": author_name_opt,
162
+ "author_email": author_email_opt,
163
+ "description": description_opt,
164
+ "version": version_opt,
165
+ }
166
+
167
+ plugin_formats = get_formatted_names(plugin_name_arg)
168
+ default_description = f"A SAM plugin: {plugin_formats['SPACED_NAME']}"
169
+
170
+ if is_official_plugin(plugin_formats["KEBAB_CASE_NAME"]) or is_official_plugin(
171
+ plugin_formats["SNAKE_CASE_NAME"]
172
+ ):
173
+ error_exit(
174
+ f"Error: Plugin name '{plugin_name_arg}' conflicts with an official plugin. "
175
+ f"Please choose a different name."
176
+ )
177
+
178
+ if not skip:
179
+ click.echo(
180
+ "Please provide the following details for your new plugin (press Enter to accept defaults):"
181
+ )
182
+
183
+ options["type"] = ask_if_not_provided(
184
+ options,
185
+ "type",
186
+ "Plugin Type",
187
+ default=DEFAULT_PLUGIN_TYPE,
188
+ choices=PLUGIN_TYPES,
189
+ none_interactive=skip,
190
+ ).lower()
191
+ if options["type"] not in PLUGIN_TYPES:
192
+ error_exit(
193
+ f"Invalid plugin type '{options['type']}'. Must be one of: {', '.join(PLUGIN_TYPES)}."
194
+ )
195
+
196
+ options["author_name"] = ask_if_not_provided(
197
+ options,
198
+ "author_name",
199
+ "Author's Name",
200
+ default=DEFAULT_AUTHOR_NAME,
201
+ none_interactive=skip,
202
+ )
203
+ options["author_email"] = ask_if_not_provided(
204
+ options,
205
+ "author_email",
206
+ "Author's Email",
207
+ default=DEFAULT_AUTHOR_EMAIL,
208
+ none_interactive=skip,
209
+ )
210
+ options["description"] = ask_if_not_provided(
211
+ options,
212
+ "description",
213
+ "Plugin Description",
214
+ default=default_description,
215
+ none_interactive=skip,
216
+ )
217
+ options["version"] = ask_if_not_provided(
218
+ options,
219
+ "version",
220
+ "Initial plugin version",
221
+ default=DEFAULT_PLUGIN_VERSION,
222
+ none_interactive=skip,
223
+ )
224
+
225
+ click.echo(f"Creating plugin '{plugin_formats['KEBAB_CASE_NAME']}'...")
226
+
227
+ base_plugin_path = pathlib.Path(plugin_formats["KEBAB_CASE_NAME"])
228
+ src_path = base_plugin_path / "src" / plugin_formats["SNAKE_CASE_NAME"]
229
+
230
+ try:
231
+ ensure_directory_exists(base_plugin_path)
232
+ ensure_directory_exists(src_path)
233
+ except Exception as e:
234
+ error_exit(f"Error creating plugin directories: {e}")
235
+
236
+ replacements = {
237
+ "__PLUGIN_KEBAB_CASE_NAME__": plugin_formats["KEBAB_CASE_NAME"],
238
+ "__PLUGIN_SNAKE_CASE_NAME__": plugin_formats["SNAKE_CASE_NAME"],
239
+ "__PLUGIN_UPPER_SNAKE_CASE_NAME__": plugin_formats["SNAKE_UPPER_CASE_NAME"],
240
+ "__PLUGIN_SPACED_NAME__": plugin_formats["SPACED_NAME"],
241
+ "__PLUGIN_PASCAL_CASE_NAME__": plugin_formats["PASCAL_CASE_NAME"],
242
+ "__PLUGIN_AUTHOR_NAME__": options["author_name"],
243
+ "__PLUGIN_AUTHOR_EMAIL__": options["author_email"],
244
+ "__PLUGIN_DESCRIPTION__": options["description"],
245
+ "__PLUGIN_VERSION__": options["version"],
246
+ "__PLUGIN_META_DATA_TYPE__": options["type"].lower(),
247
+ "__SAM_VERSION__": cli_version,
248
+ "__COMPONENT_KEBAB_CASE_NAME__": "__COMPONENT_KEBAB_CASE_NAME__",
249
+ "__COMPONENT_PASCAL_CASE_NAME__": "__COMPONENT_PASCAL_CASE_NAME__",
250
+ "__COMPONENT_UPPER_SNAKE_CASE_NAME__": "__COMPONENT_UPPER_SNAKE_CASE_NAME__",
251
+ "__COMPONENT_SNAKE_CASE_NAME__": "__COMPONENT_SNAKE_CASE_NAME__",
252
+ }
253
+
254
+ # --- Generate config.yaml ---
255
+ try:
256
+ config_yaml_content = load_plugin_type_config_template(
257
+ options["type"], replacements
258
+ )
259
+ with open(base_plugin_path / "config.yaml", "w", encoding="utf-8") as f:
260
+ f.write(config_yaml_content)
261
+ click.echo(f" Created: {base_plugin_path / 'config.yaml'}")
262
+ except IOError as e:
263
+ error_exit(f"Error writing config.yaml: {e}")
264
+ except Exception as e:
265
+ error_exit(f"Error processing config.yaml template: {e}")
266
+
267
+ # --- Generate pyproject.toml ---
268
+ try:
269
+ pyproject_toml_content = load_template(
270
+ "plugin_pyproject_template.toml", replace_placeholders, replacements
271
+ )
272
+ with open(base_plugin_path / "pyproject.toml", "w", encoding="utf-8") as f:
273
+ f.write(pyproject_toml_content)
274
+ click.echo(f" Created: {base_plugin_path / 'pyproject.toml'}")
275
+ except FileNotFoundError:
276
+ error_exit(
277
+ "Template file 'plugin_pyproject_template.toml' not found. Please ensure it exists in the templates directory."
278
+ )
279
+ except IOError as e:
280
+ error_exit(f"Error writing pyproject.toml: {e}")
281
+ except Exception as e:
282
+ error_exit(f"Error processing pyproject.toml template: {e}")
283
+
284
+ # --- Generate src directory ---
285
+ setup_plugin_type_src(options["type"], src_path, replacements)
286
+
287
+ # --- Generate README.md ---
288
+ try:
289
+ readme_md_content = load_template(
290
+ "plugin_readme_template.md", replace_placeholders, replacements
291
+ )
292
+ with open(base_plugin_path / "README.md", "w", encoding="utf-8") as f:
293
+ f.write(readme_md_content)
294
+ click.echo(f" Created: {base_plugin_path / 'README.md'}")
295
+ except FileNotFoundError:
296
+ error_exit(
297
+ "Template file 'plugin_readme_template.md' not found. Please ensure it exists in the templates directory."
298
+ )
299
+ except IOError as e:
300
+ error_exit(f"Error writing README.md: {e}")
301
+ except Exception as e:
302
+ error_exit(f"Error processing README.md template: {e}")
303
+
304
+ click.echo(
305
+ click.style(
306
+ f"\nPlugin '{plugin_formats['KEBAB_CASE_NAME']}' created successfully at ./{base_plugin_path}",
307
+ fg="green",
308
+ )
309
+ )
@@ -0,0 +1,174 @@
1
+ import httpx
2
+ from pathlib import Path
3
+ from functools import lru_cache
4
+ from typing import Dict, Optional
5
+ import click
6
+ from config_portal.backend.plugin_catalog.constants import (
7
+ DEFAULT_OFFICIAL_REGISTRY_URL, OFFICIAL_REGISTRY_GIT_BRANCH
8
+ )
9
+
10
+ IGNORE_SUB_DIRS = [".git", "__pycache__", ".venv", "node_modules", ".vscode", ".github"]
11
+
12
+
13
+ @lru_cache(maxsize=1)
14
+ def get_official_plugins() -> Dict[str, str]:
15
+ """
16
+ Fetches the list of official plugins from the default registry.
17
+
18
+ Returns:
19
+ Dict[str, str]: A mapping of plugin names to their full URLs/paths
20
+ """
21
+ registry_url = DEFAULT_OFFICIAL_REGISTRY_URL
22
+
23
+ if _is_github_url(registry_url):
24
+ return _fetch_github_plugins(registry_url, branch=OFFICIAL_REGISTRY_GIT_BRANCH)
25
+ else:
26
+ return _fetch_local_plugins(registry_url)
27
+
28
+
29
+ def _is_github_url(url: str) -> bool:
30
+ """Check if the URL is a GitHub repository URL."""
31
+ return url.startswith("https://github.com/") or url.startswith("http://github.com/")
32
+
33
+
34
+ def _fetch_github_plugins(github_url: str, branch: str = None) -> Dict[str, str]:
35
+ """
36
+ Fetch plugin list from GitHub repository using the GitHub API.
37
+
38
+ Args:
39
+ github_url: GitHub repository URL
40
+ branch: Optional branch name to fetch plugins from
41
+
42
+ Returns:
43
+ Dict[str, str]: Mapping of plugin names to their full GitHub URLs
44
+ """
45
+ try:
46
+ if github_url.endswith(".git"):
47
+ github_url = github_url[:-4]
48
+
49
+ parts = (
50
+ github_url.replace("https://github.com/", "")
51
+ .replace("http://github.com/", "")
52
+ .split("/")
53
+ )
54
+ if len(parts) < 2:
55
+ click.echo(
56
+ click.style(f"Error: Invalid GitHub URL format: {github_url}", fg="red")
57
+ )
58
+ return {}
59
+
60
+ owner, repo = parts[0], parts[1]
61
+ api_url = f"https://api.github.com/repos/{owner}/{repo}/contents"
62
+ if branch:
63
+ api_url += f"?ref={branch}"
64
+
65
+ with httpx.Client() as client:
66
+ response = client.get(api_url, timeout=10.0)
67
+ response.raise_for_status()
68
+
69
+ contents = response.json()
70
+
71
+ plugins = {}
72
+ for item in contents:
73
+ if item.get("type") == "dir" and item["name"] not in IGNORE_SUB_DIRS:
74
+ plugin_name = item["name"]
75
+ plugin_url = f"git+{github_url}"
76
+ if branch:
77
+ plugin_url += f"@{branch}"
78
+ plugin_url += f"#subdirectory={plugin_name}"
79
+ plugins[plugin_name] = plugin_url
80
+
81
+ return plugins
82
+
83
+ except httpx.RequestError as e:
84
+ click.echo(click.style(f"Error fetching plugins from GitHub: {e}", fg="red"))
85
+ return {}
86
+ except httpx.HTTPStatusError as e:
87
+ click.echo(
88
+ click.style(f"HTTP error fetching plugins from GitHub: {e}", fg="red")
89
+ )
90
+ return {}
91
+ except Exception as e:
92
+ click.echo(
93
+ click.style(f"Unexpected error fetching plugins from GitHub: {e}", fg="red")
94
+ )
95
+ return {}
96
+
97
+
98
+ def _fetch_local_plugins(local_path: str) -> Dict[str, str]:
99
+ """
100
+ Fetch plugin list from local filesystem.
101
+
102
+ Args:
103
+ local_path: Local directory path
104
+
105
+ Returns:
106
+ Dict[str, str]: Mapping of plugin names to their full local paths
107
+ """
108
+ try:
109
+ path = Path(local_path).expanduser().resolve()
110
+
111
+ if not path.exists():
112
+ click.echo(
113
+ click.style(
114
+ f"Error: Local plugin registry path does not exist: {path}",
115
+ fg="red",
116
+ )
117
+ )
118
+ return {}
119
+
120
+ if not path.is_dir():
121
+ click.echo(
122
+ click.style(
123
+ f"Error: Local plugin registry path is not a directory: {path}",
124
+ fg="red",
125
+ )
126
+ )
127
+ return {}
128
+
129
+ plugins = {}
130
+ for item in path.iterdir():
131
+ if item.is_dir() and item.name not in IGNORE_SUB_DIRS:
132
+ plugin_name = item.name
133
+ plugins[plugin_name] = str(item)
134
+
135
+ return plugins
136
+
137
+ except Exception as e:
138
+ click.echo(
139
+ click.style(f"Error fetching plugins from local path: {e}", fg="red")
140
+ )
141
+ return {}
142
+
143
+
144
+ def is_official_plugin(plugin_name: str) -> bool:
145
+ """
146
+ Check if a plugin name is an official plugin.
147
+
148
+ Args:
149
+ plugin_name: Name of the plugin to check
150
+
151
+ Returns:
152
+ bool: True if the plugin is official, False otherwise
153
+ """
154
+ official_plugins = get_official_plugins()
155
+ return plugin_name in official_plugins
156
+
157
+
158
+ def get_official_plugin_url(plugin_name: str) -> Optional[str]:
159
+ """
160
+ Get the full URL/path for an official plugin.
161
+
162
+ Args:
163
+ plugin_name: Name of the official plugin
164
+
165
+ Returns:
166
+ Optional[str]: Full URL/path if plugin is official, None otherwise
167
+ """
168
+ # if the plugin_name is a git path, url, or a local path, it can't be an official plugin
169
+ if plugin_name.startswith(
170
+ ("git+", "http://", "https://", "file://", "/", "./", "../", "~/")
171
+ ):
172
+ return False
173
+ official_plugins = get_official_plugins()
174
+ return official_plugins.get(plugin_name)