solace-agent-mesh 1.11.2__py3-none-any.whl → 1.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solace_agent_mesh/agent/adk/callbacks.py +177 -10
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/setup.py +61 -26
- solace_agent_mesh/agent/protocol/event_handlers.py +48 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +27 -0
- solace_agent_mesh/agent/sac/component.py +84 -2
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +41 -22
- solace_agent_mesh/agent/tools/peer_agent_tool.py +19 -12
- solace_agent_mesh/agent/tools/tool_config_types.py +21 -1
- solace_agent_mesh/agent/utils/artifact_helpers.py +54 -0
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{3ac1795d.28b7c67b.js → 3ac1795d.dc006e20.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.f08618fb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.95be65d4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.08fab659.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.b241af3e.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.4ca7d2e2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +14 -12
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +30 -9
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +6 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/{kubernetes-deployment → kubernetes}/index.html +6 -6
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +11 -6
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +23 -5
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +17 -8
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +6 -5
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +25 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1767712284328.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1767712284328.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +29 -2
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +2 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-Dj3JtK42.js → authCallback-8Nihi8rv.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-ZKk9kEJ5.js → client-DYtZN8p-.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-BYGUHQMk.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-D2CSH1bp.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BNV4kZN0.js → vendor-XBWAmrun.js} +106 -101
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +1 -1
- solace_agent_mesh/common/a2a/types.py +1 -1
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +28 -0
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/config_portal/backend/common.py +2 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ZV-jX48T.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-ba77705e.js → manifest-ce5bc5da.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/base.py +28 -1
- solace_agent_mesh/gateway/adapter/types.py +9 -0
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +68 -1
- solace_agent_mesh/gateway/generic/component.py +195 -30
- solace_agent_mesh/gateway/http_sse/app.py +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +9 -61
- solace_agent_mesh/gateway/http_sse/dependencies.py +9 -51
- solace_agent_mesh/gateway/http_sse/main.py +28 -418
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -4
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +16 -15
- solace_agent_mesh/gateway/http_sse/routers/auth.py +61 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +12 -8
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +2 -1
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +2 -1
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +3 -3
- solace_agent_mesh/gateway/http_sse/routers/speech.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/session_service.py +4 -4
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +1 -1
- solace_agent_mesh/services/platform/__init__.py +23 -12
- solace_agent_mesh/services/platform/api/dependencies.py +23 -16
- solace_agent_mesh/services/platform/api/main.py +118 -43
- solace_agent_mesh/services/platform/api/routers/__init__.py +12 -3
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +101 -7
- solace_agent_mesh/services/platform/component.py +552 -33
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +291 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +1 -1
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/webui.yaml +12 -3
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/METADATA +2 -1
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/RECORD +214 -258
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -189
- solace_agent_mesh/agent/agent_llm.txt +0 -369
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +0 -190
- solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
- solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -58
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1765810064709.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +0 -435
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
- solace_agent_mesh/common/common_llm.txt +0 -230
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -81
- solace_agent_mesh/common/services/services_llm.txt +0 -368
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -335
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +0 -103
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -226
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -369
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -221
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- /solace_agent_mesh/assets/docs/assets/js/{main.7acf7ace.js.LICENSE.txt → main.b241af3e.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
window.__remixManifest={"entry":{"module":"/assets/entry.client-mvZjNKiz.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-V2BeTIUc.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":["/assets/root-B17tZKK7.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-
|
|
1
|
+
window.__remixManifest={"entry":{"module":"/assets/entry.client-mvZjNKiz.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-V2BeTIUc.js","imports":["/assets/index-DzNKzXrc.js","/assets/components-Rk0n-9cK.js"],"css":["/assets/root-B17tZKK7.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-ZV-jX48T.js","imports":["/assets/index-DzNKzXrc.js"],"css":[]}},"url":"/assets/manifest-ce5bc5da.js","version":"ce5bc5da"};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-B17tZKK7.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-
|
|
2
|
+
<html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-B17tZKK7.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-ce5bc5da.js"/><link rel="modulepreload" href="/assets/entry.client-mvZjNKiz.js"/><link rel="modulepreload" href="/assets/index-DzNKzXrc.js"/><link rel="modulepreload" href="/assets/components-Rk0n-9cK.js"/><link rel="modulepreload" href="/assets/root-V2BeTIUc.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-ce5bc5da.js";
|
|
3
3
|
import * as route0 from "/assets/root-V2BeTIUc.js";
|
|
4
4
|
|
|
5
5
|
window.__remixRouteModules = {"root":route0};
|
|
@@ -22,13 +22,14 @@ class CoreA2AService:
|
|
|
22
22
|
and SAC messaging implementation.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
def __init__(self, agent_registry: AgentRegistry, namespace: str):
|
|
25
|
+
def __init__(self, agent_registry: AgentRegistry, namespace: str, component_id: str = None):
|
|
26
26
|
"""
|
|
27
27
|
Initializes the CoreA2AService.
|
|
28
28
|
|
|
29
29
|
Args:
|
|
30
30
|
agent_registry: An instance of the shared AgentRegistry.
|
|
31
31
|
namespace: The namespace string.
|
|
32
|
+
component_id: Optional component identifier for distinguishing logs (e.g., "Platform", "WebUI")
|
|
32
33
|
"""
|
|
33
34
|
if not isinstance(agent_registry, AgentRegistry):
|
|
34
35
|
raise TypeError("agent_registry must be an instance of AgentRegistry")
|
|
@@ -37,7 +38,7 @@ class CoreA2AService:
|
|
|
37
38
|
|
|
38
39
|
self.agent_registry = agent_registry
|
|
39
40
|
self.namespace = namespace
|
|
40
|
-
self.log_identifier = "[CoreA2AService]"
|
|
41
|
+
self.log_identifier = f"[CoreA2AService-{component_id}]" if component_id else "[CoreA2AService]"
|
|
41
42
|
log.info("%s Initialized with namespace: %s", self.log_identifier, namespace)
|
|
42
43
|
|
|
43
44
|
def submit_task(
|
|
@@ -3,10 +3,14 @@ Defines the abstract base class for Generic Gateway Adapters.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
|
-
from typing import Any, Dict, Generic, Optional, Type, TypeVar
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar
|
|
7
7
|
|
|
8
8
|
from pydantic import BaseModel
|
|
9
9
|
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from a2a.types import AgentCard
|
|
12
|
+
|
|
13
|
+
|
|
10
14
|
from .types import (
|
|
11
15
|
AuthClaims,
|
|
12
16
|
GatewayContext,
|
|
@@ -141,3 +145,26 @@ class GatewayAdapter(
|
|
|
141
145
|
async def handle_error(self, error: SamError, context: ResponseContext) -> None:
|
|
142
146
|
"""Handle error from the agent or gateway."""
|
|
143
147
|
pass
|
|
148
|
+
|
|
149
|
+
# --- Agent Registry Change Handlers ---
|
|
150
|
+
|
|
151
|
+
async def handle_agent_registered(self, agent_card: "AgentCard") -> None:
|
|
152
|
+
"""
|
|
153
|
+
Called when a new agent is registered in the agent registry.
|
|
154
|
+
|
|
155
|
+
This allows adapters to react to new agents becoming available.
|
|
156
|
+
For example, the MCP adapter can register new tools dynamically.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
agent_card: The AgentCard of the newly registered agent
|
|
160
|
+
"""
|
|
161
|
+
pass # Optional - default is no-op
|
|
162
|
+
|
|
163
|
+
async def handle_agent_deregistered(self, agent_name: str) -> None:
|
|
164
|
+
"""
|
|
165
|
+
Called when an agent is removed from the registry (e.g., TTL expiry).
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
agent_name: Name of the agent that was removed
|
|
169
|
+
"""
|
|
170
|
+
pass # Optional - default is no-op
|
|
@@ -70,6 +70,10 @@ class SamTask(BaseModel):
|
|
|
70
70
|
default_factory=dict,
|
|
71
71
|
description="Platform-specific data for response routing.",
|
|
72
72
|
)
|
|
73
|
+
session_behavior: Optional[str] = Field(
|
|
74
|
+
default=None,
|
|
75
|
+
description="Session behavior: 'PERSISTENT' or 'RUN_BASED'. If provided, overrides agent's default.",
|
|
76
|
+
)
|
|
73
77
|
|
|
74
78
|
|
|
75
79
|
class SamUpdate(BaseModel):
|
|
@@ -174,6 +178,11 @@ class GatewayContext:
|
|
|
174
178
|
"""Lists all artifacts available in the user's context."""
|
|
175
179
|
raise NotImplementedError
|
|
176
180
|
|
|
181
|
+
def list_agents(self) -> List[Any]:
|
|
182
|
+
"""Lists all agents currently registered in the agent registry."""
|
|
183
|
+
raise NotImplementedError
|
|
184
|
+
|
|
185
|
+
|
|
177
186
|
def add_timer(
|
|
178
187
|
self, delay_ms: int, callback: "Callable", interval_ms: Optional[int] = None
|
|
179
188
|
) -> str:
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Abstract interface for gateway authentication.
|
|
2
|
+
|
|
3
|
+
This module defines the auth interface that enterprise implementations
|
|
4
|
+
must follow. The community repo provides only the interface - the actual
|
|
5
|
+
OAuth implementation lives in solace-agent-mesh-enterprise.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import Dict, Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AuthHandler(ABC):
|
|
13
|
+
"""
|
|
14
|
+
Base interface for authentication handlers.
|
|
15
|
+
|
|
16
|
+
Enterprise implementations (e.g., SAMOAuth2Handler) implement this interface
|
|
17
|
+
to provide OAuth2, API key, or other authentication mechanisms.
|
|
18
|
+
|
|
19
|
+
The handler is responsible for:
|
|
20
|
+
- Initiating authorization flows (OAuth, API key setup, etc.)
|
|
21
|
+
- Handling callbacks from auth providers
|
|
22
|
+
- Providing auth headers for outgoing requests
|
|
23
|
+
- Managing authentication state
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
async def handle_authorize(self, request: Any) -> Any:
|
|
28
|
+
"""
|
|
29
|
+
Initiate authorization flow.
|
|
30
|
+
|
|
31
|
+
For OAuth2, this typically redirects to the OAuth2 service.
|
|
32
|
+
For API keys, this might return a setup page.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
request: Framework-specific request object (FastAPI Request, etc.)
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Framework-specific redirect response or dict with redirect_url.
|
|
39
|
+
For dict responses, should contain:
|
|
40
|
+
- redirect_url: str - URL to redirect to
|
|
41
|
+
- status_code: int - HTTP status code (default 302)
|
|
42
|
+
|
|
43
|
+
Raises:
|
|
44
|
+
Exception: If authorization initiation fails
|
|
45
|
+
"""
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
@abstractmethod
|
|
49
|
+
async def handle_callback(self, request: Any) -> Dict[str, Any]:
|
|
50
|
+
"""
|
|
51
|
+
Handle OAuth callback or auth completion.
|
|
52
|
+
|
|
53
|
+
For OAuth2, this exchanges authorization codes for tokens.
|
|
54
|
+
For API keys, this might process key submission.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
request: Framework-specific request object with callback params
|
|
58
|
+
(e.g., code, state for OAuth2)
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Dictionary with callback result:
|
|
62
|
+
- success: bool - Whether auth succeeded
|
|
63
|
+
- message: str - Human-readable status message
|
|
64
|
+
- (optional) redirect_url: str - URL to redirect to after callback
|
|
65
|
+
|
|
66
|
+
Raises:
|
|
67
|
+
ValueError: If callback parameters are invalid
|
|
68
|
+
Exception: If auth exchange/completion fails
|
|
69
|
+
"""
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
@abstractmethod
|
|
73
|
+
async def get_auth_headers(self) -> Dict[str, str]:
|
|
74
|
+
"""
|
|
75
|
+
Get authentication headers for outgoing API requests.
|
|
76
|
+
|
|
77
|
+
Returns headers that should be included in HTTP requests to
|
|
78
|
+
authenticate with external services.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Dictionary of HTTP headers (e.g., {"Authorization": "Bearer ..."})
|
|
82
|
+
Returns empty dict {} if not authenticated or no headers needed.
|
|
83
|
+
|
|
84
|
+
Examples:
|
|
85
|
+
OAuth2: {"Authorization": "Bearer eyJhbGc..."}
|
|
86
|
+
API Key: {"X-API-Key": "sk-..."}
|
|
87
|
+
Basic Auth: {"Authorization": "Basic dXNlcjpwYXNz"}
|
|
88
|
+
"""
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
async def is_authenticated(self) -> bool:
|
|
93
|
+
"""
|
|
94
|
+
Check if currently authenticated.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if authenticated with valid credentials, False otherwise.
|
|
98
|
+
|
|
99
|
+
Notes:
|
|
100
|
+
This should check if credentials are present AND valid.
|
|
101
|
+
For token-based auth, this might check token expiration.
|
|
102
|
+
"""
|
|
103
|
+
pass
|
|
@@ -22,6 +22,7 @@ from ...common.services.identity_service import (
|
|
|
22
22
|
create_identity_service,
|
|
23
23
|
)
|
|
24
24
|
from .task_context import TaskContextManager
|
|
25
|
+
from .auth_interface import AuthHandler
|
|
25
26
|
from ...common.a2a.types import ContentPart
|
|
26
27
|
from ...common.utils.rbac_utils import validate_agent_access
|
|
27
28
|
from a2a.types import (
|
|
@@ -169,7 +170,9 @@ class BaseGatewayComponent(SamComponentBase):
|
|
|
169
170
|
|
|
170
171
|
self.agent_registry: AgentRegistry = AgentRegistry()
|
|
171
172
|
self.core_a2a_service: CoreA2AService = CoreA2AService(
|
|
172
|
-
agent_registry=self.agent_registry,
|
|
173
|
+
agent_registry=self.agent_registry,
|
|
174
|
+
namespace=self.namespace,
|
|
175
|
+
component_id="WebUI"
|
|
173
176
|
)
|
|
174
177
|
self.shared_artifact_service: Optional[BaseArtifactService] = (
|
|
175
178
|
initialize_artifact_service(self)
|
|
@@ -189,10 +192,65 @@ class BaseGatewayComponent(SamComponentBase):
|
|
|
189
192
|
self.log_identifier,
|
|
190
193
|
)
|
|
191
194
|
|
|
195
|
+
# Authentication handler (optional, enterprise feature)
|
|
196
|
+
self.auth_handler: Optional[AuthHandler] = None
|
|
197
|
+
|
|
198
|
+
# Setup authentication if enabled (subclasses override _setup_auth)
|
|
199
|
+
self._setup_auth()
|
|
200
|
+
|
|
192
201
|
log.info(
|
|
193
202
|
"%s Initialized Base Gateway Component.", self.log_identifier
|
|
194
203
|
)
|
|
195
204
|
|
|
205
|
+
def _setup_auth(self) -> None:
|
|
206
|
+
"""
|
|
207
|
+
Setup authentication handler if enabled.
|
|
208
|
+
|
|
209
|
+
This method is called during initialization and can be overridden
|
|
210
|
+
by subclasses to customize auth setup. The default implementation
|
|
211
|
+
does nothing - subclasses should override to enable auth.
|
|
212
|
+
|
|
213
|
+
Example override in subclass:
|
|
214
|
+
def _setup_auth(self):
|
|
215
|
+
if self.get_config('enable_auth', False):
|
|
216
|
+
from enterprise.auth import SAMOAuth2Handler
|
|
217
|
+
self.auth_handler = SAMOAuth2Handler(self.config)
|
|
218
|
+
"""
|
|
219
|
+
# Base implementation: no auth
|
|
220
|
+
# Subclasses (like GenericGateway) override to enable auth
|
|
221
|
+
pass
|
|
222
|
+
|
|
223
|
+
async def _inject_auth_headers(self, headers: Dict[str, str]) -> Dict[str, str]:
|
|
224
|
+
"""
|
|
225
|
+
Inject authentication headers if authenticated.
|
|
226
|
+
|
|
227
|
+
This helper method should be called before making outgoing HTTP requests
|
|
228
|
+
to add authentication headers (e.g., Bearer tokens) to the request.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
headers: Existing headers dictionary
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Headers dictionary with auth headers added (if authenticated)
|
|
235
|
+
|
|
236
|
+
Example:
|
|
237
|
+
headers = {"Content-Type": "application/json"}
|
|
238
|
+
headers = await self._inject_auth_headers(headers)
|
|
239
|
+
# headers now includes Authorization if authenticated
|
|
240
|
+
"""
|
|
241
|
+
if self.auth_handler:
|
|
242
|
+
try:
|
|
243
|
+
auth_headers = await self.auth_handler.get_auth_headers()
|
|
244
|
+
headers.update(auth_headers)
|
|
245
|
+
except Exception as e:
|
|
246
|
+
log.warning(
|
|
247
|
+
"%s Failed to get auth headers: %s",
|
|
248
|
+
self.log_identifier,
|
|
249
|
+
e
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
return headers
|
|
253
|
+
|
|
196
254
|
async def authenticate_and_enrich_user(
|
|
197
255
|
self, external_event_data: Any
|
|
198
256
|
) -> Optional[Dict[str, Any]]:
|
|
@@ -344,6 +402,15 @@ class BaseGatewayComponent(SamComponentBase):
|
|
|
344
402
|
"system_purpose": system_purpose,
|
|
345
403
|
"response_format": response_format,
|
|
346
404
|
}
|
|
405
|
+
|
|
406
|
+
# Add session behavior if provided by adapter
|
|
407
|
+
session_behavior = external_request_context.get("session_behavior")
|
|
408
|
+
if session_behavior:
|
|
409
|
+
a2a_metadata["sessionBehavior"] = session_behavior
|
|
410
|
+
log.debug(
|
|
411
|
+
"%s Setting sessionBehavior to: %s", log_id_prefix, session_behavior
|
|
412
|
+
)
|
|
413
|
+
|
|
347
414
|
invoked_artifacts = external_request_context.get("invoked_with_artifacts")
|
|
348
415
|
if invoked_artifacts:
|
|
349
416
|
a2a_metadata["invoked_with_artifacts"] = invoked_artifacts
|
|
@@ -47,6 +47,15 @@ from ..adapter.types import (
|
|
|
47
47
|
)
|
|
48
48
|
from ..base.component import BaseGatewayComponent
|
|
49
49
|
|
|
50
|
+
# Try to import enterprise auth handler
|
|
51
|
+
try:
|
|
52
|
+
from solace_agent_mesh_enterprise.gateway.auth import SAMOAuth2Handler
|
|
53
|
+
ENTERPRISE_AUTH_AVAILABLE = True
|
|
54
|
+
except ImportError:
|
|
55
|
+
ENTERPRISE_AUTH_AVAILABLE = False
|
|
56
|
+
SAMOAuth2Handler = None
|
|
57
|
+
|
|
58
|
+
|
|
50
59
|
log = logging.getLogger(__name__)
|
|
51
60
|
|
|
52
61
|
info = {
|
|
@@ -132,48 +141,181 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
132
141
|
self.artifact_service = self.shared_artifact_service
|
|
133
142
|
# `gateway_id`, `namespace`, `config` are available from base classes.
|
|
134
143
|
|
|
135
|
-
|
|
144
|
+
# --- Setup Authentication ---
|
|
145
|
+
self._setup_auth()
|
|
136
146
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
147
|
+
# --- Register Agent Registry Callbacks ---
|
|
148
|
+
# Wire up callbacks so the adapter is notified of agent changes
|
|
149
|
+
self.agent_registry.set_on_agent_added_callback(self._on_agent_added)
|
|
150
|
+
self.agent_registry.set_on_agent_removed_callback(self._on_agent_removed)
|
|
151
|
+
log.info(
|
|
152
|
+
"%s Agent registry callbacks registered for dynamic adapter updates.",
|
|
153
|
+
self.log_identifier,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def _setup_auth(self) -> None:
|
|
140
157
|
"""
|
|
141
|
-
|
|
142
|
-
|
|
158
|
+
Setup authentication handler if enabled in config.
|
|
159
|
+
|
|
160
|
+
Uses enterprise SAMOAuth2Handler if available and auth is enabled.
|
|
161
|
+
Falls back gracefully if enterprise module is not installed.
|
|
162
|
+
|
|
163
|
+
Note: This method is called twice:
|
|
164
|
+
1. During BaseGatewayComponent.__init__() (adapter_config not yet available)
|
|
165
|
+
2. After adapter_config is set in GenericGatewayComponent.__init__()
|
|
143
166
|
"""
|
|
144
|
-
|
|
167
|
+
# Early exit if adapter_config not yet set
|
|
168
|
+
if not hasattr(self, 'adapter_config'):
|
|
169
|
+
log.debug("%s _setup_auth() called before adapter_config set, skipping", self.log_identifier)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
log.debug("%s adapter_config type: %s", self.log_identifier, type(self.adapter_config))
|
|
173
|
+
|
|
174
|
+
# Check enable_auth from adapter_config (not app_config)
|
|
175
|
+
# Handle both Pydantic models (use getattr) and plain dicts (use .get())
|
|
176
|
+
if isinstance(self.adapter_config, dict):
|
|
177
|
+
enable_auth = self.adapter_config.get('enable_auth', False)
|
|
178
|
+
log.debug("%s adapter_config is dict, keys: %s", self.log_identifier, list(self.adapter_config.keys()))
|
|
179
|
+
else:
|
|
180
|
+
# Pydantic model or other object
|
|
181
|
+
enable_auth = getattr(self.adapter_config, 'enable_auth', False)
|
|
182
|
+
log.debug("%s adapter_config is Pydantic model, enable_auth=%s", self.log_identifier, enable_auth)
|
|
183
|
+
|
|
184
|
+
log.info("%s Authentication check: enable_auth=%s (from adapter_config)", self.log_identifier, enable_auth)
|
|
185
|
+
|
|
186
|
+
if not enable_auth:
|
|
187
|
+
log.debug("%s Authentication disabled in config", self.log_identifier)
|
|
188
|
+
return
|
|
189
|
+
|
|
190
|
+
if not ENTERPRISE_AUTH_AVAILABLE:
|
|
191
|
+
log.warning(
|
|
192
|
+
"%s Authentication enabled but enterprise module not available. "
|
|
193
|
+
"Install solace-agent-mesh-enterprise to enable OAuth2 authentication.",
|
|
194
|
+
self.log_identifier
|
|
195
|
+
)
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
# Build config dict for SAMOAuth2Handler from adapter_config
|
|
200
|
+
# Handler expects: oauth_proxy_url, external_auth_service_url, external_auth_provider, callback_url
|
|
201
|
+
auth_config = {}
|
|
202
|
+
|
|
203
|
+
# Try to get config from adapter_config (Pydantic model or dict)
|
|
204
|
+
if hasattr(self.adapter_config, '__dict__'):
|
|
205
|
+
# Pydantic model
|
|
206
|
+
auth_config = self.adapter_config.__dict__.copy()
|
|
207
|
+
elif isinstance(self.adapter_config, dict):
|
|
208
|
+
# Plain dict
|
|
209
|
+
auth_config = self.adapter_config.copy()
|
|
210
|
+
|
|
211
|
+
# Ensure callback_url is set (construct from host/port if not provided)
|
|
212
|
+
if 'callback_url' not in auth_config and 'callback_uri' not in auth_config:
|
|
213
|
+
# Try to construct from host and port
|
|
214
|
+
host = auth_config.get('host', 'localhost')
|
|
215
|
+
port = auth_config.get('port', 8080)
|
|
216
|
+
auth_config['callback_url'] = f"http://{host}:{port}/oauth/callback"
|
|
217
|
+
log.debug("%s Constructed callback_url: %s", self.log_identifier, auth_config['callback_url'])
|
|
218
|
+
|
|
219
|
+
# Initialize enterprise OAuth2 handler
|
|
220
|
+
self.auth_handler = SAMOAuth2Handler(auth_config)
|
|
221
|
+
log.info("%s OAuth2 authentication enabled via enterprise module", self.log_identifier)
|
|
222
|
+
except Exception as e:
|
|
223
|
+
log.error("%s Failed to initialize OAuth2 authentication: %s", self.log_identifier, e, exc_info=True)
|
|
224
|
+
self.auth_handler = None
|
|
225
|
+
|
|
226
|
+
def _on_agent_added(self, agent_card: Any) -> None:
|
|
227
|
+
"""Called when a new agent is added to the registry."""
|
|
228
|
+
if self.adapter:
|
|
229
|
+
log.info(
|
|
230
|
+
"%s Registering new agent: %s",
|
|
231
|
+
self.log_identifier,
|
|
232
|
+
agent_card.name,
|
|
233
|
+
)
|
|
234
|
+
# Schedule the async call in the component's event loop
|
|
235
|
+
asyncio.run_coroutine_threadsafe(
|
|
236
|
+
self.adapter.handle_agent_registered(agent_card), self.get_async_loop()
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
def _on_agent_removed(self, agent_name: str) -> None:
|
|
240
|
+
"""Called when an agent is removed from the registry."""
|
|
241
|
+
log.info(
|
|
242
|
+
"%s Deregistering agent: %s",
|
|
243
|
+
self.log_identifier,
|
|
244
|
+
agent_name,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
if self.adapter:
|
|
248
|
+
# Schedule the async call in the component's event loop
|
|
249
|
+
asyncio.run_coroutine_threadsafe(
|
|
250
|
+
self.adapter.handle_agent_deregistered(agent_name), self.get_async_loop()
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
async def get_user_identity(
|
|
254
|
+
self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
|
|
255
|
+
) -> Optional[Dict[str, Any]]:
|
|
256
|
+
"""
|
|
257
|
+
Extracts the user identity from the external input via the adapter.
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
A dictionary representing the user identity, or None if not available.
|
|
261
|
+
"""
|
|
262
|
+
log_id_prefix = f"{self.log_identifier}[GetUserIdentity]"
|
|
145
263
|
user_identity = None
|
|
264
|
+
# 1. Authentication & Enrichment
|
|
265
|
+
# Try enterprise authentication first, fallback to adapter-based auth
|
|
146
266
|
try:
|
|
147
|
-
|
|
267
|
+
from solace_agent_mesh_enterprise.gateway.auth import authenticate_request
|
|
268
|
+
|
|
269
|
+
auth_claims = await authenticate_request(
|
|
270
|
+
adapter=self.adapter,
|
|
271
|
+
external_input=external_input,
|
|
272
|
+
endpoint_context=endpoint_context,
|
|
273
|
+
)
|
|
274
|
+
log.debug("%s Using enterprise authentication", log_id_prefix)
|
|
275
|
+
except ImportError:
|
|
276
|
+
# Enterprise package not available, use adapter-based auth
|
|
277
|
+
log.debug("%s Enterprise package not available, using adapter auth", log_id_prefix)
|
|
148
278
|
auth_claims = await self.adapter.extract_auth_claims(
|
|
149
279
|
external_input, endpoint_context
|
|
150
280
|
)
|
|
151
281
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
else:
|
|
167
|
-
user_identity = auth_claims.model_dump()
|
|
282
|
+
# The final user_identity is a dictionary, not the Pydantic model.
|
|
283
|
+
# It's built from claims and potentially enriched by an identity service.
|
|
284
|
+
if auth_claims:
|
|
285
|
+
if self.identity_service:
|
|
286
|
+
# Pass the rich claims object to the identity service
|
|
287
|
+
enriched_profile = await self.identity_service.get_user_profile(
|
|
288
|
+
auth_claims
|
|
289
|
+
)
|
|
290
|
+
if enriched_profile:
|
|
291
|
+
# Merge claims and profile, with profile taking precedence
|
|
292
|
+
user_identity = {
|
|
293
|
+
**auth_claims.model_dump(),
|
|
294
|
+
**enriched_profile,
|
|
295
|
+
}
|
|
168
296
|
else:
|
|
169
|
-
# No identity service, just use the claims from the adapter
|
|
170
297
|
user_identity = auth_claims.model_dump()
|
|
171
298
|
else:
|
|
172
|
-
#
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
299
|
+
# No identity service, just use the claims from the adapter
|
|
300
|
+
user_identity = auth_claims.model_dump()
|
|
301
|
+
else:
|
|
302
|
+
# Fallback to default identity if no claims are extracted
|
|
303
|
+
default_identity = self.get_config("default_user_identity")
|
|
304
|
+
if default_identity:
|
|
305
|
+
user_identity = {"id": default_identity, "name": default_identity}
|
|
306
|
+
return user_identity
|
|
176
307
|
|
|
308
|
+
async def handle_external_input(
|
|
309
|
+
self, external_input: Any, endpoint_context: Optional[Dict[str, Any]] = None
|
|
310
|
+
) -> str:
|
|
311
|
+
"""
|
|
312
|
+
Processes an external input event through the full gateway flow.
|
|
313
|
+
Orchestrates auth, task preparation, and A2A submission.
|
|
314
|
+
"""
|
|
315
|
+
log_id_prefix = f"{self.log_identifier}[HandleInput]"
|
|
316
|
+
user_identity = None
|
|
317
|
+
try:
|
|
318
|
+
user_identity = await self.get_user_identity(external_input, endpoint_context)
|
|
177
319
|
if not user_identity or not user_identity.get("id"):
|
|
178
320
|
raise PermissionError(
|
|
179
321
|
"Authentication failed: No identity could be determined."
|
|
@@ -201,6 +343,10 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
201
343
|
**sam_task.platform_context,
|
|
202
344
|
}
|
|
203
345
|
|
|
346
|
+
# Pass session_behavior if provided by adapter
|
|
347
|
+
if sam_task.session_behavior:
|
|
348
|
+
external_request_context["session_behavior"] = sam_task.session_behavior
|
|
349
|
+
|
|
204
350
|
task_id = await self.submit_a2a_task(
|
|
205
351
|
target_agent_name=sam_task.target_agent,
|
|
206
352
|
a2a_parts=a2a_parts,
|
|
@@ -224,6 +370,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
224
370
|
# Create a dummy context to report the error
|
|
225
371
|
error_context = ResponseContext(
|
|
226
372
|
task_id="pre-task-error",
|
|
373
|
+
session_id=None,
|
|
227
374
|
conversation_id=None,
|
|
228
375
|
user_id=user_identity.get("id"),
|
|
229
376
|
platform_context={},
|
|
@@ -404,7 +551,9 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
404
551
|
)
|
|
405
552
|
return None
|
|
406
553
|
|
|
407
|
-
async def list_artifacts(
|
|
554
|
+
async def list_artifacts(
|
|
555
|
+
self, context: "ResponseContext"
|
|
556
|
+
) -> List[ArtifactInfo]:
|
|
408
557
|
"""Lists all artifacts available in the user's context."""
|
|
409
558
|
log_id_prefix = f"{self.log_identifier}[ListArtifacts]"
|
|
410
559
|
if not self.artifact_service:
|
|
@@ -434,6 +583,22 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
434
583
|
)
|
|
435
584
|
return []
|
|
436
585
|
|
|
586
|
+
def list_agents(self) -> List[Any]:
|
|
587
|
+
"""Lists all agents currently registered in the agent registry."""
|
|
588
|
+
log_id_prefix = f"{self.log_identifier}[ListAgents]"
|
|
589
|
+
try:
|
|
590
|
+
agent_names = self.agent_registry.get_agent_names()
|
|
591
|
+
agents = []
|
|
592
|
+
for agent_name in agent_names:
|
|
593
|
+
agent_card = self.agent_registry.get_agent(agent_name)
|
|
594
|
+
if agent_card:
|
|
595
|
+
agents.append(agent_card)
|
|
596
|
+
log.info("%s Found %d registered agents.", log_id_prefix, len(agents))
|
|
597
|
+
return agents
|
|
598
|
+
except Exception as e:
|
|
599
|
+
log.exception("%s Failed to list agents: %s", log_id_prefix, e)
|
|
600
|
+
return []
|
|
601
|
+
|
|
437
602
|
async def submit_feedback(self, feedback: "SamFeedback") -> None:
|
|
438
603
|
"""Handles feedback submission from an adapter."""
|
|
439
604
|
log_id_prefix = f"{self.log_identifier}[SubmitFeedback]"
|
|
@@ -166,6 +166,20 @@ class WebUIBackendApp(BaseGatewayApp):
|
|
|
166
166
|
"default": "",
|
|
167
167
|
"description": "The passphrase for the SSL private key.",
|
|
168
168
|
},
|
|
169
|
+
{
|
|
170
|
+
"name": "frontend_server_url",
|
|
171
|
+
"required": False,
|
|
172
|
+
"type": "string",
|
|
173
|
+
"default": "",
|
|
174
|
+
"description": (
|
|
175
|
+
"The WebUI Gateway's public URL for frontend API requests. "
|
|
176
|
+
"If empty (default), the frontend uses relative URLs for same-origin requests. "
|
|
177
|
+
"Only set this if the frontend is served from a different origin than the WebUI Gateway. "
|
|
178
|
+
"Examples: "
|
|
179
|
+
" - Same-origin (default): '' (empty, uses relative URLs like /api/v1/...) "
|
|
180
|
+
" - Cross-origin: https://webui-gateway.example.com"
|
|
181
|
+
),
|
|
182
|
+
},
|
|
169
183
|
{
|
|
170
184
|
"name": "session_service",
|
|
171
185
|
"required": False,
|
|
@@ -193,16 +207,19 @@ class WebUIBackendApp(BaseGatewayApp):
|
|
|
193
207
|
"required": False,
|
|
194
208
|
"type": "dict",
|
|
195
209
|
"default": {},
|
|
196
|
-
"description": "Configuration for the Platform Service (
|
|
210
|
+
"description": "Configuration for connecting to the Platform Service (runs separately on port 8001).",
|
|
197
211
|
"dict_schema": {
|
|
198
|
-
"
|
|
212
|
+
"url": {
|
|
199
213
|
"type": "string",
|
|
200
214
|
"required": False,
|
|
201
|
-
"default":
|
|
215
|
+
"default": "",
|
|
202
216
|
"description": (
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
217
|
+
"Platform Service URL for frontend API routing to enterprise endpoints. "
|
|
218
|
+
"Frontend will call this URL for /api/v1/platform/* requests. "
|
|
219
|
+
"Examples: "
|
|
220
|
+
" - Docker: http://platform-service:8001 "
|
|
221
|
+
" - K8s: http://platform-service:8001 "
|
|
222
|
+
" - Local: http://localhost:8001"
|
|
206
223
|
),
|
|
207
224
|
},
|
|
208
225
|
},
|