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.

Files changed (521) hide show
  1. solace_agent_mesh/__init__.py +5 -0
  2. solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
  3. solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
  4. solace_agent_mesh/agent/adk/callbacks.py +1716 -0
  5. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
  6. solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
  7. solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
  8. solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
  9. solace_agent_mesh/agent/adk/runner.py +357 -0
  10. solace_agent_mesh/agent/adk/services.py +240 -0
  11. solace_agent_mesh/agent/adk/setup.py +751 -0
  12. solace_agent_mesh/agent/adk/stream_parser.py +214 -0
  13. solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
  14. solace_agent_mesh/agent/agent_llm.txt +41 -0
  15. solace_agent_mesh/agent/protocol/event_handlers.py +1444 -0
  16. solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
  17. solace_agent_mesh/agent/sac/app.py +640 -0
  18. solace_agent_mesh/agent/sac/component.py +3496 -0
  19. solace_agent_mesh/agent/sac/patch_adk.py +111 -0
  20. solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
  21. solace_agent_mesh/agent/sac/task_execution_context.py +185 -0
  22. solace_agent_mesh/agent/testing/__init__.py +3 -0
  23. solace_agent_mesh/agent/testing/debug_utils.py +135 -0
  24. solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
  25. solace_agent_mesh/agent/tools/__init__.py +14 -0
  26. solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
  27. solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
  28. solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
  29. solace_agent_mesh/agent/tools/general_agent_tools.py +571 -0
  30. solace_agent_mesh/agent/tools/image_tools.py +1184 -0
  31. solace_agent_mesh/agent/tools/peer_agent_tool.py +290 -0
  32. solace_agent_mesh/agent/tools/registry.py +36 -0
  33. solace_agent_mesh/agent/tools/test_tools.py +135 -0
  34. solace_agent_mesh/agent/tools/tool_definition.py +45 -0
  35. solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
  36. solace_agent_mesh/agent/tools/web_tools.py +381 -0
  37. solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
  38. solace_agent_mesh/agent/utils/config_parser.py +47 -0
  39. solace_agent_mesh/agent/utils/context_helpers.py +60 -0
  40. solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
  41. solace_agent_mesh/assets/docs/404.html +16 -0
  42. solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
  43. solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
  44. solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
  45. solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
  46. solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
  47. solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
  48. solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
  49. solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
  50. solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
  51. solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
  52. solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
  53. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
  54. solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
  55. solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
  56. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
  57. solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
  58. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
  59. solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
  60. solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
  61. solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
  62. solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
  63. solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
  64. solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
  65. solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
  66. solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
  67. solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
  68. solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
  69. solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
  70. solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
  71. solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
  72. solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
  73. solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
  74. solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
  75. solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
  76. solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
  77. solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
  78. solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
  79. solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
  80. solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
  81. solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
  82. solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
  83. solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
  84. solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
  85. solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
  86. solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
  87. solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
  88. solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
  89. solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
  90. solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
  91. solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
  92. solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
  93. solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
  94. solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
  95. solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
  96. solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
  97. solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
  98. solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
  99. solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
  100. solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
  101. solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
  102. solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
  103. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
  104. solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
  105. solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
  106. solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
  107. solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
  108. solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
  109. solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
  110. solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
  111. solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
  112. solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
  113. solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
  114. solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
  115. solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
  116. solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
  117. solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
  118. solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
  119. solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
  120. solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
  121. solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
  122. solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
  123. solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
  124. solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
  125. solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
  126. solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
  127. solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
  128. solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
  129. solace_agent_mesh/assets/docs/assets/js/f897a61a.f8c53b0f.js +1 -0
  130. solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
  131. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js +2 -0
  132. solace_agent_mesh/assets/docs/assets/js/main.c6286d7c.js.LICENSE.txt +81 -0
  133. solace_agent_mesh/assets/docs/assets/js/runtime~main.d5133813.js +1 -0
  134. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
  135. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
  136. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
  137. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
  138. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
  139. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
  140. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +77 -0
  141. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
  142. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
  143. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
  144. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
  145. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
  146. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
  147. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
  148. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
  149. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
  150. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
  151. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
  152. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
  153. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
  154. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
  155. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
  156. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
  157. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
  158. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
  159. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
  160. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
  161. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
  162. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
  163. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
  164. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
  165. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
  166. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
  167. solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
  168. solace_agent_mesh/assets/docs/img/logo.png +0 -0
  169. solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
  170. solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
  171. solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
  172. solace_agent_mesh/assets/docs/lunr-index-1754075282978.json +1 -0
  173. solace_agent_mesh/assets/docs/lunr-index.json +1 -0
  174. solace_agent_mesh/assets/docs/search-doc-1754075282978.json +1 -0
  175. solace_agent_mesh/assets/docs/search-doc.json +1 -0
  176. solace_agent_mesh/assets/docs/sitemap.xml +1 -0
  177. solace_agent_mesh/cli/__init__.py +1 -1
  178. solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
  179. solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
  180. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
  181. solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
  182. solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
  183. solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
  184. solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
  185. solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
  186. solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
  187. solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
  188. solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
  189. solace_agent_mesh/cli/commands/init_cmd/env_step.py +205 -0
  190. solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
  191. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +407 -0
  192. solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
  193. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
  194. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
  195. solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
  196. solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
  197. solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
  198. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +139 -0
  199. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
  200. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
  201. solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
  202. solace_agent_mesh/cli/commands/run_cmd.py +158 -0
  203. solace_agent_mesh/cli/main.py +17 -294
  204. solace_agent_mesh/cli/utils.py +135 -204
  205. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
  206. solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
  207. solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
  208. solace_agent_mesh/client/webui/frontend/static/assets/main-D11Lmy9p.css +1 -0
  209. solace_agent_mesh/client/webui/frontend/static/assets/main-Gfk3BYn5.js +663 -0
  210. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
  211. solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
  212. solace_agent_mesh/common/__init__.py +1 -0
  213. solace_agent_mesh/common/a2a_protocol.py +564 -0
  214. solace_agent_mesh/common/agent_registry.py +42 -0
  215. solace_agent_mesh/common/client/__init__.py +4 -0
  216. solace_agent_mesh/common/client/card_resolver.py +21 -0
  217. solace_agent_mesh/common/client/client.py +85 -0
  218. solace_agent_mesh/common/client/client_llm.txt +133 -0
  219. solace_agent_mesh/common/common_llm.txt +144 -0
  220. solace_agent_mesh/common/constants.py +1 -14
  221. solace_agent_mesh/common/middleware/__init__.py +12 -0
  222. solace_agent_mesh/common/middleware/config_resolver.py +130 -0
  223. solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
  224. solace_agent_mesh/common/middleware/registry.py +125 -0
  225. solace_agent_mesh/common/server/__init__.py +4 -0
  226. solace_agent_mesh/common/server/server.py +122 -0
  227. solace_agent_mesh/common/server/server_llm.txt +169 -0
  228. solace_agent_mesh/common/server/task_manager.py +291 -0
  229. solace_agent_mesh/common/server/utils.py +28 -0
  230. solace_agent_mesh/common/services/__init__.py +4 -0
  231. solace_agent_mesh/common/services/employee_service.py +162 -0
  232. solace_agent_mesh/common/services/identity_service.py +129 -0
  233. solace_agent_mesh/common/services/providers/__init__.py +4 -0
  234. solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
  235. solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
  236. solace_agent_mesh/common/services/services_llm.txt +132 -0
  237. solace_agent_mesh/common/types.py +411 -0
  238. solace_agent_mesh/common/utils/__init__.py +7 -0
  239. solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
  240. solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
  241. solace_agent_mesh/common/utils/embeds/constants.py +55 -0
  242. solace_agent_mesh/common/utils/embeds/converter.py +452 -0
  243. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
  244. solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
  245. solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
  246. solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
  247. solace_agent_mesh/common/utils/embeds/types.py +14 -0
  248. solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
  249. solace_agent_mesh/common/utils/initializer.py +51 -0
  250. solace_agent_mesh/common/utils/log_formatters.py +44 -0
  251. solace_agent_mesh/common/utils/mime_helpers.py +106 -0
  252. solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
  253. solace_agent_mesh/common/utils/utils_llm.txt +67 -0
  254. solace_agent_mesh/config_portal/backend/common.py +66 -24
  255. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
  256. solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
  257. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +164 -0
  258. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
  259. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
  260. solace_agent_mesh/config_portal/backend/server.py +551 -181
  261. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-_7yox_eh.js +48 -0
  262. solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
  263. solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
  264. solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
  265. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-e5c3acfe.js +1 -0
  266. solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
  267. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
  268. solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
  269. solace_agent_mesh/core_a2a/__init__.py +1 -0
  270. solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
  271. solace_agent_mesh/core_a2a/service.py +331 -0
  272. solace_agent_mesh/evaluation/config_loader.py +657 -0
  273. solace_agent_mesh/evaluation/evaluator.py +667 -0
  274. solace_agent_mesh/evaluation/message_organizer.py +568 -0
  275. solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
  276. solace_agent_mesh/evaluation/report/chart_section.html +141 -0
  277. solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
  278. solace_agent_mesh/evaluation/report/modal.html +59 -0
  279. solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
  280. solace_agent_mesh/evaluation/report/modal_script.js +296 -0
  281. solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
  282. solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
  283. solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
  284. solace_agent_mesh/evaluation/report/templates/header.html +340 -0
  285. solace_agent_mesh/evaluation/report_data_processor.py +972 -0
  286. solace_agent_mesh/evaluation/report_generator.py +613 -0
  287. solace_agent_mesh/evaluation/run.py +613 -0
  288. solace_agent_mesh/evaluation/subscriber.py +872 -0
  289. solace_agent_mesh/evaluation/summary_builder.py +775 -0
  290. solace_agent_mesh/evaluation/test_case_loader.py +714 -0
  291. solace_agent_mesh/gateway/base/__init__.py +1 -0
  292. solace_agent_mesh/gateway/base/app.py +266 -0
  293. solace_agent_mesh/gateway/base/base_llm.txt +119 -0
  294. solace_agent_mesh/gateway/base/component.py +1542 -0
  295. solace_agent_mesh/gateway/base/task_context.py +74 -0
  296. solace_agent_mesh/gateway/gateway_llm.txt +125 -0
  297. solace_agent_mesh/gateway/http_sse/app.py +190 -0
  298. solace_agent_mesh/gateway/http_sse/component.py +1602 -0
  299. solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
  300. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
  301. solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
  302. solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
  303. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
  304. solace_agent_mesh/gateway/http_sse/main.py +442 -0
  305. solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
  306. solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
  307. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +827 -0
  308. solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
  309. solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
  310. solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
  311. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
  312. solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
  313. solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
  314. solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
  315. solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
  316. solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
  317. solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
  318. solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
  319. solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
  320. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
  321. solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
  322. solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
  323. solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
  324. solace_agent_mesh/llm.txt +228 -0
  325. solace_agent_mesh/llm_detail.txt +2835 -0
  326. solace_agent_mesh/templates/agent_template.yaml +53 -0
  327. solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
  328. solace_agent_mesh/templates/gateway_app_template.py +73 -0
  329. solace_agent_mesh/templates/gateway_component_template.py +431 -0
  330. solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
  331. solace_agent_mesh/templates/logging_config_template.ini +64 -0
  332. solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
  333. solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
  334. solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
  335. solace_agent_mesh/templates/plugin_custom_template.py +10 -0
  336. solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
  337. solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
  338. solace_agent_mesh/templates/plugin_readme_template.md +34 -0
  339. solace_agent_mesh/templates/plugin_tools_template.py +224 -0
  340. solace_agent_mesh/templates/shared_config.yaml +66 -0
  341. solace_agent_mesh/templates/templates_llm.txt +147 -0
  342. solace_agent_mesh/templates/webui.yaml +53 -0
  343. solace_agent_mesh-1.0.2.dist-info/METADATA +432 -0
  344. solace_agent_mesh-1.0.2.dist-info/RECORD +361 -0
  345. solace_agent_mesh-1.0.2.dist-info/entry_points.txt +3 -0
  346. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/licenses/LICENSE +1 -1
  347. solace_agent_mesh/agents/base_agent_component.py +0 -256
  348. solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
  349. solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
  350. solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
  351. solace_agent_mesh/agents/global/actions/create_file.py +0 -70
  352. solace_agent_mesh/agents/global/actions/error_action.py +0 -45
  353. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
  354. solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
  355. solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
  356. solace_agent_mesh/agents/global/global_agent_component.py +0 -38
  357. solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
  358. solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
  359. solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
  360. solace_agent_mesh/agents/slack/__init__.py +0 -1
  361. solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
  362. solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
  363. solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
  364. solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
  365. solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
  366. solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
  367. solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
  368. solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
  369. solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
  370. solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
  371. solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
  372. solace_agent_mesh/assets/web-visualizer/index.html +0 -14
  373. solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
  374. solace_agent_mesh/cli/commands/add/__init__.py +0 -3
  375. solace_agent_mesh/cli/commands/add/add.py +0 -88
  376. solace_agent_mesh/cli/commands/add/agent.py +0 -110
  377. solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
  378. solace_agent_mesh/cli/commands/add/gateway.py +0 -374
  379. solace_agent_mesh/cli/commands/build.py +0 -670
  380. solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
  381. solace_agent_mesh/cli/commands/chat/chat.py +0 -361
  382. solace_agent_mesh/cli/commands/config.py +0 -29
  383. solace_agent_mesh/cli/commands/init/__init__.py +0 -3
  384. solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
  385. solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
  386. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
  387. solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
  388. solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
  389. solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
  390. solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
  391. solace_agent_mesh/cli/commands/init/init.py +0 -92
  392. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
  393. solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
  394. solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
  395. solace_agent_mesh/cli/commands/plugin/add.py +0 -100
  396. solace_agent_mesh/cli/commands/plugin/build.py +0 -268
  397. solace_agent_mesh/cli/commands/plugin/create.py +0 -117
  398. solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
  399. solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
  400. solace_agent_mesh/cli/commands/run.py +0 -68
  401. solace_agent_mesh/cli/commands/visualizer.py +0 -138
  402. solace_agent_mesh/cli/config.py +0 -85
  403. solace_agent_mesh/common/action.py +0 -91
  404. solace_agent_mesh/common/action_list.py +0 -37
  405. solace_agent_mesh/common/action_response.py +0 -340
  406. solace_agent_mesh/common/mysql_database.py +0 -40
  407. solace_agent_mesh/common/postgres_database.py +0 -85
  408. solace_agent_mesh/common/prompt_templates.py +0 -28
  409. solace_agent_mesh/common/stimulus_utils.py +0 -152
  410. solace_agent_mesh/common/time.py +0 -24
  411. solace_agent_mesh/common/utils.py +0 -712
  412. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-a-zJ6rLx.js +0 -46
  413. solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
  414. solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
  415. solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-44c41103.js +0 -1
  416. solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
  417. solace_agent_mesh/configs/agent_global.yaml +0 -74
  418. solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
  419. solace_agent_mesh/configs/agent_slack.yaml +0 -64
  420. solace_agent_mesh/configs/agent_web_request.yaml +0 -75
  421. solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
  422. solace_agent_mesh/configs/error_catcher.yaml +0 -56
  423. solace_agent_mesh/configs/monitor.yaml +0 -0
  424. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
  425. solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
  426. solace_agent_mesh/configs/orchestrator.yaml +0 -241
  427. solace_agent_mesh/configs/service_embedding.yaml +0 -81
  428. solace_agent_mesh/configs/service_llm.yaml +0 -265
  429. solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
  430. solace_agent_mesh/gateway/components/gateway_base.py +0 -47
  431. solace_agent_mesh/gateway/components/gateway_input.py +0 -278
  432. solace_agent_mesh/gateway/components/gateway_output.py +0 -298
  433. solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
  434. solace_agent_mesh/gateway/identity/identity_base.py +0 -10
  435. solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
  436. solace_agent_mesh/gateway/identity/no_identity.py +0 -9
  437. solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
  438. solace_agent_mesh/monitors/base_monitor_component.py +0 -26
  439. solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
  440. solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
  441. solace_agent_mesh/orchestrator/__init__.py +0 -0
  442. solace_agent_mesh/orchestrator/action_manager.py +0 -237
  443. solace_agent_mesh/orchestrator/components/__init__.py +0 -0
  444. solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
  445. solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
  446. solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
  447. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
  448. solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
  449. solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
  450. solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
  451. solace_agent_mesh/services/__init__.py +0 -0
  452. solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
  453. solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
  454. solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
  455. solace_agent_mesh/services/common/__init__.py +0 -4
  456. solace_agent_mesh/services/common/auto_expiry.py +0 -45
  457. solace_agent_mesh/services/common/singleton.py +0 -18
  458. solace_agent_mesh/services/file_service/__init__.py +0 -14
  459. solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
  460. solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
  461. solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
  462. solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
  463. solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
  464. solace_agent_mesh/services/file_service/file_service.py +0 -437
  465. solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
  466. solace_agent_mesh/services/file_service/file_transformations.py +0 -141
  467. solace_agent_mesh/services/file_service/file_utils.py +0 -324
  468. solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
  469. solace_agent_mesh/services/history_service/__init__.py +0 -3
  470. solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
  471. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
  472. solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
  473. solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
  474. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
  475. solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
  476. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
  477. solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
  478. solace_agent_mesh/services/history_service/history_service.py +0 -413
  479. solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
  480. solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
  481. solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
  482. solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
  483. solace_agent_mesh/services/middleware_service/__init__.py +0 -0
  484. solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
  485. solace_agent_mesh/templates/action.py +0 -38
  486. solace_agent_mesh/templates/agent.py +0 -29
  487. solace_agent_mesh/templates/agent.yaml +0 -70
  488. solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
  489. solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
  490. solace_agent_mesh/templates/gateway-flows.yaml +0 -78
  491. solace_agent_mesh/templates/gateway-header.yaml +0 -16
  492. solace_agent_mesh/templates/gateway_base.py +0 -15
  493. solace_agent_mesh/templates/gateway_input.py +0 -98
  494. solace_agent_mesh/templates/gateway_output.py +0 -71
  495. solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
  496. solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
  497. solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
  498. solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
  499. solace_agent_mesh/templates/slack-default-config.yaml +0 -16
  500. solace_agent_mesh/templates/slack-flows.yaml +0 -81
  501. solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
  502. solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
  503. solace_agent_mesh/templates/web-default-config.yaml +0 -10
  504. solace_agent_mesh/templates/web-flows.yaml +0 -76
  505. solace_agent_mesh/tools/__init__.py +0 -0
  506. solace_agent_mesh/tools/components/__init__.py +0 -0
  507. solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
  508. solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
  509. solace_agent_mesh/tools/config/runtime_config.py +0 -26
  510. solace_agent_mesh-0.2.4.dist-info/METADATA +0 -176
  511. solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
  512. solace_agent_mesh-0.2.4.dist-info/entry_points.txt +0 -3
  513. /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
  514. /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
  515. /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
  516. /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
  517. /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
  518. /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
  519. /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
  520. /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
  521. {solace_agent_mesh-0.2.4.dist-info → solace_agent_mesh-1.0.2.dist-info}/WHEEL +0 -0
