solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.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.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- 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 +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/app.py +3 -2
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.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/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.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/da0b5bad.b62f7b08.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/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- 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 +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- 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 +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- 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 +23 -19
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- 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 +112 -87
- 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 +87 -64
- 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 +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- 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 +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- 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/a2a/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -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/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
- 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/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- 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 +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- 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.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- 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 +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -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 +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- 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/session_repository.py +177 -11
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- 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/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
- 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 +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- 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/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -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 +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -336
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
|
+
import warnings
|
|
4
5
|
from datetime import datetime, timezone
|
|
5
6
|
import traceback
|
|
6
7
|
|
|
@@ -8,9 +9,28 @@ import traceback
|
|
|
8
9
|
class DatadogJsonFormatter(logging.Formatter):
|
|
9
10
|
"""
|
|
10
11
|
Custom formatter to output logs in Datadog-compatible JSON format.
|
|
12
|
+
|
|
13
|
+
. deprecated::
|
|
14
|
+
This formatter is deprecated. Please use pythonjsonlogger.json.JsonFormatter instead.
|
|
15
|
+
For details, consult https://solacelabs.github.io/solace-agent-mesh/docs/documentation/deploying/logging#structured-logging
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
formatters:
|
|
19
|
+
jsonFormatter:
|
|
20
|
+
"()": pythonjsonlogger.json.JsonFormatter
|
|
21
|
+
format: "%(timestamp)s %(levelname)s %(threadName)s %(name)s %(message)s"
|
|
11
22
|
"""
|
|
12
23
|
|
|
13
24
|
def format(self, record):
|
|
25
|
+
# Emit deprecation warning once
|
|
26
|
+
if not hasattr(self.__class__, '_deprecation_warned'):
|
|
27
|
+
warnings.warn(
|
|
28
|
+
"DatadogJsonFormatter is deprecated and will be removed in a future version. "
|
|
29
|
+
"Please use pythonjsonlogger.json.JsonFormatter instead. For details, consult https://solacelabs.github.io/solace-agent-mesh/docs/documentation/deploying/logging#structured-logging",
|
|
30
|
+
DeprecationWarning,
|
|
31
|
+
stacklevel=2
|
|
32
|
+
)
|
|
33
|
+
self.__class__._deprecation_warned = True
|
|
14
34
|
log_entry = {
|
|
15
35
|
"timestamp": datetime.fromtimestamp(
|
|
16
36
|
record.created, tz=timezone.utc
|
|
@@ -23,6 +23,8 @@ _TEXT_BASED_SUBTYPE_WHOLE = {
|
|
|
23
23
|
"json",
|
|
24
24
|
"xml",
|
|
25
25
|
"yaml",
|
|
26
|
+
"x-yaml",
|
|
27
|
+
"yml",
|
|
26
28
|
"csv",
|
|
27
29
|
"javascript",
|
|
28
30
|
"ecmascript",
|
|
@@ -48,6 +50,7 @@ _TEXT_BASED_SUBTYPE_SUFFIXES_AFTER_PLUS = {
|
|
|
48
50
|
"xhtml",
|
|
49
51
|
}
|
|
50
52
|
|
|
53
|
+
|
|
51
54
|
def is_text_based_mime_type(mime_type: Optional[str]) -> bool:
|
|
52
55
|
"""
|
|
53
56
|
Checks if a given MIME type is considered text-based.
|
|
@@ -72,7 +75,9 @@ def is_text_based_mime_type(mime_type: Optional[str]) -> bool:
|
|
|
72
75
|
return False
|
|
73
76
|
|
|
74
77
|
|
|
75
|
-
def is_text_based_file(
|
|
78
|
+
def is_text_based_file(
|
|
79
|
+
mime_type: Optional[str], content_bytes: Optional[bytes] = None
|
|
80
|
+
) -> bool:
|
|
76
81
|
"""
|
|
77
82
|
Determines if a file is text-based based on its MIME type and content.
|
|
78
83
|
Args:
|
|
@@ -83,10 +88,10 @@ def is_text_based_file(mime_type: Optional[str], content_bytes: Optional[bytes]
|
|
|
83
88
|
"""
|
|
84
89
|
if not mime_type:
|
|
85
90
|
return False
|
|
86
|
-
|
|
91
|
+
|
|
87
92
|
normalized_mime_type = mime_type.lower().strip()
|
|
88
93
|
primary_type, _, subtype = normalized_mime_type.partition("/")
|
|
89
|
-
|
|
94
|
+
|
|
90
95
|
if primary_type in _TEXT_BASED_PRIMARY_TYPES:
|
|
91
96
|
return True
|
|
92
97
|
elif subtype in _TEXT_BASED_SUBTYPE_WHOLE:
|
|
@@ -95,14 +100,16 @@ def is_text_based_file(mime_type: Optional[str], content_bytes: Optional[bytes]
|
|
|
95
100
|
specific_format = subtype.split("+")[-1]
|
|
96
101
|
if specific_format in _TEXT_BASED_SUBTYPE_SUFFIXES_AFTER_PLUS:
|
|
97
102
|
return True
|
|
98
|
-
elif
|
|
103
|
+
elif (
|
|
104
|
+
normalized_mime_type == "application/octet-stream" and content_bytes is not None
|
|
105
|
+
):
|
|
99
106
|
try:
|
|
100
107
|
sample_size = min(1024, len(content_bytes))
|
|
101
108
|
content_bytes[:sample_size].decode("utf-8")
|
|
102
109
|
return True
|
|
103
110
|
except UnicodeDecodeError:
|
|
104
111
|
return False
|
|
105
|
-
|
|
112
|
+
|
|
106
113
|
return False
|
|
107
114
|
|
|
108
115
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Provides a Pydantic BaseModel for SAM configuration with dict-like access."""
|
|
2
|
-
from pydantic import BaseModel
|
|
3
|
-
from typing import Any,
|
|
2
|
+
from pydantic import BaseModel, ValidationError
|
|
3
|
+
from typing import Any, TypeVar, Union, get_args, get_origin
|
|
4
|
+
from types import UnionType
|
|
4
5
|
|
|
5
6
|
T = TypeVar("T", bound="SamConfigBase")
|
|
6
7
|
|
|
@@ -13,7 +14,7 @@ class SamConfigBase(BaseModel):
|
|
|
13
14
|
"""
|
|
14
15
|
|
|
15
16
|
@classmethod
|
|
16
|
-
def model_validate_and_clean(cls:
|
|
17
|
+
def model_validate_and_clean(cls: type[T], obj: Any) -> T:
|
|
17
18
|
"""
|
|
18
19
|
Validates a dictionary, first removing any keys with None values.
|
|
19
20
|
This allows Pydantic's default values to be applied correctly when
|
|
@@ -24,6 +25,92 @@ class SamConfigBase(BaseModel):
|
|
|
24
25
|
return cls.model_validate(cleaned_obj)
|
|
25
26
|
return cls.model_validate(obj)
|
|
26
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
|
+
|
|
27
114
|
def get(self, key: str, default: Any = None) -> Any:
|
|
28
115
|
"""Provides dict-like .get() method."""
|
|
29
116
|
return getattr(self, key, 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
|
|
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
|
|
@@ -19,6 +19,8 @@ INIT_DEFAULT = {
|
|
|
19
19
|
"webui_fastapi_host": "127.0.0.1",
|
|
20
20
|
"webui_fastapi_port": 8000,
|
|
21
21
|
"webui_enable_embed_resolution": True,
|
|
22
|
+
"platform_api_host": "127.0.0.1",
|
|
23
|
+
"platform_api_port": 8001,
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
USE_DEFAULT_SHARED_SESSION = "use_default_shared_session"
|
|
@@ -71,6 +73,16 @@ GATEWAY_DEFAULTS = {
|
|
|
71
73
|
),
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
PROXY_DEFAULTS = {
|
|
77
|
+
"namespace": "${NAMESPACE}",
|
|
78
|
+
"artifact_service_type": "filesystem",
|
|
79
|
+
"artifact_service_base_path": "/tmp/samv2",
|
|
80
|
+
"artifact_service_scope": "namespace",
|
|
81
|
+
"artifact_handling_mode": "reference",
|
|
82
|
+
"discovery_interval_seconds": 5,
|
|
83
|
+
"proxied_agents": [],
|
|
84
|
+
}
|
|
85
|
+
|
|
74
86
|
|
|
75
87
|
port_55555 = "-p 55554:55555" if sys.platform == "darwin" else "-p 55555:55555"
|
|
76
88
|
|