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
|
@@ -27,6 +27,13 @@ from ...agent.utils.artifact_helpers import (
|
|
|
27
27
|
load_artifact_content_or_metadata,
|
|
28
28
|
)
|
|
29
29
|
from ...common.a2a.types import ArtifactInfo
|
|
30
|
+
from ...common.utils.mime_helpers import is_text_based_mime_type
|
|
31
|
+
from ...common.utils.embeds import (
|
|
32
|
+
LATE_EMBED_TYPES,
|
|
33
|
+
evaluate_embed,
|
|
34
|
+
resolve_embeds_recursively_in_string,
|
|
35
|
+
)
|
|
36
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
30
37
|
from ..adapter.base import GatewayAdapter
|
|
31
38
|
from ..adapter.types import (
|
|
32
39
|
GatewayContext,
|
|
@@ -40,6 +47,15 @@ from ..adapter.types import (
|
|
|
40
47
|
)
|
|
41
48
|
from ..base.component import BaseGatewayComponent
|
|
42
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
|
+
|
|
43
59
|
log = logging.getLogger(__name__)
|
|
44
60
|
|
|
45
61
|
info = {
|
|
@@ -90,7 +106,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
90
106
|
resolve_artifact_uris_in_gateway=resolve_uris,
|
|
91
107
|
supports_inline_artifact_resolution=True,
|
|
92
108
|
filter_tool_data_parts=False,
|
|
93
|
-
**kwargs
|
|
109
|
+
**kwargs,
|
|
94
110
|
)
|
|
95
111
|
log.info("%s Initializing Generic Gateway Component...", self.log_identifier)
|
|
96
112
|
|
|
@@ -125,48 +141,181 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
125
141
|
self.artifact_service = self.shared_artifact_service
|
|
126
142
|
# `gateway_id`, `namespace`, `config` are available from base classes.
|
|
127
143
|
|
|
128
|
-
|
|
144
|
+
# --- Setup Authentication ---
|
|
145
|
+
self._setup_auth()
|
|
129
146
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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:
|
|
133
157
|
"""
|
|
134
|
-
|
|
135
|
-
|
|
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__()
|
|
136
166
|
"""
|
|
137
|
-
|
|
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]"
|
|
138
263
|
user_identity = None
|
|
264
|
+
# 1. Authentication & Enrichment
|
|
265
|
+
# Try enterprise authentication first, fallback to adapter-based auth
|
|
139
266
|
try:
|
|
140
|
-
|
|
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)
|
|
141
278
|
auth_claims = await self.adapter.extract_auth_claims(
|
|
142
279
|
external_input, endpoint_context
|
|
143
280
|
)
|
|
144
281
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
else:
|
|
160
|
-
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
|
+
}
|
|
161
296
|
else:
|
|
162
|
-
# No identity service, just use the claims from the adapter
|
|
163
297
|
user_identity = auth_claims.model_dump()
|
|
164
298
|
else:
|
|
165
|
-
#
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
169
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)
|
|
170
319
|
if not user_identity or not user_identity.get("id"):
|
|
171
320
|
raise PermissionError(
|
|
172
321
|
"Authentication failed: No identity could be determined."
|
|
@@ -175,6 +324,8 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
175
324
|
log.info(
|
|
176
325
|
"%s Authenticated user: %s", log_id_prefix, user_identity.get("id")
|
|
177
326
|
)
|
|
327
|
+
# Add user_id to external_input so adapter can use it for permission checks.
|
|
328
|
+
external_input["user_id"] = user_identity.get("id")
|
|
178
329
|
|
|
179
330
|
# 2. Task Preparation
|
|
180
331
|
sam_task = await self.adapter.prepare_task(external_input, endpoint_context)
|
|
@@ -194,6 +345,10 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
194
345
|
**sam_task.platform_context,
|
|
195
346
|
}
|
|
196
347
|
|
|
348
|
+
# Pass session_behavior if provided by adapter
|
|
349
|
+
if sam_task.session_behavior:
|
|
350
|
+
external_request_context["session_behavior"] = sam_task.session_behavior
|
|
351
|
+
|
|
197
352
|
task_id = await self.submit_a2a_task(
|
|
198
353
|
target_agent_name=sam_task.target_agent,
|
|
199
354
|
a2a_parts=a2a_parts,
|
|
@@ -217,6 +372,7 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
217
372
|
# Create a dummy context to report the error
|
|
218
373
|
error_context = ResponseContext(
|
|
219
374
|
task_id="pre-task-error",
|
|
375
|
+
session_id=None,
|
|
220
376
|
conversation_id=None,
|
|
221
377
|
user_id=user_identity.get("id"),
|
|
222
378
|
platform_context={},
|
|
@@ -294,7 +450,79 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
294
450
|
)
|
|
295
451
|
if artifact_data.get("status") == "success":
|
|
296
452
|
content_bytes = artifact_data.get("raw_bytes")
|
|
453
|
+
mime_type = artifact_data.get("mime_type")
|
|
454
|
+
|
|
297
455
|
if content_bytes:
|
|
456
|
+
# For text-based artifacts, resolve templates and late embeds
|
|
457
|
+
if mime_type and is_text_based_mime_type(mime_type):
|
|
458
|
+
try:
|
|
459
|
+
|
|
460
|
+
content_str = content_bytes.decode("utf-8")
|
|
461
|
+
|
|
462
|
+
# Build context for resolution
|
|
463
|
+
context_for_resolver = {
|
|
464
|
+
"artifact_service": self.artifact_service,
|
|
465
|
+
"session_context": {
|
|
466
|
+
"app_name": self.gateway_id,
|
|
467
|
+
"user_id": context.user_id,
|
|
468
|
+
"session_id": context.session_id,
|
|
469
|
+
},
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
config_for_resolver = {
|
|
473
|
+
"gateway_max_artifact_resolve_size_bytes": (
|
|
474
|
+
self.gateway_max_artifact_resolve_size_bytes
|
|
475
|
+
if hasattr(
|
|
476
|
+
self, "gateway_max_artifact_resolve_size_bytes"
|
|
477
|
+
)
|
|
478
|
+
else -1
|
|
479
|
+
),
|
|
480
|
+
"gateway_recursive_embed_depth": (
|
|
481
|
+
self.gateway_recursive_embed_depth
|
|
482
|
+
if hasattr(self, "gateway_recursive_embed_depth")
|
|
483
|
+
else 12
|
|
484
|
+
),
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
log.debug(
|
|
488
|
+
"%s Text-based artifact. Resolving late embeds and templates.",
|
|
489
|
+
log_id_prefix,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
# Resolve late embeds
|
|
493
|
+
resolved_content_str = await resolve_embeds_recursively_in_string(
|
|
494
|
+
text=content_str,
|
|
495
|
+
context=context_for_resolver,
|
|
496
|
+
resolver_func=evaluate_embed,
|
|
497
|
+
types_to_resolve=LATE_EMBED_TYPES,
|
|
498
|
+
resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
|
|
499
|
+
log_identifier=f"{log_id_prefix}[RecursiveResolve]",
|
|
500
|
+
config=config_for_resolver,
|
|
501
|
+
max_depth=config_for_resolver[
|
|
502
|
+
"gateway_recursive_embed_depth"
|
|
503
|
+
],
|
|
504
|
+
max_total_size=config_for_resolver[
|
|
505
|
+
"gateway_max_artifact_resolve_size_bytes"
|
|
506
|
+
],
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
# Template blocks are automatically resolved by resolve_embeds_recursively_in_string
|
|
510
|
+
# when resolving late embeds. No need to call template resolution separately.
|
|
511
|
+
|
|
512
|
+
content_bytes = resolved_content_str.encode("utf-8")
|
|
513
|
+
log.info(
|
|
514
|
+
"%s Resolved embeds (including templates). Final size: %d bytes.",
|
|
515
|
+
log_id_prefix,
|
|
516
|
+
len(content_bytes),
|
|
517
|
+
)
|
|
518
|
+
except Exception as resolve_err:
|
|
519
|
+
log.warning(
|
|
520
|
+
"%s Failed to resolve embeds/templates: %s. Returning original content.",
|
|
521
|
+
log_id_prefix,
|
|
522
|
+
resolve_err,
|
|
523
|
+
)
|
|
524
|
+
# Fall through to return original content_bytes
|
|
525
|
+
|
|
298
526
|
log.info(
|
|
299
527
|
"%s Successfully loaded %d bytes for artifact '%s'.",
|
|
300
528
|
log_id_prefix,
|
|
@@ -357,6 +585,22 @@ class GenericGatewayComponent(BaseGatewayComponent, GatewayContext):
|
|
|
357
585
|
)
|
|
358
586
|
return []
|
|
359
587
|
|
|
588
|
+
def list_agents(self) -> List[Any]:
|
|
589
|
+
"""Lists all agents currently registered in the agent registry."""
|
|
590
|
+
log_id_prefix = f"{self.log_identifier}[ListAgents]"
|
|
591
|
+
try:
|
|
592
|
+
agent_names = self.agent_registry.get_agent_names()
|
|
593
|
+
agents = []
|
|
594
|
+
for agent_name in agent_names:
|
|
595
|
+
agent_card = self.agent_registry.get_agent(agent_name)
|
|
596
|
+
if agent_card:
|
|
597
|
+
agents.append(agent_card)
|
|
598
|
+
log.info("%s Found %d registered agents.", log_id_prefix, len(agents))
|
|
599
|
+
return agents
|
|
600
|
+
except Exception as e:
|
|
601
|
+
log.exception("%s Failed to list agents: %s", log_id_prefix, e)
|
|
602
|
+
return []
|
|
603
|
+
|
|
360
604
|
async def submit_feedback(self, feedback: "SamFeedback") -> None:
|
|
361
605
|
"""Handles feedback submission from an adapter."""
|
|
362
606
|
log_id_prefix = f"{self.log_identifier}[SubmitFeedback]"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from logging.config import fileConfig
|
|
2
|
-
|
|
3
1
|
from alembic import context
|
|
4
2
|
from sqlalchemy import engine_from_config, pool
|
|
5
3
|
|
|
@@ -7,11 +5,6 @@ from sqlalchemy import engine_from_config, pool
|
|
|
7
5
|
# access to the values within the .ini file in use.
|
|
8
6
|
config = context.config
|
|
9
7
|
|
|
10
|
-
# Interpret the config file for Python logging.
|
|
11
|
-
# This line sets up loggers basically.
|
|
12
|
-
if config.config_file_name is not None:
|
|
13
|
-
fileConfig(config.config_file_name)
|
|
14
|
-
|
|
15
8
|
# add your model's MetaData object here
|
|
16
9
|
# for 'autogenerate' support
|
|
17
10
|
from solace_agent_mesh.gateway.http_sse.repository.models.base import Base
|
|
@@ -65,56 +65,15 @@ def upgrade() -> None:
|
|
|
65
65
|
op.create_index('ix_projects_user_deleted', 'projects', ['user_id', 'deleted_at'])
|
|
66
66
|
except Exception:
|
|
67
67
|
pass
|
|
68
|
-
|
|
69
|
-
# Enable pg_trgm extension for fuzzy text search (PostgreSQL only)
|
|
70
|
-
try:
|
|
71
|
-
op.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm')
|
|
72
|
-
except Exception:
|
|
73
|
-
# Not PostgreSQL or extension already exists
|
|
74
|
-
pass
|
|
75
|
-
|
|
76
|
-
# Create GIN indexes for text search on sessions
|
|
77
|
-
if 'sessions' in inspector.get_table_names():
|
|
78
|
-
try:
|
|
79
|
-
# Index on session name for fuzzy search
|
|
80
|
-
op.execute(
|
|
81
|
-
'CREATE INDEX IF NOT EXISTS ix_sessions_name_trgm ON sessions '
|
|
82
|
-
'USING gin (name gin_trgm_ops)'
|
|
83
|
-
)
|
|
84
|
-
except Exception:
|
|
85
|
-
pass
|
|
86
|
-
|
|
87
|
-
# Create GIN indexes for text search on chat_tasks
|
|
88
|
-
if 'chat_tasks' in inspector.get_table_names():
|
|
89
|
-
try:
|
|
90
|
-
# Index on user_message for content search
|
|
91
|
-
op.execute(
|
|
92
|
-
'CREATE INDEX IF NOT EXISTS ix_chat_tasks_user_message_trgm ON chat_tasks '
|
|
93
|
-
'USING gin (user_message gin_trgm_ops)'
|
|
94
|
-
)
|
|
95
|
-
except Exception:
|
|
96
|
-
pass
|
|
97
68
|
|
|
98
69
|
|
|
99
70
|
def downgrade() -> None:
|
|
100
71
|
"""Remove soft delete columns and search indexes."""
|
|
101
72
|
bind = op.get_bind()
|
|
102
73
|
inspector = inspect(bind)
|
|
103
|
-
|
|
104
|
-
# Drop
|
|
105
|
-
if 'chat_tasks' in inspector.get_table_names():
|
|
106
|
-
try:
|
|
107
|
-
op.execute('DROP INDEX IF EXISTS ix_chat_tasks_user_message_trgm')
|
|
108
|
-
except Exception:
|
|
109
|
-
pass
|
|
110
|
-
|
|
111
|
-
# Drop search indexes from sessions
|
|
74
|
+
|
|
75
|
+
# Drop soft delete indexes from sessions
|
|
112
76
|
if 'sessions' in inspector.get_table_names():
|
|
113
|
-
try:
|
|
114
|
-
op.execute('DROP INDEX IF EXISTS ix_sessions_name_trgm')
|
|
115
|
-
except Exception:
|
|
116
|
-
pass
|
|
117
|
-
|
|
118
77
|
try:
|
|
119
78
|
op.drop_index('ix_sessions_user_deleted', table_name='sessions')
|
|
120
79
|
except Exception:
|
solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""add default agent to projects
|
|
2
2
|
|
|
3
3
|
Revision ID: default_agent_001
|
|
4
|
-
Revises:
|
|
4
|
+
Revises: soft_del_search_001
|
|
5
5
|
Create Date: 2025-01-24 01:13:00.000000
|
|
6
6
|
|
|
7
7
|
"""
|
|
@@ -11,7 +11,7 @@ import sqlalchemy as sa
|
|
|
11
11
|
|
|
12
12
|
# revision identifiers, used by Alembic.
|
|
13
13
|
revision = 'default_agent_001'
|
|
14
|
-
down_revision = '
|
|
14
|
+
down_revision = 'soft_del_search_001'
|
|
15
15
|
branch_labels = None
|
|
16
16
|
depends_on = None
|
|
17
17
|
|
solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Create prompt tables with role-based sharing support
|
|
2
|
+
|
|
3
|
+
Revision ID: 20251108_prompt_tables_complete
|
|
4
|
+
Revises: 20251103_merge_heads
|
|
5
|
+
Create Date: 2025-11-08
|
|
6
|
+
|
|
7
|
+
This is a squashed migration that combines:
|
|
8
|
+
- Initial prompt tables creation
|
|
9
|
+
- Prompt pinning feature
|
|
10
|
+
- Role-based sharing via prompt_group_users table
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
import sqlalchemy as sa
|
|
15
|
+
from alembic import op
|
|
16
|
+
|
|
17
|
+
revision: str = "20251108_prompt_tables_complete"
|
|
18
|
+
down_revision: str | Sequence[str] | None = "default_agent_001"
|
|
19
|
+
branch_labels: str | Sequence[str] | None = None
|
|
20
|
+
depends_on: str | Sequence[str] | None = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def upgrade() -> None:
|
|
24
|
+
"""Create complete prompt schema with sharing support."""
|
|
25
|
+
|
|
26
|
+
# 1. Create prompts table (individual prompt versions)
|
|
27
|
+
op.create_table(
|
|
28
|
+
'prompts',
|
|
29
|
+
sa.Column('id', sa.String(), nullable=False),
|
|
30
|
+
sa.Column('prompt_text', sa.Text(), nullable=False),
|
|
31
|
+
sa.Column('group_id', sa.String(), nullable=False),
|
|
32
|
+
sa.Column('user_id', sa.String(), nullable=False),
|
|
33
|
+
sa.Column('version', sa.Integer(), nullable=False, server_default='1'),
|
|
34
|
+
sa.Column('created_at', sa.BigInteger(), nullable=False),
|
|
35
|
+
sa.Column('updated_at', sa.BigInteger(), nullable=False),
|
|
36
|
+
sa.PrimaryKeyConstraint('id')
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Indexes for prompts
|
|
40
|
+
op.create_index('ix_prompts_group_id', 'prompts', ['group_id'], unique=False)
|
|
41
|
+
op.create_index('ix_prompts_user_id', 'prompts', ['user_id'], unique=False)
|
|
42
|
+
|
|
43
|
+
# 2. Create prompt_groups table (prompt collections)
|
|
44
|
+
op.create_table(
|
|
45
|
+
'prompt_groups',
|
|
46
|
+
sa.Column('id', sa.String(), nullable=False),
|
|
47
|
+
sa.Column('name', sa.String(length=255), nullable=False),
|
|
48
|
+
sa.Column('description', sa.Text(), nullable=True),
|
|
49
|
+
sa.Column('category', sa.String(length=100), nullable=True),
|
|
50
|
+
sa.Column('command', sa.String(length=50), nullable=True),
|
|
51
|
+
sa.Column('user_id', sa.String(), nullable=False),
|
|
52
|
+
sa.Column('author_name', sa.String(length=255), nullable=True),
|
|
53
|
+
sa.Column('production_prompt_id', sa.String(), nullable=True),
|
|
54
|
+
sa.Column('is_shared', sa.Boolean(), nullable=False, server_default='false'),
|
|
55
|
+
sa.Column('is_pinned', sa.Boolean(), nullable=False, server_default='false'),
|
|
56
|
+
sa.Column('created_at', sa.BigInteger(), nullable=False),
|
|
57
|
+
sa.Column('updated_at', sa.BigInteger(), nullable=False),
|
|
58
|
+
sa.ForeignKeyConstraint(
|
|
59
|
+
['production_prompt_id'],
|
|
60
|
+
['prompts.id'],
|
|
61
|
+
ondelete='SET NULL'
|
|
62
|
+
),
|
|
63
|
+
sa.PrimaryKeyConstraint('id')
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Indexes for prompt_groups
|
|
67
|
+
op.create_index('ix_prompt_groups_name', 'prompt_groups', ['name'], unique=False)
|
|
68
|
+
op.create_index('ix_prompt_groups_category', 'prompt_groups', ['category'], unique=False)
|
|
69
|
+
op.create_index('ix_prompt_groups_command', 'prompt_groups', ['command'], unique=True)
|
|
70
|
+
op.create_index('ix_prompt_groups_user_id', 'prompt_groups', ['user_id'], unique=False)
|
|
71
|
+
op.create_index('ix_prompt_groups_is_pinned', 'prompt_groups', ['is_pinned'], unique=False)
|
|
72
|
+
|
|
73
|
+
# 3. Add foreign key from prompts to prompt_groups
|
|
74
|
+
with op.batch_alter_table('prompts', schema=None) as batch_op:
|
|
75
|
+
batch_op.create_foreign_key(
|
|
76
|
+
'fk_prompts_group_id',
|
|
77
|
+
'prompt_groups',
|
|
78
|
+
['group_id'],
|
|
79
|
+
['id'],
|
|
80
|
+
ondelete='CASCADE'
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# 4. Create prompt_group_users table (role-based sharing)
|
|
84
|
+
op.create_table(
|
|
85
|
+
'prompt_group_users',
|
|
86
|
+
sa.Column('id', sa.String(), nullable=False),
|
|
87
|
+
sa.Column('prompt_group_id', sa.String(), nullable=False),
|
|
88
|
+
sa.Column('user_id', sa.String(), nullable=False),
|
|
89
|
+
sa.Column('role', sa.String(), nullable=False, server_default='viewer'),
|
|
90
|
+
sa.Column('added_at', sa.BigInteger(), nullable=False),
|
|
91
|
+
sa.Column('added_by_user_id', sa.String(), nullable=False),
|
|
92
|
+
sa.PrimaryKeyConstraint('id'),
|
|
93
|
+
sa.ForeignKeyConstraint(
|
|
94
|
+
['prompt_group_id'],
|
|
95
|
+
['prompt_groups.id'],
|
|
96
|
+
ondelete='CASCADE'
|
|
97
|
+
),
|
|
98
|
+
sa.UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user')
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Indexes for prompt_group_users (optimized for sharing queries)
|
|
102
|
+
op.create_index(
|
|
103
|
+
'ix_prompt_group_users_prompt_group_id',
|
|
104
|
+
'prompt_group_users',
|
|
105
|
+
['prompt_group_id'],
|
|
106
|
+
unique=False
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
op.create_index(
|
|
110
|
+
'ix_prompt_group_users_user_id',
|
|
111
|
+
'prompt_group_users',
|
|
112
|
+
['user_id'],
|
|
113
|
+
unique=False
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Composite index for fast access checks
|
|
117
|
+
op.create_index(
|
|
118
|
+
'ix_prompt_group_users_user_prompt',
|
|
119
|
+
'prompt_group_users',
|
|
120
|
+
['user_id', 'prompt_group_id'],
|
|
121
|
+
unique=False
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Optional: Index for role-based queries
|
|
125
|
+
op.create_index(
|
|
126
|
+
'ix_prompt_group_users_user_role',
|
|
127
|
+
'prompt_group_users',
|
|
128
|
+
['user_id', 'role'],
|
|
129
|
+
unique=False
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def downgrade() -> None:
|
|
134
|
+
"""Remove all prompt-related tables."""
|
|
135
|
+
|
|
136
|
+
# Drop prompt_group_users table and indexes
|
|
137
|
+
op.drop_index('ix_prompt_group_users_user_role', table_name='prompt_group_users')
|
|
138
|
+
op.drop_index('ix_prompt_group_users_user_prompt', table_name='prompt_group_users')
|
|
139
|
+
op.drop_index('ix_prompt_group_users_user_id', table_name='prompt_group_users')
|
|
140
|
+
op.drop_index('ix_prompt_group_users_prompt_group_id', table_name='prompt_group_users')
|
|
141
|
+
op.drop_table('prompt_group_users')
|
|
142
|
+
|
|
143
|
+
# Drop prompt_groups indexes and table
|
|
144
|
+
op.drop_index('ix_prompt_groups_is_pinned', table_name='prompt_groups')
|
|
145
|
+
op.drop_index('ix_prompt_groups_user_id', table_name='prompt_groups')
|
|
146
|
+
op.drop_index('ix_prompt_groups_command', table_name='prompt_groups')
|
|
147
|
+
op.drop_index('ix_prompt_groups_category', table_name='prompt_groups')
|
|
148
|
+
op.drop_index('ix_prompt_groups_name', table_name='prompt_groups')
|
|
149
|
+
op.drop_table('prompt_groups')
|
|
150
|
+
|
|
151
|
+
# Drop prompts indexes and table
|
|
152
|
+
op.drop_index('ix_prompts_user_id', table_name='prompts')
|
|
153
|
+
op.drop_index('ix_prompts_group_id', table_name='prompts')
|
|
154
|
+
op.drop_table('prompts')
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Add parent_task_id to tasks table
|
|
2
|
+
|
|
3
|
+
Revision ID: 20251115_add_parent_task_id
|
|
4
|
+
Revises: 20251108_prompt_tables_complete
|
|
5
|
+
Create Date: 2025-11-15
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
import sqlalchemy as sa
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "20251115_add_parent_task_id"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "20251108_prompt_tables_complete"
|
|
15
|
+
branch_labels: str | Sequence[str] | None = None
|
|
16
|
+
depends_on: str | Sequence[str] | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
"""Add parent_task_id column to tasks table for efficient task hierarchy queries."""
|
|
21
|
+
op.add_column(
|
|
22
|
+
"tasks", sa.Column("parent_task_id", sa.String(), nullable=True)
|
|
23
|
+
)
|
|
24
|
+
op.create_index(
|
|
25
|
+
"ix_tasks_parent_task_id", "tasks", ["parent_task_id"], unique=False
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def downgrade() -> None:
|
|
30
|
+
"""Remove parent_task_id column from tasks table."""
|
|
31
|
+
op.drop_index("ix_tasks_parent_task_id", table_name="tasks")
|
|
32
|
+
op.drop_column("tasks", "parent_task_id")
|