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,160 @@
1
+ import json
2
+ import os
3
+ import hashlib
4
+ from pathlib import Path
5
+ from typing import List, Optional, Dict, Any
6
+ from pydantic import ValidationError
7
+
8
+ from .models import Registry
9
+ from .constants import DEFAULT_OFFICIAL_REGISTRY_URL, USER_REGISTRIES_PATH, OFFICIAL_REGISTRY_GIT_BRANCH
10
+
11
+
12
+ class RegistryManager:
13
+ def __init__(self):
14
+ self.user_registries_file = Path(os.path.expanduser(USER_REGISTRIES_PATH))
15
+ self.user_registries_file.parent.mkdir(parents=True, exist_ok=True)
16
+
17
+ def _generate_registry_id(self, path_or_url: str) -> str:
18
+ """Generates a consistent ID for a registry based on its path or URL."""
19
+ return hashlib.md5(path_or_url.encode("utf-8")).hexdigest()
20
+
21
+ def get_all_registries(self) -> List[Registry]:
22
+ default_id = self._generate_registry_id(DEFAULT_OFFICIAL_REGISTRY_URL)
23
+ default_official_registry = Registry(
24
+ id=default_id,
25
+ path_or_url=DEFAULT_OFFICIAL_REGISTRY_URL,
26
+ name="official_sam_plugins",
27
+ type=(
28
+ "git"
29
+ if DEFAULT_OFFICIAL_REGISTRY_URL.startswith(
30
+ ("http://", "https://", "git@")
31
+ )
32
+ else "local"
33
+ ),
34
+ is_default=True,
35
+ is_official_source=True,
36
+ git_branch=OFFICIAL_REGISTRY_GIT_BRANCH
37
+ )
38
+
39
+ registries_map: Dict[str, Registry] = {
40
+ default_official_registry.id: default_official_registry
41
+ }
42
+
43
+ if self.user_registries_file.exists():
44
+ try:
45
+ with open(self.user_registries_file, "r") as f:
46
+ loaded_data = json.load(f)
47
+ if isinstance(loaded_data, list):
48
+ for reg_dict in loaded_data:
49
+ if isinstance(reg_dict, dict):
50
+ try:
51
+ registry_obj = Registry(**reg_dict)
52
+ if registry_obj.id not in registries_map:
53
+ registries_map[registry_obj.id] = registry_obj
54
+ except ValidationError as ve:
55
+ print(
56
+ f"Warning: Invalid registry data in user registries file: {reg_dict}. Error: {ve}"
57
+ )
58
+ except Exception as e_parse:
59
+ print(
60
+ f"Warning: Could not parse registry item '{reg_dict}' from user registries: {e_parse}"
61
+ )
62
+ else:
63
+ print(
64
+ f"Warning: Non-dictionary item found in user registries list: {reg_dict}"
65
+ )
66
+ else:
67
+ print(
68
+ f"Warning: User registries file ({self.user_registries_file}) does not contain a list. Ignoring."
69
+ )
70
+ except json.JSONDecodeError:
71
+ print(
72
+ f"Error decoding user registries file: {self.user_registries_file}. A new file will be created if a registry is added."
73
+ )
74
+ except Exception as e:
75
+ print(
76
+ f"An unexpected error occurred while reading {self.user_registries_file}: {e}"
77
+ )
78
+
79
+ return list(registries_map.values())
80
+
81
+ def add_registry(self, path_or_url: str, name: Optional[str] = None) -> bool:
82
+ original_path_or_url = path_or_url
83
+
84
+ if path_or_url.startswith(("http://", "https://", "git@")):
85
+ registry_type = "git"
86
+ else:
87
+ registry_type = "local"
88
+ try:
89
+ expanded_path = Path(os.path.expanduser(path_or_url))
90
+ if not expanded_path.exists() or not expanded_path.is_dir():
91
+ print(
92
+ f"Error: Local path for registry does not exist or is not a directory: {expanded_path}"
93
+ )
94
+ return False
95
+ path_or_url = str(expanded_path.resolve())
96
+ except Exception as e_path:
97
+ print(f"Error processing local path '{original_path_or_url}': {e_path}")
98
+ return False
99
+
100
+ registry_id = self._generate_registry_id(path_or_url)
101
+
102
+ final_name = name
103
+ if not final_name:
104
+ if registry_type == "git":
105
+ final_name = Path(original_path_or_url).name.replace(".git", "")
106
+ else:
107
+ final_name = Path(path_or_url).name
108
+
109
+ is_official_src = path_or_url == DEFAULT_OFFICIAL_REGISTRY_URL
110
+
111
+ try:
112
+ new_registry = Registry(
113
+ id=registry_id,
114
+ path_or_url=path_or_url,
115
+ name=final_name,
116
+ type=registry_type,
117
+ is_default=False,
118
+ is_official_source=is_official_src,
119
+ )
120
+ except ValidationError as ve:
121
+ print(f"Invalid registry data for '{path_or_url}': {ve}")
122
+ return False
123
+
124
+ current_registries_data: List[Dict[str, Any]] = []
125
+ if self.user_registries_file.exists():
126
+ try:
127
+ with open(self.user_registries_file, "r") as f:
128
+ loaded_data = json.load(f)
129
+ if isinstance(loaded_data, list):
130
+ current_registries_data = [
131
+ item for item in loaded_data if isinstance(item, dict)
132
+ ]
133
+ except json.JSONDecodeError:
134
+ print(
135
+ f"Warning: User registries file {self.user_registries_file} is corrupted. It will be overwritten."
136
+ )
137
+ except Exception as e:
138
+ print(
139
+ f"An unexpected error occurred while reading {self.user_registries_file} before adding: {e}"
140
+ )
141
+
142
+ if any(
143
+ r_data.get("id") == new_registry.id for r_data in current_registries_data
144
+ ):
145
+ print(
146
+ f"Registry with path/URL '{path_or_url}' (ID: {new_registry.id}) already exists."
147
+ )
148
+ return False
149
+
150
+ current_registries_data.append(new_registry.model_dump())
151
+
152
+ try:
153
+ with open(self.user_registries_file, "w") as f:
154
+ json.dump(current_registries_data, f, indent=2)
155
+ return True
156
+ except Exception as e:
157
+ print(
158
+ f"Error writing to user registries file {self.user_registries_file}: {e}"
159
+ )
160
+ return False
@@ -0,0 +1,525 @@
1
+ import git
2
+ import toml
3
+ import yaml
4
+ import os
5
+ import shutil
6
+ from pathlib import Path
7
+ from typing import List, Optional, Tuple
8
+ import logging
9
+
10
+ from .models import (
11
+ PluginScrapedInfo,
12
+ PyProjectDetails,
13
+ PyProjectAuthor,
14
+ AgentCard,
15
+ AgentCardSkill,
16
+ Registry,
17
+ )
18
+ from .constants import (
19
+ PLUGIN_CATALOG_TEMP_DIR,
20
+ IGNORE_OFFICIAL_FLAG_REPOS,
21
+ DEFAULT_OFFICIAL_REGISTRY_URL,
22
+ )
23
+
24
+ logger = logging.getLogger(__name__)
25
+ logging.basicConfig(
26
+ level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
27
+ )
28
+
29
+
30
+ class PluginScraper:
31
+ def __init__(self):
32
+ self.temp_base_dir = Path(os.path.expanduser(PLUGIN_CATALOG_TEMP_DIR))
33
+ self.temp_base_dir.mkdir(parents=True, exist_ok=True)
34
+ self.plugin_cache: List[PluginScrapedInfo] = []
35
+ self.is_cache_populated = False
36
+
37
+ def _clear_temp_dir(self, specific_repo_dir: Optional[Path] = None):
38
+ """Clears a specific repository's temporary directory."""
39
+ if (
40
+ specific_repo_dir
41
+ and specific_repo_dir.exists()
42
+ and specific_repo_dir.is_relative_to(self.temp_base_dir)
43
+ ):
44
+ try:
45
+ shutil.rmtree(specific_repo_dir)
46
+ logger.info("Cleared temporary directory: %s", specific_repo_dir)
47
+ except Exception as e:
48
+ logger.error(
49
+ "Error clearing temporary directory %s: %s", specific_repo_dir, e
50
+ )
51
+ elif specific_repo_dir:
52
+ logger.warning(
53
+ "Attempted to clear directory outside temp_base_dir or non-existent: %s",
54
+ specific_repo_dir,
55
+ )
56
+
57
+ def _parse_pyproject(self, plugin_dir: Path) -> Optional[PyProjectDetails]:
58
+ pyproject_path = plugin_dir / "pyproject.toml"
59
+ if not pyproject_path.exists():
60
+ logger.debug("pyproject.toml not found in %s", plugin_dir)
61
+ return None
62
+ try:
63
+ data = toml.load(pyproject_path)
64
+ project_data = data.get("project", {})
65
+
66
+ authors_data = project_data.get("authors", [])
67
+ authors_list: List[PyProjectAuthor] = []
68
+ if isinstance(authors_data, list):
69
+ for author_entry in authors_data:
70
+ if isinstance(author_entry, dict):
71
+ authors_list.append(
72
+ PyProjectAuthor(
73
+ name=author_entry.get("name"),
74
+ email=author_entry.get("email"),
75
+ )
76
+ )
77
+
78
+ version = project_data.get("version", "0.0.0")
79
+ if isinstance(version, dict) and version.get("from"):
80
+ version_file_path = plugin_dir / version["from"]
81
+ try:
82
+ if version_file_path.exists():
83
+ content = version_file_path.read_text()
84
+ import re
85
+
86
+ match = re.search(
87
+ r"__version__\s*=\s*[\"']([^\"']+)[\"']", content
88
+ )
89
+ if match:
90
+ version = match.group(1)
91
+ else:
92
+ logger.warning(
93
+ "Could not extract version from %s for %s, using pyproject.toml version or default.",
94
+ version_file_path,
95
+ plugin_dir.name,
96
+ )
97
+ version = project_data.get("version", "0.0.0")
98
+ except Exception as e_ver:
99
+ logger.warning(
100
+ "Error reading version from %s for %s: %s. Using pyproject.toml version or default.",
101
+ version_file_path,
102
+ plugin_dir.name,
103
+ e_ver,
104
+ )
105
+ version = project_data.get("version", "0.0.0")
106
+
107
+ project_name_for_tool_table = project_data.get("name", "").replace("-", "_")
108
+ custom_metadata_dict = None
109
+ plugin_type_str = "custom"
110
+
111
+ if project_name_for_tool_table:
112
+ tool_data = data.get("tool", {})
113
+ plugin_specific_tool_data = tool_data.get(
114
+ project_name_for_tool_table, {}
115
+ )
116
+ if isinstance(plugin_specific_tool_data.get("metadata"), dict):
117
+ custom_metadata_dict = plugin_specific_tool_data["metadata"]
118
+ plugin_type_str = custom_metadata_dict.get("type", "custom")
119
+ else:
120
+ logger.debug(
121
+ "No [tool.%s.metadata] table found or it's not a dictionary in %s",
122
+ project_name_for_tool_table,
123
+ pyproject_path,
124
+ )
125
+ else:
126
+ logger.debug(
127
+ "Project name not found in %s, cannot look for [tool.<plugin_name>.metadata]",
128
+ pyproject_path,
129
+ )
130
+
131
+ return PyProjectDetails(
132
+ name=project_data.get("name", plugin_dir.name),
133
+ version=str(version),
134
+ description=project_data.get("description"),
135
+ authors=authors_list if authors_list else None,
136
+ plugin_type=plugin_type_str,
137
+ custom_metadata=custom_metadata_dict,
138
+ )
139
+ except Exception as e:
140
+ logger.error("Error parsing %s: %s", pyproject_path, e)
141
+ return None
142
+
143
+ def _parse_config_yaml(self, plugin_dir: Path) -> Optional[AgentCard]:
144
+ config_yaml_path = plugin_dir / "config.yaml"
145
+ if not config_yaml_path.exists():
146
+ logger.debug("config.yaml not found in %s", plugin_dir)
147
+ return None
148
+ try:
149
+ with open(config_yaml_path, "r", encoding="utf-8") as f:
150
+ data = yaml.safe_load(f)
151
+
152
+ if not data or not isinstance(data, dict):
153
+ logger.warning(
154
+ "Config file %s is empty or not a dictionary.", config_yaml_path
155
+ )
156
+ return None
157
+
158
+ agent_card_data = None
159
+
160
+ if isinstance(data.get("agent_card"), dict):
161
+ agent_card_data = data["agent_card"]
162
+ elif isinstance(data.get("apps"), list) and len(data["apps"]) > 0:
163
+ app_one = data["apps"][0]
164
+ if isinstance(app_one, dict):
165
+ app_config = app_one.get("app_config")
166
+ if isinstance(app_config, dict) and isinstance(
167
+ app_config.get("agent_card"), dict
168
+ ):
169
+ agent_card_data = app_config["agent_card"]
170
+
171
+ if not agent_card_data:
172
+ logger.debug(
173
+ "No valid 'agent_card' section found in %s.", config_yaml_path
174
+ )
175
+ return None
176
+
177
+ skills_data_raw = agent_card_data.get(
178
+ "skills", agent_card_data.get("Skill", [])
179
+ )
180
+ skills_list: List[AgentCardSkill] = []
181
+ if isinstance(skills_data_raw, list):
182
+ for skill_item in skills_data_raw:
183
+ if isinstance(skill_item, dict):
184
+ skill_name = skill_item.get("name")
185
+ skill_description = skill_item.get("description")
186
+ if skill_name:
187
+ skills_list.append(
188
+ AgentCardSkill(
189
+ name=skill_name, description=skill_description
190
+ )
191
+ )
192
+ else:
193
+ logger.warning(
194
+ "Skill item in %s missing 'name': %s",
195
+ config_yaml_path,
196
+ skill_item,
197
+ )
198
+
199
+ display_name = agent_card_data.get("displayName")
200
+ short_description = agent_card_data.get(
201
+ "shortDescription", agent_card_data.get("description")
202
+ )
203
+
204
+ return AgentCard(
205
+ displayName=display_name,
206
+ shortDescription=short_description,
207
+ Skill=skills_list if skills_list else None,
208
+ )
209
+ except yaml.YAMLError as ye:
210
+ logger.error("YAML parsing error in %s: %s", config_yaml_path, ye)
211
+ return None
212
+ except Exception as e:
213
+ logger.error("Error processing %s: %s", config_yaml_path, e)
214
+ return None
215
+
216
+ def _read_readme(self, plugin_dir: Path) -> Optional[str]:
217
+ readme_path = plugin_dir / "README.md"
218
+ if readme_path.exists():
219
+ try:
220
+ return readme_path.read_text(encoding="utf-8")
221
+ except Exception as e:
222
+ logger.error("Error reading %s: %s", readme_path, e)
223
+ logger.debug("README.md not found in %s", plugin_dir)
224
+ return None
225
+
226
+ def _scrape_git_registry(self, registry: Registry) -> List[PluginScrapedInfo]:
227
+ repo_identifier = (
228
+ registry.name
229
+ if registry.name
230
+ else Path(registry.path_or_url).name.replace(".git", "")
231
+ )
232
+ repo_local_path = self.temp_base_dir / repo_identifier
233
+ plugins_found: List[PluginScrapedInfo] = []
234
+
235
+ try:
236
+ if repo_local_path.exists():
237
+ logger.info(
238
+ "Git registry %s already cloned. Pulling latest changes from %s.",
239
+ repo_identifier,
240
+ registry.path_or_url,
241
+ )
242
+ cloned_repo = git.Repo(repo_local_path)
243
+ cloned_repo.remotes.origin.pull()
244
+ else:
245
+ logger.info(
246
+ "Cloning git registry: %s to %s",
247
+ registry.path_or_url,
248
+ repo_local_path,
249
+ )
250
+ kwargs = {}
251
+ if registry.git_branch:
252
+ kwargs["branch"] = registry.git_branch
253
+ git.Repo.clone_from(
254
+ registry.path_or_url,
255
+ repo_local_path,
256
+ **kwargs
257
+ )
258
+
259
+ for item in repo_local_path.iterdir():
260
+ if item.is_dir() and not item.name.startswith("."):
261
+ plugin_dir = item
262
+ if (
263
+ not (plugin_dir / "pyproject.toml").exists()
264
+ or not (plugin_dir / "config.yaml").exists()
265
+ ):
266
+ logger.debug(
267
+ "Skipping %s in %s, missing required pyproject.toml or config.yaml.",
268
+ plugin_dir.name,
269
+ repo_identifier,
270
+ )
271
+ continue
272
+
273
+ pyproject_details = self._parse_pyproject(plugin_dir)
274
+ if not pyproject_details:
275
+ logger.warning(
276
+ "Could not parse pyproject.toml for %s in %s",
277
+ plugin_dir.name,
278
+ registry.path_or_url,
279
+ )
280
+ continue
281
+
282
+ agent_card_details = self._parse_config_yaml(plugin_dir)
283
+ readme_content = self._read_readme(plugin_dir)
284
+
285
+ plugin_id = f"{registry.id}_{plugin_dir.name}"
286
+ plugin_subpath = plugin_dir.relative_to(repo_local_path).as_posix()
287
+
288
+ is_official_flag = (
289
+ registry.is_official_source
290
+ and plugin_dir.name not in IGNORE_OFFICIAL_FLAG_REPOS
291
+ )
292
+
293
+ plugins_found.append(
294
+ PluginScrapedInfo(
295
+ id=plugin_id,
296
+ pyproject=pyproject_details,
297
+ agent_card=agent_card_details,
298
+ readme_content=readme_content,
299
+ source_registry_name=registry.name,
300
+ source_registry_location=str(registry.path_or_url),
301
+ source_type="git",
302
+ plugin_subpath=plugin_subpath,
303
+ is_official=is_official_flag,
304
+ )
305
+ )
306
+ logger.info(
307
+ "Found %d plugins in git registry %s",
308
+ len(plugins_found),
309
+ registry.path_or_url,
310
+ )
311
+ except git.GitCommandError as e:
312
+ logger.error("Git command error for %s: %s", registry.path_or_url, e)
313
+ except Exception as e:
314
+ logger.error(
315
+ "Unexpected error scraping git registry %s: %s", registry.path_or_url, e
316
+ )
317
+ return plugins_found
318
+
319
+ def _scrape_local_registry(self, registry: Registry) -> List[PluginScrapedInfo]:
320
+ registry_path = Path(registry.path_or_url)
321
+ plugins_found: List[PluginScrapedInfo] = []
322
+ logger.info(
323
+ "Scraping local registry: %s (Name: %s)", registry_path, registry.name
324
+ )
325
+
326
+ if not registry_path.exists() or not registry_path.is_dir():
327
+ logger.error(
328
+ "Local registry path does not exist or is not a directory: %s",
329
+ registry_path,
330
+ )
331
+ return plugins_found
332
+
333
+ for item in registry_path.iterdir():
334
+ if item.is_dir() and not item.name.startswith("."):
335
+ plugin_dir = item
336
+ if (
337
+ not (plugin_dir / "pyproject.toml").exists()
338
+ or not (plugin_dir / "config.yaml").exists()
339
+ ):
340
+ logger.debug(
341
+ "Skipping %s in local registry %s, missing required pyproject.toml or config.yaml.",
342
+ plugin_dir.name,
343
+ registry.name,
344
+ )
345
+ continue
346
+
347
+ pyproject_details = self._parse_pyproject(plugin_dir)
348
+ if not pyproject_details:
349
+ logger.warning(
350
+ "Could not parse pyproject.toml for %s in local registry %s",
351
+ plugin_dir.name,
352
+ registry.name,
353
+ )
354
+ continue
355
+
356
+ agent_card_details = self._parse_config_yaml(plugin_dir)
357
+ readme_content = self._read_readme(plugin_dir)
358
+
359
+ plugin_id = f"{registry.id}_{plugin_dir.name}"
360
+ plugin_subpath = plugin_dir.name
361
+
362
+ is_official_flag = (
363
+ registry.is_official_source
364
+ and plugin_dir.name not in IGNORE_OFFICIAL_FLAG_REPOS
365
+ )
366
+
367
+ plugins_found.append(
368
+ PluginScrapedInfo(
369
+ id=plugin_id,
370
+ pyproject=pyproject_details,
371
+ agent_card=agent_card_details,
372
+ readme_content=readme_content,
373
+ source_registry_name=registry.name,
374
+ source_registry_location=str(registry.path_or_url),
375
+ source_type="local",
376
+ plugin_subpath=plugin_subpath,
377
+ is_official=is_official_flag,
378
+ )
379
+ )
380
+ logger.info(
381
+ "Found %d plugins in local registry %s",
382
+ len(plugins_found),
383
+ registry.path_or_url,
384
+ )
385
+ return plugins_found
386
+
387
+ def get_all_plugins(
388
+ self, registries: List[Registry], force_refresh: bool = False
389
+ ) -> List[PluginScrapedInfo]:
390
+ if not force_refresh and self.is_cache_populated:
391
+ logger.info("Returning cached plugins.")
392
+ return self.plugin_cache
393
+
394
+ logger.info("Refreshing plugin cache. Force refresh: %s", force_refresh)
395
+ self.plugin_cache.clear()
396
+ for reg_model in registries:
397
+ if reg_model.type == "git":
398
+ self.plugin_cache.extend(self._scrape_git_registry(reg_model))
399
+ elif reg_model.type == "local":
400
+ self.plugin_cache.extend(self._scrape_local_registry(reg_model))
401
+ else:
402
+ logger.warning(
403
+ "Unknown registry type '%s' for registry ID '%s'. Skipping.",
404
+ reg_model.type,
405
+ reg_model.id,
406
+ )
407
+
408
+ self.is_cache_populated = True
409
+ logger.info(
410
+ "Plugin cache refreshed. Total plugins found: %d", len(self.plugin_cache)
411
+ )
412
+ return self.plugin_cache
413
+
414
+ def get_plugin_details(self, plugin_id: str) -> Optional[PluginScrapedInfo]:
415
+ if not self.is_cache_populated:
416
+ logger.warning(
417
+ "Plugin cache was not populated when trying to get details. This might indicate an issue or a fresh start."
418
+ )
419
+ for plugin in self.plugin_cache:
420
+ if plugin.id == plugin_id:
421
+ return plugin
422
+ logger.warning("Plugin with ID '%s' not found in cache.", plugin_id)
423
+ return None
424
+
425
+ def install_plugin_cli(
426
+ self, plugin_info: PluginScrapedInfo, component_name: str
427
+ ) -> Tuple[bool, str]:
428
+ plugin_local_fs_path: Optional[Path] = None
429
+
430
+ if plugin_info.source_type == "git":
431
+ repo_identifier = (
432
+ plugin_info.source_registry_name
433
+ if plugin_info.source_registry_name
434
+ else Path(plugin_info.source_registry_location).name.replace(".git", "")
435
+ )
436
+ repo_temp_path = self.temp_base_dir / repo_identifier
437
+
438
+ try:
439
+ temp_registry_for_git_op = Registry(
440
+ id="temp_install_op_id",
441
+ path_or_url=plugin_info.source_registry_location,
442
+ name=plugin_info.source_registry_name,
443
+ type="git",
444
+ is_default=(
445
+ plugin_info.source_registry_location
446
+ == DEFAULT_OFFICIAL_REGISTRY_URL
447
+ ),
448
+ is_official_source=plugin_info.is_official,
449
+ )
450
+ self._scrape_git_registry(temp_registry_for_git_op)
451
+ except Exception as e_reg_create:
452
+ logger.error(
453
+ "Could not prepare temporary registry for Git operation during install: %s",
454
+ e_reg_create,
455
+ )
456
+ return (
457
+ False,
458
+ f"Internal error preparing for Git operation: {e_reg_create}",
459
+ )
460
+
461
+ plugin_local_fs_path = repo_temp_path / plugin_info.plugin_subpath
462
+
463
+ elif plugin_info.source_type == "local":
464
+ plugin_local_fs_path = (
465
+ Path(plugin_info.source_registry_location) / plugin_info.plugin_subpath
466
+ )
467
+
468
+ else:
469
+ return False, f"Unknown plugin source type: {plugin_info.source_type}"
470
+
471
+ if not plugin_local_fs_path or not plugin_local_fs_path.exists():
472
+ return (
473
+ False,
474
+ f"Plugin source path {plugin_local_fs_path} not found or could not be determined.",
475
+ )
476
+ installer_command = os.environ.get("SAM_PLUGIN_INSTALL_COMMAND")
477
+ command = [
478
+ "sam",
479
+ "plugin",
480
+ "add",
481
+ component_name,
482
+ "--plugin",
483
+ str(plugin_local_fs_path),
484
+ ]
485
+ if installer_command:
486
+ command.extend(["--install-command", installer_command])
487
+
488
+ logger.info("Executing install command: %s", " ".join(command))
489
+ try:
490
+ import subprocess
491
+
492
+ result = subprocess.run(
493
+ command, capture_output=True, text=True, check=False, encoding="utf-8"
494
+ )
495
+
496
+ if result.returncode == 0:
497
+ msg = f"Plugin '{plugin_info.pyproject.name}' installed as '{component_name}' successfully."
498
+ logger.info(msg)
499
+ if result.stdout:
500
+ logger.info(result.stdout)
501
+ return True, msg
502
+ else:
503
+ err_msg = f"Failed to install plugin '{plugin_info.pyproject.name}'. SAM CLI exit code: {result.returncode}"
504
+ logger.error(err_msg)
505
+ if result.stderr:
506
+ logger.error("Install STDERR: %s", result.stderr)
507
+ if result.stdout:
508
+ logger.error("Install STDOUT: %s", result.stdout)
509
+ return (
510
+ False,
511
+ f"{err_msg}\nDetails: {result.stderr or result.stdout}".strip(),
512
+ )
513
+ except FileNotFoundError:
514
+ logger.error(
515
+ "'sam' command not found. Ensure SAM CLI is installed and in PATH."
516
+ )
517
+ return (
518
+ False,
519
+ "'sam' command not found. Ensure SAM CLI is installed and in PATH.",
520
+ )
521
+ except Exception as e:
522
+ logger.exception(
523
+ "Exception during plugin installation command execution: %s", e
524
+ )
525
+ return False, f"An unexpected error occurred during installation: {e}"