solace-agent-mesh 0.2.4__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (518) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  2. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +1694 -0
  4. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  5. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  6. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  7. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  8. solace_agent_mesh/agent/adk/runner.py +353 -0
  9. solace_agent_mesh/agent/adk/services.py +240 -0
  10. solace_agent_mesh/agent/adk/setup.py +751 -0
  11. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  12. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  13. solace_agent_mesh/agent/agent_llm.txt +41 -0
  14. solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
  15. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  16. solace_agent_mesh/agent/sac/app.py +640 -0
  17. solace_agent_mesh/agent/sac/component.py +3388 -0
  18. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  19. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  20. solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
  21. solace_agent_mesh/agent/testing/__init__.py +3 -0
  22. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  23. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  24. solace_agent_mesh/agent/tools/__init__.py +14 -0
  25. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  26. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  27. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  28. solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
  29. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  30. solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
  31. solace_agent_mesh/agent/tools/registry.py +36 -0
  32. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  33. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  34. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  35. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  36. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  37. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  38. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  39. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  40. solace_agent_mesh/assets/docs/404.html +16 -0
  41. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  42. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  43. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  46. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  54. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  57. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  104. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  105. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
  132. solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
  133. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  165. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  167. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  168. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  170. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  171. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
  172. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  173. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  175. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  176. solace_agent_mesh/cli/__init__.py +1 -1
  177. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  178. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  179. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  180. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  181. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  183. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  184. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  185. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  186. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  187. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  188. solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
  189. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  190. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
  191. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  192. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  193. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  194. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  201. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  202. solace_agent_mesh/cli/main.py +17 -294
  203. solace_agent_mesh/cli/utils.py +135 -204
  204. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  205. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  210. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  211. solace_agent_mesh/common/__init__.py +1 -0
  212. solace_agent_mesh/common/a2a_protocol.py +564 -0
  213. solace_agent_mesh/common/agent_registry.py +42 -0
  214. solace_agent_mesh/common/client/__init__.py +4 -0
  215. solace_agent_mesh/common/client/card_resolver.py +21 -0
  216. solace_agent_mesh/common/client/client.py +85 -0
  217. solace_agent_mesh/common/client/client_llm.txt +133 -0
  218. solace_agent_mesh/common/common_llm.txt +144 -0
  219. solace_agent_mesh/common/constants.py +1 -14
  220. solace_agent_mesh/common/middleware/__init__.py +12 -0
  221. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  222. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  223. solace_agent_mesh/common/middleware/registry.py +125 -0
  224. solace_agent_mesh/common/server/__init__.py +4 -0
  225. solace_agent_mesh/common/server/server.py +122 -0
  226. solace_agent_mesh/common/server/server_llm.txt +169 -0
  227. solace_agent_mesh/common/server/task_manager.py +291 -0
  228. solace_agent_mesh/common/server/utils.py +28 -0
  229. solace_agent_mesh/common/services/__init__.py +4 -0
  230. solace_agent_mesh/common/services/employee_service.py +162 -0
  231. solace_agent_mesh/common/services/identity_service.py +129 -0
  232. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  233. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  234. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  235. solace_agent_mesh/common/services/services_llm.txt +132 -0
  236. solace_agent_mesh/common/types.py +411 -0
  237. solace_agent_mesh/common/utils/__init__.py +7 -0
  238. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  239. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  240. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  241. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  242. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  243. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  244. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  245. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  246. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  247. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  248. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  249. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  250. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  251. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  252. solace_agent_mesh/config_portal/backend/common.py +66 -24
  253. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
  254. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
  258. solace_agent_mesh/config_portal/backend/server.py +550 -181
  259. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
  260. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  267. solace_agent_mesh/core_a2a/__init__.py +1 -0
  268. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  269. solace_agent_mesh/core_a2a/service.py +331 -0
  270. solace_agent_mesh/evaluation/config_loader.py +657 -0
  271. solace_agent_mesh/evaluation/evaluator.py +667 -0
  272. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  273. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  274. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  275. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  276. solace_agent_mesh/evaluation/report/modal.html +59 -0
  277. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  278. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  279. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  280. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  281. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  282. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  283. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  284. solace_agent_mesh/evaluation/report_generator.py +613 -0
  285. solace_agent_mesh/evaluation/run.py +613 -0
  286. solace_agent_mesh/evaluation/subscriber.py +872 -0
  287. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  288. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  289. solace_agent_mesh/gateway/base/__init__.py +1 -0
  290. solace_agent_mesh/gateway/base/app.py +266 -0
  291. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  292. solace_agent_mesh/gateway/base/component.py +1542 -0
  293. solace_agent_mesh/gateway/base/task_context.py +74 -0
  294. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  295. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  296. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  297. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  298. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  299. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  300. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  301. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  302. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  303. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  304. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  305. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
  306. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  307. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  308. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  309. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  310. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  311. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  312. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  313. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  314. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  315. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  316. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  317. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  318. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  319. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  320. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  321. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  322. solace_agent_mesh/llm.txt +228 -0
  323. solace_agent_mesh/llm_detail.txt +2835 -0
  324. solace_agent_mesh/templates/agent_template.yaml +53 -0
  325. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  326. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  327. solace_agent_mesh/templates/gateway_component_template.py +400 -0
  328. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  329. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  330. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  331. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  332. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  333. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  334. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  335. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  336. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  337. solace_agent_mesh/templates/shared_config.yaml +66 -0
  338. solace_agent_mesh/templates/templates_llm.txt +147 -0
  339. solace_agent_mesh/templates/webui.yaml +53 -0
  340. solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
  341. solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
  342. solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
  343. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
  344. solace_agent_mesh/agents/base_agent_component.py +0 -256
  345. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  346. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  347. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  348. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  349. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  350. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  351. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  352. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  353. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  354. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  355. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  356. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  357. solace_agent_mesh/agents/slack/__init__.py +0 -1
  358. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  359. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  360. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  361. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  362. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  363. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  364. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  365. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  366. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  367. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  368. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  369. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  370. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  371. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  372. solace_agent_mesh/cli/commands/add/add.py +0 -88
  373. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  374. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  375. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  376. solace_agent_mesh/cli/commands/build.py +0 -670
  377. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  378. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  379. solace_agent_mesh/cli/commands/config.py +0 -29
  380. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  382. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  383. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  384. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  385. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  386. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  387. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  388. solace_agent_mesh/cli/commands/init/init.py +0 -92
  389. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  390. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  391. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  392. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  393. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  394. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  395. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  396. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  397. solace_agent_mesh/cli/commands/run.py +0 -68
  398. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  399. solace_agent_mesh/cli/config.py +0 -85
  400. solace_agent_mesh/common/action.py +0 -91
  401. solace_agent_mesh/common/action_list.py +0 -37
  402. solace_agent_mesh/common/action_response.py +0 -340
  403. solace_agent_mesh/common/mysql_database.py +0 -40
  404. solace_agent_mesh/common/postgres_database.py +0 -85
  405. solace_agent_mesh/common/prompt_templates.py +0 -28
  406. solace_agent_mesh/common/stimulus_utils.py +0 -152
  407. solace_agent_mesh/common/time.py +0 -24
  408. solace_agent_mesh/common/utils.py +0 -712
  409. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
  410. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  411. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  414. solace_agent_mesh/configs/agent_global.yaml +0 -74
  415. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  416. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  417. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  418. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  419. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  420. solace_agent_mesh/configs/monitor.yaml +0 -0
  421. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  422. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  423. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  424. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  425. solace_agent_mesh/configs/service_llm.yaml +0 -265
  426. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  427. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  428. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  429. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  430. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  431. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  432. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  433. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  434. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  435. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  436. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  437. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  438. solace_agent_mesh/orchestrator/__init__.py +0 -0
  439. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  440. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  441. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  442. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  443. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  444. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  445. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  446. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  447. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  448. solace_agent_mesh/services/__init__.py +0 -0
  449. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  450. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  451. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  452. solace_agent_mesh/services/common/__init__.py +0 -4
  453. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  454. solace_agent_mesh/services/common/singleton.py +0 -18
  455. solace_agent_mesh/services/file_service/__init__.py +0 -14
  456. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  457. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  458. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  459. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  460. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  461. solace_agent_mesh/services/file_service/file_service.py +0 -437
  462. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  463. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  464. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  465. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  466. solace_agent_mesh/services/history_service/__init__.py +0 -3
  467. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  468. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  469. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  470. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  471. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  472. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  473. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  474. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  475. solace_agent_mesh/services/history_service/history_service.py +0 -413
  476. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  477. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  478. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  479. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  480. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  481. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  482. solace_agent_mesh/templates/action.py +0 -38
  483. solace_agent_mesh/templates/agent.py +0 -29
  484. solace_agent_mesh/templates/agent.yaml +0 -70
  485. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  486. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  487. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  488. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  489. solace_agent_mesh/templates/gateway_base.py +0 -15
  490. solace_agent_mesh/templates/gateway_input.py +0 -98
  491. solace_agent_mesh/templates/gateway_output.py +0 -71
  492. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  493. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  494. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  495. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  496. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  497. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  498. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  499. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  500. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  501. solace_agent_mesh/templates/web-flows.yaml +0 -76
  502. solace_agent_mesh/tools/__init__.py +0 -0
  503. solace_agent_mesh/tools/components/__init__.py +0 -0
  504. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  505. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  506. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  507. solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
  508. solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
  509. solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
  510. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  511. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  512. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  513. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  517. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  518. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,381 @@
