solace-agent-mesh 1.7.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/artifacts/filesystem_artifact_service.py +164 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +752 -127
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
- 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 +34 -16
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +41 -1
- solace_agent_mesh/agent/adk/setup.py +220 -32
- solace_agent_mesh/agent/adk/stream_parser.py +229 -40
- solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
- 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/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +37 -12
- solace_agent_mesh/agent/sac/component.py +322 -52
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
- 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 +698 -24
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -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 +54 -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 +243 -5
- 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/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/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.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/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/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/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/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 +75 -75
- 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 +98 -112
- 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 -28
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
- 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 +67 -53
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
- 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 +87 -87
- 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 +50 -23
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
- 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 +96 -66
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
- 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 -38
- 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 +135 -114
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
- 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 +112 -112
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
- 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/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-tcIFZLis.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-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
- 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/types.py +1 -1
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +124 -0
- 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 +73 -1
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
- solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
- solace_agent_mesh/common/utils/embeds/types.py +1 -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/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/base.py +28 -1
- solace_agent_mesh/gateway/adapter/types.py +9 -0
- solace_agent_mesh/gateway/base/app.py +10 -0
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +451 -10
- solace_agent_mesh/gateway/generic/component.py +274 -30
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
- 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 +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +158 -73
- solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
- solace_agent_mesh/gateway/http_sse/main.py +58 -482
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -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 +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
- 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 +113 -7
- solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
- 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/session_requests.py +1 -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 +1 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
- 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 +2 -1
- 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 +539 -12
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
- 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 +1 -1
- 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.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
- 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 -189
- solace_agent_mesh/agent/agent_llm.txt +0 -369
- 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/proxies/a2a/a2a_llm.txt +0 -190
- solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
- solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
- 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 -58
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.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.e4870a49.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.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.09ed9234.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.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
- solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1762283454666.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-CRYdKo2Q.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
- solace_agent_mesh/common/common_llm.txt +0 -230
- 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 -81
- solace_agent_mesh/common/services/services_llm.txt +0 -368
- 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 -335
- 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 -226
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -369
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
- 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 -221
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
- 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/assets/docs/assets/js/{main.f213fe0c.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.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,17 +1,11 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import logging
|
|
2
4
|
import os
|
|
3
5
|
from pathlib import Path
|
|
4
6
|
|
|
5
7
|
import httpx
|
|
6
8
|
import sqlalchemy as sa
|
|
7
|
-
from fastapi import FastAPI, HTTPException
|
|
8
|
-
from fastapi import Request as FastAPIRequest
|
|
9
|
-
from fastapi import status
|
|
10
|
-
from typing import TYPE_CHECKING
|
|
11
|
-
|
|
12
|
-
import sqlalchemy as sa
|
|
13
|
-
from a2a.types import InternalError, JSONRPCError
|
|
14
|
-
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
15
9
|
from alembic import command
|
|
16
10
|
from alembic.config import Config
|
|
17
11
|
from fastapi import FastAPI, HTTPException
|
|
@@ -22,12 +16,14 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
|
22
16
|
from fastapi.responses import JSONResponse
|
|
23
17
|
from starlette.middleware.sessions import SessionMiddleware
|
|
24
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
|
|
25
23
|
|
|
26
|
-
from .routers.sessions import router as session_router
|
|
27
|
-
from .routers.tasks import router as task_router
|
|
28
|
-
from .routers.users import router as user_router
|
|
29
24
|
from ...common import a2a
|
|
30
25
|
from ...gateway.http_sse import dependencies
|
|
26
|
+
from ...shared.auth.middleware import create_oauth_middleware
|
|
31
27
|
from .routers import (
|
|
32
28
|
agent_cards,
|
|
33
29
|
artifacts,
|
|
@@ -36,363 +32,30 @@ from .routers import (
|
|
|
36
32
|
feedback,
|
|
37
33
|
people,
|
|
38
34
|
sse,
|
|
35
|
+
speech,
|
|
36
|
+
version,
|
|
39
37
|
visualization,
|
|
40
38
|
projects,
|
|
39
|
+
prompts,
|
|
41
40
|
)
|
|
42
41
|
from .routers.sessions import router as session_router
|
|
43
42
|
from .routers.tasks import router as task_router
|
|
44
43
|
from .routers.users import router as user_router
|
|
45
44
|
|
|
46
|
-
from alembic import command
|
|
47
|
-
from alembic.config import Config
|
|
48
|
-
|
|
49
|
-
from a2a.types import InternalError, InvalidRequestError, JSONRPCError
|
|
50
|
-
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
51
|
-
from ...common import a2a
|
|
52
|
-
from ...gateway.http_sse import dependencies
|
|
53
|
-
|
|
54
45
|
|
|
55
46
|
if TYPE_CHECKING:
|
|
56
|
-
from
|
|
47
|
+
from .component import WebUIBackendComponent
|
|
57
48
|
|
|
58
49
|
log = logging.getLogger(__name__)
|
|
59
50
|
|
|
51
|
+
|
|
60
52
|
app = FastAPI(
|
|
61
53
|
title="A2A Web UI Backend",
|
|
62
54
|
version="1.0.0", # Updated to reflect simplified architecture
|
|
63
55
|
description="Backend API and SSE server for the A2A Web UI, hosted by Solace AI Connector.",
|
|
64
56
|
)
|
|
65
57
|
|
|
66
|
-
# Global flag to track if dependencies have been initialized
|
|
67
|
-
_dependencies_initialized = False
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _extract_access_token(request: FastAPIRequest) -> str:
|
|
71
|
-
auth_header = request.headers.get("Authorization")
|
|
72
|
-
if auth_header and auth_header.startswith("Bearer "):
|
|
73
|
-
return auth_header[7:]
|
|
74
|
-
|
|
75
|
-
try:
|
|
76
|
-
if "access_token" in request.session:
|
|
77
|
-
log.debug("AuthMiddleware: Found token in session.")
|
|
78
|
-
return request.session["access_token"]
|
|
79
|
-
except AssertionError:
|
|
80
|
-
log.debug("AuthMiddleware: Could not access request.session.")
|
|
81
|
-
|
|
82
|
-
if "token" in request.query_params:
|
|
83
|
-
return request.query_params["token"]
|
|
84
|
-
|
|
85
|
-
return None
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
async def _validate_token(
|
|
89
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
90
|
-
) -> bool:
|
|
91
|
-
async with httpx.AsyncClient() as client:
|
|
92
|
-
validation_response = await client.post(
|
|
93
|
-
f"{auth_service_url}/is_token_valid",
|
|
94
|
-
json={"provider": auth_provider},
|
|
95
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
96
|
-
)
|
|
97
|
-
return validation_response.status_code == 200
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
async def _get_user_info(
|
|
101
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
102
|
-
) -> dict:
|
|
103
|
-
async with httpx.AsyncClient() as client:
|
|
104
|
-
userinfo_response = await client.get(
|
|
105
|
-
f"{auth_service_url}/user_info?provider={auth_provider}",
|
|
106
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
if userinfo_response.status_code != 200:
|
|
110
|
-
return None
|
|
111
|
-
|
|
112
|
-
return userinfo_response.json()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def _extract_user_identifier(user_info: dict) -> str:
|
|
116
|
-
user_identifier = (
|
|
117
|
-
user_info.get("sub")
|
|
118
|
-
or user_info.get("client_id")
|
|
119
|
-
or user_info.get("username")
|
|
120
|
-
or user_info.get("oid")
|
|
121
|
-
or user_info.get("preferred_username")
|
|
122
|
-
or user_info.get("upn")
|
|
123
|
-
or user_info.get("unique_name")
|
|
124
|
-
or user_info.get("email")
|
|
125
|
-
or user_info.get("name")
|
|
126
|
-
or user_info.get("azp")
|
|
127
|
-
or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
if user_identifier and user_identifier.lower() == "unknown":
|
|
131
|
-
log.warning(
|
|
132
|
-
"AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
|
|
133
|
-
)
|
|
134
|
-
return "sam_dev_user"
|
|
135
|
-
|
|
136
|
-
return user_identifier
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
|
|
140
|
-
email_from_auth = (
|
|
141
|
-
user_info.get("email")
|
|
142
|
-
or user_info.get("preferred_username")
|
|
143
|
-
or user_info.get("upn")
|
|
144
|
-
or user_identifier
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
display_name = (
|
|
148
|
-
user_info.get("name")
|
|
149
|
-
or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
|
|
150
|
-
or user_info.get("preferred_username")
|
|
151
|
-
or user_identifier
|
|
152
|
-
).strip()
|
|
153
|
-
|
|
154
|
-
return email_from_auth, display_name
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
async def _create_user_state_without_identity_service(
|
|
158
|
-
user_identifier: str, email_from_auth: str, display_name: str
|
|
159
|
-
) -> dict:
|
|
160
|
-
final_user_id = user_identifier or email_from_auth or "sam_dev_user"
|
|
161
|
-
if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
|
|
162
|
-
final_user_id = "sam_dev_user"
|
|
163
|
-
log.warning(
|
|
164
|
-
"AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
|
|
165
|
-
user_identifier,
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
log.error(
|
|
169
|
-
"AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
|
|
170
|
-
final_user_id,
|
|
171
|
-
)
|
|
172
|
-
return {
|
|
173
|
-
"id": final_user_id,
|
|
174
|
-
"email": email_from_auth or final_user_id,
|
|
175
|
-
"name": display_name or final_user_id,
|
|
176
|
-
"authenticated": True,
|
|
177
|
-
"auth_method": "oidc",
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
async def _create_user_state_with_identity_service(
|
|
182
|
-
identity_service,
|
|
183
|
-
user_identifier: str,
|
|
184
|
-
email_from_auth: str,
|
|
185
|
-
display_name: str,
|
|
186
|
-
user_info: dict,
|
|
187
|
-
) -> dict:
|
|
188
|
-
lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
|
|
189
|
-
user_profile = await identity_service.get_user_profile(
|
|
190
|
-
{identity_service.lookup_key: lookup_value, "user_info": user_info}
|
|
191
|
-
)
|
|
192
58
|
|
|
193
|
-
if not user_profile:
|
|
194
|
-
return None
|
|
195
|
-
|
|
196
|
-
user_state = user_profile.copy()
|
|
197
|
-
if not user_state.get("id"):
|
|
198
|
-
user_state["id"] = user_identifier
|
|
199
|
-
if not user_state.get("email"):
|
|
200
|
-
user_state["email"] = email_from_auth
|
|
201
|
-
if not user_state.get("name"):
|
|
202
|
-
user_state["name"] = display_name
|
|
203
|
-
user_state["authenticated"] = True
|
|
204
|
-
user_state["auth_method"] = "oidc"
|
|
205
|
-
|
|
206
|
-
return user_state
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
def _create_auth_middleware(component):
|
|
210
|
-
class AuthMiddleware:
|
|
211
|
-
def __init__(self, app, component):
|
|
212
|
-
self.app = app
|
|
213
|
-
self.component = component
|
|
214
|
-
|
|
215
|
-
async def __call__(self, scope, receive, send):
|
|
216
|
-
if scope["type"] != "http":
|
|
217
|
-
await self.app(scope, receive, send)
|
|
218
|
-
return
|
|
219
|
-
|
|
220
|
-
request = FastAPIRequest(scope, receive)
|
|
221
|
-
|
|
222
|
-
if not request.url.path.startswith("/api"):
|
|
223
|
-
await self.app(scope, receive, send)
|
|
224
|
-
return
|
|
225
|
-
|
|
226
|
-
skip_paths = [
|
|
227
|
-
"/api/v1/config",
|
|
228
|
-
"/api/v1/auth/callback",
|
|
229
|
-
"/api/v1/auth/tool/callback",
|
|
230
|
-
"/api/v1/auth/login",
|
|
231
|
-
"/api/v1/auth/refresh",
|
|
232
|
-
"/api/v1/csrf-token",
|
|
233
|
-
"/health",
|
|
234
|
-
]
|
|
235
|
-
|
|
236
|
-
if any(request.url.path.startswith(path) for path in skip_paths):
|
|
237
|
-
await self.app(scope, receive, send)
|
|
238
|
-
return
|
|
239
|
-
|
|
240
|
-
use_auth = dependencies.api_config and dependencies.api_config.get(
|
|
241
|
-
"frontend_use_authorization"
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
if use_auth:
|
|
245
|
-
await self._handle_authenticated_request(request, scope, receive, send)
|
|
246
|
-
else:
|
|
247
|
-
request.state.user = {
|
|
248
|
-
"id": "sam_dev_user",
|
|
249
|
-
"name": "Sam Dev User",
|
|
250
|
-
"email": "sam@dev.local",
|
|
251
|
-
"authenticated": True,
|
|
252
|
-
"auth_method": "development",
|
|
253
|
-
}
|
|
254
|
-
log.debug(
|
|
255
|
-
"AuthMiddleware: Set development user state with id: sam_dev_user"
|
|
256
|
-
)
|
|
257
|
-
|
|
258
|
-
await self.app(scope, receive, send)
|
|
259
|
-
|
|
260
|
-
async def _handle_authenticated_request(self, request, scope, receive, send):
|
|
261
|
-
access_token = _extract_access_token(request)
|
|
262
|
-
|
|
263
|
-
if not access_token:
|
|
264
|
-
log.warning("AuthMiddleware: No access token found. Returning 401.")
|
|
265
|
-
response = JSONResponse(
|
|
266
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
267
|
-
content={
|
|
268
|
-
"detail": "Not authenticated",
|
|
269
|
-
"error_type": "authentication_required",
|
|
270
|
-
},
|
|
271
|
-
)
|
|
272
|
-
await response(scope, receive, send)
|
|
273
|
-
return
|
|
274
|
-
|
|
275
|
-
try:
|
|
276
|
-
auth_service_url = dependencies.api_config.get(
|
|
277
|
-
"external_auth_service_url"
|
|
278
|
-
)
|
|
279
|
-
auth_provider = dependencies.api_config.get("external_auth_provider")
|
|
280
|
-
|
|
281
|
-
if not auth_service_url:
|
|
282
|
-
log.error("Auth service URL not configured.")
|
|
283
|
-
response = JSONResponse(
|
|
284
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
285
|
-
content={"detail": "Auth service not configured"},
|
|
286
|
-
)
|
|
287
|
-
await response(scope, receive, send)
|
|
288
|
-
return
|
|
289
|
-
|
|
290
|
-
if not await _validate_token(
|
|
291
|
-
auth_service_url, auth_provider, access_token
|
|
292
|
-
):
|
|
293
|
-
log.warning("AuthMiddleware: Token validation failed")
|
|
294
|
-
response = JSONResponse(
|
|
295
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
296
|
-
content={
|
|
297
|
-
"detail": "Invalid token",
|
|
298
|
-
"error_type": "invalid_token",
|
|
299
|
-
},
|
|
300
|
-
)
|
|
301
|
-
await response(scope, receive, send)
|
|
302
|
-
return
|
|
303
|
-
|
|
304
|
-
user_info = await _get_user_info(
|
|
305
|
-
auth_service_url, auth_provider, access_token
|
|
306
|
-
)
|
|
307
|
-
if not user_info:
|
|
308
|
-
log.warning(
|
|
309
|
-
"AuthMiddleware: Failed to get user info from external auth service"
|
|
310
|
-
)
|
|
311
|
-
response = JSONResponse(
|
|
312
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
313
|
-
content={
|
|
314
|
-
"detail": "Could not retrieve user info from auth provider",
|
|
315
|
-
"error_type": "user_info_failed",
|
|
316
|
-
},
|
|
317
|
-
)
|
|
318
|
-
await response(scope, receive, send)
|
|
319
|
-
return
|
|
320
|
-
|
|
321
|
-
user_identifier = _extract_user_identifier(user_info)
|
|
322
|
-
if not user_identifier or user_identifier.lower() in [
|
|
323
|
-
"null",
|
|
324
|
-
"none",
|
|
325
|
-
"",
|
|
326
|
-
]:
|
|
327
|
-
log.error(
|
|
328
|
-
"AuthMiddleware: No valid user identifier from OAuth provider"
|
|
329
|
-
)
|
|
330
|
-
response = JSONResponse(
|
|
331
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
332
|
-
content={
|
|
333
|
-
"detail": "OAuth provider returned no valid user identifier",
|
|
334
|
-
"error_type": "invalid_user_identifier_from_provider",
|
|
335
|
-
},
|
|
336
|
-
)
|
|
337
|
-
await response(scope, receive, send)
|
|
338
|
-
return
|
|
339
|
-
|
|
340
|
-
email_from_auth, display_name = _extract_user_details(
|
|
341
|
-
user_info, user_identifier
|
|
342
|
-
)
|
|
343
|
-
|
|
344
|
-
identity_service = self.component.identity_service
|
|
345
|
-
if not identity_service:
|
|
346
|
-
request.state.user = (
|
|
347
|
-
await _create_user_state_without_identity_service(
|
|
348
|
-
user_identifier, email_from_auth, display_name
|
|
349
|
-
)
|
|
350
|
-
)
|
|
351
|
-
else:
|
|
352
|
-
user_state = await _create_user_state_with_identity_service(
|
|
353
|
-
identity_service,
|
|
354
|
-
user_identifier,
|
|
355
|
-
email_from_auth,
|
|
356
|
-
display_name,
|
|
357
|
-
user_info,
|
|
358
|
-
)
|
|
359
|
-
if not user_state:
|
|
360
|
-
log.error(
|
|
361
|
-
"AuthMiddleware: User authenticated but not found in internal IdentityService"
|
|
362
|
-
)
|
|
363
|
-
response = JSONResponse(
|
|
364
|
-
status_code=status.HTTP_403_FORBIDDEN,
|
|
365
|
-
content={
|
|
366
|
-
"detail": "User not authorized for this application",
|
|
367
|
-
"error_type": "not_authorized",
|
|
368
|
-
},
|
|
369
|
-
)
|
|
370
|
-
await response(scope, receive, send)
|
|
371
|
-
return
|
|
372
|
-
request.state.user = user_state
|
|
373
|
-
|
|
374
|
-
except httpx.RequestError as exc:
|
|
375
|
-
log.error("Error calling auth service: %s", exc)
|
|
376
|
-
response = JSONResponse(
|
|
377
|
-
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
378
|
-
content={"detail": "Auth service is unavailable"},
|
|
379
|
-
)
|
|
380
|
-
await response(scope, receive, send)
|
|
381
|
-
return
|
|
382
|
-
except Exception as exc:
|
|
383
|
-
log.error(
|
|
384
|
-
"An unexpected error occurred during token validation: %s", exc
|
|
385
|
-
)
|
|
386
|
-
response = JSONResponse(
|
|
387
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
388
|
-
content={
|
|
389
|
-
"detail": "An internal error occurred during authentication"
|
|
390
|
-
},
|
|
391
|
-
)
|
|
392
|
-
await response(scope, receive, send)
|
|
393
|
-
return
|
|
394
|
-
|
|
395
|
-
return AuthMiddleware
|
|
396
59
|
|
|
397
60
|
|
|
398
61
|
def _setup_alembic_config(database_url: str) -> Config:
|
|
@@ -413,90 +76,46 @@ def _run_community_migrations(database_url: str) -> None:
|
|
|
413
76
|
try:
|
|
414
77
|
from sqlalchemy import create_engine
|
|
415
78
|
|
|
416
|
-
log.info("Starting community migrations...")
|
|
79
|
+
log.info("[WebUI Gateway] Starting community migrations...")
|
|
417
80
|
engine = create_engine(database_url)
|
|
418
81
|
inspector = sa.inspect(engine)
|
|
419
82
|
existing_tables = inspector.get_table_names()
|
|
420
83
|
|
|
84
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
421
85
|
if not existing_tables or "sessions" not in existing_tables:
|
|
422
|
-
log.info("Running initial
|
|
423
|
-
alembic_cfg = _setup_alembic_config(database_url)
|
|
424
|
-
command.upgrade(alembic_cfg, "head")
|
|
425
|
-
log.info("Community database migrations completed")
|
|
86
|
+
log.info("[WebUI Gateway] Running initial database setup")
|
|
426
87
|
else:
|
|
427
|
-
log.info("Checking for
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
88
|
+
log.info("[WebUI Gateway] Checking for schema updates")
|
|
89
|
+
|
|
90
|
+
command.upgrade(alembic_cfg, "head")
|
|
91
|
+
log.info("[WebUI Gateway] Community migrations completed")
|
|
431
92
|
except Exception as e:
|
|
432
|
-
log.warning(
|
|
433
|
-
"Community migration check failed: %s - attempting to run migrations",
|
|
434
|
-
e,
|
|
435
|
-
)
|
|
93
|
+
log.warning("[WebUI Gateway] Migration check failed: %s - attempting to run migrations", e)
|
|
436
94
|
try:
|
|
437
95
|
alembic_cfg = _setup_alembic_config(database_url)
|
|
438
96
|
command.upgrade(alembic_cfg, "head")
|
|
439
|
-
log.info("Community
|
|
97
|
+
log.info("[WebUI Gateway] Community migrations completed")
|
|
440
98
|
except Exception as migration_error:
|
|
441
|
-
log.error("
|
|
442
|
-
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")
|
|
443
101
|
raise RuntimeError(
|
|
444
102
|
f"Community database migration failed: {migration_error}"
|
|
445
103
|
) from migration_error
|
|
446
104
|
|
|
447
105
|
|
|
448
|
-
def _run_enterprise_migrations(
|
|
449
|
-
component: "WebUIBackendComponent", database_url: str
|
|
450
|
-
) -> None:
|
|
451
|
-
"""
|
|
452
|
-
Run migrations for enterprise features like advanced analytics, audit logs, etc.
|
|
453
|
-
This is optional and only runs if the enterprise package is available.
|
|
454
|
-
"""
|
|
455
|
-
try:
|
|
456
|
-
from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
|
|
457
|
-
run_migrations,
|
|
458
|
-
)
|
|
459
|
-
|
|
460
|
-
webui_app = component.get_app()
|
|
461
|
-
app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
|
|
462
|
-
log.info("Starting enterprise migrations...")
|
|
463
|
-
run_migrations(database_url, app_config)
|
|
464
|
-
log.info("Enterprise migrations completed")
|
|
465
|
-
except (ImportError, ModuleNotFoundError):
|
|
466
|
-
log.debug("Enterprise module not found - skipping enterprise migrations")
|
|
467
|
-
except Exception as e:
|
|
468
|
-
log.error("Enterprise migration failed: %s", e)
|
|
469
|
-
log.error("Advanced features may be unavailable")
|
|
470
|
-
raise RuntimeError(f"Enterprise database migration failed: {e}") from e
|
|
471
106
|
|
|
472
107
|
|
|
473
|
-
def _setup_database(
|
|
474
|
-
component: "WebUIBackendComponent",
|
|
475
|
-
database_url: str,
|
|
476
|
-
platform_database_url: str = None
|
|
477
|
-
) -> None:
|
|
108
|
+
def _setup_database(database_url: str) -> None:
|
|
478
109
|
"""
|
|
479
|
-
Initialize database
|
|
480
|
-
Sets up both runtime and platform database schemas.
|
|
110
|
+
Initialize database and run migrations for WebUI Gateway.
|
|
481
111
|
|
|
482
112
|
Args:
|
|
483
|
-
|
|
484
|
-
database_url: Runtime database URL (sessions, tasks, chat) - REQUIRED
|
|
485
|
-
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
486
|
-
If None, platform features will be unavailable.
|
|
113
|
+
database_url: Chat database URL (sessions, tasks, feedback)
|
|
487
114
|
"""
|
|
488
115
|
dependencies.init_database(database_url)
|
|
489
|
-
log.info("
|
|
490
|
-
log.info("Running database migrations...")
|
|
491
|
-
|
|
116
|
+
log.info("[WebUI Gateway] Running database migrations...")
|
|
492
117
|
_run_community_migrations(database_url)
|
|
493
118
|
|
|
494
|
-
if platform_database_url:
|
|
495
|
-
log.info("Platform database configured - running migrations")
|
|
496
|
-
_run_enterprise_migrations(component, platform_database_url)
|
|
497
|
-
else:
|
|
498
|
-
log.info("No platform database configured - skipping platform migrations")
|
|
499
|
-
|
|
500
119
|
|
|
501
120
|
def _get_app_config(component: "WebUIBackendComponent") -> dict:
|
|
502
121
|
webui_app = component.get_app()
|
|
@@ -530,52 +149,24 @@ def _create_api_config(app_config: dict, database_url: str) -> dict:
|
|
|
530
149
|
}
|
|
531
150
|
|
|
532
151
|
|
|
533
|
-
def setup_dependencies(
|
|
534
|
-
component: "WebUIBackendComponent",
|
|
535
|
-
database_url: str = None,
|
|
536
|
-
platform_database_url: str = None
|
|
537
|
-
):
|
|
152
|
+
def setup_dependencies(component: "WebUIBackendComponent"):
|
|
538
153
|
"""
|
|
539
|
-
Initialize dependencies
|
|
154
|
+
Initialize FastAPI dependencies (middleware, routers, static files).
|
|
155
|
+
Database migrations are handled in component.__init__().
|
|
540
156
|
|
|
541
157
|
Args:
|
|
542
158
|
component: WebUIBackendComponent instance
|
|
543
|
-
database_url: Runtime database URL (sessions, tasks, chat).
|
|
544
|
-
If None, runs in compatibility mode with in-memory sessions.
|
|
545
|
-
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
546
|
-
If None, platform features will be unavailable (returns 501).
|
|
547
|
-
|
|
548
|
-
This function is idempotent and safe to call multiple times.
|
|
549
159
|
"""
|
|
550
|
-
global _dependencies_initialized
|
|
551
|
-
|
|
552
|
-
if _dependencies_initialized:
|
|
553
|
-
log.debug("[setup_dependencies] Dependencies already initialized, skipping")
|
|
554
|
-
return
|
|
555
|
-
|
|
556
160
|
dependencies.set_component_instance(component)
|
|
557
161
|
|
|
558
|
-
if database_url:
|
|
559
|
-
_setup_database(component, database_url, platform_database_url)
|
|
560
|
-
else:
|
|
561
|
-
log.warning(
|
|
562
|
-
"No database URL provided - using in-memory session storage (data not persisted across restarts)"
|
|
563
|
-
)
|
|
564
|
-
log.info("This maintains backward compatibility for existing SAM installations")
|
|
565
|
-
|
|
566
162
|
app_config = _get_app_config(component)
|
|
567
|
-
api_config_dict = _create_api_config(app_config, database_url)
|
|
568
|
-
|
|
163
|
+
api_config_dict = _create_api_config(app_config, component.database_url)
|
|
569
164
|
dependencies.set_api_config(api_config_dict)
|
|
570
|
-
log.debug("API configuration extracted and stored.")
|
|
571
165
|
|
|
572
166
|
_setup_middleware(component)
|
|
573
167
|
_setup_routers()
|
|
574
168
|
_setup_static_files()
|
|
575
169
|
|
|
576
|
-
_dependencies_initialized = True
|
|
577
|
-
log.debug("[setup_dependencies] Dependencies initialization complete")
|
|
578
|
-
|
|
579
170
|
|
|
580
171
|
def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
581
172
|
allowed_origins = component.get_cors_origins()
|
|
@@ -592,9 +183,15 @@ def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
|
592
183
|
app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
|
|
593
184
|
log.info("SessionMiddleware added.")
|
|
594
185
|
|
|
595
|
-
auth_middleware_class =
|
|
186
|
+
auth_middleware_class = create_oauth_middleware(component)
|
|
596
187
|
app.add_middleware(auth_middleware_class, component=component)
|
|
597
|
-
|
|
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)")
|
|
598
195
|
|
|
599
196
|
|
|
600
197
|
def _setup_routers() -> None:
|
|
@@ -603,6 +200,7 @@ def _setup_routers() -> None:
|
|
|
603
200
|
app.include_router(session_router, prefix=api_prefix, tags=["Sessions"])
|
|
604
201
|
app.include_router(user_router, prefix=f"{api_prefix}/users", tags=["Users"])
|
|
605
202
|
app.include_router(config.router, prefix=api_prefix, tags=["Config"])
|
|
203
|
+
app.include_router(version.router, prefix=api_prefix, tags=["Version"])
|
|
606
204
|
app.include_router(agent_cards.router, prefix=api_prefix, tags=["Agent Cards"])
|
|
607
205
|
app.include_router(task_router, prefix=api_prefix, tags=["Tasks"])
|
|
608
206
|
app.include_router(sse.router, prefix=f"{api_prefix}/sse", tags=["SSE"])
|
|
@@ -618,37 +216,15 @@ def _setup_routers() -> None:
|
|
|
618
216
|
app.include_router(auth.router, prefix=api_prefix, tags=["Auth"])
|
|
619
217
|
app.include_router(projects.router, prefix=api_prefix, tags=["Projects"])
|
|
620
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"])
|
|
621
221
|
log.info("Legacy routers mounted for endpoints not yet migrated")
|
|
622
222
|
|
|
623
|
-
# Register shared exception handlers
|
|
624
|
-
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
|
|
625
225
|
|
|
626
226
|
register_exception_handlers(app)
|
|
627
|
-
log.info("Registered shared exception handlers
|
|
628
|
-
|
|
629
|
-
# Mount enterprise routers if available
|
|
630
|
-
try:
|
|
631
|
-
from solace_agent_mesh_enterprise.webui_backend.routers import (
|
|
632
|
-
get_enterprise_routers,
|
|
633
|
-
)
|
|
634
|
-
|
|
635
|
-
enterprise_routers = get_enterprise_routers()
|
|
636
|
-
for router_config in enterprise_routers:
|
|
637
|
-
app.include_router(
|
|
638
|
-
router_config["router"],
|
|
639
|
-
prefix=router_config["prefix"],
|
|
640
|
-
tags=router_config["tags"],
|
|
641
|
-
)
|
|
642
|
-
log.info("Mounted %d enterprise routers", len(enterprise_routers))
|
|
643
|
-
|
|
644
|
-
except ImportError:
|
|
645
|
-
log.debug("No enterprise package detected - skipping enterprise routers")
|
|
646
|
-
except ModuleNotFoundError:
|
|
647
|
-
log.debug(
|
|
648
|
-
"Enterprise module not found - skipping enterprise routers and exception handlers"
|
|
649
|
-
)
|
|
650
|
-
except Exception as e:
|
|
651
|
-
log.warning("Failed to load enterprise routers and exception handlers: %s", e)
|
|
227
|
+
log.info("Registered shared exception handlers")
|
|
652
228
|
|
|
653
229
|
|
|
654
230
|
def _setup_static_files() -> None:
|
|
@@ -661,18 +237,18 @@ def _setup_static_files() -> None:
|
|
|
661
237
|
"Static files directory '%s' not found. Frontend may not be served.",
|
|
662
238
|
static_files_dir,
|
|
663
239
|
)
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
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
|
+
)
|
|
676
252
|
|
|
677
253
|
|
|
678
254
|
@app.exception_handler(HTTPException)
|
|
@@ -780,4 +356,4 @@ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
|
|
|
780
356
|
async def read_root():
|
|
781
357
|
"""Basic health check endpoint."""
|
|
782
358
|
log.debug("Health check endpoint '/health' called")
|
|
783
|
-
return {"status": "A2A Web UI Backend is running"}
|
|
359
|
+
return {"status": "A2A Web UI Backend is running"}
|
|
@@ -6,8 +6,8 @@ from typing import List, Optional
|
|
|
6
6
|
|
|
7
7
|
from sqlalchemy.orm import Session as DBSession
|
|
8
8
|
|
|
9
|
-
from
|
|
10
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
10
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
11
11
|
from .entities import ChatTask
|
|
12
12
|
from .interfaces import IChatTaskRepository
|
|
13
13
|
from .models import ChatTaskModel
|