solace-agent-mesh 0.2.3__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 -140
  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.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -226
  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-DMmCawWe.js +0 -42
  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-dd988f05.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.3.dist-info/METADATA +0 -172
  508. solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.3.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.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -1,182 +0,0 @@
1
- """A module to interact with BambooHR API and hold employee data"""
2
-
3
- import os
4
- import datetime
5
- import base64
6
- import requests
7
- from ...common.utils import parse_yaml_response
8
- from ...common.prompt_templates import (
9
- FilterLocationsSystemPrompt,
10
- FilterLocationsUserPrompt,
11
- )
12
- from ..common.singleton import SingletonMeta
13
-
14
-
15
- class BambooHR(metaclass=SingletonMeta):
16
- """A service to interact with BambooHR API and hold employee data"""
17
-
18
- def __init__(self, config: dict = {}) -> None:
19
- self._api_key = config.get("bamboo_hr_api_key", os.environ.get("BAMBOO_HR_API_KEY"))
20
- self._base_url = config.get("bamboo_hr_base_url", os.environ.get("BAMBOO_HR_BASE_URL"))
21
- self._employee_data = None
22
- self._last_fetch = None
23
-
24
- if not self._api_key:
25
- raise ValueError("BambooHR API key not set, please set BAMBOO_HR_API_KEY environment variable")
26
- if not self._base_url:
27
- raise ValueError("BambooHR base URL not set, please set BAMBOO_HR_BASE_URL environment variable")
28
-
29
- @property
30
- def employee_data(self) -> dict:
31
- if not self._employee_data:
32
- self._employee_data = self.fetch_employee_data()
33
- elif (datetime.datetime.now() - self._last_fetch).total_seconds() > 12 * 3600:
34
- # If last fetch was more than 12 hours ago, fetch again
35
- self._employee_data = self.fetch_employee_data()
36
- return self._employee_data
37
-
38
- def get_employee(self, email: str) -> dict:
39
- return self.employee_data.get(email.lower())
40
-
41
- def get_employee_summary(self, email: str) -> dict:
42
- employee = self.get_employee(email)
43
- if not employee:
44
- return None
45
- return {
46
- "name": employee.get("displayName"),
47
- "title": employee.get("jobTitle"),
48
- "email": employee.get("workEmail"),
49
- "phone": employee.get("workPhone"),
50
- "mobile": employee.get("mobilePhone"),
51
- "department": employee.get("department"),
52
- "location": employee.get("location"),
53
- "supervisor": employee.get("supervisor"),
54
- }
55
-
56
- def get_away_info(self, email: str, days_away: int = 30) -> str:
57
- now = datetime.datetime.now()
58
- start = datetime.datetime.strftime(now, "%Y-%m-%d")
59
- end = datetime.datetime.strftime(now + datetime.timedelta(days=days_away), "%Y-%m-%d")
60
-
61
- url = os.path.join(self._base_url, "time_off/whos_out")
62
- response = self.api_request(url, {"start": start, "end": end})
63
- away_info = {}
64
- for away_employee in response:
65
- eid = str(away_employee.get("employeeId"))
66
- if eid not in away_info:
67
- away_info[eid] = []
68
- away_info[eid].append(
69
- {
70
- "name": away_employee.get("name"),
71
- "start": away_employee.get("start"),
72
- "end": away_employee.get("end"),
73
- }
74
- )
75
- employee = self.get_employee(email)
76
- if not employee:
77
- return None
78
- employee_id = employee.get("id")
79
- employee_away_info = away_info.get(employee_id, [])
80
- return {
81
- "employee": employee.get("displayName"),
82
- "away_info": employee_away_info,
83
- }
84
-
85
- def get_reports(self, email: str, levels: int = -1) -> list:
86
- employee = self.get_employee(email)
87
- if not employee:
88
- return None
89
- reports = []
90
- self.get_reports_recursive(employee, reports, levels)
91
- return reports
92
-
93
- def get_all_employees(self) -> list:
94
- return list(self.employee_data.values())
95
-
96
- def get_reports_recursive(self, employee, reports, levels):
97
- if levels == 0:
98
- return
99
- if employee.get("reports"):
100
- for report in employee.get("reports"):
101
- reports.append(report)
102
- self.get_reports_recursive(report, reports, levels - 1)
103
-
104
- def get_list_of_all_locations(self) -> list:
105
- # Go through all employees and get the location
106
- locations = set()
107
- for employee in self.employee_data.values():
108
- location = employee.get("location")
109
- if location:
110
- locations.add(location)
111
- return sorted(list(locations))
112
-
113
- def get_employees_by_location(self, location: str, llm_service_fn: callable) -> list:
114
- # We are going to use an LLM to decide if Bamboo locations should
115
- # be included in the list of locations
116
- if not llm_service_fn:
117
- raise ValueError("LLM service function not set in BambooHR instance")
118
- response = llm_service_fn(
119
- [
120
- {
121
- "role": "system",
122
- "content": FilterLocationsSystemPrompt(self.get_list_of_all_locations()),
123
- },
124
- {"role": "user", "content": FilterLocationsUserPrompt(location)},
125
- ]
126
- ).get("content")
127
-
128
- response = parse_yaml_response(response)
129
- employees = []
130
- if response and isinstance(response, dict) and response.get("matching_locations"):
131
- location_set = set(response["matching_locations"])
132
- for employee in self.employee_data.values():
133
- if employee.get("location") in location_set:
134
- employees.append(employee)
135
- return employees
136
-
137
- def fetch_employee_data(self) -> dict:
138
- # First fetch the directory report from Bamboo
139
- url = os.path.join(self._base_url, "employees/directory")
140
- response = self.api_request(url)
141
- employee_data = self.build_org_chart(response)
142
-
143
- self._last_fetch = datetime.datetime.now()
144
- self._employee_data = employee_data
145
- return employee_data
146
-
147
- def api_request(self, url: str, params: dict = None) -> dict:
148
- basic_auth = self.encode_basic_auth(self._api_key, "x")
149
- headers = {
150
- "Authorization": f"Basic {basic_auth}",
151
- "Accept": "application/json",
152
- }
153
- response = requests.get(url, headers=headers, params=params, timeout=10)
154
- if response.status_code != 200:
155
- raise ValueError(f"Failed to fetch data: {response.status_code}")
156
- return response.json()
157
-
158
- def build_org_chart(self, directory_report) -> dict:
159
- employee_data = {}
160
- by_name = {}
161
- for employee in directory_report.get("employees", []):
162
- email = employee.get("workEmail")
163
- if not email:
164
- continue
165
- employee_data[email.lower()] = employee
166
- by_name[employee["displayName"]] = employee
167
-
168
- for employee in directory_report.get("employees", []):
169
- manager_name = employee.get("supervisor")
170
- if manager_name:
171
- manager = by_name.get(manager_name)
172
- if manager:
173
- manager["reports"] = manager.get("reports", [])
174
- manager["reports"].append(employee)
175
- employee["manager"] = manager
176
- return employee_data
177
-
178
- def encode_basic_auth(self, username: str, password: str) -> str:
179
- user_pass = f"{username}:{password}"
180
- encoded_bytes = base64.b64encode(user_pass.encode("utf-8"))
181
- encoded_str = str(encoded_bytes, "utf-8")
182
- return encoded_str
@@ -1,4 +0,0 @@
1
- from .auto_expiry import AutoExpiry
2
- from .singleton import AutoExpirySingletonMeta, SingletonMeta
3
-
4
- __all__ = ["AutoExpiry", "AutoExpirySingletonMeta", "SingletonMeta"]
@@ -1,45 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- import time
3
- import threading
4
-
5
- from solace_ai_connector.common.log import log
6
-
7
- class AutoExpiry(ABC):
8
- _expiry_thread = None
9
- expiration_check_interval = None
10
- _stop_expiry_thread = None
11
-
12
-
13
- def _start_auto_expiry_thread(self, expiration_check_interval):
14
- """Starts a background thread to handle auto-expiry."""
15
- self.expiration_check_interval = expiration_check_interval
16
- self._stop_expiry_thread = threading.Event()
17
- self._expiry_thread = threading.Thread(
18
- target=self._auto_expiry_task, daemon=True
19
- )
20
- self._expiry_thread.start()
21
-
22
- def _auto_expiry_task(self):
23
- """Background task to check and delete expired items."""
24
- while not self._stop_expiry_thread.is_set():
25
- try:
26
- self._delete_expired_items()
27
- except Exception as e:
28
- log.error(f"Error during auto-expiry process: {e}")
29
- time.sleep(self.expiration_check_interval)
30
-
31
- @abstractmethod
32
- def _delete_expired_items(self):
33
- """Checks all item and deletes those that have exceeded max_time_to_live."""
34
- raise NotImplementedError
35
-
36
- def stop_auto_expiry(self):
37
- """Stops the auto-expiry background thread."""
38
- if self._stop_expiry_thread:
39
- self._stop_expiry_thread.set()
40
- if self._expiry_thread and self._expiry_thread.is_alive():
41
- self._expiry_thread.join()
42
-
43
- def __del__(self):
44
- """Ensure the expiry thread stops when the service is destroyed."""
45
- self.stop_auto_expiry()
@@ -1,18 +0,0 @@
1
- from .auto_expiry import AutoExpiry
2
-
3
- # Singleton pattern - Ensuring that only one instance of the class is created per given identifier
4
- class SingletonMeta(type):
5
- _instances = {}
6
-
7
- def __call__(cls, *args, **kwargs):
8
- identifier = kwargs.get("identifier", "default")
9
- if cls not in cls._instances:
10
- cls._instances[cls] = {}
11
- if identifier not in cls._instances[cls]:
12
- instance = super().__call__(*args, **kwargs)
13
- cls._instances[cls][identifier] = instance
14
- return cls._instances[cls][identifier]
15
-
16
-
17
- class AutoExpirySingletonMeta(SingletonMeta, type(AutoExpiry)):
18
- pass
@@ -1,14 +0,0 @@
1
- from .file_service import FileService, FileServicePermissionError, FS_URL_REGEX
2
- from .file_utils import Types
3
- from .file_transformations import LLM_QUERY_OPTIONS, TRANSFORMERS
4
- from .file_service_constants import FS_PROTOCOL
5
-
6
- __all__ = [
7
- "FileService",
8
- "FS_PROTOCOL",
9
- "Types",
10
- "FileServicePermissionError",
11
- "FS_URL_REGEX",
12
- "LLM_QUERY_OPTIONS",
13
- "TRANSFORMERS"
14
- ]
@@ -1,149 +0,0 @@
1
- import boto3
2
- import os
3
- import json
4
- from io import BytesIO
5
- from botocore.exceptions import NoCredentialsError, ClientError
6
-
7
- from .file_manager_base import FileManagerBase
8
-
9
-
10
- class BucketFileManager(FileManagerBase):
11
- def __init__(self, config, ttl):
12
- self.config = config
13
- self.ttl = ttl
14
- self.bucket_name = config.get("bucket_name")
15
- self.boto3_config = config.get("boto3_config", {})
16
- self.endpoint_url = config.get("endpoint_url", None)
17
- session = boto3.Session(**self.boto3_config)
18
- s3_resource = session.resource("s3", endpoint_url=self.endpoint_url)
19
- try:
20
- if not self.bucket_name:
21
- raise Exception("Bucket name not provided.")
22
-
23
- bucket = s3_resource.Bucket(self.bucket_name)
24
-
25
- # Check if the bucket exists by attempting to load it
26
- bucket.load()
27
- self.bucket = bucket
28
-
29
- except ClientError as e:
30
- # Handle the case where the bucket doesn't exist or access is denied
31
- error_code = e.response["Error"]["Code"]
32
- if error_code == "404":
33
- raise Exception((f"Bucket '{self.bucket_name}' does not exist."), e)
34
- elif error_code == "403":
35
- raise Exception(
36
- (f"Access to bucket '{self.bucket_name}' is denied."), e
37
- )
38
- else:
39
- raise Exception(f"Unexpected error: {e}")
40
-
41
- def _save_metadata(self, file_signature: str, metadata: dict):
42
- metadata_key = self._get_metadata_name(file_signature)
43
- metadata_content = json.dumps(metadata, indent=4)
44
-
45
- try:
46
- self.bucket.put_object(
47
- Key=metadata_key,
48
- Body=metadata_content,
49
- ContentType="application/json",
50
- )
51
- except (NoCredentialsError, ClientError) as e:
52
- raise RuntimeError(f"Failed to save metadata to S3: {str(e)}")
53
-
54
- def upload_from_buffer(self, buffer: bytes, file_name: str, **kwargs) -> dict:
55
- file_signature = self._generate_file_signature(file_name)
56
- metadata = self._create_metadata(file_signature, file_name, buffer, kwargs)
57
-
58
- try:
59
- self.bucket.put_object(
60
- Key=file_signature,
61
- Body=buffer,
62
- ContentType=metadata.get("mime_type") or "application/octet-stream",
63
- )
64
- except (NoCredentialsError, ClientError) as e:
65
- raise RuntimeError(f"Failed to upload file to S3: {str(e)}")
66
-
67
- self._save_metadata(file_signature, metadata)
68
-
69
- return metadata
70
-
71
- def upload_from_file(self, file_path: str, **kwargs) -> dict:
72
- if not os.path.isfile(file_path):
73
- raise FileNotFoundError(f"The file {file_path} does not exist.")
74
-
75
- file_name = os.path.basename(file_path)
76
- file_signature = self._generate_file_signature(file_name)
77
- content_type = kwargs.get("mime_type") or self._get_mime_type(file_name) or "application/octet-stream"
78
-
79
- try:
80
- with open(file_path, "rb") as file_data:
81
- self.bucket.put_object(
82
- Key=file_signature,
83
- Body=file_data,
84
- ContentType=content_type,
85
- )
86
- metadata = self._create_metadata(file_signature, file_name, file_data.read(), kwargs)
87
- except (NoCredentialsError, ClientError) as e:
88
- raise RuntimeError(f"Failed to upload file to S3: {str(e)}")
89
-
90
- self._save_metadata(file_signature, metadata)
91
-
92
- return metadata
93
-
94
- def download_to_buffer(self, file_name: str) -> bytes:
95
- try:
96
- buffer = BytesIO()
97
- obj = self.bucket.Object(file_name)
98
- obj.download_fileobj(buffer)
99
- buffer.seek(0)
100
- return buffer.read()
101
- except (NoCredentialsError, ClientError) as e:
102
- raise RuntimeError(f"Failed to download file from S3: {str(e)}")
103
-
104
- def download_to_file(self, file_name: str, destination_path: str):
105
- buffer = self.download_to_buffer(file_name)
106
-
107
- try:
108
- with open(destination_path, "wb") as destination_file:
109
- destination_file.write(buffer)
110
- except IOError as e:
111
- raise RuntimeError(f"Failed to write file to destination: {str(e)}")
112
-
113
- def get_metadata(self, file_name: str) -> dict:
114
- metadata_key = self._get_metadata_name(file_name)
115
- meta_buffer = self.download_to_buffer(metadata_key)
116
- return json.loads(meta_buffer)
117
-
118
- def delete_by_name(self, file_name: str):
119
- metadata_key = self._get_metadata_name(file_name)
120
-
121
- try:
122
- # the main file
123
- file = self.bucket.Object(file_name)
124
- # the metadata file
125
- meta = self.bucket.Object(metadata_key)
126
-
127
- # Delete the files
128
- file.delete()
129
- meta.delete()
130
- except (NoCredentialsError, ClientError) as e:
131
- raise RuntimeError(f"Failed to delete file from S3: {str(e)}")
132
-
133
- def update_file_expiration(self, file_signature, expiration_timestamp):
134
- metadata = self.get_metadata(file_signature)
135
- metadata["expiration_timestamp"] = expiration_timestamp
136
- self._save_metadata(file_signature, metadata)
137
-
138
- def list_all_metadata(self) -> list:
139
- all_metadata = []
140
- try:
141
- for obj in self.bucket.objects.all():
142
- if obj.key.endswith(".metadata"):
143
- meta_buffer = self.download_to_buffer(obj.key)
144
- metadata = json.loads(meta_buffer)
145
-
146
- all_metadata.append(metadata)
147
- except (NoCredentialsError, ClientError) as e:
148
- raise RuntimeError(f"Failed to list metadata from S3: {str(e)}")
149
- return all_metadata
@@ -1,162 +0,0 @@
1
- import uuid
2
- import mimetypes
3
- import re
4
- import time
5
- from abc import ABC, abstractmethod
6
-
7
- from ..file_service_constants import FS_PROTOCOL, META_FILE_EXTENSION
8
- from ..file_utils import get_file_schema_and_shape
9
-
10
-
11
- MAX_NAME_LENGTH = 255 - (
12
- len(META_FILE_EXTENSION) + len(FS_PROTOCOL) + 3 + 36 + 1
13
- ) # 36 is the length of a UUID, 3 is ://
14
-
15
-
16
- class FileManagerBase(ABC):
17
- ttl: int
18
-
19
- def _generate_file_signature(self, file_name: str) -> str:
20
- """
21
- Generate a file signature from the original file name.
22
- """
23
- file_signature = str(uuid.uuid4())
24
- # Remove any leading or trailing whitespace
25
- file_name = file_name.strip()
26
- # Replace invalid characters and space/ampersand with underscores
27
- cleaned_name = re.sub(r'[<>:"/\\|?*& ]', "_", file_name)
28
- # replace unicode and binary characters with underscores
29
- cleaned_name = re.sub(r"[^\x00-\x7F]+", "_", cleaned_name)
30
- cleaned_name = re.sub(r"\\u[0-9a-fA-F]{4}", "_", cleaned_name)
31
- # Replace multiple underscores with a single underscore
32
- cleaned_name = re.sub(r"_+", "_", cleaned_name)
33
- # Truncate the signature if it is too long
34
- if len(cleaned_name) > MAX_NAME_LENGTH:
35
- start_index = len(cleaned_name) - MAX_NAME_LENGTH
36
- # Keep the latter portion of the name
37
- cleaned_name = cleaned_name[start_index:]
38
- signature = f"{file_signature}_{cleaned_name}"
39
- return signature
40
-
41
- def _get_url_from_signature(self, file_signature: str) -> str:
42
- """
43
- Generate a file URL from a file signature.
44
- """
45
- return f"{FS_PROTOCOL}://{file_signature}"
46
-
47
- def _get_mime_type(self, file_name: str) -> str:
48
- """
49
- Get the MIME type of a file.
50
- """
51
- mime_type, _ = mimetypes.guess_type(file_name)
52
- return mime_type
53
-
54
- def _get_metadata_name(self, name: str) -> dict:
55
- """
56
- Get metadata from a file URL.
57
- """
58
- metadata_path = f"{name}{META_FILE_EXTENSION}"
59
- return metadata_path
60
-
61
- def _create_metadata(self, file_signature: str, file_name: str, file: bytes, metadata: dict):
62
- """
63
- Extend metadata with schema and shape if not present
64
- Add file_size if not present
65
- """
66
-
67
- mime_type = self._get_mime_type(file_name)
68
- file_url = self._get_url_from_signature(file_signature)
69
-
70
- if not isinstance(metadata, dict):
71
- metadata = {}
72
- meta_copy = metadata.copy()
73
-
74
- # Can not be provided by user
75
- meta_copy["url"] = file_url
76
-
77
- if "mime_type" not in meta_copy:
78
- meta_copy["mime_type"] = mime_type
79
-
80
- if "name" not in meta_copy:
81
- meta_copy["name"] = file_name
82
-
83
- if (
84
- "schema-yaml" not in meta_copy
85
- or "schema_yaml" not in meta_copy
86
- or "shape" not in meta_copy
87
- ):
88
- schema, shape = get_file_schema_and_shape(file, meta_copy)
89
- if "schema-yaml" not in meta_copy and schema:
90
- meta_copy["schema-yaml"] = schema
91
-
92
- if "shape" not in meta_copy and shape:
93
- meta_copy["shape"] = shape
94
-
95
- if "file_size" not in meta_copy:
96
- meta_copy["file_size"] = len(file)
97
-
98
- if "upload_timestamp" not in meta_copy:
99
- meta_copy["upload_timestamp"] = time.time()
100
-
101
- if "expiration_timestamp" not in meta_copy:
102
- meta_copy["expiration_timestamp"] = meta_copy["upload_timestamp"] + self.ttl
103
-
104
- return meta_copy
105
-
106
- @abstractmethod
107
- def update_file_expiration(self, file_signature: str, expiration_timestamp: float):
108
- """
109
- Update the expiration timestamp for a file.
110
- """
111
- pass
112
-
113
- @abstractmethod
114
- def upload_from_buffer(self, buffer: bytes, file_name: str, **kwargs) -> dict:
115
- """
116
- Upload a file from a buffer.
117
- kwargs are added to metadata
118
- """
119
- pass
120
-
121
- @abstractmethod
122
- def upload_from_file(self, file_path: str, **kwargs) -> dict:
123
- """
124
- Upload a file from a file path.
125
- kwargs are added to metadata
126
- """
127
- pass
128
-
129
- @abstractmethod
130
- def download_to_buffer(self, file_name: str) -> bytes:
131
- """
132
- Download a file to a buffer.
133
- """
134
- pass
135
-
136
- @abstractmethod
137
- def download_to_file(self, file_name: str, destination_path: str):
138
- """
139
- Download a file to a destination path.
140
- """
141
- pass
142
-
143
- @abstractmethod
144
- def delete_by_name(self, file_name: str):
145
- """
146
- Delete a file by name.
147
- """
148
- pass
149
-
150
- @abstractmethod
151
- def get_metadata(self, file_name: str) -> dict:
152
- """
153
- Get metadata for a file.
154
- """
155
- pass
156
-
157
- @abstractmethod
158
- def list_all_metadata(self) -> list:
159
- """
160
- List all file metadata in the storage.
161
- """
162
- pass
@@ -1,64 +0,0 @@
1
- import os
2
-
3
- from .file_manager_base import FileManagerBase
4
-
5
-
6
- class MemoryFileManager(FileManagerBase):
7
- storage = {}
8
-
9
- def __init__(self, config, ttl):
10
- self.config = config
11
- self.ttl = ttl
12
-
13
- def upload_from_buffer(self, buffer: bytes, file_name: str, **kwargs) -> dict:
14
- file_signature = self._generate_file_signature(file_name)
15
- metadata = self._create_metadata(
16
- file_signature, file_name, buffer, kwargs
17
- )
18
- metadata_name = self._get_metadata_name(file_signature)
19
- self.storage[file_signature] = buffer
20
- self.storage[metadata_name] = metadata
21
- return metadata
22
-
23
- def upload_from_file(self, file_path: str, **kwargs) -> dict:
24
- """
25
- Upload a file from a file path.
26
- kwargs are added to metadata
27
- """
28
- with open(file_path, "rb") as file:
29
- buffer = file.read()
30
- return self.upload_from_buffer(buffer, os.path.basename(file_path), **kwargs)
31
-
32
- def download_to_buffer(self, file_name: str) -> bytes:
33
- if not file_name in self.storage:
34
- raise FileNotFoundError(f"The file {file_name} does not exist.")
35
- return self.storage[file_name]
36
-
37
- def download_to_file(self, file_name: str, destination_path: str):
38
- with open(destination_path, "wb") as file:
39
- file.write(self.download_to_buffer(file_name))
40
-
41
- def delete_by_name(self, file_name: str):
42
- metadata_name = self._get_metadata_name(file_name)
43
- if file_name in self.storage:
44
- del self.storage[file_name]
45
- if metadata_name in self.storage:
46
- del self.storage[metadata_name]
47
-
48
- def get_metadata(self, file_name: str) -> dict:
49
- metadata_name = self._get_metadata_name(file_name)
50
- if metadata_name in self.storage:
51
- return self.storage[metadata_name]
52
- raise FileNotFoundError(f"The file {file_name} does not exist.")
53
-
54
- def update_file_expiration(self, file_signature, expiration_timestamp):
55
- metadata_name = self._get_metadata_name(file_signature)
56
- if metadata_name in self.storage:
57
- metadata = self.storage[metadata_name]
58
- metadata["expiration_timestamp"] = expiration_timestamp
59
- self.storage[metadata_name] = metadata
60
- else:
61
- raise FileNotFoundError(f"The file {file_signature} does not exist.")
62
-
63
- def list_all_metadata(self) -> list:
64
- return [data for key, data in self.storage.items() if key.endswith(".metadata")]