solace-agent-mesh 1.6.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/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- 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 +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- 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/app.py +3 -2
- 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 +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- 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 +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -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 +57 -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 +248 -6
- 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/2987107d.a80604f9.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/631738c7.fa471607.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/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.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/8b032486.91a91afc.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/ad87452a.9d73dad6.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/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.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/ff4d71f2.74710fc1.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 +82 -68
- 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 +182 -0
- 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 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- 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 +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- 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 +162 -171
- 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 +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
- 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 +112 -87
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- 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 -37
- 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 +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- 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 +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- 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/docs_cmd.py +4 -1
- 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-BTf6dqwp.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-CGk8Suyh.js +565 -0
- 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/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- 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 +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -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/pydantic_utils.py +90 -3
- 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/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- 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 +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -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 +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
- 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 +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- 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/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -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 +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- 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 +92 -9
- 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 +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- 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 +19 -5
- 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.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- 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 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- 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/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 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.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.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.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.b5ddb7a1.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.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.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-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- 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 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- 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 -336
- 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 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- 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 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- 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-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.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.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -9,11 +9,12 @@ from ..repository import (
|
|
|
9
9
|
Session,
|
|
10
10
|
)
|
|
11
11
|
from ..repository.chat_task_repository import ChatTaskRepository
|
|
12
|
+
from ..repository.task_repository import TaskRepository
|
|
12
13
|
from ..repository.entities import ChatTask
|
|
13
|
-
from
|
|
14
|
-
from
|
|
15
|
-
from
|
|
16
|
-
from
|
|
14
|
+
from solace_agent_mesh.shared.utils.enums import SenderType
|
|
15
|
+
from solace_agent_mesh.shared.utils.types import SessionId, UserId
|
|
16
|
+
from solace_agent_mesh.shared.utils.timestamp_utils import now_epoch_ms
|
|
17
|
+
from solace_agent_mesh.shared.api.pagination import PaginationParams, PaginatedResponse, get_pagination_or_default
|
|
17
18
|
|
|
18
19
|
log = logging.getLogger(__name__)
|
|
19
20
|
|
|
@@ -42,13 +43,19 @@ class SessionService:
|
|
|
42
43
|
self,
|
|
43
44
|
db: DbSession,
|
|
44
45
|
user_id: UserId,
|
|
45
|
-
pagination: PaginationParams | None = None
|
|
46
|
+
pagination: PaginationParams | None = None,
|
|
47
|
+
project_id: str | None = None
|
|
46
48
|
) -> PaginatedResponse[Session]:
|
|
47
49
|
"""
|
|
48
|
-
Get paginated sessions for a user with full metadata.
|
|
49
|
-
|
|
50
|
+
Get paginated sessions for a user with full metadata including project names and background task status.
|
|
50
51
|
Uses default pagination if none provided (page 1, size 20).
|
|
51
52
|
Returns paginated response with pageNumber, pageSize, nextPage, totalPages, totalCount.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
db: Database session
|
|
56
|
+
user_id: User ID to filter sessions by
|
|
57
|
+
pagination: Pagination parameters
|
|
58
|
+
project_id: Optional project ID to filter sessions by (for project-specific views)
|
|
52
59
|
"""
|
|
53
60
|
if not user_id or user_id.strip() == "":
|
|
54
61
|
raise ValueError("User ID cannot be empty")
|
|
@@ -56,9 +63,81 @@ class SessionService:
|
|
|
56
63
|
pagination = get_pagination_or_default(pagination)
|
|
57
64
|
session_repository = self._get_repositories(db)
|
|
58
65
|
|
|
59
|
-
#
|
|
60
|
-
sessions = session_repository.find_by_user(db, user_id, pagination)
|
|
61
|
-
total_count = session_repository.count_by_user(db, user_id)
|
|
66
|
+
# Fetch sessions with optional project filtering
|
|
67
|
+
sessions = session_repository.find_by_user(db, user_id, pagination, project_id=project_id)
|
|
68
|
+
total_count = session_repository.count_by_user(db, user_id, project_id=project_id)
|
|
69
|
+
|
|
70
|
+
# Enrich sessions with project names
|
|
71
|
+
# Collect unique project IDs
|
|
72
|
+
project_ids = [s.project_id for s in sessions if s.project_id]
|
|
73
|
+
|
|
74
|
+
if project_ids:
|
|
75
|
+
# Fetch all projects in one query
|
|
76
|
+
from ..repository.models import ProjectModel
|
|
77
|
+
projects = db.query(ProjectModel).filter(ProjectModel.id.in_(project_ids)).all()
|
|
78
|
+
project_map = {p.id: p.name for p in projects}
|
|
79
|
+
|
|
80
|
+
# Map project names to sessions
|
|
81
|
+
for session in sessions:
|
|
82
|
+
if session.project_id:
|
|
83
|
+
session.project_name = project_map.get(session.project_id)
|
|
84
|
+
|
|
85
|
+
# Check for running background tasks in these sessions
|
|
86
|
+
task_repo = TaskRepository()
|
|
87
|
+
session_ids = [s.id for s in sessions]
|
|
88
|
+
|
|
89
|
+
# Get all running background tasks for this user
|
|
90
|
+
running_bg_tasks = task_repo.find_background_tasks_by_status(db, status=None)
|
|
91
|
+
running_bg_tasks = [
|
|
92
|
+
task for task in running_bg_tasks
|
|
93
|
+
if task.status in [None, "running", "pending"] and task.end_time is None and task.user_id == user_id
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
log.info(f"[get_user_sessions] Found {len(running_bg_tasks)} running background tasks for user {user_id}")
|
|
97
|
+
|
|
98
|
+
# Create a map of session_id -> has_running_background_task
|
|
99
|
+
# Query ChatTaskModel to find which sessions these tasks belong to
|
|
100
|
+
# Also filter out tasks that have been marked as completed in their metadata
|
|
101
|
+
from ..repository.models import ChatTaskModel
|
|
102
|
+
import json
|
|
103
|
+
session_task_map = {}
|
|
104
|
+
if running_bg_tasks:
|
|
105
|
+
task_ids = [task.id for task in running_bg_tasks]
|
|
106
|
+
log.info(f"[get_user_sessions] Looking up chat tasks for task IDs: {task_ids}")
|
|
107
|
+
|
|
108
|
+
# Query chat tasks for these task IDs
|
|
109
|
+
chat_tasks = db.query(ChatTaskModel).filter(
|
|
110
|
+
ChatTaskModel.id.in_(task_ids),
|
|
111
|
+
ChatTaskModel.user_id == user_id
|
|
112
|
+
).all()
|
|
113
|
+
|
|
114
|
+
log.info(f"[get_user_sessions] Found {len(chat_tasks)} chat tasks")
|
|
115
|
+
|
|
116
|
+
for chat_task in chat_tasks:
|
|
117
|
+
if chat_task.session_id:
|
|
118
|
+
# Check if task metadata indicates completion
|
|
119
|
+
is_completed = False
|
|
120
|
+
if chat_task.task_metadata:
|
|
121
|
+
try:
|
|
122
|
+
metadata = json.loads(chat_task.task_metadata) if isinstance(chat_task.task_metadata, str) else chat_task.task_metadata
|
|
123
|
+
task_status = metadata.get("status")
|
|
124
|
+
is_completed = task_status in ["completed", "error", "failed"]
|
|
125
|
+
log.info(f"[get_user_sessions] Task {chat_task.id} metadata status: {task_status}, is_completed: {is_completed}")
|
|
126
|
+
except Exception as e:
|
|
127
|
+
log.warning(f"[get_user_sessions] Failed to parse task metadata for {chat_task.id}: {e}")
|
|
128
|
+
|
|
129
|
+
# Only mark session as having running task if task is not completed
|
|
130
|
+
if not is_completed:
|
|
131
|
+
session_task_map[chat_task.session_id] = True
|
|
132
|
+
log.debug(f"[get_user_sessions] Session {chat_task.session_id} has running background task {chat_task.id}")
|
|
133
|
+
else:
|
|
134
|
+
log.debug(f"[get_user_sessions] Task {chat_task.id} is completed, not marking session as having running task")
|
|
135
|
+
|
|
136
|
+
# Add background task status to sessions
|
|
137
|
+
for session in sessions:
|
|
138
|
+
session.has_running_background_task = session_task_map.get(session.id, False)
|
|
139
|
+
if session.has_running_background_task:
|
|
140
|
+
log.info(f"[get_user_sessions] Marking session {session.id} as having running background task")
|
|
62
141
|
|
|
63
142
|
return PaginatedResponse.create(sessions, total_count, pagination)
|
|
64
143
|
|
|
@@ -78,6 +157,7 @@ class SessionService:
|
|
|
78
157
|
name: str | None = None,
|
|
79
158
|
agent_id: str | None = None,
|
|
80
159
|
session_id: str | None = None,
|
|
160
|
+
project_id: str | None = None,
|
|
81
161
|
) -> Optional[Session]:
|
|
82
162
|
if not self.is_persistence_enabled():
|
|
83
163
|
log.debug("Persistence is not enabled. Skipping session creation in DB.")
|
|
@@ -95,13 +175,14 @@ class SessionService:
|
|
|
95
175
|
user_id=user_id,
|
|
96
176
|
name=name,
|
|
97
177
|
agent_id=agent_id,
|
|
178
|
+
project_id=project_id,
|
|
98
179
|
created_time=now_ms,
|
|
99
180
|
updated_time=now_ms,
|
|
100
181
|
)
|
|
101
182
|
|
|
102
183
|
session_repository = self._get_repositories(db)
|
|
103
184
|
created_session = session_repository.save(db, session)
|
|
104
|
-
log.
|
|
185
|
+
log.debug("Created new session %s for user %s", created_session.id, user_id)
|
|
105
186
|
|
|
106
187
|
if not created_session:
|
|
107
188
|
raise ValueError(f"Failed to save session for {session_id}")
|
|
@@ -166,6 +247,266 @@ class SessionService:
|
|
|
166
247
|
|
|
167
248
|
return True
|
|
168
249
|
|
|
250
|
+
def soft_delete_session(
|
|
251
|
+
self, db: DbSession, session_id: SessionId, user_id: UserId
|
|
252
|
+
) -> bool:
|
|
253
|
+
"""
|
|
254
|
+
Soft delete a session (mark as deleted without removing from database).
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
db: Database session
|
|
258
|
+
session_id: Session ID to soft delete
|
|
259
|
+
user_id: User ID performing the deletion
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
bool: True if soft deleted successfully, False otherwise
|
|
263
|
+
"""
|
|
264
|
+
if not self._is_valid_session_id(session_id):
|
|
265
|
+
raise ValueError("Invalid session ID")
|
|
266
|
+
|
|
267
|
+
session_repository = self._get_repositories(db)
|
|
268
|
+
session = session_repository.find_user_session(db, session_id, user_id)
|
|
269
|
+
if not session:
|
|
270
|
+
log.warning(
|
|
271
|
+
"Attempted to soft delete non-existent session %s by user %s",
|
|
272
|
+
session_id,
|
|
273
|
+
user_id,
|
|
274
|
+
)
|
|
275
|
+
return False
|
|
276
|
+
|
|
277
|
+
if not session.can_be_deleted_by_user(user_id):
|
|
278
|
+
log.warning(
|
|
279
|
+
"User %s not authorized to soft delete session %s", user_id, session_id
|
|
280
|
+
)
|
|
281
|
+
return False
|
|
282
|
+
|
|
283
|
+
deleted = session_repository.soft_delete(db, session_id, user_id)
|
|
284
|
+
if not deleted:
|
|
285
|
+
return False
|
|
286
|
+
|
|
287
|
+
log.info("Session %s soft deleted successfully by user %s", session_id, user_id)
|
|
288
|
+
return True
|
|
289
|
+
|
|
290
|
+
async def move_session_to_project(
|
|
291
|
+
self, db: DbSession, session_id: SessionId, user_id: UserId, new_project_id: str | None
|
|
292
|
+
) -> Session | None:
|
|
293
|
+
"""
|
|
294
|
+
Move a session to a different project.
|
|
295
|
+
|
|
296
|
+
When moving to a project, this also copies all project artifacts to the session
|
|
297
|
+
so they are immediately available without waiting for the next user message.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
db: Database session
|
|
301
|
+
session_id: Session ID to move
|
|
302
|
+
user_id: User ID performing the move
|
|
303
|
+
new_project_id: New project ID (or None to remove from project)
|
|
304
|
+
|
|
305
|
+
Returns:
|
|
306
|
+
Session: Updated session if successful, None otherwise
|
|
307
|
+
|
|
308
|
+
Raises:
|
|
309
|
+
ValueError: If session or project validation fails
|
|
310
|
+
"""
|
|
311
|
+
if not self._is_valid_session_id(session_id):
|
|
312
|
+
raise ValueError("Invalid session ID")
|
|
313
|
+
|
|
314
|
+
# Validate project exists and user has access if project_id is provided
|
|
315
|
+
if new_project_id:
|
|
316
|
+
from ..repository.models import ProjectModel
|
|
317
|
+
project = db.query(ProjectModel).filter(
|
|
318
|
+
ProjectModel.id == new_project_id,
|
|
319
|
+
ProjectModel.user_id == user_id,
|
|
320
|
+
ProjectModel.deleted_at.is_(None)
|
|
321
|
+
).first()
|
|
322
|
+
|
|
323
|
+
if not project:
|
|
324
|
+
raise ValueError(f"Project {new_project_id} not found or access denied")
|
|
325
|
+
|
|
326
|
+
session_repository = self._get_repositories(db)
|
|
327
|
+
updated_session = session_repository.move_to_project(db, session_id, user_id, new_project_id)
|
|
328
|
+
|
|
329
|
+
if not updated_session:
|
|
330
|
+
log.warning(
|
|
331
|
+
"Failed to move session %s to project %s for user %s",
|
|
332
|
+
session_id,
|
|
333
|
+
new_project_id,
|
|
334
|
+
user_id,
|
|
335
|
+
)
|
|
336
|
+
return None
|
|
337
|
+
|
|
338
|
+
try:
|
|
339
|
+
db.commit()
|
|
340
|
+
log.info(
|
|
341
|
+
"Session %s moved to project %s by user %s",
|
|
342
|
+
session_id,
|
|
343
|
+
new_project_id or "None",
|
|
344
|
+
user_id,
|
|
345
|
+
)
|
|
346
|
+
except Exception as e:
|
|
347
|
+
db.rollback()
|
|
348
|
+
log.error(
|
|
349
|
+
"Failed to commit session move for session %s: %s",
|
|
350
|
+
session_id,
|
|
351
|
+
e,
|
|
352
|
+
)
|
|
353
|
+
raise
|
|
354
|
+
|
|
355
|
+
# Copy project artifacts to session immediately when moving to a project
|
|
356
|
+
if new_project_id and self.component:
|
|
357
|
+
from ..utils.artifact_copy_utils import copy_project_artifacts_to_session
|
|
358
|
+
from ..services.project_service import ProjectService
|
|
359
|
+
from ..dependencies import SessionLocal
|
|
360
|
+
|
|
361
|
+
if SessionLocal:
|
|
362
|
+
artifact_db = SessionLocal()
|
|
363
|
+
try:
|
|
364
|
+
project_service = ProjectService(component=self.component)
|
|
365
|
+
log_prefix = f"[move_session_to_project session_id={session_id}] "
|
|
366
|
+
|
|
367
|
+
artifacts_copied, _ = await copy_project_artifacts_to_session(
|
|
368
|
+
project_id=new_project_id,
|
|
369
|
+
user_id=user_id,
|
|
370
|
+
session_id=session_id,
|
|
371
|
+
project_service=project_service,
|
|
372
|
+
component=self.component,
|
|
373
|
+
db=artifact_db,
|
|
374
|
+
log_prefix=log_prefix,
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
if artifacts_copied > 0:
|
|
378
|
+
log.info(
|
|
379
|
+
"%sCopied %d project artifacts to session during move",
|
|
380
|
+
log_prefix,
|
|
381
|
+
artifacts_copied,
|
|
382
|
+
)
|
|
383
|
+
except Exception as e:
|
|
384
|
+
# Don't fail the move operation if artifact copying fails
|
|
385
|
+
# The session move has already been committed at this point
|
|
386
|
+
log.warning(
|
|
387
|
+
"Failed to copy project artifacts when moving session %s to project %s: %s",
|
|
388
|
+
session_id,
|
|
389
|
+
new_project_id,
|
|
390
|
+
e,
|
|
391
|
+
)
|
|
392
|
+
finally:
|
|
393
|
+
artifact_db.close()
|
|
394
|
+
|
|
395
|
+
return updated_session
|
|
396
|
+
|
|
397
|
+
def search_sessions(
|
|
398
|
+
self,
|
|
399
|
+
db: DbSession,
|
|
400
|
+
user_id: UserId,
|
|
401
|
+
query: str,
|
|
402
|
+
pagination: PaginationParams | None = None,
|
|
403
|
+
project_id: str | None = None
|
|
404
|
+
) -> PaginatedResponse[Session]:
|
|
405
|
+
"""
|
|
406
|
+
Search sessions by name/title only.
|
|
407
|
+
|
|
408
|
+
Args:
|
|
409
|
+
db: Database session
|
|
410
|
+
user_id: User ID to filter sessions by
|
|
411
|
+
query: Search query string
|
|
412
|
+
pagination: Pagination parameters
|
|
413
|
+
project_id: Optional project ID to filter sessions by
|
|
414
|
+
|
|
415
|
+
Returns:
|
|
416
|
+
PaginatedResponse[Session]: Paginated search results
|
|
417
|
+
"""
|
|
418
|
+
if not user_id or user_id.strip() == "":
|
|
419
|
+
raise ValueError("User ID cannot be empty")
|
|
420
|
+
|
|
421
|
+
if not query or query.strip() == "":
|
|
422
|
+
raise ValueError("Search query cannot be empty")
|
|
423
|
+
|
|
424
|
+
pagination = get_pagination_or_default(pagination)
|
|
425
|
+
session_repository = self._get_repositories(db)
|
|
426
|
+
|
|
427
|
+
# Search sessions
|
|
428
|
+
sessions = session_repository.search(db, user_id, query.strip(), pagination, project_id)
|
|
429
|
+
total_count = session_repository.count_search_results(db, user_id, query.strip(), project_id)
|
|
430
|
+
|
|
431
|
+
# Enrich sessions with project names
|
|
432
|
+
project_ids = [s.project_id for s in sessions if s.project_id]
|
|
433
|
+
|
|
434
|
+
if project_ids:
|
|
435
|
+
from ..repository.models import ProjectModel
|
|
436
|
+
projects = db.query(ProjectModel).filter(ProjectModel.id.in_(project_ids)).all()
|
|
437
|
+
project_map = {p.id: p.name for p in projects}
|
|
438
|
+
|
|
439
|
+
for session in sessions:
|
|
440
|
+
if session.project_id:
|
|
441
|
+
session.project_name = project_map.get(session.project_id)
|
|
442
|
+
|
|
443
|
+
# Check for running background tasks in these sessions
|
|
444
|
+
task_repo = TaskRepository()
|
|
445
|
+
session_ids = [s.id for s in sessions]
|
|
446
|
+
|
|
447
|
+
# Get all running background tasks for this user
|
|
448
|
+
running_bg_tasks = task_repo.find_background_tasks_by_status(db, status=None)
|
|
449
|
+
running_bg_tasks = [
|
|
450
|
+
task for task in running_bg_tasks
|
|
451
|
+
if task.status in [None, "running", "pending"] and task.end_time is None and task.user_id == user_id
|
|
452
|
+
]
|
|
453
|
+
|
|
454
|
+
log.info(f"[search_sessions] Found {len(running_bg_tasks)} running background tasks for user {user_id}")
|
|
455
|
+
|
|
456
|
+
# Create a map of session_id -> has_running_background_task
|
|
457
|
+
# Query ChatTaskModel to find which sessions these tasks belong to
|
|
458
|
+
# Also filter out tasks that have been marked as completed in their metadata
|
|
459
|
+
from ..repository.models import ChatTaskModel
|
|
460
|
+
import json
|
|
461
|
+
session_task_map = {}
|
|
462
|
+
if running_bg_tasks:
|
|
463
|
+
task_ids = [task.id for task in running_bg_tasks]
|
|
464
|
+
log.info(f"[search_sessions] Looking up chat tasks for task IDs: {task_ids}")
|
|
465
|
+
|
|
466
|
+
# Query chat tasks for these task IDs
|
|
467
|
+
chat_tasks = db.query(ChatTaskModel).filter(
|
|
468
|
+
ChatTaskModel.id.in_(task_ids),
|
|
469
|
+
ChatTaskModel.user_id == user_id
|
|
470
|
+
).all()
|
|
471
|
+
|
|
472
|
+
log.info(f"[search_sessions] Found {len(chat_tasks)} chat tasks")
|
|
473
|
+
|
|
474
|
+
for chat_task in chat_tasks:
|
|
475
|
+
if chat_task.session_id:
|
|
476
|
+
# Check if task metadata indicates completion
|
|
477
|
+
is_completed = False
|
|
478
|
+
if chat_task.task_metadata:
|
|
479
|
+
try:
|
|
480
|
+
metadata = json.loads(chat_task.task_metadata) if isinstance(chat_task.task_metadata, str) else chat_task.task_metadata
|
|
481
|
+
task_status = metadata.get("status")
|
|
482
|
+
is_completed = task_status in ["completed", "error", "failed"]
|
|
483
|
+
log.info(f"[search_sessions] Task {chat_task.id} metadata status: {task_status}, is_completed: {is_completed}")
|
|
484
|
+
except Exception as e:
|
|
485
|
+
log.warning(f"[search_sessions] Failed to parse task metadata for {chat_task.id}: {e}")
|
|
486
|
+
|
|
487
|
+
# Only mark session as having running task if task is not completed
|
|
488
|
+
if not is_completed:
|
|
489
|
+
session_task_map[chat_task.session_id] = True
|
|
490
|
+
log.info(f"[search_sessions] Session {chat_task.session_id} has running background task {chat_task.id}")
|
|
491
|
+
else:
|
|
492
|
+
log.info(f"[search_sessions] Task {chat_task.id} is completed, not marking session as having running task")
|
|
493
|
+
|
|
494
|
+
# Add background task status to sessions
|
|
495
|
+
for session in sessions:
|
|
496
|
+
session.has_running_background_task = session_task_map.get(session.id, False)
|
|
497
|
+
if session.has_running_background_task:
|
|
498
|
+
log.info(f"[search_sessions] Marking session {session.id} as having running background task")
|
|
499
|
+
|
|
500
|
+
log.info(
|
|
501
|
+
"Search for '%s' by user %s returned %d results (total: %d)",
|
|
502
|
+
query,
|
|
503
|
+
user_id,
|
|
504
|
+
len(sessions),
|
|
505
|
+
total_count,
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
return PaginatedResponse.create(sessions, total_count, pagination)
|
|
509
|
+
|
|
169
510
|
def save_task(
|
|
170
511
|
self,
|
|
171
512
|
db: DbSession,
|
|
@@ -251,7 +592,15 @@ class SessionService:
|
|
|
251
592
|
|
|
252
593
|
# Load tasks
|
|
253
594
|
task_repo = ChatTaskRepository()
|
|
254
|
-
|
|
595
|
+
tasks = task_repo.find_by_session(db, session_id, user_id)
|
|
596
|
+
|
|
597
|
+
# Note: Deduplication logic was removed because the root cause of duplicate
|
|
598
|
+
# artifact markers has been fixed in task_logger_service.py. The fix ensures
|
|
599
|
+
# that when reconstructing chat messages for background tasks, existing
|
|
600
|
+
# versioned markers (e.g., «artifact_return:report.md:0») are properly
|
|
601
|
+
# detected and prevent adding duplicate non-versioned markers.
|
|
602
|
+
|
|
603
|
+
return tasks
|
|
255
604
|
|
|
256
605
|
def get_session_messages_from_tasks(
|
|
257
606
|
self,
|