legate 0.1.0

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.
Files changed (317) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +345 -0
  4. data/bin/legate +13 -0
  5. data/examples/00_quickstart.rb +51 -0
  6. data/examples/01_simple_agent.rb +105 -0
  7. data/examples/02_multi_tool_agent.rb +140 -0
  8. data/examples/03_custom_tool.rb +93 -0
  9. data/examples/04_agent_instructions.rb +84 -0
  10. data/examples/05_state_and_sessions.rb +91 -0
  11. data/examples/06_callbacks.rb +186 -0
  12. data/examples/07_async_jobs.rb +112 -0
  13. data/examples/08_loop_agent.rb +197 -0
  14. data/examples/09_sequential_workflow.rb +40 -0
  15. data/examples/10_parallel_workflow.rb +34 -0
  16. data/examples/11_agent_delegation.rb +24 -0
  17. data/examples/12_http_client_tool.rb +156 -0
  18. data/examples/13_authentication.rb +220 -0
  19. data/examples/14_mcp_client.rb +154 -0
  20. data/examples/15_mcp_server.rb +79 -0
  21. data/examples/16_webhooks.rb +91 -0
  22. data/examples/README_sequential_agents.md +164 -0
  23. data/examples/advanced/auth/cookie_auth_tool.rb +146 -0
  24. data/examples/advanced/auth/custom_auth_flows_example.rb +626 -0
  25. data/examples/advanced/auth/excon_middleware.rb +317 -0
  26. data/examples/advanced/auth/excon_middleware_auth.rb +399 -0
  27. data/examples/advanced/auth/fiber_auth_example.rb +281 -0
  28. data/examples/advanced/auth/fiber_oidc_example.rb +403 -0
  29. data/examples/advanced/auth/httpbin_bearer_tool.rb +159 -0
  30. data/examples/advanced/auth/oauth2_auth.rb +419 -0
  31. data/examples/advanced/auth/oidc_auth.rb +514 -0
  32. data/examples/advanced/auth/openweather_api.rb +251 -0
  33. data/examples/advanced/auth/openweather_tool.rb +153 -0
  34. data/examples/advanced/auth/query_param_middleware_test.rb +138 -0
  35. data/examples/advanced/auth/service_account.rb +135 -0
  36. data/examples/advanced/auth/test_with_httpbin.rb +202 -0
  37. data/examples/advanced/auth/token_lifecycle_example.rb +428 -0
  38. data/examples/advanced/callback_monitoring.rb +679 -0
  39. data/examples/advanced/mas/fixed_delegation_example.rb +191 -0
  40. data/examples/advanced/mas/loop_workflow.rb +28 -0
  41. data/examples/advanced/mas/mock_planner.rb +77 -0
  42. data/examples/advanced/mas/proper_delegation_example.rb +276 -0
  43. data/examples/advanced/mcp/legate_mcp_server_resource_example.rb +182 -0
  44. data/examples/advanced/mcp/mcp_resource_server_example.rb +309 -0
  45. data/examples/advanced/mcp/mcp_server_async.rb +76 -0
  46. data/examples/advanced/mcp/mcp_server_async_tools.rb +122 -0
  47. data/examples/advanced/mcp/mcp_server_legate_agent.rb +95 -0
  48. data/examples/advanced/mcp/mcp_server_rack.rb +89 -0
  49. data/examples/advanced/random_calculator.rb +104 -0
  50. data/examples/advanced/sleep_agent.rb +153 -0
  51. data/examples/advanced/webhooks/webhook_e2e_runner.rb +110 -0
  52. data/examples/advanced/webhooks/webhook_receiver_agent.rb +58 -0
  53. data/examples/advanced/workflows/task_refinement_loop_agent.rb +278 -0
  54. data/examples/advanced/workflows/travel_planner_auto_sequential.rb +444 -0
  55. data/examples/advanced/workflows/travel_planner_parallel.rb +656 -0
  56. data/examples/advanced/workflows/travel_planner_sequential.rb +512 -0
  57. data/examples/tools/oauth2_example.rb +136 -0
  58. data/examples/tools/sleepy_tool.rb +42 -0
  59. data/lib/legate/activity_log.rb +71 -0
  60. data/lib/legate/agent.rb +959 -0
  61. data/lib/legate/agent_code_generator.rb +185 -0
  62. data/lib/legate/agent_definition.rb +812 -0
  63. data/lib/legate/agentic/decision.rb +49 -0
  64. data/lib/legate/agentic/loop.rb +134 -0
  65. data/lib/legate/agentic.rb +5 -0
  66. data/lib/legate/agents/loop_agent.rb +248 -0
  67. data/lib/legate/agents/parallel_agent.rb +163 -0
  68. data/lib/legate/agents/sequential_agent.rb +190 -0
  69. data/lib/legate/agents.rb +14 -0
  70. data/lib/legate/auth/config.rb +148 -0
  71. data/lib/legate/auth/coordinator.rb +218 -0
  72. data/lib/legate/auth/coordinators/oauth2_coordinator.rb +99 -0
  73. data/lib/legate/auth/coordinators/oidc_coordinator.rb +68 -0
  74. data/lib/legate/auth/coordinators/service_account_coordinator.rb +122 -0
  75. data/lib/legate/auth/credential.rb +157 -0
  76. data/lib/legate/auth/encryption.rb +108 -0
  77. data/lib/legate/auth/error.rb +94 -0
  78. data/lib/legate/auth/exchanged_credential.rb +180 -0
  79. data/lib/legate/auth/excon_middleware.rb +285 -0
  80. data/lib/legate/auth/http_client_utils.rb +364 -0
  81. data/lib/legate/auth/manager.rb +531 -0
  82. data/lib/legate/auth/manager_store.rb +394 -0
  83. data/lib/legate/auth/middleware_factory.rb +290 -0
  84. data/lib/legate/auth/runner.rb +279 -0
  85. data/lib/legate/auth/scheme.rb +125 -0
  86. data/lib/legate/auth/schemes/api_key.rb +212 -0
  87. data/lib/legate/auth/schemes/google_service_account.rb +108 -0
  88. data/lib/legate/auth/schemes/http_bearer.rb +98 -0
  89. data/lib/legate/auth/schemes/oauth2.rb +396 -0
  90. data/lib/legate/auth/schemes/openid_connect.rb +346 -0
  91. data/lib/legate/auth/schemes/service_account.rb +388 -0
  92. data/lib/legate/auth/schemes.rb +40 -0
  93. data/lib/legate/auth/token_manager.rb +362 -0
  94. data/lib/legate/auth/token_store.rb +86 -0
  95. data/lib/legate/auth/tool_context_extension.rb +97 -0
  96. data/lib/legate/auth/tool_integration.rb +188 -0
  97. data/lib/legate/auth/url_guard.rb +81 -0
  98. data/lib/legate/auth.rb +453 -0
  99. data/lib/legate/callbacks/callback_context.rb +71 -0
  100. data/lib/legate/cli/agent_commands.rb +950 -0
  101. data/lib/legate/cli/auth_commands.rb +520 -0
  102. data/lib/legate/cli/base_command.rb +24 -0
  103. data/lib/legate/cli/deployment_commands.rb +934 -0
  104. data/lib/legate/cli/output_helper.rb +108 -0
  105. data/lib/legate/cli/session_commands.rb +138 -0
  106. data/lib/legate/cli/skaffold_commands.rb +223 -0
  107. data/lib/legate/cli/tool_commands.rb +261 -0
  108. data/lib/legate/cli/web_commands.rb +182 -0
  109. data/lib/legate/cli.rb +40 -0
  110. data/lib/legate/configuration/webhooks.rb +113 -0
  111. data/lib/legate/configuration.rb +39 -0
  112. data/lib/legate/definition_store.rb +23 -0
  113. data/lib/legate/errors.rb +118 -0
  114. data/lib/legate/event.rb +161 -0
  115. data/lib/legate/gemini_ai_beta_patch.rb +39 -0
  116. data/lib/legate/generators/agent_generator.rb +412 -0
  117. data/lib/legate/generators/code_validator.rb +48 -0
  118. data/lib/legate/generators/legate/install_generator.rb +35 -0
  119. data/lib/legate/generators/legate/templates/create_legate_tables.rb.tt +36 -0
  120. data/lib/legate/generators/legate/templates/initializer.rb +18 -0
  121. data/lib/legate/generators/runtime_tool_loader.rb +76 -0
  122. data/lib/legate/generators/tool_generator.rb +408 -0
  123. data/lib/legate/generators.rb +11 -0
  124. data/lib/legate/global_definition_registry.rb +506 -0
  125. data/lib/legate/global_tool_manager.rb +135 -0
  126. data/lib/legate/llm/adapter.rb +69 -0
  127. data/lib/legate/llm/gemini.rb +172 -0
  128. data/lib/legate/llm/ollama.rb +80 -0
  129. data/lib/legate/llm.rb +34 -0
  130. data/lib/legate/mcp/client.rb +320 -0
  131. data/lib/legate/mcp/connection/sse.rb +292 -0
  132. data/lib/legate/mcp/connection/stdio.rb +273 -0
  133. data/lib/legate/mcp/connection_manager.rb +103 -0
  134. data/lib/legate/mcp/server/legate_agent_adapter.rb +170 -0
  135. data/lib/legate/mcp/server/legate_direct_agent_adapter.rb +140 -0
  136. data/lib/legate/mcp/server/legate_tool_adapter.rb +119 -0
  137. data/lib/legate/mcp/tool_wrapper.rb +138 -0
  138. data/lib/legate/mcp/util/schema_converter.rb +134 -0
  139. data/lib/legate/mcp.rb +23 -0
  140. data/lib/legate/plan_executor.rb +375 -0
  141. data/lib/legate/planner.rb +839 -0
  142. data/lib/legate/rails/railtie.rb +43 -0
  143. data/lib/legate/rails.rb +9 -0
  144. data/lib/legate/redaction.rb +32 -0
  145. data/lib/legate/session.rb +299 -0
  146. data/lib/legate/session_service/active_record.rb +300 -0
  147. data/lib/legate/session_service/base.rb +68 -0
  148. data/lib/legate/session_service/event_broadcast.rb +74 -0
  149. data/lib/legate/session_service/in_memory.rb +188 -0
  150. data/lib/legate/tool/metadata_dsl.rb +122 -0
  151. data/lib/legate/tool.rb +276 -0
  152. data/lib/legate/tool_code_generator.rb +103 -0
  153. data/lib/legate/tool_context.rb +350 -0
  154. data/lib/legate/tool_loader.rb +39 -0
  155. data/lib/legate/tool_registry.rb +73 -0
  156. data/lib/legate/tool_result.rb +61 -0
  157. data/lib/legate/tools/agent_tool.rb +187 -0
  158. data/lib/legate/tools/base/http_client.rb +319 -0
  159. data/lib/legate/tools/base/safe_url.rb +56 -0
  160. data/lib/legate/tools/base_async_job_tool.rb +91 -0
  161. data/lib/legate/tools/calculator.rb +89 -0
  162. data/lib/legate/tools/cat_facts.rb +81 -0
  163. data/lib/legate/tools/check_job_status_tool.rb +48 -0
  164. data/lib/legate/tools/current_time_tool.rb +64 -0
  165. data/lib/legate/tools/echo.rb +43 -0
  166. data/lib/legate/tools/http_request_tool.rb +105 -0
  167. data/lib/legate/tools/random_number_tool.rb +64 -0
  168. data/lib/legate/tools/read_webpage_tool.rb +92 -0
  169. data/lib/legate/tools/sleepy_tool.rb +74 -0
  170. data/lib/legate/tools/webhook_tool.rb +146 -0
  171. data/lib/legate/version.rb +5 -0
  172. data/lib/legate/web/app.rb +984 -0
  173. data/lib/legate/web/public/css/main.css +4980 -0
  174. data/lib/legate/web/public/images/favicon-256.png +0 -0
  175. data/lib/legate/web/public/images/favicon-32.png +0 -0
  176. data/lib/legate/web/public/images/legate-logo-dark.png +0 -0
  177. data/lib/legate/web/public/images/legate-logo-light.png +0 -0
  178. data/lib/legate/web/public/js/legate.js +616 -0
  179. data/lib/legate/web/public/styles/main.scss +4402 -0
  180. data/lib/legate/web/routes/agent_authentication_routes.rb +530 -0
  181. data/lib/legate/web/routes/agent_definition_routes.rb +803 -0
  182. data/lib/legate/web/routes/agent_generator_routes.rb +80 -0
  183. data/lib/legate/web/routes/agent_interaction_routes.rb +734 -0
  184. data/lib/legate/web/routes/agent_runtime_routes.rb +323 -0
  185. data/lib/legate/web/routes/api_routes.rb +56 -0
  186. data/lib/legate/web/routes/authentication_routes.rb +1541 -0
  187. data/lib/legate/web/routes/core_routes.rb +111 -0
  188. data/lib/legate/web/routes/documentation_routes.rb +220 -0
  189. data/lib/legate/web/routes/tool_generator_routes.rb +81 -0
  190. data/lib/legate/web/routes/tools_ui_routes.rb +207 -0
  191. data/lib/legate/web/sass_compiler.rb +73 -0
  192. data/lib/legate/web/views/_active_session_info.slim +25 -0
  193. data/lib/legate/web/views/_activity_list.slim +55 -0
  194. data/lib/legate/web/views/_agent_card.slim +56 -0
  195. data/lib/legate/web/views/_agent_generator_modal.slim +382 -0
  196. data/lib/legate/web/views/_agent_status_controls.slim +71 -0
  197. data/lib/legate/web/views/_agent_tool_table.slim +74 -0
  198. data/lib/legate/web/views/_chat_message.slim +95 -0
  199. data/lib/legate/web/views/_display_agent_configuration.slim +26 -0
  200. data/lib/legate/web/views/_display_agent_description.slim +11 -0
  201. data/lib/legate/web/views/_display_agent_fallback.slim +15 -0
  202. data/lib/legate/web/views/_display_agent_hierarchy.slim +93 -0
  203. data/lib/legate/web/views/_display_agent_instruction.slim +17 -0
  204. data/lib/legate/web/views/_display_agent_mcp.slim +13 -0
  205. data/lib/legate/web/views/_display_agent_model.slim +17 -0
  206. data/lib/legate/web/views/_display_agent_name.slim +42 -0
  207. data/lib/legate/web/views/_display_agent_output_key.slim +26 -0
  208. data/lib/legate/web/views/_display_agent_type.slim +65 -0
  209. data/lib/legate/web/views/_edit_agent_configuration.slim +74 -0
  210. data/lib/legate/web/views/_edit_agent_description.slim +16 -0
  211. data/lib/legate/web/views/_edit_agent_fallback.slim +25 -0
  212. data/lib/legate/web/views/_edit_agent_hierarchy.slim +98 -0
  213. data/lib/legate/web/views/_edit_agent_instruction.slim +49 -0
  214. data/lib/legate/web/views/_edit_agent_mcp.slim +33 -0
  215. data/lib/legate/web/views/_edit_agent_model.slim +23 -0
  216. data/lib/legate/web/views/_edit_agent_output_key.slim +36 -0
  217. data/lib/legate/web/views/_edit_agent_tools.slim +40 -0
  218. data/lib/legate/web/views/_edit_agent_type.slim +67 -0
  219. data/lib/legate/web/views/_session_error.slim +4 -0
  220. data/lib/legate/web/views/_skeleton.slim +69 -0
  221. data/lib/legate/web/views/_tool_card.slim +9 -0
  222. data/lib/legate/web/views/_tool_generator_modal.slim +311 -0
  223. data/lib/legate/web/views/agent.slim +436 -0
  224. data/lib/legate/web/views/agent_auth.slim +562 -0
  225. data/lib/legate/web/views/agents.slim +369 -0
  226. data/lib/legate/web/views/auth.slim +112 -0
  227. data/lib/legate/web/views/auth_credential_detail.slim +327 -0
  228. data/lib/legate/web/views/auth_credentials.slim +261 -0
  229. data/lib/legate/web/views/auth_debug.slim +94 -0
  230. data/lib/legate/web/views/auth_mapping_detail.slim +151 -0
  231. data/lib/legate/web/views/auth_mapping_new.slim +123 -0
  232. data/lib/legate/web/views/auth_mappings.slim +120 -0
  233. data/lib/legate/web/views/auth_scheme_detail.slim +274 -0
  234. data/lib/legate/web/views/auth_schemes.slim +259 -0
  235. data/lib/legate/web/views/auth_test.slim +418 -0
  236. data/lib/legate/web/views/chat.slim +192 -0
  237. data/lib/legate/web/views/docs_index.slim +105 -0
  238. data/lib/legate/web/views/docs_show.slim +105 -0
  239. data/lib/legate/web/views/error_404.slim +5 -0
  240. data/lib/legate/web/views/index.slim +148 -0
  241. data/lib/legate/web/views/layout.slim +144 -0
  242. data/lib/legate/web/views/tool_detail.slim +87 -0
  243. data/lib/legate/web/views/tools.slim +50 -0
  244. data/lib/legate/web/webhook_listener.rb +367 -0
  245. data/lib/legate/web.rb +9 -0
  246. data/lib/legate.rb +220 -0
  247. data/public/docs/advanced/callbacks.md +828 -0
  248. data/public/docs/advanced/mcp_schema_conversion.md +59 -0
  249. data/public/docs/authentication/api_reference/config.md +210 -0
  250. data/public/docs/authentication/api_reference/credential.md +246 -0
  251. data/public/docs/authentication/api_reference/encryption.md +218 -0
  252. data/public/docs/authentication/api_reference/exchanged_credential.md +271 -0
  253. data/public/docs/authentication/api_reference/excon_middleware.md +175 -0
  254. data/public/docs/authentication/api_reference/index.md +30 -0
  255. data/public/docs/authentication/api_reference/scheme.md +250 -0
  256. data/public/docs/authentication/api_reference/schemes/api_key.md +175 -0
  257. data/public/docs/authentication/api_reference/schemes/google_service_account.md +221 -0
  258. data/public/docs/authentication/api_reference/schemes/http_bearer.md +169 -0
  259. data/public/docs/authentication/api_reference/schemes/oauth2.md +343 -0
  260. data/public/docs/authentication/api_reference/schemes/oidc.md +73 -0
  261. data/public/docs/authentication/api_reference/schemes/openid_connect.md +311 -0
  262. data/public/docs/authentication/api_reference/schemes/service_account.md +287 -0
  263. data/public/docs/authentication/api_reference/token_manager.md +221 -0
  264. data/public/docs/authentication/api_reference/token_store.md +146 -0
  265. data/public/docs/authentication/api_reference/tool_context_extension.md +166 -0
  266. data/public/docs/authentication/guides/api_key.md +190 -0
  267. data/public/docs/authentication/guides/bearer.md +172 -0
  268. data/public/docs/authentication/guides/configuration.md +255 -0
  269. data/public/docs/authentication/guides/custom_flow.md +523 -0
  270. data/public/docs/authentication/guides/index.md +24 -0
  271. data/public/docs/authentication/guides/migration.md +435 -0
  272. data/public/docs/authentication/guides/oauth2.md +252 -0
  273. data/public/docs/authentication/guides/oidc.md +241 -0
  274. data/public/docs/authentication/guides/overview.md +155 -0
  275. data/public/docs/authentication/guides/secure_storage.md +301 -0
  276. data/public/docs/authentication/guides/service_account.md +228 -0
  277. data/public/docs/authentication/guides/token_lifecycle.md +295 -0
  278. data/public/docs/authentication/guides/web_ui_integration.md +504 -0
  279. data/public/docs/authentication/index.md +58 -0
  280. data/public/docs/authentication/troubleshooting/credential_storage.md +550 -0
  281. data/public/docs/authentication/troubleshooting/environment_variables.md +540 -0
  282. data/public/docs/authentication/troubleshooting/index.md +11 -0
  283. data/public/docs/authentication/troubleshooting/oauth2_issues.md +220 -0
  284. data/public/docs/authentication/troubleshooting/oidc_issues.md +412 -0
  285. data/public/docs/authentication/troubleshooting/token_refresh.md +338 -0
  286. data/public/docs/cli/legate_cli_usage.md +363 -0
  287. data/public/docs/core_concepts/legate_agent_lifecycle.md +124 -0
  288. data/public/docs/core_concepts/legate_architecture_overview.md +110 -0
  289. data/public/docs/core_concepts/legate_configuration.md +116 -0
  290. data/public/docs/core_concepts/legate_definition_store.md +102 -0
  291. data/public/docs/core_concepts/legate_planner.md +94 -0
  292. data/public/docs/core_concepts/legate_session_service.md +104 -0
  293. data/public/docs/error_handling/legate_error_handling.md +122 -0
  294. data/public/docs/examples.md +199 -0
  295. data/public/docs/getting_started.md +111 -0
  296. data/public/docs/guides/agentic_agents.md +137 -0
  297. data/public/docs/guides/ai_code_generators.md +437 -0
  298. data/public/docs/guides/auto_loading.md +326 -0
  299. data/public/docs/guides/configuring_agent_webhooks.md +219 -0
  300. data/public/docs/guides/http_client_usage.md +264 -0
  301. data/public/docs/guides/llm_providers.md +137 -0
  302. data/public/docs/guides/mcp_client_integration.md +232 -0
  303. data/public/docs/guides/mcp_server_exposure.md +206 -0
  304. data/public/docs/guides/rails_integration.md +128 -0
  305. data/public/docs/guides/sending_outbound_webhooks.md +227 -0
  306. data/public/docs/guides/streaming.md +112 -0
  307. data/public/docs/guides/webhooks.md +288 -0
  308. data/public/docs/introduction.md +51 -0
  309. data/public/docs/multi_agent_systems/advanced_features.md +57 -0
  310. data/public/docs/multi_agent_systems/agent_delegation.md +190 -0
  311. data/public/docs/multi_agent_systems/agent_hierarchy.md +49 -0
  312. data/public/docs/multi_agent_systems/state_management.md +47 -0
  313. data/public/docs/multi_agent_systems/workflow_agents.md +72 -0
  314. data/public/docs/tools/legate_built_in_tools.md +332 -0
  315. data/public/docs/tools/legate_tools_and_registry.md +263 -0
  316. data/public/docs/web_ui/legate_web_ui.md +137 -0
  317. metadata +823 -0
