solace-agent-mesh 0.2.4__py3-none-any.whl → 1.0.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/__init__.py +5 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/callbacks.py +1716 -0
- solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
- solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
- solace_agent_mesh/agent/adk/runner.py +357 -0
- solace_agent_mesh/agent/adk/services.py +240 -0
- solace_agent_mesh/agent/adk/setup.py +751 -0
- solace_agent_mesh/agent/adk/stream_parser.py +214 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
- solace_agent_mesh/agent/agent_llm.txt +41 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +1444 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
- solace_agent_mesh/agent/sac/app.py +640 -0
- solace_agent_mesh/agent/sac/component.py +3496 -0
- solace_agent_mesh/agent/sac/patch_adk.py +111 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +185 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
- solace_agent_mesh/agent/tools/__init__.py +14 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +571 -0
- solace_agent_mesh/agent/tools/image_tools.py +1184 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +290 -0
- solace_agent_mesh/agent/tools/registry.py +36 -0
- solace_agent_mesh/agent/tools/test_tools.py +135 -0
- solace_agent_mesh/agent/tools/tool_definition.py +45 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
- solace_agent_mesh/agent/tools/web_tools.py +381 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
- solace_agent_mesh/agent/utils/config_parser.py +47 -0
- solace_agent_mesh/agent/utils/context_helpers.py +60 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f897a61a.f8c53b0f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d5133813.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +77 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1754075282978.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1754075282978.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +205 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +407 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +139 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +158 -0
- solace_agent_mesh/cli/main.py +17 -294
- solace_agent_mesh/cli/utils.py +135 -204
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-D11Lmy9p.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Gfk3BYn5.js +663 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a_protocol.py +564 -0
- solace_agent_mesh/common/agent_registry.py +42 -0
- solace_agent_mesh/common/client/__init__.py +4 -0
- solace_agent_mesh/common/client/card_resolver.py +21 -0
- solace_agent_mesh/common/client/client.py +85 -0
- solace_agent_mesh/common/client/client_llm.txt +133 -0
- solace_agent_mesh/common/common_llm.txt +144 -0
- solace_agent_mesh/common/constants.py +1 -14
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +130 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/registry.py +125 -0
- solace_agent_mesh/common/server/__init__.py +4 -0
- solace_agent_mesh/common/server/server.py +122 -0
- solace_agent_mesh/common/server/server_llm.txt +169 -0
- solace_agent_mesh/common/server/task_manager.py +291 -0
- solace_agent_mesh/common/server/utils.py +28 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +162 -0
- solace_agent_mesh/common/services/identity_service.py +129 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
- solace_agent_mesh/common/services/services_llm.txt +132 -0
- solace_agent_mesh/common/types.py +411 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +55 -0
- solace_agent_mesh/common/utils/embeds/converter.py +452 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
- solace_agent_mesh/common/utils/embeds/types.py +14 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +51 -0
- solace_agent_mesh/common/utils/log_formatters.py +44 -0
- solace_agent_mesh/common/utils/mime_helpers.py +106 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
- solace_agent_mesh/common/utils/utils_llm.txt +67 -0
- solace_agent_mesh/config_portal/backend/common.py +66 -24
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +164 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
- solace_agent_mesh/config_portal/backend/server.py +551 -181
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-_7yox_eh.js +48 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-e5c3acfe.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
- solace_agent_mesh/core_a2a/service.py +331 -0
- solace_agent_mesh/evaluation/config_loader.py +657 -0
- solace_agent_mesh/evaluation/evaluator.py +667 -0
- solace_agent_mesh/evaluation/message_organizer.py +568 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +972 -0
- solace_agent_mesh/evaluation/report_generator.py +613 -0
- solace_agent_mesh/evaluation/run.py +613 -0
- solace_agent_mesh/evaluation/subscriber.py +872 -0
- solace_agent_mesh/evaluation/summary_builder.py +775 -0
- solace_agent_mesh/evaluation/test_case_loader.py +714 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +266 -0
- solace_agent_mesh/gateway/base/base_llm.txt +119 -0
- solace_agent_mesh/gateway/base/component.py +1542 -0
- solace_agent_mesh/gateway/base/task_context.py +74 -0
- solace_agent_mesh/gateway/gateway_llm.txt +125 -0
- solace_agent_mesh/gateway/http_sse/app.py +190 -0
- solace_agent_mesh/gateway/http_sse/component.py +1602 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
- solace_agent_mesh/gateway/http_sse/main.py +442 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +827 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +73 -0
- solace_agent_mesh/templates/gateway_component_template.py +431 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
- solace_agent_mesh/templates/logging_config_template.ini +64 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
- solace_agent_mesh/templates/plugin_readme_template.md +34 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +66 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +53 -0
- solace_agent_mesh-1.0.2.dist-info/METADATA +432 -0
- solace_agent_mesh-1.0.2.dist-info/RECORD +361 -0
- solace_agent_mesh-1.0.2.dist-info/entry_points.txt +3 -0
- {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/licenses/LICENSE +1 -1
- solace_agent_mesh/agents/base_agent_component.py +0 -256
- solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
- solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
- solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
- solace_agent_mesh/agents/global/actions/create_file.py +0 -70
- solace_agent_mesh/agents/global/actions/error_action.py +0 -45
- solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
- solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
- solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
- solace_agent_mesh/agents/global/global_agent_component.py +0 -38
- solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
- solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
- solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
- solace_agent_mesh/agents/slack/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
- solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
- solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
- solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
- solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
- solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
- solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
- solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
- solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
- solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
- solace_agent_mesh/assets/web-visualizer/index.html +0 -14
- solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
- solace_agent_mesh/cli/commands/add/__init__.py +0 -3
- solace_agent_mesh/cli/commands/add/add.py +0 -88
- solace_agent_mesh/cli/commands/add/agent.py +0 -110
- solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
- solace_agent_mesh/cli/commands/add/gateway.py +0 -374
- solace_agent_mesh/cli/commands/build.py +0 -670
- solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
- solace_agent_mesh/cli/commands/chat/chat.py +0 -361
- solace_agent_mesh/cli/commands/config.py +0 -29
- solace_agent_mesh/cli/commands/init/__init__.py +0 -3
- solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
- solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
- solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
- solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
- solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
- solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
- solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
- solace_agent_mesh/cli/commands/init/init.py +0 -92
- solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
- solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
- solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
- solace_agent_mesh/cli/commands/plugin/add.py +0 -100
- solace_agent_mesh/cli/commands/plugin/build.py +0 -268
- solace_agent_mesh/cli/commands/plugin/create.py +0 -117
- solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
- solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
- solace_agent_mesh/cli/commands/run.py +0 -68
- solace_agent_mesh/cli/commands/visualizer.py +0 -138
- solace_agent_mesh/cli/config.py +0 -85
- solace_agent_mesh/common/action.py +0 -91
- solace_agent_mesh/common/action_list.py +0 -37
- solace_agent_mesh/common/action_response.py +0 -340
- solace_agent_mesh/common/mysql_database.py +0 -40
- solace_agent_mesh/common/postgres_database.py +0 -85
- solace_agent_mesh/common/prompt_templates.py +0 -28
- solace_agent_mesh/common/stimulus_utils.py +0 -152
- solace_agent_mesh/common/time.py +0 -24
- solace_agent_mesh/common/utils.py +0 -712
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
- solace_agent_mesh/configs/agent_global.yaml +0 -74
- solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
- solace_agent_mesh/configs/agent_slack.yaml +0 -64
- solace_agent_mesh/configs/agent_web_request.yaml +0 -75
- solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
- solace_agent_mesh/configs/error_catcher.yaml +0 -56
- solace_agent_mesh/configs/monitor.yaml +0 -0
- solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
- solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
- solace_agent_mesh/configs/orchestrator.yaml +0 -241
- solace_agent_mesh/configs/service_embedding.yaml +0 -81
- solace_agent_mesh/configs/service_llm.yaml +0 -265
- solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
- solace_agent_mesh/gateway/components/gateway_base.py +0 -47
- solace_agent_mesh/gateway/components/gateway_input.py +0 -278
- solace_agent_mesh/gateway/components/gateway_output.py +0 -298
- solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
- solace_agent_mesh/gateway/identity/identity_base.py +0 -10
- solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
- solace_agent_mesh/gateway/identity/no_identity.py +0 -9
- solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
- solace_agent_mesh/monitors/base_monitor_component.py +0 -26
- solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
- solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
- solace_agent_mesh/orchestrator/__init__.py +0 -0
- solace_agent_mesh/orchestrator/action_manager.py +0 -237
- solace_agent_mesh/orchestrator/components/__init__.py +0 -0
- solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
- solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
- solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
- solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
- solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
- solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
- solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
- solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
- solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
- solace_agent_mesh/services/common/__init__.py +0 -4
- solace_agent_mesh/services/common/auto_expiry.py +0 -45
- solace_agent_mesh/services/common/singleton.py +0 -18
- solace_agent_mesh/services/file_service/__init__.py +0 -14
- solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
- solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
- solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
- solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
- solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
- solace_agent_mesh/services/file_service/file_service.py +0 -437
- solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
- solace_agent_mesh/services/file_service/file_transformations.py +0 -141
- solace_agent_mesh/services/file_service/file_utils.py +0 -324
- solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
- solace_agent_mesh/services/history_service/__init__.py +0 -3
- solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
- solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
- solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
- solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
- solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
- solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
- solace_agent_mesh/services/history_service/history_service.py +0 -413
- solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
- solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
- solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
- solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
- solace_agent_mesh/services/middleware_service/__init__.py +0 -0
- solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
- solace_agent_mesh/templates/action.py +0 -38
- solace_agent_mesh/templates/agent.py +0 -29
- solace_agent_mesh/templates/agent.yaml +0 -70
- solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
- solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
- solace_agent_mesh/templates/gateway-flows.yaml +0 -78
- solace_agent_mesh/templates/gateway-header.yaml +0 -16
- solace_agent_mesh/templates/gateway_base.py +0 -15
- solace_agent_mesh/templates/gateway_input.py +0 -98
- solace_agent_mesh/templates/gateway_output.py +0 -71
- solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
- solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
- solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
- solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
- solace_agent_mesh/templates/slack-default-config.yaml +0 -16
- solace_agent_mesh/templates/slack-flows.yaml +0 -81
- solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
- solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
- solace_agent_mesh/templates/web-default-config.yaml +0 -10
- solace_agent_mesh/templates/web-flows.yaml +0 -76
- solace_agent_mesh/tools/__init__.py +0 -0
- solace_agent_mesh/tools/components/__init__.py +0 -0
- solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
- solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
- solace_agent_mesh/tools/config/runtime_config.py +0 -26
- solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
- solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
- solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
- /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
- /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
- {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import click
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from ...utils import ask_if_not_provided, ask_yes_no_question, load_template
|
|
5
|
+
|
|
6
|
+
WEBUI_GATEWAY_DEFAULTS = {
|
|
7
|
+
"webui_frontend_welcome_message": "",
|
|
8
|
+
"webui_frontend_bot_name": "Solace Agent Mesh",
|
|
9
|
+
"webui_frontend_collect_feedback": False,
|
|
10
|
+
"webui_session_secret_key": "please_change_me_in",
|
|
11
|
+
"webui_fastapi_host": "127.0.0.1",
|
|
12
|
+
"webui_fastapi_port": 8000, # Store as int if CLI option is int
|
|
13
|
+
"webui_fastapi_https_port": 8443, # Store as int if CLI option is int
|
|
14
|
+
"webui_ssl_keyfile": "",
|
|
15
|
+
"webui_ssl_certfile": "",
|
|
16
|
+
"webui_ssl_keyfile_password": "",
|
|
17
|
+
"webui_enable_embed_resolution": True,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def create_webui_gateway_config(
|
|
22
|
+
project_root: Path, options: dict, skip_interactive: bool, default_values: dict
|
|
23
|
+
) -> bool:
|
|
24
|
+
"""
|
|
25
|
+
Gathers WebUI Gateway options and creates the configuration file (configs/gateways/webui.yaml)
|
|
26
|
+
if the user opts in. It customizes the template based on user input or defaults.
|
|
27
|
+
Returns True on success or if skipped, False on failure.
|
|
28
|
+
"""
|
|
29
|
+
click.echo("Configuring Web UI Gateway options...")
|
|
30
|
+
|
|
31
|
+
add_gateway = options.get("add_webui_gateway")
|
|
32
|
+
if not skip_interactive and add_gateway is None:
|
|
33
|
+
add_gateway = ask_yes_no_question(
|
|
34
|
+
"Do you want to add a default Web UI gateway?",
|
|
35
|
+
default=default_values.get("add_webui_gateway", True),
|
|
36
|
+
)
|
|
37
|
+
elif add_gateway is None:
|
|
38
|
+
add_gateway = default_values.get("add_webui_gateway", True)
|
|
39
|
+
|
|
40
|
+
options["add_webui_gateway"] = add_gateway
|
|
41
|
+
|
|
42
|
+
options["webui_session_secret_key"] = ask_if_not_provided(
|
|
43
|
+
options,
|
|
44
|
+
"webui_session_secret_key",
|
|
45
|
+
"Enter Web UI Session Secret Key",
|
|
46
|
+
default=default_values.get(
|
|
47
|
+
"webui_session_secret_key",
|
|
48
|
+
WEBUI_GATEWAY_DEFAULTS["webui_session_secret_key"],
|
|
49
|
+
),
|
|
50
|
+
none_interactive=skip_interactive,
|
|
51
|
+
hide_input=True,
|
|
52
|
+
)
|
|
53
|
+
options["webui_fastapi_host"] = ask_if_not_provided(
|
|
54
|
+
options,
|
|
55
|
+
"webui_fastapi_host",
|
|
56
|
+
"Enter Web UI FastAPI Host",
|
|
57
|
+
default=default_values.get(
|
|
58
|
+
"webui_fastapi_host", WEBUI_GATEWAY_DEFAULTS["webui_fastapi_host"]
|
|
59
|
+
),
|
|
60
|
+
none_interactive=skip_interactive,
|
|
61
|
+
)
|
|
62
|
+
options["webui_fastapi_port"] = ask_if_not_provided(
|
|
63
|
+
options,
|
|
64
|
+
"webui_fastapi_port",
|
|
65
|
+
"Enter Web UI FastAPI Port",
|
|
66
|
+
default=default_values.get(
|
|
67
|
+
"webui_fastapi_port", WEBUI_GATEWAY_DEFAULTS["webui_fastapi_port"]
|
|
68
|
+
),
|
|
69
|
+
none_interactive=skip_interactive,
|
|
70
|
+
)
|
|
71
|
+
options["webui_fastapi_https_port"] = ask_if_not_provided(
|
|
72
|
+
options, "webui_fastapi_https_port", "Enter Web UI FastAPI HTTPS Port",
|
|
73
|
+
default=default_values.get("webui_fastapi_https_port", 8443),
|
|
74
|
+
none_interactive=skip_interactive
|
|
75
|
+
)
|
|
76
|
+
options["webui_enable_embed_resolution"] = ask_if_not_provided(
|
|
77
|
+
options,
|
|
78
|
+
"webui_enable_embed_resolution",
|
|
79
|
+
"Enable Embed Resolution for Web UI? (true/false)",
|
|
80
|
+
default=default_values.get(
|
|
81
|
+
"webui_enable_embed_resolution",
|
|
82
|
+
WEBUI_GATEWAY_DEFAULTS["webui_enable_embed_resolution"],
|
|
83
|
+
),
|
|
84
|
+
none_interactive=skip_interactive,
|
|
85
|
+
is_bool=True,
|
|
86
|
+
)
|
|
87
|
+
options["webui_ssl_keyfile"] = ask_if_not_provided(
|
|
88
|
+
options, "webui_ssl_keyfile", "Enter SSL Key File Path",
|
|
89
|
+
default=default_values.get("webui_ssl_keyfile", ""),
|
|
90
|
+
none_interactive=skip_interactive
|
|
91
|
+
)
|
|
92
|
+
options["webui_ssl_certfile"] = ask_if_not_provided(
|
|
93
|
+
options, "webui_ssl_certfile", "Enter SSL Certificate File Path",
|
|
94
|
+
default=default_values.get("webui_ssl_certfile", ""),
|
|
95
|
+
none_interactive=skip_interactive
|
|
96
|
+
)
|
|
97
|
+
options["webui_ssl_keyfile_password"] = ask_if_not_provided(
|
|
98
|
+
options, "webui_ssl_keyfile_password", "Enter SSL Key File Passphrase",
|
|
99
|
+
default=default_values.get("webui_ssl_keyfile_password", ""),
|
|
100
|
+
none_interactive=skip_interactive, hide_input=True
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
options["webui_frontend_welcome_message"] = ask_if_not_provided(
|
|
104
|
+
options,
|
|
105
|
+
"webui_frontend_welcome_message",
|
|
106
|
+
"Enter Frontend Welcome Message for Web UI",
|
|
107
|
+
default=default_values.get(
|
|
108
|
+
"webui_frontend_welcome_message",
|
|
109
|
+
WEBUI_GATEWAY_DEFAULTS["webui_frontend_welcome_message"],
|
|
110
|
+
),
|
|
111
|
+
none_interactive=skip_interactive,
|
|
112
|
+
)
|
|
113
|
+
options["webui_frontend_bot_name"] = ask_if_not_provided(
|
|
114
|
+
options,
|
|
115
|
+
"webui_frontend_bot_name",
|
|
116
|
+
"Enter Frontend Bot Name for Web UI",
|
|
117
|
+
default=default_values.get(
|
|
118
|
+
"webui_frontend_bot_name", WEBUI_GATEWAY_DEFAULTS["webui_frontend_bot_name"]
|
|
119
|
+
),
|
|
120
|
+
none_interactive=skip_interactive,
|
|
121
|
+
)
|
|
122
|
+
options["webui_frontend_collect_feedback"] = ask_if_not_provided(
|
|
123
|
+
options,
|
|
124
|
+
"webui_frontend_collect_feedback",
|
|
125
|
+
"Enable Frontend Feedback Collection for Web UI? (true/false)",
|
|
126
|
+
default=default_values.get(
|
|
127
|
+
"webui_frontend_collect_feedback",
|
|
128
|
+
WEBUI_GATEWAY_DEFAULTS["webui_frontend_collect_feedback"],
|
|
129
|
+
),
|
|
130
|
+
none_interactive=skip_interactive,
|
|
131
|
+
is_bool=True,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if not add_gateway:
|
|
135
|
+
click.echo(click.style(" Skipping Web UI Gateway file creation.", fg="yellow"))
|
|
136
|
+
return True
|
|
137
|
+
|
|
138
|
+
click.echo("Creating Web UI Gateway configuration file...")
|
|
139
|
+
destination_path = project_root / "configs" / "gateways" / "webui.yaml"
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
template_content = load_template("webui.yaml")
|
|
143
|
+
replacements = {
|
|
144
|
+
"__FRONTEND_WELCOME_MESSAGE__": str(
|
|
145
|
+
options.get("webui_frontend_welcome_message", "")
|
|
146
|
+
),
|
|
147
|
+
"__FRONTEND_BOT_NAME__": str(
|
|
148
|
+
options.get("webui_frontend_bot_name", "Solace Agent Mesh")
|
|
149
|
+
),
|
|
150
|
+
"__FRONTEND_COLLECT_FEEDBACK__": str(
|
|
151
|
+
options.get("webui_frontend_collect_feedback", False)
|
|
152
|
+
).lower(),
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
modified_content = template_content
|
|
156
|
+
for placeholder, value in replacements.items():
|
|
157
|
+
modified_content = modified_content.replace(placeholder, value)
|
|
158
|
+
|
|
159
|
+
destination_path.parent.mkdir(parents=True, exist_ok=True)
|
|
160
|
+
with open(destination_path, "w", encoding="utf-8") as f:
|
|
161
|
+
f.write(modified_content)
|
|
162
|
+
|
|
163
|
+
click.echo(f" Created: {destination_path.relative_to(project_root)}")
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
except FileNotFoundError:
|
|
167
|
+
click.echo(click.style(f"Error: Template file not found.", fg="red"), err=True)
|
|
168
|
+
return False
|
|
169
|
+
except IOError as e:
|
|
170
|
+
click.echo(
|
|
171
|
+
click.style(f"Error writing file {destination_path}: {e}", fg="red"),
|
|
172
|
+
err=True,
|
|
173
|
+
)
|
|
174
|
+
return False
|
|
175
|
+
except Exception as e:
|
|
176
|
+
click.echo(
|
|
177
|
+
click.style(
|
|
178
|
+
f"An unexpected error occurred during Web UI Gateway configuration: {e}",
|
|
179
|
+
fg="red",
|
|
180
|
+
),
|
|
181
|
+
err=True,
|
|
182
|
+
)
|
|
183
|
+
return False
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import click
|
|
2
|
+
|
|
3
|
+
from .create_cmd import create_plugin_cmd
|
|
4
|
+
from .add_cmd import add_plugin_component_cmd
|
|
5
|
+
from .build_cmd import build_plugin_cmd
|
|
6
|
+
from .catalog_cmd import catalog
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@click.group("plugin")
|
|
10
|
+
def plugin():
|
|
11
|
+
"""Manage SAM plugins: create, add components, and build."""
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
plugin.add_command(create_plugin_cmd, name="create")
|
|
16
|
+
plugin.add_command(add_plugin_component_cmd, name="add")
|
|
17
|
+
plugin.add_command(build_plugin_cmd, name="build")
|
|
18
|
+
plugin.add_command(catalog, name="catalog")
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import pathlib
|
|
3
|
+
import subprocess
|
|
4
|
+
import tempfile
|
|
5
|
+
import shutil
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
8
|
+
import toml
|
|
9
|
+
|
|
10
|
+
from cli.utils import get_formatted_names, get_module_path, error_exit
|
|
11
|
+
from .official_registry import get_official_plugin_url
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def ensure_directory_exists(path: pathlib.Path):
|
|
15
|
+
"""Creates a directory if it doesn't exist."""
|
|
16
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _check_command_exists(command: str) -> bool:
|
|
20
|
+
"""Checks if a command exists on the system."""
|
|
21
|
+
return shutil.which(command) is not None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _get_plugin_name_from_source_pyproject(source_path: pathlib.Path) -> str | None:
|
|
25
|
+
"""Reads pyproject.toml from source_path and returns the project name."""
|
|
26
|
+
pyproject_path = source_path / "pyproject.toml"
|
|
27
|
+
if not pyproject_path.is_file():
|
|
28
|
+
click.echo(
|
|
29
|
+
click.style(
|
|
30
|
+
f"Warning: pyproject.toml not found at {pyproject_path}. Cannot determine module name automatically.",
|
|
31
|
+
fg="yellow",
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
return None
|
|
35
|
+
try:
|
|
36
|
+
with open(pyproject_path, "r", encoding="utf-8") as f:
|
|
37
|
+
data = toml.load(f)
|
|
38
|
+
project_name = data.get("project", {}).get("name")
|
|
39
|
+
if project_name:
|
|
40
|
+
return project_name.strip().replace("-", "_") # Normalize to snake_case
|
|
41
|
+
click.echo(
|
|
42
|
+
click.style(
|
|
43
|
+
f"Warning: Could not find 'project.name' in {pyproject_path}.",
|
|
44
|
+
fg="yellow",
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
return None
|
|
48
|
+
except Exception as e:
|
|
49
|
+
click.echo(click.style(f"Error parsing {pyproject_path}: {e}", fg="red"))
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _get_plugin_type_from_pyproject(source_path: pathlib.Path) -> str | None:
|
|
54
|
+
"""Reads pyproject.toml from source_path and returns the plugin type."""
|
|
55
|
+
pyproject_path = source_path / "pyproject.toml"
|
|
56
|
+
if not pyproject_path.is_file():
|
|
57
|
+
click.echo(
|
|
58
|
+
click.style(
|
|
59
|
+
f"Warning: pyproject.toml not found at {pyproject_path}. Cannot determine plugin type automatically.",
|
|
60
|
+
fg="yellow",
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
return None
|
|
64
|
+
try:
|
|
65
|
+
with open(pyproject_path, "r", encoding="utf-8") as f:
|
|
66
|
+
data = toml.load(f)
|
|
67
|
+
project_name = data.get("project", {}).get("name", "").strip().replace("-", "_")
|
|
68
|
+
plugin_type = (
|
|
69
|
+
data.get("tool", {}).get(project_name, {}).get("metadata", {}).get("type")
|
|
70
|
+
)
|
|
71
|
+
if plugin_type:
|
|
72
|
+
return plugin_type.strip()
|
|
73
|
+
click.echo(
|
|
74
|
+
click.style(
|
|
75
|
+
f"Warning: Could not find plugin type for '{project_name}' in {pyproject_path}.",
|
|
76
|
+
fg="yellow",
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
return None
|
|
80
|
+
except Exception as e:
|
|
81
|
+
click.echo(click.style(f"Error parsing {pyproject_path}: {e}", fg="red"))
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _run_install(
|
|
86
|
+
install_command, install_target: str | pathlib.Path, operation_desc: str
|
|
87
|
+
) -> str | None:
|
|
88
|
+
"""Runs install for the given target."""
|
|
89
|
+
click.echo(
|
|
90
|
+
f"Attempting to install plugin using {install_command} from {operation_desc}..."
|
|
91
|
+
)
|
|
92
|
+
try:
|
|
93
|
+
process = subprocess.run(
|
|
94
|
+
install_command.format(package=str(install_target)).split(),
|
|
95
|
+
capture_output=True,
|
|
96
|
+
text=True,
|
|
97
|
+
check=False,
|
|
98
|
+
)
|
|
99
|
+
if process.returncode == 0:
|
|
100
|
+
click.echo(
|
|
101
|
+
click.style(
|
|
102
|
+
f"Plugin successfully installed via from {operation_desc}.",
|
|
103
|
+
fg="green",
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
if process.stdout:
|
|
107
|
+
click.echo(f"install output:\n{process.stdout}")
|
|
108
|
+
return None
|
|
109
|
+
else:
|
|
110
|
+
return f"Error: 'install {install_target}' failed.\nstdout:\n{process.stdout}\nstderr:\n{process.stderr}"
|
|
111
|
+
except FileNotFoundError:
|
|
112
|
+
return "Error: 'python' or command not found. Ensure Python and command are installed and in your PATH."
|
|
113
|
+
except Exception as e:
|
|
114
|
+
return f"An unexpected error occurred during install: {e}"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@click.command("add")
|
|
118
|
+
@click.argument("component_name")
|
|
119
|
+
@click.option(
|
|
120
|
+
"--plugin",
|
|
121
|
+
"plugin_source",
|
|
122
|
+
required=True,
|
|
123
|
+
help="Plugin source: installed module name, local path, or Git URL.",
|
|
124
|
+
)
|
|
125
|
+
@click.option(
|
|
126
|
+
"--install-command",
|
|
127
|
+
"installer_command",
|
|
128
|
+
help="Command to use to install a python package. Must follow the format 'command {package} args', by default 'pip3 install {package}'. Can also be set through the environment variable SAM_PLUGIN_INSTALL_COMMAND.",
|
|
129
|
+
)
|
|
130
|
+
def add_plugin_component_cmd(
|
|
131
|
+
component_name: str, plugin_source: str, installer_command: str | None = None
|
|
132
|
+
):
|
|
133
|
+
"""Creates a new component instance from a specified plugin source."""
|
|
134
|
+
|
|
135
|
+
click.echo(
|
|
136
|
+
f"Attempting to add component '{component_name}' using plugin source '{plugin_source}'..."
|
|
137
|
+
)
|
|
138
|
+
if not installer_command:
|
|
139
|
+
installer_command = os.environ.get(
|
|
140
|
+
"SAM_PLUGIN_INSTALL_COMMAND", "pip3 install {package}"
|
|
141
|
+
)
|
|
142
|
+
try:
|
|
143
|
+
installer_command.format(package="dummy") # Test if the command is valid
|
|
144
|
+
except (KeyError, ValueError):
|
|
145
|
+
return error_exit(
|
|
146
|
+
"Error: The installer command must contain a placeholder '{package}' to be replaced with the actual package name."
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
official_plugin_url = get_official_plugin_url(plugin_source)
|
|
150
|
+
if official_plugin_url:
|
|
151
|
+
click.echo(f"Found official plugin '{plugin_source}' at: {official_plugin_url}")
|
|
152
|
+
plugin_source = official_plugin_url
|
|
153
|
+
|
|
154
|
+
install_type = None # "module", "local", "git"
|
|
155
|
+
module_name_to_load = None
|
|
156
|
+
install_target = None
|
|
157
|
+
source_path_for_name_extraction = None
|
|
158
|
+
|
|
159
|
+
if plugin_source.startswith(("http://", "https://")) and plugin_source.endswith(
|
|
160
|
+
".git"
|
|
161
|
+
):
|
|
162
|
+
install_type = "repository"
|
|
163
|
+
install_target = plugin_source
|
|
164
|
+
elif plugin_source.startswith(("git+")):
|
|
165
|
+
install_type = "git"
|
|
166
|
+
install_target = plugin_source
|
|
167
|
+
elif os.path.exists(plugin_source):
|
|
168
|
+
local_path = pathlib.Path(plugin_source).resolve()
|
|
169
|
+
if local_path.is_dir():
|
|
170
|
+
install_type = "local"
|
|
171
|
+
install_target = str(local_path)
|
|
172
|
+
source_path_for_name_extraction = local_path
|
|
173
|
+
elif local_path.is_file() and local_path.suffix in [".whl", ".tar.gz"]:
|
|
174
|
+
install_type = "wheel"
|
|
175
|
+
install_target = str(local_path)
|
|
176
|
+
else:
|
|
177
|
+
return error_exit(
|
|
178
|
+
f"Error: Local path '{plugin_source}' exists but is not a directory or wheel."
|
|
179
|
+
)
|
|
180
|
+
elif not re.search(r"[/\\]", plugin_source):
|
|
181
|
+
install_type = "module"
|
|
182
|
+
module_name_to_load = plugin_source.strip().replace("-", "_")
|
|
183
|
+
else:
|
|
184
|
+
return error_exit(
|
|
185
|
+
f"Error: Invalid plugin source '{plugin_source}'. Not a recognized module name, local path, or Git URL."
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
if install_type in ["local", "git", "repository", "wheel"]:
|
|
189
|
+
if install_type == "repository":
|
|
190
|
+
if not _check_command_exists("git"):
|
|
191
|
+
return error_exit(
|
|
192
|
+
"Error: 'git' command not found. Please install Git or install the plugin manually."
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
196
|
+
temp_dir_path = pathlib.Path(temp_dir)
|
|
197
|
+
cloned_repo_path = temp_dir_path / "plugin_repo"
|
|
198
|
+
click.echo(
|
|
199
|
+
f"Cloning Git repository '{plugin_source}' to temporary directory {cloned_repo_path}..."
|
|
200
|
+
)
|
|
201
|
+
try:
|
|
202
|
+
subprocess.run(
|
|
203
|
+
["git", "clone", plugin_source, str(cloned_repo_path)],
|
|
204
|
+
capture_output=True,
|
|
205
|
+
text=True,
|
|
206
|
+
check=True,
|
|
207
|
+
)
|
|
208
|
+
source_path_for_name_extraction = cloned_repo_path
|
|
209
|
+
except subprocess.CalledProcessError as e:
|
|
210
|
+
return error_exit(f"Error cloning Git repository: {e.stderr}")
|
|
211
|
+
except FileNotFoundError:
|
|
212
|
+
return error_exit("Error: 'git' command not found during clone.")
|
|
213
|
+
|
|
214
|
+
module_name_from_pyproject = _get_plugin_name_from_source_pyproject(
|
|
215
|
+
source_path_for_name_extraction
|
|
216
|
+
)
|
|
217
|
+
if not module_name_from_pyproject:
|
|
218
|
+
return error_exit(
|
|
219
|
+
"Could not determine module name from pyproject.toml in the Git repo. Aborting."
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
err = _run_install(
|
|
223
|
+
installer_command, install_target, f"Git URL ({plugin_source})"
|
|
224
|
+
)
|
|
225
|
+
if err:
|
|
226
|
+
return error_exit(err)
|
|
227
|
+
module_name_to_load = module_name_from_pyproject
|
|
228
|
+
|
|
229
|
+
elif install_type == "git":
|
|
230
|
+
module_name_from_url = (
|
|
231
|
+
plugin_source.split("#")[0]
|
|
232
|
+
.split("?")[0]
|
|
233
|
+
.split("/")[-1]
|
|
234
|
+
.replace(".git", "")
|
|
235
|
+
.replace("-", "_")
|
|
236
|
+
)
|
|
237
|
+
if "#subdirectory=" in plugin_source:
|
|
238
|
+
module_name_from_url = (
|
|
239
|
+
plugin_source.split("#subdirectory=")[-1]
|
|
240
|
+
.split("?")[0]
|
|
241
|
+
.replace(".git", "")
|
|
242
|
+
.replace("-", "_")
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
if not module_name_from_url:
|
|
246
|
+
return error_exit(
|
|
247
|
+
f"Could not determine module name from the Git URL {plugin_source}. Aborting."
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
err = _run_install(
|
|
251
|
+
installer_command, install_target, f"Git URL ({plugin_source})"
|
|
252
|
+
)
|
|
253
|
+
if err:
|
|
254
|
+
return error_exit(err)
|
|
255
|
+
module_name_to_load = module_name_from_url
|
|
256
|
+
|
|
257
|
+
elif install_type == "local":
|
|
258
|
+
module_name_from_pyproject = _get_plugin_name_from_source_pyproject(
|
|
259
|
+
source_path_for_name_extraction
|
|
260
|
+
)
|
|
261
|
+
if not module_name_from_pyproject:
|
|
262
|
+
return error_exit(
|
|
263
|
+
f"Could not determine module name from pyproject.toml at {source_path_for_name_extraction}. Aborting."
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
err = _run_install(
|
|
267
|
+
installer_command, install_target, f"local path ({install_target})"
|
|
268
|
+
)
|
|
269
|
+
if err:
|
|
270
|
+
return error_exit(err)
|
|
271
|
+
module_name_to_load = module_name_from_pyproject
|
|
272
|
+
|
|
273
|
+
elif install_type == "wheel":
|
|
274
|
+
module_name_from_wheel = (
|
|
275
|
+
pathlib.Path(install_target).stem.split("-")[0]
|
|
276
|
+
)
|
|
277
|
+
if not module_name_from_wheel:
|
|
278
|
+
return error_exit(
|
|
279
|
+
f"Could not determine module name from the wheel file {install_target}. Aborting."
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
err = _run_install(
|
|
283
|
+
installer_command, install_target, f"wheel file ({install_target})"
|
|
284
|
+
)
|
|
285
|
+
if err:
|
|
286
|
+
return error_exit(err)
|
|
287
|
+
module_name_to_load = module_name_from_wheel
|
|
288
|
+
|
|
289
|
+
if not module_name_to_load:
|
|
290
|
+
return error_exit("Error: Could not determine the plugin module name to load.")
|
|
291
|
+
|
|
292
|
+
click.echo(f"Proceeding to load plugin module '{module_name_to_load}'...")
|
|
293
|
+
try:
|
|
294
|
+
plugin_root_path = pathlib.Path(get_module_path(module_name_to_load))
|
|
295
|
+
except ImportError:
|
|
296
|
+
return error_exit(
|
|
297
|
+
f"Error: Plugin module '{module_name_to_load}' not found after potential installation. Please check installation logs or install manually."
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
if not plugin_root_path or not plugin_root_path.exists():
|
|
301
|
+
return error_exit(
|
|
302
|
+
f"Error: Could not determine a valid root path for plugin module '{module_name_to_load}'. Path: {plugin_root_path}"
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
plugin_config_path = plugin_root_path / "config.yaml"
|
|
306
|
+
plugin_pyproject_path = plugin_root_path / "pyproject.toml"
|
|
307
|
+
|
|
308
|
+
if not plugin_pyproject_path.is_file():
|
|
309
|
+
return error_exit(
|
|
310
|
+
f"Error: pyproject.toml not found in plugin '{module_name_to_load}' at expected path {plugin_pyproject_path}"
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
if not plugin_config_path.is_file():
|
|
314
|
+
return error_exit(
|
|
315
|
+
f"Error: config.yaml not found in plugin '{module_name_to_load}' at expected path {plugin_config_path}"
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
try:
|
|
319
|
+
plugin_config_content = plugin_config_path.read_text(encoding="utf-8")
|
|
320
|
+
except Exception as e:
|
|
321
|
+
return error_exit(
|
|
322
|
+
f"Error reading plugin config.yaml from {plugin_config_path}: {e}"
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
component_formats = get_formatted_names(component_name)
|
|
326
|
+
|
|
327
|
+
component_replacements = {
|
|
328
|
+
"__COMPONENT_SNAKE_CASE_NAME__": component_formats["SNAKE_CASE_NAME"],
|
|
329
|
+
"__COMPONENT_UPPER_SNAKE_CASE_NAME__": component_formats[
|
|
330
|
+
"SNAKE_UPPER_CASE_NAME"
|
|
331
|
+
],
|
|
332
|
+
"__COMPONENT_KEBAB_CASE_NAME__": component_formats["KEBAB_CASE_NAME"],
|
|
333
|
+
"__COMPONENT_PASCAL_CASE_NAME__": component_formats["PASCAL_CASE_NAME"],
|
|
334
|
+
"__COMPONENT_SPACED_NAME__": component_formats["SPACED_NAME"],
|
|
335
|
+
"__COMPONENT_SPACED_CAPITALIZED_NAME__": component_formats[
|
|
336
|
+
"SPACED_CAPITALIZED_NAME"
|
|
337
|
+
],
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
processed_config_content = plugin_config_content
|
|
341
|
+
for placeholder, value in component_replacements.items():
|
|
342
|
+
processed_config_content = processed_config_content.replace(placeholder, value)
|
|
343
|
+
|
|
344
|
+
plugin_type = _get_plugin_type_from_pyproject(plugin_root_path)
|
|
345
|
+
if plugin_type == "agent":
|
|
346
|
+
target_dir = pathlib.Path("configs/agents")
|
|
347
|
+
elif plugin_type == "gateway":
|
|
348
|
+
target_dir = pathlib.Path("configs/gateways")
|
|
349
|
+
else:
|
|
350
|
+
target_dir = pathlib.Path("configs/plugins")
|
|
351
|
+
try:
|
|
352
|
+
ensure_directory_exists(target_dir)
|
|
353
|
+
except Exception as e:
|
|
354
|
+
return error_exit(f"Error creating target directory {target_dir}: {e}")
|
|
355
|
+
|
|
356
|
+
target_filename = f"{component_formats['KEBAB_CASE_NAME']}.yaml"
|
|
357
|
+
target_path = target_dir / target_filename
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
with open(target_path, "w", encoding="utf-8") as f:
|
|
361
|
+
f.write(processed_config_content)
|
|
362
|
+
click.echo(f" Created component configuration: {target_path}")
|
|
363
|
+
click.echo(
|
|
364
|
+
click.style(
|
|
365
|
+
f"Component '{component_name}' created successfully from plugin '{module_name_to_load}'.",
|
|
366
|
+
fg="green",
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
except IOError as e:
|
|
370
|
+
return error_exit(
|
|
371
|
+
f"Error writing component configuration file {target_path}: {e}"
|
|
372
|
+
)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import subprocess
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from cli.utils import error_exit
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@click.command("build")
|
|
9
|
+
@click.argument(
|
|
10
|
+
"plugin_path_arg",
|
|
11
|
+
type=click.Path(exists=True, file_okay=False, dir_okay=True, resolve_path=True),
|
|
12
|
+
default=".",
|
|
13
|
+
metavar="PLUGIN_PATH",
|
|
14
|
+
)
|
|
15
|
+
def build_plugin_cmd(plugin_path_arg: str):
|
|
16
|
+
"""
|
|
17
|
+
Builds the SAM plugin in the specified directory (defaults to current directory).
|
|
18
|
+
This command requires the 'build' package to be installed (pip install build).
|
|
19
|
+
"""
|
|
20
|
+
target_path = Path(plugin_path_arg)
|
|
21
|
+
pyproject_file = target_path / "pyproject.toml"
|
|
22
|
+
|
|
23
|
+
if not pyproject_file.is_file():
|
|
24
|
+
click.echo(
|
|
25
|
+
click.style(f"Error: pyproject.toml not found in {target_path}", fg="red")
|
|
26
|
+
)
|
|
27
|
+
click.echo(
|
|
28
|
+
click.style(
|
|
29
|
+
"Please ensure you are in the root directory of the plugin or provide the correct path.",
|
|
30
|
+
fg="yellow",
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
error_exit()
|
|
34
|
+
|
|
35
|
+
click.echo(f"Building plugin in {target_path}...")
|
|
36
|
+
click.echo(
|
|
37
|
+
click.style(
|
|
38
|
+
"Note: This command uses 'python -m build'. Ensure 'build' package is installed ('pip install build').",
|
|
39
|
+
fg="cyan",
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
original_cwd = Path.cwd()
|
|
44
|
+
error_exit_msg = None
|
|
45
|
+
try:
|
|
46
|
+
os.chdir(target_path)
|
|
47
|
+
process = subprocess.run(
|
|
48
|
+
["python", "-m", "build"], capture_output=True, text=True, check=False
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if process.stdout:
|
|
52
|
+
click.echo("--- Build Output ---")
|
|
53
|
+
click.echo(process.stdout)
|
|
54
|
+
click.echo("--- End of Build Output ---")
|
|
55
|
+
|
|
56
|
+
if process.stderr:
|
|
57
|
+
click.echo(click.style("--- Build Errors/Warnings ---", fg="yellow"))
|
|
58
|
+
click.echo(click.style(process.stderr, fg="yellow"))
|
|
59
|
+
click.echo(click.style("--- End of Build Errors/Warnings ---", fg="yellow"))
|
|
60
|
+
|
|
61
|
+
if process.returncode == 0:
|
|
62
|
+
dist_path = target_path / "dist"
|
|
63
|
+
click.echo(
|
|
64
|
+
click.style(
|
|
65
|
+
f"Plugin built successfully! Artifacts are in: {dist_path}",
|
|
66
|
+
fg="green",
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
if dist_path.exists() and dist_path.is_dir():
|
|
70
|
+
click.echo("Generated files:")
|
|
71
|
+
for item in sorted(dist_path.iterdir()):
|
|
72
|
+
click.echo(f" - {item.name}")
|
|
73
|
+
else:
|
|
74
|
+
error_exit_msg = (
|
|
75
|
+
f"Error: 'python -m build' failed with exit code {process.returncode}."
|
|
76
|
+
)
|
|
77
|
+
error_exit_msg += "\nPlease check the build output above for details."
|
|
78
|
+
|
|
79
|
+
except FileNotFoundError:
|
|
80
|
+
error_exit_msg = f"Error: Python executable not found. Ensure Python is installed and in your PATH."
|
|
81
|
+
except Exception as e:
|
|
82
|
+
error_exit_msg = f"An unexpected error occurred during the build process: {e}"
|
|
83
|
+
finally:
|
|
84
|
+
os.chdir(original_cwd)
|
|
85
|
+
if error_exit_msg:
|
|
86
|
+
error_exit(error_exit_msg)
|