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
@@ -1,177 +0,0 @@
1
- """Slack Post Message action."""
2
-
3
- from typing import Dict, List, Union
4
-
5
- from solace_ai_connector.common.log import log
6
- from ....common.action import Action
7
- from ....common.time import FIVE_MINUTES
8
- from ....common.action_response import ActionResponse
9
- from ....services.file_service import FileService, FS_PROTOCOL
10
-
11
-
12
- class PostMessage(Action):
13
- """Action for posting messages to Slack channels."""
14
-
15
- def __init__(self, **kwargs):
16
- """Initialize the action with its configuration."""
17
- super().__init__(
18
- {
19
- "name": "post_message",
20
- "prompt_directive": "Post a message to a Slack channel",
21
- "params": [
22
- {
23
- "name": "channel",
24
- "desc": "The Slack channel to post to (include # prefix)",
25
- "type": "string",
26
- },
27
- {
28
- "name": "thread_correlation_id",
29
- "desc": "Optional correlation ID to group messages in a thread",
30
- "type": "string",
31
- },
32
- {
33
- "name": "text",
34
- "desc": "Text message to post",
35
- "type": "string",
36
- },
37
- {
38
- "name": "blocks",
39
- "desc": "Slack blocks for formatted message",
40
- "type": "array",
41
- },
42
- {
43
- "name": "files",
44
- "desc": f"Array of file URLs ({FS_PROTOCOL}:// or inline files with <file><data/></file> tags)",
45
- "type": "array",
46
- },
47
- {
48
- "name": "last_post_to_thread",
49
- "desc": "If True, clears the thread correlation cache after posting",
50
- "type": "bool",
51
- },
52
- ],
53
- "required_scopes": ["slack:post_message:create"],
54
- },
55
- **kwargs,
56
- )
57
-
58
- def _process_files(
59
- self, files: List[str], session_id: str
60
- ) -> List[Dict[str, Union[str, bytes]]]:
61
- """Process file URLs into uploadable content.
62
-
63
- Args:
64
- files: List of file URLs to process
65
- session_id: Current session ID for file service
66
-
67
- Returns:
68
- List of dicts containing file data and titles
69
- """
70
- if not files:
71
- return []
72
-
73
- file_service = FileService()
74
- processed_files = []
75
-
76
- for file_url in files:
77
- try:
78
- # Download file content
79
- content = file_service.download_to_buffer(file_url, session_id)
80
-
81
- # Extract filename from URL
82
- filename = file_url.split("/")[-1]
83
- processed_files.append(
84
- {
85
- "content": content,
86
- "title": filename,
87
- }
88
- )
89
- except Exception as e:
90
- log.error("Failed to process file %s: %s", file_url, str(e))
91
-
92
- return processed_files
93
-
94
- def invoke(self, params: Dict, meta: Dict = {}) -> ActionResponse:
95
- """Post message to Slack channel.
96
-
97
- Args:
98
- params: Action parameters including channel, message, etc.
99
- meta: Additional metadata including session_id
100
-
101
- Returns:
102
- ActionResponse with success/error message
103
- """
104
- try:
105
- # Get Slack client from agent
106
- slack_client = self.get_agent().slack_client
107
-
108
- channel = params.get("channel", "").strip()
109
-
110
- # Remove the # prefix if present
111
- if channel.startswith("#"):
112
- channel = channel[1:]
113
-
114
- # Get thread_ts from correlation id if provided
115
- thread_correlation_id = params.get("thread_correlation_id")
116
- thread_ts = None
117
- if thread_correlation_id:
118
- cache_key = f"slack_agent:thread_correlation:{thread_correlation_id}"
119
- thread_ts = self.get_agent().cache_service.get_data(cache_key)
120
-
121
- # Prepare message arguments
122
- msg_args = {
123
- "channel": channel,
124
- "text": params.get("text", ""),
125
- "blocks": params.get("blocks"),
126
- "thread_ts": thread_ts,
127
- }
128
-
129
- # Send message
130
- response = slack_client.chat_postMessage(**msg_args)
131
-
132
- # Handle thread correlation caching
133
- if thread_correlation_id:
134
- cache_key = f"slack_agent:thread_correlation:{thread_correlation_id}"
135
-
136
- # Clear cache if this is the last post
137
- if params.get("last_post_to_thread"):
138
- self.get_agent().cache_service.remove_data(cache_key)
139
- # Store thread_ts if this is a new thread
140
- elif not thread_ts:
141
- thread_cache_ttl = self.get_agent().get_config("thread_cache_ttl")
142
- self.get_agent().cache_service.add_data(
143
- cache_key,
144
- response["ts"],
145
- expiry=thread_cache_ttl,
146
- component=self.get_agent(),
147
- )
148
- msg_args["thread_ts"] = response["ts"]
149
-
150
- # Process any files
151
- files = params.get("files", [])
152
- if files:
153
- processed_files = self._process_files(files, meta.get("session_id"))
154
- for file_data in processed_files:
155
- slack_client.files_upload_v2(
156
- channel=channel,
157
- content=file_data["content"],
158
- title=file_data["title"],
159
- thread_ts=msg_args["thread_ts"],
160
- )
161
-
162
- # Return thread_correlation_id in message for reference
163
- return ActionResponse(
164
- message=(
165
- f"Successfully posted message to {channel}. "
166
- f"Thread correlation ID: {thread_correlation_id or 'none'}"
167
- + (
168
- f" (thread_ts: {response['ts']})"
169
- if not thread_ts
170
- else f" (replied to existing thread)"
171
- )
172
- )
173
- )
174
-
175
- except Exception as e:
176
- log.error("Failed to post Slack message: %s", str(e))
177
- return ActionResponse(message=f"Failed to post message to Slack: {str(e)}")
@@ -1,59 +0,0 @@
1
- """Slack agent for posting messages to Slack channels."""
2
-
3
- import copy
4
- from slack_sdk import WebClient
5
-
6
- from ..base_agent_component import agent_info, BaseAgentComponent
7
- from .actions.post_message import PostMessage
8
- from ...common.time import FIVE_MINUTES
9
-
10
- info = copy.deepcopy(agent_info)
11
- info.update(
12
- {
13
- "agent_name": "slack",
14
- "class_name": "SlackAgentComponent",
15
- "description": "Slack messaging agent for posting messages and files to channels",
16
- "config_parameters": [
17
- {
18
- "name": "slack_bot_token",
19
- "required": True,
20
- "description": "Slack bot user OAuth token",
21
- "type": "string",
22
- },
23
- {
24
- "name": "thread_cache_ttl",
25
- "required": False,
26
- "description": f"Time-to-live in seconds for thread correlation cache (default: {FIVE_MINUTES} seconds)",
27
- "type": "integer",
28
- "default": FIVE_MINUTES,
29
- },
30
- ],
31
- }
32
- )
33
-
34
-
35
- class SlackAgentComponent(BaseAgentComponent):
36
- """Component for handling Slack messaging operations."""
37
-
38
- info = info
39
- actions = [PostMessage]
40
-
41
- def __init__(self, module_info={}, **kwargs):
42
- """Initialize the Slack agent component.
43
-
44
- Args:
45
- module_info: Optional module configuration.
46
- **kwargs: Additional keyword arguments.
47
-
48
- Raises:
49
- ValueError: If required Slack configuration is missing.
50
- """
51
- super().__init__(module_info, **kwargs)
52
-
53
- # Get Slack configuration
54
- self.slack_bot_token = self.get_config("slack_bot_token")
55
- if not self.slack_bot_token:
56
- raise ValueError("Slack bot token is required")
57
-
58
- # Initialize Slack client
59
- self.slack_client = WebClient(token=self.slack_bot_token)
@@ -1,84 +0,0 @@
1
- """Web Search action"""
2
-
3
- from solace_ai_connector.common.log import log
4
- import requests
5
- from duckduckgo_search import DDGS
6
-
7
-
8
- from ....common.action import Action
9
- from ....common.action_response import ActionResponse
10
- from ....services.file_service import FileService
11
-
12
-
13
- class DoImageSearch(Action):
14
- def __init__(self, **kwargs):
15
- super().__init__(
16
- {
17
- "name": "do_image_search",
18
- "prompt_directive": "Search the web for images using a search engine.",
19
- "params": [
20
- {
21
- "name": "query",
22
- "desc": "The search query to use",
23
- "type": "string",
24
- },
25
- {
26
- "name": "max_results",
27
- "desc": "Maximum number of results to show, defaults to 3 if not present",
28
- "type": "int",
29
- },
30
- {
31
- "name": "size",
32
- "desc": (
33
- "Size of the image to search for. ",
34
- "Can be one of: small, medium, large, wallpaper or None. Defaults to None if not present",
35
- ),
36
- "type": "string",
37
- },
38
- ],
39
- "required_scopes": ["web_request:do_image_search:read"],
40
- },
41
- **kwargs,
42
- )
43
-
44
- def image_search(self, keyword, size, max_results) -> list:
45
- """
46
- Returns a list of dictionaries that represent image results
47
- """
48
- return DDGS().images(
49
- keywords=keyword,
50
- region="wt-wt",
51
- safesearch="off",
52
- size=str(size) or None,
53
- color=None,
54
- type_image=None,
55
- layout=None,
56
- license_image=None,
57
- max_results=int(max_results),
58
- )
59
-
60
- def invoke(self, params, meta={}) -> ActionResponse:
61
- query = params.get("query")
62
- max_results = params.get("max_results", 3)
63
- size = params.get("size")
64
- results = []
65
- if not query:
66
- return ActionResponse(message="ERROR: Query not found!")
67
- results = self.image_search(query, size, max_results) # append text results to results
68
- file_service = FileService()
69
- image_metas = []
70
- for result in results:
71
- try:
72
- received_image = requests.get(result.get("image"), timeout=10).content
73
- log.debug(f"Received image: {result.get('image')}")
74
- image_metas.append(
75
- file_service.upload_from_buffer(
76
- received_image,
77
- result.get("title"),
78
- meta.get("session_id"),
79
- data_source="Web Request Agent - Image Search Action",
80
- )
81
- )
82
- except Exception as e:
83
- log.error(f"Failed to download image: {result.get('image')} because {e}")
84
- return ActionResponse(files=image_metas)
@@ -1,47 +0,0 @@
1
- """Web Search action"""
2
-
3
- from duckduckgo_search import DDGS
4
-
5
-
6
- from ....common.action import Action
7
- from ....common.action_response import ActionResponse
8
-
9
-
10
- class DoNewsSearch(Action):
11
- def __init__(self, **kwargs):
12
- super().__init__(
13
- {
14
- "name": "do_news_search",
15
- "prompt_directive": "Search the web for news and current events using a search engine.",
16
- "params": [
17
- {
18
- "name": "query",
19
- "desc": "The search query to use",
20
- "type": "string",
21
- },
22
- {
23
- "name": "max_results",
24
- "desc": "Maximum number of results to show, defaults to 5 if not present",
25
- "type": "int",
26
- },
27
- ],
28
- "required_scopes": ["web_request:do_news_search:read"],
29
- },
30
- **kwargs,
31
- )
32
-
33
- def news_search(self, keyword, max_results) -> list:
34
- """
35
- Returns a list of dictionaries that represent news results
36
- """
37
- return DDGS().news(keywords=keyword, region="wt-wt", max_results=int(max_results))
38
-
39
- def invoke(self, params, meta={}) -> ActionResponse:
40
- query = params.get("query")
41
- max_results = params.get("max_results", 5)
42
- results = []
43
- if not query:
44
- return ActionResponse(message="ERROR: Query not found!")
45
- results = self.news_search(query, max_results) # append text results to results
46
-
47
- return ActionResponse(message=results)
@@ -1,34 +0,0 @@
1
- """Web Request action"""
2
-
3
- from duckduckgo_search import DDGS
4
-
5
- from ....common.action import Action
6
- from ....common.action_response import ActionResponse
7
-
8
-
9
- class DoSuggestionSearch(Action):
10
-
11
- def __init__(self, **kwargs):
12
- super().__init__(
13
- {
14
- "name": "do_suggestion_search",
15
- "prompt_directive": "Browse the web and get suggestions for the search query especially on new or unfamiliar topics.",
16
- "params": [
17
- {
18
- "name": "query",
19
- "desc": "The search query to use",
20
- "type": "string",
21
- }
22
- ],
23
- "required_scopes": ["web_request:do_suggestion_search:read"],
24
- },
25
- **kwargs,
26
- )
27
-
28
- def invoke(self, params, meta={}) -> ActionResponse:
29
- query = params.get("query")
30
- if not query:
31
- return ActionResponse(message="ERROR: Query not found!")
32
- content = DDGS().suggestions(query)
33
-
34
- return ActionResponse(message=content)
@@ -1,135 +0,0 @@
1
- """Web Request action"""
2
-
3
- from solace_ai_connector.common.log import log
4
- import requests
5
- from bs4 import BeautifulSoup
6
- import html2text
7
-
8
-
9
- from ....common.action import Action
10
- from ....common.action_response import ActionResponse
11
-
12
-
13
- class DoWebRequest(Action):
14
-
15
- def __init__(self, **kwargs):
16
- super().__init__(
17
- {
18
- "name": "do_web_request",
19
- "prompt_directive": "Fetch content from a URL and process it according to a specified LLM prompt. Returns processed content from a single web request. For comprehensive data gathering, multiple requests may be needed to follow relevant links.",
20
- "params": [
21
- {
22
- "name": "url",
23
- "desc": "URL to fetch",
24
- "type": "string",
25
- },
26
- {
27
- "name": "llm_prompt",
28
- "desc": "Text prompt to direct the LLM on how to process the fetched content. If this parameter is not provided, the fetched content will be returned as is.",
29
- "type": "string",
30
- },
31
- ],
32
- "required_scopes": ["web_request:do_web_request:read"],
33
- "examples": [
34
- {
35
- "docstring": "This is an example of a user requesting to fetch information from the web. The web_request agent is open so invoke the do_web_request action to fetch the content from the url and process the information according to the llm_prompt.",
36
- "tag_prefix_placeholder": "{tp}",
37
- "starting_id": "10",
38
- "user_input": "What is the weather in Ottawa?",
39
- "metadata": [
40
- "local_time: 2024-11-06 12:33:12 EST-0500 (Wednesday)"
41
- ],
42
- "reasoning": [
43
- "- User is asking for current weather information in Ottawa",
44
- "- We need to fetch up-to-date weather data",
45
- "- Use the web_request agent to get the latest weather information",
46
- "- Plan to use the Environment Canada website for accurate local weather data"
47
- ],
48
- "response_text": "Certainly! I'll fetch the current weather information for Ottawa for you right away.",
49
- "status_update": "Retrieving the latest weather data for Ottawa...",
50
- "action": {
51
- "agent": "web_request",
52
- "name": "do_web_request",
53
- "parameters": {
54
- "url": "https://weather.gc.ca/city/pages/on-118_metric_e.html",
55
- "llm_prompt": "Extract the current temperature, weather conditions, and any important weather alerts or warnings for Ottawa from the webpage. Format the response as a bulleted list with emoji where appropriate."
56
- }
57
- }
58
- }
59
- ],
60
- },
61
- **kwargs,
62
- )
63
-
64
- def get_system_prompt(self):
65
- return """
66
- The assistant is a professional web researcher. It will take the URL and request below and
67
- will diligently extract the requested information from that URL. Sometimes the page does
68
- not have the information requested, but it might be on a different page that is linked to
69
- from this page. In that case the assistant will indicate the page doesn't have the information
70
- but it will provide other links to try for the information.
71
-
72
- The assistant will also include a section of 'interesting links' that it found on the page
73
- that might be useful for further research. These links must be from the page and not from
74
- the assistant's own knowledge.
75
-
76
- The assistant will respond in markdown format.
77
- """
78
-
79
- def get_user_prompt(self, url, content, prompt):
80
- return f"""
81
- <page_url>{url}</page_url>
82
- <research_request>
83
- {prompt}
84
- </research_request>
85
- <page_content_markdown>
86
- {content}
87
- </page_content_markdown>
88
- """
89
-
90
- def invoke(self, params, meta={}) -> ActionResponse:
91
- url = params.get("url")
92
- prompt = params.get("llm_prompt")
93
-
94
- if not url:
95
- return ActionResponse(message="URL is required")
96
-
97
- # Fetch the content from the URL
98
- try:
99
- response = requests.get(url, timeout=30)
100
- response.raise_for_status()
101
- except Exception as e:
102
- return ActionResponse(message=f"Failed to fetch content from URL: {e}")
103
-
104
- # Use beautiful soup to extract the text content from the HTML
105
- soup = BeautifulSoup(response.content, "html.parser")
106
-
107
- # Convert the HTML content to Markdown using html2text
108
- h = html2text.HTML2Text()
109
- h.ignore_links = False # Ensure that links are preserved
110
- h.ignore_images = False # Ignore images
111
- content = h.handle(str(soup))
112
-
113
- # If a prompt is provided, send the content to an LLM model
114
- if prompt:
115
- system_prompt = self.get_system_prompt()
116
- user_prompt = self.get_user_prompt(url, content, prompt)
117
-
118
- messages = [
119
- {"role": "system", "content": system_prompt},
120
- {"role": "user", "content": user_prompt},
121
- ]
122
-
123
- agent = self.get_agent()
124
- try:
125
- response = agent.do_llm_service_request(messages=messages)
126
- content = response.get("content")
127
- except TimeoutError as e:
128
- log.error("LLM request timed out: %s", str(e))
129
- return ActionResponse(message="LLM request timed out")
130
- except Exception as e:
131
- log.error("Failed to process content with LLM: %s", str(e))
132
- return ActionResponse(message="Failed to process content with LLM")
133
-
134
- # Code to create the image using the provided content
135
- return ActionResponse(message=content)
@@ -1,69 +0,0 @@
1
- """File Request action"""
2
-
3
- from solace_ai_connector.common.log import log
4
- import requests
5
- from io import BytesIO
6
-
7
-
8
- from ....common.action import Action
9
- from ....common.action_response import ActionResponse
10
- from ....services.file_service import FileService, FS_PROTOCOL
11
-
12
-
13
- class DownloadFile(Action):
14
-
15
- def __init__(self, **kwargs):
16
- super().__init__(
17
- {
18
- "name": "download_external_file",
19
- "prompt_directive": f"Given a http/https external URL of a file (image, video, etc.), fetch the content from the URL and add the file to the {FS_PROTOCOL} file service so it can be used in the system.",
20
- "params": [
21
- {
22
- "name": "url",
23
- "desc": "URL of file",
24
- "type": "string",
25
- },
26
- {
27
- "name": "local_file_name",
28
- "desc": "Local file name to use for the file - make sure it has the correct extension",
29
- "type": "string",
30
- },
31
- ],
32
- "required_scopes": ["web_request:download_file:write"],
33
- },
34
- **kwargs,
35
- )
36
-
37
- def invoke(self, params, meta={}) -> ActionResponse:
38
- url = params.get("url")
39
- local_file_name = params.get("local_file_name")
40
-
41
- if not url:
42
- return ActionResponse(message="URL is required")
43
-
44
- headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
45
-
46
- # Fetch the file from the URL and write it in chunks
47
- files = []
48
- try:
49
- with requests.get(url, headers=headers, stream=True, timeout=30) as file_response:
50
- file_response.raise_for_status()
51
- byte_io = BytesIO()
52
- for chunk in file_response.iter_content(chunk_size=8192):
53
- if chunk: # Filter out keep-alive new chunks
54
- byte_io.write(chunk)
55
- byte_io.seek(0)
56
- file_service = FileService()
57
- meta = file_service.upload_from_buffer(
58
- byte_io.read(),
59
- local_file_name,
60
- meta.get("session_id"),
61
- data_source="Web Request Agent - Download File Action",
62
- )
63
- files.append(meta)
64
- except requests.exceptions.HTTPError as e:
65
- return ActionResponse(message=f"Failed to fetch file from URL: {e}")
66
- except Exception as e:
67
- return ActionResponse(message=f"An error occurred: {e}")
68
-
69
- return ActionResponse(files=files)
@@ -1,33 +0,0 @@
1
- """Responsible for processing the actions from the Web Request Agent"""
2
-
3
- import copy
4
-
5
- from ..base_agent_component import (
6
- agent_info,
7
- BaseAgentComponent,
8
- )
9
-
10
- from .actions.do_web_request import DoWebRequest
11
- from .actions.download_file import DownloadFile
12
- from .actions.do_image_search import DoImageSearch
13
- from .actions.do_news_search import DoNewsSearch
14
- from .actions.do_suggestion_search import DoSuggestionSearch
15
-
16
- info = copy.deepcopy(agent_info)
17
- info["agent_name"] = "web_request"
18
- info["class_name"] = "WebRequestAgentComponent"
19
- info["description"] = (
20
- "Web request agent that is able to download and retrieve info from urls. ",
21
- "It can also search the web for news, images and suggestion results with the DuckDuckGo search engine.",
22
- )
23
-
24
-
25
- class WebRequestAgentComponent(BaseAgentComponent):
26
- info = info
27
- actions = [
28
- DoWebRequest,
29
- DownloadFile,
30
- DoImageSearch,
31
- DoNewsSearch,
32
- DoSuggestionSearch,
33
- ]
@@ -1 +0,0 @@
1
- :root{--primary-color: #3498db;--secondary-color: #2c3e50;--background-color: #ecf0f1;--text-color: #34495e;--border-color: #bdc3c7;--hover-color: #e0f7fa;--selected-color: #b3e5fc;--header-height: 80px;--min-width: 1200px;--max-width: 1200px}*{box-sizing:border-box;margin:0;padding:0}body{font-family:Arial,sans-serif;background-color:var(--background-color);color:var(--text-color);display:flex;justify-content:center;min-height:100vh}.app-container{display:flex;flex-direction:column;width:100%;max-width:var(--max-width);height:100vh;background-color:#fff;color:#000;box-shadow:0 0 10px #0000001a;overflow:hidden}:root{--header-height: 60px;--page-header-height: 60px}.header{height:var(--header-height);background-color:var(--primary-color);padding:0 1rem;box-shadow:0 2px 4px #0000001a}.top-menu{display:flex;align-items:flex-end;height:100%;padding:1rem}.nav-links{display:flex;list-style-type:none;margin:0;padding:0}.nav-links li{margin-right:1rem}.nav-links a{color:#fff;text-decoration:none;font-weight:700;padding:.5rem 0;position:relative}.nav-links a.active{font-weight:bolder}.nav-links a.active:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#fff}.connection-controls{margin-left:auto;display:flex;align-items:center}.connection-controls .button{margin-left:1rem;background-color:#fff;color:var(--primary-color);border:1px solid white}.connection-controls .button:hover{background-color:var(--hover-color);border-color:var(--hover-color)}.nav-links a:hover{color:var(--hover-color)}.page-header{height:var(--page-header-height);background-color:var(--background-color);padding:0 1rem;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border-color)}.page-header h2{margin:0}.content{padding:1rem}.stimuli-page,.capabilities-page{display:flex;flex-direction:column;height:calc(100vh - var(--header-height));overflow:hidden}.stimuli-content{flex:1;overflow:hidden;display:flex}.stimuli-content{display:flex;flex:1;overflow:hidden}.capability-item{background-color:#fff;border:1px solid var(--border-color);border-radius:4px;padding:1rem;margin-bottom:1rem}.capability-item h3{margin-top:0}.capability-item ul{padding-left:1.5rem}.app-title{color:#fff;margin:0;margin-right:4rem;font-size:1.5rem}.button{background-color:var(--secondary-color);color:#fff;border:none;padding:.5rem 1rem;border-radius:4px;cursor:pointer;transition:background-color .3s ease}.button:hover{background-color:#34495e}.button-info{background-color:var(--primary-color);border:1px solid var(--primary-color);color:#000}.button-info:hover{background-color:var(--selected-color)}.content{display:flex;flex:1;overflow:hidden}.stimulus-list{width:40%;min-width:400px;overflow-y:auto;border-right:1px solid var(--border-color);background-color:#fff}.stimulus-item{padding:1rem;border-bottom:1px solid var(--border-color);cursor:pointer;transition:background-color .2s ease}.stimulus-item:hover{background-color:var(--hover-color)}.stimulus-item.selected{background-color:var(--selected-color)}.stimulus-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.5rem}.user-email{font-weight:700;color:var(--secondary-color)}.timestamp{font-size:.8em;color:var(--text-color);opacity:.7}.stimulus-text{font-family:monospace;white-space:pre-wrap;word-break:break-word;font-size:.9em;margin:0}.stimulus-details{flex:1;padding:1rem;overflow-y:auto;background-color:#fff}.stimulus-details pre{white-space:pre-wrap;word-wrap:break-word;background-color:var(--background-color);padding:1rem;border-radius:4px;font-size:.9rem}.loading-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;color:#fff;font-size:1.5rem;z-index:1000}.no-stimuli{padding:1rem;text-align:center;color:var(--text-color)}@media (max-width: 768px){.content{flex-direction:column}.stimulus-list{width:100%;max-height:40vh;border-right:none;border-bottom:1px solid var(--border-color)}}@media (max-width: 480px){.header{text-align:center}.button{width:100%}.stimulus-item{padding:.75rem}.user-email,.stimulus-text{font-size:.9rem}}.message-flow{display:flex;flex-direction:column;gap:1rem;padding:1rem;overflow-y:auto;width:60%}.message-box{border:1px solid var(--border-color);border-radius:4px;padding:1rem;background-color:#fff}.message-header{display:flex;justify-content:space-between;margin-bottom:.5rem;font-size:.9rem;color:var(--secondary-color)}.message-type{font-weight:700}.elapsed-time{font-style:italic}.message-content{font-size:.95rem;white-space:pre-wrap;word-break:break-word;position:relative;overflow:auto;padding-bottom:20px}.more-button{position:absolute;bottom:5px;right:5px;background-color:var(--primary-color);color:#fff;border:none;padding:2px 8px;border-radius:4px;cursor:pointer;font-size:.8rem;transition:background-color .3s ease}.more-button:hover{background-color:var(--secondary-color)}.file-list,.action-params{margin-top:1rem}.file-list h4,.action-params h4{margin-bottom:.5rem}.file-list ul,.action-params ul{list-style-type:none;padding-left:1rem}.stimulus{background-color:#e3f2fd}.response{background-color:#e8f5e9}.response.streaming{background-color:#fff9c4}.response.complete{background-color:#c8e6c9}.action-request{background-color:#fff3e0}.action-header{display:flex;align-items:center;gap:10px}.action-request-label{font-size:.9em;font-weight:700}.agent-name,.action-name{font-size:1.1em;padding:2px 8px;border-radius:12px;background-color:#e9ecef}.agent-name{color:#495057}.action-name{color:#0056b3}.action-params{margin-top:1rem}.action-params ul{list-style-type:none;padding-left:1rem}.action-response{margin-top:1rem;padding:1rem;background-color:#f8f9fa;border-radius:8px;border:1px solid #e9ecef}.file-list{margin-top:1rem}.file-list h4{margin-bottom:.5rem}.file-list ul{list-style-type:none;padding-left:1rem}.file-list li{margin-bottom:.25rem}.message-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem;font-size:.9rem;color:var(--secondary-color);flex-wrap:wrap}.message-type{font-weight:700;margin-right:.5rem}.elapsed-time{font-style:italic;white-space:nowrap}.placeholder-message{padding:1rem;text-align:center;color:var(--text-color)}.orchestrator-reinvoke{background-color:#fff9c4}.llm-service-request{background-color:#e8eaf6}.llm-service-response{background-color:#e0f2f1}@media (max-width: 1200px){.app-container{min-width:100%}}@media (min-width: 1220px){.app-container{min-width:1200px}}.app-wrapper{display:flex;justify-content:center}.config-dialog,.connection-selector{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:10;width:min(400px,70%);background-color:#fff;color:#000;border-radius:10px;border:1px solid var(--border-color);box-shadow:0 0 10px #00000080;display:flex;flex-direction:column;padding:.5rem}.config-dialog-content,.connection-selector{padding:1rem;display:flex;flex-direction:column;gap:1rem}.connection-selector label{font-weight:700;margin-bottom:.5rem}.connection-selector select{width:100%;padding:.5rem;margin-bottom:1rem;border:1px solid var(--border-color);border-radius:4px;font-size:1rem;background-color:#fff;color:#000}.connection-selector .button-group{display:flex;justify-content:space-between;gap:.5rem;margin-bottom:.5rem}.connection-selector .button-group button{flex:1}.connection-selector .button-group.secondary{margin-top:1rem}.config-dialog-content label,.connection-selector label{display:block}.config-dialog-content input,.config-dialog-content select,.connection-selector button{width:100%;padding:.5rem;border:1px solid var(--border-color);border-radius:4px;font-size:1rem;background-color:#fff;color:#000;transition:border-color .3s,box-shadow .3s}.config-dialog-content select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E);background-repeat:no-repeat;background-position:right .7rem top 50%;background-size:.65rem auto;padding-right:2rem}.config-dialog-content input:focus,.config-dialog-content select:focus,.connection-selector button:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 2px #3498db33}.config-dialog-content label,.connection-selector h2{display:block;margin-bottom:.5rem;font-weight:700;color:var(--secondary-color)}.config-dialog-buttons,.connection-selector{display:flex;justify-content:flex-end;gap:1rem;padding:1.2rem}.connection-selector button{background-color:var(--primary-color);color:#fff;border:none;cursor:pointer;transition:background-color .3s}.connection-selector button:hover{background-color:var(--secondary-color)}.capabilities-page{display:flex;flex-direction:column;height:calc(100vh - var(--header-height));overflow:hidden}.capabilities-content{display:flex;overflow:hidden;padding:1rem;gap:1rem;height:calc(100vh - var(--header-height) - var(--page-header-height))}.search-input{padding:.5rem;border:1px solid var(--border-color);border-radius:4px;width:300px;font-size:1rem}.agent-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));grid-auto-rows:250px;gap:1rem;overflow-y:auto;align-content:start;flex:1}.agent-card{background:#fff;border:1px solid var(--border-color);border-radius:8px;padding:1rem;cursor:pointer;transition:all .2s ease;height:250px;display:grid;grid-template-rows:35px 100px 1fr;gap:3px;overflow:hidden}.agent-card:hover{transform:translateY(-2px);box-shadow:0 4px 6px #0000001a}.agent-card.selected{border-color:var(--primary-color);background-color:var(--selected-color)}.agent-card h3{margin:0 0 .5rem;color:var(--secondary-color)}.agent-card p{margin:0;font-size:.9rem;color:var(--text-color);height:90px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical}.agent-card-footer{display:flex;flex-direction:column;gap:.5rem;font-size:.8rem}.actions-count{color:var(--secondary-color)}.actions-preview{display:flex;flex-wrap:wrap;gap:.3rem;max-height:3.2rem;overflow:hidden;position:relative}.action-name-preview{background-color:var(--background-color);padding:.1rem .4rem;border-radius:4px;font-size:.75rem;color:var(--secondary-color)}.more-actions{color:var(--primary-color);font-style:italic;font-size:.75rem;position:absolute;bottom:0;right:0;background:linear-gradient(to left,#fff,#ffffffe6 20%,#fff0);padding-left:20px}.agent-details{background:#fff;border:1px solid var(--border-color);border-radius:8px;padding:1.5rem;width:40%;min-width:400px;overflow-y:auto}.agent-description{color:var(--text-color);margin:1rem 0}.actions-list{margin-top:1.5rem}.action-details{border:1px solid var(--border-color);border-radius:4px;margin:.5rem 0}.action-details summary{padding:.75rem;cursor:pointer;font-weight:700;background-color:var(--background-color)}.action-details summary:hover{background-color:var(--hover-color)}.action-content{padding:1rem}.action-content h4{margin:1rem 0 .5rem;color:var(--secondary-color)}.action-content ul{margin:0;padding-left:1.5rem}.action-content li{margin:.25rem 0}.scopes-list li{font-family:monospace;background-color:var(--background-color);padding:.2rem .5rem;border-radius:4px;margin:.25rem .5rem .25rem 0;display:inline-block}.no-agents{grid-column:1 / -1;text-align:center;padding:2rem;color:var(--text-color)}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;padding:0;min-width:320px;height:100vh;display:flex;flex-direction:column}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}