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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""
|
|
2
|
+
FastAPI dependency injection for Platform Service.
|
|
3
|
+
|
|
4
|
+
Provides database sessions, component instance access, and user authentication.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import TYPE_CHECKING, Generator
|
|
9
|
+
|
|
10
|
+
from fastapi import HTTPException, status
|
|
11
|
+
from sqlalchemy import create_engine, event, pool
|
|
12
|
+
from sqlalchemy.engine.url import make_url
|
|
13
|
+
from sqlalchemy.orm import Session, sessionmaker
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ..component import PlatformServiceComponent
|
|
17
|
+
|
|
18
|
+
log = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
# Global state
|
|
21
|
+
platform_component_instance: "PlatformServiceComponent" = None
|
|
22
|
+
PlatformSessionLocal: sessionmaker = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def set_component_instance(component: "PlatformServiceComponent"):
|
|
26
|
+
"""
|
|
27
|
+
Store the component reference for dependency injection.
|
|
28
|
+
|
|
29
|
+
Called by setup_dependencies during component startup.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
component: The PlatformServiceComponent instance.
|
|
33
|
+
"""
|
|
34
|
+
global platform_component_instance
|
|
35
|
+
if platform_component_instance is None:
|
|
36
|
+
platform_component_instance = component
|
|
37
|
+
log.info("Platform component instance provided.")
|
|
38
|
+
else:
|
|
39
|
+
log.warning("Platform component instance already set.")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def init_database(database_url: str):
|
|
43
|
+
"""
|
|
44
|
+
Initialize database connection with dialect-specific configuration.
|
|
45
|
+
|
|
46
|
+
Configures appropriate connection pooling and settings for:
|
|
47
|
+
- SQLite: StaticPool, foreign key enforcement
|
|
48
|
+
- PostgreSQL/MySQL: Connection pooling with pre-ping
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
database_url: SQLAlchemy database URL string.
|
|
52
|
+
"""
|
|
53
|
+
global PlatformSessionLocal
|
|
54
|
+
if PlatformSessionLocal is None:
|
|
55
|
+
url = make_url(database_url)
|
|
56
|
+
dialect_name = url.get_dialect().name
|
|
57
|
+
|
|
58
|
+
engine_kwargs = {}
|
|
59
|
+
|
|
60
|
+
if dialect_name == "sqlite":
|
|
61
|
+
engine_kwargs = {
|
|
62
|
+
"poolclass": pool.StaticPool,
|
|
63
|
+
"connect_args": {"check_same_thread": False},
|
|
64
|
+
}
|
|
65
|
+
log.info("Configuring SQLite database (single-connection mode)")
|
|
66
|
+
|
|
67
|
+
elif dialect_name in ("postgresql", "mysql"):
|
|
68
|
+
engine_kwargs = {
|
|
69
|
+
"pool_size": 10,
|
|
70
|
+
"max_overflow": 20,
|
|
71
|
+
"pool_timeout": 30,
|
|
72
|
+
"pool_recycle": 1800,
|
|
73
|
+
"pool_pre_ping": True,
|
|
74
|
+
}
|
|
75
|
+
log.info(f"Configuring {dialect_name} database with connection pooling")
|
|
76
|
+
|
|
77
|
+
else:
|
|
78
|
+
log.warning(f"Using default configuration for dialect: {dialect_name}")
|
|
79
|
+
|
|
80
|
+
engine = create_engine(database_url, **engine_kwargs)
|
|
81
|
+
|
|
82
|
+
@event.listens_for(engine, "connect")
|
|
83
|
+
def set_sqlite_pragma(dbapi_conn, connection_record):
|
|
84
|
+
"""Enable foreign key constraints for SQLite."""
|
|
85
|
+
if dialect_name == "sqlite":
|
|
86
|
+
cursor = dbapi_conn.cursor()
|
|
87
|
+
cursor.execute("PRAGMA foreign_keys=ON")
|
|
88
|
+
cursor.close()
|
|
89
|
+
|
|
90
|
+
PlatformSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
91
|
+
log.info("Database initialized successfully")
|
|
92
|
+
else:
|
|
93
|
+
log.warning("Database already initialized.")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_platform_db() -> Generator[Session, None, None]:
|
|
97
|
+
"""
|
|
98
|
+
FastAPI dependency for platform database session management.
|
|
99
|
+
|
|
100
|
+
Provides a database session with automatic commit/rollback:
|
|
101
|
+
- Commits on success
|
|
102
|
+
- Rolls back on exception
|
|
103
|
+
- Always closes the session
|
|
104
|
+
|
|
105
|
+
Yields:
|
|
106
|
+
SQLAlchemy database session for platform database.
|
|
107
|
+
|
|
108
|
+
Raises:
|
|
109
|
+
HTTPException: 503 if database is not initialized.
|
|
110
|
+
"""
|
|
111
|
+
if PlatformSessionLocal is None:
|
|
112
|
+
raise HTTPException(
|
|
113
|
+
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
114
|
+
detail="Database not initialized.",
|
|
115
|
+
)
|
|
116
|
+
db = PlatformSessionLocal()
|
|
117
|
+
try:
|
|
118
|
+
yield db
|
|
119
|
+
db.commit()
|
|
120
|
+
except Exception:
|
|
121
|
+
db.rollback()
|
|
122
|
+
raise
|
|
123
|
+
finally:
|
|
124
|
+
db.close()
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def get_heartbeat_tracker():
|
|
128
|
+
"""
|
|
129
|
+
Get the heartbeat tracker from platform component.
|
|
130
|
+
|
|
131
|
+
Used by deployer status endpoint to check if deployer is online.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
HeartbeatTracker instance if initialized, None otherwise.
|
|
135
|
+
"""
|
|
136
|
+
if platform_component_instance is None:
|
|
137
|
+
log.warning("Platform component not initialized - heartbeat tracker unavailable")
|
|
138
|
+
return None
|
|
139
|
+
return platform_component_instance.get_heartbeat_tracker()
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def get_agent_registry():
|
|
143
|
+
"""
|
|
144
|
+
Get the agent registry from platform component.
|
|
145
|
+
|
|
146
|
+
Used for deployment status monitoring.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
AgentRegistry instance if initialized, None otherwise.
|
|
150
|
+
"""
|
|
151
|
+
if platform_component_instance is None:
|
|
152
|
+
log.warning("Platform component not initialized - agent registry unavailable")
|
|
153
|
+
return None
|
|
154
|
+
return platform_component_instance.get_agent_registry()
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"""
|
|
2
|
+
FastAPI application for Platform Service.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
import sqlalchemy as sa
|
|
10
|
+
from alembic import command
|
|
11
|
+
from alembic.config import Config
|
|
12
|
+
from fastapi import FastAPI
|
|
13
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ..component import PlatformServiceComponent
|
|
17
|
+
|
|
18
|
+
log = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
app = FastAPI(
|
|
21
|
+
title="Platform Service API",
|
|
22
|
+
version="1.0.0",
|
|
23
|
+
description="Platform configuration management API (agents, connectors, toolsets, deployments)",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _setup_alembic_config(database_url: str) -> Config:
|
|
29
|
+
"""
|
|
30
|
+
Create and configure an Alembic Config object for community platform migrations.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
database_url: Database connection string.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
Configured Alembic Config object.
|
|
37
|
+
"""
|
|
38
|
+
alembic_cfg = Config()
|
|
39
|
+
# Note: __file__ is in api/main.py, so we go up one level (..) to get to platform/
|
|
40
|
+
alembic_cfg.set_main_option(
|
|
41
|
+
"script_location",
|
|
42
|
+
os.path.join(os.path.dirname(__file__), "..", "alembic"),
|
|
43
|
+
)
|
|
44
|
+
alembic_cfg.set_main_option("sqlalchemy.url", database_url)
|
|
45
|
+
return alembic_cfg
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _run_community_migrations(database_url: str) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Run Alembic migrations for the community platform database schema.
|
|
51
|
+
This includes any base tables defined in the community repo.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
database_url: Database connection string.
|
|
55
|
+
"""
|
|
56
|
+
try:
|
|
57
|
+
from sqlalchemy import create_engine
|
|
58
|
+
|
|
59
|
+
log.info("Starting community platform migrations...")
|
|
60
|
+
engine = create_engine(database_url)
|
|
61
|
+
inspector = sa.inspect(engine)
|
|
62
|
+
existing_tables = inspector.get_table_names()
|
|
63
|
+
|
|
64
|
+
if not existing_tables:
|
|
65
|
+
log.info("Running initial community platform database setup")
|
|
66
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
67
|
+
command.upgrade(alembic_cfg, "head")
|
|
68
|
+
log.info("Community platform database migrations completed")
|
|
69
|
+
else:
|
|
70
|
+
log.info("Checking for community platform schema updates")
|
|
71
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
72
|
+
command.upgrade(alembic_cfg, "head")
|
|
73
|
+
log.info("Community platform database schema is current")
|
|
74
|
+
except Exception as e:
|
|
75
|
+
log.warning(
|
|
76
|
+
"Community platform migration check failed: %s - attempting to run migrations",
|
|
77
|
+
e,
|
|
78
|
+
)
|
|
79
|
+
try:
|
|
80
|
+
alembic_cfg = _setup_alembic_config(database_url)
|
|
81
|
+
command.upgrade(alembic_cfg, "head")
|
|
82
|
+
log.info("Community platform database migrations completed")
|
|
83
|
+
except Exception as migration_error:
|
|
84
|
+
log.error("Community platform migration failed: %s", migration_error)
|
|
85
|
+
log.error("Check database connectivity and permissions")
|
|
86
|
+
raise RuntimeError(
|
|
87
|
+
f"Community platform database migration failed: {migration_error}"
|
|
88
|
+
) from migration_error
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _run_enterprise_migrations(database_url: str) -> None:
|
|
92
|
+
"""
|
|
93
|
+
Run migrations for enterprise platform features.
|
|
94
|
+
This is optional and only runs if the enterprise package is available.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
database_url: Database connection string.
|
|
98
|
+
"""
|
|
99
|
+
try:
|
|
100
|
+
from solace_agent_mesh_enterprise.platform_service.migration_runner import run_migrations
|
|
101
|
+
|
|
102
|
+
log.info("[Platform Service] Starting enterprise migrations...")
|
|
103
|
+
run_migrations(database_url)
|
|
104
|
+
log.info("[Platform Service] Enterprise migrations completed successfully")
|
|
105
|
+
except ImportError:
|
|
106
|
+
log.debug("[Platform Service] Enterprise module not found - skipping enterprise migrations")
|
|
107
|
+
except Exception as e:
|
|
108
|
+
log.error("[Platform Service] Enterprise migration failed: %s", e)
|
|
109
|
+
log.error("[Platform Service] Enterprise features may be unavailable")
|
|
110
|
+
raise RuntimeError(f"Enterprise platform database migration failed: {e}") from e
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _setup_database(database_url: str) -> None:
|
|
114
|
+
"""Initialize database and run migrations."""
|
|
115
|
+
log.info("[Platform Service] Initializing database and running migrations...")
|
|
116
|
+
_run_enterprise_migrations(database_url)
|
|
117
|
+
log.info("[Platform Service] Database initialization complete")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def setup_dependencies(component: "PlatformServiceComponent"):
|
|
121
|
+
"""
|
|
122
|
+
Initialize FastAPI dependencies (middleware, routers).
|
|
123
|
+
Database migrations are handled in component.__init__().
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
component: PlatformServiceComponent instance
|
|
127
|
+
"""
|
|
128
|
+
log.info("Initializing Platform Service dependencies...")
|
|
129
|
+
|
|
130
|
+
from . import dependencies
|
|
131
|
+
dependencies.set_component_instance(component)
|
|
132
|
+
|
|
133
|
+
_setup_middleware(component)
|
|
134
|
+
_setup_routers()
|
|
135
|
+
|
|
136
|
+
log.info("Platform Service dependencies initialized successfully")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
async def _start_enterprise_platform_tasks(component: "PlatformServiceComponent") -> None:
|
|
140
|
+
"""
|
|
141
|
+
Start enterprise platform background tasks if enterprise package is available.
|
|
142
|
+
|
|
143
|
+
This follows the exact same pattern as WebUI Gateway:
|
|
144
|
+
- Community calls enterprise function
|
|
145
|
+
- Enterprise owns all background task logic
|
|
146
|
+
- Graceful degradation if enterprise not available
|
|
147
|
+
|
|
148
|
+
Background tasks (enterprise-only):
|
|
149
|
+
- Heartbeat listener (deployer monitoring)
|
|
150
|
+
- Deployment status checker (agent deployment monitoring)
|
|
151
|
+
- Agent registry (tracks deployed agents)
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
component: PlatformServiceComponent instance
|
|
155
|
+
"""
|
|
156
|
+
try:
|
|
157
|
+
from solace_agent_mesh_enterprise.init_enterprise import (
|
|
158
|
+
start_platform_background_tasks,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
log.info("Starting enterprise platform background tasks...")
|
|
162
|
+
await start_platform_background_tasks(component)
|
|
163
|
+
log.info("Enterprise platform background tasks started successfully")
|
|
164
|
+
|
|
165
|
+
except ImportError:
|
|
166
|
+
log.info(
|
|
167
|
+
"Enterprise package not available - platform background tasks will not start. "
|
|
168
|
+
"Platform Service will run without deployment monitoring and deployer heartbeat tracking."
|
|
169
|
+
)
|
|
170
|
+
except RuntimeError as enterprise_err:
|
|
171
|
+
log.warning(
|
|
172
|
+
"Enterprise platform tasks disabled: %s - Platform Service will continue without deployment monitoring",
|
|
173
|
+
enterprise_err,
|
|
174
|
+
)
|
|
175
|
+
except Exception as enterprise_err:
|
|
176
|
+
log.error(
|
|
177
|
+
"Failed to start enterprise platform tasks: %s - Platform Service will continue",
|
|
178
|
+
enterprise_err,
|
|
179
|
+
exc_info=True,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _setup_middleware(component: "PlatformServiceComponent"):
|
|
184
|
+
"""
|
|
185
|
+
Add middleware to the FastAPI application.
|
|
186
|
+
|
|
187
|
+
1. CORS middleware - allows cross-origin requests
|
|
188
|
+
2. OAuth2 middleware - authentication (real token validation)
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
component: PlatformServiceComponent instance for configuration access.
|
|
192
|
+
"""
|
|
193
|
+
# CORS middleware - automatically trust configured UI origins
|
|
194
|
+
configured_origins = component.get_cors_origins().copy()
|
|
195
|
+
|
|
196
|
+
# Automatically add frontend and platform service URLs as trusted origins
|
|
197
|
+
# These are admin-controlled values that should always be trusted
|
|
198
|
+
frontend_url = os.getenv("FRONTEND_SERVER_URL", "").strip()
|
|
199
|
+
platform_url = os.getenv("PLATFORM_SERVICE_URL", "").strip()
|
|
200
|
+
|
|
201
|
+
# Auto-construct frontend URL if not provided
|
|
202
|
+
if not frontend_url:
|
|
203
|
+
# Read WebUI Gateway configuration from environment variables
|
|
204
|
+
fastapi_host = os.getenv("FASTAPI_HOST", "127.0.0.1").strip()
|
|
205
|
+
fastapi_port = os.getenv("FASTAPI_PORT", "8000").strip()
|
|
206
|
+
ssl_keyfile = os.getenv("SSL_KEYFILE", "").strip()
|
|
207
|
+
ssl_certfile = os.getenv("SSL_CERTFILE", "").strip()
|
|
208
|
+
|
|
209
|
+
# Determine protocol and port based on SSL configuration
|
|
210
|
+
if ssl_keyfile and ssl_certfile:
|
|
211
|
+
protocol = "https"
|
|
212
|
+
port = os.getenv("FASTAPI_HTTPS_PORT", "8443").strip()
|
|
213
|
+
else:
|
|
214
|
+
protocol = "http"
|
|
215
|
+
port = fastapi_port
|
|
216
|
+
|
|
217
|
+
# Use 'localhost' if host is 127.0.0.1 for better compatibility
|
|
218
|
+
host = "localhost" if fastapi_host == "127.0.0.1" else fastapi_host
|
|
219
|
+
frontend_url = f"{protocol}://{host}:{port}"
|
|
220
|
+
|
|
221
|
+
log.info(
|
|
222
|
+
"FRONTEND_SERVER_URL not configured, auto-constructed from WebUI Gateway settings: %s",
|
|
223
|
+
frontend_url
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
auto_trusted_origins = []
|
|
227
|
+
if frontend_url:
|
|
228
|
+
auto_trusted_origins.append(frontend_url)
|
|
229
|
+
if platform_url:
|
|
230
|
+
auto_trusted_origins.append(platform_url)
|
|
231
|
+
|
|
232
|
+
# Combine and deduplicate
|
|
233
|
+
allowed_origins = list(set(auto_trusted_origins + configured_origins))
|
|
234
|
+
|
|
235
|
+
# Get optional regex pattern for CORS origins (useful for local dev with dynamic ports)
|
|
236
|
+
cors_origin_regex = component.get_cors_origin_regex()
|
|
237
|
+
|
|
238
|
+
app.add_middleware(
|
|
239
|
+
CORSMiddleware,
|
|
240
|
+
allow_origins=allowed_origins,
|
|
241
|
+
allow_origin_regex=cors_origin_regex if cors_origin_regex else None,
|
|
242
|
+
allow_credentials=True,
|
|
243
|
+
allow_methods=["*"],
|
|
244
|
+
allow_headers=["*"],
|
|
245
|
+
)
|
|
246
|
+
log.info(f"CORS middleware added with origins: {allowed_origins}")
|
|
247
|
+
if cors_origin_regex:
|
|
248
|
+
log.info(f" CORS origin regex pattern: {cors_origin_regex}")
|
|
249
|
+
if auto_trusted_origins:
|
|
250
|
+
log.info(f" Auto-added trusted origins: {auto_trusted_origins}")
|
|
251
|
+
|
|
252
|
+
# OAuth2 authentication middleware
|
|
253
|
+
from solace_agent_mesh.shared.auth.middleware import create_oauth_middleware
|
|
254
|
+
|
|
255
|
+
oauth_middleware_class = create_oauth_middleware(component)
|
|
256
|
+
app.add_middleware(oauth_middleware_class, component=component)
|
|
257
|
+
|
|
258
|
+
use_auth = component.get_config("frontend_use_authorization", False)
|
|
259
|
+
if use_auth:
|
|
260
|
+
log.info("OAuth2 middleware added (real token validation enabled)")
|
|
261
|
+
else:
|
|
262
|
+
log.info("OAuth2 middleware added (development mode - frontend_use_authorization=false)")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _setup_routers():
|
|
266
|
+
"""
|
|
267
|
+
Mount community and enterprise routers to the FastAPI application.
|
|
268
|
+
|
|
269
|
+
All platform service routers (both community and enterprise) are mounted
|
|
270
|
+
under the PLATFORM_SERVICE_PREFIX. This ensures a consistent API structure
|
|
271
|
+
where /api/v1/platform/* contains all platform management endpoints.
|
|
272
|
+
|
|
273
|
+
Community routers: Loaded from .routers
|
|
274
|
+
Enterprise routers: Dynamically loaded from enterprise package if available
|
|
275
|
+
"""
|
|
276
|
+
# Define the platform service API prefix
|
|
277
|
+
# This is the single source of truth for all platform service endpoints
|
|
278
|
+
PLATFORM_SERVICE_PREFIX = "/api/v1/platform"
|
|
279
|
+
|
|
280
|
+
# Load community platform routers
|
|
281
|
+
from .routers import get_community_platform_routers
|
|
282
|
+
|
|
283
|
+
community_routers = get_community_platform_routers()
|
|
284
|
+
for router_config in community_routers:
|
|
285
|
+
app.include_router(
|
|
286
|
+
router_config["router"],
|
|
287
|
+
prefix=PLATFORM_SERVICE_PREFIX,
|
|
288
|
+
tags=router_config["tags"],
|
|
289
|
+
)
|
|
290
|
+
log.info(f"Mounted {len(community_routers)} community platform routers")
|
|
291
|
+
|
|
292
|
+
# Try to load enterprise platform routers
|
|
293
|
+
try:
|
|
294
|
+
from solace_agent_mesh_enterprise.platform_service.routers import get_enterprise_routers
|
|
295
|
+
|
|
296
|
+
enterprise_routers = get_enterprise_routers()
|
|
297
|
+
for router_config in enterprise_routers:
|
|
298
|
+
app.include_router(
|
|
299
|
+
router_config["router"],
|
|
300
|
+
prefix=PLATFORM_SERVICE_PREFIX,
|
|
301
|
+
tags=router_config["tags"],
|
|
302
|
+
)
|
|
303
|
+
log.info(f"Mounted {len(enterprise_routers)} enterprise platform routers under {PLATFORM_SERVICE_PREFIX}")
|
|
304
|
+
|
|
305
|
+
except ImportError:
|
|
306
|
+
log.info(
|
|
307
|
+
"No enterprise package detected - running in community mode (no platform endpoints available)"
|
|
308
|
+
)
|
|
309
|
+
except Exception as e:
|
|
310
|
+
log.warning(f"Failed to load enterprise platform routers: {e}")
|
|
311
|
+
|
|
312
|
+
from solace_agent_mesh.shared.exceptions.exception_handlers import register_exception_handlers
|
|
313
|
+
register_exception_handlers(app)
|
|
314
|
+
log.info("Registered shared exception handlers")
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OAuth2 authentication middleware for Platform Service.
|
|
3
|
+
|
|
4
|
+
Phase 1: Stub implementation for testing.
|
|
5
|
+
Phase 2: Will be replaced with real OAuth2 token validation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
|
|
10
|
+
from fastapi import Request
|
|
11
|
+
|
|
12
|
+
log = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def oauth2_stub_middleware(request: Request, call_next):
|
|
16
|
+
"""
|
|
17
|
+
STUB OAuth2 middleware for Phase 1 development and testing.
|
|
18
|
+
|
|
19
|
+
This middleware always sets a fake authenticated user for testing purposes.
|
|
20
|
+
It allows the Platform Service to start and accept requests without requiring
|
|
21
|
+
a real OAuth2 service during initial development.
|
|
22
|
+
|
|
23
|
+
**TODO Phase 2:** Replace this with real OAuth2 token validation:
|
|
24
|
+
1. Extract token from Authorization header
|
|
25
|
+
2. Validate token with external OAuth2 service
|
|
26
|
+
3. Parse user info from token validation response
|
|
27
|
+
4. Set request.state.user with real user details
|
|
28
|
+
5. Raise HTTPException(401) if token is invalid/missing
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
request: FastAPI Request object.
|
|
32
|
+
call_next: Next middleware/handler in the chain.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Response from the next handler.
|
|
36
|
+
"""
|
|
37
|
+
# Set stub user data (always authenticated for Phase 1)
|
|
38
|
+
request.state.user = {
|
|
39
|
+
"id": "stub_user",
|
|
40
|
+
"user_id": "stub_user",
|
|
41
|
+
"email": "stub@example.com",
|
|
42
|
+
"name": "Stub User (Phase 1)",
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
log.debug(
|
|
46
|
+
"OAuth2 stub middleware: Set stub user (Phase 1 - REPLACE IN PHASE 2 WITH REAL VALIDATION)"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Call the next handler
|
|
50
|
+
response = await call_next(request)
|
|
51
|
+
return response
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Community platform routers for Platform Service.
|
|
3
|
+
|
|
4
|
+
Provides foundational platform service endpoints available to all deployments.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_community_platform_routers() -> list:
|
|
9
|
+
"""
|
|
10
|
+
Return list of community platform routers.
|
|
11
|
+
|
|
12
|
+
Format:
|
|
13
|
+
[
|
|
14
|
+
{
|
|
15
|
+
"router": router_instance,
|
|
16
|
+
"tags": ["Platform"]
|
|
17
|
+
},
|
|
18
|
+
...
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
Note: The prefix "/api/v1/platform" is applied by main.py when mounting these routers.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Community platform routers list.
|
|
25
|
+
"""
|
|
26
|
+
from .health_router import router as health_router
|
|
27
|
+
|
|
28
|
+
return [
|
|
29
|
+
{
|
|
30
|
+
"router": health_router,
|
|
31
|
+
"tags": ["Health"],
|
|
32
|
+
}
|
|
33
|
+
]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Platform Service health check router.
|
|
3
|
+
|
|
4
|
+
Provides health status endpoint for monitoring and load balancer health checks.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from fastapi import APIRouter
|
|
9
|
+
|
|
10
|
+
log = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
router = APIRouter()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@router.get("/health", tags=["Health"])
|
|
16
|
+
async def health_check():
|
|
17
|
+
"""
|
|
18
|
+
Platform Service health check endpoint.
|
|
19
|
+
|
|
20
|
+
This endpoint is used by:
|
|
21
|
+
- Kubernetes liveness/readiness probes
|
|
22
|
+
- Load balancer health checks (ALB, NGINX)
|
|
23
|
+
- External monitoring systems
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
dict: Health status with service name.
|
|
27
|
+
- status (str): "healthy" if service is operational
|
|
28
|
+
- service (str): Service identifier
|
|
29
|
+
"""
|
|
30
|
+
log.debug("Health check endpoint '/api/v1/platform/health' called")
|
|
31
|
+
return {"status": "healthy", "service": "Platform Service"}
|