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,107 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Standardized error response DTOs for HTTP APIs.
|
|
3
|
+
|
|
4
|
+
This module provides consistent error response formats that can be used
|
|
5
|
+
across any web application for uniform error handling.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Dict, List, Optional
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class EventErrorDTO(BaseModel):
|
|
13
|
+
"""
|
|
14
|
+
Simplified and standardized error response format.
|
|
15
|
+
|
|
16
|
+
This provides consistent error responses across all endpoints with:
|
|
17
|
+
- message: Human-readable error description
|
|
18
|
+
- validationDetails: Field-level validation errors (optional)
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
404 Not Found:
|
|
22
|
+
{
|
|
23
|
+
"message": "Could not find User with id: 123",
|
|
24
|
+
"validationDetails": null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
422 Validation Error:
|
|
28
|
+
{
|
|
29
|
+
"message": "Invalid input data",
|
|
30
|
+
"validationDetails": {
|
|
31
|
+
"email": ["Invalid email format"],
|
|
32
|
+
"name": ["Name is required"]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
"""
|
|
36
|
+
message: str = Field(..., description="Human-readable error message")
|
|
37
|
+
validationDetails: Optional[Dict[str, List[str]]] = Field(
|
|
38
|
+
default=None,
|
|
39
|
+
description="Field-level validation errors"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def create(
|
|
44
|
+
cls,
|
|
45
|
+
message: str,
|
|
46
|
+
validation_details: Optional[Dict[str, List[str]]] = None
|
|
47
|
+
) -> "EventErrorDTO":
|
|
48
|
+
"""
|
|
49
|
+
Create a new EventErrorDTO.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
message: Human-readable error message
|
|
53
|
+
validation_details: Optional field-level validation errors
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
EventErrorDTO instance
|
|
57
|
+
"""
|
|
58
|
+
return cls(
|
|
59
|
+
message=message,
|
|
60
|
+
validationDetails=validation_details
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def not_found(cls, entity_type: str, entity_id: str) -> "EventErrorDTO":
|
|
65
|
+
"""
|
|
66
|
+
Create a 404 Not Found error with standardized message format.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
entity_type: The type of entity (e.g., "User", "Product", "Order")
|
|
70
|
+
entity_id: The ID that was not found
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
EventErrorDTO with 404 message format
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
EventErrorDTO.not_found("User", "123")
|
|
77
|
+
# Returns: {"message": "Could not find User with id: 123", "validationDetails": null}
|
|
78
|
+
"""
|
|
79
|
+
message = f"Could not find {entity_type} with id: {entity_id}"
|
|
80
|
+
return cls.create(message=message)
|
|
81
|
+
|
|
82
|
+
@classmethod
|
|
83
|
+
def validation_error(
|
|
84
|
+
cls,
|
|
85
|
+
message: str,
|
|
86
|
+
validation_details: Dict[str, List[str]]
|
|
87
|
+
) -> "EventErrorDTO":
|
|
88
|
+
"""
|
|
89
|
+
Create a validation error with field-level details.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
message: Main validation error message
|
|
93
|
+
validation_details: Dict mapping field names to error lists
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
EventErrorDTO with validation details
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
EventErrorDTO.validation_error(
|
|
100
|
+
"Invalid user data",
|
|
101
|
+
{"email": ["Invalid format"], "age": ["Must be positive"]}
|
|
102
|
+
)
|
|
103
|
+
"""
|
|
104
|
+
return cls.create(
|
|
105
|
+
message=message,
|
|
106
|
+
validation_details=validation_details
|
|
107
|
+
)
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Generic FastAPI exception handlers for consistent HTTP error responses.
|
|
3
|
+
|
|
4
|
+
This module provides FastAPI exception handlers that convert domain exceptions
|
|
5
|
+
into appropriate HTTP responses with consistent formatting. These handlers
|
|
6
|
+
can be used by any FastAPI application for uniform error handling.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
from fastapi import HTTPException, Request, status
|
|
12
|
+
from fastapi.responses import JSONResponse
|
|
13
|
+
from fastapi.exceptions import RequestValidationError
|
|
14
|
+
from pydantic import ValidationError as PydanticValidationError
|
|
15
|
+
from starlette.exceptions import HTTPException as StarletteHTTPException
|
|
16
|
+
|
|
17
|
+
from .exceptions import (
|
|
18
|
+
WebUIBackendException,
|
|
19
|
+
ValidationError,
|
|
20
|
+
EntityNotFoundError,
|
|
21
|
+
EntityAlreadyExistsError,
|
|
22
|
+
BusinessRuleViolationError,
|
|
23
|
+
ConfigurationError,
|
|
24
|
+
DataIntegrityError,
|
|
25
|
+
ExternalServiceError,
|
|
26
|
+
)
|
|
27
|
+
from .error_dto import EventErrorDTO
|
|
28
|
+
|
|
29
|
+
log = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def create_error_response(
|
|
33
|
+
status_code: int, message: str, validation_details: dict = None
|
|
34
|
+
) -> JSONResponse:
|
|
35
|
+
"""Create standardized error response using EventErrorDTO format."""
|
|
36
|
+
if validation_details:
|
|
37
|
+
error_dto = EventErrorDTO.validation_error(message, validation_details)
|
|
38
|
+
else:
|
|
39
|
+
error_dto = EventErrorDTO.create(message)
|
|
40
|
+
|
|
41
|
+
return JSONResponse(status_code=status_code, content=error_dto.model_dump())
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def validation_error_handler(
|
|
45
|
+
request: Request, exc: ValidationError
|
|
46
|
+
) -> JSONResponse:
|
|
47
|
+
"""Handle domain validation errors - 422 Unprocessable Entity."""
|
|
48
|
+
if exc.validation_details:
|
|
49
|
+
error_dto = EventErrorDTO.validation_error(exc.message, exc.validation_details)
|
|
50
|
+
else:
|
|
51
|
+
error_dto = EventErrorDTO.create("bad request" if not exc.message else exc.message)
|
|
52
|
+
|
|
53
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=error_dto.model_dump())
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
async def entity_not_found_handler(
|
|
57
|
+
request: Request, exc: EntityNotFoundError
|
|
58
|
+
) -> JSONResponse:
|
|
59
|
+
"""Handle entity not found errors - 404 Not Found."""
|
|
60
|
+
# Format: "Could not find applicationDomain with id: some-invalid-id"
|
|
61
|
+
message = f"Could not find {exc.entity_type} with id: {exc.entity_id}"
|
|
62
|
+
error_dto = EventErrorDTO.create(message)
|
|
63
|
+
return JSONResponse(status_code=status.HTTP_404_NOT_FOUND, content=error_dto.model_dump())
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
async def entity_already_exists_handler(
|
|
67
|
+
request: Request, exc: EntityAlreadyExistsError
|
|
68
|
+
) -> JSONResponse:
|
|
69
|
+
"""Handle entity already exists errors - 409 Conflict."""
|
|
70
|
+
error_dto = EventErrorDTO.create(exc.message)
|
|
71
|
+
return JSONResponse(status_code=status.HTTP_409_CONFLICT, content=error_dto.model_dump())
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
async def business_rule_violation_handler(
|
|
75
|
+
request: Request, exc: BusinessRuleViolationError
|
|
76
|
+
) -> JSONResponse:
|
|
77
|
+
"""Handle business rule violations - 422 Unprocessable Entity."""
|
|
78
|
+
error_dto = EventErrorDTO.create(exc.message)
|
|
79
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=error_dto.model_dump())
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
async def configuration_error_handler(
|
|
83
|
+
request: Request, exc: ConfigurationError
|
|
84
|
+
) -> JSONResponse:
|
|
85
|
+
"""Handle configuration errors - 500 Internal Server Error."""
|
|
86
|
+
error_dto = EventErrorDTO.create("An unexpected server error occurred.")
|
|
87
|
+
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=error_dto.model_dump())
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
async def data_integrity_error_handler(
|
|
91
|
+
request: Request, exc: DataIntegrityError
|
|
92
|
+
) -> JSONResponse:
|
|
93
|
+
"""Handle data integrity errors - 422 Unprocessable Entity."""
|
|
94
|
+
# Format: "An entity of type applicationDomain was passed in an invalid format"
|
|
95
|
+
message = f"An entity of type {exc.entity_type} was passed in an invalid format" if hasattr(exc, 'entity_type') else "bad request"
|
|
96
|
+
error_dto = EventErrorDTO.create(message)
|
|
97
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=error_dto.model_dump())
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
async def external_service_error_handler(
|
|
101
|
+
request: Request, exc: ExternalServiceError
|
|
102
|
+
) -> JSONResponse:
|
|
103
|
+
"""Handle external service errors - 503 Service Unavailable."""
|
|
104
|
+
error_dto = EventErrorDTO.create("Service is unavailable.")
|
|
105
|
+
return JSONResponse(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, content=error_dto.model_dump())
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
async def webui_backend_exception_handler(
|
|
109
|
+
request: Request, exc: WebUIBackendException
|
|
110
|
+
) -> JSONResponse:
|
|
111
|
+
"""Handle generic WebUI backend exceptions - 500 Internal Server Error."""
|
|
112
|
+
log.error(
|
|
113
|
+
f"WebUIBackendException: {exc.message}",
|
|
114
|
+
extra={
|
|
115
|
+
"path": request.url.path,
|
|
116
|
+
"method": request.method,
|
|
117
|
+
"details": exc.details if hasattr(exc, 'details') else None
|
|
118
|
+
},
|
|
119
|
+
exc_info=True
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
message = exc.message if exc.message else "An unexpected server error occurred."
|
|
123
|
+
error_dto = EventErrorDTO.create(message)
|
|
124
|
+
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=error_dto.model_dump())
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
async def http_exception_handler(
|
|
128
|
+
request: Request, exc: HTTPException
|
|
129
|
+
) -> JSONResponse:
|
|
130
|
+
"""Handle FastAPI HTTPExceptions with standardized format."""
|
|
131
|
+
# Map common HTTP status codes to standard messages (only used as fallback)
|
|
132
|
+
message_map = {
|
|
133
|
+
401: "An authentication error occurred. Try logging out and in again.",
|
|
134
|
+
403: "You do not have permissions to perform this operation",
|
|
135
|
+
404: f"Resource not found with path {request.url.path}",
|
|
136
|
+
405: f"Request method '{request.method}' is not supported",
|
|
137
|
+
406: "Unacceptable Content-type.",
|
|
138
|
+
429: "Rate limit exceeded message here",
|
|
139
|
+
500: "An unexpected server error occurred.",
|
|
140
|
+
501: "Not Implemented",
|
|
141
|
+
503: "Service is unavailable.",
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
message = exc.detail if exc.detail else message_map.get(exc.status_code, "bad request")
|
|
145
|
+
error_dto = EventErrorDTO.create(message)
|
|
146
|
+
return JSONResponse(status_code=exc.status_code, content=error_dto.model_dump())
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
async def request_validation_exception_handler(
|
|
150
|
+
request: Request, exc: RequestValidationError
|
|
151
|
+
) -> JSONResponse:
|
|
152
|
+
"""Handle FastAPI request validation errors - 422 Unprocessable Entity."""
|
|
153
|
+
validation_details = {}
|
|
154
|
+
for error in exc.errors():
|
|
155
|
+
field_path = ".".join(str(x) for x in error["loc"] if x != "body")
|
|
156
|
+
if field_path not in validation_details:
|
|
157
|
+
validation_details[field_path] = []
|
|
158
|
+
validation_details[field_path].append(error["msg"])
|
|
159
|
+
|
|
160
|
+
if validation_details:
|
|
161
|
+
message = "body must not be empty" if not validation_details else "Validation error"
|
|
162
|
+
error_dto = EventErrorDTO.validation_error(message, validation_details)
|
|
163
|
+
else:
|
|
164
|
+
error_dto = EventErrorDTO.create("bad request")
|
|
165
|
+
|
|
166
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=error_dto.model_dump())
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
async def pydantic_validation_exception_handler(
|
|
170
|
+
request: Request, exc: PydanticValidationError
|
|
171
|
+
) -> JSONResponse:
|
|
172
|
+
"""Handle Pydantic validation errors raised in service layer - 422 Unprocessable Entity."""
|
|
173
|
+
validation_details = {}
|
|
174
|
+
for error in exc.errors():
|
|
175
|
+
field_path = ".".join(str(loc) for loc in error["loc"])
|
|
176
|
+
if field_path not in validation_details:
|
|
177
|
+
validation_details[field_path] = []
|
|
178
|
+
validation_details[field_path].append(error["msg"])
|
|
179
|
+
|
|
180
|
+
error_dto = EventErrorDTO.validation_error("Validation failed", validation_details)
|
|
181
|
+
return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, content=error_dto.model_dump())
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def register_exception_handlers(app):
|
|
185
|
+
"""
|
|
186
|
+
Register all exception handlers with a FastAPI app.
|
|
187
|
+
|
|
188
|
+
This function registers all the generic exception handlers, providing
|
|
189
|
+
consistent error responses across the entire application.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
app: FastAPI application instance
|
|
193
|
+
|
|
194
|
+
Example:
|
|
195
|
+
from fastapi import FastAPI
|
|
196
|
+
from solace_agent_mesh.gateway.http_sse.shared.exception_handlers import register_exception_handlers
|
|
197
|
+
|
|
198
|
+
app = FastAPI()
|
|
199
|
+
register_exception_handlers(app)
|
|
200
|
+
"""
|
|
201
|
+
# Domain exception handlers
|
|
202
|
+
app.add_exception_handler(ValidationError, validation_error_handler)
|
|
203
|
+
app.add_exception_handler(EntityNotFoundError, entity_not_found_handler)
|
|
204
|
+
app.add_exception_handler(EntityAlreadyExistsError, entity_already_exists_handler)
|
|
205
|
+
app.add_exception_handler(
|
|
206
|
+
BusinessRuleViolationError, business_rule_violation_handler
|
|
207
|
+
)
|
|
208
|
+
app.add_exception_handler(ConfigurationError, configuration_error_handler)
|
|
209
|
+
app.add_exception_handler(DataIntegrityError, data_integrity_error_handler)
|
|
210
|
+
app.add_exception_handler(ExternalServiceError, external_service_error_handler)
|
|
211
|
+
app.add_exception_handler(WebUIBackendException, webui_backend_exception_handler)
|
|
212
|
+
|
|
213
|
+
# FastAPI built-in exception handlers
|
|
214
|
+
app.add_exception_handler(HTTPException, http_exception_handler)
|
|
215
|
+
app.add_exception_handler(StarletteHTTPException, http_exception_handler)
|
|
216
|
+
app.add_exception_handler(RequestValidationError, request_validation_exception_handler)
|
|
217
|
+
app.add_exception_handler(PydanticValidationError, pydantic_validation_exception_handler)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Generic web exceptions for HTTP/REST APIs.
|
|
3
|
+
|
|
4
|
+
This module provides a comprehensive set of generic exception classes
|
|
5
|
+
that can be used by any web application for consistent error handling.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, Dict, List, Optional
|
|
9
|
+
from enum import Enum
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class EntityOperation(Enum):
|
|
13
|
+
"""Operations that can be performed on entities."""
|
|
14
|
+
CREATE = "create"
|
|
15
|
+
UPDATE = "update"
|
|
16
|
+
DELETE = "delete"
|
|
17
|
+
READ = "read"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class WebUIBackendException(Exception):
|
|
21
|
+
"""Base exception for all web UI backend errors."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
|
|
24
|
+
self.message = message
|
|
25
|
+
self.details = details or {}
|
|
26
|
+
super().__init__(self.message)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ValidationError(WebUIBackendException):
|
|
30
|
+
"""
|
|
31
|
+
Exception for validation errors with field-level details.
|
|
32
|
+
|
|
33
|
+
This exception supports both simple validation messages and detailed
|
|
34
|
+
field-level validation errors with user-friendly message formatting.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
message: str,
|
|
40
|
+
validation_details: Optional[Dict[str, List[str]]] = None,
|
|
41
|
+
entity_type: Optional[str] = None,
|
|
42
|
+
entity_identifier: Optional[str] = None
|
|
43
|
+
):
|
|
44
|
+
self.validation_details = validation_details or {}
|
|
45
|
+
self.entity_type = entity_type
|
|
46
|
+
self.entity_identifier = entity_identifier
|
|
47
|
+
super().__init__(message)
|
|
48
|
+
|
|
49
|
+
def get_user_friendly_message(self, operation: EntityOperation) -> str:
|
|
50
|
+
"""Generate a user-friendly error message based on context."""
|
|
51
|
+
if not self.entity_identifier or not self.entity_type:
|
|
52
|
+
return self.message
|
|
53
|
+
|
|
54
|
+
if self.validation_details:
|
|
55
|
+
field = next(iter(self.validation_details.keys()))
|
|
56
|
+
error_msg = self.validation_details[field][0]
|
|
57
|
+
return f"Unable to {operation.value} {self.entity_type} {self.entity_identifier} because of a problem with the {field}: {error_msg.lower()}"
|
|
58
|
+
|
|
59
|
+
if self.message:
|
|
60
|
+
return f"Unable to {operation.value} {self.entity_type} {self.entity_identifier}: {self.message.lower()}"
|
|
61
|
+
|
|
62
|
+
return self.message
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def builder(cls):
|
|
66
|
+
"""Create a ValidationErrorBuilder for fluent error construction."""
|
|
67
|
+
return ValidationErrorBuilder()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ValidationErrorBuilder:
|
|
71
|
+
"""Builder for constructing ValidationError instances with fluent API."""
|
|
72
|
+
|
|
73
|
+
def __init__(self):
|
|
74
|
+
self._message = ""
|
|
75
|
+
self._validation_details = {}
|
|
76
|
+
self._entity_type = None
|
|
77
|
+
self._entity_identifier = None
|
|
78
|
+
|
|
79
|
+
def message(self, message: str):
|
|
80
|
+
"""Set the main error message."""
|
|
81
|
+
self._message = message
|
|
82
|
+
return self
|
|
83
|
+
|
|
84
|
+
def formatted_message(self, pattern: str, *args):
|
|
85
|
+
"""Set a formatted error message."""
|
|
86
|
+
self._message = pattern.format(*args)
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def validation_detail(self, field: str, errors: List[str]):
|
|
90
|
+
"""Add validation details for a specific field."""
|
|
91
|
+
self._validation_details[field] = errors
|
|
92
|
+
return self
|
|
93
|
+
|
|
94
|
+
def formatted_validation_detail(self, field: str, pattern: str, *args):
|
|
95
|
+
"""Add a formatted validation detail for a field."""
|
|
96
|
+
error_msg = pattern.format(*args)
|
|
97
|
+
self._validation_details[field] = [error_msg]
|
|
98
|
+
return self
|
|
99
|
+
|
|
100
|
+
def entity_type(self, entity_type: str):
|
|
101
|
+
"""Set the entity type for context."""
|
|
102
|
+
self._entity_type = entity_type
|
|
103
|
+
return self
|
|
104
|
+
|
|
105
|
+
def entity_identifier(self, identifier: str):
|
|
106
|
+
"""Set the entity identifier for context."""
|
|
107
|
+
self._entity_identifier = identifier
|
|
108
|
+
return self
|
|
109
|
+
|
|
110
|
+
def build(self) -> ValidationError:
|
|
111
|
+
"""Build the ValidationError instance."""
|
|
112
|
+
return ValidationError(
|
|
113
|
+
self._message,
|
|
114
|
+
self._validation_details,
|
|
115
|
+
self._entity_type,
|
|
116
|
+
self._entity_identifier
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class EntityNotFoundError(WebUIBackendException):
|
|
121
|
+
"""
|
|
122
|
+
Generic exception for when an entity is not found.
|
|
123
|
+
|
|
124
|
+
This replaces all specific "NotFound" exceptions with a single generic one.
|
|
125
|
+
Format: "Could not find {entity_type} with id: {entity_id}"
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
def __init__(self, entity_type: str, entity_id: str):
|
|
129
|
+
self.entity_type = entity_type
|
|
130
|
+
self.entity_id = str(entity_id)
|
|
131
|
+
message = f"Could not find {entity_type} with id: {self.entity_id}"
|
|
132
|
+
details = {"entity_type": entity_type, "entity_id": self.entity_id}
|
|
133
|
+
super().__init__(message, details)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class EntityAlreadyExistsError(WebUIBackendException):
|
|
137
|
+
"""Exception for when an entity already exists."""
|
|
138
|
+
|
|
139
|
+
def __init__(self, entity_type: str, identifier: str, value: Any = None):
|
|
140
|
+
self.entity_type = entity_type
|
|
141
|
+
self.identifier = identifier
|
|
142
|
+
self.value = str(value) if value is not None else None
|
|
143
|
+
|
|
144
|
+
if value is not None:
|
|
145
|
+
message = f"{entity_type} with {identifier} '{self.value}' already exists"
|
|
146
|
+
else:
|
|
147
|
+
message = f"{entity_type} already exists"
|
|
148
|
+
|
|
149
|
+
details = {"entity_type": entity_type, "identifier": identifier}
|
|
150
|
+
if self.value:
|
|
151
|
+
details["value"] = self.value
|
|
152
|
+
|
|
153
|
+
super().__init__(message, details)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class BusinessRuleViolationError(WebUIBackendException):
|
|
157
|
+
"""Exception for business rule violations."""
|
|
158
|
+
|
|
159
|
+
def __init__(self, rule: str, message: str):
|
|
160
|
+
self.rule = rule
|
|
161
|
+
details = {"rule": rule}
|
|
162
|
+
super().__init__(message, details)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class ConfigurationError(WebUIBackendException):
|
|
166
|
+
"""Exception for configuration-related errors."""
|
|
167
|
+
|
|
168
|
+
def __init__(self, component: str, message: str):
|
|
169
|
+
self.component = component
|
|
170
|
+
details = {"component": component}
|
|
171
|
+
super().__init__(message, details)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class DataIntegrityError(WebUIBackendException):
|
|
175
|
+
"""Exception for data integrity violations."""
|
|
176
|
+
|
|
177
|
+
def __init__(self, constraint: str, message: str):
|
|
178
|
+
self.constraint = constraint
|
|
179
|
+
details = {"constraint": constraint}
|
|
180
|
+
super().__init__(message, details)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class ExternalServiceError(WebUIBackendException):
|
|
184
|
+
"""Exception for external service communication errors."""
|
|
185
|
+
|
|
186
|
+
def __init__(self, service: str, message: str, status_code: Optional[int] = None):
|
|
187
|
+
self.service = service
|
|
188
|
+
self.status_code = status_code
|
|
189
|
+
details = {"service": service}
|
|
190
|
+
if status_code:
|
|
191
|
+
details["status_code"] = status_code
|
|
192
|
+
super().__init__(message, details)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pagination utilities for API responses.
|
|
3
|
+
|
|
4
|
+
Provides standard pagination patterns for consistent API responses across the application.
|
|
5
|
+
|
|
6
|
+
Default pagination settings:
|
|
7
|
+
- Page number: 1
|
|
8
|
+
- Page size: 20
|
|
9
|
+
- Max page size: 100
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, Field
|
|
13
|
+
from typing import TypeVar, Generic
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T")
|
|
16
|
+
|
|
17
|
+
DEFAULT_PAGE_NUMBER = 1
|
|
18
|
+
DEFAULT_PAGE_SIZE = 20
|
|
19
|
+
MAX_PAGE_SIZE = 100
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PaginationParams(BaseModel):
|
|
23
|
+
"""
|
|
24
|
+
Request parameters for pagination with sensible defaults.
|
|
25
|
+
|
|
26
|
+
Defaults:
|
|
27
|
+
- page_number: 1
|
|
28
|
+
- page_size: 20
|
|
29
|
+
"""
|
|
30
|
+
page_number: int = Field(default=DEFAULT_PAGE_NUMBER, ge=1, alias="pageNumber")
|
|
31
|
+
page_size: int = Field(default=DEFAULT_PAGE_SIZE, ge=1, le=MAX_PAGE_SIZE, alias="pageSize")
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def offset(self) -> int:
|
|
35
|
+
"""Calculate the offset for database queries."""
|
|
36
|
+
return (self.page_number - 1) * self.page_size
|
|
37
|
+
|
|
38
|
+
model_config = {"populate_by_name": True}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_pagination_or_default(pagination: PaginationParams | None = None) -> PaginationParams:
|
|
42
|
+
"""
|
|
43
|
+
Get pagination parameters or return defaults if None.
|
|
44
|
+
|
|
45
|
+
This helper ensures all paginated endpoints use the same defaults:
|
|
46
|
+
- page_number: 1
|
|
47
|
+
- page_size: 20
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
pagination: Optional pagination parameters
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
PaginationParams with defaults if None provided
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
pagination = get_pagination_or_default(request_pagination)
|
|
57
|
+
# Always returns valid PaginationParams with defaults if None
|
|
58
|
+
"""
|
|
59
|
+
if pagination is None:
|
|
60
|
+
return PaginationParams()
|
|
61
|
+
return pagination
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class PaginationMeta(BaseModel):
|
|
65
|
+
"""Pagination metadata for API responses."""
|
|
66
|
+
page_number: int = Field(..., alias="pageNumber")
|
|
67
|
+
count: int
|
|
68
|
+
page_size: int = Field(..., alias="pageSize")
|
|
69
|
+
next_page: int | None = Field(..., alias="nextPage")
|
|
70
|
+
total_pages: int = Field(..., alias="totalPages")
|
|
71
|
+
|
|
72
|
+
model_config = {"populate_by_name": True}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class Meta(BaseModel):
|
|
76
|
+
"""Metadata container for API responses."""
|
|
77
|
+
pagination: PaginationMeta
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class PaginatedResponse(BaseModel, Generic[T]):
|
|
81
|
+
"""Generic paginated response with data and metadata."""
|
|
82
|
+
data: list[T]
|
|
83
|
+
meta: Meta
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def create(
|
|
87
|
+
cls, data: list[T], total_count: int, pagination: PaginationParams
|
|
88
|
+
) -> "PaginatedResponse[T]":
|
|
89
|
+
"""
|
|
90
|
+
Create a paginated response from data and pagination parameters.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
data: List of items for current page
|
|
94
|
+
total_count: Total number of items across all pages
|
|
95
|
+
pagination: Pagination parameters used for the request
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
PaginatedResponse with data and calculated metadata
|
|
99
|
+
"""
|
|
100
|
+
total_pages = (total_count + pagination.page_size - 1) // pagination.page_size
|
|
101
|
+
next_page = pagination.page_number + 1 if pagination.page_number < total_pages else None
|
|
102
|
+
|
|
103
|
+
pagination_meta = PaginationMeta(
|
|
104
|
+
page_number=pagination.page_number,
|
|
105
|
+
count=total_count,
|
|
106
|
+
page_size=pagination.page_size,
|
|
107
|
+
next_page=next_page,
|
|
108
|
+
total_pages=total_pages,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return cls(
|
|
112
|
+
data=data,
|
|
113
|
+
meta=Meta(pagination=pagination_meta)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
model_config = {"populate_by_name": True}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class DataResponse(BaseModel, Generic[T]):
|
|
120
|
+
"""Simple data response wrapper."""
|
|
121
|
+
data: T
|
|
122
|
+
|
|
123
|
+
@classmethod
|
|
124
|
+
def create(cls, data: T) -> "DataResponse[T]":
|
|
125
|
+
"""Create a data response from data."""
|
|
126
|
+
return cls(data=data)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
__all__ = [
|
|
130
|
+
"PaginationParams",
|
|
131
|
+
"PaginationMeta",
|
|
132
|
+
"PaginatedResponse",
|
|
133
|
+
"DataResponse",
|
|
134
|
+
"get_pagination_or_default",
|
|
135
|
+
"DEFAULT_PAGE_NUMBER",
|
|
136
|
+
"DEFAULT_PAGE_SIZE",
|
|
137
|
+
"MAX_PAGE_SIZE",
|
|
138
|
+
]
|