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,793 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines modifier implementation functions and their contracts.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import re
|
|
7
|
+
from typing import Any, Callable, Dict, Optional, Tuple, List
|
|
8
|
+
|
|
9
|
+
from .constants import EARLY_EMBED_TYPES, LATE_EMBED_TYPES
|
|
10
|
+
|
|
11
|
+
log = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
from jsonpath_ng.ext import parse as jsonpath_parse
|
|
14
|
+
import pystache
|
|
15
|
+
|
|
16
|
+
from google.adk.artifacts import BaseArtifactService
|
|
17
|
+
|
|
18
|
+
from .types import DataFormat, ResolutionMode
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _apply_jsonpath(
|
|
22
|
+
current_data: Any, expression: str, mime_type: Optional[str], log_id: str
|
|
23
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
24
|
+
"""
|
|
25
|
+
Applies a JSONPath expression to parsed JSON data.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
current_data: The input data (expected to be dict or list).
|
|
29
|
+
expression: The JSONPath expression string.
|
|
30
|
+
mime_type: The original mime type (passed through).
|
|
31
|
+
log_id: Identifier for logging.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
35
|
+
result_data is typically a list of matched values.
|
|
36
|
+
"""
|
|
37
|
+
if not isinstance(current_data, (dict, list)):
|
|
38
|
+
return (
|
|
39
|
+
current_data,
|
|
40
|
+
mime_type,
|
|
41
|
+
f"Input data for 'jsonpath' must be a JSON object or list, got {type(current_data).__name__}.",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
jsonpath_expr = jsonpath_parse(expression)
|
|
46
|
+
matches = [match.value for match in jsonpath_expr.find(current_data)]
|
|
47
|
+
return matches, mime_type, None
|
|
48
|
+
except Exception as e:
|
|
49
|
+
return (
|
|
50
|
+
current_data,
|
|
51
|
+
mime_type,
|
|
52
|
+
f"Error applying JSONPath expression '{expression}': {e}",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _apply_select_cols(
|
|
57
|
+
current_data: List[Dict], cols_str: str, mime_type: Optional[str], log_id: str
|
|
58
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
59
|
+
"""
|
|
60
|
+
Selects specific columns from data represented as a list of dictionaries.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
current_data: The input data (expected List[Dict]).
|
|
64
|
+
cols_str: Comma-separated string of column names to keep.
|
|
65
|
+
mime_type: The original mime type (passed through).
|
|
66
|
+
log_id: Identifier for logging.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
70
|
+
result_data is List[Dict] containing only selected columns.
|
|
71
|
+
"""
|
|
72
|
+
if not isinstance(current_data, list) or (
|
|
73
|
+
current_data and not isinstance(current_data[0], dict)
|
|
74
|
+
):
|
|
75
|
+
return (
|
|
76
|
+
current_data,
|
|
77
|
+
mime_type,
|
|
78
|
+
f"Input data for 'select_cols' must be a list of dictionaries, got {type(current_data).__name__}.",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
if not current_data:
|
|
82
|
+
return [], mime_type, None
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
header = list(current_data[0].keys())
|
|
86
|
+
target_cols = [col.strip() for col in cols_str.split(",")]
|
|
87
|
+
output_list = []
|
|
88
|
+
|
|
89
|
+
for target_col in target_cols:
|
|
90
|
+
if target_col not in header:
|
|
91
|
+
return (
|
|
92
|
+
current_data,
|
|
93
|
+
mime_type,
|
|
94
|
+
f"Column '{target_col}' not found in data keys: {header}",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
for row_dict in current_data:
|
|
98
|
+
new_row = {col: row_dict.get(col) for col in target_cols}
|
|
99
|
+
output_list.append(new_row)
|
|
100
|
+
|
|
101
|
+
return output_list, mime_type, None
|
|
102
|
+
|
|
103
|
+
except Exception as e:
|
|
104
|
+
return current_data, mime_type, f"Error selecting columns '{cols_str}': {e}"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _apply_filter_rows_eq(
|
|
108
|
+
current_data: List[Dict], filter_spec: str, mime_type: Optional[str], log_id: str
|
|
109
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
110
|
+
"""
|
|
111
|
+
Filters a list of dictionaries based on a column's value equality.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
current_data: The input data (expected List[Dict]).
|
|
115
|
+
filter_spec: String in the format 'column_name:value'.
|
|
116
|
+
mime_type: The original mime type (passed through).
|
|
117
|
+
log_id: Identifier for logging.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
121
|
+
result_data is List[Dict] containing only filtered rows.
|
|
122
|
+
"""
|
|
123
|
+
if not isinstance(current_data, list) or (
|
|
124
|
+
current_data and not isinstance(current_data[0], dict)
|
|
125
|
+
):
|
|
126
|
+
return (
|
|
127
|
+
current_data,
|
|
128
|
+
mime_type,
|
|
129
|
+
f"Input data for 'filter_rows_eq' must be a list of dictionaries, got {type(current_data).__name__}.",
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if not current_data:
|
|
133
|
+
return [], mime_type, None
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
parts = filter_spec.split(":", 1)
|
|
137
|
+
if len(parts) != 2:
|
|
138
|
+
return (
|
|
139
|
+
current_data,
|
|
140
|
+
mime_type,
|
|
141
|
+
f"Invalid filter format '{filter_spec}'. Expected 'column_name:value'.",
|
|
142
|
+
)
|
|
143
|
+
col_name, filter_value = parts[0].strip(), parts[1].strip()
|
|
144
|
+
|
|
145
|
+
header = list(current_data[0].keys())
|
|
146
|
+
if col_name not in header:
|
|
147
|
+
return (
|
|
148
|
+
current_data,
|
|
149
|
+
mime_type,
|
|
150
|
+
f"Filter column '{col_name}' not found in data keys: {header}",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
output_list = [
|
|
154
|
+
row for row in current_data if str(row.get(col_name)) == filter_value
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
return output_list, mime_type, None
|
|
158
|
+
|
|
159
|
+
except Exception as e:
|
|
160
|
+
return current_data, mime_type, f"Error filtering rows by '{filter_spec}': {e}"
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _apply_slice_rows(
|
|
164
|
+
current_data: List[Dict], slice_spec: str, mime_type: Optional[str], log_id: str
|
|
165
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
166
|
+
"""
|
|
167
|
+
Selects a slice of rows from a list of dictionaries.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
current_data: The input data (expected List[Dict]).
|
|
171
|
+
slice_spec: String in Python slice format 'start:end'.
|
|
172
|
+
mime_type: The original mime type (passed through).
|
|
173
|
+
log_id: Identifier for logging.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
177
|
+
result_data is List[Dict] containing the sliced rows.
|
|
178
|
+
"""
|
|
179
|
+
if not isinstance(current_data, list):
|
|
180
|
+
return (
|
|
181
|
+
current_data,
|
|
182
|
+
mime_type,
|
|
183
|
+
f"Input data for 'slice_rows' must be a list, got {type(current_data).__name__}.",
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
start_str, end_str = None, None
|
|
188
|
+
if ":" in slice_spec:
|
|
189
|
+
parts = slice_spec.split(":", 1)
|
|
190
|
+
start_str, end_str = parts[0].strip(), parts[1].strip()
|
|
191
|
+
else:
|
|
192
|
+
return (
|
|
193
|
+
current_data,
|
|
194
|
+
mime_type,
|
|
195
|
+
f"Invalid slice format '{slice_spec}'. Expected 'start:end'.",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
start = int(start_str) if start_str else 0
|
|
199
|
+
end = int(end_str) if end_str else None
|
|
200
|
+
|
|
201
|
+
sliced_data = current_data[start:end]
|
|
202
|
+
|
|
203
|
+
return sliced_data, mime_type, None
|
|
204
|
+
|
|
205
|
+
except (ValueError, TypeError) as e:
|
|
206
|
+
return current_data, mime_type, f"Invalid slice indices in '{slice_spec}': {e}"
|
|
207
|
+
except Exception as e:
|
|
208
|
+
return current_data, mime_type, f"Error slicing rows '{slice_spec}': {e}"
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _apply_slice_lines(
|
|
212
|
+
current_data: str, slice_spec: str, mime_type: Optional[str], log_id: str
|
|
213
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
214
|
+
"""
|
|
215
|
+
Selects a slice of lines from text data.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
current_data: The input data (expected str).
|
|
219
|
+
slice_spec: String in Python slice format 'start:end'.
|
|
220
|
+
mime_type: The original mime type (passed through).
|
|
221
|
+
log_id: Identifier for logging.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
225
|
+
result_data is str containing the sliced lines.
|
|
226
|
+
"""
|
|
227
|
+
if not isinstance(current_data, str):
|
|
228
|
+
return (
|
|
229
|
+
current_data,
|
|
230
|
+
mime_type,
|
|
231
|
+
f"Input data for 'slice_lines' must be a string, got {type(current_data).__name__}.",
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
start_str, end_str = None, None
|
|
236
|
+
if ":" in slice_spec:
|
|
237
|
+
parts = slice_spec.split(":", 1)
|
|
238
|
+
start_str, end_str = parts[0].strip(), parts[1].strip()
|
|
239
|
+
else:
|
|
240
|
+
return (
|
|
241
|
+
current_data,
|
|
242
|
+
mime_type,
|
|
243
|
+
f"Invalid slice format '{slice_spec}'. Expected 'start:end'.",
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
start = int(start_str) if start_str else 0
|
|
247
|
+
end = int(end_str) if end_str else None
|
|
248
|
+
|
|
249
|
+
lines = current_data.splitlines(keepends=True)
|
|
250
|
+
sliced_lines = lines[start:end]
|
|
251
|
+
|
|
252
|
+
return "".join(sliced_lines), mime_type, None
|
|
253
|
+
|
|
254
|
+
except (ValueError, TypeError) as e:
|
|
255
|
+
return current_data, mime_type, f"Invalid slice indices in '{slice_spec}': {e}"
|
|
256
|
+
except Exception as e:
|
|
257
|
+
return current_data, mime_type, f"Error slicing text lines '{slice_spec}': {e}"
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _apply_grep(
|
|
261
|
+
current_data: str, pattern: str, mime_type: Optional[str], log_id: str
|
|
262
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
263
|
+
"""
|
|
264
|
+
Filters lines matching a regex pattern from text data.
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
current_data: The input data (expected str).
|
|
268
|
+
pattern: The regex pattern string.
|
|
269
|
+
mime_type: The original mime type (passed through).
|
|
270
|
+
log_id: Identifier for logging.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
274
|
+
result_data is str containing only matching lines.
|
|
275
|
+
"""
|
|
276
|
+
if not isinstance(current_data, str):
|
|
277
|
+
return (
|
|
278
|
+
current_data,
|
|
279
|
+
mime_type,
|
|
280
|
+
f"Input data for 'grep' must be a string, got {type(current_data).__name__}.",
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
try:
|
|
284
|
+
regex = re.compile(pattern)
|
|
285
|
+
lines = current_data.splitlines(keepends=True)
|
|
286
|
+
filtered_lines = [line for line in lines if regex.search(line)]
|
|
287
|
+
return "".join(filtered_lines), mime_type, None
|
|
288
|
+
except re.error as e:
|
|
289
|
+
return current_data, mime_type, f"Invalid regex pattern '{pattern}': {e}"
|
|
290
|
+
except Exception as e:
|
|
291
|
+
return current_data, mime_type, f"Error applying grep pattern '{pattern}': {e}"
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _apply_head(
|
|
295
|
+
current_data: str, n_str: str, mime_type: Optional[str], log_id: str
|
|
296
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
297
|
+
"""
|
|
298
|
+
Returns the first N lines of text data.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
current_data: The input data (expected str).
|
|
302
|
+
n_str: String representing the number of lines (N).
|
|
303
|
+
mime_type: The original mime type (passed through).
|
|
304
|
+
log_id: Identifier for logging.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
308
|
+
result_data is str containing the first N lines.
|
|
309
|
+
"""
|
|
310
|
+
if not isinstance(current_data, str):
|
|
311
|
+
return (
|
|
312
|
+
current_data,
|
|
313
|
+
mime_type,
|
|
314
|
+
f"Input data for 'head' must be a string, got {type(current_data).__name__}.",
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
try:
|
|
318
|
+
n = int(n_str.strip())
|
|
319
|
+
if n < 0:
|
|
320
|
+
return current_data, mime_type, "Head count N cannot be negative."
|
|
321
|
+
|
|
322
|
+
lines = current_data.splitlines(keepends=True)
|
|
323
|
+
head_lines = lines[:n]
|
|
324
|
+
return "".join(head_lines), mime_type, None
|
|
325
|
+
except (ValueError, TypeError) as e:
|
|
326
|
+
return current_data, mime_type, f"Invalid head count N '{n_str}': {e}"
|
|
327
|
+
except Exception as e:
|
|
328
|
+
return current_data, mime_type, f"Error applying head '{n_str}': {e}"
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def _apply_tail(
|
|
332
|
+
current_data: str, n_str: str, mime_type: Optional[str], log_id: str
|
|
333
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
334
|
+
"""
|
|
335
|
+
Returns the last N lines of text data.
|
|
336
|
+
|
|
337
|
+
Args:
|
|
338
|
+
current_data: The input data (expected str).
|
|
339
|
+
n_str: String representing the number of lines (N).
|
|
340
|
+
mime_type: The original mime type (passed through).
|
|
341
|
+
log_id: Identifier for logging.
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
345
|
+
result_data is str containing the last N lines.
|
|
346
|
+
"""
|
|
347
|
+
if not isinstance(current_data, str):
|
|
348
|
+
return (
|
|
349
|
+
current_data,
|
|
350
|
+
mime_type,
|
|
351
|
+
f"Input data for 'tail' must be a string, got {type(current_data).__name__}.",
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
try:
|
|
355
|
+
n = int(n_str.strip())
|
|
356
|
+
if n < 0:
|
|
357
|
+
return current_data, mime_type, "Tail count N cannot be negative."
|
|
358
|
+
if n == 0:
|
|
359
|
+
return "", mime_type, None
|
|
360
|
+
|
|
361
|
+
lines = current_data.splitlines(keepends=True)
|
|
362
|
+
tail_lines = lines[-n:]
|
|
363
|
+
return "".join(tail_lines), mime_type, None
|
|
364
|
+
except (ValueError, TypeError) as e:
|
|
365
|
+
return current_data, mime_type, f"Invalid tail count N '{n_str}': {e}"
|
|
366
|
+
except Exception as e:
|
|
367
|
+
return current_data, mime_type, f"Error applying tail '{n_str}': {e}"
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def _apply_select_fields(
|
|
371
|
+
current_data: List[Dict], fields_str: str, mime_type: Optional[str], log_id: str
|
|
372
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
373
|
+
"""
|
|
374
|
+
Selects specific fields from a list of dictionaries.
|
|
375
|
+
|
|
376
|
+
Args:
|
|
377
|
+
current_data: The input data (expected List[Dict]).
|
|
378
|
+
fields_str: Comma-separated string of field names to keep.
|
|
379
|
+
mime_type: The original mime type (passed through).
|
|
380
|
+
log_id: Identifier for logging.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
384
|
+
result_data is List[Dict] containing only selected fields.
|
|
385
|
+
"""
|
|
386
|
+
if not isinstance(current_data, list) or (
|
|
387
|
+
current_data and not isinstance(current_data[0], dict)
|
|
388
|
+
):
|
|
389
|
+
return (
|
|
390
|
+
current_data,
|
|
391
|
+
mime_type,
|
|
392
|
+
f"Input data for 'select_fields' must be a list of dictionaries, got {type(current_data).__name__}.",
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
target_fields = [field.strip() for field in fields_str.split(",")]
|
|
396
|
+
if not target_fields:
|
|
397
|
+
return current_data, mime_type, "No fields specified for 'select_fields'."
|
|
398
|
+
|
|
399
|
+
output_list = []
|
|
400
|
+
try:
|
|
401
|
+
for item in current_data:
|
|
402
|
+
if isinstance(item, dict):
|
|
403
|
+
new_item = {
|
|
404
|
+
field: item.get(field) for field in target_fields if field in item
|
|
405
|
+
}
|
|
406
|
+
output_list.append(new_item)
|
|
407
|
+
else:
|
|
408
|
+
log.warning(
|
|
409
|
+
"%s Skipping non-dictionary item in list during select_fields.",
|
|
410
|
+
log_id,
|
|
411
|
+
)
|
|
412
|
+
continue
|
|
413
|
+
return output_list, mime_type, None
|
|
414
|
+
except Exception as e:
|
|
415
|
+
return current_data, mime_type, f"Error selecting fields '{fields_str}': {e}"
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
async def _apply_template(
|
|
419
|
+
current_data: Any,
|
|
420
|
+
template_spec: str,
|
|
421
|
+
mime_type: Optional[str],
|
|
422
|
+
log_id: str,
|
|
423
|
+
context: Any,
|
|
424
|
+
) -> Tuple[Any, Optional[str], Optional[str]]:
|
|
425
|
+
"""
|
|
426
|
+
Applies a Mustache template loaded from an artifact to the input data.
|
|
427
|
+
This version first renders the template, then resolves embeds on the result.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
current_data: The input data (expected dict, list, or str).
|
|
431
|
+
template_spec: String 'template_filename[:version]'.
|
|
432
|
+
mime_type: The original mime type (passed through).
|
|
433
|
+
log_id: Identifier for logging.
|
|
434
|
+
context: The Gateway context dictionary containing artifact_service and session_context.
|
|
435
|
+
|
|
436
|
+
Returns:
|
|
437
|
+
Tuple: (result_data, original_mime_type, error_string)
|
|
438
|
+
result_data is the rendered and resolved string.
|
|
439
|
+
"""
|
|
440
|
+
from .resolver import resolve_embeds_recursively_in_string, evaluate_embed
|
|
441
|
+
|
|
442
|
+
if not isinstance(current_data, (dict, list, str)):
|
|
443
|
+
return (
|
|
444
|
+
current_data,
|
|
445
|
+
mime_type,
|
|
446
|
+
f"Input data for 'apply_to_template' must be dict, list, or string, got {type(current_data).__name__}.",
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
parts = template_spec.strip().split(":", 1)
|
|
450
|
+
template_filename = parts[0]
|
|
451
|
+
template_version_str = parts[1] if len(parts) > 1 else None
|
|
452
|
+
template_version = None
|
|
453
|
+
|
|
454
|
+
if not template_filename:
|
|
455
|
+
return current_data, mime_type, "Template filename cannot be empty."
|
|
456
|
+
|
|
457
|
+
if not isinstance(context, dict):
|
|
458
|
+
return current_data, mime_type, "Invalid context for template loading."
|
|
459
|
+
artifact_service: Optional[BaseArtifactService] = context.get("artifact_service")
|
|
460
|
+
session_context = context.get("session_context")
|
|
461
|
+
if not artifact_service or not session_context:
|
|
462
|
+
return (
|
|
463
|
+
current_data,
|
|
464
|
+
mime_type,
|
|
465
|
+
"ArtifactService or session context not available for template loading.",
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
app_name = session_context.get("app_name")
|
|
469
|
+
user_id = session_context.get("user_id")
|
|
470
|
+
session_id = session_context.get("session_id")
|
|
471
|
+
if not all([app_name, user_id, session_id]):
|
|
472
|
+
return (
|
|
473
|
+
current_data,
|
|
474
|
+
mime_type,
|
|
475
|
+
"Missing required session identifiers in context for template loading.",
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
try:
|
|
479
|
+
if template_version_str:
|
|
480
|
+
template_version = int(template_version_str)
|
|
481
|
+
else:
|
|
482
|
+
versions = await artifact_service.list_versions(
|
|
483
|
+
app_name=app_name,
|
|
484
|
+
user_id=user_id,
|
|
485
|
+
session_id=session_id,
|
|
486
|
+
filename=template_filename,
|
|
487
|
+
)
|
|
488
|
+
if not versions:
|
|
489
|
+
return (
|
|
490
|
+
current_data,
|
|
491
|
+
mime_type,
|
|
492
|
+
f"Template artifact '{template_filename}' (latest) not found.",
|
|
493
|
+
)
|
|
494
|
+
template_version = max(versions)
|
|
495
|
+
|
|
496
|
+
template_part = await artifact_service.load_artifact(
|
|
497
|
+
app_name=app_name,
|
|
498
|
+
user_id=user_id,
|
|
499
|
+
session_id=session_id,
|
|
500
|
+
filename=template_filename,
|
|
501
|
+
version=template_version,
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
if not template_part or not template_part.inline_data:
|
|
505
|
+
return (
|
|
506
|
+
current_data,
|
|
507
|
+
mime_type,
|
|
508
|
+
f"Template artifact '{template_filename}' v{template_version} not found or empty.",
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
template_bytes = template_part.inline_data.data
|
|
512
|
+
try:
|
|
513
|
+
raw_template_string = template_bytes.decode("utf-8")
|
|
514
|
+
except UnicodeDecodeError:
|
|
515
|
+
return (
|
|
516
|
+
current_data,
|
|
517
|
+
mime_type,
|
|
518
|
+
f"Cannot render non-UTF-8 decodable binary template '{template_filename}' v{template_version}.",
|
|
519
|
+
)
|
|
520
|
+
|
|
521
|
+
except FileNotFoundError:
|
|
522
|
+
return (
|
|
523
|
+
current_data,
|
|
524
|
+
mime_type,
|
|
525
|
+
f"Template artifact '{template_filename}' v{template_version_str or 'latest'} not found.",
|
|
526
|
+
)
|
|
527
|
+
except ValueError as e:
|
|
528
|
+
return (
|
|
529
|
+
current_data,
|
|
530
|
+
mime_type,
|
|
531
|
+
f"Invalid version specified for template: '{template_version_str}' or other value error: {e}",
|
|
532
|
+
)
|
|
533
|
+
except Exception as e:
|
|
534
|
+
return (
|
|
535
|
+
current_data,
|
|
536
|
+
mime_type,
|
|
537
|
+
f"Error loading template artifact '{template_filename}' v{template_version_str or 'latest'}: {e}",
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
try:
|
|
541
|
+
log.info(
|
|
542
|
+
"%s [apply_to_template] Preparing render context. Input data type: %s, Original MIME: %s",
|
|
543
|
+
log_id,
|
|
544
|
+
type(current_data).__name__,
|
|
545
|
+
mime_type,
|
|
546
|
+
)
|
|
547
|
+
render_context: Dict[str, Any]
|
|
548
|
+
|
|
549
|
+
if isinstance(current_data, list):
|
|
550
|
+
if mime_type and "csv" in mime_type.lower():
|
|
551
|
+
log.info(
|
|
552
|
+
"%s [apply_to_template] Input is a list and original MIME is CSV. Structuring context with 'headers' and 'data_rows'.",
|
|
553
|
+
log_id,
|
|
554
|
+
)
|
|
555
|
+
if not current_data:
|
|
556
|
+
render_context = {"headers": [], "data_rows": []}
|
|
557
|
+
else:
|
|
558
|
+
if all(isinstance(item, dict) for item in current_data):
|
|
559
|
+
headers = list(current_data[0].keys()) if current_data else []
|
|
560
|
+
data_rows = [list(row.values()) for row in current_data]
|
|
561
|
+
render_context = {"headers": headers, "data_rows": data_rows}
|
|
562
|
+
else:
|
|
563
|
+
log.warning(
|
|
564
|
+
"%s [apply_to_template] Input is list from CSV, but items are not all dictionaries. Falling back to 'items' context.",
|
|
565
|
+
log_id,
|
|
566
|
+
)
|
|
567
|
+
render_context = {"items": current_data}
|
|
568
|
+
else:
|
|
569
|
+
log.info(
|
|
570
|
+
"%s [apply_to_template] Input is a list (from JSON/YAML). Data available under 'items' key.",
|
|
571
|
+
log_id,
|
|
572
|
+
)
|
|
573
|
+
render_context = {"items": current_data}
|
|
574
|
+
elif isinstance(current_data, dict):
|
|
575
|
+
render_context = current_data
|
|
576
|
+
log.info(
|
|
577
|
+
"%s [apply_to_template] Input is dict. Keys directly available in template.",
|
|
578
|
+
log_id,
|
|
579
|
+
)
|
|
580
|
+
elif isinstance(current_data, str):
|
|
581
|
+
render_context = {"text": current_data}
|
|
582
|
+
log.info(
|
|
583
|
+
"%s [apply_to_template] Input is string. Data available under 'text' key.",
|
|
584
|
+
log_id,
|
|
585
|
+
)
|
|
586
|
+
else:
|
|
587
|
+
log.warning(
|
|
588
|
+
"%s [apply_to_template] Input is unexpected type %s. Converting to string and placing under 'value' key.",
|
|
589
|
+
log_id,
|
|
590
|
+
type(current_data).__name__,
|
|
591
|
+
)
|
|
592
|
+
render_context = {"value": str(current_data)}
|
|
593
|
+
|
|
594
|
+
log.info(
|
|
595
|
+
"%s [apply_to_template] Render context keys: %s",
|
|
596
|
+
log_id,
|
|
597
|
+
list(render_context.keys()),
|
|
598
|
+
)
|
|
599
|
+
if "items" in render_context and isinstance(render_context["items"], list):
|
|
600
|
+
log.info(
|
|
601
|
+
"%s [apply_to_template] Render context 'items' length: %d",
|
|
602
|
+
log_id,
|
|
603
|
+
len(render_context["items"]),
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
intermediate_rendered_string = pystache.render(
|
|
607
|
+
raw_template_string, render_context
|
|
608
|
+
)
|
|
609
|
+
log.debug(
|
|
610
|
+
"%s [apply_to_template] Intermediate rendered string: %s",
|
|
611
|
+
log_id,
|
|
612
|
+
intermediate_rendered_string[:200] + "...",
|
|
613
|
+
)
|
|
614
|
+
|
|
615
|
+
except Exception as e:
|
|
616
|
+
return (
|
|
617
|
+
current_data,
|
|
618
|
+
mime_type,
|
|
619
|
+
f"Error preparing context or rendering template '{template_filename}' v{template_version}: {e}",
|
|
620
|
+
)
|
|
621
|
+
|
|
622
|
+
try:
|
|
623
|
+
log.debug(
|
|
624
|
+
"%s [apply_to_template] Resolving embeds on rendered template output.",
|
|
625
|
+
log_id,
|
|
626
|
+
)
|
|
627
|
+
resolver_config = context.get("config", {})
|
|
628
|
+
if not resolver_config:
|
|
629
|
+
log.warning(
|
|
630
|
+
"%s 'config' not found in context for template embed resolution. Using defaults.",
|
|
631
|
+
log_id,
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
final_rendered_string = await resolve_embeds_recursively_in_string(
|
|
635
|
+
text=intermediate_rendered_string,
|
|
636
|
+
context=context,
|
|
637
|
+
resolver_func=evaluate_embed,
|
|
638
|
+
types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
|
|
639
|
+
resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
|
|
640
|
+
log_identifier=f"{log_id}[TemplateEmbeds]",
|
|
641
|
+
config=resolver_config,
|
|
642
|
+
max_depth=resolver_config.get("gateway_recursive_embed_depth", 12),
|
|
643
|
+
current_depth=0,
|
|
644
|
+
visited_artifacts=set(),
|
|
645
|
+
accumulated_size=0,
|
|
646
|
+
max_total_size=resolver_config.get(
|
|
647
|
+
"gateway_max_artifact_resolve_size_bytes", -1
|
|
648
|
+
),
|
|
649
|
+
)
|
|
650
|
+
log.debug(
|
|
651
|
+
"%s [apply_to_template] Final rendered string after embed resolution: %s",
|
|
652
|
+
log_id,
|
|
653
|
+
final_rendered_string[:200] + "...",
|
|
654
|
+
)
|
|
655
|
+
except Exception as recurse_err:
|
|
656
|
+
log.exception(
|
|
657
|
+
"%s Error during recursive resolution of rendered template: %s",
|
|
658
|
+
log_id,
|
|
659
|
+
recurse_err,
|
|
660
|
+
)
|
|
661
|
+
return (
|
|
662
|
+
current_data,
|
|
663
|
+
mime_type,
|
|
664
|
+
f"Error resolving embeds within rendered template: {recurse_err}",
|
|
665
|
+
)
|
|
666
|
+
|
|
667
|
+
return final_rendered_string, mime_type, None
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
MODIFIER_IMPLEMENTATIONS: Dict[
|
|
671
|
+
str, Callable[..., Tuple[Any, Optional[str], Optional[str]]]
|
|
672
|
+
] = {
|
|
673
|
+
"jsonpath": _apply_jsonpath,
|
|
674
|
+
"select_cols": _apply_select_cols,
|
|
675
|
+
"filter_rows_eq": _apply_filter_rows_eq,
|
|
676
|
+
"slice_rows": _apply_slice_rows,
|
|
677
|
+
"slice_lines": _apply_slice_lines,
|
|
678
|
+
"grep": _apply_grep,
|
|
679
|
+
"head": _apply_head,
|
|
680
|
+
"tail": _apply_tail,
|
|
681
|
+
"select_fields": _apply_select_fields,
|
|
682
|
+
"apply_to_template": _apply_template,
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
MODIFIER_DEFINITIONS: Dict[str, Dict[str, Any]] = {
|
|
686
|
+
"jsonpath": {
|
|
687
|
+
"function": _apply_jsonpath,
|
|
688
|
+
"accepts": [DataFormat.JSON_OBJECT],
|
|
689
|
+
"produces": DataFormat.JSON_OBJECT,
|
|
690
|
+
},
|
|
691
|
+
"select_cols": {
|
|
692
|
+
"function": _apply_select_cols,
|
|
693
|
+
"accepts": [DataFormat.LIST_OF_DICTS],
|
|
694
|
+
"produces": DataFormat.LIST_OF_DICTS,
|
|
695
|
+
},
|
|
696
|
+
"filter_rows_eq": {
|
|
697
|
+
"function": _apply_filter_rows_eq,
|
|
698
|
+
"accepts": [DataFormat.LIST_OF_DICTS],
|
|
699
|
+
"produces": DataFormat.LIST_OF_DICTS,
|
|
700
|
+
},
|
|
701
|
+
"slice_rows": {
|
|
702
|
+
"function": _apply_slice_rows,
|
|
703
|
+
"accepts": [DataFormat.LIST_OF_DICTS],
|
|
704
|
+
"produces": DataFormat.LIST_OF_DICTS,
|
|
705
|
+
},
|
|
706
|
+
"slice_lines": {
|
|
707
|
+
"function": _apply_slice_lines,
|
|
708
|
+
"accepts": [DataFormat.STRING],
|
|
709
|
+
"produces": DataFormat.STRING,
|
|
710
|
+
},
|
|
711
|
+
"grep": {
|
|
712
|
+
"function": _apply_grep,
|
|
713
|
+
"accepts": [DataFormat.STRING],
|
|
714
|
+
"produces": DataFormat.STRING,
|
|
715
|
+
},
|
|
716
|
+
"head": {
|
|
717
|
+
"function": _apply_head,
|
|
718
|
+
"accepts": [DataFormat.STRING],
|
|
719
|
+
"produces": DataFormat.STRING,
|
|
720
|
+
},
|
|
721
|
+
"tail": {
|
|
722
|
+
"function": _apply_tail,
|
|
723
|
+
"accepts": [DataFormat.STRING],
|
|
724
|
+
"produces": DataFormat.STRING,
|
|
725
|
+
},
|
|
726
|
+
"select_fields": {
|
|
727
|
+
"function": _apply_select_fields,
|
|
728
|
+
"accepts": [DataFormat.LIST_OF_DICTS],
|
|
729
|
+
"produces": DataFormat.LIST_OF_DICTS,
|
|
730
|
+
},
|
|
731
|
+
"apply_to_template": {
|
|
732
|
+
"function": _apply_template,
|
|
733
|
+
"accepts": [
|
|
734
|
+
DataFormat.JSON_OBJECT,
|
|
735
|
+
DataFormat.LIST_OF_DICTS,
|
|
736
|
+
DataFormat.STRING,
|
|
737
|
+
],
|
|
738
|
+
"produces": DataFormat.STRING,
|
|
739
|
+
},
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
def _parse_modifier_chain(
|
|
744
|
+
expression: str,
|
|
745
|
+
) -> Tuple[str, List[Tuple[str, str]], Optional[str]]:
|
|
746
|
+
"""
|
|
747
|
+
Parses the expression part of an artifact_content embed.
|
|
748
|
+
|
|
749
|
+
Separates the artifact specifier, modifier chain, and final format specifier.
|
|
750
|
+
|
|
751
|
+
Args:
|
|
752
|
+
expression: The full expression string after 'artifact_content:'.
|
|
753
|
+
|
|
754
|
+
Returns:
|
|
755
|
+
A tuple containing:
|
|
756
|
+
- artifact_spec (str): The filename and optional version (e.g., "data.csv:1").
|
|
757
|
+
- modifiers (List[Tuple[str, str]]): A list of (prefix, value) tuples for modifiers.
|
|
758
|
+
- output_format (Optional[str]): The final output format string (e.g., "text", "json").
|
|
759
|
+
Returns None if the format step is missing or invalid.
|
|
760
|
+
"""
|
|
761
|
+
from .constants import EMBED_CHAIN_DELIMITER
|
|
762
|
+
|
|
763
|
+
parts = expression.split(EMBED_CHAIN_DELIMITER)
|
|
764
|
+
if not parts:
|
|
765
|
+
return expression, [], None
|
|
766
|
+
|
|
767
|
+
artifact_spec = parts[0].strip()
|
|
768
|
+
modifiers = []
|
|
769
|
+
output_format = None
|
|
770
|
+
|
|
771
|
+
for i in range(1, len(parts)):
|
|
772
|
+
part = parts[i].strip()
|
|
773
|
+
if not part:
|
|
774
|
+
continue
|
|
775
|
+
|
|
776
|
+
if i == len(parts) - 1:
|
|
777
|
+
format_match = re.match(r"format:(.*)", part, re.DOTALL)
|
|
778
|
+
if format_match:
|
|
779
|
+
output_format = format_match.group(1).strip()
|
|
780
|
+
continue
|
|
781
|
+
|
|
782
|
+
modifier_parts = part.split(":", 1)
|
|
783
|
+
if len(modifier_parts) == 2:
|
|
784
|
+
prefix = modifier_parts[0].strip()
|
|
785
|
+
value = modifier_parts[1].strip()
|
|
786
|
+
if prefix and value:
|
|
787
|
+
modifiers.append((prefix, value))
|
|
788
|
+
else:
|
|
789
|
+
log.warning("Ignoring invalid modifier step format: '%s'", part)
|
|
790
|
+
else:
|
|
791
|
+
log.warning("Ignoring invalid modifier step format: '%s'", part)
|
|
792
|
+
|
|
793
|
+
return artifact_spec, modifiers, output_format
|