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,311 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Router for handling authentication-related endpoints.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import secrets
|
|
7
|
+
from urllib.parse import urlencode
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
from fastapi import (
|
|
11
|
+
APIRouter,
|
|
12
|
+
Depends,
|
|
13
|
+
HTTPException,
|
|
14
|
+
Request as FastAPIRequest,
|
|
15
|
+
Response,
|
|
16
|
+
)
|
|
17
|
+
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
18
|
+
|
|
19
|
+
from ...http_sse.dependencies import get_api_config, get_sac_component
|
|
20
|
+
|
|
21
|
+
log = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
router = APIRouter()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@router.get("/auth/login")
|
|
27
|
+
async def initiate_login(
|
|
28
|
+
request: FastAPIRequest, config: dict = Depends(get_api_config)
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Initiates the login flow by redirecting to the external authorization service.
|
|
32
|
+
"""
|
|
33
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
34
|
+
callback_url = config.get(
|
|
35
|
+
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
params = {
|
|
39
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
40
|
+
"redirect_uri": callback_url,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
login_url = f"{external_auth_url}/login?{urlencode(params)}"
|
|
44
|
+
log.info(f"Redirecting to external authorization service: {login_url}")
|
|
45
|
+
|
|
46
|
+
return RedirectResponse(url=login_url)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@router.get("/csrf-token")
|
|
50
|
+
async def get_csrf_token(
|
|
51
|
+
response: Response, component: "WebUIBackendComponent" = Depends(get_sac_component)
|
|
52
|
+
):
|
|
53
|
+
"""
|
|
54
|
+
Generates and returns a CSRF token, setting it as a readable cookie and returning it in the response.
|
|
55
|
+
"""
|
|
56
|
+
csrf_token = secrets.token_urlsafe(32)
|
|
57
|
+
|
|
58
|
+
response.set_cookie(
|
|
59
|
+
key="csrf_token",
|
|
60
|
+
value=csrf_token,
|
|
61
|
+
httponly=False,
|
|
62
|
+
secure=False,
|
|
63
|
+
samesite="lax",
|
|
64
|
+
max_age=3600,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return {"message": "CSRF token set", "csrf_token": csrf_token}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@router.get("/auth/callback")
|
|
71
|
+
async def auth_callback(
|
|
72
|
+
request: FastAPIRequest,
|
|
73
|
+
config: dict = Depends(get_api_config),
|
|
74
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
75
|
+
):
|
|
76
|
+
"""
|
|
77
|
+
Handles the callback from the OIDC provider by calling an external exchange service.
|
|
78
|
+
"""
|
|
79
|
+
code = request.query_params.get("code")
|
|
80
|
+
|
|
81
|
+
if not code:
|
|
82
|
+
raise HTTPException(status_code=400, detail="Missing authorization code")
|
|
83
|
+
|
|
84
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
85
|
+
exchange_url = f"{external_auth_url}/exchange-code"
|
|
86
|
+
redirect_uri = config.get(
|
|
87
|
+
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
async with httpx.AsyncClient() as client:
|
|
91
|
+
try:
|
|
92
|
+
response = await client.post(
|
|
93
|
+
exchange_url,
|
|
94
|
+
json={
|
|
95
|
+
"code": code,
|
|
96
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
97
|
+
"redirect_uri": redirect_uri,
|
|
98
|
+
},
|
|
99
|
+
timeout=20.0,
|
|
100
|
+
)
|
|
101
|
+
response.raise_for_status()
|
|
102
|
+
token_data = response.json()
|
|
103
|
+
except httpx.HTTPStatusError as e:
|
|
104
|
+
log.error(f"Failed to exchange code: {e.response.text}")
|
|
105
|
+
raise HTTPException(
|
|
106
|
+
status_code=e.response.status_code,
|
|
107
|
+
detail=f"Failed to exchange code: {e.response.text}",
|
|
108
|
+
)
|
|
109
|
+
except Exception as e:
|
|
110
|
+
log.error(f"Error during code exchange: {e}")
|
|
111
|
+
raise HTTPException(status_code=500, detail="Error during code exchange")
|
|
112
|
+
|
|
113
|
+
access_token = token_data.get("access_token")
|
|
114
|
+
refresh_token = token_data.get("refresh_token")
|
|
115
|
+
|
|
116
|
+
if not access_token:
|
|
117
|
+
raise HTTPException(
|
|
118
|
+
status_code=400, detail="Access token not in response from exchange service"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
request.session["access_token"] = access_token
|
|
122
|
+
if refresh_token:
|
|
123
|
+
request.session["refresh_token"] = refresh_token
|
|
124
|
+
log.debug("Tokens stored directly in session.")
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
async with httpx.AsyncClient() as client:
|
|
128
|
+
user_info_response = await client.get(
|
|
129
|
+
f"{external_auth_url}/user_info",
|
|
130
|
+
params={"provider": config.get("external_auth_provider", "azure")},
|
|
131
|
+
headers={"Authorization": f"Bearer {access_token}"},
|
|
132
|
+
)
|
|
133
|
+
user_info_response.raise_for_status()
|
|
134
|
+
user_info = user_info_response.json()
|
|
135
|
+
|
|
136
|
+
user_id = user_info.get("email", "authenticated_user")
|
|
137
|
+
if user_id:
|
|
138
|
+
session_manager = component.get_session_manager()
|
|
139
|
+
session_manager.store_user_id(request, user_id)
|
|
140
|
+
else:
|
|
141
|
+
log.warning("Could not find 'email' in user info response.")
|
|
142
|
+
|
|
143
|
+
except httpx.HTTPStatusError as e:
|
|
144
|
+
log.error(f"Failed to get user info: {e.response.text}")
|
|
145
|
+
|
|
146
|
+
except Exception as e:
|
|
147
|
+
log.error(f"Error getting user info: {e}")
|
|
148
|
+
|
|
149
|
+
frontend_base_url = config.get("frontend_redirect_url", "http://localhost:3000")
|
|
150
|
+
|
|
151
|
+
hash_params = {"access_token": access_token}
|
|
152
|
+
if refresh_token:
|
|
153
|
+
hash_params["refresh_token"] = refresh_token
|
|
154
|
+
|
|
155
|
+
hash_fragment = urlencode(hash_params)
|
|
156
|
+
|
|
157
|
+
frontend_redirect_url = f"{frontend_base_url}/auth-callback.html#{hash_fragment}"
|
|
158
|
+
return RedirectResponse(url=frontend_redirect_url)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@router.post("/auth/refresh")
|
|
162
|
+
async def refresh_token(
|
|
163
|
+
request: FastAPIRequest,
|
|
164
|
+
config: dict = Depends(get_api_config),
|
|
165
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
166
|
+
):
|
|
167
|
+
"""
|
|
168
|
+
Refreshes an access token using the external authorization service.
|
|
169
|
+
"""
|
|
170
|
+
data = await request.json()
|
|
171
|
+
refresh_token = data.get("refresh_token")
|
|
172
|
+
if not refresh_token:
|
|
173
|
+
raise HTTPException(status_code=400, detail="Missing refresh_token")
|
|
174
|
+
|
|
175
|
+
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
176
|
+
refresh_url = f"{external_auth_url}/refresh_token"
|
|
177
|
+
|
|
178
|
+
async with httpx.AsyncClient() as client:
|
|
179
|
+
try:
|
|
180
|
+
response = await client.post(
|
|
181
|
+
refresh_url,
|
|
182
|
+
json={
|
|
183
|
+
"refresh_token": refresh_token,
|
|
184
|
+
"provider": config.get("external_auth_provider", "azure"),
|
|
185
|
+
},
|
|
186
|
+
timeout=20.0,
|
|
187
|
+
)
|
|
188
|
+
response.raise_for_status()
|
|
189
|
+
token_data = response.json()
|
|
190
|
+
except httpx.HTTPStatusError as e:
|
|
191
|
+
log.error(f"Failed to refresh token: {e.response.text}")
|
|
192
|
+
raise HTTPException(
|
|
193
|
+
status_code=e.response.status_code,
|
|
194
|
+
detail=f"Failed to refresh token: {e.response.text}",
|
|
195
|
+
)
|
|
196
|
+
except Exception as e:
|
|
197
|
+
log.error(f"Error during token refresh: {e}")
|
|
198
|
+
raise HTTPException(status_code=500, detail="Error during token refresh")
|
|
199
|
+
|
|
200
|
+
access_token = token_data.get("access_token")
|
|
201
|
+
new_refresh_token = token_data.get("refresh_token")
|
|
202
|
+
|
|
203
|
+
if not access_token:
|
|
204
|
+
raise HTTPException(
|
|
205
|
+
status_code=400, detail="Access token not in response from refresh service"
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
session_manager = component.get_session_manager()
|
|
209
|
+
session_manager.store_auth_tokens(request, access_token, new_refresh_token)
|
|
210
|
+
log.info("Successfully refreshed and updated tokens in session.")
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
"access_token": access_token,
|
|
214
|
+
"refresh_token": new_refresh_token,
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@router.get("/auth/tool/callback")
|
|
219
|
+
async def auth_tool_callback(
|
|
220
|
+
request: FastAPIRequest,
|
|
221
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
222
|
+
):
|
|
223
|
+
"""
|
|
224
|
+
Handles OAuth2 authorization code grant response for tool authentication.
|
|
225
|
+
"""
|
|
226
|
+
code = request.query_params.get("code")
|
|
227
|
+
state = request.query_params.get("state")
|
|
228
|
+
error = request.query_params.get("error")
|
|
229
|
+
error_description = request.query_params.get("error_description")
|
|
230
|
+
|
|
231
|
+
if error:
|
|
232
|
+
log.error(f"OAuth2 tool callback received error: {error} - {error_description}")
|
|
233
|
+
return HTMLResponse(
|
|
234
|
+
content=f"""
|
|
235
|
+
<html>
|
|
236
|
+
<head>
|
|
237
|
+
<title>Authorization Error</title>
|
|
238
|
+
</head>
|
|
239
|
+
<body>
|
|
240
|
+
<h2>Authorization Error</h2>
|
|
241
|
+
<p>Error: {error}</p>
|
|
242
|
+
<p>Description: {error_description or 'No description provided'}</p>
|
|
243
|
+
<p>Please close this window and try again.</p>
|
|
244
|
+
</body>
|
|
245
|
+
</html>
|
|
246
|
+
""",
|
|
247
|
+
status_code=400
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
# Get the current request URL for logging/debugging
|
|
251
|
+
url = str(request.url)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
if not code:
|
|
255
|
+
log.warning("OAuth2 tool callback received without authorization code")
|
|
256
|
+
return HTMLResponse(
|
|
257
|
+
content="""
|
|
258
|
+
<html>
|
|
259
|
+
<head>
|
|
260
|
+
<title>Authorization Error</title>
|
|
261
|
+
</head>
|
|
262
|
+
<body>
|
|
263
|
+
<h2>Authorization Error</h2>
|
|
264
|
+
<p>No authorization code received. Please close this window and try again.</p>
|
|
265
|
+
</body>
|
|
266
|
+
</html>
|
|
267
|
+
""",
|
|
268
|
+
status_code=400
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
log.info(f"OAuth2 tool callback received authorization code: {code}")
|
|
272
|
+
|
|
273
|
+
try:
|
|
274
|
+
from solace_agent_mesh_enterprise.auth.input_required import process_auth_grant_response
|
|
275
|
+
await process_auth_grant_response(component, code, state, url)
|
|
276
|
+
except ImportError:
|
|
277
|
+
pass
|
|
278
|
+
|
|
279
|
+
# Return simple HTML page instructing user to close the window
|
|
280
|
+
return HTMLResponse(
|
|
281
|
+
content="""
|
|
282
|
+
<html>
|
|
283
|
+
<head>
|
|
284
|
+
<title>Authorization Complete</title>
|
|
285
|
+
<style>
|
|
286
|
+
body {
|
|
287
|
+
font-family: Arial, sans-serif;
|
|
288
|
+
text-align: center;
|
|
289
|
+
padding: 50px;
|
|
290
|
+
background-color: #f5f5f5;
|
|
291
|
+
}
|
|
292
|
+
.container {
|
|
293
|
+
background: white;
|
|
294
|
+
padding: 30px;
|
|
295
|
+
border-radius: 8px;
|
|
296
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
|
297
|
+
display: inline-block;
|
|
298
|
+
}
|
|
299
|
+
h2 { color: #28a745; }
|
|
300
|
+
</style>
|
|
301
|
+
</head>
|
|
302
|
+
<body>
|
|
303
|
+
<div class="container">
|
|
304
|
+
<h2>✓ Authorization Complete</h2>
|
|
305
|
+
<p>You have successfully authorized the tool access.</p>
|
|
306
|
+
<p><strong>Please close this window.</strong></p>
|
|
307
|
+
</div>
|
|
308
|
+
</body>
|
|
309
|
+
</html>
|
|
310
|
+
"""
|
|
311
|
+
)
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"""
|
|
2
|
+
API Router for providing frontend configuration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from fastapi import APIRouter, Depends, HTTPException, status
|
|
7
|
+
from typing import Dict, Any
|
|
8
|
+
|
|
9
|
+
from ....gateway.http_sse.dependencies import get_sac_component, get_api_config
|
|
10
|
+
from ..routers.dto.requests.project_requests import CreateProjectRequest, UpdateProjectRequest
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from gateway.http_sse.component import WebUIBackendComponent
|
|
15
|
+
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
router = APIRouter()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Default max upload size (50MB) - matches gateway_max_upload_size_bytes default
|
|
22
|
+
DEFAULT_MAX_UPLOAD_SIZE_BYTES = 52428800
|
|
23
|
+
# Default max ZIP upload size (100MB) - for project import ZIP files
|
|
24
|
+
DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES = 104857600
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_validation_limits(component: "WebUIBackendComponent" = None) -> Dict[str, Any]:
|
|
28
|
+
"""
|
|
29
|
+
Extract validation limits from Pydantic models to expose to frontend.
|
|
30
|
+
This ensures frontend and backend validation limits stay in sync.
|
|
31
|
+
"""
|
|
32
|
+
# Extract limits from CreateProjectRequest model
|
|
33
|
+
create_fields = CreateProjectRequest.model_fields
|
|
34
|
+
|
|
35
|
+
# Get max upload size from component config, with fallback to default
|
|
36
|
+
max_upload_size_bytes = (
|
|
37
|
+
component.get_config("gateway_max_upload_size_bytes", DEFAULT_MAX_UPLOAD_SIZE_BYTES)
|
|
38
|
+
if component else DEFAULT_MAX_UPLOAD_SIZE_BYTES
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Get max ZIP upload size from component config, with fallback to default (100MB)
|
|
42
|
+
max_zip_upload_size_bytes = (
|
|
43
|
+
component.get_config("gateway_max_zip_upload_size_bytes", DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES)
|
|
44
|
+
if component else DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
"projectNameMax": create_fields["name"].metadata[1].max_length if create_fields["name"].metadata else 255,
|
|
49
|
+
"projectDescriptionMax": create_fields["description"].metadata[0].max_length if create_fields["description"].metadata else 1000,
|
|
50
|
+
"projectInstructionsMax": create_fields["system_prompt"].metadata[0].max_length if create_fields["system_prompt"].metadata else 4000,
|
|
51
|
+
"maxUploadSizeBytes": max_upload_size_bytes,
|
|
52
|
+
"maxZipUploadSizeBytes": max_zip_upload_size_bytes,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _get_background_tasks_config(
|
|
57
|
+
component: "WebUIBackendComponent",
|
|
58
|
+
log_prefix: str
|
|
59
|
+
) -> Dict[str, Any]:
|
|
60
|
+
"""
|
|
61
|
+
Extracts background tasks configuration for the frontend.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Dict with background tasks non-boolean settings:
|
|
65
|
+
- default_timeout_ms: Default timeout for background tasks
|
|
66
|
+
|
|
67
|
+
Note: The 'enabled' flag is now in frontend_feature_enablement.background_tasks
|
|
68
|
+
"""
|
|
69
|
+
background_config = component.get_config("background_tasks", {})
|
|
70
|
+
default_timeout_ms = background_config.get("default_timeout_ms", 3600000) # 1 hour default
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
"default_timeout_ms": default_timeout_ms,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _determine_background_tasks_enabled(
|
|
78
|
+
component: "WebUIBackendComponent",
|
|
79
|
+
log_prefix: str
|
|
80
|
+
) -> bool:
|
|
81
|
+
"""
|
|
82
|
+
Determines if background tasks feature should be enabled.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
bool: True if background tasks should be enabled
|
|
86
|
+
"""
|
|
87
|
+
feature_flags = component.get_config("frontend_feature_enablement", {})
|
|
88
|
+
enabled = feature_flags.get("background_tasks", False)
|
|
89
|
+
|
|
90
|
+
if enabled:
|
|
91
|
+
log.debug("%s Background tasks enabled globally for all agents", log_prefix)
|
|
92
|
+
else:
|
|
93
|
+
log.debug("%s Background tasks disabled", log_prefix)
|
|
94
|
+
|
|
95
|
+
return enabled
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _determine_projects_enabled(
|
|
99
|
+
component: "WebUIBackendComponent",
|
|
100
|
+
api_config: Dict[str, Any],
|
|
101
|
+
log_prefix: str
|
|
102
|
+
) -> bool:
|
|
103
|
+
"""
|
|
104
|
+
Determines if projects feature should be enabled.
|
|
105
|
+
|
|
106
|
+
Logic:
|
|
107
|
+
1. Check if persistence is enabled (required for projects)
|
|
108
|
+
2. Check explicit projects.enabled config
|
|
109
|
+
3. Check frontend_feature_enablement.projects override
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
bool: True if projects should be enabled
|
|
113
|
+
"""
|
|
114
|
+
# Projects require persistence
|
|
115
|
+
persistence_enabled = api_config.get("persistence_enabled", False)
|
|
116
|
+
if not persistence_enabled:
|
|
117
|
+
log.debug("%s Projects disabled: persistence is not enabled", log_prefix)
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
# Check explicit projects config
|
|
121
|
+
projects_config = component.get_config("projects", {})
|
|
122
|
+
if isinstance(projects_config, dict):
|
|
123
|
+
projects_explicitly_enabled = projects_config.get("enabled", True)
|
|
124
|
+
if not projects_explicitly_enabled:
|
|
125
|
+
log.debug("%s Projects disabled: explicitly disabled in config", log_prefix)
|
|
126
|
+
return False
|
|
127
|
+
|
|
128
|
+
# Check frontend_feature_enablement override
|
|
129
|
+
feature_flags = component.get_config("frontend_feature_enablement", {})
|
|
130
|
+
if "projects" in feature_flags:
|
|
131
|
+
projects_flag = feature_flags.get("projects", True)
|
|
132
|
+
if not projects_flag:
|
|
133
|
+
log.debug("%s Projects disabled: disabled in frontend_feature_enablement", log_prefix)
|
|
134
|
+
return False
|
|
135
|
+
|
|
136
|
+
# All checks passed
|
|
137
|
+
log.debug("%s Projects enabled: persistence enabled and no explicit disable", log_prefix)
|
|
138
|
+
return True
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@router.get("/config", response_model=Dict[str, Any])
|
|
142
|
+
async def get_app_config(
|
|
143
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
144
|
+
api_config: Dict[str, Any] = Depends(get_api_config),
|
|
145
|
+
):
|
|
146
|
+
"""
|
|
147
|
+
Provides configuration settings needed by the frontend application.
|
|
148
|
+
"""
|
|
149
|
+
log_prefix = "[GET /api/v1/config] "
|
|
150
|
+
log.info("%sRequest received.", log_prefix)
|
|
151
|
+
try:
|
|
152
|
+
# Start with explicitly defined feature flags
|
|
153
|
+
feature_enablement = component.get_config("frontend_feature_enablement", {})
|
|
154
|
+
|
|
155
|
+
# Manually check for the task_logging feature and add it
|
|
156
|
+
task_logging_config = component.get_config("task_logging", {})
|
|
157
|
+
if task_logging_config and task_logging_config.get("enabled", False):
|
|
158
|
+
feature_enablement["taskLogging"] = True
|
|
159
|
+
log.debug("%s taskLogging feature flag is enabled.", log_prefix)
|
|
160
|
+
|
|
161
|
+
# Determine if prompt library should be enabled
|
|
162
|
+
# Prompts require SQL session storage for persistence
|
|
163
|
+
prompt_library_config = component.get_config("prompt_library", {})
|
|
164
|
+
prompt_library_explicitly_enabled = prompt_library_config.get("enabled", True)
|
|
165
|
+
|
|
166
|
+
if prompt_library_explicitly_enabled:
|
|
167
|
+
# Check if SQL persistence is available (REQUIRED for prompts)
|
|
168
|
+
session_config = component.get_config("session_service", {})
|
|
169
|
+
session_type = session_config.get("type", "memory")
|
|
170
|
+
|
|
171
|
+
if session_type != "sql":
|
|
172
|
+
log.warning(
|
|
173
|
+
"%s Prompt library is configured but session_service type is '%s' (not 'sql'). "
|
|
174
|
+
"Disabling prompt library for frontend.",
|
|
175
|
+
log_prefix,
|
|
176
|
+
session_type
|
|
177
|
+
)
|
|
178
|
+
prompt_library_enabled = False
|
|
179
|
+
else:
|
|
180
|
+
prompt_library_enabled = True
|
|
181
|
+
feature_enablement["promptLibrary"] = True
|
|
182
|
+
log.debug("%s promptLibrary feature flag is enabled.", log_prefix)
|
|
183
|
+
|
|
184
|
+
# Check AI-assisted sub-feature (only if parent is enabled)
|
|
185
|
+
ai_assisted_config = prompt_library_config.get("ai_assisted", {})
|
|
186
|
+
ai_assisted_enabled = ai_assisted_config.get("enabled", True)
|
|
187
|
+
|
|
188
|
+
if ai_assisted_enabled:
|
|
189
|
+
# Verify LLM is configured through the model config
|
|
190
|
+
model_config = component.get_config("model", {})
|
|
191
|
+
|
|
192
|
+
llm_model = None
|
|
193
|
+
if isinstance(model_config, dict):
|
|
194
|
+
llm_model = model_config.get("model")
|
|
195
|
+
|
|
196
|
+
if llm_model:
|
|
197
|
+
feature_enablement["promptAIAssisted"] = True
|
|
198
|
+
log.debug("%s promptAIAssisted feature flag is enabled.", log_prefix)
|
|
199
|
+
else:
|
|
200
|
+
feature_enablement["promptAIAssisted"] = False
|
|
201
|
+
log.warning(
|
|
202
|
+
"%s AI-assisted prompts disabled: model not configured",
|
|
203
|
+
log_prefix
|
|
204
|
+
)
|
|
205
|
+
else:
|
|
206
|
+
feature_enablement["promptAIAssisted"] = False
|
|
207
|
+
|
|
208
|
+
# Check version history sub-feature (only if parent is enabled)
|
|
209
|
+
version_history_config = prompt_library_config.get("version_history", {})
|
|
210
|
+
version_history_enabled = version_history_config.get("enabled", True)
|
|
211
|
+
|
|
212
|
+
if version_history_enabled:
|
|
213
|
+
feature_enablement["promptVersionHistory"] = True
|
|
214
|
+
log.debug("%s promptVersionHistory feature flag is enabled.", log_prefix)
|
|
215
|
+
else:
|
|
216
|
+
feature_enablement["promptVersionHistory"] = False
|
|
217
|
+
|
|
218
|
+
# Check prompt sharing sub-feature (only if parent is enabled)
|
|
219
|
+
sharing_config = prompt_library_config.get("sharing", {})
|
|
220
|
+
sharing_enabled = sharing_config.get("enabled", False)
|
|
221
|
+
|
|
222
|
+
if sharing_enabled:
|
|
223
|
+
feature_enablement["promptSharing"] = True
|
|
224
|
+
log.debug("%s promptSharing feature flag is enabled.", log_prefix)
|
|
225
|
+
else:
|
|
226
|
+
feature_enablement["promptSharing"] = False
|
|
227
|
+
else:
|
|
228
|
+
# Explicitly set to false when disabled
|
|
229
|
+
feature_enablement["promptLibrary"] = False
|
|
230
|
+
feature_enablement["promptAIAssisted"] = False
|
|
231
|
+
feature_enablement["promptVersionHistory"] = False
|
|
232
|
+
feature_enablement["promptSharing"] = False
|
|
233
|
+
log.info("%s Prompt library feature is explicitly disabled.", log_prefix)
|
|
234
|
+
|
|
235
|
+
# Determine if feedback should be enabled
|
|
236
|
+
# Feedback requires SQL session storage for persistence
|
|
237
|
+
feedback_enabled = component.get_config("frontend_collect_feedback", False)
|
|
238
|
+
if feedback_enabled:
|
|
239
|
+
session_config = component.get_config("session_service", {})
|
|
240
|
+
session_type = session_config.get("type", "memory")
|
|
241
|
+
if session_type != "sql":
|
|
242
|
+
log.warning(
|
|
243
|
+
"%s Feedback is configured but session_service type is '%s' (not 'sql'). "
|
|
244
|
+
"Disabling feedback for frontend.",
|
|
245
|
+
log_prefix,
|
|
246
|
+
session_type
|
|
247
|
+
)
|
|
248
|
+
feedback_enabled = False
|
|
249
|
+
|
|
250
|
+
# Determine if projects should be enabled
|
|
251
|
+
# Projects require SQL session storage for persistence
|
|
252
|
+
projects_enabled = _determine_projects_enabled(component, api_config, log_prefix)
|
|
253
|
+
feature_enablement["projects"] = projects_enabled
|
|
254
|
+
if projects_enabled:
|
|
255
|
+
log.debug("%s Projects feature flag is enabled.", log_prefix)
|
|
256
|
+
else:
|
|
257
|
+
log.debug("%s Projects feature flag is disabled.", log_prefix)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
# Determine if background tasks should be enabled
|
|
261
|
+
background_tasks_enabled = _determine_background_tasks_enabled(component, log_prefix)
|
|
262
|
+
feature_enablement["background_tasks"] = background_tasks_enabled
|
|
263
|
+
if background_tasks_enabled:
|
|
264
|
+
log.debug("%s Background tasks feature flag is enabled.", log_prefix)
|
|
265
|
+
else:
|
|
266
|
+
log.debug("%s Background tasks feature flag is disabled.", log_prefix)
|
|
267
|
+
|
|
268
|
+
# Check tool configuration status
|
|
269
|
+
tool_config_status = {}
|
|
270
|
+
|
|
271
|
+
# Check TTS configuration from component config (not environment variables)
|
|
272
|
+
speech_config = component.get_config("speech", {})
|
|
273
|
+
tts_config = speech_config.get("tts", {})
|
|
274
|
+
|
|
275
|
+
# Check if speech/TTS section is defined in config
|
|
276
|
+
# If not defined, disable TTS even if keys might be present elsewhere
|
|
277
|
+
if not speech_config or not tts_config:
|
|
278
|
+
log.debug("%s TTS disabled: speech.tts section not configured", log_prefix)
|
|
279
|
+
tts_configured = False
|
|
280
|
+
tts_provider = "gemini" # Default fallback
|
|
281
|
+
else:
|
|
282
|
+
# Get provider from config (with fallback to default)
|
|
283
|
+
preferred_provider = tts_config.get("provider", "gemini").lower()
|
|
284
|
+
|
|
285
|
+
# Check which providers are configured
|
|
286
|
+
gemini_config = tts_config.get("gemini", {})
|
|
287
|
+
azure_config = tts_config.get("azure", {})
|
|
288
|
+
polly_config = tts_config.get("polly", {})
|
|
289
|
+
|
|
290
|
+
gemini_key = gemini_config.get("api_key")
|
|
291
|
+
azure_speech_key = azure_config.get("api_key")
|
|
292
|
+
azure_speech_region = azure_config.get("region")
|
|
293
|
+
aws_access_key = polly_config.get("aws_access_key_id")
|
|
294
|
+
aws_secret_key = polly_config.get("aws_secret_access_key")
|
|
295
|
+
|
|
296
|
+
# Determine which providers are available
|
|
297
|
+
gemini_available = bool(gemini_key)
|
|
298
|
+
azure_available = bool(azure_speech_key and azure_speech_region)
|
|
299
|
+
polly_available = bool(aws_access_key and aws_secret_key)
|
|
300
|
+
tts_configured = gemini_available or azure_available or polly_available
|
|
301
|
+
tool_config_status["text_to_speech"] = tts_configured
|
|
302
|
+
|
|
303
|
+
# Determine TTS provider based on preference and availability
|
|
304
|
+
if preferred_provider == "azure" and azure_available:
|
|
305
|
+
tts_provider = "azure"
|
|
306
|
+
elif preferred_provider == "gemini" and gemini_available:
|
|
307
|
+
tts_provider = "gemini"
|
|
308
|
+
elif preferred_provider == "polly" and polly_available:
|
|
309
|
+
tts_provider = "polly"
|
|
310
|
+
elif gemini_available:
|
|
311
|
+
# Default to Gemini if available
|
|
312
|
+
tts_provider = "gemini"
|
|
313
|
+
elif azure_available:
|
|
314
|
+
# Fall back to Azure if Gemini not available
|
|
315
|
+
tts_provider = "azure"
|
|
316
|
+
elif polly_available:
|
|
317
|
+
# Fall back to Polly if others not available
|
|
318
|
+
tts_provider = "polly"
|
|
319
|
+
else:
|
|
320
|
+
# No provider available, default to gemini (will use browser fallback)
|
|
321
|
+
tts_provider = "gemini"
|
|
322
|
+
|
|
323
|
+
if tts_configured:
|
|
324
|
+
log.debug("%s TTS is configured (API keys present, provider: %s)", log_prefix, tts_provider)
|
|
325
|
+
if preferred_provider and preferred_provider != tts_provider:
|
|
326
|
+
log.warning(
|
|
327
|
+
"%s TTS_PROVIDER set to '%s' but using '%s' (preferred provider not available)",
|
|
328
|
+
log_prefix, preferred_provider, tts_provider
|
|
329
|
+
)
|
|
330
|
+
else:
|
|
331
|
+
log.debug("%s TTS not configured (no API keys found)", log_prefix)
|
|
332
|
+
|
|
333
|
+
# TTS settings - enable if API keys are present
|
|
334
|
+
tts_settings = {
|
|
335
|
+
"textToSpeech": tts_configured,
|
|
336
|
+
"engineTTS": "external" if tts_configured else "browser",
|
|
337
|
+
"ttsProvider": tts_provider,
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
config_data = {
|
|
341
|
+
"frontend_server_url": "",
|
|
342
|
+
"frontend_auth_login_url": component.get_config(
|
|
343
|
+
"frontend_auth_login_url", ""
|
|
344
|
+
),
|
|
345
|
+
"frontend_use_authorization": component.get_config(
|
|
346
|
+
"frontend_use_authorization", False
|
|
347
|
+
),
|
|
348
|
+
"frontend_welcome_message": component.get_config(
|
|
349
|
+
"frontend_welcome_message", ""
|
|
350
|
+
),
|
|
351
|
+
"frontend_redirect_url": component.get_config("frontend_redirect_url", ""),
|
|
352
|
+
"frontend_collect_feedback": feedback_enabled,
|
|
353
|
+
"frontend_bot_name": component.get_config("frontend_bot_name", "A2A Agent"),
|
|
354
|
+
"frontend_logo_url": component.get_config("frontend_logo_url", ""),
|
|
355
|
+
"frontend_feature_enablement": feature_enablement,
|
|
356
|
+
"persistence_enabled": api_config.get("persistence_enabled", False),
|
|
357
|
+
"validation_limits": _get_validation_limits(component),
|
|
358
|
+
"tool_config_status": tool_config_status,
|
|
359
|
+
"tts_settings": tts_settings,
|
|
360
|
+
"background_tasks_config": _get_background_tasks_config(component, log_prefix),
|
|
361
|
+
}
|
|
362
|
+
log.debug("%sReturning frontend configuration.", log_prefix)
|
|
363
|
+
return config_data
|
|
364
|
+
except Exception as e:
|
|
365
|
+
log.exception(
|
|
366
|
+
"%sError retrieving configuration for frontend: %s", log_prefix, e
|
|
367
|
+
)
|
|
368
|
+
raise HTTPException(
|
|
369
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
370
|
+
detail="Internal server error retrieving configuration.",
|
|
371
|
+
)
|