@@ -0,0 +1,98 @@
1
+ / File: lib/legate/web/views/_edit_agent_hierarchy.slim
2
+ / Expects agent_data hash with name, agent_type, and sub_agent_names
3
+ / Also expects all_agent_definitions if available for selecting sub-agents
4
+
5
+ - agent_name = agent_data[:name]
6
+ - agent_type = agent_data[:agent_type]&.to_sym || :llm
7
+ - sub_agent_names = agent_data[:sub_agent_names] || []
8
+ - loop_max = agent_data[:loop_max_iterations]
9
+ - loop_key = agent_data[:loop_condition_state_key]
10
+ - loop_val = agent_data[:loop_condition_expected_value]
11
+
12
+ / Get available agent names and exclude current agent
13
+ - all_agent_names = defined?(all_agent_definitions) ? all_agent_definitions.map { |d| d[:name] }.reject { |n| n.to_s == agent_name.to_s } : []
14
+
15
+ .content#agent-hierarchy-display
16
+ form( hx-put="/agents/#{agent_name}/update/hierarchy"
17
+ hx-target="#agent-hierarchy-display"
18
+ hx-swap="outerHTML" )
19
+
20
+ h4.is-size-5
21
+ span.icon.mr-2
22
+ - type_icon = case agent_type
23
+ - when :sequential then "fa-list-ol"
24
+ - when :parallel then "fa-layer-group"
25
+ - when :loop then "fa-sync-alt"
26
+ - else "fa-sitemap"
27
+ i(class="fas #{type_icon}")
28
+ | Edit
29
+ = agent_type == :llm ? "Delegation Targets" : "Workflow Components"
30
+
31
+ .notification.is-light.is-info.mb-4
32
+ span.icon.mr-2
33
+ i.fas.fa-info-circle
34
+ - if agent_type == :llm
35
+ | Configure other agents that this LLM agent can delegate tasks to.
36
+ - elsif agent_type == :sequential
37
+ | Configure sub-agents that will execute in sequence. The order in the list below matters.
38
+ - elsif agent_type == :parallel
39
+ | Configure sub-agents that will execute concurrently. All selected agents will start at the same time.
40
+ - elsif agent_type == :loop
41
+ | Configure sub-agents for your loop. These will execute repeatedly until a condition is met.
42
+
43
+ / Display error if provided
44
+ - if defined?(error_message) && error_message
45
+ .notification.is-danger.is-light.mb-4
46
+ button.delete(type="button" onclick="this.parentElement.remove()")
47
+ = error_message
48
+
49
+ .field
50
+ label.label = agent_type == :llm ? "Delegation Targets" : "Workflow Components"
51
+ - if all_agent_names.any?
52
+ .select.is-multiple.is-fullwidth
53
+ select(name="sub_agent_names[]" multiple size="5")
54
+ - all_agent_names.each do |name|
55
+ - next if name.to_s == agent_name.to_s
56
+ option(value=name selected=sub_agent_names.include?(name)) = name
57
+ p.help Select agents. Use Ctrl/Cmd+click for multiple selection.
58
+ - if agent_type == :sequential || agent_type == :loop
59
+ p.help.has-text-info.mt-1 Order matters for this workflow type.
60
+ - else
61
+ .notification.is-warning.is-light No other agents available to select. Create some first.
62
+
63
+ / Loop Specific Configuration
64
+ - if agent_type == :loop
65
+ hr
66
+ h5.title.is-6 Loop Conditions
67
+ .columns.is-multiline
68
+ .column.is-one-third
69
+ .field
70
+ label.label.is-small Max Iterations
71
+ .control
72
+ input.input(type="number" name="loop_max_iterations" value=loop_max placeholder="10" min="1")
73
+ .column.is-one-third
74
+ .field
75
+ label.label.is-small Condition State Key
76
+ .control
77
+ input.input(type="text" name="loop_condition_state_key" value=loop_key placeholder="e.g. task_complete")
78
+ .column.is-one-third
79
+ .field
80
+ label.label.is-small Expected Value
81
+ .control
82
+ input.input(type="text" name="loop_condition_expected_value" value=loop_val placeholder="e.g. true")
83
+
84
+ / Action Buttons
85
+ .field.is-grouped.mt-4
86
+ .control
87
+ button.button.is-light( type="button"
88
+ hx-get="/agents/#{agent_name}/display/hierarchy"
89
+ hx-target="#agent-hierarchy-display"
90
+ hx-swap="outerHTML" )
91
+ span Cancel
92
+ .control
93
+ button.button.is-success(type="submit" hx-indicator=".htmx-indicator")
94
+ span.icon.is-small.htmx-indicator
95
+ i.fas.fa-spinner.fa-spin
96
+ span.icon.is-small
97
+ i.fas.fa-check
98
+ span Save Changes
@@ -0,0 +1,49 @@
1
+ /! File: lib/legate/web/views/_edit_agent_instruction.slim
2
+ /! This partial might become redundant if its content is fully merged
3
+ /! into _edit_agent_configuration.slim. If kept separate for any reason,
4
+ /! ensure the textarea ID is unique, e.g., #edit-instruction-textarea
5
+
6
+ /! Example content if kept separate (adjust target/swap if needed):
7
+ / hr
8
+ / form hx-put="/agents/#{agent_data[:name]}/update/instruction" hx-target="closest .content" / Or specific container
9
+ / h3.subtitle.is-5 Instructions (System Prompt)
10
+ / .field
11
+ / label.label for="edit-instruction-textarea" Instructions
12
+ / .control
13
+ / textarea.textarea#edit-instruction-textarea name="value" rows="5" placeholder="Guide the agent's behavior, persona, and tool usage..." = agent_data[:instruction]
14
+ / - if defined?(error_message) && error_message
15
+ / p.help.is-danger = error_message
16
+
17
+ / .field.is-grouped
18
+ / .control
19
+ / button.button.is-link type="submit" Save
20
+ / .control
21
+ / a.button.is-light hx-get="/agents/#{agent_data[:name]}/display/instruction" Cancel
22
+
23
+ /! Form for editing agent instructions
24
+
25
+ / Add container ID, use correct hx-* attributes
26
+ form#agent-instruction-display-container hx-put="/agents/#{agent_data[:name]}/update/instruction" hx-target="#agent-instruction-display-container" hx-swap="outerHTML"
27
+
28
+ / --- Display Error Message if Present ---
29
+ - if defined?(error_message) && error_message
30
+ .notification.is-danger.is-light.mb-3
31
+ button.delete type="button" onclick="this.parentElement.remove()"
32
+ = error_message
33
+
34
+ .field
35
+ label.label for="edit-instruction-textarea" Instructions (System Prompt)
36
+ .control
37
+ / Textarea ID for CodeMirror JS
38
+ textarea.textarea#edit-instruction-textarea name="value" rows="5" placeholder="Guide the agent's behavior, persona, and tool usage..." == agent_data[:instruction]
39
+
40
+ .field.is-grouped.is-grouped-right.mt-4
41
+ .control
42
+ / Cancel button targets container ID
43
+ button.button.is-light type="button" hx-get="/agents/#{agent_data[:name]}/display/instruction" hx-target="#agent-instruction-display-container" hx-swap="outerHTML"
44
+ span Cancel
45
+ .control
46
+ button.button.is-success type="submit"
47
+ span.icon.is-small
48
+ i.fas.fa-check
49
+ span Save Instructions
@@ -0,0 +1,33 @@
1
+ / File: lib/legate/web/views/_edit_agent_mcp.slim
2
+ / Form for editing MCP Server JSON using CodeMirror
3
+
4
+ /! Add container ID to the form, put attributes on one line using space separation
5
+ form#agent-mcp-display-container hx-put="/agents/#{agent_data[:name]}/update/mcp" hx-target="#agent-mcp-display-container" hx-swap="outerHTML"
6
+
7
+ / --- Display Error Message if Present ---
8
+ - if defined?(error_message) && error_message
9
+ .notification.is-danger.is-light.mb-3
10
+ button.delete type="button" onclick="this.parentElement.remove()"
11
+ = error_message
12
+
13
+ .field
14
+ label.label for="mcp-json-editor" MCP Server Configurations (JSON Array)
15
+ .control
16
+ /! Textarea will be replaced by CodeMirror via JS in layout.slim
17
+ textarea.textarea#mcp-json-editor name="value" rows="6" placeholder='[{"type": "stdio", "command": "...", "args": ["..."]}]' == agent_data[:mcp_servers_json]
18
+ p.help
19
+ | Enter a valid JSON array of MCP server config objects. Leave empty if none.
20
+ br
21
+ | Example: `[{"type": "stdio", "command": "npx", "args": ["@mcp/server", "/path/to/tools"]}]`
22
+
23
+ .field.is-grouped.is-grouped-right.mt-4
24
+ .control
25
+ / Button to cancel editing and revert to display view
26
+ /! Ensure cancel targets the container ID
27
+ button.button.is-light type="button" hx-get="/agents/#{agent_data[:name]}/display/mcp" hx-target="#agent-mcp-display-container" hx-swap="outerHTML"
28
+ span Cancel
29
+ .control
30
+ button.button.is-success type="submit"
31
+ span.icon.is-small
32
+ i.fas.fa-check
33
+ span Save MCP Config
@@ -0,0 +1,23 @@
1
+ / File: lib/legate/web/views/_edit_agent_model.slim
2
+ / Expects agent_data hash and available_models array
3
+
4
+ - current_model = agent_data[:model] || Legate::Agent::DEFAULT_MODEL
5
+
6
+ form#agent-model-display-container( hx-put="/agents/#{agent_data[:name]}/update/model" hx-target="#agent-model-display-container" hx-swap="outerHTML" )
7
+ .field.has-addons
8
+ .control.is-expanded
9
+ .select.is-fullwidth
10
+ select(name="value")
11
+ - available_models.each do |model_name|
12
+ option(value=model_name selected=(model_name == current_model)) = model_name
13
+ .control
14
+ button.button.is-success(type="submit")
15
+ span.icon.is-small
16
+ i.fas.fa-check
17
+ span Save
18
+ .field.is-grouped.is-grouped-right
19
+ .control
20
+ button.button.is-light type="button" hx-get="/agents/#{agent_data[:name]}/display/model" hx-target="#agent-model-display-container" hx-swap="outerHTML"
21
+ span.icon.is-small
22
+ i.fas.fa-times
23
+ span Cancel
@@ -0,0 +1,36 @@
1
+ / File: lib/legate/web/views/_edit_agent_output_key.slim
2
+ / Expects agent_data hash with name and output_key
3
+
4
+ - agent_name = agent_data[:name]
5
+ - output_key = agent_data[:output_key]
6
+
7
+ .field#agent-output-key-display
8
+ form( hx-put="/agents/#{agent_name}/update/output_key"
9
+ hx-target="#agent-output-key-display"
10
+ hx-swap="outerHTML" )
11
+
12
+ label.label.is-small Output Key
13
+
14
+ .field.has-addons
15
+ .control.is-expanded
16
+ input.input.is-small(
17
+ type="text"
18
+ name="value"
19
+ value=output_key
20
+ placeholder="e.g. result_key"
21
+ autofocus=true
22
+ )
23
+ .control
24
+ button.button.is-small.is-success(type="submit")
25
+ span.icon.is-small
26
+ i.fas.fa-check
27
+ .control
28
+ button.button.is-small.is-light(
29
+ type="button"
30
+ hx-get="/agents/#{agent_name}/display/output_key"
31
+ hx-target="#agent-output-key-display"
32
+ hx-swap="outerHTML"
33
+ )
34
+ span.icon.is-small
35
+ i.fas.fa-times
36
+ p.help.is-size-7 Optional. Key to store the result in the session state.
@@ -0,0 +1,40 @@
1
+ / File: lib/legate/web/views/_edit_agent_tools.slim
2
+ / Expects:
3
+ / agent_data (Hash: {name})
4
+ / configured_tool_names (Array<String>) - Names of currently configured tools
5
+ / all_available_tools (Array<Hash>: [{name: :tool_symbol, description: "...""}]) - All tools from registry
6
+
7
+ - encoded_agent_name = URI.encode_www_form_component(agent_data[:name].to_s).gsub('+', '%20')
8
+
9
+ .box.mb-5
10
+ h2.title.is-4 Edit Configured Tools
11
+ form( hx-put="/agents/#{encoded_agent_name}/update/tools" hx-target="closest .box" hx-swap="outerHTML" )
12
+
13
+ .field
14
+ label.label Available Tools (Select tools for this agent definition):
15
+ .control
16
+ - if all_available_tools && !all_available_tools.empty?
17
+ - all_available_tools.each do |tool_info|
18
+ - tool_name_str = tool_info[:name].to_s
19
+ - is_checked = configured_tool_names.include?(tool_name_str)
20
+ .field
21
+ label.checkbox class=(is_checked ? 'is-selected-tool' : '') title=tool_info[:description]
22
+ / Checkbox name is 'tools[]' to submit an array
23
+ input(type="checkbox" name="tools[]" value=tool_name_str checked=is_checked)
24
+ strong.ml-2 #{tool_info[:name].to_s.capitalize}:
25
+ span.ml-1 #{tool_info[:description]}
26
+ - else
27
+ p.has-text-danger No tools found in the Tool Registry! Cannot configure agent.
28
+
29
+ .field.is-grouped.is-grouped-right.mt-4
30
+ .control
31
+ button.button( type="button"
32
+ hx-get="/agents/#{encoded_agent_name}/display/tool_table"
33
+ hx-target="closest .box"
34
+ hx-swap="outerHTML" )
35
+ span Cancel
36
+ .control
37
+ button.button.is-success(type="submit")
38
+ span.icon.is-small
39
+ i.fas.fa-check
40
+ span Save Tool Configuration
@@ -0,0 +1,67 @@
1
+ / File: lib/legate/web/views/_edit_agent_type.slim
2
+ / Expects agent_data hash with name and agent_type
3
+
4
+ - agent_name = agent_data[:name]
5
+ - agent_type = agent_data[:agent_type]&.to_sym || :llm
6
+ - planning_strategy = agent_data[:planning_strategy]&.to_sym || :plan
7
+
8
+ .content#agent-type-display
9
+ form( hx-put="/agents/#{agent_name}/update/type"
10
+ hx-target="#agent-type-display"
11
+ hx-swap="outerHTML" )
12
+
13
+ h4.is-size-5 Edit Agent Type
14
+
15
+ / Display error if provided
16
+ - if defined?(error_message) && error_message
17
+ .notification.is-danger.is-light.mb-4
18
+ button.delete(type="button" onclick="this.parentElement.remove()")
19
+ = error_message
20
+
21
+ .field
22
+ label.label for="agent_type" Agent Type
23
+ .control
24
+ .select.is-fullwidth
25
+ select#agent_type(name="agent_type")
26
+ option(value="llm" selected=(agent_type == :llm)) LLM Agent
27
+ option(value="sequential" selected=(agent_type == :sequential)) Sequential Workflow
28
+ option(value="parallel" selected=(agent_type == :parallel)) Parallel Workflow
29
+ option(value="loop" selected=(agent_type == :loop)) Loop Workflow
30
+ p.help
31
+ | LLM: AI-powered agent for task execution
32
+ br
33
+ | Sequential: Runs sub-agents in sequence
34
+ br
35
+ | Parallel: Runs sub-agents concurrently
36
+ br
37
+ | Loop: Repeatedly executes sub-agents until condition is met
38
+
39
+ .field
40
+ label.label for="planning_strategy" Planning Strategy
41
+ .control
42
+ .select.is-fullwidth
43
+ select#planning_strategy(name="planning_strategy")
44
+ option(value="plan" selected=(planning_strategy == :plan)) Plan (default)
45
+ option(value="react" selected=(planning_strategy == :react)) ReAct (agentic loop)
46
+ p.help
47
+ | Applies to LLM agents only.
48
+ br
49
+ | Plan: generate one plan up front, then execute every step.
50
+ br
51
+ | ReAct: take one action, observe the result, then decide the next — better for multi-step tasks and tool errors.
52
+
53
+ / Action Buttons
54
+ .field.is-grouped.mt-4
55
+ .control
56
+ button.button.is-light( type="button"
57
+ hx-get="/agents/#{agent_name}/display/type"
58
+ hx-target="#agent-type-display"
59
+ hx-swap="outerHTML" )
60
+ span Cancel
61
+ .control
62
+ button.button.is-success(type="submit" hx-indicator=".htmx-indicator")
63
+ span.icon.is-small.htmx-indicator
64
+ i.fas.fa-spinner.fa-spin
65
+ span.icon.is-small
66
+ i.fas.fa-check
67
+ span Save Changes
@@ -0,0 +1,4 @@
1
+ .notification.is-danger.mt-2 role="alert"
2
+ button.delete type="button" aria-label="Dismiss" onclick="this.parentElement.classList.add('is-hidden');"
3
+ - msg = defined?(error_message) && !error_message.to_s.strip.empty? ? error_message : "An error occurred with the session operation."
4
+ = msg
@@ -0,0 +1,69 @@
1
+ / File: lib/legate/web/views/_skeleton.slim
2
+ / Skeleton Loading Components
3
+ / Usage: == slim :_skeleton, locals: { type: :text, count: 1 }
4
+ / Types: :text, :title, :badge, :card, :table_row, :auth_status, :chat_interface
5
+
6
+ ruby:
7
+ type ||= :text
8
+ count ||= 1
9
+ columns ||= 4
10
+
11
+ - count.times do
12
+ - case type
13
+
14
+ - when :text
15
+ .skeleton.skeleton-text
16
+
17
+ - when :text_short
18
+ .skeleton.skeleton-text.skeleton-short
19
+
20
+ - when :title
21
+ .skeleton.skeleton-title
22
+
23
+ - when :badge
24
+ .skeleton.skeleton-badge
25
+
26
+ - when :avatar
27
+ .skeleton.skeleton-avatar
28
+
29
+ - when :card
30
+ .skeleton-card
31
+ .skeleton.skeleton-title
32
+ .skeleton.skeleton-text
33
+ .skeleton.skeleton-text.skeleton-short
34
+
35
+ - when :table_row
36
+ tr.skeleton-row
37
+ - columns.times do |i|
38
+ td
39
+ - if i == columns - 1
40
+ .skeleton.skeleton-badge
41
+ - elsif i == 0
42
+ .skeleton.skeleton-text.skeleton-medium
43
+ - else
44
+ .skeleton.skeleton-text
45
+
46
+ - when :auth_status
47
+ .has-text-centered
48
+ .skeleton.skeleton-icon.mx-auto
49
+ .skeleton.skeleton-text.skeleton-short.mx-auto.mt-2
50
+
51
+ - when :chat_interface
52
+ .skeleton-chat-container
53
+ .skeleton-message.skeleton-message-left
54
+ .skeleton.skeleton-avatar.skeleton-avatar-small
55
+ .skeleton-message-content
56
+ .skeleton.skeleton-text
57
+ .skeleton.skeleton-text.skeleton-short
58
+ .skeleton-message.skeleton-message-right
59
+ .skeleton-message-content
60
+ .skeleton.skeleton-text.skeleton-medium
61
+ .skeleton-message.skeleton-message-left
62
+ .skeleton.skeleton-avatar.skeleton-avatar-small
63
+ .skeleton-message-content
64
+ .skeleton.skeleton-text
65
+ .skeleton.skeleton-text
66
+ .skeleton.skeleton-text.skeleton-short
67
+ .skeleton-chat-input
68
+ .skeleton.skeleton-input
69
+ .skeleton.skeleton-button
@@ -0,0 +1,9 @@
1
+ / Expects 'tool_info' (a hash or object with :name and :description) in locals
2
+ .column.is-one-third
3
+ .card.tool-card
4
+ .card-content
5
+ h3.title.is-5= tool_info[:name].to_s.capitalize
6
+ p= tool_info[:description]
7
+ .card-footer
8
+ / Link to the tool detail page (assuming /tools/:name exists)
9
+ a.card-footer-item(href="/tools/#{tool_info[:name]}") Details