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,159 @@
|
|
|
1
|
+
"""Provides a Pydantic BaseModel for SAM configuration with dict-like access."""
|
|
2
|
+
from pydantic import BaseModel, ValidationError
|
|
3
|
+
from typing import Any, TypeVar, Union, get_args, get_origin
|
|
4
|
+
from types import UnionType
|
|
5
|
+
|
|
6
|
+
T = TypeVar("T", bound="SamConfigBase")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SamConfigBase(BaseModel):
|
|
10
|
+
"""
|
|
11
|
+
A Pydantic BaseModel for SAM configuration that allows dictionary-style access
|
|
12
|
+
for backward compatibility with components expecting dicts.
|
|
13
|
+
Supports .get(), ['key'], and 'in' operator.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def model_validate_and_clean(cls: type[T], obj: Any) -> T:
|
|
18
|
+
"""
|
|
19
|
+
Validates a dictionary, first removing any keys with None values.
|
|
20
|
+
This allows Pydantic's default values to be applied correctly when
|
|
21
|
+
a config key is present but has no value in YAML.
|
|
22
|
+
"""
|
|
23
|
+
if isinstance(obj, dict):
|
|
24
|
+
cleaned_obj = {k: v for k, v in obj.items() if v is not None}
|
|
25
|
+
return cls.model_validate(cleaned_obj)
|
|
26
|
+
return cls.model_validate(obj)
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def format_validation_error_message(cls: type[T], error: ValidationError, app_name: str | None, agent_name: str | None = None) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Formats Pydantic validation error messages into a clear, actionable format.
|
|
32
|
+
|
|
33
|
+
Example output:
|
|
34
|
+
---- Configuration validation failed for 'my-agent-app' ----
|
|
35
|
+
|
|
36
|
+
Agent Name: AgentConfig
|
|
37
|
+
|
|
38
|
+
ERROR 1:
|
|
39
|
+
Missing required field: 'namespace'
|
|
40
|
+
Location: app_config.namespace
|
|
41
|
+
Description: Absolute topic prefix for A2A communication (e.g., 'myorg/dev')
|
|
42
|
+
|
|
43
|
+
---- Please update your YAML configuration ----
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
error_lines = [
|
|
47
|
+
f"\n---- Configuration validation failed for {app_name or 'UNKNOWN'} ----",
|
|
48
|
+
""
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
if agent_name:
|
|
52
|
+
error_lines.append(f" Agent Name: {agent_name}\n")
|
|
53
|
+
|
|
54
|
+
def get_nested_field_description(model_class: type[BaseModel], path: list[str | int]) -> str | None:
|
|
55
|
+
"""Recursively get field description from nested models"""
|
|
56
|
+
if not path:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
current_field = path[0]
|
|
60
|
+
if str(current_field) not in model_class.model_fields:
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
field_info = model_class.model_fields[str(current_field)]
|
|
64
|
+
|
|
65
|
+
if len(path) == 1:
|
|
66
|
+
return field_info.description
|
|
67
|
+
|
|
68
|
+
annotation = field_info.annotation
|
|
69
|
+
|
|
70
|
+
# Handle Optional/Union types
|
|
71
|
+
if annotation is not None:
|
|
72
|
+
origin = get_origin(annotation)
|
|
73
|
+
if origin is Union or origin is UnionType:
|
|
74
|
+
types = get_args(annotation)
|
|
75
|
+
annotation = next((t for t in types if t is not type(None)), None)
|
|
76
|
+
elif origin is list:
|
|
77
|
+
inner_type = get_args(annotation)[0]
|
|
78
|
+
if len(path) > 1 and isinstance(path[1], int):
|
|
79
|
+
if isinstance(inner_type, type) and issubclass(inner_type, BaseModel):
|
|
80
|
+
return get_nested_field_description(inner_type, path[2:])
|
|
81
|
+
return None
|
|
82
|
+
annotation = inner_type
|
|
83
|
+
|
|
84
|
+
if annotation is not None and isinstance(annotation, type) and issubclass(annotation, BaseModel):
|
|
85
|
+
return get_nested_field_description(annotation, path[1:])
|
|
86
|
+
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
for index, err in enumerate(error.errors()):
|
|
91
|
+
error_type = err.get('type')
|
|
92
|
+
loc = err['loc']
|
|
93
|
+
msg = err['msg']
|
|
94
|
+
|
|
95
|
+
error_lines.append(f"ERROR {index + 1}:")
|
|
96
|
+
|
|
97
|
+
absolute_path = '.'.join(str(item) for item in loc)
|
|
98
|
+
description = get_nested_field_description(cls, list(loc))
|
|
99
|
+
if error_type == 'missing':
|
|
100
|
+
error_lines.extend([
|
|
101
|
+
f" Missing required field: '{loc[-1]}'",
|
|
102
|
+
])
|
|
103
|
+
else:
|
|
104
|
+
error_lines.extend([
|
|
105
|
+
f" Error: {msg}",
|
|
106
|
+
])
|
|
107
|
+
error_lines.append(f" Location: app_config.{absolute_path}")
|
|
108
|
+
error_lines.append(f" Description: {description or 'UNKNOWN'}")
|
|
109
|
+
error_lines.append("")
|
|
110
|
+
|
|
111
|
+
error_lines.append('---- Please update your YAML configuration ----')
|
|
112
|
+
return '\n'.join(error_lines) + "\n"
|
|
113
|
+
|
|
114
|
+
def get(self, key: str, default: Any = None) -> Any:
|
|
115
|
+
"""Provides dict-like .get() method."""
|
|
116
|
+
return getattr(self, key, default)
|
|
117
|
+
|
|
118
|
+
def __getitem__(self, key: str) -> Any:
|
|
119
|
+
"""Provides dict-like ['key'] access."""
|
|
120
|
+
return getattr(self, key)
|
|
121
|
+
|
|
122
|
+
def __setitem__(self, key: str, value: Any):
|
|
123
|
+
"""Provides dict-like ['key'] = value assignment."""
|
|
124
|
+
setattr(self, key, value)
|
|
125
|
+
|
|
126
|
+
def __contains__(self, key: str) -> bool:
|
|
127
|
+
"""
|
|
128
|
+
Provides dict-like 'in' support that mimics the old behavior.
|
|
129
|
+
Returns True only if the key was explicitly provided during model creation.
|
|
130
|
+
"""
|
|
131
|
+
return key in self.model_fields_set
|
|
132
|
+
|
|
133
|
+
def keys(self):
|
|
134
|
+
"""Provides dict-like .keys() method."""
|
|
135
|
+
return self.model_dump().keys()
|
|
136
|
+
|
|
137
|
+
def values(self):
|
|
138
|
+
"""Provides dict-like .values() method."""
|
|
139
|
+
return self.model_dump().values()
|
|
140
|
+
|
|
141
|
+
def items(self):
|
|
142
|
+
"""Provides dict-like .items() method."""
|
|
143
|
+
return self.model_dump().items()
|
|
144
|
+
|
|
145
|
+
def __iter__(self):
|
|
146
|
+
"""Provides dict-like iteration over keys."""
|
|
147
|
+
return iter(self.model_dump())
|
|
148
|
+
|
|
149
|
+
def pop(self, key: str, default: Any = None) -> Any:
|
|
150
|
+
"""
|
|
151
|
+
Provides dict-like .pop() method.
|
|
152
|
+
Removes the attribute and returns its value, or default if not present.
|
|
153
|
+
"""
|
|
154
|
+
if hasattr(self, key):
|
|
155
|
+
value = getattr(self, key)
|
|
156
|
+
# Set to None rather than deleting, as Pydantic models don't support delattr
|
|
157
|
+
setattr(self, key, None)
|
|
158
|
+
return value
|
|
159
|
+
return default
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RBAC utility functions for agent access control.
|
|
3
|
+
|
|
4
|
+
Provides common validation logic for enforcing agent access permissions
|
|
5
|
+
across gateways and agent components.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Dict, Any
|
|
10
|
+
|
|
11
|
+
from ..middleware.registry import MiddlewareRegistry
|
|
12
|
+
|
|
13
|
+
log = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def validate_agent_access(
|
|
17
|
+
user_config: Dict[str, Any],
|
|
18
|
+
target_agent_name: str,
|
|
19
|
+
validation_context: Dict[str, Any],
|
|
20
|
+
log_identifier: str = "[RBAC]",
|
|
21
|
+
) -> None:
|
|
22
|
+
"""
|
|
23
|
+
Validates that a user has permission to access a target agent.
|
|
24
|
+
|
|
25
|
+
Uses the middleware ConfigResolver to check if the user has the required
|
|
26
|
+
agent:{target_agent}:delegate scope. Raises PermissionError if access is denied.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
user_config: User configuration dict containing scopes (from ConfigResolver.resolve_user_config)
|
|
30
|
+
target_agent_name: Name of the agent being accessed
|
|
31
|
+
validation_context: Additional context for validation (e.g., gateway_id, delegating_agent)
|
|
32
|
+
log_identifier: Logging prefix for error messages
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
PermissionError: If the user does not have the required agent:*:delegate scope
|
|
36
|
+
"""
|
|
37
|
+
config_resolver = MiddlewareRegistry.get_config_resolver()
|
|
38
|
+
operation_spec = {
|
|
39
|
+
"operation_type": "agent_access",
|
|
40
|
+
"target_agent": target_agent_name,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
validation_result = config_resolver.validate_operation_config(
|
|
44
|
+
user_config, operation_spec, validation_context
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
if not validation_result.get("valid", False):
|
|
48
|
+
reason = validation_result.get(
|
|
49
|
+
"reason", f"Access denied to agent '{target_agent_name}'"
|
|
50
|
+
)
|
|
51
|
+
required_scopes = validation_result.get("required_scopes", [])
|
|
52
|
+
|
|
53
|
+
log.warning(
|
|
54
|
+
"%s Access to agent '%s' denied. Required scopes: %s. Reason: %s",
|
|
55
|
+
log_identifier,
|
|
56
|
+
target_agent_name,
|
|
57
|
+
required_scopes,
|
|
58
|
+
reason,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
raise PermissionError(
|
|
62
|
+
f"Access denied to agent '{target_agent_name}'. Required scopes: {required_scopes}"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
log.debug(
|
|
66
|
+
"%s Access to agent '%s' granted.",
|
|
67
|
+
log_identifier,
|
|
68
|
+
target_agent_name,
|
|
69
|
+
)
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Liquid template rendering with data context preparation.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import csv
|
|
7
|
+
import io
|
|
8
|
+
import json
|
|
9
|
+
from typing import Any, Dict, Optional, Tuple
|
|
10
|
+
from liquid import Environment
|
|
11
|
+
from jsonpath_ng.ext import parse as jsonpath_parse
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _parse_csv_to_context(csv_content: str) -> Dict[str, Any]:
|
|
18
|
+
"""
|
|
19
|
+
Parses CSV content into a template context with headers and data_rows.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Dict with keys: headers (list of strings), data_rows (list of lists)
|
|
23
|
+
"""
|
|
24
|
+
try:
|
|
25
|
+
reader = csv.reader(io.StringIO(csv_content))
|
|
26
|
+
rows = list(reader)
|
|
27
|
+
|
|
28
|
+
if not rows:
|
|
29
|
+
return {"headers": [], "data_rows": []}
|
|
30
|
+
|
|
31
|
+
headers = rows[0]
|
|
32
|
+
data_rows = rows[1:]
|
|
33
|
+
|
|
34
|
+
return {"headers": headers, "data_rows": data_rows}
|
|
35
|
+
except Exception as e:
|
|
36
|
+
log.error("CSV parsing failed: %s", e)
|
|
37
|
+
# Fallback to text
|
|
38
|
+
return {"text": csv_content}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _apply_jsonpath_filter(
|
|
42
|
+
data: Any, jsonpath_expr: str, log_id: str
|
|
43
|
+
) -> Tuple[Any, Optional[str]]:
|
|
44
|
+
"""
|
|
45
|
+
Applies JSONPath filter to data.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Tuple of (filtered_data, error_message)
|
|
49
|
+
"""
|
|
50
|
+
if not isinstance(data, (dict, list)):
|
|
51
|
+
return data, f"JSONPath requires dict or list input, got {type(data).__name__}"
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
expr = jsonpath_parse(jsonpath_expr)
|
|
55
|
+
matches = [match.value for match in expr.find(data)]
|
|
56
|
+
|
|
57
|
+
# Special case: if path selects a single array (like $.products), return the array directly
|
|
58
|
+
# But if path uses filters (like $.products[?@.x==y]), return matches as array
|
|
59
|
+
# Heuristic: if we have exactly 1 match and it's a list, return it directly
|
|
60
|
+
# Otherwise, return matches list
|
|
61
|
+
if len(matches) == 1 and isinstance(matches[0], list):
|
|
62
|
+
return matches[0], None
|
|
63
|
+
else:
|
|
64
|
+
return matches, None
|
|
65
|
+
except Exception as e:
|
|
66
|
+
return data, f"JSONPath error: {e}"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _prepare_template_context(
|
|
70
|
+
data: Any,
|
|
71
|
+
data_mime_type: str,
|
|
72
|
+
jsonpath: Optional[str],
|
|
73
|
+
limit: Optional[int],
|
|
74
|
+
log_id: str,
|
|
75
|
+
) -> Tuple[Dict[str, Any], Optional[str]]:
|
|
76
|
+
"""
|
|
77
|
+
Prepares the template rendering context.
|
|
78
|
+
This involves:
|
|
79
|
+
1. Parsing raw data (e.g., JSON string) into Python objects.
|
|
80
|
+
2. Applying JSONPath filter if provided.
|
|
81
|
+
3. Structuring the data into the final context format (e.g., {"items": ...}).
|
|
82
|
+
4. Applying a limit to the number of items/rows.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
A tuple of (context_dict, error_message).
|
|
86
|
+
"""
|
|
87
|
+
# Step 1: Parse raw data into structured data if necessary
|
|
88
|
+
parsed_data = data
|
|
89
|
+
is_csv = data_mime_type in ["text/csv", "application/csv"]
|
|
90
|
+
is_json = "json" in data_mime_type
|
|
91
|
+
is_yaml = "yaml" in data_mime_type or "yml" in data_mime_type
|
|
92
|
+
|
|
93
|
+
if isinstance(data, str):
|
|
94
|
+
if is_csv:
|
|
95
|
+
parsed_data = _parse_csv_to_context(data)
|
|
96
|
+
elif is_json:
|
|
97
|
+
try:
|
|
98
|
+
parsed_data = json.loads(data)
|
|
99
|
+
except json.JSONDecodeError as e:
|
|
100
|
+
return {}, f"Failed to parse JSON data: {e}"
|
|
101
|
+
elif is_yaml:
|
|
102
|
+
try:
|
|
103
|
+
parsed_data = yaml.safe_load(data)
|
|
104
|
+
except yaml.YAMLError as e:
|
|
105
|
+
return {}, f"Failed to parse YAML data: {e}"
|
|
106
|
+
|
|
107
|
+
# Step 2: Apply JSONPath if provided
|
|
108
|
+
if jsonpath:
|
|
109
|
+
log.info("%s Applying JSONPath: %s", log_id, jsonpath)
|
|
110
|
+
parsed_data, jsonpath_error = _apply_jsonpath_filter(
|
|
111
|
+
parsed_data, jsonpath, log_id
|
|
112
|
+
)
|
|
113
|
+
if jsonpath_error:
|
|
114
|
+
return {}, f"JSONPath filter failed: {jsonpath_error}"
|
|
115
|
+
|
|
116
|
+
# Step 3: Structure the data into the final context format
|
|
117
|
+
context: Dict[str, Any]
|
|
118
|
+
if (
|
|
119
|
+
isinstance(parsed_data, dict)
|
|
120
|
+
and "headers" in parsed_data
|
|
121
|
+
and "data_rows" in parsed_data
|
|
122
|
+
):
|
|
123
|
+
# Already in CSV context format
|
|
124
|
+
context = parsed_data
|
|
125
|
+
elif isinstance(parsed_data, list):
|
|
126
|
+
# Array: available under 'items'
|
|
127
|
+
context = {"items": parsed_data}
|
|
128
|
+
elif isinstance(parsed_data, dict):
|
|
129
|
+
# Dictionary: keys directly available
|
|
130
|
+
context = parsed_data
|
|
131
|
+
elif isinstance(parsed_data, (str, int, float, bool)) or parsed_data is None:
|
|
132
|
+
# Primitives: available under 'value'
|
|
133
|
+
context = {"value": parsed_data}
|
|
134
|
+
else:
|
|
135
|
+
# Fallback: convert to string
|
|
136
|
+
context = {"text": str(parsed_data)}
|
|
137
|
+
|
|
138
|
+
# Step 4: Apply limit if provided
|
|
139
|
+
if limit is not None and limit > 0:
|
|
140
|
+
log.info("%s Applying limit: %d", log_id, limit)
|
|
141
|
+
if "data_rows" in context and isinstance(context["data_rows"], list):
|
|
142
|
+
context["data_rows"] = context["data_rows"][:limit]
|
|
143
|
+
elif "items" in context and isinstance(context["items"], list):
|
|
144
|
+
context["items"] = context["items"][:limit]
|
|
145
|
+
|
|
146
|
+
return context, None
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def render_liquid_template(
|
|
150
|
+
template_content: str,
|
|
151
|
+
data_artifact_content: Any,
|
|
152
|
+
data_mime_type: str,
|
|
153
|
+
jsonpath: Optional[str] = None,
|
|
154
|
+
limit: Optional[int] = None,
|
|
155
|
+
log_identifier: str = "[LiquidRenderer]",
|
|
156
|
+
) -> Tuple[str, Optional[str]]:
|
|
157
|
+
"""
|
|
158
|
+
Renders a Liquid template with data from an artifact.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
template_content: The Liquid template string
|
|
162
|
+
data_artifact_content: The parsed data (string, dict, list, etc.)
|
|
163
|
+
data_mime_type: MIME type of the data artifact
|
|
164
|
+
jsonpath: Optional JSONPath expression to filter data
|
|
165
|
+
limit: Optional limit on number of items/rows
|
|
166
|
+
log_identifier: Identifier for logging
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Tuple of (rendered_output, error_message)
|
|
170
|
+
If successful, error_message is None
|
|
171
|
+
If failed, rendered_output contains error description
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
# Prepare the template context, including parsing, filtering, and limiting
|
|
175
|
+
context, error = _prepare_template_context(
|
|
176
|
+
data=data_artifact_content,
|
|
177
|
+
data_mime_type=data_mime_type,
|
|
178
|
+
jsonpath=jsonpath,
|
|
179
|
+
limit=limit,
|
|
180
|
+
log_id=log_identifier,
|
|
181
|
+
)
|
|
182
|
+
if error:
|
|
183
|
+
log.error(
|
|
184
|
+
"%s Failed to prepare template context: %s", log_identifier, error
|
|
185
|
+
)
|
|
186
|
+
return f"[Template Error: {error}]", error
|
|
187
|
+
|
|
188
|
+
log.debug(
|
|
189
|
+
"%s Template context keys: %s",
|
|
190
|
+
log_identifier,
|
|
191
|
+
list(context.keys()) if isinstance(context, dict) else "non-dict",
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# Render template
|
|
195
|
+
log.info("%s Rendering Liquid template", log_identifier)
|
|
196
|
+
env = Environment()
|
|
197
|
+
template = env.from_string(template_content)
|
|
198
|
+
rendered_output = template.render(**context)
|
|
199
|
+
|
|
200
|
+
log.info(
|
|
201
|
+
"%s Template rendered successfully. Output length: %d",
|
|
202
|
+
log_identifier,
|
|
203
|
+
len(rendered_output),
|
|
204
|
+
)
|
|
205
|
+
return rendered_output, None
|
|
206
|
+
|
|
207
|
+
except Exception as e:
|
|
208
|
+
error = f"Template rendering failed: {e}"
|
|
209
|
+
log.exception("%s %s", log_identifier, error)
|
|
210
|
+
return f"[Template Error: {error}]", error
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Resolves template blocks within artifact content.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import re
|
|
7
|
+
from typing import Any, Dict, Optional
|
|
8
|
+
|
|
9
|
+
from .liquid_renderer import render_liquid_template
|
|
10
|
+
|
|
11
|
+
log = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
# Regex to match template blocks: «««template: params\ncontent\n»»» or «««template_liquid: params\ncontent\n»»»
|
|
14
|
+
# Supports both 'template:' (legacy) and 'template_liquid:' (new)
|
|
15
|
+
TEMPLATE_BLOCK_REGEX = re.compile(
|
|
16
|
+
r'«««template(?:_liquid)?:\s*([^\n]+)\n(.*?)»»»',
|
|
17
|
+
re.DOTALL
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
# Regex to parse parameters from template block header
|
|
21
|
+
TEMPLATE_PARAMS_REGEX = re.compile(r'(\w+)\s*=\s*"([^"]*)"')
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def resolve_template_blocks_in_string(
|
|
25
|
+
text: str,
|
|
26
|
+
artifact_service: Any,
|
|
27
|
+
session_context: Dict[str, str],
|
|
28
|
+
log_identifier: str = "[TemplateResolver]",
|
|
29
|
+
) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Finds and resolves all template blocks in the given text.
|
|
32
|
+
|
|
33
|
+
Template blocks have the format:
|
|
34
|
+
«««template: data="filename.ext" jsonpath="$.path" limit="10"
|
|
35
|
+
...template content...
|
|
36
|
+
»»»
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
text: The text containing potential template blocks
|
|
40
|
+
artifact_service: Service to load data artifacts
|
|
41
|
+
session_context: Dict with app_name, user_id, session_id
|
|
42
|
+
log_identifier: Identifier for logging
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Text with all template blocks resolved to their rendered output
|
|
46
|
+
"""
|
|
47
|
+
# Import here to avoid circular dependency
|
|
48
|
+
from ....agent.utils.artifact_helpers import load_artifact_content_or_metadata
|
|
49
|
+
|
|
50
|
+
# Find all template blocks
|
|
51
|
+
matches = list(TEMPLATE_BLOCK_REGEX.finditer(text))
|
|
52
|
+
|
|
53
|
+
if not matches:
|
|
54
|
+
return text
|
|
55
|
+
|
|
56
|
+
log.info(
|
|
57
|
+
"%s Found %d template block(s) to resolve",
|
|
58
|
+
log_identifier,
|
|
59
|
+
len(matches),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Process each match and collect replacements
|
|
63
|
+
replacements = []
|
|
64
|
+
for match in matches:
|
|
65
|
+
params_str = match.group(1)
|
|
66
|
+
template_content = match.group(2)
|
|
67
|
+
|
|
68
|
+
# Parse parameters
|
|
69
|
+
params = dict(TEMPLATE_PARAMS_REGEX.findall(params_str))
|
|
70
|
+
|
|
71
|
+
log.info(
|
|
72
|
+
"%s Resolving template block with params: %s",
|
|
73
|
+
log_identifier,
|
|
74
|
+
params,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
data_artifact_spec = params.get("data")
|
|
78
|
+
if not data_artifact_spec:
|
|
79
|
+
error_msg = "[Template Error: Missing 'data' parameter]"
|
|
80
|
+
log.error("%s %s", log_identifier, error_msg)
|
|
81
|
+
replacements.append((match.start(), match.end(), error_msg))
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
# Parse data artifact spec (filename or filename:version)
|
|
85
|
+
artifact_parts = data_artifact_spec.split(":", 1)
|
|
86
|
+
filename = artifact_parts[0]
|
|
87
|
+
version = int(artifact_parts[1]) if len(artifact_parts) > 1 else "latest"
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
# Load the data artifact with a large max_content_length (2MB)
|
|
91
|
+
# to ensure full JSON/YAML content is loaded for template rendering
|
|
92
|
+
artifact_data = await load_artifact_content_or_metadata(
|
|
93
|
+
artifact_service,
|
|
94
|
+
**session_context,
|
|
95
|
+
filename=filename,
|
|
96
|
+
version=version,
|
|
97
|
+
load_metadata_only=False,
|
|
98
|
+
max_content_length=2_000_000, # 2MB limit for template data
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if artifact_data.get("status") != "success":
|
|
102
|
+
error_msg = f"[Template Error: Failed to load data artifact '{filename}']"
|
|
103
|
+
log.error("%s %s", log_identifier, error_msg)
|
|
104
|
+
replacements.append((match.start(), match.end(), error_msg))
|
|
105
|
+
continue
|
|
106
|
+
|
|
107
|
+
# Get artifact content and MIME type
|
|
108
|
+
artifact_content = artifact_data.get("content")
|
|
109
|
+
artifact_mime = artifact_data.get("mime_type", "text/plain")
|
|
110
|
+
|
|
111
|
+
# Parse optional parameters
|
|
112
|
+
jsonpath = params.get("jsonpath")
|
|
113
|
+
limit_str = params.get("limit")
|
|
114
|
+
limit = int(limit_str) if limit_str else None
|
|
115
|
+
|
|
116
|
+
# Render the template
|
|
117
|
+
rendered_output, render_error = render_liquid_template(
|
|
118
|
+
template_content=template_content,
|
|
119
|
+
data_artifact_content=artifact_content,
|
|
120
|
+
data_mime_type=artifact_mime,
|
|
121
|
+
jsonpath=jsonpath,
|
|
122
|
+
limit=limit,
|
|
123
|
+
log_identifier=log_identifier,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if render_error:
|
|
127
|
+
log.error(
|
|
128
|
+
"%s Template rendering failed: %s",
|
|
129
|
+
log_identifier,
|
|
130
|
+
render_error,
|
|
131
|
+
)
|
|
132
|
+
replacements.append((match.start(), match.end(), rendered_output))
|
|
133
|
+
else:
|
|
134
|
+
log.info(
|
|
135
|
+
"%s Template rendered successfully. Output length: %d",
|
|
136
|
+
log_identifier,
|
|
137
|
+
len(rendered_output),
|
|
138
|
+
)
|
|
139
|
+
replacements.append((match.start(), match.end(), rendered_output))
|
|
140
|
+
|
|
141
|
+
except Exception as e:
|
|
142
|
+
error_msg = f"[Template Error: {str(e)}]"
|
|
143
|
+
log.exception(
|
|
144
|
+
"%s Exception during template resolution: %s",
|
|
145
|
+
log_identifier,
|
|
146
|
+
e,
|
|
147
|
+
)
|
|
148
|
+
replacements.append((match.start(), match.end(), error_msg))
|
|
149
|
+
|
|
150
|
+
# Apply all replacements from end to start to maintain positions
|
|
151
|
+
result = text
|
|
152
|
+
for start, end, replacement in reversed(replacements):
|
|
153
|
+
result = result[:start] + replacement + result[end:]
|
|
154
|
+
|
|
155
|
+
log.info(
|
|
156
|
+
"%s Resolved %d template block(s)",
|
|
157
|
+
log_identifier,
|
|
158
|
+
len(replacements),
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
return result
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Utilities for robust type checking, especially in development environments.
|
|
3
|
+
"""
|
|
4
|
+
import inspect
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def is_subclass_by_name(cls_to_check: type, base_class_name: str) -> bool:
|
|
8
|
+
"""
|
|
9
|
+
Checks if a class is a subclass of another class by looking for the
|
|
10
|
+
base class's name in the Method Resolution Order (MRO).
|
|
11
|
+
|
|
12
|
+
This is a robust workaround for development environments where the same
|
|
13
|
+
class might be loaded from two different paths (e.g., from 'src' and
|
|
14
|
+
from an editable install in 'site-packages'), causing standard
|
|
15
|
+
`issubclass()` checks to fail.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
cls_to_check: The class to inspect.
|
|
19
|
+
base_class_name: The string name of the base class to look for.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
True if the base class name is found in the ancestry, False otherwise.
|
|
23
|
+
"""
|
|
24
|
+
if not inspect.isclass(cls_to_check):
|
|
25
|
+
return False
|
|
26
|
+
|
|
27
|
+
# Check the name of each class in the inheritance chain
|
|
28
|
+
return any(base.__name__ == base_class_name for base in cls_to_check.__mro__)
|