solace-agent-mesh 1.7.1__py3-none-any.whl → 1.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +164 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +752 -127
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +99 -7
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +41 -1
- solace_agent_mesh/agent/adk/setup.py +220 -32
- solace_agent_mesh/agent/adk/stream_parser.py +229 -40
- solace_agent_mesh/agent/protocol/event_handlers.py +219 -33
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +37 -12
- solace_agent_mesh/agent/sac/component.py +322 -52
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +90 -0
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +698 -24
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +54 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +243 -5
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +75 -75
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +98 -112
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -28
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -29
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +67 -53
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +87 -87
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +50 -23
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +29 -24
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +21 -21
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +96 -66
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +181 -181
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +75 -75
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -38
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +135 -114
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +37 -37
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +112 -112
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +28 -28
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-tcIFZLis.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-CINwxvwV.js → vendor-CGk8Suyh.js} +189 -94
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/a2a/types.py +1 -1
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +124 -0
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +73 -1
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +2 -27
- solace_agent_mesh/common/utils/embeds/resolver.py +94 -25
- solace_agent_mesh/common/utils/embeds/types.py +1 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/base.py +28 -1
- solace_agent_mesh/gateway/adapter/types.py +9 -0
- solace_agent_mesh/gateway/base/app.py +10 -0
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +451 -10
- solace_agent_mesh/gateway/generic/component.py +274 -30
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +2 -43
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +2 -2
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +158 -73
- solace_agent_mesh/gateway/http_sse/dependencies.py +50 -57
- solace_agent_mesh/gateway/http_sse/main.py +58 -482
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +3 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +5 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +12 -107
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +113 -7
- solace_agent_mesh/gateway/http_sse/routers/auth.py +69 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +235 -10
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +1 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +250 -24
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +14 -5
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +117 -4
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +509 -149
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/project_service.py +539 -12
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +198 -21
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/sse_manager.py +280 -169
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +29 -8
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/RECORD +334 -313
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
- solace_agent_mesh/agent/agent_llm.txt +0 -369
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
- solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
- solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.c39f8388.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.830d443f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.045d0fa1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.f213fe0c.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +0 -1
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +0 -47
- solace_agent_mesh/assets/docs/lunr-index-1762283454666.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1762283454666.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CRYdKo2Q.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +0 -353
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
- solace_agent_mesh/common/common_llm.txt +0 -230
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
- solace_agent_mesh/common/services/services_llm.txt +0 -368
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -335
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -226
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -369
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +0 -92
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- /solace_agent_mesh/assets/docs/assets/js/{main.f213fe0c.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.7.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""
|
|
2
2
|
FastAPI router for managing session-specific artifacts via REST endpoints.
|
|
3
3
|
"""
|
|
4
|
+
from __future__ import annotations
|
|
4
5
|
|
|
5
6
|
import logging
|
|
6
7
|
from collections.abc import Callable
|
|
@@ -42,6 +43,7 @@ from ....common.utils.embeds import (
|
|
|
42
43
|
)
|
|
43
44
|
from ....common.utils.embeds.types import ResolutionMode
|
|
44
45
|
from ....common.utils.mime_helpers import is_text_based_mime_type
|
|
46
|
+
from ....common.utils.templates import resolve_template_blocks_in_string
|
|
45
47
|
from ..dependencies import (
|
|
46
48
|
get_project_service_optional,
|
|
47
49
|
ValidatedUserConfig,
|
|
@@ -71,6 +73,7 @@ if TYPE_CHECKING:
|
|
|
71
73
|
|
|
72
74
|
log = logging.getLogger(__name__)
|
|
73
75
|
|
|
76
|
+
LOAD_FILE_CHUNK_SIZE = 1024 * 1024 # 1MB chunks
|
|
74
77
|
|
|
75
78
|
class ArtifactUploadResponse(BaseModel):
|
|
76
79
|
"""Response model for artifact upload with camelCase fields."""
|
|
@@ -205,6 +208,7 @@ async def upload_artifact_with_session(
|
|
|
205
208
|
|
|
206
209
|
# Handle session creation logic (matching chat API pattern)
|
|
207
210
|
effective_session_id = None
|
|
211
|
+
is_new_session = False # Track if we created a new session
|
|
208
212
|
|
|
209
213
|
# Use session ID from request body (matching sessionId pattern in session APIs)
|
|
210
214
|
if sessionId and sessionId.strip():
|
|
@@ -213,6 +217,7 @@ async def upload_artifact_with_session(
|
|
|
213
217
|
else:
|
|
214
218
|
# Create new session when no sessionId provided (like chat does for new conversations)
|
|
215
219
|
effective_session_id = session_manager.create_new_session_id(request)
|
|
220
|
+
is_new_session = True # Mark that we created this session
|
|
216
221
|
log.info(
|
|
217
222
|
"%sCreated new session for file upload: %s",
|
|
218
223
|
log_prefix,
|
|
@@ -271,7 +276,8 @@ async def upload_artifact_with_session(
|
|
|
271
276
|
)
|
|
272
277
|
|
|
273
278
|
# Validate session (now that we have an effective_session_id)
|
|
274
|
-
if
|
|
279
|
+
# Skip validation if we just created the session to avoid race conditions
|
|
280
|
+
if not is_new_session and not validate_session(effective_session_id, user_id):
|
|
275
281
|
log.warning(
|
|
276
282
|
"%sSession validation failed for session: %s",
|
|
277
283
|
log_prefix,
|
|
@@ -290,8 +296,78 @@ async def upload_artifact_with_session(
|
|
|
290
296
|
)
|
|
291
297
|
|
|
292
298
|
try:
|
|
293
|
-
#
|
|
294
|
-
|
|
299
|
+
# ===== VALIDATE FILE SIZE BEFORE READING =====
|
|
300
|
+
max_upload_size = component.get_config("gateway_max_upload_size_bytes")
|
|
301
|
+
|
|
302
|
+
# Check Content-Length header first (if available)
|
|
303
|
+
content_length = request.headers.get("content-length")
|
|
304
|
+
if content_length:
|
|
305
|
+
try:
|
|
306
|
+
file_size = int(content_length)
|
|
307
|
+
|
|
308
|
+
if file_size > max_upload_size:
|
|
309
|
+
error_msg = (
|
|
310
|
+
f"File upload rejected: size {file_size:,} bytes "
|
|
311
|
+
f"exceeds maximum {max_upload_size:,} bytes "
|
|
312
|
+
f"({file_size / (1024*1024):.2f} MB > {max_upload_size / (1024*1024):.2f} MB)"
|
|
313
|
+
)
|
|
314
|
+
log.warning("%s %s", log_prefix, error_msg)
|
|
315
|
+
|
|
316
|
+
raise HTTPException(
|
|
317
|
+
status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
|
|
318
|
+
detail=error_msg # Use string instead of dict
|
|
319
|
+
)
|
|
320
|
+
except ValueError:
|
|
321
|
+
log.warning("%s Invalid Content-Length header: %s", log_prefix, content_length)
|
|
322
|
+
|
|
323
|
+
# Validate file size by streaming through WITHOUT accumulating chunks in memory
|
|
324
|
+
chunk_size = LOAD_FILE_CHUNK_SIZE
|
|
325
|
+
total_bytes_read = 0
|
|
326
|
+
|
|
327
|
+
try:
|
|
328
|
+
# Step 1: Validate size by reading chunks (discard data, just count bytes)
|
|
329
|
+
while True:
|
|
330
|
+
chunk = await upload_file.read(chunk_size)
|
|
331
|
+
if not chunk:
|
|
332
|
+
break # End of file
|
|
333
|
+
|
|
334
|
+
total_bytes_read += len(chunk)
|
|
335
|
+
|
|
336
|
+
# Validate size during reading (fail fast)
|
|
337
|
+
if total_bytes_read > max_upload_size:
|
|
338
|
+
error_msg = (
|
|
339
|
+
f"File '{upload_file.filename}' rejected: size exceeds maximum {max_upload_size:,} bytes "
|
|
340
|
+
f"(read {total_bytes_read:,} bytes so far, "
|
|
341
|
+
f"{total_bytes_read / (1024*1024):.2f} MB > {max_upload_size / (1024*1024):.2f} MB)"
|
|
342
|
+
)
|
|
343
|
+
log.warning("%s %s", log_prefix, error_msg)
|
|
344
|
+
|
|
345
|
+
raise HTTPException(
|
|
346
|
+
status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
|
|
347
|
+
detail=error_msg
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
# Step 2: Size is valid - reset to beginning
|
|
351
|
+
await upload_file.seek(0)
|
|
352
|
+
|
|
353
|
+
# Step 3: Read all content at once
|
|
354
|
+
content_bytes = await upload_file.read()
|
|
355
|
+
|
|
356
|
+
log.debug(
|
|
357
|
+
"%s File validated (%d bytes) and loaded into memory",
|
|
358
|
+
log_prefix,
|
|
359
|
+
total_bytes_read
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
except HTTPException:
|
|
363
|
+
# Re-raise HTTP exceptions (size limit exceeded)
|
|
364
|
+
raise
|
|
365
|
+
except Exception as read_error:
|
|
366
|
+
log.exception("%s Error reading uploaded file: %s", log_prefix, read_error)
|
|
367
|
+
raise HTTPException(
|
|
368
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
369
|
+
detail="Failed to read uploaded file"
|
|
370
|
+
)
|
|
295
371
|
|
|
296
372
|
mime_type = upload_file.content_type or "application/octet-stream"
|
|
297
373
|
filename_clean = filename.strip()
|
|
@@ -323,6 +399,8 @@ async def upload_artifact_with_session(
|
|
|
323
399
|
|
|
324
400
|
if error_type in ["invalid_filename", "empty_file"]:
|
|
325
401
|
status_code = status.HTTP_400_BAD_REQUEST
|
|
402
|
+
elif error_type == "file_too_large":
|
|
403
|
+
status_code = status.HTTP_413_REQUEST_ENTITY_TOO_LARGE
|
|
326
404
|
else:
|
|
327
405
|
status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
|
|
328
406
|
|
|
@@ -631,12 +709,26 @@ async def get_latest_artifact(
|
|
|
631
709
|
max_depth=component.gateway_recursive_embed_depth,
|
|
632
710
|
max_total_size=component.gateway_max_artifact_resolve_size_bytes,
|
|
633
711
|
)
|
|
634
|
-
data_bytes = resolved_content_string.encode("utf-8")
|
|
635
712
|
log.info(
|
|
636
713
|
"%s Recursive embed resolution complete. New size: %d bytes.",
|
|
637
714
|
log_prefix,
|
|
638
|
-
len(
|
|
715
|
+
len(resolved_content_string),
|
|
716
|
+
)
|
|
717
|
+
|
|
718
|
+
# Also resolve any template blocks in the artifact
|
|
719
|
+
resolved_content_string = await resolve_template_blocks_in_string(
|
|
720
|
+
text=resolved_content_string,
|
|
721
|
+
artifact_service=artifact_service,
|
|
722
|
+
session_context=context_for_resolver["session_context"],
|
|
723
|
+
log_identifier=f"{log_prefix}[TemplateResolve]",
|
|
724
|
+
)
|
|
725
|
+
log.info(
|
|
726
|
+
"%s Template block resolution complete. Final size: %d bytes.",
|
|
727
|
+
log_prefix,
|
|
728
|
+
len(resolved_content_string),
|
|
639
729
|
)
|
|
730
|
+
|
|
731
|
+
data_bytes = resolved_content_string.encode("utf-8")
|
|
640
732
|
except UnicodeDecodeError as ude:
|
|
641
733
|
log.warning(
|
|
642
734
|
"%s Failed to decode artifact for recursive resolution: %s. Serving original content.",
|
|
@@ -812,12 +904,26 @@ async def get_specific_artifact_version(
|
|
|
812
904
|
max_depth=component.gateway_recursive_embed_depth,
|
|
813
905
|
max_total_size=component.gateway_max_artifact_resolve_size_bytes,
|
|
814
906
|
)
|
|
815
|
-
data_bytes = resolved_content_string.encode("utf-8")
|
|
816
907
|
log.info(
|
|
817
908
|
"%s Recursive embed resolution complete. New size: %d bytes.",
|
|
818
909
|
log_prefix,
|
|
819
|
-
len(
|
|
910
|
+
len(resolved_content_string),
|
|
820
911
|
)
|
|
912
|
+
|
|
913
|
+
# Also resolve any template blocks in the artifact
|
|
914
|
+
resolved_content_string = await resolve_template_blocks_in_string(
|
|
915
|
+
text=resolved_content_string,
|
|
916
|
+
artifact_service=artifact_service,
|
|
917
|
+
session_context=context_for_resolver["session_context"],
|
|
918
|
+
log_identifier=f"{log_prefix}[TemplateResolve]",
|
|
919
|
+
)
|
|
920
|
+
log.info(
|
|
921
|
+
"%s Template block resolution complete. Final size: %d bytes.",
|
|
922
|
+
log_prefix,
|
|
923
|
+
len(resolved_content_string),
|
|
924
|
+
)
|
|
925
|
+
|
|
926
|
+
data_bytes = resolved_content_string.encode("utf-8")
|
|
821
927
|
except UnicodeDecodeError as ude:
|
|
822
928
|
log.warning(
|
|
823
929
|
"%s Failed to decode artifact for recursive resolution: %s. Serving original content.",
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Router for handling authentication-related endpoints.
|
|
3
3
|
"""
|
|
4
|
+
from __future__ import annotations
|
|
4
5
|
|
|
5
6
|
import logging
|
|
6
7
|
import secrets
|
|
7
|
-
from urllib.parse import urlencode
|
|
8
8
|
|
|
9
|
-
import httpx
|
|
10
9
|
from fastapi import (
|
|
11
10
|
APIRouter,
|
|
12
11
|
Depends,
|
|
@@ -14,7 +13,7 @@ from fastapi import (
|
|
|
14
13
|
Request as FastAPIRequest,
|
|
15
14
|
Response,
|
|
16
15
|
)
|
|
17
|
-
from fastapi.responses import HTMLResponse
|
|
16
|
+
from fastapi.responses import HTMLResponse
|
|
18
17
|
|
|
19
18
|
from ...http_sse.dependencies import get_api_config, get_sac_component
|
|
20
19
|
|
|
@@ -30,20 +29,16 @@ async def initiate_login(
|
|
|
30
29
|
"""
|
|
31
30
|
Initiates the login flow by redirecting to the external authorization service.
|
|
32
31
|
"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
params = {
|
|
39
|
-
"provider": config.get("external_auth_provider", "azure"),
|
|
40
|
-
"redirect_uri": callback_url,
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
login_url = f"{external_auth_url}/login?{urlencode(params)}"
|
|
44
|
-
log.info(f"Redirecting to external authorization service: {login_url}")
|
|
32
|
+
try:
|
|
33
|
+
from solace_agent_mesh_enterprise.gateway.auth import handle_login_initiation
|
|
45
34
|
|
|
46
|
-
|
|
35
|
+
return await handle_login_initiation(request, config)
|
|
36
|
+
except ImportError:
|
|
37
|
+
raise HTTPException(
|
|
38
|
+
status_code=501,
|
|
39
|
+
detail="OAuth authentication requires enterprise package. "
|
|
40
|
+
"Install: pip install solace-agent-mesh-enterprise",
|
|
41
|
+
)
|
|
47
42
|
|
|
48
43
|
|
|
49
44
|
@router.get("/csrf-token")
|
|
@@ -76,86 +71,64 @@ async def auth_callback(
|
|
|
76
71
|
"""
|
|
77
72
|
Handles the callback from the OIDC provider by calling an external exchange service.
|
|
78
73
|
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if not code:
|
|
82
|
-
raise HTTPException(status_code=400, detail="Missing authorization code")
|
|
83
|
-
|
|
84
|
-
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
85
|
-
exchange_url = f"{external_auth_url}/exchange-code"
|
|
86
|
-
redirect_uri = config.get(
|
|
87
|
-
"external_auth_callback_uri", "http://localhost:8000/api/v1/auth/callback"
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
async with httpx.AsyncClient() as client:
|
|
91
|
-
try:
|
|
92
|
-
response = await client.post(
|
|
93
|
-
exchange_url,
|
|
94
|
-
json={
|
|
95
|
-
"code": code,
|
|
96
|
-
"provider": config.get("external_auth_provider", "azure"),
|
|
97
|
-
"redirect_uri": redirect_uri,
|
|
98
|
-
},
|
|
99
|
-
timeout=20.0,
|
|
100
|
-
)
|
|
101
|
-
response.raise_for_status()
|
|
102
|
-
token_data = response.json()
|
|
103
|
-
except httpx.HTTPStatusError as e:
|
|
104
|
-
log.error(f"Failed to exchange code: {e.response.text}")
|
|
105
|
-
raise HTTPException(
|
|
106
|
-
status_code=e.response.status_code,
|
|
107
|
-
detail=f"Failed to exchange code: {e.response.text}",
|
|
108
|
-
)
|
|
109
|
-
except Exception as e:
|
|
110
|
-
log.error(f"Error during code exchange: {e}")
|
|
111
|
-
raise HTTPException(status_code=500, detail="Error during code exchange")
|
|
112
|
-
|
|
113
|
-
access_token = token_data.get("access_token")
|
|
114
|
-
refresh_token = token_data.get("refresh_token")
|
|
74
|
+
try:
|
|
75
|
+
from solace_agent_mesh_enterprise.gateway.auth import handle_auth_callback
|
|
115
76
|
|
|
116
|
-
|
|
77
|
+
return await handle_auth_callback(
|
|
78
|
+
request, config, component
|
|
79
|
+
)
|
|
80
|
+
except ImportError:
|
|
117
81
|
raise HTTPException(
|
|
118
|
-
status_code=
|
|
82
|
+
status_code=501,
|
|
83
|
+
detail="OAuth authentication requires enterprise package. "
|
|
84
|
+
"Install: pip install solace-agent-mesh-enterprise",
|
|
119
85
|
)
|
|
120
86
|
|
|
121
|
-
request.session["access_token"] = access_token
|
|
122
|
-
if refresh_token:
|
|
123
|
-
request.session["refresh_token"] = refresh_token
|
|
124
|
-
log.debug("Tokens stored directly in session.")
|
|
125
87
|
|
|
88
|
+
@router.post("/auth/logout")
|
|
89
|
+
async def logout(request: FastAPIRequest, response: Response):
|
|
90
|
+
"""
|
|
91
|
+
Logout endpoint - clears server-side session and access token.
|
|
92
|
+
|
|
93
|
+
This endpoint:
|
|
94
|
+
- Clears the access_token from the session storage
|
|
95
|
+
- Clears all session data
|
|
96
|
+
- Returns success even if already logged out (idempotent)
|
|
97
|
+
|
|
98
|
+
The session cookie will be invalidated, requiring re-authentication
|
|
99
|
+
on the next request.
|
|
100
|
+
"""
|
|
126
101
|
try:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
102
|
+
# Clear access token from session storage
|
|
103
|
+
if hasattr(request, 'session') and 'access_token' in request.session:
|
|
104
|
+
del request.session['access_token']
|
|
105
|
+
log.debug("Cleared access_token from session")
|
|
106
|
+
|
|
107
|
+
# Clear refresh token if present
|
|
108
|
+
if hasattr(request, 'session') and 'refresh_token' in request.session:
|
|
109
|
+
del request.session['refresh_token']
|
|
110
|
+
log.debug("Cleared refresh_token from session")
|
|
111
|
+
|
|
112
|
+
# Clear all other session data
|
|
113
|
+
if hasattr(request, 'session'):
|
|
114
|
+
request.session.clear()
|
|
115
|
+
log.debug("Cleared all session data")
|
|
116
|
+
|
|
117
|
+
# Clear the session cookie from response to FE cannot use
|
|
118
|
+
response.delete_cookie(
|
|
119
|
+
key="session", # Starlette's default session cookie name
|
|
120
|
+
path="/",
|
|
121
|
+
samesite="lax"
|
|
122
|
+
)
|
|
123
|
+
log.debug("Deleted session cookie")
|
|
124
|
+
|
|
125
|
+
log.info("User logged out successfully")
|
|
126
|
+
return {"success": True, "message": "Logged out successfully"}
|
|
127
|
+
|
|
146
128
|
except Exception as e:
|
|
147
|
-
log.error(f"Error
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
hash_params = {"access_token": access_token}
|
|
152
|
-
if refresh_token:
|
|
153
|
-
hash_params["refresh_token"] = refresh_token
|
|
154
|
-
|
|
155
|
-
hash_fragment = urlencode(hash_params)
|
|
156
|
-
|
|
157
|
-
frontend_redirect_url = f"{frontend_base_url}/auth-callback.html#{hash_fragment}"
|
|
158
|
-
return RedirectResponse(url=frontend_redirect_url)
|
|
129
|
+
log.error(f"Error during logout: {e}")
|
|
130
|
+
# Still return success - logout should be idempotent
|
|
131
|
+
return {"success": True, "message": "Logged out successfully"}
|
|
159
132
|
|
|
160
133
|
|
|
161
134
|
@router.post("/auth/refresh")
|
|
@@ -167,53 +140,17 @@ async def refresh_token(
|
|
|
167
140
|
"""
|
|
168
141
|
Refreshes an access token using the external authorization service.
|
|
169
142
|
"""
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if not refresh_token:
|
|
173
|
-
raise HTTPException(status_code=400, detail="Missing refresh_token")
|
|
174
|
-
|
|
175
|
-
external_auth_url = config.get("external_auth_service_url", "http://localhost:8080")
|
|
176
|
-
refresh_url = f"{external_auth_url}/refresh_token"
|
|
177
|
-
|
|
178
|
-
async with httpx.AsyncClient() as client:
|
|
179
|
-
try:
|
|
180
|
-
response = await client.post(
|
|
181
|
-
refresh_url,
|
|
182
|
-
json={
|
|
183
|
-
"refresh_token": refresh_token,
|
|
184
|
-
"provider": config.get("external_auth_provider", "azure"),
|
|
185
|
-
},
|
|
186
|
-
timeout=20.0,
|
|
187
|
-
)
|
|
188
|
-
response.raise_for_status()
|
|
189
|
-
token_data = response.json()
|
|
190
|
-
except httpx.HTTPStatusError as e:
|
|
191
|
-
log.error(f"Failed to refresh token: {e.response.text}")
|
|
192
|
-
raise HTTPException(
|
|
193
|
-
status_code=e.response.status_code,
|
|
194
|
-
detail=f"Failed to refresh token: {e.response.text}",
|
|
195
|
-
)
|
|
196
|
-
except Exception as e:
|
|
197
|
-
log.error(f"Error during token refresh: {e}")
|
|
198
|
-
raise HTTPException(status_code=500, detail="Error during token refresh")
|
|
199
|
-
|
|
200
|
-
access_token = token_data.get("access_token")
|
|
201
|
-
new_refresh_token = token_data.get("refresh_token")
|
|
143
|
+
try:
|
|
144
|
+
from solace_agent_mesh_enterprise.gateway.auth import handle_token_refresh
|
|
202
145
|
|
|
203
|
-
|
|
146
|
+
return await handle_token_refresh(request, config, component)
|
|
147
|
+
except ImportError:
|
|
204
148
|
raise HTTPException(
|
|
205
|
-
status_code=
|
|
149
|
+
status_code=501,
|
|
150
|
+
detail="OAuth authentication requires enterprise package. "
|
|
151
|
+
"Install: pip install solace-agent-mesh-enterprise",
|
|
206
152
|
)
|
|
207
153
|
|
|
208
|
-
session_manager = component.get_session_manager()
|
|
209
|
-
session_manager.store_auth_tokens(request, access_token, new_refresh_token)
|
|
210
|
-
log.info("Successfully refreshed and updated tokens in session.")
|
|
211
|
-
|
|
212
|
-
return {
|
|
213
|
-
"access_token": access_token,
|
|
214
|
-
"refresh_token": new_refresh_token,
|
|
215
|
-
}
|
|
216
|
-
|
|
217
154
|
|
|
218
155
|
@router.get("/auth/tool/callback")
|
|
219
156
|
async def auth_tool_callback(
|