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
|
@@ -3,18 +3,30 @@ A stateful stream parser for identifying and extracting fenced artifact blocks
|
|
|
3
3
|
from an LLM's text stream.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
+
import logging
|
|
6
7
|
import re
|
|
7
8
|
from enum import Enum, auto
|
|
8
9
|
from dataclasses import dataclass, field
|
|
9
10
|
from typing import List, Dict, Any
|
|
10
11
|
|
|
12
|
+
from ...common.utils.embeds.constants import (
|
|
13
|
+
EMBED_DELIMITER_OPEN,
|
|
14
|
+
EMBED_DELIMITER_CLOSE,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
11
19
|
# --- Constants ---
|
|
12
20
|
# These are duplicated from callbacks for now to keep the parser self-contained.
|
|
13
21
|
# They should eventually live in a shared constants module.
|
|
14
22
|
ARTIFACT_BLOCK_DELIMITER_OPEN = "«««"
|
|
15
23
|
ARTIFACT_BLOCK_DELIMITER_CLOSE = "»»»"
|
|
16
|
-
# The full
|
|
17
|
-
|
|
24
|
+
# The full sequences that must be matched to start a block.
|
|
25
|
+
SAVE_ARTIFACT_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}save_artifact:"
|
|
26
|
+
TEMPLATE_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}template:"
|
|
27
|
+
TEMPLATE_LIQUID_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}template_liquid:"
|
|
28
|
+
# For backward compatibility
|
|
29
|
+
BLOCK_START_SEQUENCE = SAVE_ARTIFACT_START_SEQUENCE
|
|
18
30
|
# Regex to parse parameters from a confirmed start line.
|
|
19
31
|
PARAMS_REGEX = re.compile(r'(\w+)\s*=\s*"(.*?)"')
|
|
20
32
|
|
|
@@ -46,6 +58,7 @@ class BlockStartedEvent(ParserEvent):
|
|
|
46
58
|
class BlockProgressedEvent(ParserEvent):
|
|
47
59
|
"""Emitted periodically while content is being buffered for a block."""
|
|
48
60
|
|
|
61
|
+
params: Dict[str, Any]
|
|
49
62
|
buffered_size: int
|
|
50
63
|
chunk: str
|
|
51
64
|
|
|
@@ -65,6 +78,21 @@ class BlockInvalidatedEvent(ParserEvent):
|
|
|
65
78
|
rolled_back_text: str
|
|
66
79
|
|
|
67
80
|
|
|
81
|
+
@dataclass
|
|
82
|
+
class TemplateBlockStartedEvent(ParserEvent):
|
|
83
|
+
"""Emitted when a template block's start is confirmed."""
|
|
84
|
+
|
|
85
|
+
params: Dict[str, Any]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class TemplateBlockCompletedEvent(ParserEvent):
|
|
90
|
+
"""Emitted when a template block is successfully closed."""
|
|
91
|
+
|
|
92
|
+
params: Dict[str, Any]
|
|
93
|
+
template_content: str
|
|
94
|
+
|
|
95
|
+
|
|
68
96
|
@dataclass
|
|
69
97
|
class ParserResult:
|
|
70
98
|
"""The result of processing a single text chunk."""
|
|
@@ -92,6 +120,14 @@ class FencedBlockStreamParser:
|
|
|
92
120
|
self._block_params: Dict[str, Any] = {}
|
|
93
121
|
self._progress_update_interval = progress_update_interval_bytes
|
|
94
122
|
self._last_progress_update_size = 0
|
|
123
|
+
self._last_progress_chunk_end = 0 # Character position in buffer where last chunk ended
|
|
124
|
+
# Track block type and nesting for template handling
|
|
125
|
+
self._current_block_type: str = None # "save_artifact" or "template"
|
|
126
|
+
self._nesting_depth = 0 # Track if we're inside a block
|
|
127
|
+
self._previous_state: ParserState = None # Track state before POTENTIAL_BLOCK
|
|
128
|
+
# Safety limit: force emission after this many pending bytes (to handle unclosed embeds)
|
|
129
|
+
# Use minimum of 8KB to handle long templates/embeds
|
|
130
|
+
self._max_pending_bytes = max(progress_update_interval_bytes * 4, 8192) # Min 8KB
|
|
95
131
|
|
|
96
132
|
def _reset_state(self):
|
|
97
133
|
"""Resets the parser to its initial IDLE state."""
|
|
@@ -100,6 +136,36 @@ class FencedBlockStreamParser:
|
|
|
100
136
|
self._artifact_buffer = ""
|
|
101
137
|
self._block_params = {}
|
|
102
138
|
self._last_progress_update_size = 0
|
|
139
|
+
self._last_progress_chunk_end = 0
|
|
140
|
+
self._current_block_type = None
|
|
141
|
+
self._nesting_depth = 0
|
|
142
|
+
self._previous_state = None
|
|
143
|
+
|
|
144
|
+
def _is_safe_to_emit_chunk(self) -> bool:
|
|
145
|
+
"""
|
|
146
|
+
Check if current buffer position is safe for chunking (not inside an embed).
|
|
147
|
+
|
|
148
|
+
Looks at the content since the last chunk emission to see if there's an
|
|
149
|
+
unclosed embed delimiter. If so, waits until the embed is closed before emitting.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
True if safe to emit chunk (no partial embeds), False otherwise.
|
|
153
|
+
"""
|
|
154
|
+
# Check the portion of buffer we're about to emit
|
|
155
|
+
buffer_to_check = self._artifact_buffer[self._last_progress_chunk_end:]
|
|
156
|
+
|
|
157
|
+
# Find last occurrence of opening delimiter
|
|
158
|
+
last_open = buffer_to_check.rfind(EMBED_DELIMITER_OPEN)
|
|
159
|
+
|
|
160
|
+
if last_open == -1:
|
|
161
|
+
# No embed delimiter found in this portion
|
|
162
|
+
return True
|
|
163
|
+
|
|
164
|
+
# Found an opening delimiter - check if it's closed
|
|
165
|
+
last_close = buffer_to_check.rfind(EMBED_DELIMITER_CLOSE, last_open)
|
|
166
|
+
|
|
167
|
+
# Safe only if there's a closing delimiter after the opening one
|
|
168
|
+
return last_close > last_open
|
|
103
169
|
|
|
104
170
|
def process_chunk(self, text_chunk: str) -> ParserResult:
|
|
105
171
|
"""
|
|
@@ -141,14 +207,28 @@ class FencedBlockStreamParser:
|
|
|
141
207
|
events.append(BlockInvalidatedEvent(rolled_back_text=rolled_back_text))
|
|
142
208
|
elif self._state == ParserState.IN_BLOCK:
|
|
143
209
|
# The turn ended while inside a block. This is an error/failure.
|
|
144
|
-
# The orchestrator (callback) will see this and know to fail the artifact.
|
|
145
|
-
# We emit
|
|
210
|
+
# The orchestrator (callback) will see this and know to fail the artifact/template.
|
|
211
|
+
# We emit the appropriate completion event so the orchestrator knows what was buffered.
|
|
146
212
|
# The orchestrator is responsible for interpreting this as a failure.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
)
|
|
213
|
+
log.warning(
|
|
214
|
+
"[StreamParser] finalize() found unterminated block! Type: %s, buffer length: %d, nesting_depth: %d",
|
|
215
|
+
self._current_block_type,
|
|
216
|
+
len(self._artifact_buffer),
|
|
217
|
+
self._nesting_depth,
|
|
151
218
|
)
|
|
219
|
+
if self._current_block_type == "template":
|
|
220
|
+
events.append(
|
|
221
|
+
TemplateBlockCompletedEvent(
|
|
222
|
+
params=self._block_params,
|
|
223
|
+
template_content=self._artifact_buffer,
|
|
224
|
+
)
|
|
225
|
+
)
|
|
226
|
+
else:
|
|
227
|
+
events.append(
|
|
228
|
+
BlockCompletedEvent(
|
|
229
|
+
params=self._block_params, content=self._artifact_buffer
|
|
230
|
+
)
|
|
231
|
+
)
|
|
152
232
|
|
|
153
233
|
self._reset_state()
|
|
154
234
|
return ParserResult("".join(user_text_parts), events)
|
|
@@ -156,6 +236,7 @@ class FencedBlockStreamParser:
|
|
|
156
236
|
def _process_idle(self, char: str, user_text_parts: List[str]):
|
|
157
237
|
"""State handler for when the parser is outside any block."""
|
|
158
238
|
if char == BLOCK_START_SEQUENCE[0]:
|
|
239
|
+
self._previous_state = ParserState.IDLE
|
|
159
240
|
self._state = ParserState.POTENTIAL_BLOCK
|
|
160
241
|
self._speculative_buffer += char
|
|
161
242
|
else:
|
|
@@ -167,55 +248,168 @@ class FencedBlockStreamParser:
|
|
|
167
248
|
"""State handler for when a block might be starting."""
|
|
168
249
|
self._speculative_buffer += char
|
|
169
250
|
|
|
170
|
-
#
|
|
171
|
-
|
|
251
|
+
# Check if we match save_artifact or template start sequences
|
|
252
|
+
matched_sequence = None
|
|
253
|
+
matched_type = None
|
|
254
|
+
|
|
255
|
+
if self._speculative_buffer.startswith(SAVE_ARTIFACT_START_SEQUENCE):
|
|
256
|
+
matched_sequence = SAVE_ARTIFACT_START_SEQUENCE
|
|
257
|
+
matched_type = "save_artifact"
|
|
258
|
+
elif self._speculative_buffer.startswith(TEMPLATE_LIQUID_START_SEQUENCE):
|
|
259
|
+
matched_sequence = TEMPLATE_LIQUID_START_SEQUENCE
|
|
260
|
+
matched_type = "template"
|
|
261
|
+
elif self._speculative_buffer.startswith(TEMPLATE_START_SEQUENCE):
|
|
262
|
+
matched_sequence = TEMPLATE_START_SEQUENCE
|
|
263
|
+
matched_type = "template"
|
|
264
|
+
|
|
265
|
+
if matched_sequence:
|
|
172
266
|
if char == "\n":
|
|
173
267
|
# We found the newline, the block is officially started.
|
|
268
|
+
|
|
269
|
+
# If we're already inside a save_artifact block and this is a template,
|
|
270
|
+
# we need to pass it through as literal text (preserve nesting)
|
|
271
|
+
if self._nesting_depth > 0 and matched_type == "template":
|
|
272
|
+
# Preserve template literally inside artifact
|
|
273
|
+
self._artifact_buffer += self._speculative_buffer
|
|
274
|
+
# Increment nesting depth so we know to skip the next »»»
|
|
275
|
+
# (it will close the nested template, not the outer artifact)
|
|
276
|
+
self._nesting_depth += 1
|
|
277
|
+
# Don't reset state! We're still inside the save_artifact block.
|
|
278
|
+
# Just clear the speculative buffer and stay IN_BLOCK to continue
|
|
279
|
+
# buffering the rest of the artifact content.
|
|
280
|
+
self._speculative_buffer = ""
|
|
281
|
+
self._state = ParserState.IN_BLOCK
|
|
282
|
+
return
|
|
283
|
+
|
|
174
284
|
self._state = ParserState.IN_BLOCK
|
|
285
|
+
self._current_block_type = matched_type
|
|
286
|
+
self._nesting_depth += 1
|
|
287
|
+
|
|
175
288
|
# Extract the parameters string between the start sequence and the newline
|
|
176
|
-
params_str = self._speculative_buffer[len(
|
|
289
|
+
params_str = self._speculative_buffer[len(matched_sequence) : -1]
|
|
177
290
|
self._block_params = dict(PARAMS_REGEX.findall(params_str))
|
|
178
|
-
|
|
291
|
+
|
|
292
|
+
if matched_type == "save_artifact":
|
|
293
|
+
events.append(BlockStartedEvent(params=self._block_params))
|
|
294
|
+
elif matched_type == "template":
|
|
295
|
+
events.append(TemplateBlockStartedEvent(params=self._block_params))
|
|
296
|
+
|
|
179
297
|
self._speculative_buffer = "" # Clear buffer, we are done with it.
|
|
180
298
|
# else, we are still buffering the parameters line.
|
|
181
299
|
return
|
|
182
300
|
|
|
183
|
-
# If we are still building up
|
|
184
|
-
if
|
|
301
|
+
# If we are still building up a start sequence (could be either)
|
|
302
|
+
if (SAVE_ARTIFACT_START_SEQUENCE.startswith(self._speculative_buffer) or
|
|
303
|
+
TEMPLATE_LIQUID_START_SEQUENCE.startswith(self._speculative_buffer) or
|
|
304
|
+
TEMPLATE_START_SEQUENCE.startswith(self._speculative_buffer)):
|
|
185
305
|
# It's still a potential match. Continue buffering.
|
|
186
306
|
return
|
|
187
307
|
|
|
188
308
|
# If we've reached here, the sequence is invalid.
|
|
189
309
|
# Rollback: The sequence was invalid.
|
|
190
310
|
rolled_back_text = self._speculative_buffer
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
311
|
+
|
|
312
|
+
# Check if we were IN_BLOCK before transitioning to POTENTIAL_BLOCK
|
|
313
|
+
# If so, add the rolled-back text to the artifact buffer, not user-visible text
|
|
314
|
+
if self._previous_state == ParserState.IN_BLOCK:
|
|
315
|
+
log.debug(
|
|
316
|
+
"[StreamParser] Invalid sequence '%s' detected while IN_BLOCK. Adding to artifact buffer.",
|
|
317
|
+
repr(rolled_back_text),
|
|
318
|
+
)
|
|
319
|
+
self._artifact_buffer += rolled_back_text
|
|
320
|
+
self._speculative_buffer = ""
|
|
321
|
+
self._state = ParserState.IN_BLOCK
|
|
322
|
+
# Don't emit BlockInvalidatedEvent - this is just normal artifact content
|
|
323
|
+
else:
|
|
324
|
+
# We were IDLE, so this is user-facing text
|
|
325
|
+
user_text_parts.append(rolled_back_text)
|
|
326
|
+
events.append(BlockInvalidatedEvent(rolled_back_text=rolled_back_text))
|
|
327
|
+
self._speculative_buffer = ""
|
|
328
|
+
self._state = ParserState.IDLE
|
|
329
|
+
|
|
330
|
+
self._previous_state = None
|
|
194
331
|
|
|
195
332
|
def _process_in_block(self, char: str, events: List[ParserEvent]):
|
|
196
333
|
"""State handler for when the parser is inside a block, buffering content."""
|
|
334
|
+
# Check if this might be the start of a nested block
|
|
335
|
+
if char == BLOCK_START_SEQUENCE[0]:
|
|
336
|
+
# This might be the start of a nested template block
|
|
337
|
+
# Transition to POTENTIAL_BLOCK to check
|
|
338
|
+
self._previous_state = ParserState.IN_BLOCK
|
|
339
|
+
self._state = ParserState.POTENTIAL_BLOCK
|
|
340
|
+
self._speculative_buffer += char
|
|
341
|
+
return
|
|
342
|
+
|
|
197
343
|
self._artifact_buffer += char
|
|
198
344
|
|
|
199
345
|
# Check for the closing delimiter
|
|
200
346
|
if self._artifact_buffer.endswith(ARTIFACT_BLOCK_DELIMITER_CLOSE):
|
|
201
|
-
#
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (
|
|
213
|
-
current_size - self._last_progress_update_size
|
|
214
|
-
) >= self._progress_update_interval:
|
|
215
|
-
new_chunk = self._artifact_buffer[
|
|
216
|
-
self._last_progress_update_size : current_size
|
|
347
|
+
# Check if this is closing a nested block or the current block
|
|
348
|
+
if self._nesting_depth > 1:
|
|
349
|
+
# This »»» is closing a nested template block, not the outer save_artifact
|
|
350
|
+
# Keep it in the buffer and just decrement nesting
|
|
351
|
+
self._nesting_depth -= 1
|
|
352
|
+
# Don't emit events, don't strip the delimiter, just continue buffering
|
|
353
|
+
else:
|
|
354
|
+
# This is closing the outermost block (nesting_depth == 1)
|
|
355
|
+
# Block is complete.
|
|
356
|
+
final_content = self._artifact_buffer[
|
|
357
|
+
: -len(ARTIFACT_BLOCK_DELIMITER_CLOSE)
|
|
217
358
|
]
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
359
|
+
|
|
360
|
+
# Emit the appropriate completion event based on block type
|
|
361
|
+
if self._current_block_type == "template":
|
|
362
|
+
events.append(
|
|
363
|
+
TemplateBlockCompletedEvent(
|
|
364
|
+
params=self._block_params, template_content=final_content
|
|
365
|
+
)
|
|
366
|
+
)
|
|
367
|
+
else:
|
|
368
|
+
# Default to save_artifact behavior
|
|
369
|
+
events.append(
|
|
370
|
+
BlockCompletedEvent(
|
|
371
|
+
params=self._block_params, content=final_content
|
|
372
|
+
)
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
# Decrement nesting depth
|
|
376
|
+
self._nesting_depth = max(0, self._nesting_depth - 1)
|
|
377
|
+
self._reset_state()
|
|
378
|
+
else:
|
|
379
|
+
# Check if we should emit a progress update (only for save_artifact blocks)
|
|
380
|
+
if self._current_block_type == "save_artifact":
|
|
381
|
+
# Calculate current total size in bytes (for threshold check)
|
|
382
|
+
current_size_bytes = len(self._artifact_buffer.encode("utf-8"))
|
|
383
|
+
|
|
384
|
+
# Check if we've accumulated enough new bytes since last update
|
|
385
|
+
bytes_since_last = current_size_bytes - self._last_progress_update_size
|
|
386
|
+
if bytes_since_last >= self._progress_update_interval:
|
|
387
|
+
# Check if it's safe to emit (not inside an embed)
|
|
388
|
+
# OR force emit if we've exceeded safety limit (very long unclosed embed)
|
|
389
|
+
force_emit = bytes_since_last >= self._max_pending_bytes
|
|
390
|
+
|
|
391
|
+
if force_emit:
|
|
392
|
+
log.warning(
|
|
393
|
+
"[StreamParser] Forcing chunk emission due to safety limit (%d bytes pending). "
|
|
394
|
+
"Possible unclosed embed or very long embed.",
|
|
395
|
+
bytes_since_last
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
if self._is_safe_to_emit_chunk() or force_emit:
|
|
399
|
+
# Extract all new content since last progress update
|
|
400
|
+
# Slice by character position (not bytes) to avoid UTF-8 issues
|
|
401
|
+
current_char_position = len(self._artifact_buffer)
|
|
402
|
+
new_chunk = self._artifact_buffer[self._last_progress_chunk_end:]
|
|
403
|
+
|
|
404
|
+
events.append(
|
|
405
|
+
BlockProgressedEvent(
|
|
406
|
+
params=self._block_params,
|
|
407
|
+
buffered_size=current_size_bytes, # Total bytes accumulated so far
|
|
408
|
+
chunk=new_chunk, # All new content since last update
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Update tracking: character position for slicing, bytes for threshold
|
|
413
|
+
self._last_progress_chunk_end = current_char_position
|
|
414
|
+
self._last_progress_update_size = current_size_bytes
|
|
415
|
+
# else: wait for embed to close before emitting
|
|
@@ -15,6 +15,7 @@ from ...common.utils.embeds import (
|
|
|
15
15
|
LATE_EMBED_TYPES,
|
|
16
16
|
EMBED_DELIMITER_OPEN,
|
|
17
17
|
)
|
|
18
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
18
19
|
|
|
19
20
|
log = logging.getLogger(__name__)
|
|
20
21
|
|
|
@@ -102,6 +103,7 @@ class ADKToolWrapper:
|
|
|
102
103
|
context=context_for_embeds,
|
|
103
104
|
resolver_func=evaluate_embed,
|
|
104
105
|
types_to_resolve=self._types_to_resolve,
|
|
106
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
105
107
|
log_identifier=log_identifier,
|
|
106
108
|
config=self._tool_config,
|
|
107
109
|
)
|
|
@@ -123,6 +125,7 @@ class ADKToolWrapper:
|
|
|
123
125
|
context=context_for_embeds,
|
|
124
126
|
resolver_func=evaluate_embed,
|
|
125
127
|
types_to_resolve=self._types_to_resolve,
|
|
128
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
126
129
|
log_identifier=log_identifier,
|
|
127
130
|
config=self._tool_config,
|
|
128
131
|
)
|