solace-agent-mesh 1.11.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.
- solace_agent_mesh/__init__.py +0 -0
- solace_agent_mesh/agent/__init__.py +0 -0
- solace_agent_mesh/agent/adk/__init__.py +0 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- 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 +52 -0
- solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
- solace_agent_mesh/agent/adk/callbacks.py +2318 -0
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
- solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
- solace_agent_mesh/agent/adk/runner.py +390 -0
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +468 -0
- solace_agent_mesh/agent/adk/setup.py +1325 -0
- solace_agent_mesh/agent/adk/stream_parser.py +415 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
- solace_agent_mesh/agent/agent_llm.txt +369 -0
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/__init__.py +0 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +100 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/base/component.py +816 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/__init__.py +0 -0
- solace_agent_mesh/agent/sac/app.py +595 -0
- solace_agent_mesh/agent/sac/component.py +3668 -0
- solace_agent_mesh/agent/sac/patch_adk.py +103 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +415 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +58 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/__init__.py +16 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
- solace_agent_mesh/agent/tools/image_tools.py +1185 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
- solace_agent_mesh/agent/tools/registry.py +38 -0
- solace_agent_mesh/agent/tools/test_tools.py +136 -0
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
- solace_agent_mesh/agent/tools/tool_definition.py +53 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
- solace_agent_mesh/agent/tools/web_tools.py +392 -0
- solace_agent_mesh/agent/utils/__init__.py +0 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
- solace_agent_mesh/agent/utils/config_parser.py +49 -0
- solace_agent_mesh/agent/utils/context_helpers.py +77 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
- solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/509e993c.a1fbf45a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.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/6fdfefc7.99de744e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.6c1dbf0c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.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/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.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/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
- 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 +345 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
- 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 +144 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
- 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 +37 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
- 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 +247 -0
- 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 +184 -0
- 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 +75 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- 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 +100 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/sam-enterprise-credentials.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -0
- solace_agent_mesh/cli/commands/__init__.py +0 -0
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +729 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +102 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +119 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
- solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +215 -0
- solace_agent_mesh/cli/main.py +52 -0
- solace_agent_mesh/cli/utils.py +262 -0
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
- 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/__init__.py +1 -0
- solace_agent_mesh/common/a2a/__init__.py +241 -0
- solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +368 -0
- solace_agent_mesh/common/a2a/events.py +213 -0
- solace_agent_mesh/common/a2a/message.py +375 -0
- solace_agent_mesh/common/a2a/protocol.py +689 -0
- solace_agent_mesh/common/a2a/task.py +127 -0
- solace_agent_mesh/common/a2a/translation.py +655 -0
- solace_agent_mesh/common/a2a/types.py +55 -0
- solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
- solace_agent_mesh/common/agent_registry.py +122 -0
- solace_agent_mesh/common/common_llm.txt +230 -0
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/constants.py +6 -0
- solace_agent_mesh/common/data_parts.py +150 -0
- solace_agent_mesh/common/exceptions.py +49 -0
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +132 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +127 -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/sac/__init__.py +0 -0
- solace_agent_mesh/common/sac/sac_llm.txt +71 -0
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +730 -0
- solace_agent_mesh/common/sam_events/__init__.py +9 -0
- solace_agent_mesh/common/sam_events/event_service.py +208 -0
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +164 -0
- solace_agent_mesh/common/services/identity_service.py +134 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
- solace_agent_mesh/common/services/services_llm.txt +368 -0
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/artifact_utils.py +31 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +56 -0
- solace_agent_mesh/common/utils/embeds/converter.py +447 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
- solace_agent_mesh/common/utils/embeds/types.py +23 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +52 -0
- solace_agent_mesh/common/utils/log_formatters.py +64 -0
- solace_agent_mesh/common/utils/message_utils.py +80 -0
- solace_agent_mesh/common/utils/mime_helpers.py +172 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
- solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
- 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/common/utils/type_utils.py +28 -0
- solace_agent_mesh/common/utils/utils_llm.txt +335 -0
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +77 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
- solace_agent_mesh/config_portal/backend/server.py +644 -0
- solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +307 -0
- solace_agent_mesh/evaluation/__init__.py +0 -0
- solace_agent_mesh/evaluation/evaluator.py +691 -0
- solace_agent_mesh/evaluation/message_organizer.py +553 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +970 -0
- solace_agent_mesh/evaluation/report_generator.py +607 -0
- solace_agent_mesh/evaluation/run.py +954 -0
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +776 -0
- solace_agent_mesh/evaluation/summary_builder.py +880 -0
- solace_agent_mesh/gateway/__init__.py +0 -0
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +143 -0
- solace_agent_mesh/gateway/adapter/types.py +221 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +345 -0
- solace_agent_mesh/gateway/base/base_llm.txt +226 -0
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +2030 -0
- solace_agent_mesh/gateway/base/task_context.py +75 -0
- solace_agent_mesh/gateway/gateway_llm.txt +369 -0
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- 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 +727 -0
- solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
- solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- 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/versions/versions_llm.txt +161 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
- solace_agent_mesh/gateway/http_sse/app.py +351 -0
- solace_agent_mesh/gateway/http_sse/component.py +2360 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +789 -0
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- 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 +66 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
- solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
- solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -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 +53 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
- 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/repository_llm.txt +308 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
- 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/__init__.py +15 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
- solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
- 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 +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
- 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/services_llm.txt +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
- solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
- solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
- solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
- solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
- solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
- solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
- solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
- solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
- solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
- solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +18 -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 +147 -0
- solace_agent_mesh/services/platform/api/main.py +280 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
- solace_agent_mesh/services/platform/app.py +114 -0
- solace_agent_mesh/services/platform/component.py +235 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +75 -0
- solace_agent_mesh/templates/gateway_component_template.py +484 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +66 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +60 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
- solace_agent_mesh/templates/plugin_readme_template.md +12 -0
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +112 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +177 -0
- solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
- solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
- solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
- solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
- solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,702 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import uuid
|
|
3
|
+
from typing import TYPE_CHECKING, Optional, List, Dict, Any
|
|
4
|
+
|
|
5
|
+
from sqlalchemy.orm import Session as DbSession
|
|
6
|
+
|
|
7
|
+
from ..repository import (
|
|
8
|
+
ISessionRepository,
|
|
9
|
+
Session,
|
|
10
|
+
)
|
|
11
|
+
from ..repository.chat_task_repository import ChatTaskRepository
|
|
12
|
+
from ..repository.task_repository import TaskRepository
|
|
13
|
+
from ..repository.entities import ChatTask
|
|
14
|
+
from ..shared.enums import SenderType
|
|
15
|
+
from ..shared.types import SessionId, UserId
|
|
16
|
+
from ..shared import now_epoch_ms
|
|
17
|
+
from ..shared.pagination import PaginationParams, PaginatedResponse, get_pagination_or_default
|
|
18
|
+
|
|
19
|
+
log = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from ..component import WebUIBackendComponent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SessionService:
|
|
26
|
+
def __init__(
|
|
27
|
+
self,
|
|
28
|
+
component: "WebUIBackendComponent" = None,
|
|
29
|
+
):
|
|
30
|
+
self.component = component
|
|
31
|
+
|
|
32
|
+
def _get_repositories(self, db: DbSession):
|
|
33
|
+
"""Create session repository for the given database session."""
|
|
34
|
+
from ..repository import SessionRepository
|
|
35
|
+
session_repository = SessionRepository()
|
|
36
|
+
return session_repository
|
|
37
|
+
|
|
38
|
+
def is_persistence_enabled(self) -> bool:
|
|
39
|
+
"""Checks if the service is configured with a persistent backend."""
|
|
40
|
+
return self.component and self.component.database_url is not None
|
|
41
|
+
|
|
42
|
+
def get_user_sessions(
|
|
43
|
+
self,
|
|
44
|
+
db: DbSession,
|
|
45
|
+
user_id: UserId,
|
|
46
|
+
pagination: PaginationParams | None = None,
|
|
47
|
+
project_id: str | None = None
|
|
48
|
+
) -> PaginatedResponse[Session]:
|
|
49
|
+
"""
|
|
50
|
+
Get paginated sessions for a user with full metadata including project names and background task status.
|
|
51
|
+
Uses default pagination if none provided (page 1, size 20).
|
|
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)
|
|
59
|
+
"""
|
|
60
|
+
if not user_id or user_id.strip() == "":
|
|
61
|
+
raise ValueError("User ID cannot be empty")
|
|
62
|
+
|
|
63
|
+
pagination = get_pagination_or_default(pagination)
|
|
64
|
+
session_repository = self._get_repositories(db)
|
|
65
|
+
|
|
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")
|
|
141
|
+
|
|
142
|
+
return PaginatedResponse.create(sessions, total_count, pagination)
|
|
143
|
+
|
|
144
|
+
def get_session_details(
|
|
145
|
+
self, db: DbSession, session_id: SessionId, user_id: UserId
|
|
146
|
+
) -> Session | None:
|
|
147
|
+
if not self._is_valid_session_id(session_id):
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
session_repository = self._get_repositories(db)
|
|
151
|
+
return session_repository.find_user_session(db, session_id, user_id)
|
|
152
|
+
|
|
153
|
+
def create_session(
|
|
154
|
+
self,
|
|
155
|
+
db: DbSession,
|
|
156
|
+
user_id: UserId,
|
|
157
|
+
name: str | None = None,
|
|
158
|
+
agent_id: str | None = None,
|
|
159
|
+
session_id: str | None = None,
|
|
160
|
+
project_id: str | None = None,
|
|
161
|
+
) -> Optional[Session]:
|
|
162
|
+
if not self.is_persistence_enabled():
|
|
163
|
+
log.debug("Persistence is not enabled. Skipping session creation in DB.")
|
|
164
|
+
return None
|
|
165
|
+
|
|
166
|
+
if not user_id or user_id.strip() == "":
|
|
167
|
+
raise ValueError("User ID cannot be empty")
|
|
168
|
+
|
|
169
|
+
if not session_id:
|
|
170
|
+
session_id = str(uuid.uuid4())
|
|
171
|
+
|
|
172
|
+
now_ms = now_epoch_ms()
|
|
173
|
+
session = Session(
|
|
174
|
+
id=session_id,
|
|
175
|
+
user_id=user_id,
|
|
176
|
+
name=name,
|
|
177
|
+
agent_id=agent_id,
|
|
178
|
+
project_id=project_id,
|
|
179
|
+
created_time=now_ms,
|
|
180
|
+
updated_time=now_ms,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
session_repository = self._get_repositories(db)
|
|
184
|
+
created_session = session_repository.save(db, session)
|
|
185
|
+
log.debug("Created new session %s for user %s", created_session.id, user_id)
|
|
186
|
+
|
|
187
|
+
if not created_session:
|
|
188
|
+
raise ValueError(f"Failed to save session for {session_id}")
|
|
189
|
+
|
|
190
|
+
return created_session
|
|
191
|
+
|
|
192
|
+
def update_session_name(
|
|
193
|
+
self, db: DbSession, session_id: SessionId, user_id: UserId, name: str
|
|
194
|
+
) -> Session | None:
|
|
195
|
+
if not self._is_valid_session_id(session_id):
|
|
196
|
+
raise ValueError("Invalid session ID")
|
|
197
|
+
|
|
198
|
+
if not name or len(name.strip()) == 0:
|
|
199
|
+
raise ValueError("Session name cannot be empty")
|
|
200
|
+
|
|
201
|
+
if len(name.strip()) > 255:
|
|
202
|
+
raise ValueError("Session name cannot exceed 255 characters")
|
|
203
|
+
|
|
204
|
+
session_repository = self._get_repositories(db)
|
|
205
|
+
session = session_repository.find_user_session(db, session_id, user_id)
|
|
206
|
+
if not session:
|
|
207
|
+
return None
|
|
208
|
+
|
|
209
|
+
session.update_name(name)
|
|
210
|
+
updated_session = session_repository.save(db, session)
|
|
211
|
+
|
|
212
|
+
log.info("Updated session %s name to '%s'", session_id, name)
|
|
213
|
+
return updated_session
|
|
214
|
+
|
|
215
|
+
def delete_session_with_notifications(
|
|
216
|
+
self, db: DbSession, session_id: SessionId, user_id: UserId
|
|
217
|
+
) -> bool:
|
|
218
|
+
if not self._is_valid_session_id(session_id):
|
|
219
|
+
raise ValueError("Invalid session ID")
|
|
220
|
+
|
|
221
|
+
session_repository = self._get_repositories(db)
|
|
222
|
+
session = session_repository.find_user_session(db, session_id, user_id)
|
|
223
|
+
if not session:
|
|
224
|
+
log.warning(
|
|
225
|
+
"Attempted to delete non-existent session %s by user %s",
|
|
226
|
+
session_id,
|
|
227
|
+
user_id,
|
|
228
|
+
)
|
|
229
|
+
return False
|
|
230
|
+
|
|
231
|
+
agent_id = session.agent_id
|
|
232
|
+
|
|
233
|
+
if not session.can_be_deleted_by_user(user_id):
|
|
234
|
+
log.warning(
|
|
235
|
+
"User %s not authorized to delete session %s", user_id, session_id
|
|
236
|
+
)
|
|
237
|
+
return False
|
|
238
|
+
|
|
239
|
+
deleted = session_repository.delete(db, session_id, user_id)
|
|
240
|
+
if not deleted:
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
log.info("Session %s deleted successfully by user %s", session_id, user_id)
|
|
244
|
+
|
|
245
|
+
if agent_id and self.component:
|
|
246
|
+
self._notify_agent_of_session_deletion(session_id, user_id, agent_id)
|
|
247
|
+
|
|
248
|
+
return True
|
|
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
|
+
|
|
510
|
+
def save_task(
|
|
511
|
+
self,
|
|
512
|
+
db: DbSession,
|
|
513
|
+
task_id: str,
|
|
514
|
+
session_id: str,
|
|
515
|
+
user_id: str,
|
|
516
|
+
user_message: Optional[str],
|
|
517
|
+
message_bubbles: str, # JSON string (opaque)
|
|
518
|
+
task_metadata: Optional[str] = None # JSON string (opaque)
|
|
519
|
+
) -> ChatTask:
|
|
520
|
+
"""
|
|
521
|
+
Save a complete task interaction.
|
|
522
|
+
|
|
523
|
+
Args:
|
|
524
|
+
db: Database session
|
|
525
|
+
task_id: A2A task ID
|
|
526
|
+
session_id: Session ID
|
|
527
|
+
user_id: User ID
|
|
528
|
+
user_message: Original user input text
|
|
529
|
+
message_bubbles: Array of all message bubbles displayed during this task
|
|
530
|
+
task_metadata: Task-level metadata (status, feedback, agent name, etc.)
|
|
531
|
+
|
|
532
|
+
Returns:
|
|
533
|
+
Saved ChatTask entity
|
|
534
|
+
|
|
535
|
+
Raises:
|
|
536
|
+
ValueError: If session not found or validation fails
|
|
537
|
+
"""
|
|
538
|
+
# Validate session exists and belongs to user
|
|
539
|
+
session_repository = self._get_repositories(db)
|
|
540
|
+
session = session_repository.find_user_session(db, session_id, user_id)
|
|
541
|
+
if not session:
|
|
542
|
+
raise ValueError(f"Session {session_id} not found for user {user_id}")
|
|
543
|
+
|
|
544
|
+
# Create task entity - pass strings directly
|
|
545
|
+
task = ChatTask(
|
|
546
|
+
id=task_id,
|
|
547
|
+
session_id=session_id,
|
|
548
|
+
user_id=user_id,
|
|
549
|
+
user_message=user_message,
|
|
550
|
+
message_bubbles=message_bubbles, # Already a string
|
|
551
|
+
task_metadata=task_metadata, # Already a string
|
|
552
|
+
created_time=now_epoch_ms(),
|
|
553
|
+
updated_time=None
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
# Save via repository
|
|
557
|
+
task_repo = ChatTaskRepository()
|
|
558
|
+
saved_task = task_repo.save(db, task)
|
|
559
|
+
|
|
560
|
+
# Update session activity
|
|
561
|
+
session.mark_activity()
|
|
562
|
+
session_repository.save(db, session)
|
|
563
|
+
|
|
564
|
+
log.info(f"Saved task {task_id} for session {session_id}")
|
|
565
|
+
return saved_task
|
|
566
|
+
|
|
567
|
+
def get_session_tasks(
|
|
568
|
+
self,
|
|
569
|
+
db: DbSession,
|
|
570
|
+
session_id: str,
|
|
571
|
+
user_id: str
|
|
572
|
+
) -> List[ChatTask]:
|
|
573
|
+
"""
|
|
574
|
+
Get all tasks for a session.
|
|
575
|
+
|
|
576
|
+
Args:
|
|
577
|
+
db: Database session
|
|
578
|
+
session_id: Session ID
|
|
579
|
+
user_id: User ID
|
|
580
|
+
|
|
581
|
+
Returns:
|
|
582
|
+
List of ChatTask entities in chronological order
|
|
583
|
+
|
|
584
|
+
Raises:
|
|
585
|
+
ValueError: If session not found
|
|
586
|
+
"""
|
|
587
|
+
# Validate session exists and belongs to user
|
|
588
|
+
session_repository = self._get_repositories(db)
|
|
589
|
+
session = session_repository.find_user_session(db, session_id, user_id)
|
|
590
|
+
if not session:
|
|
591
|
+
raise ValueError(f"Session {session_id} not found for user {user_id}")
|
|
592
|
+
|
|
593
|
+
# Load tasks
|
|
594
|
+
task_repo = ChatTaskRepository()
|
|
595
|
+
return task_repo.find_by_session(db, session_id, user_id)
|
|
596
|
+
|
|
597
|
+
def get_session_messages_from_tasks(
|
|
598
|
+
self,
|
|
599
|
+
db: DbSession,
|
|
600
|
+
session_id: str,
|
|
601
|
+
user_id: str
|
|
602
|
+
) -> List[Dict[str, Any]]:
|
|
603
|
+
"""
|
|
604
|
+
Get session messages by flattening task message_bubbles.
|
|
605
|
+
This provides backward compatibility with the old message-based API.
|
|
606
|
+
|
|
607
|
+
Args:
|
|
608
|
+
db: Database session
|
|
609
|
+
session_id: Session ID
|
|
610
|
+
user_id: User ID
|
|
611
|
+
|
|
612
|
+
Returns:
|
|
613
|
+
List of message dictionaries flattened from tasks
|
|
614
|
+
|
|
615
|
+
Raises:
|
|
616
|
+
ValueError: If session not found
|
|
617
|
+
"""
|
|
618
|
+
# Load tasks
|
|
619
|
+
tasks = self.get_session_tasks(db, session_id, user_id)
|
|
620
|
+
|
|
621
|
+
# Flatten message_bubbles from all tasks
|
|
622
|
+
messages = []
|
|
623
|
+
for task in tasks:
|
|
624
|
+
import json
|
|
625
|
+
message_bubbles = json.loads(task.message_bubbles) if isinstance(task.message_bubbles, str) else task.message_bubbles
|
|
626
|
+
|
|
627
|
+
for bubble in message_bubbles:
|
|
628
|
+
# Determine sender type from bubble type
|
|
629
|
+
bubble_type = bubble.get("type", "agent")
|
|
630
|
+
sender_type = "user" if bubble_type == "user" else "agent"
|
|
631
|
+
|
|
632
|
+
# Get sender name
|
|
633
|
+
if bubble_type == "user":
|
|
634
|
+
sender_name = user_id
|
|
635
|
+
else:
|
|
636
|
+
# Try to get agent name from task metadata, fallback to "agent"
|
|
637
|
+
sender_name = "agent"
|
|
638
|
+
if task.task_metadata:
|
|
639
|
+
task_metadata = json.loads(task.task_metadata) if isinstance(task.task_metadata, str) else task.task_metadata
|
|
640
|
+
sender_name = task_metadata.get("agent_name", "agent")
|
|
641
|
+
|
|
642
|
+
# Create message dictionary
|
|
643
|
+
message = {
|
|
644
|
+
"id": bubble.get("id", str(uuid.uuid4())),
|
|
645
|
+
"session_id": session_id,
|
|
646
|
+
"message": bubble.get("text", ""),
|
|
647
|
+
"sender_type": sender_type,
|
|
648
|
+
"sender_name": sender_name,
|
|
649
|
+
"message_type": "text",
|
|
650
|
+
"created_time": task.created_time
|
|
651
|
+
}
|
|
652
|
+
messages.append(message)
|
|
653
|
+
|
|
654
|
+
return messages
|
|
655
|
+
|
|
656
|
+
def _is_valid_session_id(self, session_id: SessionId) -> bool:
|
|
657
|
+
return (
|
|
658
|
+
session_id is not None
|
|
659
|
+
and session_id.strip() != ""
|
|
660
|
+
and session_id not in ["null", "undefined"]
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
def _notify_agent_of_session_deletion(
|
|
664
|
+
self, session_id: SessionId, user_id: UserId, agent_id: str
|
|
665
|
+
) -> None:
|
|
666
|
+
try:
|
|
667
|
+
log.info(
|
|
668
|
+
"Publishing session deletion event for session %s (agent %s, user %s)",
|
|
669
|
+
session_id,
|
|
670
|
+
agent_id,
|
|
671
|
+
user_id,
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
if hasattr(self.component, "sam_events"):
|
|
675
|
+
success = self.component.sam_events.publish_session_deleted(
|
|
676
|
+
session_id=session_id,
|
|
677
|
+
user_id=user_id,
|
|
678
|
+
agent_id=agent_id,
|
|
679
|
+
gateway_id=self.component.gateway_id,
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
if success:
|
|
683
|
+
log.info(
|
|
684
|
+
"Successfully published session deletion event for session %s",
|
|
685
|
+
session_id,
|
|
686
|
+
)
|
|
687
|
+
else:
|
|
688
|
+
log.warning(
|
|
689
|
+
"Failed to publish session deletion event for session %s",
|
|
690
|
+
session_id,
|
|
691
|
+
)
|
|
692
|
+
else:
|
|
693
|
+
log.warning(
|
|
694
|
+
"SAM Events not available for session deletion notification"
|
|
695
|
+
)
|
|
696
|
+
|
|
697
|
+
except Exception as e:
|
|
698
|
+
log.warning(
|
|
699
|
+
"Failed to publish session deletion event to agent %s: %s",
|
|
700
|
+
agent_id,
|
|
701
|
+
e,
|
|
702
|
+
)
|