solace-agent-mesh 0.2.4__py3-none-any.whl → 1.0.2__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 (521) hide show
  1. solace_agent_mesh/__init__.py +5 -0
  2. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  3. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  4. solace_agent_mesh/agent/adk/callbacks.py +1716 -0
  5. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  6. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  7. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  8. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  9. solace_agent_mesh/agent/adk/runner.py +357 -0
  10. solace_agent_mesh/agent/adk/services.py +240 -0
  11. solace_agent_mesh/agent/adk/setup.py +751 -0
  12. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  13. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  14. solace_agent_mesh/agent/agent_llm.txt +41 -0
  15. solace_agent_mesh/agent/protocol/event_handlers.py +1444 -0
  16. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  17. solace_agent_mesh/agent/sac/app.py +640 -0
  18. solace_agent_mesh/agent/sac/component.py +3496 -0
  19. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  20. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  21. solace_agent_mesh/agent/sac/task_execution_context.py +185 -0
  22. solace_agent_mesh/agent/testing/__init__.py +3 -0
  23. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  24. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  25. solace_agent_mesh/agent/tools/__init__.py +14 -0
  26. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  27. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  28. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  29. solace_agent_mesh/agent/tools/general_agent_tools.py +571 -0
  30. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  31. solace_agent_mesh/agent/tools/peer_agent_tool.py +290 -0
  32. solace_agent_mesh/agent/tools/registry.py +36 -0
  33. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  34. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  35. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  38. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  39. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  40. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  41. solace_agent_mesh/assets/docs/404.html +16 -0
  42. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  43. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  46. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  54. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  55. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  57. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  58. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  105. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/f897a61a.f8c53b0f.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js +2 -0
  132. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js.LICENSE.txt +81 -0
  133. solace_agent_mesh/assets/docs/assets/js/runtime~main.d5133813.js +1 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +77 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  165. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  167. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  168. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  170. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  171. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  172. solace_agent_mesh/assets/docs/lunr-index-1754075282978.json +1 -0
  173. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc-1754075282978.json +1 -0
  175. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  176. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  177. solace_agent_mesh/cli/__init__.py +1 -1
  178. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  179. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  181. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  183. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  184. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  185. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  186. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  187. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  188. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  189. solace_agent_mesh/cli/commands/init_cmd/env_step.py +205 -0
  190. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  191. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +407 -0
  192. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  193. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  194. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +139 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
  201. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  202. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  203. solace_agent_mesh/cli/main.py +17 -294
  204. solace_agent_mesh/cli/utils.py +135 -204
  205. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-D11Lmy9p.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/assets/main-Gfk3BYn5.js +663 -0
  210. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  211. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  212. solace_agent_mesh/common/__init__.py +1 -0
  213. solace_agent_mesh/common/a2a_protocol.py +564 -0
  214. solace_agent_mesh/common/agent_registry.py +42 -0
  215. solace_agent_mesh/common/client/__init__.py +4 -0
  216. solace_agent_mesh/common/client/card_resolver.py +21 -0
  217. solace_agent_mesh/common/client/client.py +85 -0
  218. solace_agent_mesh/common/client/client_llm.txt +133 -0
  219. solace_agent_mesh/common/common_llm.txt +144 -0
  220. solace_agent_mesh/common/constants.py +1 -14
  221. solace_agent_mesh/common/middleware/__init__.py +12 -0
  222. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  223. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  224. solace_agent_mesh/common/middleware/registry.py +125 -0
  225. solace_agent_mesh/common/server/__init__.py +4 -0
  226. solace_agent_mesh/common/server/server.py +122 -0
  227. solace_agent_mesh/common/server/server_llm.txt +169 -0
  228. solace_agent_mesh/common/server/task_manager.py +291 -0
  229. solace_agent_mesh/common/server/utils.py +28 -0
  230. solace_agent_mesh/common/services/__init__.py +4 -0
  231. solace_agent_mesh/common/services/employee_service.py +162 -0
  232. solace_agent_mesh/common/services/identity_service.py +129 -0
  233. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  234. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  235. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  236. solace_agent_mesh/common/services/services_llm.txt +132 -0
  237. solace_agent_mesh/common/types.py +411 -0
  238. solace_agent_mesh/common/utils/__init__.py +7 -0
  239. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  240. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  241. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  242. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  243. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  244. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  245. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  246. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  247. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  248. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  249. solace_agent_mesh/common/utils/initializer.py +51 -0
  250. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  251. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  252. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  253. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  254. solace_agent_mesh/config_portal/backend/common.py +66 -24
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +164 -0
  258. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
  259. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
  260. solace_agent_mesh/config_portal/backend/server.py +551 -181
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-_7yox_eh.js +48 -0
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-e5c3acfe.js +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  267. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  268. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  269. solace_agent_mesh/core_a2a/__init__.py +1 -0
  270. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  271. solace_agent_mesh/core_a2a/service.py +331 -0
  272. solace_agent_mesh/evaluation/config_loader.py +657 -0
  273. solace_agent_mesh/evaluation/evaluator.py +667 -0
  274. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  275. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  276. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  277. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  278. solace_agent_mesh/evaluation/report/modal.html +59 -0
  279. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  280. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  281. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  282. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  283. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  284. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  285. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  286. solace_agent_mesh/evaluation/report_generator.py +613 -0
  287. solace_agent_mesh/evaluation/run.py +613 -0
  288. solace_agent_mesh/evaluation/subscriber.py +872 -0
  289. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  290. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  291. solace_agent_mesh/gateway/base/__init__.py +1 -0
  292. solace_agent_mesh/gateway/base/app.py +266 -0
  293. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  294. solace_agent_mesh/gateway/base/component.py +1542 -0
  295. solace_agent_mesh/gateway/base/task_context.py +74 -0
  296. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  297. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  298. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  299. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  300. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  301. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  302. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  303. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  304. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  305. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  306. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  307. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +827 -0
  308. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  309. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  310. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  311. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  312. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  313. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  314. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  315. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  316. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  317. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  318. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  319. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  320. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  321. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  322. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  323. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  324. solace_agent_mesh/llm.txt +228 -0
  325. solace_agent_mesh/llm_detail.txt +2835 -0
  326. solace_agent_mesh/templates/agent_template.yaml +53 -0
  327. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  328. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  329. solace_agent_mesh/templates/gateway_component_template.py +431 -0
  330. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  331. solace_agent_mesh/templates/logging_config_template.ini +64 -0
  332. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  333. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  334. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  335. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  336. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  337. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  338. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  339. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  340. solace_agent_mesh/templates/shared_config.yaml +66 -0
  341. solace_agent_mesh/templates/templates_llm.txt +147 -0
  342. solace_agent_mesh/templates/webui.yaml +53 -0
  343. solace_agent_mesh-1.0.2.dist-info/METADATA +432 -0
  344. solace_agent_mesh-1.0.2.dist-info/RECORD +361 -0
  345. solace_agent_mesh-1.0.2.dist-info/entry_points.txt +3 -0
  346. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/licenses/LICENSE +1 -1
  347. solace_agent_mesh/agents/base_agent_component.py +0 -256
  348. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  349. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  350. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  351. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  352. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  353. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  354. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  355. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  356. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  357. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  358. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  359. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  360. solace_agent_mesh/agents/slack/__init__.py +0 -1
  361. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  362. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  363. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  364. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  365. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  366. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  367. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  368. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  369. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  370. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  371. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  372. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  373. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  374. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  375. solace_agent_mesh/cli/commands/add/add.py +0 -88
  376. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  377. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  378. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  379. solace_agent_mesh/cli/commands/build.py +0 -670
  380. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  382. solace_agent_mesh/cli/commands/config.py +0 -29
  383. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  384. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  385. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  386. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  387. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  388. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  389. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  390. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  391. solace_agent_mesh/cli/commands/init/init.py +0 -92
  392. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  393. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  394. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  395. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  396. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  397. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  398. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  399. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  400. solace_agent_mesh/cli/commands/run.py +0 -68
  401. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  402. solace_agent_mesh/cli/config.py +0 -85
  403. solace_agent_mesh/common/action.py +0 -91
  404. solace_agent_mesh/common/action_list.py +0 -37
  405. solace_agent_mesh/common/action_response.py +0 -340
  406. solace_agent_mesh/common/mysql_database.py +0 -40
  407. solace_agent_mesh/common/postgres_database.py +0 -85
  408. solace_agent_mesh/common/prompt_templates.py +0 -28
  409. solace_agent_mesh/common/stimulus_utils.py +0 -152
  410. solace_agent_mesh/common/time.py +0 -24
  411. solace_agent_mesh/common/utils.py +0 -712
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  414. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  415. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
  416. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  417. solace_agent_mesh/configs/agent_global.yaml +0 -74
  418. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  419. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  420. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  421. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  422. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  423. solace_agent_mesh/configs/monitor.yaml +0 -0
  424. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  425. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  426. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  427. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  428. solace_agent_mesh/configs/service_llm.yaml +0 -265
  429. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  430. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  431. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  432. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  433. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  434. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  435. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  436. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  437. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  438. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  439. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  440. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  441. solace_agent_mesh/orchestrator/__init__.py +0 -0
  442. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  443. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  444. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  445. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  446. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  447. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  448. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  449. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  450. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  451. solace_agent_mesh/services/__init__.py +0 -0
  452. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  453. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  454. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  455. solace_agent_mesh/services/common/__init__.py +0 -4
  456. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  457. solace_agent_mesh/services/common/singleton.py +0 -18
  458. solace_agent_mesh/services/file_service/__init__.py +0 -14
  459. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  460. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  461. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  462. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  463. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  464. solace_agent_mesh/services/file_service/file_service.py +0 -437
  465. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  466. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  467. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  468. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  469. solace_agent_mesh/services/history_service/__init__.py +0 -3
  470. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  471. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  472. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  473. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  474. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  475. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  476. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  477. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  478. solace_agent_mesh/services/history_service/history_service.py +0 -413
  479. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  480. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  481. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  482. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  483. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  484. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  485. solace_agent_mesh/templates/action.py +0 -38
  486. solace_agent_mesh/templates/agent.py +0 -29
  487. solace_agent_mesh/templates/agent.yaml +0 -70
  488. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  489. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  490. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  491. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  492. solace_agent_mesh/templates/gateway_base.py +0 -15
  493. solace_agent_mesh/templates/gateway_input.py +0 -98
  494. solace_agent_mesh/templates/gateway_output.py +0 -71
  495. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  496. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  497. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  498. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  499. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  500. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  501. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  502. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  503. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  504. solace_agent_mesh/templates/web-flows.yaml +0 -76
  505. solace_agent_mesh/tools/__init__.py +0 -0
  506. solace_agent_mesh/tools/components/__init__.py +0 -0
  507. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  508. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  509. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  510. solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
  511. solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
  512. solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
  513. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  517. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  518. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  519. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  520. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  521. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.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")]