1
+ """
2
+ An ADK ArtifactService implementation using the local filesystem for storage.
3
+ """
4
+
5
+ import os
6
+ import json
7
+ import shutil
8
+ import logging
9
+ import asyncio
10
+ import unicodedata
11
+ from typing import Optional, List
12
+
13
+ from google.adk.artifacts import BaseArtifactService
14
+ from google.genai import types as adk_types
15
+ from typing_extensions import override
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ METADATA_FILE_SUFFIX = ".meta"
20
+
21
+
22
+ class FilesystemArtifactService(BaseArtifactService):
23
+ """
24
+ An artifact service implementation using the local filesystem.
25
+
26
+ Stores artifacts in a structured directory based on a configured scope
27
+ (namespace, app name, or custom), user ID, session ID (or 'user' namespace),
28
+ filename, and version. Metadata (like mime_type) is stored in a companion file.
29
+ """
30
+
31
+ def __init__(self, base_path: str, scope_identifier: str):
32
+ """
33
+ Initializes the FilesystemArtifactService.
34
+
35
+ Args:
36
+ base_path: The root directory where all artifacts will be stored.
37
+ scope_identifier: The sanitized identifier representing the storage scope
38
+ (e.g., sanitized namespace, app name, or custom value).
39
+
40
+ Raises:
41
+ ValueError: If base_path or scope_identifier is not provided or the
42
+ scoped base path cannot be created.
43
+ """
44
+ if not base_path:
45
+ raise ValueError("base_path cannot be empty for FilesystemArtifactService")
46
+ if not scope_identifier:
47
+ raise ValueError(
48
+ "scope_identifier cannot be empty for FilesystemArtifactService"
49
+ )
50
+
51
+ self.base_path = os.path.abspath(base_path)
52
+ self.scope_identifier = scope_identifier
53
+ self.scope_base_path = os.path.join(self.base_path, self.scope_identifier)
54
+
55
+ try:
56
+ os.makedirs(self.scope_base_path, exist_ok=True)
57
+ logger.info(
58
+ "FilesystemArtifactService initialized. Scoped base path: %s",
59
+ self.scope_base_path,
60
+ )
61
+ except OSError as e:
62
+ logger.error(
63
+ "Failed to create scoped base directory '%s': %s",
64
+ self.scope_base_path,
65
+ e,
66
+ )
67
+ raise ValueError(
68
+ f"Could not create or access scoped base_path '{self.scope_base_path}': {e}"
69
+ ) from e
70
+
71
+ def _file_has_user_namespace(self, filename: str) -> bool:
72
+ """Checks if the filename has a user namespace."""
73
+ return filename.startswith("user:")
74
+
75
+ def _get_artifact_dir(
76
+ self, app_name: str, user_id: str, session_id: str, filename: str
77
+ ) -> str:
78
+ """
79
+ Constructs the directory path for a specific artifact (all versions)
80
+ within the configured scope.
81
+ The app_name parameter is ignored for path construction but kept for signature compatibility.
82
+ """
83
+ user_id_sanitized = os.path.basename(user_id)
84
+ session_id_sanitized = os.path.basename(session_id)
85
+ filename_sanitized = os.path.basename(filename)
86
+
87
+ if self._file_has_user_namespace(filename):
88
+ filename_dir = os.path.basename(filename.split(":", 1)[1])
89
+ return os.path.join(
90
+ self.scope_base_path, user_id_sanitized, "user", filename_dir
91
+ )
92
+ else:
93
+ return os.path.join(
94
+ self.scope_base_path,
95
+ user_id_sanitized,
96
+ session_id_sanitized,
97
+ filename_sanitized,
98
+ )
99
+
100
+ def _get_version_path(self, artifact_dir: str, version: int) -> str:
101
+ """Constructs the file path for a specific artifact version's data."""
102
+ return os.path.join(artifact_dir, str(version))
103
+
104
+ def _get_metadata_path(self, artifact_dir: str, version: int) -> str:
105
+ """Constructs the file path for a specific artifact version's metadata."""
106
+ return os.path.join(artifact_dir, f"{version}{METADATA_FILE_SUFFIX}")
107
+
108
+ @override
109
+ async def save_artifact(
110
+ self,
111
+ *,
112
+ app_name: str,
113
+ user_id: str,
114
+ session_id: str,
115
+ filename: str,
116
+ artifact: adk_types.Part,
117
+ ) -> int:
118
+ log_prefix = f"[FSArtifact:Save:{filename}] "
119
+
120
+ filename = self._normalize_filename_unicode(filename)
121
+ artifact_dir = self._get_artifact_dir(app_name, user_id, session_id, filename)
122
+ try:
123
+ await asyncio.to_thread(os.makedirs, artifact_dir, exist_ok=True)
124
+ except OSError as e:
125
+ logger.error(
126
+ "%sFailed to create artifact directory '%s': %s",
127
+ log_prefix,
128
+ artifact_dir,
129
+ e,
130
+ )
131
+ raise IOError(f"Could not create artifact directory: {e}") from e
132
+
133
+ versions = await self.list_versions(
134
+ app_name=app_name,
135
+ user_id=user_id,
136
+ session_id=session_id,
137
+ filename=filename,
138
+ )
139
+ version = 0 if not versions else max(versions) + 1
140
+
141
+ version_path = self._get_version_path(artifact_dir, version)
142
+ metadata_path = self._get_metadata_path(artifact_dir, version)
143
+
144
+ try:
145
+ if not artifact.inline_data or artifact.inline_data.data is None:
146
+ raise ValueError("Artifact Part has no inline_data to save.")
147
+
148
+ def _write_data_file():
149
+ with open(version_path, "wb") as f:
150
+ f.write(artifact.inline_data.data)
151
+
152
+ await asyncio.to_thread(_write_data_file)
153
+ logger.debug("%sWrote data to %s", log_prefix, version_path)
154
+
155
+ metadata = {"mime_type": artifact.inline_data.mime_type}
156
+
157
+ def _write_metadata_file():
158
+ with open(metadata_path, "w", encoding="utf-8") as f:
159
+ json.dump(metadata, f)
160
+
161
+ await asyncio.to_thread(_write_metadata_file)
162
+ logger.debug("%sWrote metadata to %s", log_prefix, metadata_path)
163
+
164
+ logger.info(
165
+ "%sSaved artifact '%s' version %d successfully.",
166
+ log_prefix,
167
+ filename,
168
+ version,
169
+ )
170
+ return version
171
+ except (IOError, OSError, ValueError, TypeError) as e:
172
+ logger.error(
173
+ "%sFailed to save artifact '%s' version %d: %s",
174
+ log_prefix,
175
+ filename,
176
+ version,
177
+ e,
178
+ )
179
+ if await asyncio.to_thread(os.path.exists, version_path):
180
+ await asyncio.to_thread(os.remove, version_path)
181
+ if await asyncio.to_thread(os.path.exists, metadata_path):
182
+ await asyncio.to_thread(os.remove, metadata_path)
183
+ raise IOError(f"Failed to save artifact version {version}: {e}") from e
184
+
185
+ @override
186
+ async def load_artifact(
187
+ self,
188
+ *,
189
+ app_name: str,
190
+ user_id: str,
191
+ session_id: str,
192
+ filename: str,
193
+ version: Optional[int] = None,
194
+ ) -> Optional[adk_types.Part]:
195
+ log_prefix = f"[FSArtifact:Load:{filename}] "
196
+ filename = self._normalize_filename_unicode(filename)
197
+ artifact_dir = self._get_artifact_dir(app_name, user_id, session_id, filename)
198
+
199
+ if not await asyncio.to_thread(os.path.isdir, artifact_dir):
200
+ logger.debug("%sArtifact directory not found: %s", log_prefix, artifact_dir)
201
+ return None
202
+
203
+ load_version = version
204
+ if load_version is None:
205
+ versions = await self.list_versions(
206
+ app_name=app_name,
207
+ user_id=user_id,
208
+ session_id=session_id,
209
+ filename=filename,
210
+ )
211
+ if not versions:
212
+ logger.debug("%sNo versions found for artifact.", log_prefix)
213
+ return None
214
+ load_version = max(versions)
215
+ logger.debug("%sLoading latest version: %d", log_prefix, load_version)
216
+ else:
217
+ logger.debug("%sLoading specified version: %d", log_prefix, load_version)
218
+
219
+ version_path = self._get_version_path(artifact_dir, load_version)
220
+ metadata_path = self._get_metadata_path(artifact_dir, load_version)
221
+
222
+ if not await asyncio.to_thread(
223
+ os.path.exists, version_path
224
+ ) or not await asyncio.to_thread(os.path.exists, metadata_path):
225
+ logger.warning(
226
+ "%sData or metadata file missing for version %d.",
227
+ log_prefix,
228
+ load_version,
229
+ )
230
+ return None
231
+
232
+ try:
233
+
234
+ def _read_metadata_file():
235
+ with open(metadata_path, "r", encoding="utf-8") as f:
236
+ return json.load(f)
237
+
238
+ metadata = await asyncio.to_thread(_read_metadata_file)
239
+ mime_type = metadata.get("mime_type", "application/octet-stream")
240
+
241
+ def _read_data_file():
242
+ with open(version_path, "rb") as f:
243
+ return f.read()
244
+
245
+ data_bytes = await asyncio.to_thread(_read_data_file)
246
+
247
+ artifact_part = adk_types.Part.from_bytes(
248
+ data=data_bytes, mime_type=mime_type
249
+ )
250
+ logger.info(
251
+ "%sLoaded artifact '%s' version %d successfully (%d bytes, %s).",
252
+ log_prefix,
253
+ filename,
254
+ load_version,
255
+ len(data_bytes),
256
+ mime_type,
257
+ )
258
+ return artifact_part
259
+
260
+ except (IOError, OSError, json.JSONDecodeError) as e:
261
+ logger.error(
262
+ "%sFailed to load artifact '%s' version %d: %s",
263
+ log_prefix,
264
+ filename,
265
+ load_version,
266
+ e,
267
+ )
268
+ return None
269
+
270
+ @override
271
+ async def list_artifact_keys(
272
+ self, *, app_name: str, user_id: str, session_id: str
273
+ ) -> List[str]:
274
+ log_prefix = f"[FSArtifact:ListKeys] "
275
+ filenames = set()
276
+ user_id_sanitized = os.path.basename(user_id)
277
+ session_id_sanitized = os.path.basename(session_id)
278
+
279
+ session_base_dir = os.path.join(
280
+ self.scope_base_path, user_id_sanitized, session_id_sanitized
281
+ )
282
+ if await asyncio.to_thread(os.path.isdir, session_base_dir):
283
+ try:
284
+ for item in await asyncio.to_thread(os.listdir, session_base_dir):
285
+ item_path = os.path.join(session_base_dir, item)
286
+ if await asyncio.to_thread(os.path.isdir, item_path):
287
+ filenames.add(item)
288
+ except OSError as e:
289
+ logger.warning(
290
+ "%sError listing session directory '%s': %s",
291
+ log_prefix,
292
+ session_base_dir,
293
+ e,
294
+ )
295
+
296
+ user_base_dir = os.path.join(self.scope_base_path, user_id_sanitized, "user")
297
+ if await asyncio.to_thread(os.path.isdir, user_base_dir):
298
+ try:
299
+ for item in await asyncio.to_thread(os.listdir, user_base_dir):
300
+ item_path = os.path.join(user_base_dir, item)
301
+ if await asyncio.to_thread(os.path.isdir, item_path):
302
+ filenames.add(f"user:{item}")
303
+ except OSError as e:
304
+ logger.warning(
305
+ "%sError listing user directory '%s': %s",
306
+ log_prefix,
307
+ user_base_dir,
308
+ e,
309
+ )
310
+
311
+ sorted_filenames = sorted(list(filenames))
312
+ logger.debug("%sFound %d artifact keys.", log_prefix, len(sorted_filenames))
313
+ return sorted_filenames
314
+
315
+ @override
316
+ async def delete_artifact(
317
+ self, *, app_name: str, user_id: str, session_id: str, filename: str
318
+ ) -> None:
319
+ log_prefix = f"[FSArtifact:Delete:{filename}] "
320
+ artifact_dir = self._get_artifact_dir(app_name, user_id, session_id, filename)
321
+
322
+ if not await asyncio.to_thread(os.path.isdir, artifact_dir):
323
+ logger.debug("%sArtifact directory not found: %s", log_prefix, artifact_dir)
324
+ return
325
+
326
+ try:
327
+ await asyncio.to_thread(shutil.rmtree, artifact_dir)
328
+ logger.info(
329
+ "%sRemoved artifact directory and all its contents: %s",
330
+ log_prefix,
331
+ artifact_dir,
332
+ )
333
+ except OSError as e:
334
+ logger.error(
335
+ "%sError deleting artifact directory '%s': %s",
336
+ log_prefix,
337
+ artifact_dir,
338
+ e,
339
+ )
340
+
341
+ @override
342
+ async def list_versions(
343
+ self, *, app_name: str, user_id: str, session_id: str, filename: str
344
+ ) -> List[int]:
345
+ log_prefix = f"[FSArtifact:ListVersions:{filename}] "
346
+ artifact_dir = self._get_artifact_dir(app_name, user_id, session_id, filename)
347
+ versions = []
348
+
349
+ if not await asyncio.to_thread(os.path.isdir, artifact_dir):
350
+ logger.debug("%sArtifact directory not found: %s", log_prefix, artifact_dir)
351
+ return []
352
+
353
+ try:
354
+ for item in await asyncio.to_thread(os.listdir, artifact_dir):
355
+ if (
356
+ await asyncio.to_thread(
357
+ os.path.isfile, os.path.join(artifact_dir, item)
358
+ )
359
+ and item.isdigit()
360
+ ):
361
+ versions.append(int(item))
362
+ except OSError as e:
363
+ logger.error(
364
+ "%sError listing versions in directory '%s': %s",
365
+ log_prefix,
366
+ artifact_dir,
367
+ e,
368
+ )
369
+ return []
370
+
371
+ sorted_versions = sorted(versions)
372
+ logger.debug("%sFound versions: %s", log_prefix, sorted_versions)
373
+ return sorted_versions
374
+
375
+ def _normalize_filename_unicode(self, filename: str) -> str:
376
+ """
377
+ Normalizes Unicode characters in a filename to their standard form.
378
+ Specifically targets compatibility characters like non-breaking spaces (\u202f)
379
+ and converts them to their regular ASCII equivalents (a standard space).
380
+ """
381
+ return unicodedata.normalize('NFKC', filename)
@@ -0,0 +1,295 @@
1
+ import copy
2
+ import datetime
3
+ import json
4
+ import os
5
+ import yaml
6
+
7
+ from solace_ai_connector.common.log import log
8
+
9
+
10
+ class InvocationMonitor:
11
+ LOG_DIRECTORY = "/tmp/solace-agent-mesh"
12
+ START_TOPIC_SUFFIX = "a2a/v1/agent/request/OrchestratorAgent"
13
+ END_TOPIC_CONTAINS = "a2a/v1/gateway/response/"
14
+ EXCLUDE_TOPIC_SUFFIX = "/discovery/agentcards"
15
+ LOG_FILE_VERSION = "1.0"
16
+
17
+ def __init__(self):
18
+ self._is_logging_active = False
19
+ self._current_log_buffer = []
20
+ self._current_logfile_path = None
21
+ self._invocation_start_time = None
22
+ self._triggering_event_details = None
23
+ self._current_invocation_id = None
24
+ self._current_session_id = None
25
+
26
+ try:
27
+ os.makedirs(self.LOG_DIRECTORY, exist_ok=True)
28
+ log.info(
29
+ f"InvocationMonitor initialized. Logging to directory: {self.LOG_DIRECTORY}"
30
+ )
31
+ except Exception as e:
32
+ log.error(
33
+ f"InvocationMonitor: Failed to create log directory {self.LOG_DIRECTORY}: {e}"
34
+ )
35
+ self.LOG_DIRECTORY = None
36
+
37
+ def _sanitize(self, value):
38
+ """Replace underscores with dashes and convert to string."""
39
+ return str(value).replace("_", "-") if value is not None else "unknown"
40
+
41
+ def _generate_logfile_path(self, invocation_id, gateway) -> str:
42
+ if not self.LOG_DIRECTORY:
43
+ return None
44
+ timestamp = str(int(datetime.datetime.now(datetime.timezone.utc).timestamp()))
45
+ invocation_id = self._sanitize(invocation_id)
46
+ gateway = self._sanitize(gateway)
47
+ filename = f"{invocation_id}_{gateway}_{timestamp}.stim"
48
+ return os.path.join(self.LOG_DIRECTORY, filename)
49
+
50
+ def _finalize_log_file(self, terminating_event_details=None):
51
+ if not self._is_logging_active or not self._current_logfile_path:
52
+ if self._is_logging_active:
53
+ log.warning("InvocationMonitor: Finalize called but no log file path.")
54
+ self._reset_session()
55
+ return
56
+
57
+ if not self._current_log_buffer and not self._triggering_event_details:
58
+ log.info(
59
+ f"InvocationMonitor: No messages were logged for {self._current_logfile_path}. Skipping file creation."
60
+ )
61
+ self._reset_session()
62
+ return
63
+
64
+ invocation_end_time = datetime.datetime.now(datetime.timezone.utc).timestamp()
65
+
66
+ yaml_data = {
67
+ "invocation_details": {
68
+ "log_file_version": self.LOG_FILE_VERSION,
69
+ "start_time": self._invocation_start_time,
70
+ "end_time": invocation_end_time,
71
+ "triggering_event": self._triggering_event_details,
72
+ "terminating_event": terminating_event_details,
73
+ },
74
+ "invocation_flow": self._current_log_buffer,
75
+ }
76
+
77
+ try:
78
+ with open(self._current_logfile_path, "w", encoding="utf-8") as f:
79
+ yaml.dump(
80
+ yaml_data,
81
+ f,
82
+ sort_keys=False,
83
+ allow_unicode=True,
84
+ indent=2,
85
+ default_flow_style=False,
86
+ )
87
+ log.info(
88
+ f"InvocationMonitor: YAML content saved to .stim file: {self._current_logfile_path}"
89
+ )
90
+ except Exception as e:
91
+ log.error(
92
+ f"InvocationMonitor: Failed to write YAML content to .stim file {self._current_logfile_path}: {e}"
93
+ )
94
+ finally:
95
+ self._reset_session()
96
+
97
+ def _reset_session(self):
98
+ self._is_logging_active = False
99
+ self._current_log_buffer = []
100
+ self._current_logfile_path = None
101
+ self._invocation_start_time = None
102
+ self._triggering_event_details = None
103
+ self._current_invocation_id = None
104
+ self._current_session_id = None
105
+
106
+ def _prepare_payload_for_yaml(self, payload):
107
+ if isinstance(payload, str):
108
+ try:
109
+ return json.loads(payload)
110
+ except json.JSONDecodeError:
111
+ return payload
112
+ elif isinstance(payload, (dict, list)):
113
+ return payload
114
+ elif isinstance(payload, bytes):
115
+ try:
116
+ return payload.decode("utf-8")
117
+ except UnicodeDecodeError:
118
+ return repr(payload)
119
+ return str(payload)
120
+
121
+ def _add_log_entry(
122
+ self,
123
+ direction: str,
124
+ topic: str,
125
+ payload: any,
126
+ component_identifier: str,
127
+ is_trigger_event=False,
128
+ ):
129
+ timestamp = datetime.datetime.now(datetime.timezone.utc).timestamp()
130
+ prepared_payload = self._prepare_payload_for_yaml(payload)
131
+
132
+ log_entry_dict = {
133
+ "topic": topic,
134
+ "timestamp": timestamp,
135
+ "component": component_identifier,
136
+ "direction": direction,
137
+ "payload": prepared_payload,
138
+ }
139
+
140
+ if is_trigger_event:
141
+ return {
142
+ "timestamp": timestamp,
143
+ "component": component_identifier,
144
+ "direction": direction,
145
+ "topic": topic,
146
+ "payload": prepared_payload,
147
+ }
148
+
149
+ if self._is_logging_active:
150
+ self._current_log_buffer.append(log_entry_dict)
151
+
152
+ return log_entry_dict
153
+
154
+ def log_message_event(
155
+ self,
156
+ direction: str,
157
+ topic: str,
158
+ payload: any,
159
+ component_identifier: str = "A2A_Host",
160
+ ):
161
+ if not self.LOG_DIRECTORY:
162
+ log.error(
163
+ "InvocationMonitor: Log directory not available. Skipping log_message_event."
164
+ )
165
+ return
166
+
167
+ if topic.endswith(self.EXCLUDE_TOPIC_SUFFIX):
168
+ return
169
+
170
+ if self.START_TOPIC_SUFFIX in topic:
171
+ method = None
172
+ invocation_id = None
173
+ session_id = None
174
+ if isinstance(payload, dict):
175
+ method = payload.get("method")
176
+ invocation_id = payload.get("id") or "unknown"
177
+ session_id = payload.get("params", {}).get("sessionId", None)
178
+ elif isinstance(payload, str):
179
+ try:
180
+ payload_obj = json.loads(payload)
181
+ method = payload_obj.get("method")
182
+ invocation_id = payload_obj.get("id") or "unknown"
183
+ session_id = payload_obj.get("params", {}).get("sessionId", None)
184
+ except Exception:
185
+ invocation_id = "unknown"
186
+ session_id = None
187
+
188
+ if method != "tasks/sendSubscribe":
189
+ if self._is_logging_active and method == "tasks/cancel":
190
+ log.warning(
191
+ f"InvocationMonitor: Cancel event received for topic {topic} (id={invocation_id}, sessionId={session_id}) while a session for {self._current_logfile_path} was active. "
192
+ "Finalizing previous session with reason: 'Request was canceled'."
193
+ )
194
+ self._finalize_log_file(
195
+ terminating_event_details={
196
+ "reason": "Request was canceled",
197
+ "topic": topic,
198
+ "method": method,
199
+ "invocation_id": invocation_id,
200
+ "session_id": session_id,
201
+ }
202
+ )
203
+ return
204
+
205
+ if self._is_logging_active:
206
+ log.warning(
207
+ f"InvocationMonitor: New start event received for topic {topic} (id={invocation_id}, sessionId={session_id}, method={method}) while a session for {self._current_logfile_path} was active. "
208
+ "Finalizing previous session with reason: 'New session started before old one ended'."
209
+ )
210
+ self._finalize_log_file(
211
+ terminating_event_details={
212
+ "reason": "New session started before old one ended",
213
+ "topic": topic,
214
+ "method": method,
215
+ "invocation_id": invocation_id,
216
+ "session_id": session_id,
217
+ }
218
+ )
219
+
220
+ self._is_logging_active = True
221
+ self._current_log_buffer = []
222
+ self._current_invocation_id = invocation_id
223
+ self._current_session_id = session_id
224
+
225
+ log.debug(
226
+ f"InvocationMonitor: Received start event for topic {topic}. Payload: {payload}"
227
+ )
228
+
229
+ gateway = "unknown"
230
+ if session_id and "web-session" in session_id:
231
+ gateway = "web"
232
+ elif session_id and "slack" in session_id:
233
+ gateway = "slack"
234
+
235
+ self._current_logfile_path = self._generate_logfile_path(
236
+ invocation_id, gateway
237
+ )
238
+
239
+ if not self._current_logfile_path:
240
+ log.error(
241
+ "InvocationMonitor: Could not generate logfile path. Aborting logging for this session."
242
+ )
243
+ self._reset_session()
244
+ return
245
+
246
+ self._invocation_start_time = datetime.datetime.now(
247
+ datetime.timezone.utc
248
+ ).timestamp()
249
+ self._triggering_event_details = self._add_log_entry(
250
+ direction, topic, payload, component_identifier, is_trigger_event=True
251
+ )
252
+
253
+ if self._triggering_event_details:
254
+ first_flow_entry = {
255
+ "topic": self._triggering_event_details["topic"],
256
+ "timestamp": self._triggering_event_details["timestamp"],
257
+ "component": self._triggering_event_details["component"],
258
+ "direction": self._triggering_event_details["direction"],
259
+ "payload": copy.deepcopy(self._triggering_event_details["payload"]),
260
+ }
261
+ self._current_log_buffer.append(first_flow_entry)
262
+
263
+ log.info(
264
+ f"InvocationMonitor: Started YAML logging (to .stim file) for new invocation. File: {self._current_logfile_path}. Trigger: {topic}"
265
+ )
266
+
267
+ elif self._is_logging_active:
268
+ current_event_details = self._add_log_entry(
269
+ direction, topic, payload, component_identifier, is_trigger_event=False
270
+ )
271
+
272
+ if self.END_TOPIC_CONTAINS in topic:
273
+ log.info(
274
+ f"InvocationMonitor: End condition met by topic {topic}. Finalizing YAML content to .stim file: {self._current_logfile_path}"
275
+ )
276
+ terminating_event_info = {
277
+ "timestamp": current_event_details["timestamp"],
278
+ "component": current_event_details["component"],
279
+ "direction": current_event_details["direction"],
280
+ "topic": current_event_details["topic"],
281
+ "payload": copy.deepcopy(current_event_details["payload"]),
282
+ }
283
+ self._finalize_log_file(
284
+ terminating_event_details=terminating_event_info
285
+ )
286
+
287
+ def cleanup(self):
288
+ log.info("InvocationMonitor: Cleanup called.")
289
+ if self._is_logging_active and self._current_logfile_path:
290
+ log.warning(
291
+ f"InvocationMonitor: Finalizing YAML content to .stim file {self._current_logfile_path} during cleanup."
292
+ )
293
+ self._finalize_log_file(
294
+ terminating_event_details={"reason": "Session finalized during cleanup"}
295
+ )