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
|
@@ -4,8 +4,8 @@ Session domain entity.
|
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, ConfigDict
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import AgentId, SessionId, UserId
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class Session(BaseModel):
|
|
@@ -19,6 +19,7 @@ class Session(BaseModel):
|
|
|
19
19
|
agent_id: AgentId | None = None
|
|
20
20
|
project_id: str | None = None
|
|
21
21
|
project_name: str | None = None
|
|
22
|
+
has_running_background_task: bool = False # Enriched field, not stored in DB
|
|
22
23
|
created_time: int
|
|
23
24
|
updated_time: int | None = None
|
|
24
25
|
deleted_at: int | None = None
|
|
@@ -10,6 +10,7 @@ class Task(BaseModel):
|
|
|
10
10
|
|
|
11
11
|
id: str
|
|
12
12
|
user_id: str
|
|
13
|
+
parent_task_id: str | None = None
|
|
13
14
|
start_time: int
|
|
14
15
|
end_time: int | None = None
|
|
15
16
|
status: str | None = None
|
|
@@ -20,6 +21,12 @@ class Task(BaseModel):
|
|
|
20
21
|
total_output_tokens: int | None = None
|
|
21
22
|
total_cached_input_tokens: int | None = None
|
|
22
23
|
token_usage_details: dict | None = None
|
|
24
|
+
|
|
25
|
+
# Background task execution fields
|
|
26
|
+
execution_mode: str | None = "foreground"
|
|
27
|
+
last_activity_time: int | None = None
|
|
28
|
+
background_execution_enabled: bool | None = False
|
|
29
|
+
max_execution_time_ms: int | None = None
|
|
23
30
|
|
|
24
31
|
class Config:
|
|
25
32
|
from_attributes = True
|
|
@@ -4,8 +4,8 @@ Feedback repository implementation using SQLAlchemy.
|
|
|
4
4
|
|
|
5
5
|
from sqlalchemy.orm import Session as DBSession
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import UserId
|
|
9
9
|
from .entities import Feedback
|
|
10
10
|
from .interfaces import IFeedbackRepository
|
|
11
11
|
from .models import FeedbackModel
|
|
@@ -6,8 +6,8 @@ from abc import ABC, abstractmethod
|
|
|
6
6
|
from typing import TYPE_CHECKING, Optional
|
|
7
7
|
from sqlalchemy.orm import Session as DBSession
|
|
8
8
|
|
|
9
|
-
from
|
|
10
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
10
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
11
11
|
from .entities import Feedback, Session, Task, TaskEvent
|
|
12
12
|
from .entities.project import Project
|
|
13
13
|
from ..routers.dto.requests.project_requests import ProjectFilter
|
|
@@ -10,6 +10,7 @@ from .project_user_model import ProjectUserModel, CreateProjectUserModel, Update
|
|
|
10
10
|
from .session_model import SessionModel, CreateSessionModel, UpdateSessionModel
|
|
11
11
|
from .task_event_model import TaskEventModel
|
|
12
12
|
from .task_model import TaskModel
|
|
13
|
+
from .prompt_model import PromptGroupModel, PromptModel, PromptGroupUserModel
|
|
13
14
|
|
|
14
15
|
__all__ = [
|
|
15
16
|
"Base",
|
|
@@ -26,4 +27,8 @@ __all__ = [
|
|
|
26
27
|
"UpdateSessionModel",
|
|
27
28
|
"TaskEventModel",
|
|
28
29
|
"TaskModel",
|
|
30
|
+
"FeedbackModel",
|
|
31
|
+
"PromptGroupModel",
|
|
32
|
+
"PromptModel",
|
|
33
|
+
"PromptGroupUserModel",
|
|
29
34
|
]
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Prompt SQLAlchemy models for prompt library feature.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from sqlalchemy import BigInteger, Column, String, Text, Integer, Boolean, ForeignKey, UniqueConstraint, Enum as SQLEnum
|
|
7
|
+
from sqlalchemy.orm import relationship
|
|
8
|
+
|
|
9
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
10
|
+
from .base import Base
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PromptGroupRole(str, Enum):
|
|
14
|
+
"""Valid roles for prompt group users."""
|
|
15
|
+
OWNER = "owner"
|
|
16
|
+
EDITOR = "editor"
|
|
17
|
+
VIEWER = "viewer"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PromptGroupModel(Base):
|
|
21
|
+
"""SQLAlchemy model for prompt groups"""
|
|
22
|
+
|
|
23
|
+
__tablename__ = "prompt_groups"
|
|
24
|
+
|
|
25
|
+
# Primary key - String type (not UUID)
|
|
26
|
+
id = Column(String, primary_key=True)
|
|
27
|
+
|
|
28
|
+
# Core fields
|
|
29
|
+
name = Column(String(255), nullable=False, index=True)
|
|
30
|
+
description = Column(Text, nullable=True)
|
|
31
|
+
category = Column(String(100), nullable=True, index=True)
|
|
32
|
+
command = Column(String(50), nullable=True, unique=True, index=True)
|
|
33
|
+
|
|
34
|
+
# Ownership
|
|
35
|
+
user_id = Column(String, nullable=False, index=True)
|
|
36
|
+
author_name = Column(String(255), nullable=True)
|
|
37
|
+
|
|
38
|
+
# Production prompt reference
|
|
39
|
+
production_prompt_id = Column(
|
|
40
|
+
String,
|
|
41
|
+
ForeignKey("prompts.id", ondelete="SET NULL"),
|
|
42
|
+
nullable=True
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Sharing (optional - for future enhancement)
|
|
46
|
+
is_shared = Column(Boolean, default=False, nullable=False)
|
|
47
|
+
|
|
48
|
+
# User preferences
|
|
49
|
+
is_pinned = Column(Boolean, default=False, nullable=False, index=True)
|
|
50
|
+
|
|
51
|
+
# Timestamps - BigInteger (epoch milliseconds) to match SAM convention
|
|
52
|
+
created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
|
|
53
|
+
updated_at = Column(
|
|
54
|
+
BigInteger,
|
|
55
|
+
nullable=False,
|
|
56
|
+
default=now_epoch_ms,
|
|
57
|
+
onupdate=now_epoch_ms
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Relationships
|
|
61
|
+
prompts = relationship(
|
|
62
|
+
"PromptModel",
|
|
63
|
+
back_populates="group",
|
|
64
|
+
foreign_keys="PromptModel.group_id",
|
|
65
|
+
cascade="all, delete-orphan"
|
|
66
|
+
)
|
|
67
|
+
production_prompt = relationship(
|
|
68
|
+
"PromptModel",
|
|
69
|
+
foreign_keys=[production_prompt_id],
|
|
70
|
+
post_update=True
|
|
71
|
+
)
|
|
72
|
+
prompt_group_users = relationship(
|
|
73
|
+
"PromptGroupUserModel",
|
|
74
|
+
back_populates="prompt_group",
|
|
75
|
+
cascade="all, delete-orphan"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def __repr__(self):
|
|
79
|
+
return f"<PromptGroupModel(id={self.id}, name={self.name}, command={self.command})>"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class PromptModel(Base):
|
|
83
|
+
"""SQLAlchemy model for individual prompt versions"""
|
|
84
|
+
|
|
85
|
+
__tablename__ = "prompts"
|
|
86
|
+
|
|
87
|
+
# Primary key - String type (not UUID)
|
|
88
|
+
id = Column(String, primary_key=True)
|
|
89
|
+
|
|
90
|
+
# Content
|
|
91
|
+
prompt_text = Column(Text, nullable=False)
|
|
92
|
+
|
|
93
|
+
# Versioned metadata fields (copied from group at version creation time)
|
|
94
|
+
name = Column(String(255), nullable=True)
|
|
95
|
+
description = Column(Text, nullable=True)
|
|
96
|
+
category = Column(String(100), nullable=True)
|
|
97
|
+
command = Column(String(50), nullable=True)
|
|
98
|
+
|
|
99
|
+
# Group relationship
|
|
100
|
+
group_id = Column(
|
|
101
|
+
String,
|
|
102
|
+
ForeignKey("prompt_groups.id", ondelete="CASCADE"),
|
|
103
|
+
nullable=False,
|
|
104
|
+
index=True
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Ownership
|
|
108
|
+
user_id = Column(String, nullable=False, index=True)
|
|
109
|
+
|
|
110
|
+
# Versioning
|
|
111
|
+
version = Column(Integer, default=1, nullable=False)
|
|
112
|
+
|
|
113
|
+
# Timestamps - BigInteger (epoch milliseconds)
|
|
114
|
+
created_at = Column(BigInteger, nullable=False, default=now_epoch_ms)
|
|
115
|
+
updated_at = Column(
|
|
116
|
+
BigInteger,
|
|
117
|
+
nullable=False,
|
|
118
|
+
default=now_epoch_ms,
|
|
119
|
+
onupdate=now_epoch_ms
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Relationships
|
|
123
|
+
group = relationship(
|
|
124
|
+
"PromptGroupModel",
|
|
125
|
+
back_populates="prompts",
|
|
126
|
+
foreign_keys=[group_id]
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
def __repr__(self):
|
|
130
|
+
return f"<PromptModel(id={self.id}, group_id={self.group_id}, version={self.version})>"
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class PromptGroupUserModel(Base):
|
|
134
|
+
"""
|
|
135
|
+
SQLAlchemy model for prompt group user access.
|
|
136
|
+
|
|
137
|
+
This junction table tracks which users have access to which prompt groups,
|
|
138
|
+
enabling multi-user collaboration on prompts with role-based permissions.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
__tablename__ = "prompt_group_users"
|
|
142
|
+
|
|
143
|
+
id = Column(String, primary_key=True)
|
|
144
|
+
prompt_group_id = Column(String, ForeignKey("prompt_groups.id", ondelete="CASCADE"), nullable=False)
|
|
145
|
+
user_id = Column(String, nullable=False)
|
|
146
|
+
role = Column(SQLEnum(PromptGroupRole), nullable=False, default=PromptGroupRole.VIEWER)
|
|
147
|
+
added_at = Column(BigInteger, nullable=False) # Epoch timestamp in milliseconds
|
|
148
|
+
added_by_user_id = Column(String, nullable=False) # User who granted access
|
|
149
|
+
|
|
150
|
+
# Ensure a user can only be added once per prompt group
|
|
151
|
+
__table_args__ = (
|
|
152
|
+
UniqueConstraint('prompt_group_id', 'user_id', name='uq_prompt_group_user'),
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Relationships
|
|
156
|
+
prompt_group = relationship("PromptGroupModel", back_populates="prompt_group_users")
|
|
157
|
+
|
|
158
|
+
def __repr__(self):
|
|
159
|
+
return f"<PromptGroupUserModel(id={self.id}, prompt_group_id={self.prompt_group_id}, user_id={self.user_id}, role={self.role})>"
|
|
@@ -6,7 +6,7 @@ from sqlalchemy import BigInteger, Column, String, ForeignKey
|
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
from sqlalchemy.orm import relationship
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
10
10
|
from .base import Base
|
|
11
11
|
|
|
12
12
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Task SQLAlchemy model.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
from sqlalchemy import BigInteger, Column, Integer, JSON, String, Text
|
|
5
|
+
from sqlalchemy import BigInteger, Boolean, Column, Integer, JSON, String, Text
|
|
6
6
|
from sqlalchemy.orm import relationship
|
|
7
7
|
|
|
8
8
|
from .base import Base
|
|
@@ -15,6 +15,7 @@ class TaskModel(Base):
|
|
|
15
15
|
|
|
16
16
|
id = Column(String, primary_key=True)
|
|
17
17
|
user_id = Column(String, nullable=False, index=True)
|
|
18
|
+
parent_task_id = Column(String, nullable=True, index=True)
|
|
18
19
|
start_time = Column(BigInteger, nullable=False)
|
|
19
20
|
end_time = Column(BigInteger, nullable=True)
|
|
20
21
|
status = Column(String, nullable=True)
|
|
@@ -25,6 +26,12 @@ class TaskModel(Base):
|
|
|
25
26
|
total_output_tokens = Column(Integer, nullable=True)
|
|
26
27
|
total_cached_input_tokens = Column(Integer, nullable=True)
|
|
27
28
|
token_usage_details = Column(JSON, nullable=True)
|
|
29
|
+
|
|
30
|
+
# Background task execution columns
|
|
31
|
+
execution_mode = Column(String(20), nullable=True, default="foreground", index=True)
|
|
32
|
+
last_activity_time = Column(BigInteger, nullable=True, index=True)
|
|
33
|
+
background_execution_enabled = Column(Boolean, nullable=True, default=False)
|
|
34
|
+
max_execution_time_ms = Column(BigInteger, nullable=True)
|
|
28
35
|
|
|
29
36
|
# Relationship to events
|
|
30
37
|
events = relationship(
|
|
@@ -11,7 +11,7 @@ from .interfaces import IProjectRepository
|
|
|
11
11
|
from .models import ProjectModel, ProjectUserModel
|
|
12
12
|
from .entities.project import Project
|
|
13
13
|
from ..routers.dto.requests.project_requests import ProjectFilter
|
|
14
|
-
from
|
|
14
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ProjectRepository(IProjectRepository):
|
|
@@ -8,7 +8,7 @@ from sqlalchemy.orm import Session as DBSession
|
|
|
8
8
|
|
|
9
9
|
from .models import ProjectUserModel
|
|
10
10
|
from .entities.project_user import ProjectUser
|
|
11
|
-
from
|
|
11
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ProjectUserRepository:
|
|
@@ -5,14 +5,13 @@ Session repository implementation using SQLAlchemy.
|
|
|
5
5
|
from sqlalchemy import or_, func
|
|
6
6
|
from sqlalchemy.orm import Session as DBSession, joinedload
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
8
|
+
from solace_agent_mesh.shared.database.base_repository import PaginatedRepository
|
|
9
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
10
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
11
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
12
12
|
from .entities import Session
|
|
13
13
|
from .interfaces import ISessionRepository
|
|
14
14
|
from .models import CreateSessionModel, SessionModel, UpdateSessionModel
|
|
15
|
-
from .models.chat_task_model import ChatTaskModel
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepository):
|
|
@@ -217,10 +216,7 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
|
|
|
217
216
|
project_id: str | None = None
|
|
218
217
|
) -> list[Session]:
|
|
219
218
|
"""
|
|
220
|
-
Search sessions by name
|
|
221
|
-
|
|
222
|
-
Uses PostgreSQL full-text search when available (for queries >= 3 chars),
|
|
223
|
-
falls back to ILIKE for SQLite or short queries.
|
|
219
|
+
Search sessions by name/title only using ILIKE.
|
|
224
220
|
"""
|
|
225
221
|
# Base query - only non-deleted sessions for the user
|
|
226
222
|
base_query = db_session.query(SessionModel).filter(
|
|
@@ -232,54 +228,9 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
|
|
|
232
228
|
if project_id is not None:
|
|
233
229
|
base_query = base_query.filter(SessionModel.project_id == project_id)
|
|
234
230
|
|
|
235
|
-
#
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
if use_fts:
|
|
240
|
-
# PostgreSQL full-text search for better performance
|
|
241
|
-
matching_chat_tasks = (
|
|
242
|
-
db_session.query(ChatTaskModel.session_id)
|
|
243
|
-
.filter(
|
|
244
|
-
or_(
|
|
245
|
-
func.to_tsvector('english', func.coalesce(ChatTaskModel.user_message, ''))
|
|
246
|
-
.op('@@')(func.plainto_tsquery('english', query)),
|
|
247
|
-
func.to_tsvector('english', ChatTaskModel.message_bubbles)
|
|
248
|
-
.op('@@')(func.plainto_tsquery('english', query))
|
|
249
|
-
)
|
|
250
|
-
)
|
|
251
|
-
.distinct()
|
|
252
|
-
.subquery()
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
search_query = base_query.filter(
|
|
256
|
-
or_(
|
|
257
|
-
func.to_tsvector('english', func.coalesce(SessionModel.name, ''))
|
|
258
|
-
.op('@@')(func.plainto_tsquery('english', query)),
|
|
259
|
-
SessionModel.id.in_(matching_chat_tasks)
|
|
260
|
-
)
|
|
261
|
-
)
|
|
262
|
-
else:
|
|
263
|
-
# ILIKE search for SQLite or short queries
|
|
264
|
-
search_pattern = f"%{query}%"
|
|
265
|
-
matching_chat_tasks = (
|
|
266
|
-
db_session.query(ChatTaskModel.session_id)
|
|
267
|
-
.filter(
|
|
268
|
-
or_(
|
|
269
|
-
ChatTaskModel.user_message.ilike(search_pattern),
|
|
270
|
-
ChatTaskModel.message_bubbles.ilike(search_pattern)
|
|
271
|
-
)
|
|
272
|
-
)
|
|
273
|
-
.distinct()
|
|
274
|
-
.subquery()
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
search_query = base_query.filter(
|
|
278
|
-
or_(
|
|
279
|
-
SessionModel.name.ilike(search_pattern),
|
|
280
|
-
SessionModel.id.in_(matching_chat_tasks)
|
|
281
|
-
)
|
|
282
|
-
)
|
|
231
|
+
# ILIKE search on session name
|
|
232
|
+
search_pattern = f"%{query}%"
|
|
233
|
+
search_query = base_query.filter(SessionModel.name.ilike(search_pattern))
|
|
283
234
|
|
|
284
235
|
# Eager load project relationship
|
|
285
236
|
search_query = search_query.options(joinedload(SessionModel.project))
|
|
@@ -299,9 +250,7 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
|
|
|
299
250
|
project_id: str | None = None
|
|
300
251
|
) -> int:
|
|
301
252
|
"""
|
|
302
|
-
Count search results for pagination.
|
|
303
|
-
|
|
304
|
-
Uses same database-agnostic logic as search() method for consistency.
|
|
253
|
+
Count search results for pagination (title-only search).
|
|
305
254
|
"""
|
|
306
255
|
# Base query - only non-deleted sessions for the user
|
|
307
256
|
base_query = db_session.query(SessionModel).filter(
|
|
@@ -312,52 +261,8 @@ class SessionRepository(PaginatedRepository[SessionModel, Session], ISessionRepo
|
|
|
312
261
|
if project_id is not None:
|
|
313
262
|
base_query = base_query.filter(SessionModel.project_id == project_id)
|
|
314
263
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
if use_fts:
|
|
319
|
-
# PostgreSQL full-text search
|
|
320
|
-
matching_chat_tasks = (
|
|
321
|
-
db_session.query(ChatTaskModel.session_id)
|
|
322
|
-
.filter(
|
|
323
|
-
or_(
|
|
324
|
-
func.to_tsvector('english', func.coalesce(ChatTaskModel.user_message, ''))
|
|
325
|
-
.op('@@')(func.plainto_tsquery('english', query)),
|
|
326
|
-
func.to_tsvector('english', ChatTaskModel.message_bubbles)
|
|
327
|
-
.op('@@')(func.plainto_tsquery('english', query))
|
|
328
|
-
)
|
|
329
|
-
)
|
|
330
|
-
.distinct()
|
|
331
|
-
.subquery()
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
search_query = base_query.filter(
|
|
335
|
-
or_(
|
|
336
|
-
func.to_tsvector('english', func.coalesce(SessionModel.name, ''))
|
|
337
|
-
.op('@@')(func.plainto_tsquery('english', query)),
|
|
338
|
-
SessionModel.id.in_(matching_chat_tasks)
|
|
339
|
-
)
|
|
340
|
-
)
|
|
341
|
-
else:
|
|
342
|
-
# ILIKE search for SQLite or short queries
|
|
343
|
-
search_pattern = f"%{query}%"
|
|
344
|
-
matching_chat_tasks = (
|
|
345
|
-
db_session.query(ChatTaskModel.session_id)
|
|
346
|
-
.filter(
|
|
347
|
-
or_(
|
|
348
|
-
ChatTaskModel.user_message.ilike(search_pattern),
|
|
349
|
-
ChatTaskModel.message_bubbles.ilike(search_pattern)
|
|
350
|
-
)
|
|
351
|
-
)
|
|
352
|
-
.distinct()
|
|
353
|
-
.subquery()
|
|
354
|
-
)
|
|
355
|
-
|
|
356
|
-
search_query = base_query.filter(
|
|
357
|
-
or_(
|
|
358
|
-
SessionModel.name.ilike(search_pattern),
|
|
359
|
-
SessionModel.id.in_(matching_chat_tasks)
|
|
360
|
-
)
|
|
361
|
-
)
|
|
264
|
+
# ILIKE search on session name
|
|
265
|
+
search_pattern = f"%{query}%"
|
|
266
|
+
search_query = base_query.filter(SessionModel.name.ilike(search_pattern))
|
|
362
267
|
|
|
363
268
|
return search_query.count()
|
|
@@ -4,8 +4,8 @@ Task repository implementation using SQLAlchemy.
|
|
|
4
4
|
|
|
5
5
|
from sqlalchemy.orm import Session as DBSession
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams
|
|
8
|
+
from solace_agent_mesh.shared.utils.types import UserId
|
|
9
9
|
from .entities import Task, TaskEvent
|
|
10
10
|
from .interfaces import ITaskRepository
|
|
11
11
|
from .models import TaskEventModel, TaskModel
|
|
@@ -25,10 +25,15 @@ class TaskRepository(ITaskRepository):
|
|
|
25
25
|
model.total_output_tokens = task.total_output_tokens
|
|
26
26
|
model.total_cached_input_tokens = task.total_cached_input_tokens
|
|
27
27
|
model.token_usage_details = task.token_usage_details
|
|
28
|
+
model.execution_mode = task.execution_mode
|
|
29
|
+
model.last_activity_time = task.last_activity_time
|
|
30
|
+
model.background_execution_enabled = task.background_execution_enabled
|
|
31
|
+
model.max_execution_time_ms = task.max_execution_time_ms
|
|
28
32
|
else:
|
|
29
33
|
model = TaskModel(
|
|
30
34
|
id=task.id,
|
|
31
35
|
user_id=task.user_id,
|
|
36
|
+
parent_task_id=task.parent_task_id,
|
|
32
37
|
start_time=task.start_time,
|
|
33
38
|
end_time=task.end_time,
|
|
34
39
|
status=task.status,
|
|
@@ -37,6 +42,10 @@ class TaskRepository(ITaskRepository):
|
|
|
37
42
|
total_output_tokens=task.total_output_tokens,
|
|
38
43
|
total_cached_input_tokens=task.total_cached_input_tokens,
|
|
39
44
|
token_usage_details=task.token_usage_details,
|
|
45
|
+
execution_mode=task.execution_mode,
|
|
46
|
+
last_activity_time=task.last_activity_time,
|
|
47
|
+
background_execution_enabled=task.background_execution_enabled,
|
|
48
|
+
max_execution_time_ms=task.max_execution_time_ms,
|
|
40
49
|
)
|
|
41
50
|
session.add(model)
|
|
42
51
|
|
|
@@ -155,6 +164,81 @@ class TaskRepository(ITaskRepository):
|
|
|
155
164
|
|
|
156
165
|
return total_deleted
|
|
157
166
|
|
|
167
|
+
def find_all_by_parent_chain(self, session: DBSession, task_id: str) -> list[str]:
|
|
168
|
+
"""
|
|
169
|
+
Returns all task IDs in the hierarchy starting from task_id.
|
|
170
|
+
Traverses up to find root, then traverses down to find all descendants.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
session: Database session
|
|
174
|
+
task_id: Starting task ID
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
List of all task IDs in the hierarchy (including the starting task)
|
|
178
|
+
"""
|
|
179
|
+
# Find root task (traverse up parent chain)
|
|
180
|
+
root_task_id = task_id
|
|
181
|
+
current_id = task_id
|
|
182
|
+
visited = set()
|
|
183
|
+
|
|
184
|
+
while current_id and current_id not in visited:
|
|
185
|
+
visited.add(current_id)
|
|
186
|
+
task_model = (
|
|
187
|
+
session.query(TaskModel).filter(TaskModel.id == current_id).first()
|
|
188
|
+
)
|
|
189
|
+
if not task_model or not task_model.parent_task_id:
|
|
190
|
+
root_task_id = current_id
|
|
191
|
+
break
|
|
192
|
+
current_id = task_model.parent_task_id
|
|
193
|
+
|
|
194
|
+
# Find all descendants of root (BFS)
|
|
195
|
+
all_task_ids = {root_task_id}
|
|
196
|
+
to_process = [root_task_id]
|
|
197
|
+
|
|
198
|
+
while to_process:
|
|
199
|
+
current = to_process.pop(0)
|
|
200
|
+
# Find children
|
|
201
|
+
children = (
|
|
202
|
+
session.query(TaskModel)
|
|
203
|
+
.filter(TaskModel.parent_task_id == current)
|
|
204
|
+
.all()
|
|
205
|
+
)
|
|
206
|
+
for child in children:
|
|
207
|
+
if child.id not in all_task_ids:
|
|
208
|
+
all_task_ids.add(child.id)
|
|
209
|
+
to_process.append(child.id)
|
|
210
|
+
|
|
211
|
+
return list(all_task_ids)
|
|
212
|
+
|
|
213
|
+
def find_background_tasks_by_status(
|
|
214
|
+
self, session: DBSession, status: str | None = None
|
|
215
|
+
) -> list[Task]:
|
|
216
|
+
"""Find all background tasks, optionally filtered by status."""
|
|
217
|
+
query = session.query(TaskModel).filter(
|
|
218
|
+
TaskModel.execution_mode == "background"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
if status:
|
|
222
|
+
query = query.filter(TaskModel.status == status)
|
|
223
|
+
|
|
224
|
+
models = query.all()
|
|
225
|
+
return [self._task_model_to_entity(model) for model in models]
|
|
226
|
+
|
|
227
|
+
def find_timed_out_background_tasks(
|
|
228
|
+
self, session: DBSession, cutoff_time_ms: int
|
|
229
|
+
) -> list[Task]:
|
|
230
|
+
"""Find background tasks that have exceeded their timeout."""
|
|
231
|
+
models = (
|
|
232
|
+
session.query(TaskModel)
|
|
233
|
+
.filter(
|
|
234
|
+
TaskModel.execution_mode == "background",
|
|
235
|
+
TaskModel.status.in_(["running", "pending"]),
|
|
236
|
+
TaskModel.last_activity_time < cutoff_time_ms
|
|
237
|
+
)
|
|
238
|
+
.all()
|
|
239
|
+
)
|
|
240
|
+
return [self._task_model_to_entity(model) for model in models]
|
|
241
|
+
|
|
158
242
|
def _task_model_to_entity(self, model: TaskModel) -> Task:
|
|
159
243
|
"""Convert SQLAlchemy task model to domain entity."""
|
|
160
244
|
return Task.model_validate(model)
|
|
@@ -4,12 +4,12 @@ API Router for agent discovery and management.
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
7
|
-
from typing import Dict, List
|
|
7
|
+
from typing import Any, Dict, List
|
|
8
8
|
|
|
9
9
|
from ....common.agent_registry import AgentRegistry
|
|
10
|
+
from ....common.middleware.registry import MiddlewareRegistry
|
|
10
11
|
from a2a.types import AgentCard
|
|
11
|
-
from ..dependencies import get_agent_registry,
|
|
12
|
-
from ..component import WebUIBackendComponent
|
|
12
|
+
from ..dependencies import get_agent_registry, get_user_config
|
|
13
13
|
|
|
14
14
|
log = logging.getLogger(__name__)
|
|
15
15
|
|
|
@@ -19,22 +19,53 @@ router = APIRouter()
|
|
|
19
19
|
@router.get("/agentCards", response_model=List[AgentCard])
|
|
20
20
|
async def get_discovered_agent_cards(
|
|
21
21
|
agent_registry: AgentRegistry = Depends(get_agent_registry),
|
|
22
|
+
user_config: Dict[str, Any] = Depends(get_user_config),
|
|
22
23
|
):
|
|
23
24
|
"""
|
|
24
|
-
Retrieves a list of
|
|
25
|
+
Retrieves a list of discovered A2A agents filtered by user permissions.
|
|
26
|
+
|
|
27
|
+
Agents are filtered based on the user's agent:*:delegate scopes to ensure
|
|
28
|
+
users only see agents they have permission to access.
|
|
25
29
|
"""
|
|
26
30
|
log_prefix = "[GET /api/v1/agentCards] "
|
|
27
31
|
log.info("%sRequest received.", log_prefix)
|
|
28
32
|
try:
|
|
29
33
|
agent_names = agent_registry.get_agent_names()
|
|
30
|
-
|
|
34
|
+
all_agents = [
|
|
31
35
|
agent_registry.get_agent(name)
|
|
32
36
|
for name in agent_names
|
|
33
37
|
if agent_registry.get_agent(name)
|
|
34
38
|
]
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
# Filter agents by user's access permissions
|
|
41
|
+
config_resolver = MiddlewareRegistry.get_config_resolver()
|
|
42
|
+
filtered_agents = []
|
|
43
|
+
|
|
44
|
+
for agent in all_agents:
|
|
45
|
+
operation_spec = {
|
|
46
|
+
"operation_type": "agent_access",
|
|
47
|
+
"target_agent": agent.name,
|
|
48
|
+
}
|
|
49
|
+
validation_result = config_resolver.validate_operation_config(
|
|
50
|
+
user_config, operation_spec, {"source": "agent_cards_endpoint"}
|
|
51
|
+
)
|
|
52
|
+
if validation_result.get("valid", False):
|
|
53
|
+
filtered_agents.append(agent)
|
|
54
|
+
else:
|
|
55
|
+
log.debug(
|
|
56
|
+
"%sAgent '%s' filtered out for user. Required scopes: %s",
|
|
57
|
+
log_prefix,
|
|
58
|
+
agent.name,
|
|
59
|
+
validation_result.get("required_scopes", []),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
log.debug(
|
|
63
|
+
"%sReturning %d/%d agents after filtering.",
|
|
64
|
+
log_prefix,
|
|
65
|
+
len(filtered_agents),
|
|
66
|
+
len(all_agents),
|
|
67
|
+
)
|
|
68
|
+
return filtered_agents
|
|
38
69
|
except Exception as e:
|
|
39
70
|
log.exception("%sError retrieving discovered agent cards: %s", log_prefix, e)
|
|
40
71
|
raise HTTPException(
|