@@ -2,273 +2,643 @@ import sys
2
2
  from flask import Flask, jsonify, request, send_from_directory, send_file
3
3
  from flask_cors import CORS
4
4
  import os
5
- import sys
6
- from solace_agent_mesh.config_portal.backend.common import default_options, CONTAINER_RUN_COMMAND
5
+ from pathlib import Path
6
+ from .common import (
7
+ INIT_DEFAULT,
8
+ CONTAINER_RUN_COMMAND,
9
+ AGENT_DEFAULTS,
10
+ GATEWAY_DEFAULTS,
11
+ USE_DEFAULT_SHARED_ARTIFACT,
12
+ )
7
13
  from cli.utils import get_formatted_names
14
+
8
15
  import shutil
9
16
  import litellm
10
- from solace.messaging.messaging_service import MessagingService
11
- from solace.messaging.config.retry_strategy import RetryStrategy
12
- from solace.messaging.errors.pubsubplus_client_error import PubSubPlusClientError
13
- import certifi
14
-
15
- litellm.suppress_debug_info = True
17
+ from collections import defaultdict
16
18
 
17
- #disable flask startup banner
18
19
  import logging
19
- log = logging.getLogger('werkzeug')
20
+
21
+ log = logging.getLogger("werkzeug")
20
22
  log.disabled = True
