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
@@ -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
+ )