solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.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 (481) hide show
  1. solace_agent_mesh/agent/adk/alembic/README +74 -0
  2. solace_agent_mesh/agent/adk/alembic/env.py +77 -0
  3. solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
  4. solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
  5. solace_agent_mesh/agent/adk/alembic.ini +112 -0
  6. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  7. solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
  8. solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
  9. solace_agent_mesh/agent/adk/callbacks.py +852 -109
  10. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
  11. solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
  12. solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
  13. solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
  14. solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
  15. solace_agent_mesh/agent/adk/runner.py +85 -20
  16. solace_agent_mesh/agent/adk/schema_migration.py +88 -0
  17. solace_agent_mesh/agent/adk/services.py +94 -18
  18. solace_agent_mesh/agent/adk/setup.py +281 -65
  19. solace_agent_mesh/agent/adk/stream_parser.py +231 -37
  20. solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
  21. solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
  22. solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
  23. solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
  24. solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
  25. solace_agent_mesh/agent/proxies/base/app.py +3 -2
  26. solace_agent_mesh/agent/proxies/base/component.py +188 -22
  27. solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
  28. solace_agent_mesh/agent/sac/app.py +91 -3
  29. solace_agent_mesh/agent/sac/component.py +591 -157
  30. solace_agent_mesh/agent/sac/patch_adk.py +8 -16
  31. solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
  32. solace_agent_mesh/agent/tools/__init__.py +3 -0
  33. solace_agent_mesh/agent/tools/audio_tools.py +3 -3
  34. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
  35. solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
  36. solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
  37. solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
  38. solace_agent_mesh/agent/tools/time_tools.py +126 -0
  39. solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
  40. solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
  41. solace_agent_mesh/agent/tools/web_tools.py +125 -17
  42. solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
  43. solace_agent_mesh/agent/utils/context_helpers.py +17 -0
  44. solace_agent_mesh/assets/docs/404.html +6 -6
  45. solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
  46. solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
  51. solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
  52. solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
  54. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
  55. solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
  57. solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
  58. solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
  62. solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
  105. solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
  106. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
  107. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
  108. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
  109. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
  110. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
  111. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
  112. solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
  113. solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
  114. solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
  115. solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
  116. solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
  117. solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
  118. solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
  119. solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
  120. solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
  121. solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
  122. solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
  123. solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
  124. solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
  125. solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
  126. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
  127. solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
  128. solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
  129. solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
  130. solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
  131. solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
  132. solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
  133. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
  134. solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
  135. solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
  136. solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
  137. solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
  138. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
  139. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
  140. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
  141. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
  142. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
  143. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
  144. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
  145. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
  146. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
  147. solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
  151. solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
  152. solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
  154. solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
  156. solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
  158. solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
  159. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
  160. solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
  161. solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
  164. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
  165. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
  166. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
  167. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
  168. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
  169. solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
  170. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
  171. solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
  172. solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
  173. solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
  174. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  175. solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
  176. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  177. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  178. solace_agent_mesh/cli/__init__.py +1 -1
  179. solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
  181. solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
  182. solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
  183. solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
  184. solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
  185. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
  186. solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
  187. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
  188. solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
  189. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
  190. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
  191. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  192. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
  193. solace_agent_mesh/cli/commands/run_cmd.py +64 -49
  194. solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
  195. solace_agent_mesh/cli/main.py +15 -0
  196. solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
  197. solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
  198. solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
  199. solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
  200. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
  201. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
  202. solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
  203. solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
  204. solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
  205. solace_agent_mesh/common/a2a/events.py +2 -1
  206. solace_agent_mesh/common/a2a/protocol.py +5 -0
  207. solace_agent_mesh/common/a2a/types.py +2 -1
  208. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
  209. solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
  210. solace_agent_mesh/common/agent_registry.py +38 -11
  211. solace_agent_mesh/common/data_parts.py +144 -4
  212. solace_agent_mesh/common/error_handlers.py +83 -0
  213. solace_agent_mesh/common/exceptions.py +24 -0
  214. solace_agent_mesh/common/oauth/__init__.py +17 -0
  215. solace_agent_mesh/common/oauth/oauth_client.py +408 -0
  216. solace_agent_mesh/common/oauth/utils.py +50 -0
  217. solace_agent_mesh/common/rag_dto.py +156 -0
  218. solace_agent_mesh/common/sac/sam_component_base.py +97 -19
  219. solace_agent_mesh/common/sam_events/event_service.py +2 -2
  220. solace_agent_mesh/common/services/employee_service.py +1 -1
  221. solace_agent_mesh/common/utils/embeds/constants.py +1 -0
  222. solace_agent_mesh/common/utils/embeds/converter.py +1 -8
  223. solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
  224. solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
  225. solace_agent_mesh/common/utils/embeds/types.py +9 -0
  226. solace_agent_mesh/common/utils/log_formatters.py +20 -0
  227. solace_agent_mesh/common/utils/mime_helpers.py +12 -5
  228. solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
  229. solace_agent_mesh/common/utils/rbac_utils.py +69 -0
  230. solace_agent_mesh/common/utils/templates/__init__.py +8 -0
  231. solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
  232. solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
  233. solace_agent_mesh/config_portal/backend/common.py +12 -0
  234. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
  235. solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
  236. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
  237. solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
  238. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
  239. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
  240. solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
  241. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  242. solace_agent_mesh/core_a2a/service.py +3 -2
  243. solace_agent_mesh/gateway/adapter/__init__.py +1 -0
  244. solace_agent_mesh/gateway/adapter/base.py +170 -0
  245. solace_agent_mesh/gateway/adapter/types.py +230 -0
  246. solace_agent_mesh/gateway/base/app.py +39 -2
  247. solace_agent_mesh/gateway/base/auth_interface.py +103 -0
  248. solace_agent_mesh/gateway/base/component.py +1027 -151
  249. solace_agent_mesh/gateway/generic/__init__.py +1 -0
  250. solace_agent_mesh/gateway/generic/app.py +50 -0
  251. solace_agent_mesh/gateway/generic/component.py +894 -0
  252. solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
  253. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
  254. solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
  255. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
  256. solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
  257. solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
  258. solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
  259. solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
  260. solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
  261. solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
  262. solace_agent_mesh/gateway/http_sse/app.py +40 -11
  263. solace_agent_mesh/gateway/http_sse/component.py +285 -160
  264. solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
  265. solace_agent_mesh/gateway/http_sse/main.py +68 -450
  266. solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
  267. solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
  268. solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
  269. solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
  270. solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
  271. solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
  272. solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
  273. solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
  274. solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
  275. solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
  276. solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
  277. solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
  278. solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
  279. solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
  280. solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
  281. solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
  282. solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
  283. solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
  284. solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
  285. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
  286. solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
  287. solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
  288. solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
  289. solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
  290. solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
  291. solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
  292. solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
  293. solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
  294. solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
  295. solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
  296. solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
  297. solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
  298. solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
  299. solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
  300. solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
  301. solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
  302. solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
  303. solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
  304. solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
  305. solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
  306. solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
  307. solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
  308. solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
  309. solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
  310. solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
  311. solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
  312. solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
  313. solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
  314. solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
  315. solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
  316. solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
  317. solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
  318. solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
  319. solace_agent_mesh/services/__init__.py +0 -0
  320. solace_agent_mesh/services/platform/__init__.py +29 -0
  321. solace_agent_mesh/services/platform/alembic/env.py +85 -0
  322. solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
  323. solace_agent_mesh/services/platform/alembic.ini +109 -0
  324. solace_agent_mesh/services/platform/api/__init__.py +3 -0
  325. solace_agent_mesh/services/platform/api/dependencies.py +154 -0
  326. solace_agent_mesh/services/platform/api/main.py +314 -0
  327. solace_agent_mesh/services/platform/api/middleware.py +51 -0
  328. solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
  329. solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
  330. solace_agent_mesh/services/platform/app.py +215 -0
  331. solace_agent_mesh/services/platform/component.py +777 -0
  332. solace_agent_mesh/shared/__init__.py +14 -0
  333. solace_agent_mesh/shared/api/__init__.py +42 -0
  334. solace_agent_mesh/shared/auth/__init__.py +26 -0
  335. solace_agent_mesh/shared/auth/dependencies.py +204 -0
  336. solace_agent_mesh/shared/auth/middleware.py +347 -0
  337. solace_agent_mesh/shared/database/__init__.py +20 -0
  338. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
  339. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
  340. solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
  341. solace_agent_mesh/shared/exceptions/__init__.py +36 -0
  342. solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
  343. solace_agent_mesh/shared/utils/__init__.py +21 -0
  344. solace_agent_mesh/templates/logging_config_template.yaml +48 -0
  345. solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
  346. solace_agent_mesh/templates/platform.yaml +49 -0
  347. solace_agent_mesh/templates/plugin_readme_template.md +3 -25
  348. solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
  349. solace_agent_mesh/templates/proxy_template.yaml +62 -0
  350. solace_agent_mesh/templates/webui.yaml +148 -6
  351. solace_agent_mesh/tools/web_search/__init__.py +18 -0
  352. solace_agent_mesh/tools/web_search/base.py +84 -0
  353. solace_agent_mesh/tools/web_search/google_search.py +247 -0
  354. solace_agent_mesh/tools/web_search/models.py +99 -0
  355. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
  356. solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
  357. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
  358. solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
  359. solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
  360. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
  361. solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
  362. solace_agent_mesh/agent/agent_llm.txt +0 -378
  363. solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
  364. solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
  365. solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
  366. solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
  367. solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
  368. solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
  369. solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
  370. solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
  371. solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
  372. solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
  373. solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
  374. solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
  375. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
  376. solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
  377. solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
  378. solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
  379. solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
  380. solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
  381. solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
  382. solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
  383. solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
  384. solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
  385. solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
  386. solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
  387. solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
  388. solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
  389. solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
  390. solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
  391. solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
  392. solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
  393. solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
  394. solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
  395. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
  396. solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
  397. solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
  398. solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
  399. solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
  400. solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
  401. solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
  402. solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
  403. solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
  404. solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
  405. solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
  406. solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
  407. solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
  408. solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
  409. solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
  410. solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
  411. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
  412. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
  413. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
  414. solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
  415. solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
  416. solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
  417. solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
  418. solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
  419. solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
  420. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
  421. solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
  422. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
  423. solace_agent_mesh/common/common_llm.txt +0 -251
  424. solace_agent_mesh/common/common_llm_detail.txt +0 -2562
  425. solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
  426. solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
  427. solace_agent_mesh/common/sac/sac_llm.txt +0 -71
  428. solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
  429. solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
  430. solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
  431. solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
  432. solace_agent_mesh/common/services/services_llm.txt +0 -363
  433. solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
  434. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
  435. solace_agent_mesh/common/utils/utils_llm.txt +0 -336
  436. solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
  437. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
  438. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
  439. solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
  440. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
  441. solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
  442. solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
  443. solace_agent_mesh/gateway/base/base_llm.txt +0 -224
  444. solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
  445. solace_agent_mesh/gateway/gateway_llm.txt +0 -373
  446. solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
  447. solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
  448. solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
  449. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
  450. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
  451. solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
  452. solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
  453. solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
  454. solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
  455. solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
  456. solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
  457. solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
  458. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
  459. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
  460. solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
  461. solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
  462. solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
  463. solace_agent_mesh/llm.txt +0 -228
  464. solace_agent_mesh/llm_detail.txt +0 -2835
  465. solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
  466. solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
  467. solace_agent_mesh/templates/logging_config_template.ini +0 -45
  468. solace_agent_mesh/templates/templates_llm.txt +0 -147
  469. solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
  470. /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
  471. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
  472. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
  473. /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
  474. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
  475. /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
  476. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
  477. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
  478. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
  479. /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
  480. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
  481. {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
@@ -5,16 +5,19 @@ Base Component class for SAM implementations in the Solace AI Connector.
5
5
  import logging
6
6
  import abc
7
7
  import asyncio
8
+ import concurrent.futures
8
9
  import threading
9
10
  import functools
11
+ import time
10
12
  from typing import Any, Optional
11
13
 
12
14
  from solace_ai_connector.components.component_base import ComponentBase
13
15
 
14
- from ..exceptions import MessageSizeExceededError
16
+ from ..exceptions import ComponentInitializationError, MessageSizeExceededError
15
17
  from ..utils.message_utils import validate_message_size
16
18
 
17
19
  log = logging.getLogger(__name__)
20
+ trace_logger = logging.getLogger("sam_trace")
18
21
 
19
22
 
20
23
  class SamComponentBase(ComponentBase, abc.ABC):
@@ -64,7 +67,7 @@ class SamComponentBase(ComponentBase, abc.ABC):
64
67
  # Trust Manager integration (enterprise feature) - initialized as part of _late_init
65
68
  self.trust_manager: Optional[Any] = None
66
69
 
67
- log.info("%s SamComponentBase initialized successfully.", self.log_identifier)
70
+ log.info("%s Initialized SamComponentBase", self.log_identifier)
68
71
 
69
72
  def add_timer(
70
73
  self,
@@ -218,6 +221,50 @@ class SamComponentBase(ComponentBase, abc.ABC):
218
221
  self.log_identifier,
219
222
  timer_id,
220
223
  )
224
+ elif event.event_type == EventType.CACHE_EXPIRY:
225
+ import asyncio
226
+ import inspect
227
+
228
+ cache_data = event.data
229
+ handler = self.handle_cache_expiry_event
230
+
231
+ # Check if the handler is async
232
+ if inspect.iscoroutinefunction(handler):
233
+ # Schedule async handler on the event loop
234
+ if self._async_loop and self._async_loop.is_running():
235
+ async def handle_async():
236
+ await handler(cache_data)
237
+
238
+ try:
239
+ future = asyncio.run_coroutine_threadsafe(
240
+ handle_async(),
241
+ self._async_loop
242
+ )
243
+
244
+ def on_done(f):
245
+ try:
246
+ f.result()
247
+ except Exception as e:
248
+ log.error(
249
+ "%s Error in async cache expiry handler: %s",
250
+ self.log_identifier,
251
+ e,
252
+ exc_info=True
253
+ )
254
+ future.add_done_callback(on_done)
255
+ except RuntimeError as e:
256
+ log.error(
257
+ "%s Failed to schedule async CACHE_EXPIRY handler (event loop may be stopping): %s",
258
+ self.log_identifier,
259
+ e
260
+ )
261
+ else:
262
+ log.error(
263
+ "%s Cannot handle async CACHE_EXPIRY: event loop not available",
264
+ self.log_identifier
265
+ )
266
+ else:
267
+ handler(cache_data)
221
268
  else:
222
269
  # Pass other event types to parent class
223
270
  super().process_event(event)
@@ -350,9 +397,18 @@ class SamComponentBase(ComponentBase, abc.ABC):
350
397
  """Helper to publish A2A messages via the SAC App with size validation."""
351
398
  try:
352
399
  log.debug(
353
- f"{self.log_identifier} [publish_a2a_message] Starting - topic: {topic}, payload keys: {list(payload.keys()) if isinstance(payload, dict) else 'not_dict'}"
400
+ "%s [publish_a2a_message] Starting - topic: %s, payload keys: %s",
401
+ self.log_identifier,
402
+ topic,
403
+ list(payload.keys()) if isinstance(payload, dict) else "not_dict"
354
404
  )
355
405
 
406
+ # Create user_properties if it doesn't exist
407
+ if user_properties is None:
408
+ user_properties = {}
409
+
410
+ user_properties["timestamp"] = int(time.time() * 1000)
411
+
356
412
  # Validate message size
357
413
  is_valid, actual_size = validate_message_size(
358
414
  payload, self.max_message_size_bytes, self.log_identifier
@@ -363,14 +419,14 @@ class SamComponentBase(ComponentBase, abc.ABC):
363
419
  f"Message size validation failed: payload size ({actual_size} bytes) "
364
420
  f"exceeds maximum allowed size ({self.max_message_size_bytes} bytes)"
365
421
  )
366
- log.error("%s %s", self.log_identifier, error_msg)
422
+ log.error("%s [publish_a2a_message] %s", self.log_identifier, error_msg)
367
423
  raise MessageSizeExceededError(
368
424
  actual_size, self.max_message_size_bytes, error_msg
369
425
  )
370
426
 
371
427
  # Debug logging to show message size when publishing
372
428
  log.debug(
373
- "%s Publishing message to topic %s (size: %d bytes)",
429
+ "%s [publish_a2a_message] Publishing message to topic %s (size: %d bytes)",
374
430
  self.log_identifier,
375
431
  topic,
376
432
  actual_size,
@@ -379,7 +435,8 @@ class SamComponentBase(ComponentBase, abc.ABC):
379
435
  app = self.get_app()
380
436
  if app:
381
437
  log.debug(
382
- f"{self.log_identifier} [publish_a2a_message] Got app instance, about to call app.send_message"
438
+ "%s [publish_a2a_message] Got app instance, about to call app.send_message",
439
+ self.log_identifier
383
440
  )
384
441
 
385
442
  # Conditionally log to invocation monitor if it exists (i.e., on an agent)
@@ -391,19 +448,24 @@ class SamComponentBase(ComponentBase, abc.ABC):
391
448
  component_identifier=self.log_identifier,
392
449
  )
393
450
 
394
- log.debug(
395
- f"{self.log_identifier} [publish_a2a_message] About to call app.send_message with payload: {payload}"
396
- )
397
- log.debug(
398
- f"{self.log_identifier} [publish_a2a_message] App send_message params - topic: {topic}, user_properties: {user_properties}"
399
- )
451
+ if trace_logger.isEnabledFor(logging.DEBUG):
452
+ trace_logger.debug(
453
+ "%s [publish_a2a_message] About to call app.send_message on topic '%s'\nwith payload: %s\nwith user_properties: %s",
454
+ self.log_identifier, topic, payload, user_properties
455
+ )
456
+ else:
457
+ log.debug(
458
+ "%s [publish_a2a_message] About to call app.send_message on topic '%s' (for more details, enable TRACE logging)",
459
+ self.log_identifier, topic
460
+ )
400
461
 
401
462
  app.send_message(
402
463
  payload=payload, topic=topic, user_properties=user_properties
403
464
  )
404
465
 
405
466
  log.debug(
406
- f"{self.log_identifier} [publish_a2a_message] Successfully called app.send_message"
467
+ "%s [publish_a2a_message] Successfully called app.send_message on topic '%s'",
468
+ self.log_identifier, topic
407
469
  )
408
470
  else:
409
471
  log.error(
@@ -434,15 +496,11 @@ class SamComponentBase(ComponentBase, abc.ABC):
434
496
  main_task = None
435
497
  try:
436
498
  log.info(
437
- "%s Starting _async_setup_and_run as an asyncio task.",
499
+ "%s Starting _async_setup_and_run as an asyncio task. Will run event loop forever (or until stop_signal).",
438
500
  self.log_identifier,
439
501
  )
440
502
  main_task = self._async_loop.create_task(self._async_setup_and_run())
441
503
 
442
- log.info(
443
- "%s Running asyncio event loop forever (or until stop_signal).",
444
- self.log_identifier,
445
- )
446
504
  self._async_loop.run_forever()
447
505
 
448
506
  except Exception as e:
@@ -502,6 +560,26 @@ class SamComponentBase(ComponentBase, abc.ABC):
502
560
  "%s Async operations thread already running.", self.log_identifier
503
561
  )
504
562
 
563
+ # Monitor async initialization without blocking (critical for multi-agent processes)
564
+ if hasattr(self, '_async_init_future') and self._async_init_future is not None:
565
+ log.info("%s Setting up async initialization monitoring...", self.log_identifier)
566
+
567
+ def handle_init_completion(future):
568
+ """Non-blocking callback for initialization completion."""
569
+ try:
570
+ future.result() # Raises if init failed
571
+ log.info("%s Async initialization completed successfully.", self.log_identifier)
572
+ except Exception as init_error:
573
+ error_msg = f"{self.log_identifier} Async initialization failed: {init_error}"
574
+ log.error(error_msg, exc_info=init_error)
575
+ self.stop_signal.set()
576
+ self._async_init_error = ComponentInitializationError(
577
+ self.log_identifier, init_error, error_msg
578
+ )
579
+
580
+ self._async_init_future.add_done_callback(handle_init_completion)
581
+ log.info("%s Async initialization monitoring active (non-blocking).", self.log_identifier)
582
+
505
583
  super().run()
506
584
  log.info("%s SamComponentBase run method finished.", self.log_identifier)
507
585
 
@@ -630,7 +708,7 @@ class SamComponentBase(ComponentBase, abc.ABC):
630
708
  event_loop=self.get_async_loop(),
631
709
  )
