solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/app.py +3 -2
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/a2a/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -336
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
Defines FastAPI dependency injectors to access shared resources
|
|
3
3
|
managed by the WebUIBackendComponent.
|
|
4
4
|
"""
|
|
5
|
+
from __future__ import annotations
|
|
5
6
|
|
|
6
7
|
import logging
|
|
7
8
|
from collections.abc import Callable, Generator
|
|
8
9
|
from contextlib import contextmanager
|
|
9
|
-
from
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
10
12
|
|
|
11
|
-
from fastapi import Depends, HTTPException, Request, status
|
|
13
|
+
from fastapi import Depends, HTTPException, Request, status, Path, Query
|
|
12
14
|
from sqlalchemy import create_engine
|
|
13
15
|
from sqlalchemy.orm import Session, sessionmaker
|
|
14
16
|
|
|
@@ -18,15 +20,18 @@ from ...common.services.identity_service import BaseIdentityService
|
|
|
18
20
|
from ...core_a2a.service import CoreA2AService
|
|
19
21
|
from ...gateway.base.task_context import TaskContextManager
|
|
20
22
|
from ...gateway.http_sse.services.agent_card_service import AgentCardService
|
|
21
|
-
from ...gateway.http_sse.services.
|
|
22
|
-
from ...gateway.http_sse.services.
|
|
23
|
+
from ...gateway.http_sse.services.audio_service import AudioService
|
|
24
|
+
from ...gateway.http_sse.services.project_service import ProjectService
|
|
23
25
|
from ...gateway.http_sse.services.feedback_service import FeedbackService
|
|
26
|
+
from ...gateway.http_sse.services.people_service import PeopleService
|
|
24
27
|
from ...gateway.http_sse.services.task_logger_service import TaskLoggerService
|
|
28
|
+
from ...gateway.http_sse.services.task_service import TaskService
|
|
25
29
|
from ...gateway.http_sse.services.data_retention_service import DataRetentionService
|
|
26
30
|
from ...gateway.http_sse.session_manager import SessionManager
|
|
27
31
|
from ...gateway.http_sse.sse_manager import SSEManager
|
|
28
32
|
from .repository import SessionRepository
|
|
29
33
|
from .repository.interfaces import ITaskRepository
|
|
34
|
+
from .repository.project_repository import ProjectRepository
|
|
30
35
|
from .repository.task_repository import TaskRepository
|
|
31
36
|
from .services.session_service import SessionService
|
|
32
37
|
|
|
@@ -41,7 +46,7 @@ except ImportError:
|
|
|
41
46
|
|
|
42
47
|
|
|
43
48
|
if TYPE_CHECKING:
|
|
44
|
-
from
|
|
49
|
+
from .component import WebUIBackendComponent
|
|
45
50
|
|
|
46
51
|
sac_component_instance: "WebUIBackendComponent" = None
|
|
47
52
|
SessionLocal: sessionmaker = None
|
|
@@ -54,32 +59,57 @@ def set_component_instance(component: "WebUIBackendComponent"):
|
|
|
54
59
|
global sac_component_instance
|
|
55
60
|
if sac_component_instance is None:
|
|
56
61
|
sac_component_instance = component
|
|
57
|
-
log.info("
|
|
62
|
+
log.info("SAC Component instance provided.")
|
|
58
63
|
else:
|
|
59
|
-
log.warning("
|
|
64
|
+
log.warning("SAC Component instance already set.")
|
|
60
65
|
|
|
61
66
|
|
|
62
67
|
def init_database(database_url: str):
|
|
63
|
-
"""Initialize database with
|
|
68
|
+
"""Initialize database with appropriate configuration based on database dialect."""
|
|
64
69
|
global SessionLocal
|
|
65
70
|
if SessionLocal is None:
|
|
66
|
-
|
|
71
|
+
from sqlalchemy import event, pool
|
|
72
|
+
from sqlalchemy.engine.url import make_url
|
|
73
|
+
|
|
74
|
+
url = make_url(database_url)
|
|
75
|
+
dialect_name = url.get_dialect().name
|
|
76
|
+
|
|
77
|
+
engine_kwargs = {}
|
|
78
|
+
|
|
79
|
+
if dialect_name == "sqlite":
|
|
80
|
+
engine_kwargs = {
|
|
81
|
+
"poolclass": pool.StaticPool,
|
|
82
|
+
"connect_args": {"check_same_thread": False}
|
|
83
|
+
}
|
|
84
|
+
log.info("Configuring SQLite database (single-connection mode)")
|
|
85
|
+
|
|
86
|
+
elif dialect_name in ("postgresql", "mysql"):
|
|
87
|
+
engine_kwargs = {
|
|
88
|
+
"pool_size": 10,
|
|
89
|
+
"max_overflow": 20,
|
|
90
|
+
"pool_timeout": 30,
|
|
91
|
+
"pool_recycle": 1800,
|
|
92
|
+
"pool_pre_ping": True,
|
|
93
|
+
}
|
|
94
|
+
log.info(f"Configuring {dialect_name} database with connection pooling")
|
|
95
|
+
|
|
96
|
+
else:
|
|
97
|
+
log.warning(f"Using default configuration for dialect: {dialect_name}")
|
|
67
98
|
|
|
68
|
-
|
|
69
|
-
from sqlalchemy import event
|
|
99
|
+
engine = create_engine(database_url, **engine_kwargs)
|
|
70
100
|
|
|
71
101
|
@event.listens_for(engine, "connect")
|
|
72
102
|
def set_sqlite_pragma(dbapi_conn, connection_record):
|
|
73
|
-
|
|
74
|
-
if database_url.startswith("sqlite"):
|
|
103
|
+
if dialect_name == "sqlite":
|
|
75
104
|
cursor = dbapi_conn.cursor()
|
|
76
105
|
cursor.execute("PRAGMA foreign_keys=ON")
|
|
77
106
|
cursor.close()
|
|
78
107
|
|
|
79
108
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
80
|
-
log.
|
|
109
|
+
log.debug(f"Database initialized: {url}")
|
|
110
|
+
log.info("Database initialized successfully")
|
|
81
111
|
else:
|
|
82
|
-
log.warning("
|
|
112
|
+
log.warning("Database already initialized.")
|
|
83
113
|
|
|
84
114
|
|
|
85
115
|
def set_api_config(config: dict[str, Any]):
|
|
@@ -87,16 +117,16 @@ def set_api_config(config: dict[str, Any]):
|
|
|
87
117
|
global api_config
|
|
88
118
|
if api_config is None:
|
|
89
119
|
api_config = config
|
|
90
|
-
log.
|
|
120
|
+
log.debug("API configuration provided.")
|
|
91
121
|
else:
|
|
92
|
-
log.warning("
|
|
122
|
+
log.warning("API configuration already set.")
|
|
93
123
|
|
|
94
124
|
|
|
95
125
|
def get_sac_component() -> "WebUIBackendComponent":
|
|
96
126
|
"""FastAPI dependency to get the SAC component instance."""
|
|
97
127
|
if sac_component_instance is None:
|
|
98
128
|
log.critical(
|
|
99
|
-
"
|
|
129
|
+
"SAC Component instance accessed before it was set!"
|
|
100
130
|
)
|
|
101
131
|
raise HTTPException(
|
|
102
132
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
@@ -108,7 +138,7 @@ def get_sac_component() -> "WebUIBackendComponent":
|
|
|
108
138
|
def get_api_config() -> dict[str, Any]:
|
|
109
139
|
"""FastAPI dependency to get the API configuration."""
|
|
110
140
|
if api_config is None:
|
|
111
|
-
log.critical("
|
|
141
|
+
log.critical("API configuration accessed before it was set!")
|
|
112
142
|
raise HTTPException(
|
|
113
143
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
114
144
|
detail="API configuration not yet initialized.",
|
|
@@ -120,7 +150,7 @@ def get_agent_registry(
|
|
|
120
150
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
121
151
|
) -> AgentRegistry:
|
|
122
152
|
"""FastAPI dependency to get the AgentRegistry."""
|
|
123
|
-
log.debug("
|
|
153
|
+
log.debug("get_agent_registry called")
|
|
124
154
|
return component.get_agent_registry()
|
|
125
155
|
|
|
126
156
|
|
|
@@ -128,7 +158,7 @@ def get_sse_manager(
|
|
|
128
158
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
129
159
|
) -> SSEManager:
|
|
130
160
|
"""FastAPI dependency to get the SSEManager."""
|
|
131
|
-
log.debug("
|
|
161
|
+
log.debug("get_sse_manager called")
|
|
132
162
|
return component.get_sse_manager()
|
|
133
163
|
|
|
134
164
|
|
|
@@ -136,7 +166,7 @@ def get_session_manager(
|
|
|
136
166
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
137
167
|
) -> SessionManager:
|
|
138
168
|
"""FastAPI dependency to get the SessionManager."""
|
|
139
|
-
log.debug("
|
|
169
|
+
log.debug("get_session_manager called")
|
|
140
170
|
return component.get_session_manager()
|
|
141
171
|
|
|
142
172
|
|
|
@@ -144,7 +174,7 @@ def get_user_id_callable(
|
|
|
144
174
|
session_manager: SessionManager = Depends(get_session_manager),
|
|
145
175
|
) -> Callable:
|
|
146
176
|
"""Dependency that provides the callable for getting user_id (client_id)."""
|
|
147
|
-
log.debug("
|
|
177
|
+
log.debug("Providing user_id callable")
|
|
148
178
|
return session_manager.dep_get_client_id()
|
|
149
179
|
|
|
150
180
|
|
|
@@ -152,7 +182,7 @@ def ensure_session_id_callable(
|
|
|
152
182
|
session_manager: SessionManager = Depends(get_session_manager),
|
|
153
183
|
) -> Callable:
|
|
154
184
|
"""Dependency that provides the callable for ensuring session_id."""
|
|
155
|
-
log.debug("
|
|
185
|
+
log.debug("Providing ensure_session_id callable")
|
|
156
186
|
return session_manager.dep_ensure_session_id()
|
|
157
187
|
|
|
158
188
|
|
|
@@ -165,27 +195,27 @@ def get_user_id(
|
|
|
165
195
|
When FRONTEND_USE_AUTHORIZATION is true: Fully relies on OAuth - user must be authenticated by AuthMiddleware.
|
|
166
196
|
When FRONTEND_USE_AUTHORIZATION is false: Uses development fallback user.
|
|
167
197
|
"""
|
|
168
|
-
log.debug("
|
|
198
|
+
log.debug("Resolving user_id string")
|
|
169
199
|
|
|
170
200
|
# AuthMiddleware should always set user state for both auth enabled/disabled cases
|
|
171
201
|
if hasattr(request.state, "user") and request.state.user:
|
|
172
202
|
user_id = request.state.user.get("id")
|
|
173
203
|
if user_id:
|
|
174
|
-
log.debug(f"
|
|
204
|
+
log.debug(f"Using user ID from AuthMiddleware: {user_id}")
|
|
175
205
|
return user_id
|
|
176
206
|
else:
|
|
177
207
|
log.error(
|
|
178
|
-
"
|
|
208
|
+
"request.state.user exists but has no 'id' field: %s. This indicates a bug in AuthMiddleware.",
|
|
179
209
|
request.state.user,
|
|
180
210
|
)
|
|
181
211
|
|
|
182
212
|
# If we reach here, AuthMiddleware didn't set user state properly
|
|
183
|
-
use_authorization =
|
|
213
|
+
use_authorization = api_config.get("frontend_use_authorization", False) if api_config else False
|
|
184
214
|
|
|
185
215
|
if use_authorization:
|
|
186
216
|
# When OAuth is enabled, we should never reach here - AuthMiddleware should have handled authentication
|
|
187
217
|
log.error(
|
|
188
|
-
"
|
|
218
|
+
"OAuth is enabled but no authenticated user found. This indicates an authentication failure or middleware bug."
|
|
189
219
|
)
|
|
190
220
|
raise HTTPException(
|
|
191
221
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
@@ -195,7 +225,7 @@ def get_user_id(
|
|
|
195
225
|
# When auth is disabled, use development fallback user
|
|
196
226
|
fallback_id = "sam_dev_user"
|
|
197
227
|
log.info(
|
|
198
|
-
"
|
|
228
|
+
"Authorization disabled and no user in request state, using fallback user: %s",
|
|
199
229
|
fallback_id,
|
|
200
230
|
)
|
|
201
231
|
return fallback_id
|
|
@@ -206,7 +236,7 @@ def ensure_session_id(
|
|
|
206
236
|
session_manager: SessionManager = Depends(get_session_manager),
|
|
207
237
|
) -> str:
|
|
208
238
|
"""FastAPI dependency that directly returns the ensured session_id string."""
|
|
209
|
-
log.debug("
|
|
239
|
+
log.debug("Resolving ensured session_id string")
|
|
210
240
|
return session_manager.ensure_a2a_session(request)
|
|
211
241
|
|
|
212
242
|
|
|
@@ -214,7 +244,7 @@ def get_identity_service(
|
|
|
214
244
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
215
245
|
) -> BaseIdentityService | None:
|
|
216
246
|
"""FastAPI dependency to get the configured IdentityService instance."""
|
|
217
|
-
log.debug("
|
|
247
|
+
log.debug("get_identity_service called")
|
|
218
248
|
return component.identity_service
|
|
219
249
|
|
|
220
250
|
|
|
@@ -239,13 +269,13 @@ def get_people_service(
|
|
|
239
269
|
identity_service: BaseIdentityService | None = Depends(get_identity_service),
|
|
240
270
|
) -> PeopleService:
|
|
241
271
|
"""FastAPI dependency to get an instance of PeopleService."""
|
|
242
|
-
log.debug("
|
|
272
|
+
log.debug("get_people_service called")
|
|
243
273
|
return PeopleService(identity_service=identity_service)
|
|
244
274
|
|
|
245
275
|
|
|
246
276
|
def get_task_repository() -> ITaskRepository:
|
|
247
277
|
"""FastAPI dependency to get an instance of TaskRepository."""
|
|
248
|
-
log.debug("
|
|
278
|
+
log.debug("get_task_repository called")
|
|
249
279
|
return TaskRepository()
|
|
250
280
|
|
|
251
281
|
|
|
@@ -254,7 +284,7 @@ def get_feedback_service(
|
|
|
254
284
|
task_repo: ITaskRepository = Depends(get_task_repository),
|
|
255
285
|
) -> FeedbackService:
|
|
256
286
|
"""FastAPI dependency to get an instance of FeedbackService."""
|
|
257
|
-
log.debug("
|
|
287
|
+
log.debug("get_feedback_service called")
|
|
258
288
|
# The session factory is needed for the existing DB save logic.
|
|
259
289
|
session_factory = SessionLocal if component.database_url else None
|
|
260
290
|
return FeedbackService(
|
|
@@ -264,7 +294,7 @@ def get_feedback_service(
|
|
|
264
294
|
|
|
265
295
|
def get_data_retention_service(
|
|
266
296
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
267
|
-
) ->
|
|
297
|
+
) -> DataRetentionService | None:
|
|
268
298
|
"""
|
|
269
299
|
FastAPI dependency to get the DataRetentionService instance.
|
|
270
300
|
|
|
@@ -277,11 +307,11 @@ def get_data_retention_service(
|
|
|
277
307
|
data retention statistics or manual cleanup triggers. The service itself
|
|
278
308
|
runs automatically via timer in the component.
|
|
279
309
|
"""
|
|
280
|
-
log.debug("
|
|
310
|
+
log.debug("get_data_retention_service called")
|
|
281
311
|
|
|
282
312
|
if not component.database_url:
|
|
283
313
|
log.debug(
|
|
284
|
-
"
|
|
314
|
+
"Database not configured, returning None for data retention service"
|
|
285
315
|
)
|
|
286
316
|
return None
|
|
287
317
|
|
|
@@ -289,7 +319,7 @@ def get_data_retention_service(
|
|
|
289
319
|
not hasattr(component, "data_retention_service")
|
|
290
320
|
or component.data_retention_service is None
|
|
291
321
|
):
|
|
292
|
-
log.warning("
|
|
322
|
+
log.warning("DataRetentionService not initialized on component")
|
|
293
323
|
return None
|
|
294
324
|
|
|
295
325
|
return component.data_retention_service
|
|
@@ -299,10 +329,10 @@ def get_task_logger_service(
|
|
|
299
329
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
300
330
|
) -> TaskLoggerService:
|
|
301
331
|
"""FastAPI dependency to get an instance of TaskLoggerService."""
|
|
302
|
-
log.debug("
|
|
332
|
+
log.debug("get_task_logger_service called")
|
|
303
333
|
task_logger_service = component.get_task_logger_service()
|
|
304
334
|
if task_logger_service is None:
|
|
305
|
-
log.error("
|
|
335
|
+
log.error("TaskLoggerService is not available.")
|
|
306
336
|
raise HTTPException(
|
|
307
337
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
308
338
|
detail="Task logging service is not configured or available.",
|
|
@@ -317,7 +347,7 @@ def get_publish_a2a_func(
|
|
|
317
347
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
318
348
|
) -> PublishFunc:
|
|
319
349
|
"""FastAPI dependency to get the component's publish_a2a method."""
|
|
320
|
-
log.debug("
|
|
350
|
+
log.debug("get_publish_a2a_func called")
|
|
321
351
|
return component.publish_a2a
|
|
322
352
|
|
|
323
353
|
|
|
@@ -325,7 +355,7 @@ def get_namespace(
|
|
|
325
355
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
326
356
|
) -> str:
|
|
327
357
|
"""FastAPI dependency to get the namespace."""
|
|
328
|
-
log.debug("
|
|
358
|
+
log.debug("get_namespace called")
|
|
329
359
|
return component.get_namespace()
|
|
330
360
|
|
|
331
361
|
|
|
@@ -333,7 +363,7 @@ def get_gateway_id(
|
|
|
333
363
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
334
364
|
) -> str:
|
|
335
365
|
"""FastAPI dependency to get the Gateway ID."""
|
|
336
|
-
log.debug("
|
|
366
|
+
log.debug("get_gateway_id called")
|
|
337
367
|
return component.get_gateway_id()
|
|
338
368
|
|
|
339
369
|
|
|
@@ -341,7 +371,7 @@ def get_config_resolver(
|
|
|
341
371
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
342
372
|
) -> ConfigResolver:
|
|
343
373
|
"""FastAPI dependency to get the ConfigResolver."""
|
|
344
|
-
log.debug("
|
|
374
|
+
log.debug("get_config_resolver called")
|
|
345
375
|
return component.get_config_resolver()
|
|
346
376
|
|
|
347
377
|
|
|
@@ -351,7 +381,7 @@ def get_app_config(
|
|
|
351
381
|
"""
|
|
352
382
|
FastAPI dependency to safely get the application configuration dictionary.
|
|
353
383
|
"""
|
|
354
|
-
log.debug("
|
|
384
|
+
log.debug("get_app_config called")
|
|
355
385
|
return component.component_config.get("app_config", {})
|
|
356
386
|
|
|
357
387
|
|
|
@@ -365,74 +395,35 @@ async def get_user_config(
|
|
|
365
395
|
"""
|
|
366
396
|
FastAPI dependency to get the user-specific configuration.
|
|
367
397
|
"""
|
|
368
|
-
log.debug(f"
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
398
|
+
log.debug(f"get_user_config called for user_id: {user_id}")
|
|
399
|
+
|
|
400
|
+
# TODO: DATAGO-114659-split-cleanup
|
|
401
|
+
gateway_context = {}
|
|
402
|
+
if getattr(component, "gateway_id", None):
|
|
403
|
+
gateway_context = {
|
|
404
|
+
"gateway_id": component.gateway_id,
|
|
405
|
+
"gateway_app_config": app_config,
|
|
406
|
+
"request": request,
|
|
407
|
+
}
|
|
374
408
|
return await config_resolver.resolve_user_config(
|
|
375
409
|
user_id, gateway_context, app_config
|
|
376
410
|
)
|
|
377
411
|
|
|
378
412
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
This class creates a callable dependency that validates a user has the required
|
|
384
|
-
scopes before allowing access to protected endpoints.
|
|
385
|
-
|
|
386
|
-
Args:
|
|
387
|
-
required_scopes: List of scope strings required for authorization
|
|
388
|
-
|
|
389
|
-
Raises:
|
|
390
|
-
HTTPException: 403 if user lacks required scopes
|
|
391
|
-
|
|
392
|
-
Example:
|
|
393
|
-
@router.get("/artifacts")
|
|
394
|
-
async def list_artifacts(
|
|
395
|
-
user_config: dict = Depends(ValidatedUserConfig(["tool:artifact:list"])),
|
|
396
|
-
):
|
|
397
|
-
"""
|
|
398
|
-
|
|
399
|
-
def __init__(self, required_scopes: list[str]):
|
|
400
|
-
self.required_scopes = required_scopes
|
|
401
|
-
|
|
402
|
-
async def __call__(
|
|
403
|
-
self,
|
|
404
|
-
request: Request,
|
|
405
|
-
config_resolver: ConfigResolver = Depends(get_config_resolver),
|
|
406
|
-
user_config: dict[str, Any] = Depends(get_user_config),
|
|
407
|
-
) -> dict[str, Any]:
|
|
408
|
-
user_id = user_config.get("user_profile", {}).get("id")
|
|
409
|
-
|
|
410
|
-
log.debug(
|
|
411
|
-
f"[Dependencies] ValidatedUserConfig called for user_id: {user_id} with required scopes: {self.required_scopes}"
|
|
412
|
-
)
|
|
413
|
-
|
|
414
|
-
# Validate scopes
|
|
415
|
-
if not config_resolver.is_feature_enabled(
|
|
416
|
-
user_config,
|
|
417
|
-
{"tool_metadata": {"required_scopes": self.required_scopes}},
|
|
418
|
-
{},
|
|
419
|
-
):
|
|
420
|
-
log.warning(
|
|
421
|
-
f"[Dependencies] Authorization denied for user '{user_id}'. Required scopes: {self.required_scopes}"
|
|
422
|
-
)
|
|
423
|
-
raise HTTPException(
|
|
424
|
-
status_code=status.HTTP_403_FORBIDDEN,
|
|
425
|
-
detail=f"Not authorized. Required scopes: {self.required_scopes}",
|
|
426
|
-
)
|
|
413
|
+
# DEPRECATED: Import from shared location
|
|
414
|
+
# Re-export for backward compatibility
|
|
415
|
+
from solace_agent_mesh.shared.auth.dependencies import ValidatedUserConfig
|
|
427
416
|
|
|
428
|
-
|
|
417
|
+
# Note: ValidatedUserConfig implementation moved to:
|
|
418
|
+
# src/solace_agent_mesh/shared/auth/dependencies.py
|
|
419
|
+
# This re-export will be removed in v2.0.0
|
|
429
420
|
|
|
430
421
|
|
|
431
422
|
def get_shared_artifact_service(
|
|
432
423
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
433
424
|
) -> BaseArtifactService | None:
|
|
434
425
|
"""FastAPI dependency to get the shared ArtifactService."""
|
|
435
|
-
log.debug("
|
|
426
|
+
log.debug("get_shared_artifact_service called")
|
|
436
427
|
return component.get_shared_artifact_service()
|
|
437
428
|
|
|
438
429
|
|
|
@@ -440,7 +431,7 @@ def get_embed_config(
|
|
|
440
431
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
441
432
|
) -> dict[str, Any]:
|
|
442
433
|
"""FastAPI dependency to get embed-related configuration."""
|
|
443
|
-
log.debug("
|
|
434
|
+
log.debug("get_embed_config called")
|
|
444
435
|
return component.get_embed_config()
|
|
445
436
|
|
|
446
437
|
|
|
@@ -448,10 +439,10 @@ def get_core_a2a_service(
|
|
|
448
439
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
449
440
|
) -> CoreA2AService:
|
|
450
441
|
"""FastAPI dependency to get the CoreA2AService."""
|
|
451
|
-
log.debug("
|
|
442
|
+
log.debug("get_core_a2a_service called")
|
|
452
443
|
core_service = component.get_core_a2a_service()
|
|
453
444
|
if core_service is None:
|
|
454
|
-
log.critical("
|
|
445
|
+
log.critical("CoreA2AService accessed before initialization!")
|
|
455
446
|
raise HTTPException(status_code=503, detail="Core service not ready.")
|
|
456
447
|
return core_service
|
|
457
448
|
|
|
@@ -460,10 +451,10 @@ def get_task_context_manager_from_component(
|
|
|
460
451
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
461
452
|
) -> TaskContextManager:
|
|
462
453
|
"""FastAPI dependency to get the TaskContextManager from the component."""
|
|
463
|
-
log.debug("
|
|
454
|
+
log.debug("get_task_context_manager_from_component called")
|
|
464
455
|
if component.task_context_manager is None:
|
|
465
456
|
log.critical(
|
|
466
|
-
"
|
|
457
|
+
"TaskContextManager accessed before initialization!"
|
|
467
458
|
)
|
|
468
459
|
raise HTTPException(status_code=503, detail="Task context manager not ready.")
|
|
469
460
|
return component.task_context_manager
|
|
@@ -473,7 +464,7 @@ def get_agent_card_service(
|
|
|
473
464
|
registry: AgentRegistry = Depends(get_agent_registry),
|
|
474
465
|
) -> AgentCardService:
|
|
475
466
|
"""FastAPI dependency to get an instance of AgentCardService."""
|
|
476
|
-
log.debug("
|
|
467
|
+
log.debug("get_agent_card_service called")
|
|
477
468
|
return AgentCardService(agent_registry=registry)
|
|
478
469
|
|
|
479
470
|
|
|
@@ -489,7 +480,7 @@ def get_task_service(
|
|
|
489
480
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
490
481
|
) -> TaskService:
|
|
491
482
|
"""FastAPI dependency to get an instance of TaskService."""
|
|
492
|
-
log.debug("
|
|
483
|
+
log.debug("get_task_service called")
|
|
493
484
|
app_name = component.get_config("name", "WebUIBackendApp")
|
|
494
485
|
return TaskService(
|
|
495
486
|
core_a2a_service=core_a2a_service,
|
|
@@ -506,7 +497,7 @@ def get_task_service(
|
|
|
506
497
|
def get_session_business_service(
|
|
507
498
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
508
499
|
) -> SessionService:
|
|
509
|
-
log.debug("
|
|
500
|
+
log.debug("get_session_business_service called")
|
|
510
501
|
|
|
511
502
|
# Note: Session and message repositories will be created per request
|
|
512
503
|
# when the SessionService methods receive the db parameter
|
|
@@ -516,7 +507,7 @@ def get_session_business_service(
|
|
|
516
507
|
def get_session_validator(
|
|
517
508
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
518
509
|
) -> Callable[[str, str], bool]:
|
|
519
|
-
log.debug("
|
|
510
|
+
log.debug("get_session_validator called")
|
|
520
511
|
|
|
521
512
|
if SessionLocal:
|
|
522
513
|
log.debug("Using database-backed session validation")
|
|
@@ -532,7 +523,7 @@ def get_session_validator(
|
|
|
532
523
|
return session_domain is not None
|
|
533
524
|
finally:
|
|
534
525
|
db.close()
|
|
535
|
-
except:
|
|
526
|
+
except Exception:
|
|
536
527
|
return False
|
|
537
528
|
|
|
538
529
|
return validate_with_database
|
|
@@ -550,7 +541,7 @@ def get_session_validator(
|
|
|
550
541
|
def get_db_optional() -> Generator[Session | None, None, None]:
|
|
551
542
|
"""Optional database dependency that returns None if database is not configured."""
|
|
552
543
|
if SessionLocal is None:
|
|
553
|
-
log.debug("
|
|
544
|
+
log.debug("Database not configured, returning None")
|
|
554
545
|
yield None
|
|
555
546
|
else:
|
|
556
547
|
db = SessionLocal()
|
|
@@ -563,6 +554,21 @@ def get_db_optional() -> Generator[Session | None, None, None]:
|
|
|
563
554
|
finally:
|
|
564
555
|
db.close()
|
|
565
556
|
|
|
557
|
+
def get_project_service(
|
|
558
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
559
|
+
) -> ProjectService:
|
|
560
|
+
"""Dependency factory for ProjectService."""
|
|
561
|
+
return ProjectService(component=component)
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
def get_project_service_optional(
|
|
565
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
566
|
+
) -> ProjectService | None:
|
|
567
|
+
"""Optional project service dependency that returns None if database is not configured."""
|
|
568
|
+
if SessionLocal is None:
|
|
569
|
+
log.debug("Database not configured, projects unavailable")
|
|
570
|
+
return None
|
|
571
|
+
return ProjectService(component=component)
|
|
566
572
|
|
|
567
573
|
def get_session_business_service_optional(
|
|
568
574
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
@@ -570,7 +576,36 @@ def get_session_business_service_optional(
|
|
|
570
576
|
"""Optional session service dependency that returns None if database is not configured."""
|
|
571
577
|
if SessionLocal is None:
|
|
572
578
|
log.debug(
|
|
573
|
-
"
|
|
579
|
+
"Database not configured, returning None for session service"
|
|
574
580
|
)
|
|
575
581
|
return None
|
|
576
582
|
return SessionService(component=component)
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
def get_audio_service(
|
|
586
|
+
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
587
|
+
) -> AudioService:
|
|
588
|
+
"""FastAPI dependency to get an instance of AudioService."""
|
|
589
|
+
log.debug("[get_audio_service] called")
|
|
590
|
+
# AudioService expects app_config which contains the speech configuration
|
|
591
|
+
app_config = component.component_config.get('app_config', {}) if hasattr(component, 'component_config') else {}
|
|
592
|
+
log.debug(f"[get_audio_service] app_config keys: {app_config.keys()}")
|
|
593
|
+
return AudioService(config=app_config)
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def get_user_display_name(
|
|
598
|
+
request: Request,
|
|
599
|
+
user_id: str = Depends(get_user_id),
|
|
600
|
+
) -> str:
|
|
601
|
+
"""
|
|
602
|
+
FastAPI dependency to get a user's display name.
|
|
603
|
+
Returns email if available, otherwise returns user_id.
|
|
604
|
+
"""
|
|
605
|
+
# Try to get user info from request state (set by AuthMiddleware)
|
|
606
|
+
if hasattr(request.state, "user") and request.state.user:
|
|
607
|
+
user_info = request.state.user
|
|
608
|
+
# Try email first, then name, then fall back to user_id
|
|
609
|
+
return user_info.get("email") or user_info.get("name") or user_id
|
|
610
|
+
|
|
611
|
+
return user_id
|