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,23 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines types used within the embed processing system, like DataFormat.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from enum import Enum, auto
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ResolutionMode(Enum):
|
|
9
|
+
"""Defines the context in which embed resolution is occurring."""
|
|
10
|
+
|
|
11
|
+
A2A_MESSAGE_TO_USER = auto()
|
|
12
|
+
TOOL_PARAMETER = auto()
|
|
13
|
+
RECURSIVE_ARTIFACT_CONTENT = auto()
|
|
14
|
+
ARTIFACT_STREAMING = auto() # For streaming artifact chunks to browser
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class DataFormat(Enum):
|
|
18
|
+
"""Represents internal data formats during modifier chain execution."""
|
|
19
|
+
|
|
20
|
+
BYTES = auto()
|
|
21
|
+
STRING = auto()
|
|
22
|
+
JSON_OBJECT = auto()
|
|
23
|
+
LIST_OF_DICTS = auto()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""In Memory Cache utility."""
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class InMemoryCache:
|
|
9
|
+
"""A thread-safe Singleton class to manage cache data.
|
|
10
|
+
|
|
11
|
+
Ensures only one instance of the cache exists across the application.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
_instance: Optional["InMemoryCache"] = None
|
|
15
|
+
_lock: threading.Lock = threading.Lock()
|
|
16
|
+
_initialized: bool = False
|
|
17
|
+
|
|
18
|
+
def __new__(cls):
|
|
19
|
+
"""Override __new__ to control instance creation (Singleton pattern).
|
|
20
|
+
|
|
21
|
+
Uses a lock to ensure thread safety during the first instantiation.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
The singleton instance of InMemoryCache.
|
|
25
|
+
"""
|
|
26
|
+
if cls._instance is None:
|
|
27
|
+
with cls._lock:
|
|
28
|
+
if cls._instance is None:
|
|
29
|
+
cls._instance = super().__new__(cls)
|
|
30
|
+
return cls._instance
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
"""Initialize the cache storage.
|
|
34
|
+
|
|
35
|
+
Uses a flag (_initialized) to ensure this logic runs only on the very first
|
|
36
|
+
creation of the singleton instance.
|
|
37
|
+
"""
|
|
38
|
+
if not self._initialized:
|
|
39
|
+
with self._lock:
|
|
40
|
+
if not self._initialized:
|
|
41
|
+
self._cache_data: Dict[str, Dict[str, Any]] = {}
|
|
42
|
+
self._ttl: Dict[str, float] = {}
|
|
43
|
+
self._data_lock: threading.Lock = threading.Lock()
|
|
44
|
+
self._initialized = True
|
|
45
|
+
|
|
46
|
+
def set(self, key: str, value: Any, ttl: Optional[int] = None) -> None:
|
|
47
|
+
"""Set a key-value pair.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
key: The key for the data.
|
|
51
|
+
value: The data to store.
|
|
52
|
+
ttl: Time to live in seconds. If None, data will not expire.
|
|
53
|
+
"""
|
|
54
|
+
with self._data_lock:
|
|
55
|
+
self._cache_data[key] = value
|
|
56
|
+
|
|
57
|
+
if ttl is not None:
|
|
58
|
+
self._ttl[key] = time.time() + ttl
|
|
59
|
+
else:
|
|
60
|
+
if key in self._ttl:
|
|
61
|
+
del self._ttl[key]
|
|
62
|
+
|
|
63
|
+
def get(self, key: str, default: Any = None) -> Any:
|
|
64
|
+
"""Get the value associated with a key.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
key: The key for the data within the session.
|
|
68
|
+
default: The value to return if the session or key is not found.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The cached value, or the default value if not found.
|
|
72
|
+
"""
|
|
73
|
+
with self._data_lock:
|
|
74
|
+
if key in self._ttl and time.time() > self._ttl[key]:
|
|
75
|
+
del self._cache_data[key]
|
|
76
|
+
del self._ttl[key]
|
|
77
|
+
return default
|
|
78
|
+
return self._cache_data.get(key, default)
|
|
79
|
+
|
|
80
|
+
def delete(self, key: str) -> None:
|
|
81
|
+
"""Delete a specific key-value pair from a cache.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
key: The key to delete.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
True if the key was found and deleted, False otherwise.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
with self._data_lock:
|
|
91
|
+
if key in self._cache_data:
|
|
92
|
+
del self._cache_data[key]
|
|
93
|
+
if key in self._ttl:
|
|
94
|
+
del self._ttl[key]
|
|
95
|
+
return True
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
def clear(self) -> bool:
|
|
99
|
+
"""Remove all data.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
True if the data was cleared, False otherwise.
|
|
103
|
+
"""
|
|
104
|
+
with self._data_lock:
|
|
105
|
+
self._cache_data.clear()
|
|
106
|
+
self._ttl.clear()
|
|
107
|
+
return True
|
|
108
|
+
return False
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
from solace_ai_connector.main import load_config
|
|
5
|
+
|
|
6
|
+
log = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
_has_initialized_system = False
|
|
9
|
+
|
|
10
|
+
def initialize():
|
|
11
|
+
global _has_initialized_system
|
|
12
|
+
if not _has_initialized_system:
|
|
13
|
+
_has_initialized_system = True
|
|
14
|
+
else:
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from solace_agent_mesh_enterprise.init_enterprise import initialize_enterprise_features
|
|
19
|
+
except ImportError:
|
|
20
|
+
# Community edition
|
|
21
|
+
# Contact Solace support for enterprise features
|
|
22
|
+
return
|
|
23
|
+
|
|
24
|
+
enterprise_config = os.getenv("SAM_AUTHORIZATION_CONFIG")
|
|
25
|
+
if enterprise_config and isinstance(enterprise_config, str):
|
|
26
|
+
if enterprise_config.endswith('.yaml') or enterprise_config.endswith('.yml'):
|
|
27
|
+
try:
|
|
28
|
+
enterprise_config = load_config(enterprise_config)
|
|
29
|
+
except Exception as e:
|
|
30
|
+
log.error("Failed to load YAML config from SAM_AUTHORIZATION_CONFIG: %s", e, exc_info=True)
|
|
31
|
+
raise
|
|
32
|
+
elif enterprise_config.endswith('.json'):
|
|
33
|
+
try:
|
|
34
|
+
with open(enterprise_config, 'r', encoding='utf-8') as file:
|
|
35
|
+
enterprise_config = json.load(file)
|
|
36
|
+
except Exception as e:
|
|
37
|
+
log.error("Failed to load JSON config from SAM_AUTHORIZATION_CONFIG: %s", e, exc_info=True)
|
|
38
|
+
raise
|
|
39
|
+
else:
|
|
40
|
+
try:
|
|
41
|
+
enterprise_config = json.loads(enterprise_config)
|
|
42
|
+
except json.JSONDecodeError as e:
|
|
43
|
+
log.error("Invalid JSON in SAM_AUTHORIZATION_CONFIG: %s", e, exc_info=True)
|
|
44
|
+
raise
|
|
45
|
+
else:
|
|
46
|
+
enterprise_config = {}
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
initialize_enterprise_features(enterprise_config)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
log.error("Failed to initialize enterprise features: %s", e, exc_info=True)
|
|
52
|
+
raise
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import warnings
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
import traceback
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DatadogJsonFormatter(logging.Formatter):
|
|
10
|
+
"""
|
|
11
|
+
Custom formatter to output logs in Datadog-compatible JSON format.
|
|
12
|
+
|
|
13
|
+
. deprecated::
|
|
14
|
+
This formatter is deprecated. Please use pythonjsonlogger.json.JsonFormatter instead.
|
|
15
|
+
For details, consult https://solacelabs.github.io/solace-agent-mesh/docs/documentation/deploying/logging#structured-logging
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
formatters:
|
|
19
|
+
jsonFormatter:
|
|
20
|
+
"()": pythonjsonlogger.json.JsonFormatter
|
|
21
|
+
format: "%(timestamp)s %(levelname)s %(threadName)s %(name)s %(message)s"
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def format(self, record):
|
|
25
|
+
# Emit deprecation warning once
|
|
26
|
+
if not hasattr(self.__class__, '_deprecation_warned'):
|
|
27
|
+
warnings.warn(
|
|
28
|
+
"DatadogJsonFormatter is deprecated and will be removed in a future version. "
|
|
29
|
+
"Please use pythonjsonlogger.json.JsonFormatter instead. For details, consult https://solacelabs.github.io/solace-agent-mesh/docs/documentation/deploying/logging#structured-logging",
|
|
30
|
+
DeprecationWarning,
|
|
31
|
+
stacklevel=2
|
|
32
|
+
)
|
|
33
|
+
self.__class__._deprecation_warned = True
|
|
34
|
+
log_entry = {
|
|
35
|
+
"timestamp": datetime.fromtimestamp(
|
|
36
|
+
record.created, tz=timezone.utc
|
|
37
|
+
).isoformat(),
|
|
38
|
+
"level": record.levelname,
|
|
39
|
+
"message": record.getMessage(),
|
|
40
|
+
"logger.name": record.name,
|
|
41
|
+
"logger.thread_name": record.threadName,
|
|
42
|
+
"service": os.getenv("SERVICE_NAME", "solace_agent_mesh"),
|
|
43
|
+
"code.filepath": record.pathname,
|
|
44
|
+
"code.lineno": record.lineno,
|
|
45
|
+
"code.module": record.module,
|
|
46
|
+
"code.funcName": record.funcName,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
dd_trace_id = getattr(record, "dd.trace_id", None)
|
|
50
|
+
if dd_trace_id:
|
|
51
|
+
log_entry["dd.trace_id"] = dd_trace_id
|
|
52
|
+
|
|
53
|
+
dd_span_id = getattr(record, "dd.span_id", None)
|
|
54
|
+
if dd_span_id:
|
|
55
|
+
log_entry["dd.span_id"] = dd_span_id
|
|
56
|
+
|
|
57
|
+
if record.exc_info:
|
|
58
|
+
log_entry["exception.type"] = record.exc_info[0].__name__
|
|
59
|
+
log_entry["exception.message"] = str(record.exc_info[1])
|
|
60
|
+
log_entry["exception.stacktrace"] = "".join(
|
|
61
|
+
traceback.format_exception(*record.exc_info)
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return json.dumps(log_entry)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Message utility functions for size calculation and validation.
|
|
2
|
+
|
|
3
|
+
This module provides utilities for calculating and validating message sizes
|
|
4
|
+
to ensure they don't exceed configured limits. The size calculation matches
|
|
5
|
+
the exact serialization format used by the Solace AI Connector (JSON + UTF-8).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import json
|
|
10
|
+
from typing import Any, Dict, Tuple
|
|
11
|
+
|
|
12
|
+
log = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
# Maximum bytes per character in UTF-8 encoding (4 bytes for full Unicode range)
|
|
15
|
+
MAX_UTF8_BYTES_PER_CHARACTER = 4
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def calculate_message_size(payload: Dict[str, Any]) -> int:
|
|
19
|
+
"""Calculate the exact size of a message payload in bytes.
|
|
20
|
+
|
|
21
|
+
Uses JSON serialization followed by UTF-8 encoding to match the exact
|
|
22
|
+
format used by the Solace AI Connector.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
payload: The message payload dictionary to calculate size for.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
The size of the payload in bytes.
|
|
29
|
+
|
|
30
|
+
Note:
|
|
31
|
+
If JSON serialization fails, falls back to string representation
|
|
32
|
+
for size estimation.
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
# Use JSON serialization + UTF-8 encoding to match Solace AI Connector
|
|
36
|
+
json_str = json.dumps(payload, separators=(",", ":"), ensure_ascii=False)
|
|
37
|
+
return len(json_str.encode("utf-8"))
|
|
38
|
+
except (TypeError, ValueError) as e:
|
|
39
|
+
# Graceful fallback if JSON serialization fails
|
|
40
|
+
log.warning(
|
|
41
|
+
f"Failed to serialize payload to JSON for size calculation: {e}. "
|
|
42
|
+
f"Using string representation fallback."
|
|
43
|
+
)
|
|
44
|
+
try:
|
|
45
|
+
return len(str(payload).encode("utf-8"))
|
|
46
|
+
except Exception as fallback_error:
|
|
47
|
+
log.error(
|
|
48
|
+
f"Fallback size calculation also failed: {fallback_error}. "
|
|
49
|
+
f"Returning conservative estimate."
|
|
50
|
+
)
|
|
51
|
+
# Conservative estimate using maximum UTF-8 bytes per character
|
|
52
|
+
return len(str(payload)) * MAX_UTF8_BYTES_PER_CHARACTER
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def validate_message_size(
|
|
56
|
+
payload: Dict[str, Any], max_size_bytes: int, component_identifier: str = "Unknown"
|
|
57
|
+
) -> Tuple[bool, int]:
|
|
58
|
+
"""Validate that a message payload doesn't exceed the maximum size limit.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
payload: The message payload dictionary to validate.
|
|
62
|
+
max_size_bytes: The maximum allowed size in bytes.
|
|
63
|
+
component_identifier: Identifier for the component performing validation
|
|
64
|
+
(used in log messages).
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
A tuple containing:
|
|
68
|
+
- bool: True if the payload is within size limits, False otherwise
|
|
69
|
+
- int: The actual size of the payload in bytes
|
|
70
|
+
|
|
71
|
+
Note:
|
|
72
|
+
Logs an error if size exceeds the limit.
|
|
73
|
+
"""
|
|
74
|
+
actual_size = calculate_message_size(payload)
|
|
75
|
+
|
|
76
|
+
# Check if size exceeds the limit
|
|
77
|
+
if actual_size > max_size_bytes:
|
|
78
|
+
return False, actual_size
|
|
79
|
+
|
|
80
|
+
return True, actual_size
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Utility functions for handling MIME types.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional, Set
|
|
6
|
+
|
|
7
|
+
TEXT_CONTAINER_MIME_TYPES: Set[str] = {
|
|
8
|
+
"text/plain",
|
|
9
|
+
"text/markdown",
|
|
10
|
+
"text/html",
|
|
11
|
+
"application/json",
|
|
12
|
+
"application/yaml",
|
|
13
|
+
"text/yaml",
|
|
14
|
+
"application/x-yaml",
|
|
15
|
+
"text/x-yaml",
|
|
16
|
+
"application/xml",
|
|
17
|
+
"text/xml",
|
|
18
|
+
"text/csv",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
_TEXT_BASED_PRIMARY_TYPES = {"text"}
|
|
22
|
+
_TEXT_BASED_SUBTYPE_WHOLE = {
|
|
23
|
+
"json",
|
|
24
|
+
"xml",
|
|
25
|
+
"yaml",
|
|
26
|
+
"x-yaml",
|
|
27
|
+
"yml",
|
|
28
|
+
"csv",
|
|
29
|
+
"javascript",
|
|
30
|
+
"ecmascript",
|
|
31
|
+
"xhtml+xml",
|
|
32
|
+
"svg+xml",
|
|
33
|
+
"atom+xml",
|
|
34
|
+
"rss+xml",
|
|
35
|
+
"sparql-query",
|
|
36
|
+
"sparql-update",
|
|
37
|
+
"sql",
|
|
38
|
+
"graphql",
|
|
39
|
+
"markdown",
|
|
40
|
+
"html",
|
|
41
|
+
"rtf",
|
|
42
|
+
"sgml",
|
|
43
|
+
}
|
|
44
|
+
_TEXT_BASED_SUBTYPE_SUFFIXES_AFTER_PLUS = {
|
|
45
|
+
"json",
|
|
46
|
+
"xml",
|
|
47
|
+
"yaml",
|
|
48
|
+
"csv",
|
|
49
|
+
"svg",
|
|
50
|
+
"xhtml",
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_text_based_mime_type(mime_type: Optional[str]) -> bool:
|
|
55
|
+
"""
|
|
56
|
+
Checks if a given MIME type is considered text-based.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
mime_type: The MIME type string (e.g., "text/plain", "application/json").
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
True if the MIME type is text-based, False otherwise.
|
|
63
|
+
"""
|
|
64
|
+
if not mime_type:
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
normalized_mime_type = mime_type.lower().strip()
|
|
68
|
+
|
|
69
|
+
if normalized_mime_type.startswith("text/"):
|
|
70
|
+
return True
|
|
71
|
+
|
|
72
|
+
if normalized_mime_type in TEXT_CONTAINER_MIME_TYPES:
|
|
73
|
+
return True
|
|
74
|
+
|
|
75
|
+
return False
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def is_text_based_file(
|
|
79
|
+
mime_type: Optional[str], content_bytes: Optional[bytes] = None
|
|
80
|
+
) -> bool:
|
|
81
|
+
"""
|
|
82
|
+
Determines if a file is text-based based on its MIME type and content.
|
|
83
|
+
Args:
|
|
84
|
+
mime_type: The MIME type of the file.
|
|
85
|
+
content_bytes: The content of the file as bytes.
|
|
86
|
+
Returns:
|
|
87
|
+
True if the file is text-based, False otherwise.
|
|
88
|
+
"""
|
|
89
|
+
if not mime_type:
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
normalized_mime_type = mime_type.lower().strip()
|
|
93
|
+
primary_type, _, subtype = normalized_mime_type.partition("/")
|
|
94
|
+
|
|
95
|
+
if primary_type in _TEXT_BASED_PRIMARY_TYPES:
|
|
96
|
+
return True
|
|
97
|
+
elif subtype in _TEXT_BASED_SUBTYPE_WHOLE:
|
|
98
|
+
return True
|
|
99
|
+
elif "+" in subtype:
|
|
100
|
+
specific_format = subtype.split("+")[-1]
|
|
101
|
+
if specific_format in _TEXT_BASED_SUBTYPE_SUFFIXES_AFTER_PLUS:
|
|
102
|
+
return True
|
|
103
|
+
elif (
|
|
104
|
+
normalized_mime_type == "application/octet-stream" and content_bytes is not None
|
|
105
|
+
):
|
|
106
|
+
try:
|
|
107
|
+
sample_size = min(1024, len(content_bytes))
|
|
108
|
+
content_bytes[:sample_size].decode("utf-8")
|
|
109
|
+
return True
|
|
110
|
+
except UnicodeDecodeError:
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def get_extension_for_mime_type(
|
|
117
|
+
mime_type: Optional[str], default_extension: str = ".dat"
|
|
118
|
+
) -> str:
|
|
119
|
+
"""
|
|
120
|
+
Returns a file extension for a given MIME type.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
mime_type: The MIME type string (e.g., 'image/png', 'application/json').
|
|
124
|
+
default_extension: The extension to return if the MIME type is not found.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
The corresponding file extension (e.g., '.png', '.json').
|
|
128
|
+
"""
|
|
129
|
+
if not mime_type:
|
|
130
|
+
return default_extension
|
|
131
|
+
|
|
132
|
+
# Comprehensive mapping of common MIME types to file extensions
|
|
133
|
+
extension_mapping = {
|
|
134
|
+
# Text formats
|
|
135
|
+
"text/plain": ".txt",
|
|
136
|
+
"text/html": ".html",
|
|
137
|
+
"text/css": ".css",
|
|
138
|
+
"text/javascript": ".js",
|
|
139
|
+
"text/csv": ".csv",
|
|
140
|
+
"text/markdown": ".md",
|
|
141
|
+
"text/xml": ".xml",
|
|
142
|
+
# Application formats
|
|
143
|
+
"application/json": ".json",
|
|
144
|
+
"application/x-yaml": ".yaml",
|
|
145
|
+
"application/yaml": ".yaml",
|
|
146
|
+
"application/pdf": ".pdf",
|
|
147
|
+
"application/zip": ".zip",
|
|
148
|
+
"application/octet-stream": ".bin",
|
|
149
|
+
# Image formats
|
|
150
|
+
"image/png": ".png",
|
|
151
|
+
"image/jpeg": ".jpg",
|
|
152
|
+
"image/jpg": ".jpg",
|
|
153
|
+
"image/gif": ".gif",
|
|
154
|
+
"image/bmp": ".bmp",
|
|
155
|
+
"image/webp": ".webp",
|
|
156
|
+
"image/svg+xml": ".svg",
|
|
157
|
+
# Audio formats
|
|
158
|
+
"audio/wav": ".wav",
|
|
159
|
+
"audio/mp3": ".mp3",
|
|
160
|
+
"audio/mpeg": ".mp3",
|
|
161
|
+
"audio/ogg": ".ogg",
|
|
162
|
+
"audio/flac": ".flac",
|
|
163
|
+
"audio/aac": ".aac",
|
|
164
|
+
"audio/m4a": ".m4a",
|
|
165
|
+
# Video formats
|
|
166
|
+
"video/mp4": ".mp4",
|
|
167
|
+
"video/webm": ".webm",
|
|
168
|
+
"video/x-msvideo": ".avi",
|
|
169
|
+
"video/quicktime": ".mov",
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return extension_mapping.get(mime_type.lower(), default_extension)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from jwcrypto import jwk
|
|
3
|
+
import uuid
|
|
4
|
+
from starlette.responses import JSONResponse
|
|
5
|
+
from starlette.requests import Request
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
import jwt
|
|
9
|
+
import time
|
|
10
|
+
import json
|
|
11
|
+
import hashlib
|
|
12
|
+
import httpx
|
|
13
|
+
|
|
14
|
+
from jwt import PyJWK, PyJWKClient
|
|
15
|
+
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
AUTH_HEADER_PREFIX = "Bearer "
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PushNotificationAuth:
|
|
22
|
+
def _calculate_request_body_sha256(self, data: dict[str, Any]):
|
|
23
|
+
"""Calculates the SHA256 hash of a request body.
|
|
24
|
+
|
|
25
|
+
This logic needs to be same for both the agent who signs the payload and the client verifier.
|
|
26
|
+
"""
|
|
27
|
+
body_str = json.dumps(
|
|
28
|
+
data,
|
|
29
|
+
ensure_ascii=False,
|
|
30
|
+
allow_nan=False,
|
|
31
|
+
indent=None,
|
|
32
|
+
separators=(",", ":"),
|
|
33
|
+
)
|
|
34
|
+
return hashlib.sha256(body_str.encode()).hexdigest()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class PushNotificationSenderAuth(PushNotificationAuth):
|
|
38
|
+
def __init__(self):
|
|
39
|
+
self.public_keys = []
|
|
40
|
+
self.private_key_jwk: PyJWK = None
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
async def verify_push_notification_url(url: str) -> bool:
|
|
44
|
+
async with httpx.AsyncClient(timeout=10) as client:
|
|
45
|
+
try:
|
|
46
|
+
validation_token = str(uuid.uuid4())
|
|
47
|
+
response = await client.get(
|
|
48
|
+
url, params={"validationToken": validation_token}
|
|
49
|
+
)
|
|
50
|
+
response.raise_for_status()
|
|
51
|
+
is_verified = response.text == validation_token
|
|
52
|
+
|
|
53
|
+
log.info("Verified push-notification URL: %s => %s", url, is_verified)
|
|
54
|
+
return is_verified
|
|
55
|
+
except Exception as e:
|
|
56
|
+
log.warning(
|
|
57
|
+
"Error during sending push-notification for URL %s: %s", url, e
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
def generate_jwk(self):
|
|
63
|
+
key = jwk.JWK.generate(kty="RSA", size=2048, kid=str(uuid.uuid4()), use="sig")
|
|
64
|
+
self.public_keys.append(key.export_public(as_dict=True))
|
|
65
|
+
self.private_key_jwk = PyJWK.from_json(key.export_private())
|
|
66
|
+
|
|
67
|
+
def handle_jwks_endpoint(self, _request: Request):
|
|
68
|
+
"""Allow clients to fetch public keys."""
|
|
69
|
+
return JSONResponse({"keys": self.public_keys})
|
|
70
|
+
|
|
71
|
+
def _generate_jwt(self, data: dict[str, Any]):
|
|
72
|
+
"""JWT is generated by signing both the request payload SHA digest and time of token generation.
|
|
73
|
+
|
|
74
|
+
Payload is signed with private key and it ensures the integrity of payload for client.
|
|
75
|
+
Including iat prevents from replay attack.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
iat = int(time.time())
|
|
79
|
+
|
|
80
|
+
return jwt.encode(
|
|
81
|
+
{
|
|
82
|
+
"iat": iat,
|
|
83
|
+
"request_body_sha256": self._calculate_request_body_sha256(data),
|
|
84
|
+
},
|
|
85
|
+
key=self.private_key_jwk,
|
|
86
|
+
headers={"kid": self.private_key_jwk.key_id},
|
|
87
|
+
algorithm="RS256",
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
async def send_push_notification(self, url: str, data: dict[str, Any]):
|
|
91
|
+
jwt_token = self._generate_jwt(data)
|
|
92
|
+
headers = {"Authorization": f"Bearer {jwt_token}"}
|
|
93
|
+
async with httpx.AsyncClient(timeout=10) as client:
|
|
94
|
+
try:
|
|
95
|
+
response = await client.post(url, json=data, headers=headers)
|
|
96
|
+
response.raise_for_status()
|
|
97
|
+
log.info("Push-notification sent for URL: %s", url)
|
|
98
|
+
except Exception as e:
|
|
99
|
+
log.warning(
|
|
100
|
+
"Error during sending push-notification for URL %s: %s", url, e
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class PushNotificationReceiverAuth(PushNotificationAuth):
|
|
105
|
+
def __init__(self):
|
|
106
|
+
self.public_keys_jwks = []
|
|
107
|
+
self.jwks_client = None
|
|
108
|
+
|
|
109
|
+
async def load_jwks(self, jwks_url: str):
|
|
110
|
+
self.jwks_client = PyJWKClient(jwks_url)
|
|
111
|
+
|
|
112
|
+
async def verify_push_notification(self, request: Request) -> bool:
|
|
113
|
+
auth_header = request.headers.get("Authorization")
|
|
114
|
+
if not auth_header or not auth_header.startswith(AUTH_HEADER_PREFIX):
|
|
115
|
+
log.warning("Invalid authorization header")
|
|
116
|
+
return False
|
|
117
|
+
|
|
118
|
+
token = auth_header[len(AUTH_HEADER_PREFIX) :]
|
|
119
|
+
signing_key = self.jwks_client.get_signing_key_from_jwt(token)
|
|
120
|
+
|
|
121
|
+
decode_token = jwt.decode(
|
|
122
|
+
token,
|
|
123
|
+
signing_key,
|
|
124
|
+
options={"require": ["iat", "request_body_sha256"]},
|
|
125
|
+
algorithms=["RS256"],
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
actual_body_sha256 = self._calculate_request_body_sha256(await request.json())
|
|
129
|
+
if actual_body_sha256 != decode_token["request_body_sha256"]:
|
|
130
|
+
raise ValueError("Invalid request body")
|
|
131
|
+
|
|
132
|
+
if time.time() - decode_token["iat"] > 60 * 5:
|
|
133
|
+
raise ValueError("Token is expired")
|
|
134
|
+
|
|
135
|
+
return True
|