solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- 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 +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/app.py +3 -2
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.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/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.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/da0b5bad.b62f7b08.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/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- 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 +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- 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 +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- 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 +23 -19
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- 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 +112 -87
- 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 +87 -64
- 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 +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- 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 +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- 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/a2a/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -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/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
- 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/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- 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 +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- 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.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- 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 +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -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 +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- 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/session_repository.py +177 -11
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- 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/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
- 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 +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- 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/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -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 +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -336
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import logging
|
|
2
4
|
import os
|
|
3
5
|
from pathlib import Path
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
5
6
|
|
|
6
7
|
import httpx
|
|
7
8
|
import sqlalchemy as sa
|
|
8
|
-
from a2a.types import InternalError, JSONRPCError
|
|
9
|
-
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
10
9
|
from alembic import command
|
|
11
10
|
from alembic.config import Config
|
|
12
11
|
from fastapi import FastAPI, HTTPException
|
|
@@ -17,365 +16,47 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
|
17
16
|
from fastapi.responses import JSONResponse
|
|
18
17
|
from starlette.middleware.sessions import SessionMiddleware
|
|
19
18
|
from starlette.staticfiles import StaticFiles
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
20
|
+
|
|
21
|
+
from a2a.types import InternalError, InvalidRequestError, JSONRPCError
|
|
22
|
+
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
20
23
|
|
|
21
24
|
from ...common import a2a
|
|
22
25
|
from ...gateway.http_sse import dependencies
|
|
23
|
-
from ...
|
|
26
|
+
from ...shared.auth.middleware import create_oauth_middleware
|
|
27
|
+
from .routers import (
|
|
24
28
|
agent_cards,
|
|
25
29
|
artifacts,
|
|
26
30
|
auth,
|
|
27
31
|
config,
|
|
32
|
+
feedback,
|
|
28
33
|
people,
|
|
29
34
|
sse,
|
|
30
|
-
|
|
35
|
+
speech,
|
|
36
|
+
version,
|
|
31
37
|
visualization,
|
|
32
|
-
|
|
38
|
+
projects,
|
|
39
|
+
prompts,
|
|
33
40
|
)
|
|
34
41
|
from .routers.sessions import router as session_router
|
|
35
42
|
from .routers.tasks import router as task_router
|
|
36
43
|
from .routers.users import router as user_router
|
|
37
44
|
|
|
45
|
+
|
|
38
46
|
if TYPE_CHECKING:
|
|
39
|
-
from
|
|
47
|
+
from .component import WebUIBackendComponent
|
|
40
48
|
|
|
41
49
|
log = logging.getLogger(__name__)
|
|
42
50
|
|
|
51
|
+
|
|
43
52
|
app = FastAPI(
|
|
44
53
|
title="A2A Web UI Backend",
|
|
45
54
|
version="1.0.0", # Updated to reflect simplified architecture
|
|
46
55
|
description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
|
|
47
56
|
)
|
|
48
57
|
|
|
49
|
-
# Global flag to track if dependencies have been initialized
|
|
50
|
-
_dependencies_initialized = False
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def _extract_access_token(request: FastAPIRequest) -> str:
|
|
54
|
-
auth_header = request.headers.get("Authorization")
|
|
55
|
-
if auth_header and auth_header.startswith("Bearer "):
|
|
56
|
-
return auth_header[7:]
|
|
57
|
-
|
|
58
|
-
try:
|
|
59
|
-
if "access_token" in request.session:
|
|
60
|
-
log.debug("AuthMiddleware: Found token in session.")
|
|
61
|
-
return request.session["access_token"]
|
|
62
|
-
except AssertionError:
|
|
63
|
-
log.debug("AuthMiddleware: Could not access request.session.")
|
|
64
|
-
|
|
65
|
-
if "token" in request.query_params:
|
|
66
|
-
return request.query_params["token"]
|
|
67
|
-
|
|
68
|
-
return None
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
async def _validate_token(
|
|
72
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
73
|
-
) -> bool:
|
|
74
|
-
async with httpx.AsyncClient() as client:
|
|
75
|
-
validation_response = await client.post(
|
|
76
|
-
f"{auth_service_url}/is_token_valid",
|
|
77
|
-
json={"provider": auth_provider},
|
|
78
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
79
|
-
)
|
|
80
|
-
return validation_response.status_code == 200
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
async def _get_user_info(
|
|
84
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
85
|
-
) -> dict:
|
|
86
|
-
async with httpx.AsyncClient() as client:
|
|
87
|
-
userinfo_response = await client.get(
|
|
88
|
-
f"{auth_service_url}/user_info?provider={auth_provider}",
|
|
89
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
if userinfo_response.status_code != 200:
|
|
93
|
-
return None
|
|
94
|
-
|
|
95
|
-
return userinfo_response.json()
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def _extract_user_identifier(user_info: dict) -> str:
|
|
99
|
-
user_identifier = (
|
|
100
|
-
user_info.get("sub")
|
|
101
|
-
or user_info.get("client_id")
|
|
102
|
-
or user_info.get("username")
|
|
103
|
-
or user_info.get("oid")
|
|
104
|
-
or user_info.get("preferred_username")
|
|
105
|
-
or user_info.get("upn")
|
|
106
|
-
or user_info.get("unique_name")
|
|
107
|
-
or user_info.get("email")
|
|
108
|
-
or user_info.get("name")
|
|
109
|
-
or user_info.get("azp")
|
|
110
|
-
or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
if user_identifier and user_identifier.lower() == "unknown":
|
|
114
|
-
log.warning(
|
|
115
|
-
"AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
|
|
116
|
-
)
|
|
117
|
-
return "sam_dev_user"
|
|
118
|
-
|
|
119
|
-
return user_identifier
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
|
|
123
|
-
email_from_auth = (
|
|
124
|
-
user_info.get("email")
|
|
125
|
-
or user_info.get("preferred_username")
|
|
126
|
-
or user_info.get("upn")
|
|
127
|
-
or user_identifier
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
display_name = (
|
|
131
|
-
user_info.get("name")
|
|
132
|
-
or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
|
|
133
|
-
or user_info.get("preferred_username")
|
|
134
|
-
or user_identifier
|
|
135
|
-
).strip()
|
|
136
|
-
|
|
137
|
-
return email_from_auth, display_name
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
async def _create_user_state_without_identity_service(
|
|
141
|
-
user_identifier: str, email_from_auth: str, display_name: str
|
|
142
|
-
) -> dict:
|
|
143
|
-
final_user_id = user_identifier or email_from_auth or "sam_dev_user"
|
|
144
|
-
if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
|
|
145
|
-
final_user_id = "sam_dev_user"
|
|
146
|
-
log.warning(
|
|
147
|
-
"AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
|
|
148
|
-
user_identifier,
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
log.error(
|
|
152
|
-
"AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
|
|
153
|
-
final_user_id,
|
|
154
|
-
)
|
|
155
|
-
return {
|
|
156
|
-
"id": final_user_id,
|
|
157
|
-
"email": email_from_auth or final_user_id,
|
|
158
|
-
"name": display_name or final_user_id,
|
|
159
|
-
"authenticated": True,
|
|
160
|
-
"auth_method": "oidc",
|
|
161
|
-
}
|
|
162
58
|
|
|
163
59
|
|
|
164
|
-
async def _create_user_state_with_identity_service(
|
|
165
|
-
identity_service,
|
|
166
|
-
user_identifier: str,
|
|
167
|
-
email_from_auth: str,
|
|
168
|
-
display_name: str,
|
|
169
|
-
user_info: dict,
|
|
170
|
-
) -> dict:
|
|
171
|
-
lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
|
|
172
|
-
user_profile = await identity_service.get_user_profile(
|
|
173
|
-
{identity_service.lookup_key: lookup_value, "user_info": user_info}
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
if not user_profile:
|
|
177
|
-
return None
|
|
178
|
-
|
|
179
|
-
user_state = user_profile.copy()
|
|
180
|
-
if not user_state.get("id"):
|
|
181
|
-
user_state["id"] = user_identifier
|
|
182
|
-
if not user_state.get("email"):
|
|
183
|
-
user_state["email"] = email_from_auth
|
|
184
|
-
if not user_state.get("name"):
|
|
185
|
-
user_state["name"] = display_name
|
|
186
|
-
user_state["authenticated"] = True
|
|
187
|
-
user_state["auth_method"] = "oidc"
|
|
188
|
-
|
|
189
|
-
return user_state
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
def _create_auth_middleware(component):
|
|
193
|
-
class AuthMiddleware:
|
|
194
|
-
def __init__(self, app, component):
|
|
195
|
-
self.app = app
|
|
196
|
-
self.component = component
|
|
197
|
-
|
|
198
|
-
async def __call__(self, scope, receive, send):
|
|
199
|
-
if scope["type"] != "http":
|
|
200
|
-
await self.app(scope, receive, send)
|
|
201
|
-
return
|
|
202
|
-
|
|
203
|
-
request = FastAPIRequest(scope, receive)
|
|
204
|
-
|
|
205
|
-
if not request.url.path.startswith("/api"):
|
|
206
|
-
await self.app(scope, receive, send)
|
|
207
|
-
return
|
|
208
|
-
|
|
209
|
-
skip_paths = [
|
|
210
|
-
"/api/v1/config",
|
|
211
|
-
"/api/v1/auth/callback",
|
|
212
|
-
"/api/v1/auth/login",
|
|
213
|
-
"/api/v1/auth/refresh",
|
|
214
|
-
"/api/v1/csrf-token",
|
|
215
|
-
"/health",
|
|
216
|
-
]
|
|
217
|
-
|
|
218
|
-
if any(request.url.path.startswith(path) for path in skip_paths):
|
|
219
|
-
await self.app(scope, receive, send)
|
|
220
|
-
return
|
|
221
|
-
|
|
222
|
-
use_auth = dependencies.api_config and dependencies.api_config.get(
|
|
223
|
-
"frontend_use_authorization"
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
if use_auth:
|
|
227
|
-
await self._handle_authenticated_request(request, scope, receive, send)
|
|
228
|
-
else:
|
|
229
|
-
request.state.user = {
|
|
230
|
-
"id": "sam_dev_user",
|
|
231
|
-
"name": "Sam Dev User",
|
|
232
|
-
"email": "sam@dev.local",
|
|
233
|
-
"authenticated": True,
|
|
234
|
-
"auth_method": "development",
|
|
235
|
-
}
|
|
236
|
-
log.debug(
|
|
237
|
-
"AuthMiddleware: Set development user state with id: sam_dev_user"
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
await self.app(scope, receive, send)
|
|
241
|
-
|
|
242
|
-
async def _handle_authenticated_request(self, request, scope, receive, send):
|
|
243
|
-
access_token = _extract_access_token(request)
|
|
244
|
-
|
|
245
|
-
if not access_token:
|
|
246
|
-
log.warning("AuthMiddleware: No access token found. Returning 401.")
|
|
247
|
-
response = JSONResponse(
|
|
248
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
249
|
-
content={
|
|
250
|
-
"detail": "Not authenticated",
|
|
251
|
-
"error_type": "authentication_required",
|
|
252
|
-
},
|
|
253
|
-
)
|
|
254
|
-
await response(scope, receive, send)
|
|
255
|
-
return
|
|
256
|
-
|
|
257
|
-
try:
|
|
258
|
-
auth_service_url = dependencies.api_config.get(
|
|
259
|
-
"external_auth_service_url"
|
|
260
|
-
)
|
|
261
|
-
auth_provider = dependencies.api_config.get("external_auth_provider")
|
|
262
|
-
|
|
263
|
-
if not auth_service_url:
|
|
264
|
-
log.error("Auth service URL not configured.")
|
|
265
|
-
response = JSONResponse(
|
|
266
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
267
|
-
content={"detail": "Auth service not configured"},
|
|
268
|
-
)
|
|
269
|
-
await response(scope, receive, send)
|
|
270
|
-
return
|
|
271
|
-
|
|
272
|
-
if not await _validate_token(
|
|
273
|
-
auth_service_url, auth_provider, access_token
|
|
274
|
-
):
|
|
275
|
-
log.warning("AuthMiddleware: Token validation failed")
|
|
276
|
-
response = JSONResponse(
|
|
277
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
278
|
-
content={
|
|
279
|
-
"detail": "Invalid token",
|
|
280
|
-
"error_type": "invalid_token",
|
|
281
|
-
},
|
|
282
|
-
)
|
|
283
|
-
await response(scope, receive, send)
|
|
284
|
-
return
|
|
285
|
-
|
|
286
|
-
user_info = await _get_user_info(
|
|
287
|
-
auth_service_url, auth_provider, access_token
|
|
288
|
-
)
|
|
289
|
-
if not user_info:
|
|
290
|
-
log.warning(
|
|
291
|
-
"AuthMiddleware: Failed to get user info from external auth service"
|
|
292
|
-
)
|
|
293
|
-
response = JSONResponse(
|
|
294
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
295
|
-
content={
|
|
296
|
-
"detail": "Could not retrieve user info from auth provider",
|
|
297
|
-
"error_type": "user_info_failed",
|
|
298
|
-
},
|
|
299
|
-
)
|
|
300
|
-
await response(scope, receive, send)
|
|
301
|
-
return
|
|
302
|
-
|
|
303
|
-
user_identifier = _extract_user_identifier(user_info)
|
|
304
|
-
if not user_identifier or user_identifier.lower() in [
|
|
305
|
-
"null",
|
|
306
|
-
"none",
|
|
307
|
-
"",
|
|
308
|
-
]:
|
|
309
|
-
log.error(
|
|
310
|
-
"AuthMiddleware: No valid user identifier from OAuth provider"
|
|
311
|
-
)
|
|
312
|
-
response = JSONResponse(
|
|
313
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
314
|
-
content={
|
|
315
|
-
"detail": "OAuth provider returned no valid user identifier",
|
|
316
|
-
"error_type": "invalid_user_identifier_from_provider",
|
|
317
|
-
},
|
|
318
|
-
)
|
|
319
|
-
await response(scope, receive, send)
|
|
320
|
-
return
|
|
321
|
-
|
|
322
|
-
email_from_auth, display_name = _extract_user_details(
|
|
323
|
-
user_info, user_identifier
|
|
324
|
-
)
|
|
325
|
-
|
|
326
|
-
identity_service = self.component.identity_service
|
|
327
|
-
if not identity_service:
|
|
328
|
-
request.state.user = (
|
|
329
|
-
await _create_user_state_without_identity_service(
|
|
330
|
-
user_identifier, email_from_auth, display_name
|
|
331
|
-
)
|
|
332
|
-
)
|
|
333
|
-
else:
|
|
334
|
-
user_state = await _create_user_state_with_identity_service(
|
|
335
|
-
identity_service,
|
|
336
|
-
user_identifier,
|
|
337
|
-
email_from_auth,
|
|
338
|
-
display_name,
|
|
339
|
-
user_info,
|
|
340
|
-
)
|
|
341
|
-
if not user_state:
|
|
342
|
-
log.error(
|
|
343
|
-
"AuthMiddleware: User authenticated but not found in internal IdentityService"
|
|
344
|
-
)
|
|
345
|
-
response = JSONResponse(
|
|
346
|
-
status_code=status.HTTP_403_FORBIDDEN,
|
|
347
|
-
content={
|
|
348
|
-
"detail": "User not authorized for this application",
|
|
349
|
-
"error_type": "not_authorized",
|
|
350
|
-
},
|
|
351
|
-
)
|
|
352
|
-
await response(scope, receive, send)
|
|
353
|
-
return
|
|
354
|
-
request.state.user = user_state
|
|
355
|
-
|
|
356
|
-
except httpx.RequestError as exc:
|
|
357
|
-
log.error("Error calling auth service: %s", exc)
|
|
358
|
-
response = JSONResponse(
|
|
359
|
-
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
360
|
-
content={"detail": "Auth service is unavailable"},
|
|
361
|
-
)
|
|
362
|
-
await response(scope, receive, send)
|
|
363
|
-
return
|
|
364
|
-
except Exception as exc:
|
|
365
|
-
log.error(
|
|
366
|
-
"An unexpected error occurred during token validation: %s", exc
|
|
367
|
-
)
|
|
368
|
-
response = JSONResponse(
|
|
369
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
370
|
-
content={
|
|
371
|
-
"detail": "An internal error occurred during authentication"
|
|
372
|
-
},
|
|
373
|
-
)
|
|
374
|
-
await response(scope, receive, send)
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
return AuthMiddleware
|
|
378
|
-
|
|
379
60
|
|
|
380
61
|
def _setup_alembic_config(database_url: str) -> Config:
|
|
381
62
|
alembic_cfg = Config()
|
|
@@ -395,74 +76,45 @@ def _run_community_migrations(database_url: str) -> None:
|
|
|
395
76
|
try:
|
|
396
77
|
from sqlalchemy import create_engine
|
|
397
78
|
|
|
398
|
-
log.info("Starting community migrations...")
|
|
79
|
+
log.info("[WebUI Gateway] Starting community migrations...")
|
|
399
80
|
engine = create_engine(database_url)
|
|
400
81
|
inspector = sa.inspect(engine)
|
|
401
82
|
existing_tables = inspector.get_table_names()
|
|
402
83
|
|
|
84
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
403
85
|
if not existing_tables or "sessions" not in existing_tables:
|
|
404
|
-
log.info("Running initial
|
|
405
|
-
alembic_cfg = _setup_alembic_config(database_url)
|
|
406
|
-
command.upgrade(alembic_cfg, "head")
|
|
407
|
-
log.info("Community database migrations completed")
|
|
86
|
+
log.info("[WebUI Gateway] Running initial database setup")
|
|
408
87
|
else:
|
|
409
|
-
log.info("Checking for
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
88
|
+
log.info("[WebUI Gateway] Checking for schema updates")
|
|
89
|
+
|
|
90
|
+
command.upgrade(alembic_cfg, "head")
|
|
91
|
+
log.info("[WebUI Gateway] Community migrations completed")
|
|
413
92
|
except Exception as e:
|
|
414
|
-
log.warning(
|
|
415
|
-
"Community migration check failed: %s - attempting to run migrations",
|
|
416
|
-
e,
|
|
417
|
-
)
|
|
93
|
+
log.warning("[WebUI Gateway] Migration check failed: %s - attempting to run migrations", e)
|
|
418
94
|
try:
|
|
419
95
|
alembic_cfg = _setup_alembic_config(database_url)
|
|
420
96
|
command.upgrade(alembic_cfg, "head")
|
|
421
|
-
log.info("Community
|
|
97
|
+
log.info("[WebUI Gateway] Community migrations completed")
|
|
422
98
|
except Exception as migration_error:
|
|
423
|
-
log.error("
|
|
424
|
-
log.error("Check database connectivity and permissions")
|
|
99
|
+
log.error("[WebUI Gateway] Migration failed: %s", migration_error)
|
|
100
|
+
log.error("[WebUI Gateway] Check database connectivity and permissions")
|
|
425
101
|
raise RuntimeError(
|
|
426
102
|
f"Community database migration failed: {migration_error}"
|
|
427
103
|
) from migration_error
|
|
428
104
|
|
|
429
105
|
|
|
430
|
-
def _run_enterprise_migrations(
|
|
431
|
-
component: "WebUIBackendComponent", database_url: str
|
|
432
|
-
) -> None:
|
|
433
|
-
"""
|
|
434
|
-
Run migrations for enterprise features like advanced analytics, audit logs, etc.
|
|
435
|
-
This is optional and only runs if the enterprise package is available.
|
|
436
|
-
"""
|
|
437
|
-
try:
|
|
438
|
-
from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
|
|
439
|
-
run_migrations,
|
|
440
|
-
)
|
|
441
|
-
|
|
442
|
-
webui_app = component.get_app()
|
|
443
|
-
app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
|
|
444
|
-
log.info("Starting enterprise migrations...")
|
|
445
|
-
run_migrations(database_url, app_config)
|
|
446
|
-
log.info("Enterprise migrations completed")
|
|
447
|
-
except (ImportError, ModuleNotFoundError):
|
|
448
|
-
log.debug("Enterprise module not found - skipping enterprise migrations")
|
|
449
|
-
except Exception as e:
|
|
450
|
-
log.error("Enterprise migration failed: %s", e)
|
|
451
|
-
log.error("Advanced features may be unavailable")
|
|
452
|
-
raise RuntimeError(f"Enterprise database migration failed: {e}") from e
|
|
453
106
|
|
|
454
107
|
|
|
455
|
-
def _setup_database(
|
|
108
|
+
def _setup_database(database_url: str) -> None:
|
|
456
109
|
"""
|
|
457
|
-
Initialize database
|
|
458
|
-
|
|
110
|
+
Initialize database and run migrations for WebUI Gateway.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
database_url: Chat database URL (sessions, tasks, feedback)
|
|
459
114
|
"""
|
|
460
115
|
dependencies.init_database(database_url)
|
|
461
|
-
log.info("
|
|
462
|
-
log.info("Running database migrations...")
|
|
463
|
-
|
|
116
|
+
log.info("[WebUI Gateway] Running database migrations...")
|
|
464
117
|
_run_community_migrations(database_url)
|
|
465
|
-
_run_enterprise_migrations(component, database_url)
|
|
466
118
|
|
|
467
119
|
|
|
468
120
|
def _get_app_config(component: "WebUIBackendComponent") -> dict:
|
|
@@ -497,44 +149,24 @@ def _create_api_config(app_config: dict, database_url: str) -> dict:
|
|
|
497
149
|
}
|
|
498
150
|
|
|
499
151
|
|
|
500
|
-
def setup_dependencies(component: "WebUIBackendComponent"
|
|
152
|
+
def setup_dependencies(component: "WebUIBackendComponent"):
|
|
501
153
|
"""
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
If database_url is None, runs in compatibility mode with in-memory sessions.
|
|
154
|
+
Initialize FastAPI dependencies (middleware, routers, static files).
|
|
155
|
+
Database migrations are handled in component.__init__().
|
|
506
156
|
|
|
507
|
-
|
|
157
|
+
Args:
|
|
158
|
+
component: WebUIBackendComponent instance
|
|
508
159
|
"""
|
|
509
|
-
global _dependencies_initialized
|
|
510
|
-
|
|
511
|
-
if _dependencies_initialized:
|
|
512
|
-
log.debug("[setup_dependencies] Dependencies already initialized, skipping")
|
|
513
|
-
return
|
|
514
|
-
|
|
515
160
|
dependencies.set_component_instance(component)
|
|
516
161
|
|
|
517
|
-
if database_url:
|
|
518
|
-
_setup_database(component, database_url)
|
|
519
|
-
else:
|
|
520
|
-
log.warning(
|
|
521
|
-
"No database URL provided - using in-memory session storage (data not persisted across restarts)"
|
|
522
|
-
)
|
|
523
|
-
log.info("This maintains backward compatibility for existing SAM installations")
|
|
524
|
-
|
|
525
162
|
app_config = _get_app_config(component)
|
|
526
|
-
api_config_dict = _create_api_config(app_config, database_url)
|
|
527
|
-
|
|
163
|
+
api_config_dict = _create_api_config(app_config, component.database_url)
|
|
528
164
|
dependencies.set_api_config(api_config_dict)
|
|
529
|
-
log.info("API configuration extracted and stored.")
|
|
530
165
|
|
|
531
166
|
_setup_middleware(component)
|
|
532
167
|
_setup_routers()
|
|
533
168
|
_setup_static_files()
|
|
534
169
|
|
|
535
|
-
_dependencies_initialized = True
|
|
536
|
-
log.info("[setup_dependencies] Dependencies initialization complete")
|
|
537
|
-
|
|
538
170
|
|
|
539
171
|
def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
540
172
|
allowed_origins = component.get_cors_origins()
|
|
@@ -551,9 +183,15 @@ def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
|
551
183
|
app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
|
|
552
184
|
log.info("SessionMiddleware added.")
|
|
553
185
|
|
|
554
|
-
auth_middleware_class =
|
|
186
|
+
auth_middleware_class = create_oauth_middleware(component)
|
|
555
187
|
app.add_middleware(auth_middleware_class, component=component)
|
|
556
|
-
|
|
188
|
+
|
|
189
|
+
api_config = dependencies.get_api_config()
|
|
190
|
+
use_auth = api_config.get("frontend_use_authorization", False) if api_config else False
|
|
191
|
+
if use_auth:
|
|
192
|
+
log.info("OAuth middleware added (real token validation enabled)")
|
|
193
|
+
else:
|
|
194
|
+
log.info("OAuth middleware added (development mode - community/dev user)")
|
|
557
195
|
|
|
558
196
|
|
|
559
197
|
def _setup_routers() -> None:
|
|
@@ -562,8 +200,9 @@ def _setup_routers() -> None:
|
|
|
562
200
|
app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
|
|
563
201
|
app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
|
|
564
202
|
app.include_router(config.router, prefix=api_prefix, tags=["Config"])
|
|
203
|
+
app.include_router(version.router, prefix=api_prefix, tags=["Version"])
|
|
565
204
|
app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
|
|
566
|
-
app.include_router(
|
|
205
|
+
app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
|
|
567
206
|
app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
|
|
568
207
|
app.include_router(
|
|
569
208
|
artifacts.router, prefix=f"{api_prefix}/artifacts", tags=["Artifacts"]
|
|
@@ -575,38 +214,17 @@ def _setup_routers() -> None:
|
|
|
575
214
|
)
|
|
576
215
|
app.include_router(people.router, prefix=api_prefix, tags=["People"])
|
|
577
216
|
app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
|
|
217
|
+
app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
|
|
578
218
|
app.include_router(feedback.router, prefix=api_prefix, tags=["Feedback"])
|
|
219
|
+
app.include_router(prompts.router, prefix=f"{api_prefix}/prompts", tags=["Prompts"])
|
|
220
|
+
app.include_router(speech.router, prefix=f"{api_prefix}/speech", tags=["Speech"])
|
|
579
221
|
log.info("Legacy routers mounted for endpoints not yet migrated")
|
|
580
222
|
|
|
581
|
-
# Register shared exception handlers
|
|
582
|
-
from .shared.exception_handlers import register_exception_handlers
|
|
223
|
+
# Register shared exception handlers
|
|
224
|
+
from solace_agent_mesh.shared.exceptions.exception_handlers import register_exception_handlers
|
|
583
225
|
|
|
584
226
|
register_exception_handlers(app)
|
|
585
|
-
log.info("Registered shared exception handlers
|
|
586
|
-
|
|
587
|
-
# Mount enterprise routers if available
|
|
588
|
-
try:
|
|
589
|
-
from solace_agent_mesh_enterprise.webui_backend.routers import (
|
|
590
|
-
get_enterprise_routers,
|
|
591
|
-
)
|
|
592
|
-
|
|
593
|
-
enterprise_routers = get_enterprise_routers()
|
|
594
|
-
for router_config in enterprise_routers:
|
|
595
|
-
app.include_router(
|
|
596
|
-
router_config["router"],
|
|
597
|
-
prefix=router_config["prefix"],
|
|
598
|
-
tags=router_config["tags"],
|
|
599
|
-
)
|
|
600
|
-
log.info("Mounted %d enterprise routers", len(enterprise_routers))
|
|
601
|
-
|
|
602
|
-
except ImportError:
|
|
603
|
-
log.debug("No enterprise package detected - skipping enterprise routers")
|
|
604
|
-
except ModuleNotFoundError:
|
|
605
|
-
log.debug(
|
|
606
|
-
"Enterprise module not found - skipping enterprise routers and exception handlers"
|
|
607
|
-
)
|
|
608
|
-
except Exception as e:
|
|
609
|
-
log.warning("Failed to load enterprise routers and exception handlers: %s", e)
|
|
227
|
+
log.info("Registered shared exception handlers")
|
|
610
228
|
|
|
611
229
|
|
|
612
230
|
def _setup_static_files() -> None:
|
|
@@ -619,18 +237,18 @@ def _setup_static_files() -> None:
|
|
|
619
237
|
"Static files directory '%s' not found. Frontend may not be served.",
|
|
620
238
|
static_files_dir,
|
|
621
239
|
)
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
240
|
+
# try to mount static files directory anyways, might work for enterprise
|
|
241
|
+
try:
|
|
242
|
+
app.mount(
|
|
243
|
+
"/", StaticFiles(directory=static_files_dir, html=True), name="static"
|
|
244
|
+
)
|
|
245
|
+
log.info("Mounted static files directory '%s' at '/'", static_files_dir)
|
|
246
|
+
except Exception as static_mount_err:
|
|
247
|
+
log.error(
|
|
248
|
+
"Failed to mount static files directory '%s': %s",
|
|
249
|
+
static_files_dir,
|
|
250
|
+
static_mount_err,
|
|
251
|
+
)
|
|
634
252
|
|
|
635
253
|
|
|
636
254
|
@app.exception_handler(HTTPException)
|
|
@@ -738,4 +356,4 @@ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
|
|
|
738
356
|
async def read_root():
|
|
739
357
|
"""Basic health check endpoint."""
|
|
740
358
|
log.debug("Health check endpoint '/health' called")
|
|
741
|
-
return {"status": "A2A Web UI Backend is running"}
|
|
359
|
+
return {"status": "A2A Web UI Backend is running"}
|
|
@@ -3,10 +3,20 @@ Repository layer containing all data access logic organized by entity type.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
# Interfaces
|
|
6
|
-
from .interfaces import
|
|
6
|
+
from .interfaces import (
|
|
7
|
+
IChatTaskRepository,
|
|
8
|
+
IFeedbackRepository,
|
|
9
|
+
IProjectRepository,
|
|
10
|
+
ISessionRepository,
|
|
11
|
+
ITaskRepository,
|
|
12
|
+
)
|
|
7
13
|
|
|
8
14
|
# Implementations
|
|
15
|
+
from .chat_task_repository import ChatTaskRepository
|
|
16
|
+
from .feedback_repository import FeedbackRepository
|
|
17
|
+
from .project_repository import ProjectRepository
|
|
9
18
|
from .session_repository import SessionRepository
|
|
19
|
+
from .task_repository import TaskRepository
|
|
10
20
|
|
|
11
21
|
# Entities (re-exported for convenience)
|
|
12
22
|
from .entities.session import Session
|
|
@@ -17,9 +27,17 @@ from .models.session_model import SessionModel
|
|
|
17
27
|
|
|
18
28
|
__all__ = [
|
|
19
29
|
# Interfaces
|
|
30
|
+
"IChatTaskRepository",
|
|
31
|
+
"IFeedbackRepository",
|
|
32
|
+
"IProjectRepository",
|
|
20
33
|
"ISessionRepository",
|
|
34
|
+
"ITaskRepository",
|
|
21
35
|
# Implementations
|
|
36
|
+
"ChatTaskRepository",
|
|
37
|
+
"FeedbackRepository",
|
|
38
|
+
"ProjectRepository",
|
|
22
39
|
"SessionRepository",
|
|
40
|
+
"TaskRepository",
|
|
23
41
|
# Entities
|
|
24
42
|
"Session",
|
|
25
43
|
# Models
|