21
- cli = sys.modules['flask.cli']
22
- cli.show_server_banner = lambda *x: None
23
+ cli_flask = sys.modules["flask.cli"]
24
+ cli_flask.show_server_banner = lambda *x: None
25
+ litellm.suppress_debug_info = True
26
+
27
+ config_portal_host = "CONFIG_PORTAL_HOST"
28
+
29
+ try:
30
+ from solace_agent_mesh.agent.tools.registry import tool_registry
31
+ except ImportError as err:
32
+ try:
33
+ from src.solace_agent_mesh.agent.tools.registry import tool_registry
34
+ except ImportError as exc:
35
+ log.error(
36
+ "Importing tool_registry failed. Ensure all the dependencies are installed and the import paths are correct, Error: %s",
37
+ str(err),
38
+ )
39
+ raise err from exc
40
+
41
+
42
+ def get_agent_field_definitions():
43
+ fields = []
44
+ fields.append(
45
+ {
46
+ "name": "agent_name",
47
+ "label": "Agent Name",
48
+ "type": "text",
49
+ "required": True,
50
+ "description": "Unique name for this agent (will be CamelCased).",
51
+ "default": "MyNewAgent",
52
+ }
53
+ )
54
+ fields.append(
55
+ {
56
+ "name": "namespace",
57
+ "label": "A2A Namespace",
58
+ "type": "text",
59
+ "default": AGENT_DEFAULTS["namespace"],
60
+ "description": "A2A topic namespace (e.g., myorg/dev). Can use ${NAMESPACE}.",
61
+ }
62
+ )
63
+ fields.append(
64
+ {
65
+ "name": "supports_streaming",
66
+ "label": "Supports Streaming",
67
+ "type": "boolean",
68
+ "default": AGENT_DEFAULTS["supports_streaming"],
69
+ }
70
+ )
71
+ fields.append(
72
+ {
73
+ "name": "model_type",
74
+ "label": "Model Type",
75
+ "type": "select",
76
+ "options": [
77
+ "planning",
78
+ "general",
79
+ "image_gen",
80
+ "report_gen",
81
+ "multimodal",
82
+ "gemini_pro",
83
+ ],
84
+ "default": AGENT_DEFAULTS["model_type"],
85
+ }
86
+ )
87
+ fields.append(
88
+ {
89
+ "name": "instruction",
90
+ "label": "Instruction",
91
+ "type": "textarea",
92
+ "default": AGENT_DEFAULTS["instruction"].replace(
93
+ "__AGENT_NAME__", "__AGENT_NAME__"
94
+ ),
95
+ "description": "System instruction for the agent.",
96
+ }
97
+ )
98
+
99
+ fields.append(
100
+ {
101
+ "name": "session_service_type",
102
+ "label": "Session Service Type",
103
+ "type": "select",
104
+ "options": ["memory", "vertex_rag"],
105
+ "default": AGENT_DEFAULTS["session_service_type"],
106
+ }
107
+ )
108
+ fields.append(
109
+ {
110
+ "name": "session_service_behavior",
111
+ "label": "Session Service Behavior",
112
+ "type": "select",
113
+ "options": ["PERSISTENT", "RUN_BASED"],
114
+ "default": AGENT_DEFAULTS["session_service_behavior"],
115
+ }
116
+ )
117
+
118
+ fields.append(
119
+ {
120
+ "name": "artifact_service_type",
121
+ "label": "Artifact Service Type",
122
+ "type": "select",
123
+ "options": ["memory", "filesystem", "gcs"],
124
+ "default": AGENT_DEFAULTS["artifact_service_type"],
125
+ }
126
+ )
127
+ fields.append(
128
+ {
129
+ "name": "artifact_service_base_path",
130
+ "label": "Artifact Service Base Path (if filesystem)",
131
+ "type": "text",
132
+ "default": AGENT_DEFAULTS["artifact_service_base_path"],
133
+ "condition": {"field": "artifact_service_type", "value": "filesystem"},
134
+ }
135
+ )
136
+ fields.append(
137
+ {
138
+ "name": "artifact_service_scope",
139
+ "label": "Artifact Service Scope",
140
+ "type": "select",
141
+ "options": ["namespace", "app", "custom"],
142
+ "default": AGENT_DEFAULTS["artifact_service_scope"],
143
+ }
144
+ )
145
+
146
+ fields.append(
147
+ {
148
+ "name": "artifact_handling_mode",
149
+ "label": "Artifact Handling Mode",
150
+ "type": "select",
151
+ "options": ["ignore", "embed", "reference"],
152
+ "default": AGENT_DEFAULTS["artifact_handling_mode"],
153
+ }
154
+ )
155
+ fields.append(
156
+ {
157
+ "name": "enable_embed_resolution",
158
+ "label": "Enable Embed Resolution",
159
+ "type": "boolean",
160
+ "default": AGENT_DEFAULTS["enable_embed_resolution"],
161
+ }
162
+ )
163
+ fields.append(
164
+ {
165
+ "name": "enable_artifact_content_instruction",
166
+ "label": "Enable Artifact Content Instruction",
167
+ "type": "boolean",
168
+ "default": AGENT_DEFAULTS["enable_artifact_content_instruction"],
169
+ }
170
+ )
171
+ fields.append(
172
+ {
173
+ "name": "agent_card_description",
174
+ "label": "Agent Card Description",
175
+ "type": "textarea",
176
+ "default": AGENT_DEFAULTS["agent_card_description"],
177
+ }
178
+ )
179
+ fields.append(
180
+ {
181
+ "name": "agent_card_default_input_modes_str",
182
+ "label": "Agent Card Default Input Modes (comma-sep)",
183
+ "type": "text",
184
+ "default": ",".join(AGENT_DEFAULTS["agent_card_default_input_modes"]),
185
+ }
186
+ )
187
+ fields.append(
188
+ {
189
+ "name": "agent_card_default_output_modes_str",
190
+ "label": "Agent Card Default Output Modes (comma-sep)",
191
+ "type": "text",
192
+ "default": ",".join(AGENT_DEFAULTS["agent_card_default_output_modes"]),
193
+ }
194
+ )
195
+
196
+ fields.append(
197
+ {
198
+ "name": "agent_card_publishing_interval",
199
+ "label": "Agent Card Publishing Interval (s)",
200
+ "type": "number",
201
+ "default": AGENT_DEFAULTS["agent_card_publishing_interval"],
202
+ }
203
+ )
204
+ fields.append(
205
+ {
206
+ "name": "agent_discovery_enabled",
207
+ "label": "Enable Agent Discovery",
208
+ "type": "boolean",
209
+ "default": AGENT_DEFAULTS["agent_discovery_enabled"],
210
+ }
211
+ )
212
+
213
+ fields.append(
214
+ {
215
+ "name": "inter_agent_communication_allow_list_str",
216
+ "label": "Inter-Agent Allow List (comma-sep)",
217
+ "type": "text",
218
+ "default": ",".join(AGENT_DEFAULTS["inter_agent_communication_allow_list"]),
219
+ }
220
+ )
221
+ fields.append(
222
+ {
223
+ "name": "inter_agent_communication_deny_list_str",
224
+ "label": "Inter-Agent Deny List (comma-sep)",
225
+ "type": "text",
226
+ "default": ",".join(AGENT_DEFAULTS["inter_agent_communication_deny_list"]),
227
+ }
228
+ )
229
+ fields.append(
230
+ {
231
+ "name": "inter_agent_communication_timeout",
232
+ "label": "Inter-Agent Timeout (s)",
233
+ "type": "number",
234
+ "default": AGENT_DEFAULTS["inter_agent_communication_timeout"],
235
+ }
236
+ )
237
+
238
+ return fields
239
+
23
240
 
