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,789 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
import sqlalchemy as sa
|
|
7
|
+
from fastapi import FastAPI, HTTPException
|
|
8
|
+
from fastapi import Request as FastAPIRequest
|
|
9
|
+
from fastapi import status
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
import sqlalchemy as sa
|
|
13
|
+
from a2a.types import InternalError, JSONRPCError
|
|
14
|
+
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
15
|
+
from alembic import command
|
|
16
|
+
from alembic.config import Config
|
|
17
|
+
from fastapi import FastAPI, HTTPException
|
|
18
|
+
from fastapi import Request as FastAPIRequest
|
|
19
|
+
from fastapi import status
|
|
20
|
+
from fastapi.exceptions import RequestValidationError
|
|
21
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
22
|
+
from fastapi.responses import JSONResponse
|
|
23
|
+
from starlette.middleware.sessions import SessionMiddleware
|
|
24
|
+
from starlette.staticfiles import StaticFiles
|
|
25
|
+
|
|
26
|
+
from .routers.sessions import router as session_router
|
|
27
|
+
from .routers.tasks import router as task_router
|
|
28
|
+
from .routers.users import router as user_router
|
|
29
|
+
from ...common import a2a
|
|
30
|
+
from ...gateway.http_sse import dependencies
|
|
31
|
+
from .routers import (
|
|
32
|
+
agent_cards,
|
|
33
|
+
artifacts,
|
|
34
|
+
auth,
|
|
35
|
+
config,
|
|
36
|
+
feedback,
|
|
37
|
+
people,
|
|
38
|
+
sse,
|
|
39
|
+
speech,
|
|
40
|
+
version,
|
|
41
|
+
visualization,
|
|
42
|
+
projects,
|
|
43
|
+
prompts,
|
|
44
|
+
)
|
|
45
|
+
from .routers.sessions import router as session_router
|
|
46
|
+
from .routers.tasks import router as task_router
|
|
47
|
+
from .routers.users import router as user_router
|
|
48
|
+
|
|
49
|
+
from alembic import command
|
|
50
|
+
from alembic.config import Config
|
|
51
|
+
|
|
52
|
+
from a2a.types import InternalError, InvalidRequestError, JSONRPCError
|
|
53
|
+
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
54
|
+
from ...common import a2a
|
|
55
|
+
from ...gateway.http_sse import dependencies
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if TYPE_CHECKING:
|
|
59
|
+
from gateway.http_sse.component import WebUIBackendComponent
|
|
60
|
+
|
|
61
|
+
log = logging.getLogger(__name__)
|
|
62
|
+
|
|
63
|
+
app = FastAPI(
|
|
64
|
+
title="A2A Web UI Backend",
|
|
65
|
+
version="1.0.0", # Updated to reflect simplified architecture
|
|
66
|
+
description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Global flag to track if dependencies have been initialized
|
|
70
|
+
_dependencies_initialized = False
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _extract_access_token(request: FastAPIRequest) -> str:
|
|
74
|
+
auth_header = request.headers.get("Authorization")
|
|
75
|
+
if auth_header and auth_header.startswith("Bearer "):
|
|
76
|
+
return auth_header[7:]
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
if "access_token" in request.session:
|
|
80
|
+
log.debug("AuthMiddleware: Found token in session.")
|
|
81
|
+
return request.session["access_token"]
|
|
82
|
+
except AssertionError:
|
|
83
|
+
log.debug("AuthMiddleware: Could not access request.session.")
|
|
84
|
+
|
|
85
|
+
if "token" in request.query_params:
|
|
86
|
+
return request.query_params["token"]
|
|
87
|
+
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def _validate_token(
|
|
92
|
+
auth_service_url: str, auth_provider: str, access_token: str
|
|
93
|
+
) -> bool:
|
|
94
|
+
async with httpx.AsyncClient() as client:
|
|
95
|
+
validation_response = await client.post(
|
|
96
|
+
f"{auth_service_url}/is_token_valid",
|
|
97
|
+
json={"provider": auth_provider},
|
|
98
|
+
headers={"Authorization": f"Bearer {access_token}"},
|
|
99
|
+
)
|
|
100
|
+
return validation_response.status_code == 200
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
async def _get_user_info(
|
|
104
|
+
auth_service_url: str, auth_provider: str, access_token: str
|
|
105
|
+
) -> dict:
|
|
106
|
+
async with httpx.AsyncClient() as client:
|
|
107
|
+
userinfo_response = await client.get(
|
|
108
|
+
f"{auth_service_url}/user_info?provider={auth_provider}",
|
|
109
|
+
headers={"Authorization": f"Bearer {access_token}"},
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
if userinfo_response.status_code != 200:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
return userinfo_response.json()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _extract_user_identifier(user_info: dict) -> str:
|
|
119
|
+
user_identifier = (
|
|
120
|
+
user_info.get("sub")
|
|
121
|
+
or user_info.get("client_id")
|
|
122
|
+
or user_info.get("username")
|
|
123
|
+
or user_info.get("oid")
|
|
124
|
+
or user_info.get("preferred_username")
|
|
125
|
+
or user_info.get("upn")
|
|
126
|
+
or user_info.get("unique_name")
|
|
127
|
+
or user_info.get("email")
|
|
128
|
+
or user_info.get("name")
|
|
129
|
+
or user_info.get("azp")
|
|
130
|
+
or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
if user_identifier and user_identifier.lower() == "unknown":
|
|
134
|
+
log.warning(
|
|
135
|
+
"AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
|
|
136
|
+
)
|
|
137
|
+
return "sam_dev_user"
|
|
138
|
+
|
|
139
|
+
return user_identifier
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
|
|
143
|
+
email_from_auth = (
|
|
144
|
+
user_info.get("email")
|
|
145
|
+
or user_info.get("preferred_username")
|
|
146
|
+
or user_info.get("upn")
|
|
147
|
+
or user_identifier
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
display_name = (
|
|
151
|
+
user_info.get("name")
|
|
152
|
+
or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
|
|
153
|
+
or user_info.get("preferred_username")
|
|
154
|
+
or user_identifier
|
|
155
|
+
).strip()
|
|
156
|
+
|
|
157
|
+
return email_from_auth, display_name
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
async def _create_user_state_without_identity_service(
|
|
161
|
+
user_identifier: str, email_from_auth: str, display_name: str
|
|
162
|
+
) -> dict:
|
|
163
|
+
final_user_id = user_identifier or email_from_auth or "sam_dev_user"
|
|
164
|
+
if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
|
|
165
|
+
final_user_id = "sam_dev_user"
|
|
166
|
+
log.warning(
|
|
167
|
+
"AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
|
|
168
|
+
user_identifier,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
log.debug(
|
|
172
|
+
"AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
|
|
173
|
+
final_user_id,
|
|
174
|
+
)
|
|
175
|
+
return {
|
|
176
|
+
"id": final_user_id,
|
|
177
|
+
"email": email_from_auth or final_user_id,
|
|
178
|
+
"name": display_name or final_user_id,
|
|
179
|
+
"authenticated": True,
|
|
180
|
+
"auth_method": "oidc",
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
async def _create_user_state_with_identity_service(
|
|
185
|
+
identity_service,
|
|
186
|
+
user_identifier: str,
|
|
187
|
+
email_from_auth: str,
|
|
188
|
+
display_name: str,
|
|
189
|
+
user_info: dict,
|
|
190
|
+
) -> dict:
|
|
191
|
+
lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
|
|
192
|
+
user_profile = await identity_service.get_user_profile(
|
|
193
|
+
{identity_service.lookup_key: lookup_value, "user_info": user_info}
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if not user_profile:
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
user_state = user_profile.copy()
|
|
200
|
+
if not user_state.get("id"):
|
|
201
|
+
user_state["id"] = user_identifier
|
|
202
|
+
if not user_state.get("email"):
|
|
203
|
+
user_state["email"] = email_from_auth
|
|
204
|
+
if not user_state.get("name"):
|
|
205
|
+
user_state["name"] = display_name
|
|
206
|
+
user_state["authenticated"] = True
|
|
207
|
+
user_state["auth_method"] = "oidc"
|
|
208
|
+
|
|
209
|
+
return user_state
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _create_auth_middleware(component):
|
|
213
|
+
class AuthMiddleware:
|
|
214
|
+
def __init__(self, app, component):
|
|
215
|
+
self.app = app
|
|
216
|
+
self.component = component
|
|
217
|
+
|
|
218
|
+
async def __call__(self, scope, receive, send):
|
|
219
|
+
if scope["type"] != "http":
|
|
220
|
+
await self.app(scope, receive, send)
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
request = FastAPIRequest(scope, receive)
|
|
224
|
+
|
|
225
|
+
if not request.url.path.startswith("/api"):
|
|
226
|
+
await self.app(scope, receive, send)
|
|
227
|
+
return
|
|
228
|
+
|
|
229
|
+
skip_paths = [
|
|
230
|
+
"/api/v1/config",
|
|
231
|
+
"/api/v1/auth/callback",
|
|
232
|
+
"/api/v1/auth/tool/callback",
|
|
233
|
+
"/api/v1/auth/login",
|
|
234
|
+
"/api/v1/auth/refresh",
|
|
235
|
+
"/api/v1/csrf-token",
|
|
236
|
+
"/health",
|
|
237
|
+
]
|
|
238
|
+
|
|
239
|
+
if any(request.url.path.startswith(path) for path in skip_paths):
|
|
240
|
+
await self.app(scope, receive, send)
|
|
241
|
+
return
|
|
242
|
+
|
|
243
|
+
use_auth = dependencies.api_config and dependencies.api_config.get(
|
|
244
|
+
"frontend_use_authorization"
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
if use_auth:
|
|
248
|
+
await self._handle_authenticated_request(request, scope, receive, send)
|
|
249
|
+
else:
|
|
250
|
+
request.state.user = {
|
|
251
|
+
"id": "sam_dev_user",
|
|
252
|
+
"name": "Sam Dev User",
|
|
253
|
+
"email": "sam@dev.local",
|
|
254
|
+
"authenticated": True,
|
|
255
|
+
"auth_method": "development",
|
|
256
|
+
}
|
|
257
|
+
log.debug(
|
|
258
|
+
"AuthMiddleware: Set development user state with id: sam_dev_user"
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
await self.app(scope, receive, send)
|
|
262
|
+
|
|
263
|
+
async def _handle_authenticated_request(self, request, scope, receive, send):
|
|
264
|
+
access_token = _extract_access_token(request)
|
|
265
|
+
|
|
266
|
+
if not access_token:
|
|
267
|
+
log.warning("AuthMiddleware: No access token found. Returning 401.")
|
|
268
|
+
response = JSONResponse(
|
|
269
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
270
|
+
content={
|
|
271
|
+
"detail": "Not authenticated",
|
|
272
|
+
"error_type": "authentication_required",
|
|
273
|
+
},
|
|
274
|
+
)
|
|
275
|
+
await response(scope, receive, send)
|
|
276
|
+
return
|
|
277
|
+
|
|
278
|
+
try:
|
|
279
|
+
auth_service_url = dependencies.api_config.get(
|
|
280
|
+
"external_auth_service_url"
|
|
281
|
+
)
|
|
282
|
+
auth_provider = dependencies.api_config.get("external_auth_provider")
|
|
283
|
+
|
|
284
|
+
if not auth_service_url:
|
|
285
|
+
log.error("Auth service URL not configured.")
|
|
286
|
+
response = JSONResponse(
|
|
287
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
288
|
+
content={"detail": "Auth service not configured"},
|
|
289
|
+
)
|
|
290
|
+
await response(scope, receive, send)
|
|
291
|
+
return
|
|
292
|
+
|
|
293
|
+
if not await _validate_token(
|
|
294
|
+
auth_service_url, auth_provider, access_token
|
|
295
|
+
):
|
|
296
|
+
log.warning("AuthMiddleware: Token validation failed")
|
|
297
|
+
response = JSONResponse(
|
|
298
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
299
|
+
content={
|
|
300
|
+
"detail": "Invalid token",
|
|
301
|
+
"error_type": "invalid_token",
|
|
302
|
+
},
|
|
303
|
+
)
|
|
304
|
+
await response(scope, receive, send)
|
|
305
|
+
return
|
|
306
|
+
|
|
307
|
+
user_info = await _get_user_info(
|
|
308
|
+
auth_service_url, auth_provider, access_token
|
|
309
|
+
)
|
|
310
|
+
if not user_info:
|
|
311
|
+
log.warning(
|
|
312
|
+
"AuthMiddleware: Failed to get user info from external auth service"
|
|
313
|
+
)
|
|
314
|
+
response = JSONResponse(
|
|
315
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
316
|
+
content={
|
|
317
|
+
"detail": "Could not retrieve user info from auth provider",
|
|
318
|
+
"error_type": "user_info_failed",
|
|
319
|
+
},
|
|
320
|
+
)
|
|
321
|
+
await response(scope, receive, send)
|
|
322
|
+
return
|
|
323
|
+
|
|
324
|
+
user_identifier = _extract_user_identifier(user_info)
|
|
325
|
+
if not user_identifier or user_identifier.lower() in [
|
|
326
|
+
"null",
|
|
327
|
+
"none",
|
|
328
|
+
"",
|
|
329
|
+
]:
|
|
330
|
+
log.error(
|
|
331
|
+
"AuthMiddleware: No valid user identifier from OAuth provider"
|
|
332
|
+
)
|
|
333
|
+
response = JSONResponse(
|
|
334
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
335
|
+
content={
|
|
336
|
+
"detail": "OAuth provider returned no valid user identifier",
|
|
337
|
+
"error_type": "invalid_user_identifier_from_provider",
|
|
338
|
+
},
|
|
339
|
+
)
|
|
340
|
+
await response(scope, receive, send)
|
|
341
|
+
return
|
|
342
|
+
|
|
343
|
+
email_from_auth, display_name = _extract_user_details(
|
|
344
|
+
user_info, user_identifier
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
identity_service = self.component.identity_service
|
|
348
|
+
if not identity_service:
|
|
349
|
+
request.state.user = (
|
|
350
|
+
await _create_user_state_without_identity_service(
|
|
351
|
+
user_identifier, email_from_auth, display_name
|
|
352
|
+
)
|
|
353
|
+
)
|
|
354
|
+
else:
|
|
355
|
+
user_state = await _create_user_state_with_identity_service(
|
|
356
|
+
identity_service,
|
|
357
|
+
user_identifier,
|
|
358
|
+
email_from_auth,
|
|
359
|
+
display_name,
|
|
360
|
+
user_info,
|
|
361
|
+
)
|
|
362
|
+
if not user_state:
|
|
363
|
+
log.error(
|
|
364
|
+
"AuthMiddleware: User authenticated but not found in internal IdentityService"
|
|
365
|
+
)
|
|
366
|
+
response = JSONResponse(
|
|
367
|
+
status_code=status.HTTP_403_FORBIDDEN,
|
|
368
|
+
content={
|
|
369
|
+
"detail": "User not authorized for this application",
|
|
370
|
+
"error_type": "not_authorized",
|
|
371
|
+
},
|
|
372
|
+
)
|
|
373
|
+
await response(scope, receive, send)
|
|
374
|
+
return
|
|
375
|
+
request.state.user = user_state
|
|
376
|
+
|
|
377
|
+
except httpx.RequestError as exc:
|
|
378
|
+
log.error("Error calling auth service: %s", exc)
|
|
379
|
+
response = JSONResponse(
|
|
380
|
+
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
381
|
+
content={"detail": "Auth service is unavailable"},
|
|
382
|
+
)
|
|
383
|
+
await response(scope, receive, send)
|
|
384
|
+
return
|
|
385
|
+
except Exception as exc:
|
|
386
|
+
log.error(
|
|
387
|
+
"An unexpected error occurred during token validation: %s", exc
|
|
388
|
+
)
|
|
389
|
+
response = JSONResponse(
|
|
390
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
391
|
+
content={
|
|
392
|
+
"detail": "An internal error occurred during authentication"
|
|
393
|
+
},
|
|
394
|
+
)
|
|
395
|
+
await response(scope, receive, send)
|
|
396
|
+
return
|
|
397
|
+
|
|
398
|
+
return AuthMiddleware
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def _setup_alembic_config(database_url: str) -> Config:
|
|
402
|
+
alembic_cfg = Config()
|
|
403
|
+
alembic_cfg.set_main_option(
|
|
404
|
+
"script_location",
|
|
405
|
+
os.path.join(os.path.dirname(__file__), "alembic"),
|
|
406
|
+
)
|
|
407
|
+
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
|
|
408
|
+
return alembic_cfg
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def _run_community_migrations(database_url: str) -> None:
|
|
412
|
+
"""
|
|
413
|
+
Run Alembic migrations for the community database schema.
|
|
414
|
+
This includes sessions, chat_messages tables and their indexes.
|
|
415
|
+
"""
|
|
416
|
+
try:
|
|
417
|
+
from sqlalchemy import create_engine
|
|
418
|
+
|
|
419
|
+
log.info("Starting community migrations...")
|
|
420
|
+
engine = create_engine(database_url)
|
|
421
|
+
inspector = sa.inspect(engine)
|
|
422
|
+
existing_tables = inspector.get_table_names()
|
|
423
|
+
|
|
424
|
+
if not existing_tables or "sessions" not in existing_tables:
|
|
425
|
+
log.info("Running initial community database setup")
|
|
426
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
427
|
+
command.upgrade(alembic_cfg, "head")
|
|
428
|
+
log.info("Community database migrations completed")
|
|
429
|
+
else:
|
|
430
|
+
log.info("Checking for community schema updates")
|
|
431
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
432
|
+
command.upgrade(alembic_cfg, "head")
|
|
433
|
+
log.info("Community database schema is current")
|
|
434
|
+
except Exception as e:
|
|
435
|
+
log.warning(
|
|
436
|
+
"Community migration check failed: %s - attempting to run migrations",
|
|
437
|
+
e,
|
|
438
|
+
)
|
|
439
|
+
try:
|
|
440
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
441
|
+
command.upgrade(alembic_cfg, "head")
|
|
442
|
+
log.info("Community database migrations completed")
|
|
443
|
+
except Exception as migration_error:
|
|
444
|
+
log.error("Community migration failed: %s", migration_error)
|
|
445
|
+
log.error("Check database connectivity and permissions")
|
|
446
|
+
raise RuntimeError(
|
|
447
|
+
f"Community database migration failed: {migration_error}"
|
|
448
|
+
) from migration_error
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def _run_enterprise_migrations(
|
|
452
|
+
component: "WebUIBackendComponent", database_url: str
|
|
453
|
+
) -> None:
|
|
454
|
+
"""
|
|
455
|
+
Run migrations for enterprise features like advanced analytics, audit logs, etc.
|
|
456
|
+
This is optional and only runs if the enterprise package is available.
|
|
457
|
+
"""
|
|
458
|
+
try:
|
|
459
|
+
from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
|
|
460
|
+
run_migrations,
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
webui_app = component.get_app()
|
|
464
|
+
app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
|
|
465
|
+
log.info("Starting enterprise migrations...")
|
|
466
|
+
run_migrations(database_url, app_config)
|
|
467
|
+
log.info("Enterprise migrations completed")
|
|
468
|
+
except (ImportError, ModuleNotFoundError):
|
|
469
|
+
log.debug("Enterprise module not found - skipping enterprise migrations")
|
|
470
|
+
except Exception as e:
|
|
471
|
+
log.error("Enterprise migration failed: %s", e)
|
|
472
|
+
log.error("Advanced features may be unavailable")
|
|
473
|
+
raise RuntimeError(f"Enterprise database migration failed: {e}") from e
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
def _setup_database(
|
|
477
|
+
component: "WebUIBackendComponent",
|
|
478
|
+
database_url: str,
|
|
479
|
+
platform_database_url: str = None
|
|
480
|
+
) -> None:
|
|
481
|
+
"""
|
|
482
|
+
Initialize database connections and run all required migrations.
|
|
483
|
+
Sets up both runtime and platform database schemas.
|
|
484
|
+
|
|
485
|
+
Args:
|
|
486
|
+
component: WebUIBackendComponent instance
|
|
487
|
+
database_url: Runtime database URL (sessions, tasks, chat) - REQUIRED
|
|
488
|
+
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
489
|
+
If None, platform features will be unavailable.
|
|
490
|
+
"""
|
|
491
|
+
dependencies.init_database(database_url)
|
|
492
|
+
log.info("Persistence enabled - sessions will be stored in database")
|
|
493
|
+
log.info("Running database migrations...")
|
|
494
|
+
|
|
495
|
+
_run_community_migrations(database_url)
|
|
496
|
+
|
|
497
|
+
if platform_database_url:
|
|
498
|
+
log.info("Platform database configured - running migrations")
|
|
499
|
+
_run_enterprise_migrations(component, platform_database_url)
|
|
500
|
+
else:
|
|
501
|
+
log.info("No platform database configured - skipping platform migrations")
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def _get_app_config(component: "WebUIBackendComponent") -> dict:
|
|
505
|
+
webui_app = component.get_app()
|
|
506
|
+
app_config = {}
|
|
507
|
+
if webui_app:
|
|
508
|
+
app_config = getattr(webui_app, "app_config", {})
|
|
509
|
+
if app_config is None:
|
|
510
|
+
log.warning("webui_app.app_config is None, using empty dict.")
|
|
511
|
+
app_config = {}
|
|
512
|
+
else:
|
|
513
|
+
log.warning("Could not get webui_app from component. Using empty app_config.")
|
|
514
|
+
return app_config
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def _create_api_config(app_config: dict, database_url: str) -> dict:
|
|
518
|
+
return {
|
|
519
|
+
"external_auth_service_url": app_config.get(
|
|
520
|
+
"external_auth_service_url", "http://localhost:8080"
|
|
521
|
+
),
|
|
522
|
+
"external_auth_callback_uri": app_config.get(
|
|
523
|
+
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
524
|
+
),
|
|
525
|
+
"external_auth_provider": app_config.get("external_auth_provider", "azure"),
|
|
526
|
+
"frontend_use_authorization": app_config.get(
|
|
527
|
+
"frontend_use_authorization", False
|
|
528
|
+
),
|
|
529
|
+
"frontend_redirect_url": app_config.get(
|
|
530
|
+
"frontend_redirect_url", "http://localhost:3000"
|
|
531
|
+
),
|
|
532
|
+
"persistence_enabled": database_url is not None,
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def setup_dependencies(
|
|
537
|
+
component: "WebUIBackendComponent",
|
|
538
|
+
database_url: str = None,
|
|
539
|
+
platform_database_url: str = None
|
|
540
|
+
):
|
|
541
|
+
"""
|
|
542
|
+
Initialize dependencies for both runtime and platform databases.
|
|
543
|
+
|
|
544
|
+
Args:
|
|
545
|
+
component: WebUIBackendComponent instance
|
|
546
|
+
database_url: Runtime database URL (sessions, tasks, chat).
|
|
547
|
+
If None, runs in compatibility mode with in-memory sessions.
|
|
548
|
+
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
549
|
+
If None, platform features will be unavailable (returns 501).
|
|
550
|
+
|
|
551
|
+
This function is idempotent and safe to call multiple times.
|
|
552
|
+
"""
|
|
553
|
+
global _dependencies_initialized
|
|
554
|
+
|
|
555
|
+
if _dependencies_initialized:
|
|
556
|
+
log.debug("[setup_dependencies] Dependencies already initialized, skipping")
|
|
557
|
+
return
|
|
558
|
+
|
|
559
|
+
dependencies.set_component_instance(component)
|
|
560
|
+
|
|
561
|
+
if database_url:
|
|
562
|
+
_setup_database(component, database_url, platform_database_url)
|
|
563
|
+
else:
|
|
564
|
+
log.warning(
|
|
565
|
+
"No database URL provided - using in-memory session storage (data not persisted across restarts)"
|
|
566
|
+
)
|
|
567
|
+
log.info("This maintains backward compatibility for existing SAM installations")
|
|
568
|
+
|
|
569
|
+
app_config = _get_app_config(component)
|
|
570
|
+
api_config_dict = _create_api_config(app_config, database_url)
|
|
571
|
+
|
|
572
|
+
dependencies.set_api_config(api_config_dict)
|
|
573
|
+
log.debug("API configuration extracted and stored.")
|
|
574
|
+
|
|
575
|
+
_setup_middleware(component)
|
|
576
|
+
_setup_routers()
|
|
577
|
+
_setup_static_files()
|
|
578
|
+
|
|
579
|
+
_dependencies_initialized = True
|
|
580
|
+
log.debug("[setup_dependencies] Dependencies initialization complete")
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
584
|
+
allowed_origins = component.get_cors_origins()
|
|
585
|
+
app.add_middleware(
|
|
586
|
+
CORSMiddleware,
|
|
587
|
+
allow_origins=allowed_origins,
|
|
588
|
+
allow_credentials=True,
|
|
589
|
+
allow_methods=["*"],
|
|
590
|
+
allow_headers=["*"],
|
|
591
|
+
)
|
|
592
|
+
log.info("CORSMiddleware added with origins: %s", allowed_origins)
|
|
593
|
+
|
|
594
|
+
session_manager = component.get_session_manager()
|
|
595
|
+
app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
|
|
596
|
+
log.info("SessionMiddleware added.")
|
|
597
|
+
|
|
598
|
+
auth_middleware_class = _create_auth_middleware(component)
|
|
599
|
+
app.add_middleware(auth_middleware_class, component=component)
|
|
600
|
+
log.info("AuthMiddleware added.")
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
def _setup_routers() -> None:
|
|
604
|
+
api_prefix = "/api/v1"
|
|
605
|
+
|
|
606
|
+
app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
|
|
607
|
+
app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
|
|
608
|
+
app.include_router(config.router, prefix=api_prefix, tags=["Config"])
|
|
609
|
+
app.include_router(version.router, prefix=api_prefix, tags=["Version"])
|
|
610
|
+
app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
|
|
611
|
+
app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
|
|
612
|
+
app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
|
|
613
|
+
app.include_router(
|
|
614
|
+
artifacts.router, prefix=f"{api_prefix}/artifacts", tags=["Artifacts"]
|
|
615
|
+
)
|
|
616
|
+
app.include_router(
|
|
617
|
+
visualization.router,
|
|
618
|
+
prefix=f"{api_prefix}/visualization",
|
|
619
|
+
tags=["Visualization"],
|
|
620
|
+
)
|
|
621
|
+
app.include_router(people.router, prefix=api_prefix, tags=["People"])
|
|
622
|
+
app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
|
|
623
|
+
app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
|
|
624
|
+
app.include_router(feedback.router, prefix=api_prefix, tags=["Feedback"])
|
|
625
|
+
app.include_router(prompts.router, prefix=f"{api_prefix}/prompts", tags=["Prompts"])
|
|
626
|
+
app.include_router(speech.router, prefix=f"{api_prefix}/speech", tags=["Speech"])
|
|
627
|
+
log.info("Legacy routers mounted for endpoints not yet migrated")
|
|
628
|
+
|
|
629
|
+
# Register shared exception handlers from community repo
|
|
630
|
+
from .shared.exception_handlers import register_exception_handlers
|
|
631
|
+
|
|
632
|
+
register_exception_handlers(app)
|
|
633
|
+
log.info("Registered shared exception handlers from community repo")
|
|
634
|
+
|
|
635
|
+
# Mount enterprise routers if available
|
|
636
|
+
try:
|
|
637
|
+
from solace_agent_mesh_enterprise.webui_backend.routers import (
|
|
638
|
+
get_enterprise_routers,
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
enterprise_routers = get_enterprise_routers()
|
|
642
|
+
for router_config in enterprise_routers:
|
|
643
|
+
app.include_router(
|
|
644
|
+
router_config["router"],
|
|
645
|
+
prefix=router_config["prefix"],
|
|
646
|
+
tags=router_config["tags"],
|
|
647
|
+
)
|
|
648
|
+
log.info("Mounted %d enterprise routers", len(enterprise_routers))
|
|
649
|
+
|
|
650
|
+
except ImportError:
|
|
651
|
+
log.debug("No enterprise package detected - skipping enterprise routers")
|
|
652
|
+
except ModuleNotFoundError:
|
|
653
|
+
log.debug(
|
|
654
|
+
"Enterprise module not found - skipping enterprise routers and exception handlers"
|
|
655
|
+
)
|
|
656
|
+
except Exception as e:
|
|
657
|
+
log.warning("Failed to load enterprise routers and exception handlers: %s", e)
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
def _setup_static_files() -> None:
|
|
661
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
662
|
+
root_dir = Path(os.path.normpath(os.path.join(current_dir, "..", "..")))
|
|
663
|
+
static_files_dir = Path.joinpath(root_dir, "client", "webui", "frontend", "static")
|
|
664
|
+
|
|
665
|
+
if not os.path.isdir(static_files_dir):
|
|
666
|
+
log.warning(
|
|
667
|
+
"Static files directory '%s' not found. Frontend may not be served.",
|
|
668
|
+
static_files_dir,
|
|
669
|
+
)
|
|
670
|
+
# try to mount static files directory anyways, might work for enterprise
|
|
671
|
+
try:
|
|
672
|
+
app.mount(
|
|
673
|
+
"/", StaticFiles(directory=static_files_dir, html=True), name="static"
|
|
674
|
+
)
|
|
675
|
+
log.info("Mounted static files directory '%s' at '/'", static_files_dir)
|
|
676
|
+
except Exception as static_mount_err:
|
|
677
|
+
log.error(
|
|
678
|
+
"Failed to mount static files directory '%s': %s",
|
|
679
|
+
static_files_dir,
|
|
680
|
+
static_mount_err,
|
|
681
|
+
)
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
@app.exception_handler(HTTPException)
|
|
685
|
+
async def http_exception_handler(request: FastAPIRequest, exc: HTTPException):
|
|
686
|
+
"""
|
|
687
|
+
HTTP exception handler with automatic format detection.
|
|
688
|
+
Returns JSON-RPC format for tasks/SSE endpoints, REST format for others.
|
|
689
|
+
"""
|
|
690
|
+
log.warning(
|
|
691
|
+
"HTTP Exception Handler triggered: Status=%s, Detail=%s, Request: %s %s",
|
|
692
|
+
exc.status_code,
|
|
693
|
+
exc.detail,
|
|
694
|
+
request.method,
|
|
695
|
+
request.url,
|
|
696
|
+
)
|
|
697
|
+
|
|
698
|
+
# Check if this is a JSON-RPC endpoint (tasks and SSE endpoints use JSON-RPC)
|
|
699
|
+
is_jsonrpc_endpoint = request.url.path.startswith(
|
|
700
|
+
"/api/v1/tasks"
|
|
701
|
+
) or request.url.path.startswith("/api/v1/sse")
|
|
702
|
+
|
|
703
|
+
if is_jsonrpc_endpoint:
|
|
704
|
+
# Use JSON-RPC format for tasks and SSE endpoints
|
|
705
|
+
error_data = None
|
|
706
|
+
error_code = InternalError().code
|
|
707
|
+
error_message = str(exc.detail)
|
|
708
|
+
|
|
709
|
+
if isinstance(exc.detail, dict):
|
|
710
|
+
if "code" in exc.detail and "message" in exc.detail:
|
|
711
|
+
error_code = exc.detail["code"]
|
|
712
|
+
error_message = exc.detail["message"]
|
|
713
|
+
error_data = exc.detail.get("data")
|
|
714
|
+
else:
|
|
715
|
+
error_data = exc.detail
|
|
716
|
+
elif isinstance(exc.detail, str):
|
|
717
|
+
if exc.status_code == status.HTTP_400_BAD_REQUEST:
|
|
718
|
+
error_code = -32600
|
|
719
|
+
elif exc.status_code == status.HTTP_404_NOT_FOUND:
|
|
720
|
+
error_code = -32601
|
|
721
|
+
error_message = "Resource not found"
|
|
722
|
+
|
|
723
|
+
error_obj = JSONRPCError(
|
|
724
|
+
code=error_code, message=error_message, data=error_data
|
|
725
|
+
)
|
|
726
|
+
response = A2AJSONRPCResponse(error=error_obj)
|
|
727
|
+
return JSONResponse(
|
|
728
|
+
status_code=exc.status_code, content=response.model_dump(exclude_none=True)
|
|
729
|
+
)
|
|
730
|
+
else:
|
|
731
|
+
# Use standard REST format for sessions and other REST endpoints
|
|
732
|
+
if isinstance(exc.detail, dict):
|
|
733
|
+
error_response = exc.detail
|
|
734
|
+
elif isinstance(exc.detail, str):
|
|
735
|
+
error_response = {"detail": exc.detail}
|
|
736
|
+
else:
|
|
737
|
+
error_response = {"detail": str(exc.detail)}
|
|
738
|
+
|
|
739
|
+
return JSONResponse(status_code=exc.status_code, content=error_response)
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
@app.exception_handler(RequestValidationError)
|
|
743
|
+
async def validation_exception_handler(
|
|
744
|
+
request: FastAPIRequest, exc: RequestValidationError
|
|
745
|
+
):
|
|
746
|
+
"""
|
|
747
|
+
Handles Pydantic validation errors with format detection.
|
|
748
|
+
"""
|
|
749
|
+
log.warning(
|
|
750
|
+
"Validation Exception Handler triggered: %s, Request: %s %s",
|
|
751
|
+
exc.errors(),
|
|
752
|
+
request.method,
|
|
753
|
+
request.url,
|
|
754
|
+
)
|
|
755
|
+
response = a2a.create_invalid_request_error_response(
|
|
756
|
+
message="Invalid request parameters", data=exc.errors(), request_id=None
|
|
757
|
+
)
|
|
758
|
+
return JSONResponse(
|
|
759
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
|
760
|
+
content=response.model_dump(exclude_none=True),
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
@app.exception_handler(Exception)
|
|
765
|
+
async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
|
|
766
|
+
"""
|
|
767
|
+
Handles any other unexpected exceptions with format detection.
|
|
768
|
+
"""
|
|
769
|
+
log.exception(
|
|
770
|
+
"Generic Exception Handler triggered: %s, Request: %s %s",
|
|
771
|
+
exc,
|
|
772
|
+
request.method,
|
|
773
|
+
request.url,
|
|
774
|
+
)
|
|
775
|
+
error_obj = a2a.create_internal_error(
|
|
776
|
+
message="An unexpected server error occurred: %s" % type(exc).__name__
|
|
777
|
+
)
|
|
778
|
+
response = a2a.create_error_response(error=error_obj, request_id=None)
|
|
779
|
+
return JSONResponse(
|
|
780
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
781
|
+
content=response.model_dump(exclude_none=True),
|
|
782
|
+
)
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
@app.get("/health", tags=["Health"])
|
|
786
|
+
async def read_root():
|
|
787
|
+
"""Basic health check endpoint."""
|
|
788
|
+
log.debug("Health check endpoint '/health' called")
|
|
789
|
+
return {"status": "A2A Web UI Backend is running"}
|