632
710
  log.info(
633
- "%s Trust Manager initialized successfully", self.log_identifier
711
+ "%s Initialized Trust Manager", self.log_identifier
634
712
  )
635
713
  except Exception as e:
636
714
  log.error(
@@ -45,9 +45,9 @@ class SamEvent:
45
45
  @dataclass
46
46
  class SessionDeletedEvent(SamEvent):
47
47
  """System event for session deletion."""
48
-
48
+
49
49
  @classmethod
50
- def create(cls, namespace: str, source_component: str, session_id: str,
50
+ def create(cls, namespace: str, source_component: str, session_id: str,
51
51
  user_id: str, agent_id: str, gateway_id: str) -> "SessionDeletedEvent":
52
52
  """Create a session deleted event."""
53
53
  data = {
@@ -66,7 +66,7 @@ class BaseEmployeeService(ABC):
66
66
  pass
67
67
 
68
68
  @abstractmethod
69
- async def get_time_off_data(self, employee_id: str) -> List[Dict[str, Any]]:
69
+ async def get_time_off_data(self, employee_id: str, start_date: Optional[str] = None, end_date: Optional[str] = None) -> List[Dict[str, Any]]:
70
70
  """
71
71
  Retrieves a list of raw time-off entries for an employee.
72
72
 
@@ -38,6 +38,7 @@ EARLY_EMBED_TYPES: Set[str] = {
38
38
  }
39
39
  LATE_EMBED_TYPES: Set[str] = {
40
40
  "artifact_content",
41
+ "artifact_return",
41
42
  }
42
43
 
43
44
  TEXT_CONTAINER_MIME_TYPES: Set[str] = {
@@ -14,12 +14,7 @@ from ..mime_helpers import is_text_based_mime_type
14
14
 
15
15
  log = logging.getLogger(__name__)
16
16
 
17
- try:
18
- import yaml
19
-
20
- PYYAML_AVAILABLE = True
21
- except ImportError:
22
- PYYAML_AVAILABLE = False
17
+ import yaml
23
18
 
24
19
 
25
20
  def _parse_string_to_list_of_dicts(
@@ -63,8 +58,6 @@ def _parse_string_to_list_of_dicts(
63
58
  reader = csv.DictReader(string_io)
64
59
  return list(reader), None
65
60
  elif "yaml" in normalized_mime_type or "yml" in normalized_mime_type:
66
- if not PYYAML_AVAILABLE:
67
- return None, "YAML parsing skipped: 'PyYAML' not installed."
68
61
  parsed_yaml = yaml.safe_load(data_string)
69
62
  if isinstance(parsed_yaml, list) and all(
70
63
  isinstance(item, dict) for item in parsed_yaml
@@ -10,23 +10,12 @@ from .constants import EARLY_EMBED_TYPES, LATE_EMBED_TYPES
10
10
 
11
11
  log = logging.getLogger(__name__)
12
12
 
13
- try:
14
- from jsonpath_ng.ext import parse as jsonpath_parse
15
-
16
- JSONPATH_NG_AVAILABLE = True
17
- except ImportError:
18
- JSONPATH_NG_AVAILABLE = False
19
-
20
- try:
21
- import pystache
22
-
23
- PYSTACHE_AVAILABLE = True
24
- except ImportError:
25
- PYSTACHE_AVAILABLE = False
13
+ from jsonpath_ng.ext import parse as jsonpath_parse
14
+ import pystache
26
15
 
27
16
  from google.adk.artifacts import BaseArtifactService
28
17
 
29
- from .types import DataFormat
18
+ from .types import DataFormat, ResolutionMode
30
19
 
31
20
 
32
21
  def _apply_jsonpath(
@@ -45,13 +34,6 @@ def _apply_jsonpath(
45
34
  Tuple: (result_data, original_mime_type, error_string)
46
35
  result_data is typically a list of matched values.
47
36
  """
48
- if not JSONPATH_NG_AVAILABLE:
49
- return (
50
- current_data,
51
- mime_type,
52
- "JSONPath modifier skipped: 'jsonpath-ng' not installed.",
53
- )
54
-
55
37
  if not isinstance(current_data, (dict, list)):
56
38
  return (
57
39
  current_data,
@@ -457,13 +439,6 @@ async def _apply_template(
457
439
  """
458
440
  from .resolver import resolve_embeds_recursively_in_string, evaluate_embed
459
441
 
460
- if not PYSTACHE_AVAILABLE:
461
- return (
462
- current_data,
463
- mime_type,
464
- "Template modifier skipped: 'pystache' not installed.",
465
- )
466
-
467
442
  if not isinstance(current_data, (dict, list, str)):
468
443
  return (
469
444
  current_data,
@@ -661,6 +636,7 @@ async def _apply_template(
661
636
  context=context,
662
637
  resolver_func=evaluate_embed,
663
638
  types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
639
+ resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
664
640
  log_identifier=f"{log_id}[TemplateEmbeds]",
665
641
  config=resolver_config,
666
642
  max_depth=resolver_config.get("gateway_recursive_embed_depth", 12),
@@ -5,6 +5,7 @@ Contains the main embed resolution functions, including the chain executor.
5
5
  import logging
6
6
  import asyncio
7
7
  import json
8
+ import uuid
8
9
  from typing import Any, Callable, Dict, Optional, Set, Tuple, List, Union
9
10
  from .constants import (
10
11
  EMBED_REGEX,
@@ -20,16 +21,12 @@ from .converter import (
20
21
  serialize_data,
21
22
  _parse_string_to_list_of_dicts,
22
23
  )
23
- from .types import DataFormat
24
+ from .types import DataFormat, ResolutionMode
24
25
  from ..mime_helpers import is_text_based_mime_type
25
26
 
26
27
  log = logging.getLogger(__name__)
27
28
 
28
- try:
29
- import yaml
30
- from .converter import PYYAML_AVAILABLE
31
- except ImportError:
32
- PYYAML_AVAILABLE = False
29
+ import yaml
33
30
 
34
31
 
35
32
  def _log_data_state(
@@ -85,10 +82,11 @@ async def _evaluate_artifact_content_embed_with_chain(
85
82
  output_format_from_directive: Optional[str],
86
83
  context: Any,
87
84
  log_identifier: str,
85
+ resolution_mode: "ResolutionMode",
88
86
  config: Optional[Dict] = None,
89
87
  current_depth: int = 0,
90
88
  visited_artifacts: Optional[Set[Tuple[str, int]]] = None,
91
- ) -> Tuple[str, Optional[str], int]:
89
+ ) -> Union[Tuple[str, Optional[str], int], Tuple[None, str, Any]]:
92
90
  """
93
91
  Loads artifact content, recursively resolves its internal embeds if text-based,
94
92
  applies a chain of modifiers, and serializes the final result.
@@ -167,6 +165,7 @@ async def _evaluate_artifact_content_embed_with_chain(
167
165
  context=context,
168
166
  resolver_func=evaluate_embed,
169
167
  types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
168
+ resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
170
169
  log_identifier=log_identifier,
171
170
  config=config,
172
171
  max_depth=config.get("gateway_recursive_embed_depth", 12),
@@ -181,7 +180,7 @@ async def _evaluate_artifact_content_embed_with_chain(
181
180
  current_format = DataFormat.STRING
182
181
  _log_data_state(
183
182
  log_identifier,
184
- f"[Depth:{current_depth}] After Recursive Resolution",
183
+ f"[Depth:{current_depth}] After Recursive Resolution (including templates)",
185
184
  current_data,
186
185
  current_format,
187
186
  original_mime_type,
@@ -229,25 +228,17 @@ async def _evaluate_artifact_content_embed_with_chain(
229
228
  original_mime_type,
230
229
  )
231
230
  elif "yaml" in normalized_mime_type or "yml" in normalized_mime_type:
232
- if PYYAML_AVAILABLE:
233
- try:
234
- current_data = yaml.safe_load(current_data)
235
- current_format = DataFormat.JSON_OBJECT
236
- log.info(
237
- "%s [Depth:%d] Pre-parsed string as YAML (now JSON_OBJECT).",
238
- log_identifier,
239
- current_depth,
240
- )
241
- except yaml.YAMLError:
242
- log.warning(
243
- "%s [Depth:%d] Failed to pre-parse as YAML despite MIME type '%s'. Content will be treated as STRING.",
244
- log_identifier,
245
- current_depth,
246
- original_mime_type,
247
- )
248
- else:
231
+ try:
232
+ current_data = yaml.safe_load(current_data)
233
+ current_format = DataFormat.JSON_OBJECT
234
+ log.info(
235
+ "%s [Depth:%d] Pre-parsed string as YAML (now JSON_OBJECT).",
236
+ log_identifier,
237
+ current_depth,
238
+ )
239
+ except yaml.YAMLError:
249
240
  log.warning(
250
- "%s [Depth:%d] Skipping YAML pre-parsing for MIME type '%s' because PyYAML is not installed.",
241
+ "%s [Depth:%d] Failed to pre-parse as YAML despite MIME type '%s'. Content will be treated as STRING.",
251
242
  log_identifier,
252
243
  current_depth,
253
244
  original_mime_type,
@@ -422,6 +413,26 @@ async def _evaluate_artifact_content_embed_with_chain(
422
413
  err_msg = f"Unexpected error in modifier '{prefix}': {mod_err}"
423
414
  return f"[Error: {err_msg}]", err_msg, 0
424
415
 
416
+ if (
417
+ current_format == DataFormat.BYTES
418
+ and resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER
419
+ ):
420
+ log.info(
421
+ "%s [Depth:%d] Result is binary data in A2A_MESSAGE_TO_USER mode. Signaling for inline binary content.",
422
+ log_identifier,
423
+ current_depth,
424
+ )
425
+ filename_for_signal = artifact_spec_from_directive.split(":", 1)[0]
426
+ return (
427
+ None,
428
+ "SIGNAL_INLINE_BINARY_CONTENT",
429
+ {
430
+ "bytes": current_data,
431
+ "mime_type": original_mime_type,
432
+ "name": filename_for_signal,
433
+ },
434
+ )
435
+
425
436
  target_string_format = output_format_from_directive
426
437
  if target_string_format is None:
427
438
  log.warning(
@@ -486,9 +497,10 @@ async def resolve_embeds_in_string(
486
497
  ..., Union[Tuple[str, Optional[str], int], Tuple[None, str, Any]]
487
498
  ],
488
499
  types_to_resolve: Set[str],
500
+ resolution_mode: "ResolutionMode",
489
501
  log_identifier: str = "[EmbedUtil]",
490
502
  config: Optional[Dict[str, Any]] = None,
491
- ) -> Tuple[str, int, List[Tuple[int, Any]]]:
503
+ ) -> Tuple[str, int, List[Tuple[int, Any, str]]]:
492
504
  """
493
505
  Resolves specified embed types within a string using a provided resolver function.
494
506
  This is the TOP-LEVEL resolver called by gateways. It handles signals and buffering.
@@ -520,7 +532,7 @@ async def resolve_embeds_in_string(
520
532
  The index corresponds to the start index of the embed directive in the original string.
521
533
  """
522
534
  resolved_parts = []
523
- signals_found: List[Tuple[int, Any]] = []
535
+ signals_found: List[Tuple[int, Any, str]] = []
524
536
  last_end = 0
525
537
  original_length = len(text)
526
538
 
@@ -550,6 +562,7 @@ async def resolve_embeds_in_string(
550
562
  format_spec,
551
563
  context,
552
564
  log_identifier,
565
+ resolution_mode,
553
566
  config,
554
567
  )
555
568
 
@@ -566,10 +579,13 @@ async def resolve_embeds_in_string(
566
579
  signal_type,
567
580
  start,
568
581
  )
582
+ placeholder = f"__EMBED_SIGNAL_{uuid.uuid4().hex}__"
583
+ resolved_parts.append(placeholder)
569
584
  signals_found.append(
570
585
  (
571
586
  start,
572
587
  resolved_value,
588
+ placeholder,
573
589
  )
574
590
  )
575
591
  elif (
@@ -649,6 +665,34 @@ async def resolve_embeds_in_string(
649
665
  len(final_text),
650
666
  )
651
667
 
668
+ # If resolving late embeds, also resolve template blocks
669
+ # Templates are considered late embeds since they need artifact service access
670
+ if LATE_EMBED_TYPES.intersection(types_to_resolve):
671
+ try:
672
+ from ..templates import resolve_template_blocks_in_string
673
+
674
+ artifact_service = context.get("artifact_service")
675
+ session_context = context.get("session_context")
676
+
677
+ if artifact_service and session_context:
678
+ log.debug(
679
+ "%s Resolving template blocks after late embed resolution.",
680
+ log_identifier,
681
+ )
682
+ final_text = await resolve_template_blocks_in_string(
683
+ text=final_text,
684
+ artifact_service=artifact_service,
685
+ session_context=session_context,
686
+ log_identifier=f"{log_identifier}[TemplateResolve]",
687
+ )
688
+ except Exception as template_err:
689
+ log.warning(
690
+ "%s Failed to resolve template blocks: %s",
691
+ log_identifier,
692
+ template_err,
693
+ )
694
+ # Continue with final_text as-is
695
+
652
696
  return final_text, processed_until_index, signals_found
653
697
 
654
698
 
@@ -657,6 +701,7 @@ async def resolve_embeds_recursively_in_string(
657
701
  context: Any,
658
702
  resolver_func: Callable[..., Tuple[str, Optional[str], int]],
659
703
  types_to_resolve: Set[str],
704
+ resolution_mode: "ResolutionMode",
660
705
  log_identifier: str,
661
706
  config: Optional[Dict],
662
707
  max_depth: int,
@@ -709,6 +754,7 @@ async def resolve_embeds_recursively_in_string(
709
754
  format_spec,
710
755
  context,
711
756
  log_identifier,
757
+ resolution_mode,
712
758
  config,
713
759
  current_depth,
714
760
  visited_artifacts,
@@ -767,7 +813,39 @@ async def resolve_embeds_recursively_in_string(
767
813
  last_end = end
768
814
 
769
815
  resolved_parts.append(text[last_end:])
770
- return "".join(resolved_parts)
816
+ result_text = "".join(resolved_parts)
817
+
818
+ # If resolving late embeds, also resolve template blocks
819
+ # Templates are considered late embeds since they need artifact service access
820
+ if LATE_EMBED_TYPES.intersection(types_to_resolve):
821
+ try:
822
+ from ..templates import resolve_template_blocks_in_string
823
+
824
+ artifact_service = context.get("artifact_service")
825
+ session_context = context.get("session_context")
826
+
827
+ if artifact_service and session_context:
828
+ log.debug(
829
+ "%s [Depth:%d] Resolving template blocks after late embed resolution.",
830
+ log_identifier,
831
+ current_depth,
832
+ )
833
+ result_text = await resolve_template_blocks_in_string(
834
+ text=result_text,
835
+ artifact_service=artifact_service,
836
+ session_context=session_context,
837
+ log_identifier=f"{log_identifier}[TemplateResolve]",
838
+ )
839
+ except Exception as template_err:
840
+ log.warning(
841
+ "%s [Depth:%d] Failed to resolve template blocks: %s",
842
+ log_identifier,
843
+ current_depth,
844
+ template_err,
845
+ )
846
+ # Continue with result_text as-is
847
+
848
+ return result_text
771
849
 
772
850
 
773
851
  async def evaluate_embed(
@@ -776,6 +854,7 @@ async def evaluate_embed(
776
854
  format_spec: Optional[str],
777
855
  context: Dict[str, Any],
778
856
  log_identifier: str,
857
+ resolution_mode: "ResolutionMode",
779
858
  config: Optional[Dict] = None,
780
859
  current_depth: int = 0,
781
860
  visited_artifacts: Optional[Set[Tuple[str, int]]] = None,
@@ -812,6 +891,26 @@ async def evaluate_embed(
812
891
  log.info("%s Detected 'status_update' embed. Signaling.", log_identifier)
813
892
  return (None, "SIGNAL_STATUS_UPDATE", status_text)
814
893
 
894
+ elif embed_type == "artifact_return":
895
+ if resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER:
896
+ parts = expression.strip().split(":", 1)
897
+ filename = parts[0]
898
+ version = parts[1] if len(parts) > 1 else "latest"
899
+ log.info("%s Detected 'artifact_return' embed. Signaling.", log_identifier)
900
+ return (
901
+ None,
902
+ "SIGNAL_ARTIFACT_RETURN",
903
+ {"filename": filename, "version": version},
904
+ )
905
+ else:
906
+ log.warning(
907
+ "%s Ignoring 'artifact_return' embed in unsupported context: %s",
908
+ log_identifier,
909
+ resolution_mode.name,
910
+ )
911
+ original_embed_text = f"«{embed_type}:{expression}»"
912
+ return original_embed_text, None, len(original_embed_text.encode("utf-8"))
913
+
815
914
  elif embed_type == "artifact_content":
816
915
  artifact_spec, modifiers, output_format = _parse_modifier_chain(expression)
817
916
  if output_format is None and format_spec is not None:
@@ -822,17 +921,39 @@ async def evaluate_embed(
822
921
  )
823
922
  output_format = format_spec
824
923
 
825
- final_string, error, size = await _evaluate_artifact_content_embed_with_chain(
924
+ # Check if this is a deep research report artifact
925
+ # Deep research reports should be rendered by the frontend component, not resolved inline
926
+ filename_part = artifact_spec.split(":")[0] if ":" in artifact_spec else artifact_spec
927
+ is_deep_research_report = filename_part.lower().endswith("_report.md")
928
+
929
+ if is_deep_research_report and resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER:
930
+ # Parse version from artifact_spec
931
+ parts = artifact_spec.strip().split(":", 1)
932
+ filename = parts[0]
933
+ version = parts[1] if len(parts) > 1 else "latest"
934
+ log.info(
935
+ "%s Detected deep research report artifact '%s'. Signaling for frontend rendering instead of inline resolution.",
936
+ log_identifier,
937
+ filename,
938
+ )
939
+ return (
940
+ None,
941
+ "SIGNAL_DEEP_RESEARCH_REPORT",
942
+ {"filename": filename, "version": version},
943
+ )
944
+
945
+ result = await _evaluate_artifact_content_embed_with_chain(
826
946
  artifact_spec_from_directive=artifact_spec,
827
947
  modifiers_from_directive=modifiers,
828
948
  output_format_from_directive=output_format,
829
949
  context=context,
830
950
  log_identifier=log_identifier,
951
+ resolution_mode=resolution_mode,
831
952
  config=config,
832
953
  current_depth=current_depth,
833
954
  visited_artifacts=visited_artifacts or set(),
834
955
  )
835
- return final_string, error, size
956
+ return result
836
957
 
837
958
  else:
838
959
  evaluator = EMBED_EVALUATORS.get(embed_type)
@@ -5,6 +5,15 @@ Defines types used within the embed processing system, like DataFormat.
5
5
  from enum import Enum, auto
6
6
 
7
7
 
8
+ class ResolutionMode(Enum):
9
+ """Defines the context in which embed resolution is occurring."""
10
+
11
+ A2A_MESSAGE_TO_USER = auto()
12
+ TOOL_PARAMETER = auto()
13
+ RECURSIVE_ARTIFACT_CONTENT = auto()
14
+ ARTIFACT_STREAMING = auto() # For streaming artifact chunks to browser
15
+
16
+
8
17
  class DataFormat(Enum):
9
18
  """Represents internal data formats during modifier chain execution."""
10
19