solace-agent-mesh 1.11.2__py3-none-any.whl → 1.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solace_agent_mesh/agent/adk/callbacks.py +177 -10
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/setup.py +61 -26
- solace_agent_mesh/agent/protocol/event_handlers.py +48 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +27 -0
- solace_agent_mesh/agent/sac/component.py +84 -2
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +41 -22
- solace_agent_mesh/agent/tools/peer_agent_tool.py +19 -12
- solace_agent_mesh/agent/tools/tool_config_types.py +21 -1
- solace_agent_mesh/agent/utils/artifact_helpers.py +54 -0
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -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.28b7c67b.js → 3ac1795d.dc006e20.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.f08618fb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.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/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.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.95be65d4.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/ab9708a8.3e563275.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/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.08fab659.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.b241af3e.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.4ca7d2e2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +4 -4
- 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 +14 -12
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +30 -9
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +6 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
- 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 +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/{kubernetes-deployment → kubernetes}/index.html +6 -6
- 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 +11 -6
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +23 -5
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +17 -8
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +6 -5
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +4 -4
- 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 +25 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1767712284328.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1767712284328.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/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 +29 -2
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +2 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-Dj3JtK42.js → authCallback-8Nihi8rv.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-ZKk9kEJ5.js → client-DYtZN8p-.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-BYGUHQMk.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-D2CSH1bp.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BNV4kZN0.js → vendor-XBWAmrun.js} +106 -101
- 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/ui-version.json +1 -1
- 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 +28 -0
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/config_portal/backend/common.py +2 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ZV-jX48T.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-ba77705e.js → manifest-ce5bc5da.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- 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/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +68 -1
- solace_agent_mesh/gateway/generic/component.py +195 -30
- solace_agent_mesh/gateway/http_sse/app.py +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +9 -61
- solace_agent_mesh/gateway/http_sse/dependencies.py +9 -51
- solace_agent_mesh/gateway/http_sse/main.py +28 -418
- 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 +2 -2
- 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/prompt_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -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 +4 -4
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +16 -15
- solace_agent_mesh/gateway/http_sse/routers/auth.py +61 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +12 -8
- 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/session_responses.py +2 -2
- 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 +2 -1
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +2 -1
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +3 -3
- solace_agent_mesh/gateway/http_sse/routers/speech.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +1 -1
- 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/session_service.py +4 -4
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +1 -1
- solace_agent_mesh/services/platform/__init__.py +23 -12
- solace_agent_mesh/services/platform/api/dependencies.py +23 -16
- solace_agent_mesh/services/platform/api/main.py +118 -43
- solace_agent_mesh/services/platform/api/routers/__init__.py +12 -3
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +101 -7
- solace_agent_mesh/services/platform/component.py +552 -33
- 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 +291 -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/platform.yaml +49 -0
- solace_agent_mesh/templates/webui.yaml +12 -3
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/METADATA +2 -1
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/RECORD +214 -258
- 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/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.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/3ff0015d.2ddc75c0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1765810064709.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/main-BcUaNZ-Q.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +0 -435
- 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-DiOiAjzL.js +0 -103
- 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/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/templates_llm.txt +0 -147
- /solace_agent_mesh/assets/docs/assets/js/{main.7acf7ace.js.LICENSE.txt → main.b241af3e.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.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.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,
|
|
@@ -46,17 +42,9 @@ from .routers.sessions import router as session_router
|
|
|
46
42
|
from .routers.tasks import router as task_router
|
|
47
43
|
from .routers.users import router as user_router
|
|
48
44
|
|
|
49
|
-
from alembic import command
|
|
50
|
-
from alembic.config import Config
|
|
51
|
-
|
|
52
|
-
from a2a.types import InternalError, InvalidRequestError, JSONRPCError
|
|
53
|
-
from a2a.types import JSONRPCResponse as A2AJSONRPCResponse
|
|
54
|
-
from ...common import a2a
|
|
55
|
-
from ...gateway.http_sse import dependencies
|
|
56
|
-
|
|
57
45
|
|
|
58
46
|
if TYPE_CHECKING:
|
|
59
|
-
from
|
|
47
|
+
from .component import WebUIBackendComponent
|
|
60
48
|
|
|
61
49
|
log = logging.getLogger(__name__)
|
|
62
50
|
|
|
@@ -70,333 +58,6 @@ app = FastAPI(
|
|
|
70
58
|
_dependencies_initialized = False
|
|
71
59
|
|
|
72
60
|
|
|
73
|
-
def _extract_access_token(request: FastAPIRequest) -> str:
|
|
74
|
-
auth_header = request.headers.get("Authorization")
|
|
75
|
-
if auth_header and auth_header.startswith("Bearer "):
|
|
76
|
-
return auth_header[7:]
|
|
77
|
-
|
|
78
|
-
try:
|
|
79
|
-
if "access_token" in request.session:
|
|
80
|
-
log.debug("AuthMiddleware: Found token in session.")
|
|
81
|
-
return request.session["access_token"]
|
|
82
|
-
except AssertionError:
|
|
83
|
-
log.debug("AuthMiddleware: Could not access request.session.")
|
|
84
|
-
|
|
85
|
-
if "token" in request.query_params:
|
|
86
|
-
return request.query_params["token"]
|
|
87
|
-
|
|
88
|
-
return None
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
async def _validate_token(
|
|
92
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
93
|
-
) -> bool:
|
|
94
|
-
async with httpx.AsyncClient() as client:
|
|
95
|
-
validation_response = await client.post(
|
|
96
|
-
f"{auth_service_url}/is_token_valid",
|
|
97
|
-
json={"provider": auth_provider},
|
|
98
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
99
|
-
)
|
|
100
|
-
return validation_response.status_code == 200
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
async def _get_user_info(
|
|
104
|
-
auth_service_url: str, auth_provider: str, access_token: str
|
|
105
|
-
) -> dict:
|
|
106
|
-
async with httpx.AsyncClient() as client:
|
|
107
|
-
userinfo_response = await client.get(
|
|
108
|
-
f"{auth_service_url}/user_info?provider={auth_provider}",
|
|
109
|
-
headers={"Authorization": f"Bearer {access_token}"},
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
if userinfo_response.status_code != 200:
|
|
113
|
-
return None
|
|
114
|
-
|
|
115
|
-
return userinfo_response.json()
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def _extract_user_identifier(user_info: dict) -> str:
|
|
119
|
-
user_identifier = (
|
|
120
|
-
user_info.get("sub")
|
|
121
|
-
or user_info.get("client_id")
|
|
122
|
-
or user_info.get("username")
|
|
123
|
-
or user_info.get("oid")
|
|
124
|
-
or user_info.get("preferred_username")
|
|
125
|
-
or user_info.get("upn")
|
|
126
|
-
or user_info.get("unique_name")
|
|
127
|
-
or user_info.get("email")
|
|
128
|
-
or user_info.get("name")
|
|
129
|
-
or user_info.get("azp")
|
|
130
|
-
or user_info.get("user_id") # internal /user_info endpoint format maps identifier to user_id
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
if user_identifier and user_identifier.lower() == "unknown":
|
|
134
|
-
log.warning(
|
|
135
|
-
"AuthMiddleware: IDP returned 'Unknown' as user identifier. Using fallback."
|
|
136
|
-
)
|
|
137
|
-
return "sam_dev_user"
|
|
138
|
-
|
|
139
|
-
return user_identifier
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def _extract_user_details(user_info: dict, user_identifier: str) -> tuple:
|
|
143
|
-
email_from_auth = (
|
|
144
|
-
user_info.get("email")
|
|
145
|
-
or user_info.get("preferred_username")
|
|
146
|
-
or user_info.get("upn")
|
|
147
|
-
or user_identifier
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
display_name = (
|
|
151
|
-
user_info.get("name")
|
|
152
|
-
or user_info.get("given_name", "") + " " + user_info.get("family_name", "")
|
|
153
|
-
or user_info.get("preferred_username")
|
|
154
|
-
or user_identifier
|
|
155
|
-
).strip()
|
|
156
|
-
|
|
157
|
-
return email_from_auth, display_name
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
async def _create_user_state_without_identity_service(
|
|
161
|
-
user_identifier: str, email_from_auth: str, display_name: str
|
|
162
|
-
) -> dict:
|
|
163
|
-
final_user_id = user_identifier or email_from_auth or "sam_dev_user"
|
|
164
|
-
if not final_user_id or final_user_id.lower() in ["unknown", "null", "none", ""]:
|
|
165
|
-
final_user_id = "sam_dev_user"
|
|
166
|
-
log.warning(
|
|
167
|
-
"AuthMiddleware: Had to use fallback user ID due to invalid identifier: %s",
|
|
168
|
-
user_identifier,
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
log.debug(
|
|
172
|
-
"AuthMiddleware: Internal IdentityService not configured on component. Using user ID: %s",
|
|
173
|
-
final_user_id,
|
|
174
|
-
)
|
|
175
|
-
return {
|
|
176
|
-
"id": final_user_id,
|
|
177
|
-
"email": email_from_auth or final_user_id,
|
|
178
|
-
"name": display_name or final_user_id,
|
|
179
|
-
"authenticated": True,
|
|
180
|
-
"auth_method": "oidc",
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
async def _create_user_state_with_identity_service(
|
|
185
|
-
identity_service,
|
|
186
|
-
user_identifier: str,
|
|
187
|
-
email_from_auth: str,
|
|
188
|
-
display_name: str,
|
|
189
|
-
user_info: dict,
|
|
190
|
-
) -> dict:
|
|
191
|
-
lookup_value = email_from_auth if "@" in email_from_auth else user_identifier
|
|
192
|
-
user_profile = await identity_service.get_user_profile(
|
|
193
|
-
{identity_service.lookup_key: lookup_value, "user_info": user_info}
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
if not user_profile:
|
|
197
|
-
return None
|
|
198
|
-
|
|
199
|
-
user_state = user_profile.copy()
|
|
200
|
-
if not user_state.get("id"):
|
|
201
|
-
user_state["id"] = user_identifier
|
|
202
|
-
if not user_state.get("email"):
|
|
203
|
-
user_state["email"] = email_from_auth
|
|
204
|
-
if not user_state.get("name"):
|
|
205
|
-
user_state["name"] = display_name
|
|
206
|
-
user_state["authenticated"] = True
|
|
207
|
-
user_state["auth_method"] = "oidc"
|
|
208
|
-
|
|
209
|
-
return user_state
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def _create_auth_middleware(component):
|
|
213
|
-
class AuthMiddleware:
|
|
214
|
-
def __init__(self, app, component):
|
|
215
|
-
self.app = app
|
|
216
|
-
self.component = component
|
|
217
|
-
|
|
218
|
-
async def __call__(self, scope, receive, send):
|
|
219
|
-
if scope["type"] != "http":
|
|
220
|
-
await self.app(scope, receive, send)
|
|
221
|
-
return
|
|
222
|
-
|
|
223
|
-
request = FastAPIRequest(scope, receive)
|
|
224
|
-
|
|
225
|
-
if not request.url.path.startswith("/api"):
|
|
226
|
-
await self.app(scope, receive, send)
|
|
227
|
-
return
|
|
228
|
-
|
|
229
|
-
skip_paths = [
|
|
230
|
-
"/api/v1/config",
|
|
231
|
-
"/api/v1/auth/callback",
|
|
232
|
-
"/api/v1/auth/tool/callback",
|
|
233
|
-
"/api/v1/auth/login",
|
|
234
|
-
"/api/v1/auth/refresh",
|
|
235
|
-
"/api/v1/csrf-token",
|
|
236
|
-
"/health",
|
|
237
|
-
]
|
|
238
|
-
|
|
239
|
-
if any(request.url.path.startswith(path) for path in skip_paths):
|
|
240
|
-
await self.app(scope, receive, send)
|
|
241
|
-
return
|
|
242
|
-
|
|
243
|
-
use_auth = dependencies.api_config and dependencies.api_config.get(
|
|
244
|
-
"frontend_use_authorization"
|
|
245
|
-
)
|
|
246
|
-
|
|
247
|
-
if use_auth:
|
|
248
|
-
await self._handle_authenticated_request(request, scope, receive, send)
|
|
249
|
-
else:
|
|
250
|
-
request.state.user = {
|
|
251
|
-
"id": "sam_dev_user",
|
|
252
|
-
"name": "Sam Dev User",
|
|
253
|
-
"email": "sam@dev.local",
|
|
254
|
-
"authenticated": True,
|
|
255
|
-
"auth_method": "development",
|
|
256
|
-
}
|
|
257
|
-
log.debug(
|
|
258
|
-
"AuthMiddleware: Set development user state with id: sam_dev_user"
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
await self.app(scope, receive, send)
|
|
262
|
-
|
|
263
|
-
async def _handle_authenticated_request(self, request, scope, receive, send):
|
|
264
|
-
access_token = _extract_access_token(request)
|
|
265
|
-
|
|
266
|
-
if not access_token:
|
|
267
|
-
log.warning("AuthMiddleware: No access token found. Returning 401.")
|
|
268
|
-
response = JSONResponse(
|
|
269
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
270
|
-
content={
|
|
271
|
-
"detail": "Not authenticated",
|
|
272
|
-
"error_type": "authentication_required",
|
|
273
|
-
},
|
|
274
|
-
)
|
|
275
|
-
await response(scope, receive, send)
|
|
276
|
-
return
|
|
277
|
-
|
|
278
|
-
try:
|
|
279
|
-
auth_service_url = dependencies.api_config.get(
|
|
280
|
-
"external_auth_service_url"
|
|
281
|
-
)
|
|
282
|
-
auth_provider = dependencies.api_config.get("external_auth_provider")
|
|
283
|
-
|
|
284
|
-
if not auth_service_url:
|
|
285
|
-
log.error("Auth service URL not configured.")
|
|
286
|
-
response = JSONResponse(
|
|
287
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
288
|
-
content={"detail": "Auth service not configured"},
|
|
289
|
-
)
|
|
290
|
-
await response(scope, receive, send)
|
|
291
|
-
return
|
|
292
|
-
|
|
293
|
-
if not await _validate_token(
|
|
294
|
-
auth_service_url, auth_provider, access_token
|
|
295
|
-
):
|
|
296
|
-
log.warning("AuthMiddleware: Token validation failed")
|
|
297
|
-
response = JSONResponse(
|
|
298
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
299
|
-
content={
|
|
300
|
-
"detail": "Invalid token",
|
|
301
|
-
"error_type": "invalid_token",
|
|
302
|
-
},
|
|
303
|
-
)
|
|
304
|
-
await response(scope, receive, send)
|
|
305
|
-
return
|
|
306
|
-
|
|
307
|
-
user_info = await _get_user_info(
|
|
308
|
-
auth_service_url, auth_provider, access_token
|
|
309
|
-
)
|
|
310
|
-
if not user_info:
|
|
311
|
-
log.warning(
|
|
312
|
-
"AuthMiddleware: Failed to get user info from external auth service"
|
|
313
|
-
)
|
|
314
|
-
response = JSONResponse(
|
|
315
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
316
|
-
content={
|
|
317
|
-
"detail": "Could not retrieve user info from auth provider",
|
|
318
|
-
"error_type": "user_info_failed",
|
|
319
|
-
},
|
|
320
|
-
)
|
|
321
|
-
await response(scope, receive, send)
|
|
322
|
-
return
|
|
323
|
-
|
|
324
|
-
user_identifier = _extract_user_identifier(user_info)
|
|
325
|
-
if not user_identifier or user_identifier.lower() in [
|
|
326
|
-
"null",
|
|
327
|
-
"none",
|
|
328
|
-
"",
|
|
329
|
-
]:
|
|
330
|
-
log.error(
|
|
331
|
-
"AuthMiddleware: No valid user identifier from OAuth provider"
|
|
332
|
-
)
|
|
333
|
-
response = JSONResponse(
|
|
334
|
-
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
335
|
-
content={
|
|
336
|
-
"detail": "OAuth provider returned no valid user identifier",
|
|
337
|
-
"error_type": "invalid_user_identifier_from_provider",
|
|
338
|
-
},
|
|
339
|
-
)
|
|
340
|
-
await response(scope, receive, send)
|
|
341
|
-
return
|
|
342
|
-
|
|
343
|
-
email_from_auth, display_name = _extract_user_details(
|
|
344
|
-
user_info, user_identifier
|
|
345
|
-
)
|
|
346
|
-
|
|
347
|
-
identity_service = self.component.identity_service
|
|
348
|
-
if not identity_service:
|
|
349
|
-
request.state.user = (
|
|
350
|
-
await _create_user_state_without_identity_service(
|
|
351
|
-
user_identifier, email_from_auth, display_name
|
|
352
|
-
)
|
|
353
|
-
)
|
|
354
|
-
else:
|
|
355
|
-
user_state = await _create_user_state_with_identity_service(
|
|
356
|
-
identity_service,
|
|
357
|
-
user_identifier,
|
|
358
|
-
email_from_auth,
|
|
359
|
-
display_name,
|
|
360
|
-
user_info,
|
|
361
|
-
)
|
|
362
|
-
if not user_state:
|
|
363
|
-
log.error(
|
|
364
|
-
"AuthMiddleware: User authenticated but not found in internal IdentityService"
|
|
365
|
-
)
|
|
366
|
-
response = JSONResponse(
|
|
367
|
-
status_code=status.HTTP_403_FORBIDDEN,
|
|
368
|
-
content={
|
|
369
|
-
"detail": "User not authorized for this application",
|
|
370
|
-
"error_type": "not_authorized",
|
|
371
|
-
},
|
|
372
|
-
)
|
|
373
|
-
await response(scope, receive, send)
|
|
374
|
-
return
|
|
375
|
-
request.state.user = user_state
|
|
376
|
-
|
|
377
|
-
except httpx.RequestError as exc:
|
|
378
|
-
log.error("Error calling auth service: %s", exc)
|
|
379
|
-
response = JSONResponse(
|
|
380
|
-
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
381
|
-
content={"detail": "Auth service is unavailable"},
|
|
382
|
-
)
|
|
383
|
-
await response(scope, receive, send)
|
|
384
|
-
return
|
|
385
|
-
except Exception as exc:
|
|
386
|
-
log.error(
|
|
387
|
-
"An unexpected error occurred during token validation: %s", exc
|
|
388
|
-
)
|
|
389
|
-
response = JSONResponse(
|
|
390
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
391
|
-
content={
|
|
392
|
-
"detail": "An internal error occurred during authentication"
|
|
393
|
-
},
|
|
394
|
-
)
|
|
395
|
-
await response(scope, receive, send)
|
|
396
|
-
return
|
|
397
|
-
|
|
398
|
-
return AuthMiddleware
|
|
399
|
-
|
|
400
61
|
|
|
401
62
|
def _setup_alembic_config(database_url: str) -> Config:
|
|
402
63
|
alembic_cfg = Config()
|
|
@@ -448,45 +109,21 @@ def _run_community_migrations(database_url: str) -> None:
|
|
|
448
109
|
) from migration_error
|
|
449
110
|
|
|
450
111
|
|
|
451
|
-
def _run_enterprise_migrations(
|
|
452
|
-
component: "WebUIBackendComponent", database_url: str
|
|
453
|
-
) -> None:
|
|
454
|
-
"""
|
|
455
|
-
Run migrations for enterprise features like advanced analytics, audit logs, etc.
|
|
456
|
-
This is optional and only runs if the enterprise package is available.
|
|
457
|
-
"""
|
|
458
|
-
try:
|
|
459
|
-
from solace_agent_mesh_enterprise.webui_backend.migration_runner import (
|
|
460
|
-
run_migrations,
|
|
461
|
-
)
|
|
462
|
-
|
|
463
|
-
webui_app = component.get_app()
|
|
464
|
-
app_config = getattr(webui_app, "app_config", {}) if webui_app else {}
|
|
465
|
-
log.info("Starting enterprise migrations...")
|
|
466
|
-
run_migrations(database_url, app_config)
|
|
467
|
-
log.info("Enterprise migrations completed")
|
|
468
|
-
except (ImportError, ModuleNotFoundError):
|
|
469
|
-
log.debug("Enterprise module not found - skipping enterprise migrations")
|
|
470
|
-
except Exception as e:
|
|
471
|
-
log.error("Enterprise migration failed: %s", e)
|
|
472
|
-
log.error("Advanced features may be unavailable")
|
|
473
|
-
raise RuntimeError(f"Enterprise database migration failed: {e}") from e
|
|
474
112
|
|
|
475
113
|
|
|
476
114
|
def _setup_database(
|
|
477
115
|
component: "WebUIBackendComponent",
|
|
478
116
|
database_url: str,
|
|
479
|
-
platform_database_url: str = None
|
|
480
117
|
) -> None:
|
|
481
118
|
"""
|
|
482
|
-
Initialize database
|
|
483
|
-
|
|
119
|
+
Initialize database and run migrations for WebUI Gateway (chat only).
|
|
120
|
+
|
|
121
|
+
Platform database is no longer used by WebUI Gateway.
|
|
122
|
+
Platform migrations are handled by Platform Service.
|
|
484
123
|
|
|
485
124
|
Args:
|
|
486
125
|
component: WebUIBackendComponent instance
|
|
487
|
-
database_url:
|
|
488
|
-
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
489
|
-
If None, platform features will be unavailable.
|
|
126
|
+
database_url: Chat database URL (sessions, tasks, feedback) - REQUIRED
|
|
490
127
|
"""
|
|
491
128
|
dependencies.init_database(database_url)
|
|
492
129
|
log.info("Persistence enabled - sessions will be stored in database")
|
|
@@ -494,12 +131,6 @@ def _setup_database(
|
|
|
494
131
|
|
|
495
132
|
_run_community_migrations(database_url)
|
|
496
133
|
|
|
497
|
-
if platform_database_url:
|
|
498
|
-
log.info("Platform database configured - running migrations")
|
|
499
|
-
_run_enterprise_migrations(component, platform_database_url)
|
|
500
|
-
else:
|
|
501
|
-
log.info("No platform database configured - skipping platform migrations")
|
|
502
|
-
|
|
503
134
|
|
|
504
135
|
def _get_app_config(component: "WebUIBackendComponent") -> dict:
|
|
505
136
|
webui_app = component.get_app()
|
|
@@ -536,17 +167,14 @@ def _create_api_config(app_config: dict, database_url: str) -> dict:
|
|
|
536
167
|
def setup_dependencies(
|
|
537
168
|
component: "WebUIBackendComponent",
|
|
538
169
|
database_url: str = None,
|
|
539
|
-
platform_database_url: str = None
|
|
540
170
|
):
|
|
541
171
|
"""
|
|
542
|
-
Initialize dependencies for
|
|
172
|
+
Initialize dependencies for WebUI Gateway (chat only).
|
|
543
173
|
|
|
544
174
|
Args:
|
|
545
175
|
component: WebUIBackendComponent instance
|
|
546
|
-
database_url:
|
|
176
|
+
database_url: Chat database URL (sessions, tasks, feedback).
|
|
547
177
|
If None, runs in compatibility mode with in-memory sessions.
|
|
548
|
-
platform_database_url: Platform database URL (agents, connectors, deployments).
|
|
549
|
-
If None, platform features will be unavailable (returns 501).
|
|
550
178
|
|
|
551
179
|
This function is idempotent and safe to call multiple times.
|
|
552
180
|
"""
|
|
@@ -559,7 +187,7 @@ def setup_dependencies(
|
|
|
559
187
|
dependencies.set_component_instance(component)
|
|
560
188
|
|
|
561
189
|
if database_url:
|
|
562
|
-
_setup_database(component, database_url
|
|
190
|
+
_setup_database(component, database_url)
|
|
563
191
|
else:
|
|
564
192
|
log.warning(
|
|
565
193
|
"No database URL provided - using in-memory session storage (data not persisted across restarts)"
|
|
@@ -595,9 +223,15 @@ def _setup_middleware(component: "WebUIBackendComponent") -> None:
|
|
|
595
223
|
app.add_middleware(SessionMiddleware, secret_key=session_manager.secret_key)
|
|
596
224
|
log.info("SessionMiddleware added.")
|
|
597
225
|
|
|
598
|
-
auth_middleware_class =
|
|
226
|
+
auth_middleware_class = create_oauth_middleware(component)
|
|
599
227
|
app.add_middleware(auth_middleware_class, component=component)
|
|
600
|
-
|
|
228
|
+
|
|
229
|
+
api_config = dependencies.get_api_config()
|
|
230
|
+
use_auth = api_config.get("frontend_use_authorization", False) if api_config else False
|
|
231
|
+
if use_auth:
|
|
232
|
+
log.info("OAuth middleware added (real token validation enabled)")
|
|
233
|
+
else:
|
|
234
|
+
log.info("OAuth middleware added (development mode - community/dev user)")
|
|
601
235
|
|
|
602
236
|
|
|
603
237
|
def _setup_routers() -> None:
|
|
@@ -626,35 +260,11 @@ def _setup_routers() -> None:
|
|
|
626
260
|
app.include_router(speech.router, prefix=f"{api_prefix}/speech", tags=["Speech"])
|
|
627
261
|
log.info("Legacy routers mounted for endpoints not yet migrated")
|
|
628
262
|
|
|
629
|
-
# Register shared exception handlers
|
|
630
|
-
from .shared.exception_handlers import register_exception_handlers
|
|
263
|
+
# Register shared exception handlers
|
|
264
|
+
from solace_agent_mesh.shared.exceptions.exception_handlers import register_exception_handlers
|
|
631
265
|
|
|
632
266
|
register_exception_handlers(app)
|
|
633
|
-
log.info("Registered shared exception handlers
|
|
634
|
-
|
|
635
|
-
# Mount enterprise routers if available
|
|
636
|
-
try:
|
|
637
|
-
from solace_agent_mesh_enterprise.webui_backend.routers import (
|
|
638
|
-
get_enterprise_routers,
|
|
639
|
-
)
|
|
640
|
-
|
|
641
|
-
enterprise_routers = get_enterprise_routers()
|
|
642
|
-
for router_config in enterprise_routers:
|
|
643
|
-
app.include_router(
|
|
644
|
-
router_config["router"],
|
|
645
|
-
prefix=router_config["prefix"],
|
|
646
|
-
tags=router_config["tags"],
|
|
647
|
-
)
|
|
648
|
-
log.info("Mounted %d enterprise routers", len(enterprise_routers))
|
|
649
|
-
|
|
650
|
-
except ImportError:
|
|
651
|
-
log.debug("No enterprise package detected - skipping enterprise routers")
|
|
652
|
-
except ModuleNotFoundError:
|
|
653
|
-
log.debug(
|
|
654
|
-
"Enterprise module not found - skipping enterprise routers and exception handlers"
|
|
655
|
-
)
|
|
656
|
-
except Exception as e:
|
|
657
|
-
log.warning("Failed to load enterprise routers and exception handlers: %s", e)
|
|
267
|
+
log.info("Registered shared exception handlers")
|
|
658
268
|
|
|
659
269
|
|
|
660
270
|
def _setup_static_files() -> None:
|
|
@@ -786,4 +396,4 @@ async def generic_exception_handler(request: FastAPIRequest, exc: Exception):
|
|
|
786
396
|
async def read_root():
|
|
787
397
|
"""Basic health check endpoint."""
|
|
788
398
|
log.debug("Health check endpoint '/health' called")
|
|
789
|
-
return {"status": "A2A Web UI Backend is running"}
|
|
399
|
+
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
|
|
@@ -4,8 +4,8 @@ Session domain entity.
|
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, ConfigDict
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import AgentId, SessionId, UserId
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class Session(BaseModel):
|
|
@@ -4,8 +4,8 @@ Feedback repository implementation using SQLAlchemy.
|
|
|
4
4
|
|
|
5
5
|
from sqlalchemy.orm import Session as DBSession
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import UserId
|
|
9
9
|
from .entities import Feedback
|
|
10
10
|
from .interfaces import IFeedbackRepository
|
|
11
11
|
from .models import FeedbackModel
|
|
@@ -6,8 +6,8 @@ from abc import ABC, abstractmethod
|
|
|
6
6
|
from typing import TYPE_CHECKING, Optional
|
|
7
7
|
from sqlalchemy.orm import Session as DBSession
|
|
8
8
|
|
|
9
|
-
from
|
|
10
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
10
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
11
11
|
from .entities import Feedback, Session, Task, TaskEvent
|
|
12
12
|
from .entities.project import Project
|
|
13
13
|
from ..routers.dto.requests.project_requests import ProjectFilter
|
|
@@ -6,7 +6,7 @@ from enum import Enum
|
|
|
6
6
|
from sqlalchemy import BigInteger, Column, String, Text, Integer, Boolean, ForeignKey, UniqueConstraint, Enum as SQLEnum
|
|
7
7
|
from sqlalchemy.orm import relationship
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
10
10
|
from .base import Base
|
|
11
11
|
|
|
12
12
|
|
|
@@ -6,7 +6,7 @@ from sqlalchemy import BigInteger, Column, String, ForeignKey
|
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
from sqlalchemy.orm import relationship
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
10
10
|
from .base import Base
|
|
11
11
|
|
|
12
12
|
|
|
@@ -11,7 +11,7 @@ from .interfaces import IProjectRepository
|
|
|
11
11
|
from .models import ProjectModel, ProjectUserModel
|
|
12
12
|
from .entities.project import Project
|
|
13
13
|
from ..routers.dto.requests.project_requests import ProjectFilter
|
|
14
|
-
from
|
|
14
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ProjectRepository(IProjectRepository):
|
|
@@ -8,7 +8,7 @@ from sqlalchemy.orm import Session as DBSession
|
|
|
8
8
|
|
|
9
9
|
from .models import ProjectUserModel
|
|
10
10
|
from .entities.project_user import ProjectUser
|
|
11
|
-
from
|
|
11
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ProjectUserRepository:
|
|
@@ -5,10 +5,10 @@ Session repository implementation using SQLAlchemy.
|
|
|
5
5
|
from sqlalchemy import or_, func
|
|
6
6
|
from sqlalchemy.orm import Session as DBSession, joinedload
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
8
|
+
from solace_agent_mesh.shared.database.base_repository import PaginatedRepository
|
|
9
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
10
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
11
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
12
12
|
from .entities import Session
|
|
13
13
|
from .interfaces import ISessionRepository
|
|
14
14
|
from .models import CreateSessionModel, SessionModel, UpdateSessionModel
|
|
@@ -4,8 +4,8 @@ Task repository implementation using SQLAlchemy.
|
|
|
4
4
|
|
|
5
5
|
from sqlalchemy.orm import Session as DBSession
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import UserId
|
|
9
9
|
from .entities import Task, TaskEvent
|
|
10
10
|
from .interfaces import ITaskRepository
|
|
11
11
|
from .models import TaskEventModel, TaskModel
|