solace-agent-mesh 1.11.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.
- solace_agent_mesh/__init__.py +0 -0
- solace_agent_mesh/agent/__init__.py +0 -0
- solace_agent_mesh/agent/adk/__init__.py +0 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
- solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
- solace_agent_mesh/agent/adk/callbacks.py +2318 -0
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
- solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
- solace_agent_mesh/agent/adk/runner.py +390 -0
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +468 -0
- solace_agent_mesh/agent/adk/setup.py +1325 -0
- solace_agent_mesh/agent/adk/stream_parser.py +415 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
- solace_agent_mesh/agent/agent_llm.txt +369 -0
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/__init__.py +0 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +100 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/base/component.py +816 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/__init__.py +0 -0
- solace_agent_mesh/agent/sac/app.py +595 -0
- solace_agent_mesh/agent/sac/component.py +3668 -0
- solace_agent_mesh/agent/sac/patch_adk.py +103 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +415 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +58 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/__init__.py +16 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
- solace_agent_mesh/agent/tools/image_tools.py +1185 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
- solace_agent_mesh/agent/tools/registry.py +38 -0
- solace_agent_mesh/agent/tools/test_tools.py +136 -0
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
- solace_agent_mesh/agent/tools/tool_definition.py +53 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
- solace_agent_mesh/agent/tools/web_tools.py +392 -0
- solace_agent_mesh/agent/utils/__init__.py +0 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
- solace_agent_mesh/agent/utils/config_parser.py +49 -0
- solace_agent_mesh/agent/utils/context_helpers.py +77 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
- solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/509e993c.a1fbf45a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.6c1dbf0c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/sam-enterprise-credentials.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -0
- solace_agent_mesh/cli/commands/__init__.py +0 -0
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +729 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +102 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +119 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
- solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +215 -0
- solace_agent_mesh/cli/main.py +52 -0
- solace_agent_mesh/cli/utils.py +262 -0
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a/__init__.py +241 -0
- solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +368 -0
- solace_agent_mesh/common/a2a/events.py +213 -0
- solace_agent_mesh/common/a2a/message.py +375 -0
- solace_agent_mesh/common/a2a/protocol.py +689 -0
- solace_agent_mesh/common/a2a/task.py +127 -0
- solace_agent_mesh/common/a2a/translation.py +655 -0
- solace_agent_mesh/common/a2a/types.py +55 -0
- solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
- solace_agent_mesh/common/agent_registry.py +122 -0
- solace_agent_mesh/common/common_llm.txt +230 -0
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/constants.py +6 -0
- solace_agent_mesh/common/data_parts.py +150 -0
- solace_agent_mesh/common/exceptions.py +49 -0
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +132 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +127 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/sac/__init__.py +0 -0
- solace_agent_mesh/common/sac/sac_llm.txt +71 -0
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +730 -0
- solace_agent_mesh/common/sam_events/__init__.py +9 -0
- solace_agent_mesh/common/sam_events/event_service.py +208 -0
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +164 -0
- solace_agent_mesh/common/services/identity_service.py +134 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
- solace_agent_mesh/common/services/services_llm.txt +368 -0
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/artifact_utils.py +31 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +56 -0
- solace_agent_mesh/common/utils/embeds/converter.py +447 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
- solace_agent_mesh/common/utils/embeds/types.py +23 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +52 -0
- solace_agent_mesh/common/utils/log_formatters.py +64 -0
- solace_agent_mesh/common/utils/message_utils.py +80 -0
- solace_agent_mesh/common/utils/mime_helpers.py +172 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
- solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/common/utils/type_utils.py +28 -0
- solace_agent_mesh/common/utils/utils_llm.txt +335 -0
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +77 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
- solace_agent_mesh/config_portal/backend/server.py +644 -0
- solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +307 -0
- solace_agent_mesh/evaluation/__init__.py +0 -0
- solace_agent_mesh/evaluation/evaluator.py +691 -0
- solace_agent_mesh/evaluation/message_organizer.py +553 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +970 -0
- solace_agent_mesh/evaluation/report_generator.py +607 -0
- solace_agent_mesh/evaluation/run.py +954 -0
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +776 -0
- solace_agent_mesh/evaluation/summary_builder.py +880 -0
- solace_agent_mesh/gateway/__init__.py +0 -0
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +143 -0
- solace_agent_mesh/gateway/adapter/types.py +221 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +345 -0
- solace_agent_mesh/gateway/base/base_llm.txt +226 -0
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +2030 -0
- solace_agent_mesh/gateway/base/task_context.py +75 -0
- solace_agent_mesh/gateway/gateway_llm.txt +369 -0
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +727 -0
- solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
- solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
- solace_agent_mesh/gateway/http_sse/app.py +351 -0
- solace_agent_mesh/gateway/http_sse/component.py +2360 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +789 -0
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
- solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
- solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
- solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
- solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
- solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
- solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
- solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
- solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
- solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
- solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
- solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
- solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
- solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +18 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +147 -0
- solace_agent_mesh/services/platform/api/main.py +280 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
- solace_agent_mesh/services/platform/app.py +114 -0
- solace_agent_mesh/services/platform/component.py +235 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +75 -0
- solace_agent_mesh/templates/gateway_component_template.py +484 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +66 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +60 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
- solace_agent_mesh/templates/plugin_readme_template.md +12 -0
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +112 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +177 -0
- solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
- solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
- solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
- solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
- solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A thread-safe buffer for holding early SSE events before a client connects.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import datetime
|
|
7
|
+
import threading
|
|
8
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
9
|
+
|
|
10
|
+
log = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SSEEventBuffer:
|
|
14
|
+
"""Manages buffering and cleanup of SSE events for tasks without active listeners."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, max_queue_size: int, max_age_seconds: int):
|
|
17
|
+
self._pending_events: Dict[
|
|
18
|
+
str, Tuple[datetime.datetime, List[Dict[str, Any]]]
|
|
19
|
+
] = {}
|
|
20
|
+
self._lock = threading.Lock()
|
|
21
|
+
self._max_queue_size = max_queue_size
|
|
22
|
+
self._max_age_seconds = max_age_seconds
|
|
23
|
+
self.log_identifier = "[SSEEventBuffer]"
|
|
24
|
+
log.debug(
|
|
25
|
+
"%s Initialized with max_age:%ds, max_size:%d",
|
|
26
|
+
self.log_identifier,
|
|
27
|
+
self._max_age_seconds,
|
|
28
|
+
self._max_queue_size,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def buffer_event(self, task_id: str, event: Dict[str, Any]):
|
|
32
|
+
"""Buffers an event for a given task ID."""
|
|
33
|
+
with self._lock:
|
|
34
|
+
if task_id not in self._pending_events:
|
|
35
|
+
self._pending_events[task_id] = (
|
|
36
|
+
datetime.datetime.now(datetime.timezone.utc),
|
|
37
|
+
[],
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if len(self._pending_events[task_id][1]) < self._max_queue_size:
|
|
41
|
+
self._pending_events[task_id][1].append(event)
|
|
42
|
+
else:
|
|
43
|
+
log.warning(
|
|
44
|
+
"%s Buffer full for Task ID: %s. Event dropped.",
|
|
45
|
+
self.log_identifier,
|
|
46
|
+
task_id,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def get_and_remove_buffer(self, task_id: str) -> Optional[List[Dict[str, Any]]]:
|
|
50
|
+
"""Atomically retrieves and removes the event buffer for a task."""
|
|
51
|
+
with self._lock:
|
|
52
|
+
buffer_tuple = self._pending_events.pop(task_id, None)
|
|
53
|
+
if buffer_tuple:
|
|
54
|
+
log.debug(
|
|
55
|
+
"%s Flushing %d events for Task ID: %s",
|
|
56
|
+
self.log_identifier,
|
|
57
|
+
len(buffer_tuple[1]),
|
|
58
|
+
task_id,
|
|
59
|
+
)
|
|
60
|
+
return buffer_tuple[1]
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
def remove_buffer(self, task_id: str):
|
|
64
|
+
"""Explicitly removes a buffer for a task, e.g., on finalization."""
|
|
65
|
+
with self._lock:
|
|
66
|
+
if self._pending_events.pop(task_id, None):
|
|
67
|
+
log.debug(
|
|
68
|
+
"%s Removed buffer for task %s.", self.log_identifier, task_id
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
def cleanup_stale_buffers(self):
|
|
72
|
+
"""Removes all pending event buffers older than the max age."""
|
|
73
|
+
with self._lock:
|
|
74
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
|
75
|
+
stale_tasks = [
|
|
76
|
+
task_id
|
|
77
|
+
for task_id, (timestamp, _) in self._pending_events.items()
|
|
78
|
+
if (now - timestamp).total_seconds() > self._max_age_seconds
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
if stale_tasks:
|
|
82
|
+
log.debug(
|
|
83
|
+
"%s Cleaning up %d stale event buffers.",
|
|
84
|
+
self.log_identifier,
|
|
85
|
+
len(stale_tasks),
|
|
86
|
+
)
|
|
87
|
+
for task_id in stale_tasks:
|
|
88
|
+
del self._pending_events[task_id]
|
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Manages Server-Sent Event (SSE) connections for streaming task updates.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import asyncio
|
|
7
|
+
import threading
|
|
8
|
+
from typing import Dict, List, Any, Callable, Optional
|
|
9
|
+
import json
|
|
10
|
+
import datetime
|
|
11
|
+
import math
|
|
12
|
+
|
|
13
|
+
from .sse_event_buffer import SSEEventBuffer
|
|
14
|
+
|
|
15
|
+
log = logging.getLogger(__name__)
|
|
16
|
+
trace_logger = logging.getLogger("sam_trace")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SSEManager:
|
|
20
|
+
"""
|
|
21
|
+
Manages active SSE connections and distributes events based on task ID.
|
|
22
|
+
Uses asyncio Queues for buffering events per connection.
|
|
23
|
+
|
|
24
|
+
Note: This manager uses a threading.Lock to ensure thread-safety across
|
|
25
|
+
different event loops (e.g., FastAPI event loop and SAC component event loop).
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, max_queue_size: int, event_buffer: SSEEventBuffer, session_factory: Optional[Callable] = None):
|
|
29
|
+
self._connections: Dict[str, List[asyncio.Queue]] = {}
|
|
30
|
+
self._event_buffer = event_buffer
|
|
31
|
+
# Use a single threading lock for cross-event-loop synchronization
|
|
32
|
+
self._lock = threading.Lock()
|
|
33
|
+
self.log_identifier = "[SSEManager]"
|
|
34
|
+
self._max_queue_size = max_queue_size
|
|
35
|
+
self._session_factory = session_factory
|
|
36
|
+
self._background_task_cache: Dict[str, bool] = {} # Cache to avoid repeated DB queries
|
|
37
|
+
self._tasks_with_prior_connection: set = set() # Track tasks that have had at least one SSE connection
|
|
38
|
+
|
|
39
|
+
def _sanitize_json(self, obj):
|
|
40
|
+
if isinstance(obj, dict):
|
|
41
|
+
return {k: self._sanitize_json(v) for k, v in obj.items()}
|
|
42
|
+
elif isinstance(obj, list):
|
|
43
|
+
return [self._sanitize_json(v) for v in obj]
|
|
44
|
+
elif isinstance(obj, (float, int)):
|
|
45
|
+
if math.isnan(obj) or math.isinf(obj):
|
|
46
|
+
return None
|
|
47
|
+
return obj
|
|
48
|
+
elif isinstance(obj, (str, bool, type(None))):
|
|
49
|
+
return obj
|
|
50
|
+
elif isinstance(obj, (datetime.datetime, datetime.date)):
|
|
51
|
+
return obj.isoformat()
|
|
52
|
+
else:
|
|
53
|
+
return str(obj)
|
|
54
|
+
|
|
55
|
+
async def create_sse_connection(self, task_id: str) -> asyncio.Queue:
|
|
56
|
+
"""
|
|
57
|
+
Creates a new queue for an SSE connection subscribing to a task.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
task_id: The ID of the task the connection is interested in.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
An asyncio.Queue that the SSE endpoint can consume from.
|
|
64
|
+
"""
|
|
65
|
+
connection_queue = asyncio.Queue(maxsize=self._max_queue_size)
|
|
66
|
+
buffered_events = None
|
|
67
|
+
|
|
68
|
+
# Use threading lock for cross-event-loop synchronization
|
|
69
|
+
with self._lock:
|
|
70
|
+
if task_id not in self._connections:
|
|
71
|
+
self._connections[task_id] = []
|
|
72
|
+
|
|
73
|
+
# Get buffered events atomically with adding the queue to connections
|
|
74
|
+
buffered_events = self._event_buffer.get_and_remove_buffer(task_id)
|
|
75
|
+
|
|
76
|
+
# Add queue to connections BEFORE releasing lock to ensure
|
|
77
|
+
# no events are buffered after we've retrieved the buffer
|
|
78
|
+
self._connections[task_id].append(connection_queue)
|
|
79
|
+
|
|
80
|
+
# Mark this task as having had at least one connection
|
|
81
|
+
# This is used to distinguish "no connection yet" from "had connection but disconnected"
|
|
82
|
+
self._tasks_with_prior_connection.add(task_id)
|
|
83
|
+
|
|
84
|
+
log.debug(
|
|
85
|
+
"%s Created SSE connection queue for Task ID: %s. Total queues for task: %d",
|
|
86
|
+
self.log_identifier,
|
|
87
|
+
task_id,
|
|
88
|
+
len(self._connections[task_id]),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Put buffered events into queue AFTER releasing the lock
|
|
92
|
+
# This is safe because the queue is already registered in _connections,
|
|
93
|
+
# so any new events will go directly to the queue via send_event
|
|
94
|
+
if buffered_events:
|
|
95
|
+
for event in buffered_events:
|
|
96
|
+
await connection_queue.put(event)
|
|
97
|
+
|
|
98
|
+
return connection_queue
|
|
99
|
+
|
|
100
|
+
async def remove_sse_connection(
|
|
101
|
+
self, task_id: str, connection_queue: asyncio.Queue
|
|
102
|
+
):
|
|
103
|
+
"""
|
|
104
|
+
Removes a specific SSE connection queue for a task.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
task_id: The ID of the task.
|
|
108
|
+
connection_queue: The specific queue instance to remove.
|
|
109
|
+
"""
|
|
110
|
+
with self._lock:
|
|
111
|
+
if task_id in self._connections:
|
|
112
|
+
try:
|
|
113
|
+
self._connections[task_id].remove(connection_queue)
|
|
114
|
+
log.debug(
|
|
115
|
+
"%s Removed SSE connection queue for Task ID: %s. Remaining queues: %d",
|
|
116
|
+
self.log_identifier,
|
|
117
|
+
task_id,
|
|
118
|
+
len(self._connections[task_id]),
|
|
119
|
+
)
|
|
120
|
+
if not self._connections[task_id]:
|
|
121
|
+
del self._connections[task_id]
|
|
122
|
+
log.debug(
|
|
123
|
+
"%s Removed Task ID entry: %s as no connections remain.",
|
|
124
|
+
self.log_identifier,
|
|
125
|
+
task_id,
|
|
126
|
+
)
|
|
127
|
+
except ValueError:
|
|
128
|
+
log.debug(
|
|
129
|
+
"%s Attempted to remove an already removed queue for Task ID: %s.",
|
|
130
|
+
self.log_identifier,
|
|
131
|
+
task_id,
|
|
132
|
+
)
|
|
133
|
+
else:
|
|
134
|
+
log.warning(
|
|
135
|
+
"%s Attempted to remove queue for non-existent Task ID: %s.",
|
|
136
|
+
self.log_identifier,
|
|
137
|
+
task_id,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def _is_background_task(self, task_id: str) -> bool:
|
|
141
|
+
"""
|
|
142
|
+
Check if a task is a background task by querying the database.
|
|
143
|
+
Uses caching to avoid repeated queries.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
task_id: The ID of the task to check
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
True if the task is a background task, False otherwise
|
|
150
|
+
"""
|
|
151
|
+
# Check cache first
|
|
152
|
+
if task_id in self._background_task_cache:
|
|
153
|
+
return self._background_task_cache[task_id]
|
|
154
|
+
|
|
155
|
+
# If no session factory, assume not a background task
|
|
156
|
+
if not self._session_factory:
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
try:
|
|
160
|
+
from .repository.task_repository import TaskRepository
|
|
161
|
+
|
|
162
|
+
db = self._session_factory()
|
|
163
|
+
try:
|
|
164
|
+
repo = TaskRepository()
|
|
165
|
+
task = repo.find_by_id(db, task_id)
|
|
166
|
+
is_background = task and task.background_execution_enabled
|
|
167
|
+
|
|
168
|
+
# Cache the result
|
|
169
|
+
self._background_task_cache[task_id] = is_background
|
|
170
|
+
|
|
171
|
+
return is_background
|
|
172
|
+
finally:
|
|
173
|
+
db.close()
|
|
174
|
+
except Exception as e:
|
|
175
|
+
log.warning(
|
|
176
|
+
"%s Failed to check if task %s is a background task: %s",
|
|
177
|
+
self.log_identifier,
|
|
178
|
+
task_id,
|
|
179
|
+
e,
|
|
180
|
+
)
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
async def send_event(
|
|
184
|
+
self, task_id: str, event_data: Dict[str, Any], event_type: str = "message"
|
|
185
|
+
):
|
|
186
|
+
"""
|
|
187
|
+
Sends an event (as a dictionary) to all active SSE connections for a specific task.
|
|
188
|
+
The event_data dictionary will be JSON serialized for the SSE 'data' field.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
task_id: The ID of the task the event belongs to.
|
|
192
|
+
event_data: The dictionary representing the A2A event (e.g., TaskStatusUpdateEvent).
|
|
193
|
+
event_type: The type of the SSE event (default: "message").
|
|
194
|
+
"""
|
|
195
|
+
# Serialize data outside the lock
|
|
196
|
+
try:
|
|
197
|
+
serialized_data = json.dumps(
|
|
198
|
+
self._sanitize_json(event_data), allow_nan=False
|
|
199
|
+
)
|
|
200
|
+
except Exception as json_err:
|
|
201
|
+
log.error(
|
|
202
|
+
"%s Failed to JSON serialize event data for Task ID %s: %s",
|
|
203
|
+
self.log_identifier,
|
|
204
|
+
task_id,
|
|
205
|
+
json_err,
|
|
206
|
+
)
|
|
207
|
+
return
|
|
208
|
+
|
|
209
|
+
sse_payload = {"event": event_type, "data": serialized_data}
|
|
210
|
+
|
|
211
|
+
# Get queues and decide action under the lock
|
|
212
|
+
queues_copy = None
|
|
213
|
+
|
|
214
|
+
with self._lock:
|
|
215
|
+
queues = self._connections.get(task_id)
|
|
216
|
+
|
|
217
|
+
if not queues:
|
|
218
|
+
# Check if this is a background task (outside lock would be better,
|
|
219
|
+
# but we need the decision to be atomic with the buffering)
|
|
220
|
+
is_background_task = self._is_background_task(task_id)
|
|
221
|
+
|
|
222
|
+
# Check if this task has ever had a connection
|
|
223
|
+
has_had_connection = task_id in self._tasks_with_prior_connection
|
|
224
|
+
|
|
225
|
+
# Only drop events for background tasks that have HAD a connection before
|
|
226
|
+
# If no connection has ever been made, we must buffer so the first client gets the events
|
|
227
|
+
if is_background_task and has_had_connection:
|
|
228
|
+
# For background tasks where client disconnected, drop events to prevent buffer overflow
|
|
229
|
+
log.debug(
|
|
230
|
+
"%s No active SSE connections for background task %s (had prior connection). Dropping event to prevent buffer overflow.",
|
|
231
|
+
self.log_identifier,
|
|
232
|
+
task_id,
|
|
233
|
+
)
|
|
234
|
+
else:
|
|
235
|
+
log.debug(
|
|
236
|
+
"%s No active SSE connections for Task ID: %s. Buffering event.",
|
|
237
|
+
self.log_identifier,
|
|
238
|
+
task_id,
|
|
239
|
+
)
|
|
240
|
+
self._event_buffer.buffer_event(task_id, sse_payload)
|
|
241
|
+
return
|
|
242
|
+
else:
|
|
243
|
+
# Make a copy of queues to iterate outside the lock
|
|
244
|
+
queues_copy = list(queues)
|
|
245
|
+
|
|
246
|
+
# Log the payload outside the lock
|
|
247
|
+
if trace_logger.isEnabledFor(logging.DEBUG):
|
|
248
|
+
trace_logger.debug(
|
|
249
|
+
"%s Prepared SSE payload for Task ID %s: %s",
|
|
250
|
+
self.log_identifier,
|
|
251
|
+
task_id,
|
|
252
|
+
sse_payload,
|
|
253
|
+
)
|
|
254
|
+
else:
|
|
255
|
+
log.debug(
|
|
256
|
+
"%s Prepared SSE payload for Task ID %s",
|
|
257
|
+
self.log_identifier,
|
|
258
|
+
task_id,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
# Send to queues outside the lock (async operations)
|
|
262
|
+
queues_to_remove = []
|
|
263
|
+
for connection_queue in queues_copy:
|
|
264
|
+
try:
|
|
265
|
+
await asyncio.wait_for(
|
|
266
|
+
connection_queue.put(sse_payload), timeout=0.1
|
|
267
|
+
)
|
|
268
|
+
log.debug(
|
|
269
|
+
"%s Queued event for Task ID: %s to one connection.",
|
|
270
|
+
self.log_identifier,
|
|
271
|
+
task_id,
|
|
272
|
+
)
|
|
273
|
+
except asyncio.QueueFull:
|
|
274
|
+
log.warning(
|
|
275
|
+
"%s SSE connection queue full for Task ID: %s. Event dropped for one connection.",
|
|
276
|
+
self.log_identifier,
|
|
277
|
+
task_id,
|
|
278
|
+
)
|
|
279
|
+
queues_to_remove.append(connection_queue)
|
|
280
|
+
except asyncio.TimeoutError:
|
|
281
|
+
log.warning(
|
|
282
|
+
"%s Timeout putting event onto SSE queue for Task ID: %s. Event dropped for one connection.",
|
|
283
|
+
self.log_identifier,
|
|
284
|
+
task_id,
|
|
285
|
+
)
|
|
286
|
+
queues_to_remove.append(connection_queue)
|
|
287
|
+
except Exception as e:
|
|
288
|
+
log.error(
|
|
289
|
+
"%s Error putting event onto queue for Task ID %s: %s",
|
|
290
|
+
self.log_identifier,
|
|
291
|
+
task_id,
|
|
292
|
+
e,
|
|
293
|
+
)
|
|
294
|
+
queues_to_remove.append(connection_queue)
|
|
295
|
+
|
|
296
|
+
# Remove broken queues under the lock
|
|
297
|
+
if queues_to_remove:
|
|
298
|
+
with self._lock:
|
|
299
|
+
if task_id in self._connections:
|
|
300
|
+
current_queues = self._connections[task_id]
|
|
301
|
+
for q in queues_to_remove:
|
|
302
|
+
try:
|
|
303
|
+
current_queues.remove(q)
|
|
304
|
+
log.warning(
|
|
305
|
+
"%s Removed potentially broken/full SSE queue for Task ID: %s",
|
|
306
|
+
self.log_identifier,
|
|
307
|
+
task_id,
|
|
308
|
+
)
|
|
309
|
+
except ValueError:
|
|
310
|
+
pass
|
|
311
|
+
|
|
312
|
+
if not current_queues:
|
|
313
|
+
del self._connections[task_id]
|
|
314
|
+
log.debug(
|
|
315
|
+
"%s Removed Task ID entry: %s after cleaning queues.",
|
|
316
|
+
self.log_identifier,
|
|
317
|
+
task_id,
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
async def close_connection(self, task_id: str, connection_queue: asyncio.Queue):
|
|
321
|
+
"""
|
|
322
|
+
Signals a specific SSE connection queue to close by putting None.
|
|
323
|
+
Also removes the queue from the manager.
|
|
324
|
+
"""
|
|
325
|
+
log.debug(
|
|
326
|
+
"%s Closing specific SSE connection queue for Task ID: %s",
|
|
327
|
+
self.log_identifier,
|
|
328
|
+
task_id,
|
|
329
|
+
)
|
|
330
|
+
try:
|
|
331
|
+
await asyncio.wait_for(connection_queue.put(None), timeout=0.1)
|
|
332
|
+
except asyncio.QueueFull:
|
|
333
|
+
log.warning(
|
|
334
|
+
"%s Could not put None (close signal) on full queue for Task ID: %s. Connection might not close cleanly.",
|
|
335
|
+
self.log_identifier,
|
|
336
|
+
task_id,
|
|
337
|
+
)
|
|
338
|
+
except asyncio.TimeoutError:
|
|
339
|
+
log.warning(
|
|
340
|
+
"%s Timeout putting None (close signal) on queue for Task ID: %s.",
|
|
341
|
+
self.log_identifier,
|
|
342
|
+
task_id,
|
|
343
|
+
)
|
|
344
|
+
except Exception as e:
|
|
345
|
+
log.error(
|
|
346
|
+
"%s Error putting None (close signal) on queue for Task ID %s: %s",
|
|
347
|
+
self.log_identifier,
|
|
348
|
+
task_id,
|
|
349
|
+
e,
|
|
350
|
+
)
|
|
351
|
+
finally:
|
|
352
|
+
await self.remove_sse_connection(task_id, connection_queue)
|
|
353
|
+
|
|
354
|
+
async def drain_buffer_for_background_task(self, task_id: str):
|
|
355
|
+
"""
|
|
356
|
+
Drains the event buffer for a background task when a client disconnects.
|
|
357
|
+
This prevents buffer overflow warnings when background tasks continue
|
|
358
|
+
generating events with no active consumers.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
task_id: The ID of the background task
|
|
362
|
+
"""
|
|
363
|
+
log.info(
|
|
364
|
+
"%s Draining event buffer for background task: %s",
|
|
365
|
+
self.log_identifier,
|
|
366
|
+
task_id,
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
# Remove any buffered events to prevent overflow
|
|
370
|
+
buffered_events = self._event_buffer.get_and_remove_buffer(task_id)
|
|
371
|
+
if buffered_events:
|
|
372
|
+
log.info(
|
|
373
|
+
"%s Drained %d buffered events for background task: %s",
|
|
374
|
+
self.log_identifier,
|
|
375
|
+
len(buffered_events),
|
|
376
|
+
task_id,
|
|
377
|
+
)
|
|
378
|
+
else:
|
|
379
|
+
log.debug(
|
|
380
|
+
"%s No buffered events to drain for background task: %s",
|
|
381
|
+
self.log_identifier,
|
|
382
|
+
task_id,
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
async def close_all_for_task(self, task_id: str):
|
|
386
|
+
"""
|
|
387
|
+
Closes all SSE connections associated with a specific task.
|
|
388
|
+
If a connection existed, it also cleans up the event buffer.
|
|
389
|
+
If no connection ever existed, the buffer is left for a late-connecting client.
|
|
390
|
+
"""
|
|
391
|
+
queues_to_close = None
|
|
392
|
+
should_remove_buffer = False
|
|
393
|
+
|
|
394
|
+
with self._lock:
|
|
395
|
+
if task_id in self._connections:
|
|
396
|
+
# This is the "normal" case: a client is or was connected.
|
|
397
|
+
# It's safe to clean up everything.
|
|
398
|
+
queues_to_close = self._connections.pop(task_id)
|
|
399
|
+
should_remove_buffer = True
|
|
400
|
+
log.debug(
|
|
401
|
+
"%s Closing %d SSE connections for Task ID: %s and cleaning up buffer.",
|
|
402
|
+
self.log_identifier,
|
|
403
|
+
len(queues_to_close),
|
|
404
|
+
task_id,
|
|
405
|
+
)
|
|
406
|
+
else:
|
|
407
|
+
# This is the "race condition" case: no client has connected yet.
|
|
408
|
+
# We MUST leave the buffer intact for the late-connecting client.
|
|
409
|
+
log.debug(
|
|
410
|
+
"%s No active connections found for Task ID: %s. Leaving event buffer intact.",
|
|
411
|
+
self.log_identifier,
|
|
412
|
+
task_id,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
# Close queues outside the lock (async operations)
|
|
416
|
+
if queues_to_close:
|
|
417
|
+
for q in queues_to_close:
|
|
418
|
+
try:
|
|
419
|
+
await asyncio.wait_for(q.put(None), timeout=0.1)
|
|
420
|
+
except asyncio.QueueFull:
|
|
421
|
+
log.warning(
|
|
422
|
+
"%s Could not put None (close signal) on full queue during close_all for Task ID: %s.",
|
|
423
|
+
self.log_identifier,
|
|
424
|
+
task_id,
|
|
425
|
+
)
|
|
426
|
+
except asyncio.TimeoutError:
|
|
427
|
+
log.warning(
|
|
428
|
+
"%s Timeout putting None (close signal) on queue during close_all for Task ID: %s.",
|
|
429
|
+
self.log_identifier,
|
|
430
|
+
task_id,
|
|
431
|
+
)
|
|
432
|
+
except Exception as e:
|
|
433
|
+
log.error(
|
|
434
|
+
"%s Error putting None (close signal) on queue during close_all for Task ID %s: %s",
|
|
435
|
+
self.log_identifier,
|
|
436
|
+
task_id,
|
|
437
|
+
e,
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
# Since a connection existed, the buffer is no longer needed.
|
|
441
|
+
# This is safe to do without lock since we already removed the task from _connections
|
|
442
|
+
if should_remove_buffer:
|
|
443
|
+
self._event_buffer.remove_buffer(task_id)
|
|
444
|
+
|
|
445
|
+
# Clean up the connection tracking
|
|
446
|
+
with self._lock:
|
|
447
|
+
self._tasks_with_prior_connection.discard(task_id)
|
|
448
|
+
|
|
449
|
+
log.debug(
|
|
450
|
+
"%s Removed Task ID entry: %s and signaled queues to close.",
|
|
451
|
+
self.log_identifier,
|
|
452
|
+
task_id,
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
def cleanup_old_locks(self):
|
|
456
|
+
"""Legacy method - no longer needed with single threading lock.
|
|
457
|
+
Kept for API compatibility but does nothing."""
|
|
458
|
+
pass
|
|
459
|
+
|
|
460
|
+
async def close_all(self):
|
|
461
|
+
"""Closes all active SSE connections managed by this instance."""
|
|
462
|
+
self.cleanup_old_locks()
|
|
463
|
+
|
|
464
|
+
# Collect all queues to close under the lock
|
|
465
|
+
all_queues_to_close = []
|
|
466
|
+
all_task_ids = []
|
|
467
|
+
|
|
468
|
+
with self._lock:
|
|
469
|
+
log.debug("%s Closing all active SSE connections...", self.log_identifier)
|
|
470
|
+
all_task_ids = list(self._connections.keys())
|
|
471
|
+
for task_id in all_task_ids:
|
|
472
|
+
if task_id in self._connections:
|
|
473
|
+
queues = self._connections.pop(task_id)
|
|
474
|
+
all_queues_to_close.extend(queues)
|
|
475
|
+
self._connections.clear()
|
|
476
|
+
self._tasks_with_prior_connection.clear()
|
|
477
|
+
|
|
478
|
+
# Close queues outside the lock (async operations)
|
|
479
|
+
closed_count = len(all_queues_to_close)
|
|
480
|
+
for q in all_queues_to_close:
|
|
481
|
+
try:
|
|
482
|
+
await asyncio.wait_for(q.put(None), timeout=0.1)
|
|
483
|
+
except Exception:
|
|
484
|
+
pass
|
|
485
|
+
|
|
486
|
+
log.debug(
|
|
487
|
+
"%s Closed %d connections for tasks: %s",
|
|
488
|
+
self.log_identifier,
|
|
489
|
+
closed_count,
|
|
490
|
+
all_task_ids,
|
|
491
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Utilities for the HTTP SSE Gateway."""
|