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,730 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base Component class for SAM implementations in the Solace AI Connector.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import abc
|
|
7
|
+
import asyncio
|
|
8
|
+
import concurrent.futures
|
|
9
|
+
import threading
|
|
10
|
+
import functools
|
|
11
|
+
import time
|
|
12
|
+
from typing import Any, Optional
|
|
13
|
+
|
|
14
|
+
from solace_ai_connector.components.component_base import ComponentBase
|
|
15
|
+
|
|
16
|
+
from ..exceptions import ComponentInitializationError, MessageSizeExceededError
|
|
17
|
+
from ..utils.message_utils import validate_message_size
|
|
18
|
+
|
|
19
|
+
log = logging.getLogger(__name__)
|
|
20
|
+
trace_logger = logging.getLogger("sam_trace")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SamComponentBase(ComponentBase, abc.ABC):
|
|
24
|
+
"""
|
|
25
|
+
Abstract base class for high-level SAM components (Agents, Gateways).
|
|
26
|
+
|
|
27
|
+
Provides a standardized framework for:
|
|
28
|
+
- Managing a dedicated asyncio event loop running in a separate thread.
|
|
29
|
+
- Publishing A2A messages with built-in size validation.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, info: dict[str, Any], **kwargs: Any):
|
|
33
|
+
super().__init__(info, **kwargs)
|
|
34
|
+
log.info("%s Initializing SamComponentBase...", self.log_identifier)
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
self.namespace: str = self.get_config("namespace")
|
|
38
|
+
if not self.namespace:
|
|
39
|
+
raise ValueError("Namespace must be configured in the app_config.")
|
|
40
|
+
|
|
41
|
+
# For agents, this is 'max_message_size_bytes'.
|
|
42
|
+
# For gateways, this is 'gateway_max_message_size_bytes'.
|
|
43
|
+
self.max_message_size_bytes: int = self.get_config(
|
|
44
|
+
"max_message_size_bytes"
|
|
45
|
+
) or self.get_config("gateway_max_message_size_bytes")
|
|
46
|
+
|
|
47
|
+
if not self.max_message_size_bytes:
|
|
48
|
+
raise ValueError(
|
|
49
|
+
"max_message_size_bytes (or gateway_max_message_size_bytes) must be configured."
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
except Exception as e:
|
|
53
|
+
log.error(
|
|
54
|
+
"%s Failed to retrieve essential configuration: %s",
|
|
55
|
+
self.log_identifier,
|
|
56
|
+
e,
|
|
57
|
+
)
|
|
58
|
+
raise ValueError(f"Configuration retrieval error: {e}") from e
|
|
59
|
+
|
|
60
|
+
self._async_loop: asyncio.AbstractEventLoop | None = None
|
|
61
|
+
self._async_thread: threading.Thread | None = None
|
|
62
|
+
|
|
63
|
+
# Timer callback registry
|
|
64
|
+
self._timer_callbacks: dict[str, Any] = {}
|
|
65
|
+
self._timer_callbacks_lock = threading.Lock()
|
|
66
|
+
|
|
67
|
+
# Trust Manager integration (enterprise feature) - initialized as part of _late_init
|
|
68
|
+
self.trust_manager: Optional[Any] = None
|
|
69
|
+
|
|
70
|
+
log.info("%s Initialized SamComponentBase", self.log_identifier)
|
|
71
|
+
|
|
72
|
+
def add_timer(
|
|
73
|
+
self,
|
|
74
|
+
delay_ms: int,
|
|
75
|
+
timer_id: str,
|
|
76
|
+
interval_ms: int = 0,
|
|
77
|
+
callback: Optional[Any] = None,
|
|
78
|
+
):
|
|
79
|
+
"""
|
|
80
|
+
Add a timer with optional callback.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
delay_ms: Initial delay in milliseconds
|
|
84
|
+
timer_id: Unique timer identifier
|
|
85
|
+
interval_ms: Repeat interval in milliseconds (0 for one-shot)
|
|
86
|
+
callback: Optional callback function to invoke when timer fires.
|
|
87
|
+
If provided, callback will be invoked when timer event occurs.
|
|
88
|
+
Callback receives timer_data dict as argument.
|
|
89
|
+
Callback should be thread-safe or schedule work appropriately.
|
|
90
|
+
"""
|
|
91
|
+
# Register callback if provided
|
|
92
|
+
if callback:
|
|
93
|
+
with self._timer_callbacks_lock:
|
|
94
|
+
if timer_id in self._timer_callbacks:
|
|
95
|
+
log.warning(
|
|
96
|
+
"%s Timer ID '%s' already has a registered callback. Overwriting.",
|
|
97
|
+
self.log_identifier,
|
|
98
|
+
timer_id,
|
|
99
|
+
)
|
|
100
|
+
self._timer_callbacks[timer_id] = callback
|
|
101
|
+
log.debug(
|
|
102
|
+
"%s Registered callback for timer: %s",
|
|
103
|
+
self.log_identifier,
|
|
104
|
+
timer_id,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Call parent implementation to actually create the timer
|
|
108
|
+
super().add_timer(delay_ms=delay_ms, timer_id=timer_id, interval_ms=interval_ms)
|
|
109
|
+
|
|
110
|
+
def cancel_timer(self, timer_id: str):
|
|
111
|
+
"""
|
|
112
|
+
Cancel a timer and remove its callback if registered.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
timer_id: Timer identifier to cancel
|
|
116
|
+
"""
|
|
117
|
+
# Remove callback registration
|
|
118
|
+
with self._timer_callbacks_lock:
|
|
119
|
+
if timer_id in self._timer_callbacks:
|
|
120
|
+
del self._timer_callbacks[timer_id]
|
|
121
|
+
log.debug(
|
|
122
|
+
"%s Unregistered callback for timer: %s",
|
|
123
|
+
self.log_identifier,
|
|
124
|
+
timer_id,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# Call parent implementation to actually cancel the timer
|
|
128
|
+
super().cancel_timer(timer_id)
|
|
129
|
+
|
|
130
|
+
def process_event(self, event):
|
|
131
|
+
"""
|
|
132
|
+
Process incoming events by routing to appropriate handlers.
|
|
133
|
+
|
|
134
|
+
This base implementation handles MESSAGE and TIMER events:
|
|
135
|
+
- MESSAGE events are routed to _handle_message() abstract method
|
|
136
|
+
- TIMER events are routed to registered callbacks
|
|
137
|
+
- Other events are passed to parent class
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
event: Event object from SAC framework
|
|
141
|
+
"""
|
|
142
|
+
from solace_ai_connector.common.event import Event, EventType
|
|
143
|
+
from solace_ai_connector.common.message import Message as SolaceMessage
|
|
144
|
+
|
|
145
|
+
if event.event_type == EventType.MESSAGE:
|
|
146
|
+
message: SolaceMessage = event.data
|
|
147
|
+
topic = message.get_topic()
|
|
148
|
+
|
|
149
|
+
if not topic:
|
|
150
|
+
log.warning(
|
|
151
|
+
"%s Received message without topic. Ignoring.",
|
|
152
|
+
self.log_identifier,
|
|
153
|
+
)
|
|
154
|
+
try:
|
|
155
|
+
message.call_negative_acknowledgements()
|
|
156
|
+
except Exception as nack_e:
|
|
157
|
+
log.error(
|
|
158
|
+
"%s Failed to NACK message without topic: %s",
|
|
159
|
+
self.log_identifier,
|
|
160
|
+
nack_e,
|
|
161
|
+
)
|
|
162
|
+
return
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
# Delegate to abstract method implemented by subclass
|
|
166
|
+
self._handle_message(message, topic)
|
|
167
|
+
except Exception as e:
|
|
168
|
+
log.error(
|
|
169
|
+
"%s Error in _handle_message for topic %s: %s",
|
|
170
|
+
self.log_identifier,
|
|
171
|
+
topic,
|
|
172
|
+
e,
|
|
173
|
+
exc_info=True,
|
|
174
|
+
)
|
|
175
|
+
try:
|
|
176
|
+
message.call_negative_acknowledgements()
|
|
177
|
+
except Exception as nack_e:
|
|
178
|
+
log.error(
|
|
179
|
+
"%s Failed to NACK message after error: %s",
|
|
180
|
+
self.log_identifier,
|
|
181
|
+
nack_e,
|
|
182
|
+
)
|
|
183
|
+
self.handle_error(e, event)
|
|
184
|
+
|
|
185
|
+
elif event.event_type == EventType.TIMER:
|
|
186
|
+
# Handle timer events via callback registry
|
|
187
|
+
timer_data = event.data
|
|
188
|
+
timer_id = timer_data.get("timer_id")
|
|
189
|
+
|
|
190
|
+
if not timer_id:
|
|
191
|
+
log.warning(
|
|
192
|
+
"%s Timer event missing timer_id: %s",
|
|
193
|
+
self.log_identifier,
|
|
194
|
+
timer_data,
|
|
195
|
+
)
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
# Look up registered callback
|
|
199
|
+
with self._timer_callbacks_lock:
|
|
200
|
+
callback = self._timer_callbacks.get(timer_id)
|
|
201
|
+
|
|
202
|
+
if callback:
|
|
203
|
+
try:
|
|
204
|
+
log.debug(
|
|
205
|
+
"%s Invoking registered callback for timer: %s",
|
|
206
|
+
self.log_identifier,
|
|
207
|
+
timer_id,
|
|
208
|
+
)
|
|
209
|
+
callback(timer_data)
|
|
210
|
+
except Exception as e:
|
|
211
|
+
log.error(
|
|
212
|
+
"%s Error in timer callback for %s: %s",
|
|
213
|
+
self.log_identifier,
|
|
214
|
+
timer_id,
|
|
215
|
+
e,
|
|
216
|
+
exc_info=True,
|
|
217
|
+
)
|
|
218
|
+
else:
|
|
219
|
+
log.warning(
|
|
220
|
+
"%s No callback registered for timer: %s. Timer event ignored.",
|
|
221
|
+
self.log_identifier,
|
|
222
|
+
timer_id,
|
|
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)
|
|
268
|
+
else:
|
|
269
|
+
# Pass other event types to parent class
|
|
270
|
+
super().process_event(event)
|
|
271
|
+
|
|
272
|
+
def _handle_message(self, message, topic: str) -> None:
|
|
273
|
+
"""
|
|
274
|
+
Handle an incoming message by routing to async handler.
|
|
275
|
+
|
|
276
|
+
This base implementation schedules async processing on the component's
|
|
277
|
+
event loop. Subclasses can override this for custom sync handling,
|
|
278
|
+
or implement _handle_message_async() for async handling.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
message: The Solace message (SolaceMessage instance)
|
|
282
|
+
topic: The topic the message was received on
|
|
283
|
+
"""
|
|
284
|
+
loop = self.get_async_loop()
|
|
285
|
+
if loop and loop.is_running():
|
|
286
|
+
# Schedule async processing
|
|
287
|
+
coro = self._handle_message_async(message, topic)
|
|
288
|
+
future = asyncio.run_coroutine_threadsafe(coro, loop)
|
|
289
|
+
future.add_done_callback(
|
|
290
|
+
functools.partial(self._handle_async_message_completion, topic=topic)
|
|
291
|
+
)
|
|
292
|
+
else:
|
|
293
|
+
log.error(
|
|
294
|
+
"%s Async loop not available. Cannot process message on topic: %s",
|
|
295
|
+
self.log_identifier,
|
|
296
|
+
topic,
|
|
297
|
+
)
|
|
298
|
+
raise RuntimeError("Async loop not available for message processing")
|
|
299
|
+
|
|
300
|
+
def _handle_async_message_completion(self, future: asyncio.Future, topic: str):
|
|
301
|
+
"""Callback to handle completion of async message processing."""
|
|
302
|
+
try:
|
|
303
|
+
if future.cancelled():
|
|
304
|
+
log.warning(
|
|
305
|
+
"%s Message processing for topic %s was cancelled.",
|
|
306
|
+
self.log_identifier,
|
|
307
|
+
topic,
|
|
308
|
+
)
|
|
309
|
+
elif future.done():
|
|
310
|
+
exception = future.exception()
|
|
311
|
+
if exception is not None:
|
|
312
|
+
log.error(
|
|
313
|
+
"%s Message processing for topic %s failed: %s",
|
|
314
|
+
self.log_identifier,
|
|
315
|
+
topic,
|
|
316
|
+
exception,
|
|
317
|
+
exc_info=exception,
|
|
318
|
+
)
|
|
319
|
+
else:
|
|
320
|
+
# Handle successful completion
|
|
321
|
+
try:
|
|
322
|
+
_ = future.result()
|
|
323
|
+
log.debug(
|
|
324
|
+
"%s Message processing for topic %s completed successfully.",
|
|
325
|
+
self.log_identifier,
|
|
326
|
+
topic,
|
|
327
|
+
)
|
|
328
|
+
# Optional: Process the result if needed
|
|
329
|
+
# self._process_successful_result(result, topic)
|
|
330
|
+
except Exception as result_exception:
|
|
331
|
+
# This catches exceptions that might occur when getting the result
|
|
332
|
+
log.error(
|
|
333
|
+
"%s Error retrieving result for topic %s: %s",
|
|
334
|
+
self.log_identifier,
|
|
335
|
+
topic,
|
|
336
|
+
result_exception,
|
|
337
|
+
exc_info=result_exception,
|
|
338
|
+
)
|
|
339
|
+
else:
|
|
340
|
+
# This case shouldn't normally occur in a completion callback,
|
|
341
|
+
# but it's good defensive programming
|
|
342
|
+
log.warning(
|
|
343
|
+
"%s Future for topic %s is not done in completion handler.",
|
|
344
|
+
self.log_identifier,
|
|
345
|
+
topic,
|
|
346
|
+
)
|
|
347
|
+
except Exception as e:
|
|
348
|
+
log.error(
|
|
349
|
+
"%s Error in async message completion handler for topic %s: %s",
|
|
350
|
+
self.log_identifier,
|
|
351
|
+
topic,
|
|
352
|
+
e,
|
|
353
|
+
exc_info=True,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
@abc.abstractmethod
|
|
357
|
+
async def _handle_message_async(self, message, topic: str) -> None:
|
|
358
|
+
"""
|
|
359
|
+
Async handler for incoming messages.
|
|
360
|
+
|
|
361
|
+
Subclasses must implement this to process messages asynchronously.
|
|
362
|
+
This runs on the component's dedicated async event loop.
|
|
363
|
+
|
|
364
|
+
Args:
|
|
365
|
+
message: The Solace message (SolaceMessage instance)
|
|
366
|
+
topic: The topic the message was received on
|
|
367
|
+
"""
|
|
368
|
+
pass
|
|
369
|
+
|
|
370
|
+
def _late_init(self):
|
|
371
|
+
"""Late initialization hook called after the component is fully set up."""
|
|
372
|
+
|
|
373
|
+
# Setup the Trust Manager if present (enterprise feature)
|
|
374
|
+
# NOTE: The Trust Manager should use component.get_broker_username() to retrieve
|
|
375
|
+
# the actual broker client-username for trust card topic construction. This is
|
|
376
|
+
# critical because trust cards MUST be published on topics that match the actual
|
|
377
|
+
# authentication identity (client-username) used to connect to the broker.
|
|
378
|
+
try:
|
|
379
|
+
from solace_agent_mesh_enterprise.common.trust import (
|
|
380
|
+
initialize_trust_manager,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
trust_config = self.get_config("trust_manager")
|
|
384
|
+
if trust_config and trust_config.get("enabled", False):
|
|
385
|
+
self.trust_manager = initialize_trust_manager(self)
|
|
386
|
+
log.info("%s Enterprise Trust Manager initialized", self.log_identifier)
|
|
387
|
+
except ImportError:
|
|
388
|
+
log.debug("%s Enterprise Trust Manager not available", self.log_identifier)
|
|
389
|
+
except Exception as e:
|
|
390
|
+
log.error(
|
|
391
|
+
"%s Failed to initialize Trust Manager: %s", self.log_identifier, e
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
def publish_a2a_message(
|
|
395
|
+
self, payload: dict, topic: str, user_properties: dict | None = None
|
|
396
|
+
):
|
|
397
|
+
"""Helper to publish A2A messages via the SAC App with size validation."""
|
|
398
|
+
try:
|
|
399
|
+
log.debug(
|
|
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"
|
|
404
|
+
)
|
|
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
|
+
|
|
412
|
+
# Validate message size
|
|
413
|
+
is_valid, actual_size = validate_message_size(
|
|
414
|
+
payload, self.max_message_size_bytes, self.log_identifier
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
if not is_valid:
|
|
418
|
+
error_msg = (
|
|
419
|
+
f"Message size validation failed: payload size ({actual_size} bytes) "
|
|
420
|
+
f"exceeds maximum allowed size ({self.max_message_size_bytes} bytes)"
|
|
421
|
+
)
|
|
422
|
+
log.error("%s [publish_a2a_message] %s", self.log_identifier, error_msg)
|
|
423
|
+
raise MessageSizeExceededError(
|
|
424
|
+
actual_size, self.max_message_size_bytes, error_msg
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
# Debug logging to show message size when publishing
|
|
428
|
+
log.debug(
|
|
429
|
+
"%s [publish_a2a_message] Publishing message to topic %s (size: %d bytes)",
|
|
430
|
+
self.log_identifier,
|
|
431
|
+
topic,
|
|
432
|
+
actual_size,
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
app = self.get_app()
|
|
436
|
+
if app:
|
|
437
|
+
log.debug(
|
|
438
|
+
"%s [publish_a2a_message] Got app instance, about to call app.send_message",
|
|
439
|
+
self.log_identifier
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Conditionally log to invocation monitor if it exists (i.e., on an agent)
|
|
443
|
+
if hasattr(self, "invocation_monitor") and self.invocation_monitor:
|
|
444
|
+
self.invocation_monitor.log_message_event(
|
|
445
|
+
direction="PUBLISHED",
|
|
446
|
+
topic=topic,
|
|
447
|
+
payload=payload,
|
|
448
|
+
component_identifier=self.log_identifier,
|
|
449
|
+
)
|
|
450
|
+
|
|
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
|
+
)
|
|
461
|
+
|
|
462
|
+
app.send_message(
|
|
463
|
+
payload=payload, topic=topic, user_properties=user_properties
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
log.debug(
|
|
467
|
+
"%s [publish_a2a_message] Successfully called app.send_message on topic '%s'",
|
|
468
|
+
self.log_identifier, topic
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
log.error(
|
|
472
|
+
"%s Cannot publish message: Not running within a SAC App context.",
|
|
473
|
+
self.log_identifier,
|
|
474
|
+
)
|
|
475
|
+
except MessageSizeExceededError:
|
|
476
|
+
# Re-raise MessageSizeExceededError without wrapping
|
|
477
|
+
raise
|
|
478
|
+
except Exception as e:
|
|
479
|
+
log.exception(
|
|
480
|
+
"%s Failed to publish A2A message to topic %s: %s",
|
|
481
|
+
self.log_identifier,
|
|
482
|
+
topic,
|
|
483
|
+
e,
|
|
484
|
+
)
|
|
485
|
+
raise
|
|
486
|
+
|
|
487
|
+
def _run_async_operations(self):
|
|
488
|
+
"""Target for the dedicated async thread. Sets up and runs the event loop."""
|
|
489
|
+
log.info(
|
|
490
|
+
"%s Initializing asyncio event loop in dedicated thread...",
|
|
491
|
+
self.log_identifier,
|
|
492
|
+
)
|
|
493
|
+
self._async_loop = asyncio.new_event_loop()
|
|
494
|
+
asyncio.set_event_loop(self._async_loop)
|
|
495
|
+
|
|
496
|
+
main_task = None
|
|
497
|
+
try:
|
|
498
|
+
log.info(
|
|
499
|
+
"%s Starting _async_setup_and_run as an asyncio task. Will run event loop forever (or until stop_signal).",
|
|
500
|
+
self.log_identifier,
|
|
501
|
+
)
|
|
502
|
+
main_task = self._async_loop.create_task(self._async_setup_and_run())
|
|
503
|
+
|
|
504
|
+
self._async_loop.run_forever()
|
|
505
|
+
|
|
506
|
+
except Exception as e:
|
|
507
|
+
log.exception(
|
|
508
|
+
"%s Unhandled exception in _run_async_operations: %s",
|
|
509
|
+
self.log_identifier,
|
|
510
|
+
e,
|
|
511
|
+
)
|
|
512
|
+
self.stop_signal.set()
|
|
513
|
+
finally:
|
|
514
|
+
if main_task and not main_task.done():
|
|
515
|
+
log.info(
|
|
516
|
+
"%s Cancelling main async task (_async_setup_and_run).",
|
|
517
|
+
self.log_identifier,
|
|
518
|
+
)
|
|
519
|
+
main_task.cancel()
|
|
520
|
+
try:
|
|
521
|
+
# Use gather to await the cancellation
|
|
522
|
+
self._async_loop.run_until_complete(
|
|
523
|
+
asyncio.gather(main_task, return_exceptions=True)
|
|
524
|
+
)
|
|
525
|
+
except RuntimeError as loop_err:
|
|
526
|
+
log.warning(
|
|
527
|
+
"%s Error awaiting main task during cleanup (loop closed?): %s",
|
|
528
|
+
self.log_identifier,
|
|
529
|
+
loop_err,
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
if self._async_loop.is_running():
|
|
533
|
+
log.info(
|
|
534
|
+
"%s Stopping asyncio event loop from _run_async_operations finally block.",
|
|
535
|
+
self.log_identifier,
|
|
536
|
+
)
|
|
537
|
+
self._async_loop.stop()
|
|
538
|
+
log.info(
|
|
539
|
+
"%s Async operations loop finished in dedicated thread.",
|
|
540
|
+
self.log_identifier,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
def run(self):
|
|
544
|
+
"""Starts the component's dedicated async thread."""
|
|
545
|
+
log.info("%s Starting SamComponentBase run method.", self.log_identifier)
|
|
546
|
+
|
|
547
|
+
# Do all initialization that needs to be done after we are fully setup
|
|
548
|
+
self._late_init()
|
|
549
|
+
|
|
550
|
+
if not self._async_thread or not self._async_thread.is_alive():
|
|
551
|
+
self._async_thread = threading.Thread(
|
|
552
|
+
target=self._run_async_operations,
|
|
553
|
+
name=f"{self.name}_AsyncOpsThread",
|
|
554
|
+
daemon=True,
|
|
555
|
+
)
|
|
556
|
+
self._async_thread.start()
|
|
557
|
+
log.info("%s Async operations thread started.", self.log_identifier)
|
|
558
|
+
else:
|
|
559
|
+
log.warning(
|
|
560
|
+
"%s Async operations thread already running.", self.log_identifier
|
|
561
|
+
)
|
|
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
|
+
|
|
583
|
+
super().run()
|
|
584
|
+
log.info("%s SamComponentBase run method finished.", self.log_identifier)
|
|
585
|
+
|
|
586
|
+
def cleanup(self):
|
|
587
|
+
"""Cleans up the component's resources, including the async thread and loop."""
|
|
588
|
+
log.info("%s Starting cleanup for SamComponentBase...", self.log_identifier)
|
|
589
|
+
|
|
590
|
+
try:
|
|
591
|
+
self._pre_async_cleanup()
|
|
592
|
+
except Exception as e:
|
|
593
|
+
log.exception(
|
|
594
|
+
"%s Error during _pre_async_cleanup(): %s", self.log_identifier, e
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
if self._async_loop and self._async_loop.is_running():
|
|
598
|
+
log.info("%s Requesting asyncio loop to stop...", self.log_identifier)
|
|
599
|
+
self._async_loop.call_soon_threadsafe(self._async_loop.stop)
|
|
600
|
+
|
|
601
|
+
if self._async_thread and self._async_thread.is_alive():
|
|
602
|
+
log.info(
|
|
603
|
+
"%s Joining async operations thread (timeout 10s)...",
|
|
604
|
+
self.log_identifier,
|
|
605
|
+
)
|
|
606
|
+
self._async_thread.join(timeout=10)
|
|
607
|
+
if self._async_thread.is_alive():
|
|
608
|
+
log.warning(
|
|
609
|
+
"%s Async operations thread did not join cleanly.",
|
|
610
|
+
self.log_identifier,
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
if self._async_loop and not self._async_loop.is_closed():
|
|
614
|
+
log.info(
|
|
615
|
+
"%s Closing asyncio event loop (if not already closed by its thread).",
|
|
616
|
+
self.log_identifier,
|
|
617
|
+
)
|
|
618
|
+
# The loop should have been stopped by its own thread's finally block.
|
|
619
|
+
# We just need to close it from this thread.
|
|
620
|
+
self._async_loop.call_soon_threadsafe(self._async_loop.close)
|
|
621
|
+
|
|
622
|
+
super().cleanup()
|
|
623
|
+
log.info("%s SamComponentBase cleanup finished.", self.log_identifier)
|
|
624
|
+
|
|
625
|
+
def get_async_loop(self) -> asyncio.AbstractEventLoop | None:
|
|
626
|
+
"""Returns the dedicated asyncio event loop for this component's async tasks."""
|
|
627
|
+
return self._async_loop
|
|
628
|
+
|
|
629
|
+
def get_broker_username(self) -> Optional[str]:
|
|
630
|
+
"""
|
|
631
|
+
Returns the broker username (client-username) that this component uses
|
|
632
|
+
to authenticate with the Solace broker.
|
|
633
|
+
|
|
634
|
+
This is critical for trust card publishing and verification, as the
|
|
635
|
+
trust card topic must match the actual authentication identity.
|
|
636
|
+
|
|
637
|
+
Returns:
|
|
638
|
+
The broker username if available, None otherwise.
|
|
639
|
+
"""
|
|
640
|
+
try:
|
|
641
|
+
app = self.get_app()
|
|
642
|
+
if app and hasattr(app, "app_info"):
|
|
643
|
+
broker_config = app.app_info.get("broker", {})
|
|
644
|
+
broker_username = broker_config.get("broker_username")
|
|
645
|
+
if broker_username:
|
|
646
|
+
log.debug(
|
|
647
|
+
"%s Retrieved broker username: %s",
|
|
648
|
+
self.log_identifier,
|
|
649
|
+
broker_username,
|
|
650
|
+
)
|
|
651
|
+
return broker_username
|
|
652
|
+
else:
|
|
653
|
+
log.warning(
|
|
654
|
+
"%s Broker username not found in broker configuration",
|
|
655
|
+
self.log_identifier,
|
|
656
|
+
)
|
|
657
|
+
else:
|
|
658
|
+
log.warning(
|
|
659
|
+
"%s Unable to access app or app_info to retrieve broker username",
|
|
660
|
+
self.log_identifier,
|
|
661
|
+
)
|
|
662
|
+
except Exception as e:
|
|
663
|
+
log.error(
|
|
664
|
+
"%s Error retrieving broker username: %s",
|
|
665
|
+
self.log_identifier,
|
|
666
|
+
e,
|
|
667
|
+
exc_info=True,
|
|
668
|
+
)
|
|
669
|
+
return None
|
|
670
|
+
|
|
671
|
+
@abc.abstractmethod
|
|
672
|
+
def _get_component_id(self) -> str:
|
|
673
|
+
"""
|
|
674
|
+
Returns unique identifier for this component instance.
|
|
675
|
+
Must be implemented by subclasses.
|
|
676
|
+
|
|
677
|
+
Returns:
|
|
678
|
+
Unique component identifier (e.g., agent_name, gateway_id)
|
|
679
|
+
"""
|
|
680
|
+
pass
|
|
681
|
+
|
|
682
|
+
@abc.abstractmethod
|
|
683
|
+
def _get_component_type(self) -> str:
|
|
684
|
+
"""
|
|
685
|
+
Returns component type string.
|
|
686
|
+
Must be implemented by subclasses.
|
|
687
|
+
|
|
688
|
+
Returns:
|
|
689
|
+
Component type ("gateway", "agent", etc.)
|
|
690
|
+
"""
|
|
691
|
+
pass
|
|
692
|
+
|
|
693
|
+
async def _async_setup_and_run(self) -> None:
|
|
694
|
+
"""
|
|
695
|
+
Base async setup that initializes Trust Manager if present.
|
|
696
|
+
Subclasses should override and call super() first, then add their logic.
|
|
697
|
+
"""
|
|
698
|
+
# Initialize Trust Manager if present (ENTERPRISE FEATURE)
|
|
699
|
+
if self.trust_manager:
|
|
700
|
+
try:
|
|
701
|
+
log.info(
|
|
702
|
+
"%s Initializing Trust Manager with periodic publishing...",
|
|
703
|
+
self.log_identifier,
|
|
704
|
+
)
|
|
705
|
+
# Pass event loop and add_timer method to Trust Manager
|
|
706
|
+
await self.trust_manager.initialize(
|
|
707
|
+
add_timer_callback=self.add_timer,
|
|
708
|
+
event_loop=self.get_async_loop(),
|
|
709
|
+
)
|
|
710
|
+
log.info(
|
|
711
|
+
"%s Initialized Trust Manager", self.log_identifier
|
|
712
|
+
)
|
|
713
|
+
except Exception as e:
|
|
714
|
+
log.error(
|
|
715
|
+
"%s Failed to initialize Trust Manager: %s",
|
|
716
|
+
self.log_identifier,
|
|
717
|
+
e,
|
|
718
|
+
exc_info=True,
|
|
719
|
+
)
|
|
720
|
+
# Trust Manager failure should not prevent component startup
|
|
721
|
+
# Set to None to disable trust manager for this session
|
|
722
|
+
self.trust_manager = None
|
|
723
|
+
|
|
724
|
+
@abc.abstractmethod
|
|
725
|
+
def _pre_async_cleanup(self) -> None:
|
|
726
|
+
"""
|
|
727
|
+
Abstract method for subclasses to perform cleanup actions
|
|
728
|
+
before the async loop is stopped.
|
|
729
|
+
"""
|
|
730
|
+
pass
|