24
241
  def create_app(shared_config=None):
25
242
  """Factory function that creates the Flask application with configuration injected"""
26
243
  app = Flask(__name__)
27
- CORS(app, resources={r"/api/*": {"origins": ["http://localhost:5174", "http://127.0.0.1:5174"]}})
244
+ CORS(app, resources={r"/api/*": {"origins": "*"}})
28
245
 
29
- EXCLUDE_OPTIONS = ["config_dir", "module_dir", "env_file", "build_dir", "container_engine", "rest_api_enabled",
30
- "rest_api_server_input_port", "rest_api_server_host", "rest_api_server_input_endpoint",
31
- "rest_api_gateway_name", "webui_enabled", "webui_listen_port", "webui_host"]
246
+ EXCLUDE_OPTIONS = ["container_engine"]
32
247
 
33
- @app.route('/api/default_options', methods=['GET'])
248
+ @app.route("/api/default_options", methods=["GET"])
34
249
  def get_default_options():
35
- """Endpoint that returns the default options for form initialization"""
36
- path = request.args.get('path', 'advanced')
37
-
38
- modified_default_options = default_options.copy()
39
-
40
- # Base exclusions for all paths
250
+ """Endpoint that returns the default options for form initialization (init flow)"""
251
+ path = request.args.get("path", "advanced")
252
+
253
+ modified_default_options = INIT_DEFAULT.copy()
254
+
41
255
  base_exclude_options = EXCLUDE_OPTIONS.copy()
42
-
43
- # Additional exclusions for quick path
44
256
  quick_path_exclude_options = [
45
- "namespace", "broker_type", "broker_url", "broker_vpn",
46
- "broker_username", "broker_password", "container_engine",
47
- "built_in_agent", "file_service_provider", "file_service_config"
257
+ "broker_url",
258
+ "broker_vpn",
259
+ "broker_username",
260
+ "broker_password",
261
+ "container_engine",
48
262
  ]
49
-
50
- # Apply exclusions based on path
263
+
51
264
  exclude_options = base_exclude_options.copy()
52
- if path == 'quick':
265
+ if path == "quick":
53
266
  exclude_options.extend(quick_path_exclude_options)
54
-
55
- # Remove excluded options
267
+ modified_default_options["dev_mode"] = True
268
+ modified_default_options["broker_type"] = "3"
56
269
  for option in exclude_options:
57
270
  modified_default_options.pop(option, None)
58
-
59
- return jsonify({
60
- "default_options": modified_default_options,
61
- "status": "success"
62
- })
63
271
 
64
- @app.route('/api/save_config', methods=['POST'])
65
- def save_config():
272
+ return jsonify(
273
+ {"default_options": modified_default_options, "status": "success"}
274
+ )
275
+
276
+ @app.route("/api/form_schema", methods=["GET"])
277
+ def get_form_schema():
278
+ """
279
+ Endpoint that returns defaults and field definitions for a given component type.
280
+ """
281
+ component_type = request.args.get("type", "agent")
282
+
283
+ if component_type == "agent":
284
+ return jsonify(
285
+ {
286
+ "status": "success",
287
+ "schema_type": "agent",
288
+ "defaults": AGENT_DEFAULTS,
289
+ "field_definitions": get_agent_field_definitions(),
290
+ }
291
+ )
292
+ elif component_type == "gateway":
293
+ return jsonify(
294
+ {
295
+ "status": "success",
296
+ "schema_type": "gateway",
297
+ "defaults": GATEWAY_DEFAULTS,
298
+ "meta": {
299
+ "artifact_service_types": [
300
+ USE_DEFAULT_SHARED_ARTIFACT,
301
+ "memory",
302
+ "filesystem",
303
+ "gcs",
304
+ ],
305
+ "artifact_service_scopes": ["namespace", "app", "custom"],
306
+ },
307
+ }
308
+ )
309
+ else:
310
+ return (
311
+ jsonify({"status": "error", "message": "Invalid component type"}),
312
+ 400,
313
+ )
314
+
315
+ @app.route("/api/available_tools", methods=["GET"])
316
+ def get_available_tools():
66
317
  """
67
- Endpoint that accepts configuration data from the frontend,
68
- merges it with default options, and updates the shared configuration.
318
+ Endpoint that returns a structured list of all available built-in tools and groups.
69
319
  """
320
+ try:
321
+ all_tools = tool_registry.get_all_tools()
322
+
323
+ groups = defaultdict(lambda: {"description": "", "tools": []})
324
+ tools_map = {}
325
+
326
+ group_descriptions = {
327
+ "artifact_management": "Creating, loading, and managing files and artifacts.",
328
+ "data_analysis": "Querying, transforming, and visualizing data.",
329
+ "general": "General purpose utilities like file conversion and diagram generation.",
330
+ "web": "Interacting with web resources via HTTP requests.",
331
+ "audio": "Generating and transcribing audio content.",
332
+ "image": "Generating, describing, and editing images.",
333
+ "test": "Tools for testing and development purposes.",
334
+ }
335
+
336
+ for tool in sorted(all_tools, key=lambda t: (t.category, t.name)):
337
+ groups[tool.category]["tools"].append(tool.name)
338
+ if not groups[tool.category]["description"]:
339
+ groups[tool.category]["description"] = group_descriptions.get(
340
+ tool.category,
341
+ f"Tools related to {tool.category.replace('_', ' ').title()}.",
342
+ )
343
+ tools_map[tool.name] = {
344
+ "description": tool.description,
345
+ "category": tool.category,
346
+ }
347
+
348
+ return jsonify(
349
+ {"status": "success", "groups": dict(groups), "tools": tools_map}
350
+ )
351
+ except Exception as e:
352
+ app.logger.error(f"Error in get_available_tools: {e}", exc_info=True)
353
+ return jsonify({"status": "error", "message": str(e)}), 500
354
+
355
+ @app.route("/api/save_gateway_config", methods=["POST"])
356
+ def save_gateway_config_route():
357
+ """
358
+ Accepts gateway configuration from frontend and passes it back to CLI via shared_config.
359
+ """
360
+ try:
361
+ data = request.json
362
+ if not data:
363
+ return jsonify({"status": "error", "message": "No data received"}), 400
364
+
365
+ gateway_name_input = data.get("gateway_name_input")
366
+ config_options = data.get("config")
367
+
368
+ if not gateway_name_input or not isinstance(config_options, dict):
369
+ return (
370
+ jsonify(
371
+ {
372
+ "status": "error",
373
+ "message": "Missing gateway_name_input or config data",
374
+ }
375
+ ),
376
+ 400,
377
+ )
378
+
379
+ if "namespace" not in config_options:
380
+ config_options["namespace"] = GATEWAY_DEFAULTS.get(
381
+ "namespace", "${NAMESPACE}"
382
+ )
383
+
384
+ if shared_config is not None:
385
+ shared_config["status"] = "success_from_gui_save"
386
+ shared_config["gateway_name_input"] = gateway_name_input
387
+ shared_config["config"] = config_options
388
+
389
+ return jsonify(
390
+ {
391
+ "status": "success",
392
+ "message": "Gateway configuration data received by server. CLI will process.",
393
+ }
394
+ )
395
+
396
+ except Exception as e:
397
+ app.logger.error(f"Error in save_gateway_config_route: {e}", exc_info=True)
398
+ if shared_config is not None:
399
+ shared_config["status"] = "error_in_gui_save"
400
+ shared_config["message"] = str(e)
401
+ return jsonify({"status": "error", "message": str(e)}), 500
402
+
403
+ @app.route("/api/save_agent_config", methods=["POST"])
404
+ def save_agent_config_route():
405
+ """
406
+ Accepts agent configuration from frontend and passes it back to CLI via shared_config.
407
+ """
408
+ try:
409
+ data = request.json
410
+ if not data:
411
+ return jsonify({"status": "error", "message": "No data received"}), 400
412
+
413
+ agent_name_input = data.get("agent_name_input")
414
+ config_options = data.get("config")
415
+
416
+ if not agent_name_input or not config_options:
417
+ return (
418
+ jsonify(
419
+ {
420
+ "status": "error",
421
+ "message": "Missing agent_name_input or config data",
422
+ }
423
+ ),
424
+ 400,
425
+ )
426
+
427
+ str_list_keys_to_process = {
428
+ "agent_card_default_input_modes_str": "agent_card_default_input_modes",
429
+ "agent_card_default_output_modes_str": "agent_card_default_output_modes",
430
+ "inter_agent_communication_allow_list_str": "inter_agent_communication_allow_list",
431
+ "inter_agent_communication_deny_list_str": "inter_agent_communication_deny_list",
432
+ }
433
+ processed_options = config_options.copy()
434
+ for key_str, original_key in str_list_keys_to_process.items():
435
+ if key_str in processed_options and isinstance(
436
+ processed_options[key_str], str
437
+ ):
438
+ processed_options[original_key] = [
439
+ s.strip()
440
+ for s in processed_options[key_str].split(",")
441
+ if s.strip()
442
+ ]
443
+ elif original_key not in processed_options:
444
+ processed_options[original_key] = []
445
+
446
+ if "agent_card_skills" in processed_options and isinstance(
447
+ processed_options["agent_card_skills"], list
448
+ ):
449
+ if "agent_card_skills_str" in processed_options:
450
+ del processed_options["agent_card_skills_str"]
451
+ elif "agent_card_skills_str" in processed_options and isinstance(
452
+ processed_options["agent_card_skills_str"], str
453
+ ):
454
+ try:
455
+ import json
456
+
457
+ parsed_skills = json.loads(
458
+ processed_options["agent_card_skills_str"]
459
+ )
460
+ if isinstance(parsed_skills, list):
461
+ processed_options["agent_card_skills"] = parsed_skills
462
+ else:
463
+ app.logger.warn(
464
+ f"Parsed agent_card_skills_str was not a list: {parsed_skills}. Defaulting to empty list."
465
+ )
466
+ processed_options["agent_card_skills"] = []
467
+ except json.JSONDecodeError:
468
+ app.logger.warn(
469
+ f"Could not parse agent_card_skills_str: {processed_options['agent_card_skills_str']}. Defaulting to empty list."
470
+ )
471
+ processed_options["agent_card_skills"] = []
472
+ elif "agent_card_skills" not in processed_options:
473
+ processed_options["agent_card_skills"] = []
474
+
475
+ formatted_names = get_formatted_names(agent_name_input)
476
+ processed_options["agent_name"] = formatted_names["PASCAL_CASE_NAME"]
477
+ if shared_config is not None:
478
+ shared_config["status"] = "success_from_gui_save"
479
+ shared_config["agent_name_input"] = agent_name_input
480
+ shared_config["config"] = processed_options
481
+ return jsonify(
482
+ {
483
+ "status": "success",
484
+ "message": "Agent configuration data received by server. CLI will process.",
485
+ }
486
+ )
487
+
488
+ except Exception as e:
489
+ app.logger.error(f"Error in save_agent_config_route: {e}", exc_info=True)
490
+ if shared_config is not None:
491
+ shared_config["status"] = "error_in_gui_save"
492
+ shared_config["message"] = str(e)
493
+ return jsonify({"status": "error", "message": str(e)}), 500
494
+
495
+ @app.route("/api/save_config", methods=["POST"])
496
+ def save_config():
70
497
  try:
71
498
  received_data = request.json
72
- force = received_data.pop('force', False)
499
+ force = received_data.pop("force", False)
73
500
 
74
501
  if not received_data:
75
502
  return jsonify({"status": "error", "message": "No data received"}), 400
76
-
77
- complete_config = default_options.copy()
78
-
79
- # Update with the received data
503
+
504
+ complete_config = INIT_DEFAULT.copy()
80
505
  for key, value in received_data.items():
81
506
  if key in complete_config or key:
82
507
  complete_config[key] = value
83
-
84
- config_directory = complete_config["config_dir"]
85
- formatted_name = get_formatted_names(complete_config["rest_api_gateway_name"])
86
- gateway_directory = os.path.join(
87
- config_directory, "gateways", formatted_name["SNAKE_CASE_NAME"]
88
- )
89
-
90
- #Handle the case where the gateway directory for rest already exists
91
- if os.path.exists(gateway_directory) and not force:
92
- return jsonify({"status": "ask_confirmation", "message": f"Gateway directory {gateway_directory} already exists, it will be overwritten."}), 400
93
- elif os.path.exists(gateway_directory) and force:
94
- shutil.rmtree(gateway_directory)
95
508
 
96
- # Update the shared configuration if it exists
97
509
  if shared_config is not None:
98
510
  for key, value in complete_config.items():
99
511
  shared_config[key] = value
100
-
101
- return jsonify({
102
- "status": "success",
103
- })
104
-
512
+
513
+ return jsonify({"status": "success"})
514
+
105
515
  except Exception as e:
516
+ app.logger.error(f"Error in save_config: {e}", exc_info=True)
106
517
  return jsonify({"status": "error", "message": str(e)}), 500
107
-
108
- @app.route('/api/test_llm_config', methods=['POST'])
518
+
519
+ @app.route("/api/test_llm_config", methods=["POST"])
109
520
  def test_llm_config():
110
- """
111
- Endpoint that tests the LLM configuration given by the users"""
112
521
  llm_config = request.json
113
-
114
- #check for all values
115
- if not llm_config.get("model") or not llm_config.get("api_key") or not llm_config.get("base_url"):
116
- return jsonify({"status": "error", "message": "Please provide all the required values"}), 400
117
-
522
+ if (
523
+ not llm_config.get("model")
524
+ or not llm_config.get("api_key")
525
+ or not llm_config.get("base_url")
526
+ ):
527
+ return (
528
+ jsonify(
529
+ {
530
+ "status": "error",
531
+ "message": "Please provide all the required values",
532
+ }
533
+ ),
534
+ 400,
535
+ )
118
536
  try:
119
537
  response = litellm.completion(
120
538
  model=llm_config.get("model"),
121
539
  api_key=llm_config.get("api_key"),
122
540
  base_url=llm_config.get("base_url"),
123
- messages=[{"role":"user","content": "Say OK"}]
124
- )
541
+ messages=[{"role": "user", "content": "Say OK"}],
542
+ )
125
543
  message = response.get("choices")[0].get("message")
126
-
127
544
  if message is not None:
128
545
  return jsonify({"status": "success", "message": message.content}), 200
129
546
  else:
130
547
  raise ValueError("No response from LLM")
131
- except Exception:
548
+ except Exception:
132
549
  return jsonify({"status": "error", "message": "No response from LLM."}), 400
133
550
 
134
- @app.route('/api/test_broker_connection', methods=['POST'])
135
- def test_broker_connection():
136
- try:
137
- broker_details = request.json
138
- if not all(k in broker_details for k in ["broker_url", "broker_vpn", "broker_username", "broker_password"]):
139
- return jsonify({"status": "error", "message": "Missing required broker details."}), 400
140
-
141
- broker_props = {
142
- "solace.messaging.transport.host": broker_details.get("broker_url"),
143
- "solace.messaging.service.vpn-name": broker_details.get("broker_vpn"),
144
- "solace.messaging.authentication.scheme.basic.username": broker_details.get("broker_username"),
145
- "solace.messaging.authentication.scheme.basic.password": broker_details.get("broker_password"),
146
- "solace.messaging.tls.trust-store-path": os.environ.get("TRUST_STORE")
147
- or os.path.dirname(certifi.where())
148
- or "/usr/share/ca-certificates/mozilla/",
149
- }
150
-
151
- retry_count = 1
152
- retry_interval = 3000
153
-
154
- messaging_service = MessagingService.builder().from_properties(broker_props) \
155
- .with_connection_retry_strategy(
156
- RetryStrategy.parametrized_retry(retry_count, retry_interval)
157
- ).build()
158
-
159
- try:
160
- messaging_service.connect()
161
- messaging_service.disconnect()
162
- return jsonify({"status": "success", "message": "Successfully connected to the Solace broker."}), 200
163
- except PubSubPlusClientError as e:
164
- return jsonify({"status": "error", "message": f"Connection failed: {str(e)}"}), 400
165
- except Exception as e:
166
- return jsonify({"status": "error", "message": f"An unexpected error occurred: {str(e)}"}), 500
167
-
168
- except Exception as e:
169
- # Catch errors in request processing or setup
170
- return jsonify({"status": "error", "message": f"Server error: {str(e)}"}), 500
171
-
172
-
173
- @app.route('/api/runcontainer', methods=['POST'])
551
+ @app.route("/api/runcontainer", methods=["POST"])
174
552
  def runcontainer():
175
553
  try:
176
554
  data = request.json or {}
177
-
178
- # Check if the user has podman or docker installed
179
555
  has_podman = shutil.which("podman") is not None
180
556
  has_docker = shutil.which("docker") is not None
181
-
182
557
  if not has_podman and not has_docker:
183
- return jsonify({
184
- "status": "error",
185
- "message": "You need to have either podman or docker installed to use the container broker."
186
- }), 400
187
-
188
- # Determine which container engine to use
189
- container_engine = data.get('container_engine')
190
-
191
- # If both are available, default to podman
558
+ return (
559
+ jsonify(
560
+ {
561
+ "status": "error",
562
+ "message": "You need to have either podman or docker installed.",
563
+ }
564
+ ),
565
+ 400,
566
+ )
567
+
568
+ container_engine = data.get("container_engine")
192
569
  if not container_engine and has_podman and has_docker:
193
570
  container_engine = "podman"
194
- # If only one is available, use that one
195
571
  elif not container_engine:
196
572
  container_engine = "podman" if has_podman else "docker"
197
-
198
- # Validate the container engine selection
573
+
199
574
  if container_engine not in ["podman", "docker"]:
200
- return jsonify({
201
- "status": "error",
202
- "message": f"Invalid container engine: {container_engine}. Must be 'podman' or 'docker'."
203
- }), 400
204
-
575
+ return jsonify({"status": "error", "message": "Invalid engine."}), 400
205
576
  if container_engine == "podman" and not has_podman:
206
- return jsonify({
207
- "status": "error",
208
- "message": "Podman was selected but is not installed on this system."
209
- }), 400
210
-
577
+ return (
578
+ jsonify({"status": "error", "message": "Podman not installed."}),
579
+ 400,
580
+ )
211
581
  if container_engine == "docker" and not has_docker:
212
- return jsonify({
213
- "status": "error",
214
- "message": "Docker was selected but is not installed on this system."
215
- }), 400
216
-
217
- # Run command for the container start
582
+ return (
583
+ jsonify({"status": "error", "message": "Docker not installed."}),
584
+ 400,
585
+ )
586
+
218
587
  command = container_engine + CONTAINER_RUN_COMMAND
219
-
220
- # Execute the command and capture exit code
221
588
  response_status = os.system(command)
222
-
589
+
223
590
  if response_status != 0:
224
- return jsonify({
225
- "status": "error",
226
- "message": f"Failed to start container. Exit code: {response_status}"
227
- }), 500
228
-
229
- return jsonify({
230
- "status": "success",
231
- "message": f"Successfully started Solace PubSub+ broker container using {container_engine}",
232
- "container_engine": container_engine
233
- })
234
-
591
+ return (
592
+ jsonify(
593
+ {
594
+ "status": "error",
595
+ "message": "The creation of a new container failed. You can try switching to dev mode or existing broker mode. You can also check this url to find possible solutions https://docs.solace.com/Software-Broker/Container-Tasks/rootless-containers.htm#rootful-versus-rootless-containers",
596
+ }
597
+ ),
598
+ 500,
599
+ )
600
+ return jsonify(
601
+ {
602
+ "status": "success",
603
+ "message": f"Started container via {container_engine}",
604
+ "container_engine": container_engine,
605
+ }
606
+ )
235
607
  except Exception as e:
236
608
  return jsonify({"status": "error", "message": str(e)}), 500
237
609
 
238
-
239
- @app.route('/api/shutdown', methods=['POST'])
610
+ @app.route("/api/shutdown", methods=["POST"])
240
611
  def shutdown():
241
612
  """Kills this Flask process immediately"""
242
613
  response = jsonify({"message": "Server shutting down...", "status": "success"})
243
- os._exit(0)
614
+ os._exit(0)
244
615
  return response
245
-
246
616
 
617
+ frontend_static_dir = (
618
+ Path(__file__).resolve().parent.parent / "frontend" / "static" / "client"
619
+ )
247
620
 
248
621
  @app.route("/assets/<path:path>")
249
622
  def serve_assets(path):
250
- return send_from_directory("../frontend/static/client/assets", path)
623
+ return send_from_directory(frontend_static_dir / "assets", path)
251
624
 
252
625
  @app.route("/static/client/<path:path>")
253
626
  def serve_client_files(path):
254
- return send_from_directory("../frontend/static/client", path)
627
+ return send_from_directory(frontend_static_dir, path)
255
628
 
256
629
  @app.route("/", defaults={"path": ""})
257
- def serve(path):
258
- return send_file("../frontend/static/client/index.html")
259
-
260
630
  @app.route("/<path:path>")
261
- def serve_files(path):
262
- if path.endswith(('.png', '.jpg', '.jpeg', '.gif', '.ico')):
263
- return send_from_directory("../frontend/static/client", path)
264
- return send_file("../frontend/static/client/index.html")
265
-
631
+ def serve_index(path):
632
+ if os.path.splitext(path)[1] and os.path.exists(frontend_static_dir / path):
633
+ return send_from_directory(frontend_static_dir, path)
634
+ return send_file(frontend_static_dir / "index.html")
635
+
266
636
  return app
267
637
 
638
+
268
639
  def run_flask(host="127.0.0.1", port=5002, shared_config=None):
269
- """
270
- Run the Flask development server with dependency-injected shared configuration.
271
- """
640
+ host = os.environ.get(config_portal_host, host)
272
641
  app = create_app(shared_config)
642
+ app.logger.setLevel(logging.INFO)
643
+ app.logger.info(f"Starting Flask app on {host}:{port}")
273
644
  app.run(host=host, port=port, debug=False, use_reloader=False)
274
-