flock-core 0.5.0b28__py3-none-any.whl → 0.5.56b0__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 flock-core might be problematic. Click here for more details.

Files changed (359) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +678 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +79 -0
  5. flock/cli.py +75 -0
  6. flock/components.py +173 -0
  7. flock/dashboard/__init__.py +28 -0
  8. flock/dashboard/collector.py +283 -0
  9. flock/dashboard/events.py +182 -0
  10. flock/dashboard/launcher.py +230 -0
  11. flock/dashboard/service.py +537 -0
  12. flock/dashboard/websocket.py +235 -0
  13. flock/engines/__init__.py +6 -0
  14. flock/engines/dspy_engine.py +856 -0
  15. flock/examples.py +128 -0
  16. flock/{core/util → helper}/cli_helper.py +4 -3
  17. flock/{core/logging → logging}/__init__.py +2 -3
  18. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  19. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  20. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
  21. flock/{core/logging → logging}/logging.py +77 -61
  22. flock/{core/logging → logging}/telemetry.py +20 -26
  23. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  24. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
  25. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  26. flock/{core/logging → logging}/trace_and_logged.py +20 -24
  27. flock/mcp/__init__.py +91 -0
  28. flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
  29. flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
  30. flock/mcp/manager.py +255 -0
  31. flock/mcp/servers/sse/__init__.py +1 -1
  32. flock/mcp/servers/sse/flock_sse_server.py +11 -53
  33. flock/mcp/servers/stdio/__init__.py +1 -1
  34. flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
  35. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
  36. flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
  37. flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
  38. flock/mcp/types/__init__.py +42 -0
  39. flock/{core/mcp → mcp}/types/callbacks.py +9 -15
  40. flock/{core/mcp → mcp}/types/factories.py +7 -6
  41. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  42. flock/{core/mcp → mcp}/types/types.py +70 -74
  43. flock/{core/mcp → mcp}/util/helpers.py +1 -1
  44. flock/orchestrator.py +645 -0
  45. flock/registry.py +148 -0
  46. flock/runtime.py +262 -0
  47. flock/service.py +140 -0
  48. flock/store.py +69 -0
  49. flock/subscription.py +111 -0
  50. flock/themes/andromeda.toml +1 -1
  51. flock/themes/apple-system-colors.toml +1 -1
  52. flock/themes/arcoiris.toml +1 -1
  53. flock/themes/atomonelight.toml +1 -1
  54. flock/themes/ayu copy.toml +1 -1
  55. flock/themes/ayu-light.toml +1 -1
  56. flock/themes/belafonte-day.toml +1 -1
  57. flock/themes/belafonte-night.toml +1 -1
  58. flock/themes/blulocodark.toml +1 -1
  59. flock/themes/breeze.toml +1 -1
  60. flock/themes/broadcast.toml +1 -1
  61. flock/themes/brogrammer.toml +1 -1
  62. flock/themes/builtin-dark.toml +1 -1
  63. flock/themes/builtin-pastel-dark.toml +1 -1
  64. flock/themes/catppuccin-latte.toml +1 -1
  65. flock/themes/catppuccin-macchiato.toml +1 -1
  66. flock/themes/catppuccin-mocha.toml +1 -1
  67. flock/themes/cga.toml +1 -1
  68. flock/themes/chalk.toml +1 -1
  69. flock/themes/ciapre.toml +1 -1
  70. flock/themes/coffee-theme.toml +1 -1
  71. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  72. flock/themes/dark+.toml +1 -1
  73. flock/themes/darkermatrix.toml +1 -1
  74. flock/themes/darkside.toml +1 -1
  75. flock/themes/desert.toml +1 -1
  76. flock/themes/django.toml +1 -1
  77. flock/themes/djangosmooth.toml +1 -1
  78. flock/themes/doomone.toml +1 -1
  79. flock/themes/dotgov.toml +1 -1
  80. flock/themes/dracula+.toml +1 -1
  81. flock/themes/duckbones.toml +1 -1
  82. flock/themes/encom.toml +1 -1
  83. flock/themes/espresso.toml +1 -1
  84. flock/themes/everblush.toml +1 -1
  85. flock/themes/fairyfloss.toml +1 -1
  86. flock/themes/fideloper.toml +1 -1
  87. flock/themes/fishtank.toml +1 -1
  88. flock/themes/flexoki-light.toml +1 -1
  89. flock/themes/floraverse.toml +1 -1
  90. flock/themes/framer.toml +1 -1
  91. flock/themes/galizur.toml +1 -1
  92. flock/themes/github.toml +1 -1
  93. flock/themes/grass.toml +1 -1
  94. flock/themes/grey-green.toml +1 -1
  95. flock/themes/gruvboxlight.toml +1 -1
  96. flock/themes/guezwhoz.toml +1 -1
  97. flock/themes/harper.toml +1 -1
  98. flock/themes/hax0r-blue.toml +1 -1
  99. flock/themes/hopscotch.256.toml +1 -1
  100. flock/themes/ic-green-ppl.toml +1 -1
  101. flock/themes/iceberg-dark.toml +1 -1
  102. flock/themes/japanesque.toml +1 -1
  103. flock/themes/jubi.toml +1 -1
  104. flock/themes/kibble.toml +1 -1
  105. flock/themes/kolorit.toml +1 -1
  106. flock/themes/kurokula.toml +1 -1
  107. flock/themes/materialdesigncolors.toml +1 -1
  108. flock/themes/matrix.toml +1 -1
  109. flock/themes/mellifluous.toml +1 -1
  110. flock/themes/midnight-in-mojave.toml +1 -1
  111. flock/themes/monokai-remastered.toml +1 -1
  112. flock/themes/monokai-soda.toml +1 -1
  113. flock/themes/neon.toml +1 -1
  114. flock/themes/neopolitan.toml +1 -1
  115. flock/themes/nord-light.toml +1 -1
  116. flock/themes/ocean.toml +1 -1
  117. flock/themes/onehalfdark.toml +1 -1
  118. flock/themes/onehalflight.toml +1 -1
  119. flock/themes/palenighthc.toml +1 -1
  120. flock/themes/paulmillr.toml +1 -1
  121. flock/themes/pencildark.toml +1 -1
  122. flock/themes/pnevma.toml +1 -1
  123. flock/themes/purple-rain.toml +1 -1
  124. flock/themes/purplepeter.toml +1 -1
  125. flock/themes/raycast-dark.toml +1 -1
  126. flock/themes/red-sands.toml +1 -1
  127. flock/themes/relaxed.toml +1 -1
  128. flock/themes/retro.toml +1 -1
  129. flock/themes/rose-pine.toml +1 -1
  130. flock/themes/royal.toml +1 -1
  131. flock/themes/ryuuko.toml +1 -1
  132. flock/themes/sakura.toml +1 -1
  133. flock/themes/scarlet-protocol.toml +1 -1
  134. flock/themes/seoulbones-dark.toml +1 -1
  135. flock/themes/shades-of-purple.toml +1 -1
  136. flock/themes/smyck.toml +1 -1
  137. flock/themes/softserver.toml +1 -1
  138. flock/themes/solarized-darcula.toml +1 -1
  139. flock/themes/square.toml +1 -1
  140. flock/themes/sugarplum.toml +1 -1
  141. flock/themes/thayer-bright.toml +1 -1
  142. flock/themes/tokyonight.toml +1 -1
  143. flock/themes/tomorrow.toml +1 -1
  144. flock/themes/ubuntu.toml +1 -1
  145. flock/themes/ultradark.toml +1 -1
  146. flock/themes/ultraviolent.toml +1 -1
  147. flock/themes/unikitty.toml +1 -1
  148. flock/themes/urple.toml +1 -1
  149. flock/themes/vesper.toml +1 -1
  150. flock/themes/vimbones.toml +1 -1
  151. flock/themes/wildcherry.toml +1 -1
  152. flock/themes/wilmersdorf.toml +1 -1
  153. flock/themes/wryan.toml +1 -1
  154. flock/themes/xcodedarkhc.toml +1 -1
  155. flock/themes/xcodelight.toml +1 -1
  156. flock/themes/zenbones-light.toml +1 -1
  157. flock/themes/zenwritten-dark.toml +1 -1
  158. flock/utilities.py +301 -0
  159. flock/{components/utility → utility}/output_utility_component.py +68 -53
  160. flock/visibility.py +107 -0
  161. flock_core-0.5.56b0.dist-info/METADATA +747 -0
  162. flock_core-0.5.56b0.dist-info/RECORD +398 -0
  163. flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
  164. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/licenses/LICENSE +1 -1
  165. flock/adapter/__init__.py +0 -14
  166. flock/adapter/azure_adapter.py +0 -68
  167. flock/adapter/chroma_adapter.py +0 -73
  168. flock/adapter/faiss_adapter.py +0 -97
  169. flock/adapter/pinecone_adapter.py +0 -51
  170. flock/adapter/vector_base.py +0 -47
  171. flock/cli/assets/release_notes.md +0 -140
  172. flock/cli/config.py +0 -8
  173. flock/cli/constants.py +0 -36
  174. flock/cli/create_agent.py +0 -1
  175. flock/cli/create_flock.py +0 -280
  176. flock/cli/execute_flock.py +0 -620
  177. flock/cli/load_agent.py +0 -1
  178. flock/cli/load_examples.py +0 -1
  179. flock/cli/load_flock.py +0 -192
  180. flock/cli/load_release_notes.py +0 -20
  181. flock/cli/loaded_flock_cli.py +0 -254
  182. flock/cli/manage_agents.py +0 -459
  183. flock/cli/registry_management.py +0 -889
  184. flock/cli/runner.py +0 -41
  185. flock/cli/settings.py +0 -857
  186. flock/cli/utils.py +0 -135
  187. flock/cli/view_results.py +0 -29
  188. flock/cli/yaml_editor.py +0 -396
  189. flock/components/__init__.py +0 -30
  190. flock/components/evaluation/__init__.py +0 -9
  191. flock/components/evaluation/declarative_evaluation_component.py +0 -606
  192. flock/components/routing/__init__.py +0 -15
  193. flock/components/routing/conditional_routing_component.py +0 -494
  194. flock/components/routing/default_routing_component.py +0 -103
  195. flock/components/routing/llm_routing_component.py +0 -206
  196. flock/components/utility/__init__.py +0 -22
  197. flock/components/utility/example_utility_component.py +0 -250
  198. flock/components/utility/feedback_utility_component.py +0 -206
  199. flock/components/utility/memory_utility_component.py +0 -550
  200. flock/components/utility/metrics_utility_component.py +0 -700
  201. flock/config.py +0 -61
  202. flock/core/__init__.py +0 -110
  203. flock/core/agent/__init__.py +0 -16
  204. flock/core/agent/default_agent.py +0 -216
  205. flock/core/agent/flock_agent_components.py +0 -104
  206. flock/core/agent/flock_agent_execution.py +0 -101
  207. flock/core/agent/flock_agent_integration.py +0 -260
  208. flock/core/agent/flock_agent_lifecycle.py +0 -186
  209. flock/core/agent/flock_agent_serialization.py +0 -381
  210. flock/core/api/__init__.py +0 -10
  211. flock/core/api/custom_endpoint.py +0 -45
  212. flock/core/api/endpoints.py +0 -254
  213. flock/core/api/main.py +0 -162
  214. flock/core/api/models.py +0 -97
  215. flock/core/api/run_store.py +0 -224
  216. flock/core/api/runner.py +0 -44
  217. flock/core/api/service.py +0 -214
  218. flock/core/component/__init__.py +0 -15
  219. flock/core/component/agent_component_base.py +0 -309
  220. flock/core/component/evaluation_component.py +0 -62
  221. flock/core/component/routing_component.py +0 -74
  222. flock/core/component/utility_component.py +0 -69
  223. flock/core/config/flock_agent_config.py +0 -58
  224. flock/core/config/scheduled_agent_config.py +0 -40
  225. flock/core/context/context.py +0 -213
  226. flock/core/context/context_manager.py +0 -37
  227. flock/core/context/context_vars.py +0 -10
  228. flock/core/evaluation/utils.py +0 -396
  229. flock/core/execution/batch_executor.py +0 -369
  230. flock/core/execution/evaluation_executor.py +0 -438
  231. flock/core/execution/local_executor.py +0 -31
  232. flock/core/execution/opik_executor.py +0 -103
  233. flock/core/execution/temporal_executor.py +0 -164
  234. flock/core/flock.py +0 -634
  235. flock/core/flock_agent.py +0 -336
  236. flock/core/flock_factory.py +0 -613
  237. flock/core/flock_scheduler.py +0 -166
  238. flock/core/flock_server_manager.py +0 -136
  239. flock/core/interpreter/python_interpreter.py +0 -689
  240. flock/core/mcp/__init__.py +0 -1
  241. flock/core/mcp/flock_mcp_server.py +0 -680
  242. flock/core/mcp/mcp_client_manager.py +0 -201
  243. flock/core/mcp/types/__init__.py +0 -1
  244. flock/core/mixin/dspy_integration.py +0 -403
  245. flock/core/mixin/prompt_parser.py +0 -125
  246. flock/core/orchestration/__init__.py +0 -15
  247. flock/core/orchestration/flock_batch_processor.py +0 -94
  248. flock/core/orchestration/flock_evaluator.py +0 -113
  249. flock/core/orchestration/flock_execution.py +0 -295
  250. flock/core/orchestration/flock_initialization.py +0 -149
  251. flock/core/orchestration/flock_server_manager.py +0 -67
  252. flock/core/orchestration/flock_web_server.py +0 -117
  253. flock/core/registry/__init__.py +0 -45
  254. flock/core/registry/agent_registry.py +0 -69
  255. flock/core/registry/callable_registry.py +0 -139
  256. flock/core/registry/component_discovery.py +0 -142
  257. flock/core/registry/component_registry.py +0 -64
  258. flock/core/registry/config_mapping.py +0 -64
  259. flock/core/registry/decorators.py +0 -137
  260. flock/core/registry/registry_hub.py +0 -205
  261. flock/core/registry/server_registry.py +0 -57
  262. flock/core/registry/type_registry.py +0 -86
  263. flock/core/serialization/__init__.py +0 -13
  264. flock/core/serialization/callable_registry.py +0 -52
  265. flock/core/serialization/flock_serializer.py +0 -832
  266. flock/core/serialization/json_encoder.py +0 -41
  267. flock/core/serialization/secure_serializer.py +0 -175
  268. flock/core/serialization/serializable.py +0 -342
  269. flock/core/serialization/serialization_utils.py +0 -412
  270. flock/core/util/file_path_utils.py +0 -223
  271. flock/core/util/hydrator.py +0 -309
  272. flock/core/util/input_resolver.py +0 -164
  273. flock/core/util/loader.py +0 -59
  274. flock/core/util/splitter.py +0 -219
  275. flock/di.py +0 -27
  276. flock/platform/docker_tools.py +0 -49
  277. flock/platform/jaeger_install.py +0 -86
  278. flock/webapp/__init__.py +0 -1
  279. flock/webapp/app/__init__.py +0 -0
  280. flock/webapp/app/api/__init__.py +0 -0
  281. flock/webapp/app/api/agent_management.py +0 -241
  282. flock/webapp/app/api/execution.py +0 -709
  283. flock/webapp/app/api/flock_management.py +0 -129
  284. flock/webapp/app/api/registry_viewer.py +0 -30
  285. flock/webapp/app/chat.py +0 -665
  286. flock/webapp/app/config.py +0 -104
  287. flock/webapp/app/dependencies.py +0 -117
  288. flock/webapp/app/main.py +0 -1070
  289. flock/webapp/app/middleware.py +0 -113
  290. flock/webapp/app/models_ui.py +0 -7
  291. flock/webapp/app/services/__init__.py +0 -0
  292. flock/webapp/app/services/feedback_file_service.py +0 -363
  293. flock/webapp/app/services/flock_service.py +0 -337
  294. flock/webapp/app/services/sharing_models.py +0 -81
  295. flock/webapp/app/services/sharing_store.py +0 -762
  296. flock/webapp/app/templates/theme_mapper.html +0 -326
  297. flock/webapp/app/theme_mapper.py +0 -812
  298. flock/webapp/app/utils.py +0 -85
  299. flock/webapp/run.py +0 -215
  300. flock/webapp/static/css/chat.css +0 -301
  301. flock/webapp/static/css/components.css +0 -167
  302. flock/webapp/static/css/header.css +0 -39
  303. flock/webapp/static/css/layout.css +0 -46
  304. flock/webapp/static/css/sidebar.css +0 -127
  305. flock/webapp/static/css/two-pane.css +0 -48
  306. flock/webapp/templates/base.html +0 -200
  307. flock/webapp/templates/chat.html +0 -152
  308. flock/webapp/templates/chat_settings.html +0 -19
  309. flock/webapp/templates/flock_editor.html +0 -16
  310. flock/webapp/templates/index.html +0 -12
  311. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  312. flock/webapp/templates/partials/_agent_list.html +0 -18
  313. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  314. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  315. flock/webapp/templates/partials/_chat_container.html +0 -15
  316. flock/webapp/templates/partials/_chat_messages.html +0 -57
  317. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  318. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  319. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  320. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  321. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  322. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  323. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  324. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  325. flock/webapp/templates/partials/_execution_form.html +0 -118
  326. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  327. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  328. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  329. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  330. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  331. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  332. flock/webapp/templates/partials/_registry_table.html +0 -25
  333. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  334. flock/webapp/templates/partials/_results_display.html +0 -78
  335. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  336. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  337. flock/webapp/templates/partials/_settings_view.html +0 -36
  338. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  339. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  340. flock/webapp/templates/partials/_sidebar.html +0 -74
  341. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  342. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  343. flock/webapp/templates/partials/_theme_preview.html +0 -36
  344. flock/webapp/templates/registry_viewer.html +0 -84
  345. flock/webapp/templates/shared_run_page.html +0 -140
  346. flock/workflow/__init__.py +0 -0
  347. flock/workflow/activities.py +0 -196
  348. flock/workflow/agent_activities.py +0 -24
  349. flock/workflow/agent_execution_activity.py +0 -202
  350. flock/workflow/flock_workflow.py +0 -214
  351. flock/workflow/temporal_config.py +0 -96
  352. flock/workflow/temporal_setup.py +0 -68
  353. flock_core-0.5.0b28.dist-info/METADATA +0 -274
  354. flock_core-0.5.0b28.dist-info/RECORD +0 -561
  355. flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
  356. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  357. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  358. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  359. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
@@ -1,28 +0,0 @@
1
- <article id="flock-preview-article">
2
- <header>
3
- <h4>Preview: {{ preview_flock.name if preview_flock else selected_filename }}</h4>
4
- </header>
5
- {% if preview_flock %}
6
- <p><strong>Default Model:</strong> {{ preview_flock.model or 'Not set' }}</p>
7
- <p><strong>Description:</strong> {{ preview_flock.description or 'None' }}</p>
8
- <p><strong>Agents:</strong> {{ preview_flock.agents_count }}</p>
9
- <form hx-post="{{ url_for('ui_load_flock_by_name_action') }}"
10
- hx-target="#main-content-area" {# This will load the full editor for this flock #}
11
- hx-swap="innerHTML"
12
- hx-indicator="#flock-preview-loading-indicator">
13
- <input type="hidden" name="selected_flock_filename" value="{{ selected_filename }}">
14
- <button type="submit" class="primary">Load this Flock into Editor</button>
15
- <span id="flock-preview-loading-indicator" class="htmx-indicator"><progress indeterminate></progress></span>
16
- </form>
17
- {% else %}
18
- <p class="error">Could not load preview for <code>{{ selected_filename }}</code>. It might be corrupted or not a valid Flock file.</p>
19
- <p><small>You can still attempt to load it into the editor.</small></p>
20
- <form hx-post="{{ url_for('ui_load_flock_by_name_action') }}" hx-target="#main-content-area" hx-swap="innerHTML">
21
- <input type="hidden" name="selected_flock_filename" value="{{ selected_filename }}">
22
- <button type="submit" class="secondary">Attempt to Load into Editor</button>
23
- </form>
24
- {% endif %}
25
- <hr>
26
-
27
-
28
- </article>
@@ -1,16 +0,0 @@
1
- <article>
2
- <header>
3
- <h5>Upload New Flock File</h5>
4
- </header> <form hx-post="{{ url_for('load_flock_by_upload') }}"
5
- hx-target="#main-content-area" {# Target the main area to show editor on success #}
6
- hx-swap="innerHTML"
7
- hx-encoding="multipart/form-data"
8
- hx-indicator="#dashboard-upload-loading-indicator">
9
- <label for="flock_file_upload_dashboard">Upload <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code> file:</label>
10
- <input type="file" id="flock_file_upload_dashboard" name="flock_file_upload" accept=".yaml,.yml,.flock" required>
11
- <button type="submit">Upload and Load Flock</button>
12
- <span id="dashboard-upload-loading-indicator" class="htmx-indicator"><progress indeterminate></progress> Uploading...</span>
13
- </form>
14
- <hr>
15
- <p><small>Alternatively, select a Flock from the list on the left to view its details or load it.</small></p>
16
- </article>
@@ -1,22 +0,0 @@
1
- {% if input_fields %}
2
- {% for field in input_fields %}
3
- <fieldset> {# Group each field #}
4
- <label for="agent_input_{{ field.name }}">{{ field.name }} ({{ field.type }})</label>
5
- {% if field.description %}
6
- <small>{{ field.description }}</small>
7
- {% endif %}
8
- {% if field.html_type == 'textarea' %}
9
- <textarea id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" rows="3" placeholder="{{ field.placeholder if field.placeholder else ('Enter ' + field.type) }}"></textarea>
10
- {% elif field.html_type == 'checkbox' %}
11
- <label for="agent_input_{{ field.name }}_cb">
12
- <input type="checkbox" id="agent_input_{{ field.name }}_cb" name="agent_input_{{ field.name }}" value="true">
13
- Enabled
14
- </label>
15
- {% else %}
16
- <input type="{{ field.html_type }}" id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" placeholder="{{ field.placeholder if field.placeholder else ('Enter ' + field.type) }}">
17
- {% endif %}
18
- </fieldset>
19
- {% endfor %}
20
- {% else %}
21
- <p><small>This agent requires no specific inputs, or input signature could not be parsed.</small></p>
22
- {% endif %}
@@ -1,23 +0,0 @@
1
- <div id="env-vars-container">
2
- <table class="striped" style="font-size:0.9rem;">
3
- <thead>
4
- <tr>
5
- <th>Name</th>
6
- <th>Value</th>
7
- <th>Actions</th>
8
- </tr>
9
- </thead>
10
- <tbody>
11
- {% for var in env_vars %}
12
- <tr>
13
- <td>{{ var.name }}</td>
14
- <td>{{ var.value }}</td> <td> <button class="secondary small outline" hx-post="{{ url_for('htmx_env_edit') }}" hx-vals='{"var_name": "{{ var.name }}"}'
15
- hx-prompt="Enter new value for {{ var.name }}" hx-target="#env-vars-container" hx-swap="outerHTML">Edit</button>
16
- <button class="contrast small outline" hx-post="{{ url_for('htmx_env_delete') }}" hx-vals='{"var_name": "{{ var.name }}"}'
17
- hx-confirm="Delete {{ var.name }}?" hx-target="#env-vars-container" hx-swap="outerHTML" style="margin-left:0.25rem;">Delete</button>
18
- </td>
19
- </tr>
20
- {% endfor %}
21
- </tbody>
22
- </table>
23
- </div>
@@ -1,118 +0,0 @@
1
- <script>
2
- // Create URL template for agent input forms
3
- window.agentInputFormUrlTemplate = '{{ url_for("htmx_get_agent_input_form", agent_name="AGENT_PLACEHOLDER") }}';
4
- </script>
5
-
6
- <article id="execution-form-content">
7
- <header>
8
- <h2>Run Flock</h2>
9
- </header>
10
- {% if flock and flock.agents %} <form hx-post="{{ url_for('htmx_run_flock') }}" hx-target="#results-display"
11
- hx-swap="innerHTML" hx-indicator="#run-loading-indicator" x-data="{ selectedAgentForInput: '' }">
12
-
13
- <label for="start_agent_name_select">Select Start Agent:</label>
14
- <select id="start_agent_name_select" name="start_agent_name" required x-model="selectedAgentForInput" @change="
15
- if ($event.target.value) {
16
- const url = window.agentInputFormUrlTemplate.replace('AGENT_PLACEHOLDER', $event.target.value);
17
- htmx.ajax('GET', url, {target: '#dynamic-input-form-fields', swap: 'innerHTML', indicator: '#input-form-loading-indicator'});
18
- } else {
19
- document.getElementById('dynamic-input-form-fields').innerHTML = '<p><small>Select an agent to see its input fields.</small></p>';
20
- }
21
- ">
22
- <option value="" disabled {% if not selected_agent_name %}selected{% endif %}>-- Choose an agent --</option>
23
- {% for agent_name_key in flock.agents.keys() %}
24
- <option value="{{ agent_name_key }}" {% if selected_agent_name==agent_name_key %}selected{% endif %}>{{
25
- agent_name_key }}</option>
26
- {% endfor %}
27
- </select>
28
-
29
- <div id="dynamic-input-form-fields">
30
- <!-- Input fields for the selected agent will be loaded here -->
31
- <p><small>Select an agent to see its input fields.</small></p>
32
- </div>
33
- <div id="input-form-loading-indicator" class="htmx-indicator">
34
- <progress indeterminate></progress> Loading input form...
35
- </div>
36
-
37
- <button type="submit" {% if not flock.agents %}disabled{% endif %}>Run Flock</button>
38
- <div id="share-agent-link-container" style="margin-top: 0.5rem;">
39
- <a href="#" id="shareAgentHtmxLink" hx-post="{{ url_for('htmx_generate_share_link') }}"
40
- hx-target="#shareLinkDisplayArea" hx-swap="innerHTML" hx-indicator="#share-loading-indicator"
41
- hx-include="#start_agent_name_select"
42
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
43
- Create shareable link...
44
- </a>
45
- <span id="share-loading-indicator" class="htmx-indicator">
46
- <progress indeterminate></progress> Generating link...
47
- </span>
48
- </div>
49
-
50
- <div id="feedback-download-container" style="margin-top: 0.5rem;">
51
- <div x-show="selectedAgentForInput" x-cloak
52
- style="display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;">
53
- <span style="padding: 0.25rem; text-decoration: underline;">Download feedback for selected
54
- agent:</span>
55
- <div>
56
- <a href="#" id="downloadFeedbackLink" hx-indicator="#download-feedback-loading-indicator"
57
- hx-include="#start_agent_name_select"
58
- :href="selectedAgentForInput ? '{{ url_for('chat_feedback_download', agent_name='AGENT_PLACEHOLDER', format='csv') }}'.replace('AGENT_PLACEHOLDER', selectedAgentForInput) : '#'"
59
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
60
- CSV
61
- </a>
62
- <a href="#" id="downloadFeedbackLinkXlsx" hx-indicator="#download-feedback-loading-indicator"
63
- hx-include="#start_agent_name_select"
64
- :href="selectedAgentForInput ? '{{ url_for('chat_feedback_download', agent_name='AGENT_PLACEHOLDER', format='xlsx') }}'.replace('AGENT_PLACEHOLDER', selectedAgentForInput) : '#'"
65
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
66
- XLSX
67
- </a>
68
- </div>
69
- </div>
70
- <span id="download-feedback-loading-indicator" class="htmx-indicator">
71
- <progress indeterminate></progress> Preparing file...
72
- </span>
73
- </div>
74
-
75
- <div id="feedback-download-container-all" style="margin-top: 0.5rem;">
76
- <div style="display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;">
77
- <span style="padding: 0.25rem; text-decoration: underline;">Download feedback for all
78
- agents:</span>
79
- <div>
80
- <a href="{{ url_for('chat_feedback_download_all', format='csv') }}" id="downloadFeedbackLinkAll"
81
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
82
- CSV
83
- </a>
84
- <a href="{{ url_for('chat_feedback_download_all', format='xlsx') }}"
85
- id="downloadFeedbackLinkAllXlsx"
86
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
87
- XLSX
88
- </a>
89
- </div>
90
- </div>
91
- <span id="download-feedback-loading-indicator-all" class="htmx-indicator">
92
- <progress indeterminate></progress> Preparing file...
93
- </span>
94
- </div>
95
-
96
- <span id="run-loading-indicator" class="htmx-indicator">
97
- <progress indeterminate></progress> Running...
98
- </span>
99
- </form>
100
- {% elif flock and not flock.agents %}
101
- <p>No agents available in the current Flock. Add agents to enable execution.</p>
102
- {% else %}
103
- <p>Load or create a Flock to enable execution.</p>
104
- {% endif %}
105
-
106
- <div id="shareLinkDisplayArea" style="margin-top: 1rem;">
107
- <!-- Content will be loaded here by HTMX -->
108
- </div>
109
-
110
- </article>
111
-
112
- <script>
113
- document.addEventListener('DOMContentLoaded', function () {
114
- // All previous JavaScript for toggling share link visibility is removed.
115
- // If there are other unrelated JavaScript functions in this script block,
116
- // they would remain.
117
- });
118
- </script>
@@ -1,28 +0,0 @@
1
- <article class="two-pane-flex-container" x-data="{ showLeftPane: true }">
2
- <!-- Left pane - collapsed state -->
3
- <div class="left-pane-collapsed" x-show="!showLeftPane" style="display: none;">
4
- <a href="#" class="pane-toggle" @click.prevent="showLeftPane = true" aria-label="Expand left pane">Show</a>
5
- </div>
6
-
7
- <!-- Left pane - expanded state -->
8
- <section id="execution-left-pane" x-show="showLeftPane" style="flex: 1; min-width: 200px; max-width: 500px;">
9
- <div class="pane-header" style="display: flex; justify-content: flex-end; margin-bottom: 10px;">
10
- <a href="#" class="pane-toggle" @click.prevent="showLeftPane = false" aria-label="Hide left pane">Hide</a>
11
- </div>
12
- {# The Execution Form will be loaded here #} <div id="execution-form-wrapper" hx-get="{{ url_for('htmx_get_execution_form_content') }}"
13
- hx-trigger="load" hx-swap="innerHTML">
14
- <p>Loading execution form...</p><progress indeterminate></progress>
15
- </div>
16
- </section>
17
-
18
- <section id="execution-right-pane" class="right-pane-framed"
19
- :style="showLeftPane ? 'flex: 2; border-left: 1px solid var(--pico-muted-border-color); padding-left: 1.5rem;' : 'flex: 1; border-left: none; padding-left: 0;'">
20
- {# The Results Display area, always present when this container is loaded #}
21
- <header style=" border-bottom: 1px solid var(--pico-muted-border-color); margin-bottom: 1rem;">
22
- <h5>Execution Results</h5>
23
- </header>
24
- <div id="results-display">
25
- <p><code>Results will appear here after running the Flock.</code></p>
26
- </div>
27
- </section>
28
- </article>
@@ -1,23 +0,0 @@
1
- {% if flock_files %}
2
- <ul class="item-list">
3
- {% for file_name in flock_files %} <li hx-post="{{ url_for('ui_load_flock_by_name_action') }}"
4
- hx-vals='{"selected_flock_filename": "{{ file_name }}"}'
5
- {# After successful load, the main.py route for by-name will now return
6
- the flock properties form targeted to the main content area AND
7
- trigger flockLoaded event for the sidebar.
8
- For the right pane of *this* view, we might want to show file details.
9
- Let's assume for now loading a flock navigates to the editor.
10
- If we want to show details *here*, the target would be #flock-file-detail-or-upload
11
- #}
12
- hx-target="#main-content-area" {# This will load the editor page content #}
13
- hx-swap="innerHTML"
14
- hx-indicator="#flock-file-list-loading-indicator"
15
- hx-push-url="{{ url_for('page_editor_section', ui_mode='properties') }}"> {# Push URL to editor after load #}
16
- {{ file_name }}
17
- </li>
18
- {% endfor %}
19
- </ul>
20
- {% else %}
21
- <p style="padding: 1rem;">No Flock files found. Create one or upload.</p>
22
- {% endif %}
23
- <div id="flock-file-list-loading-indicator" class="htmx-indicator" style="text-align:center;"><progress indeterminate></progress></div>
@@ -1,52 +0,0 @@
1
- <article id="flock-properties-form-article">
2
- <header>
3
- <h2>Flock Properties </h2>
4
-
5
- </header>
6
-
7
- {% if update_message %}
8
- <div class="form-message {{ 'success' if success else 'error' }}" role="alert"
9
- x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 3000)"
10
- x-transition:leave="transition ease-in duration-300"
11
- x-transition:leave-start="opacity-100"
12
- x-transition:leave-end="opacity-0">
13
- {{ update_message }}
14
- </div>
15
- {% endif %}
16
- {% if save_message %}
17
- <div class="form-message {{ 'success' if success else 'error' }}" role="alert"
18
- x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 3000)"
19
- x-transition:leave="transition ease-in duration-300"
20
- x-transition:leave-start="opacity-100"
21
- x-transition:leave-end="opacity-0">
22
- {{ save_message }}
23
- </div>
24
- {% endif %}
25
-
26
- <form hx-post="{{ url_for('htmx_update_flock_properties') }}" hx-target="#flock-properties-form-article" hx-swap="innerHTML" hx-indicator="#flock-props-loading">
27
- <label for="flock_name">Flock Name</label>
28
- <input type="text" id="flock_name" name="flock_name" value="{{ flock.name if flock else '' }}" required>
29
-
30
- <label for="default_model">Default Model</label>
31
- <input type="text" id="default_model" name="default_model" value="{{ flock.model if flock and flock.model else '' }}" placeholder="e.g., openai/gpt-4o">
32
-
33
- <label for="description">Description</label>
34
- <textarea id="description" name="description" placeholder="A brief description of this Flock.">{{ flock.description if flock and flock.description else '' }}</textarea>
35
-
36
- <div class="grid">
37
- <button type="submit">Update Properties <span id="flock-props-loading" class="htmx-indicator"><progress indeterminate></progress></span></button>
38
- </div>
39
- </form>
40
- <hr>
41
- <form hx-post="{{ url_for('htmx_save_flock') }}" hx-target="#flock-properties-form-article" hx-swap="innerHTML" hx-indicator="#flock-save-loading">
42
- <label for="save_filename">Save Flock As:</label>
43
- <input type="text" id="save_filename" name="save_filename"
44
- value="{{ current_filename if current_filename else (flock.name.replace(' ', '_').lower() + '.flock.yaml' if flock and flock.name else 'my_flock.flock.yaml') }}"
45
- required
46
- placeholder="filename.flock.yaml">
47
- <small>Will save to <code>./.flock_ui_projects/</code>. Use <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code>.</small>
48
- <div class="grid">
49
- <button type="submit">Save to File <span id="flock-save-loading" class="htmx-indicator"><progress indeterminate></progress></span></button>
50
- </div>
51
- </form>
52
- </article>
@@ -1,16 +0,0 @@
1
- <article>
2
- <header>
3
- <h5>Upload New Flock File</h5>
4
- </header> <form hx-post="{{ url_for('load_flock_by_upload') }}"
5
- hx-target="#main-content-area" {# After upload, go to editor #}
6
- hx-swap="innerHTML"
7
- hx-encoding="multipart/form-data"
8
- hx-indicator="#upload-loading-indicator-pane">
9
- <label for="flock_file_upload_pane">Upload <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code> file:</label>
10
- <input type="file" id="flock_file_upload_pane" name="flock_file_upload" accept=".yaml,.yml,.flock" required>
11
- <button type="submit">Upload and Load Flock</button>
12
- <span id="upload-loading-indicator-pane" class="htmx-indicator"><progress indeterminate></progress> Uploading...</span>
13
- </form>
14
- {# Optionally, if a file from the list was clicked to show details before loading: #}
15
- {# {% if selected_file_details %} ... display details ... {% endif %} #}
16
- </article>
@@ -1,5 +0,0 @@
1
- {% if current_flock %}
2
- <small>Current: <code>{{ current_filename or current_flock.name }}</code></small>
3
- {% else %}
4
- <small>No Flock Loaded</small>
5
- {% endif %}
@@ -1,49 +0,0 @@
1
- <!-- <article id="dashboard-flock-manager-content"> -->
2
- <!-- {# This outer header is removed, title moves into the left-pane's new article structure #}
3
- {# <header>
4
- <h2>Manage & Load Flocks</h2> #}
5
- </header> -->
6
-
7
- {% if error_message %}
8
- <div class="error DANGER" role="alert" x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 5000)">
9
- {{ error_message }} <button type="button" class="close" @click="show = false">×</button>
10
- </div>
11
- {% endif %}
12
- {% if success_message %}
13
- <div class="success SUCCESS" role="alert" x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 5000)">
14
- {{ success_message }} <button type="button" class="close" @click="show = false">×</button>
15
- </div>
16
- {% endif %}
17
-
18
- <article class="two-pane-flex-container">
19
- <article class="left-pane"> {# Changed section to article, or wrap section in article #}
20
- <header class="grid">
21
- <h2>Load Flock</h2> {# Moved title here #}
22
- <div style="text-align: right;">
23
- <button role="button" class="outline" hx-get="{{ url_for('htmx_get_create_flock_form') }}?ui_mode={{ ui_mode }}" hx-target="#flock-properties-or-action-content" hx-swap="innerHTML">Add New Flock</button>
24
- </div>
25
- </header>
26
- {# Content of the left pane now goes into this article #}
27
- <div style="padding: var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal); flex-grow: 1; display: flex; flex-direction: column;"> <div hx-get="{{ url_for('htmx_get_dashboard_flock_file_list_partial') }}"
28
- hx-trigger="load, flockFileListChanged from:body"
29
- hx-swap="innerHTML"
30
- id="dashboard-flock-file-list-target"
31
- class="item-list-container" style="flex-grow: 1; overflow-y: auto;border: 1px solid var(--pico-border-color); border-radius: var(--pico-border-radius);">
32
- <p style="padding:1rem; border: 1px solid var(--pico-border-color); border-radius: var(--pico-border-radius);">Loading files...</p><progress indeterminate></progress>
33
- </div>
34
- </div>
35
- </article>
36
-
37
- <section id="flock-detail-action-column" class="right-pane-framed">
38
- <header>
39
- <h5>Flock Details</h5>
40
- </header>
41
- <div id="flock-properties-or-action-content">
42
- <article style="text-align:center; margin-top: 2rem; border: none; background: transparent;">
43
- <p>Select a Flock from the list to view its details and load it into the editor.</p>
44
- <p><small>To create a new Flock or upload an existing one, use the options in the sidebar.</small></p>
45
- </article>
46
- </div>
47
- </section>
48
- </article>
49
- <!-- </article> -->
@@ -1,25 +0,0 @@
1
- <article style="margin-top:0; padding-top:0;"> {# Remove top margin/padding from article to align with buttons #}
2
- <header>
3
- <h4 style="margin-bottom: 0.5rem;">{{ item_type_display }}</h4>
4
- </header>
5
- {% if items %}
6
- <table>
7
- <thead>
8
- <tr>
9
- <th>Name</th>
10
- <th>Module Path</th>
11
- </tr>
12
- </thead>
13
- <tbody>
14
- {% for item in items %}
15
- <tr>
16
- <td>{{ item.name }}</td>
17
- <td>{{ item.module }}</td>
18
- </tr>
19
- {% endfor %}
20
- </tbody>
21
- </table>
22
- {% else %}
23
- <p>No {{ item_type_display.lower() }} found in the registry.</p>
24
- {% endif %}
25
- </article>
@@ -1,70 +0,0 @@
1
- <article>
2
- <header>
3
- <h2>Flock Registry Viewer</h2>
4
- <p>Browse items registered with the Flock framework.</p>
5
- </header>
6
-
7
- <nav>
8
- <ul role="group">
9
- <li>
10
- <button role="button" class="outline"
11
- hx-get="{{ url_for('htmx_get_registry_table', item_type='type') }}"
12
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
13
- hx-on:click="setActiveButton(this)">
14
- View Types
15
- </button>
16
- </li>
17
- <li>
18
- <button role="button" class="outline"
19
- hx-get="{{ url_for('htmx_get_registry_table', item_type='tool') }}"
20
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
21
- hx-on:click="setActiveButton(this)">
22
- View Tools/Callables
23
- </button>
24
- </li>
25
- <li>
26
- <button role="button" class="outline"
27
- hx-get="{{ url_for('htmx_get_registry_table', item_type='component') }}"
28
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
29
- hx-on:click="setActiveButton(this)">
30
- View Components
31
- </button>
32
- </li>
33
- <li>
34
- <span style="padding: 0.25rem; text-decoration: underline;">Feedback-Files</span>
35
- <div>
36
- <a href="{{ url_for('chat_feedback_download_all', format='csv') }}" id="downloadFeedbackLinkAll"
37
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
38
- CSV
39
- </a>
40
- <a href="{{ url_for('chat_feedback_download_all', format='xlsx') }}"
41
- id="downloadFeedbackLinkAllXlsx"
42
- style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
43
- XLSX
44
- </a>
45
- </div>
46
- </li>
47
- </ul>
48
- </nav>
49
-
50
- <div id="registry-loading" class="htmx-indicator" style="text-align: center; margin-top: 1rem;">
51
- <progress></progress> Loading...
52
- </div>
53
-
54
- <div id="registry-table-container" style="margin-top: 1.5rem;">
55
- <p>Select a category above to view registered items.</p>
56
- </div>
57
- </article>
58
-
59
- <script>
60
- // Make sure this script is included or available globally
61
- function setActiveButton(clickedButton) {
62
- const buttons = clickedButton.closest('ul[role="group"]').querySelectorAll('button');
63
- buttons.forEach(button => {
64
- button.classList.remove('primary');
65
- button.classList.add('outline');
66
- });
67
- clickedButton.classList.remove('outline');
68
- clickedButton.classList.add('primary');
69
- }
70
- </script>
@@ -1,78 +0,0 @@
1
- {% from "partials/_structured_data_view.html" import render_value %}
2
-
3
- <article id="results-display-content" x-data="{ viewMode: 'structured' }">
4
- <header class="grid">
5
- <h5 style="margin-bottom: 0;">Execution Result</h5>
6
- <div style="text-align: right;">
7
- <button role="button" class="outline contrast" @click="viewMode = 'structured'" :aria-pressed="viewMode === 'structured'">Structured</button>
8
- <button role="button" class="outline contrast" @click="viewMode = 'json'" :aria-pressed="viewMode === 'json'">Raw JSON</button>
9
-
10
- <div style="display:inline-block;margin-left:0.5rem;">
11
- <!-- Quick thumbs-up feedback (inline form so we have the identifiers) -->
12
- <form hx-post="{{ feedback_endpoint }}" hx-target="#results-display-content" hx-swap="innerHTML" style="display:inline-block;vertical-align:middle;margin:0;" hx-indicator="#feedback-loading-indicator">
13
- {% if share_id %}<input type="hidden" name="share_id" value="{{ share_id }}">{% endif %}
14
- <input type="hidden" name="flock_name" value="{{ flock_name }}">
15
- <input type="hidden" name="agent_name" value="{{ agent_name }}">
16
- <input type="hidden" name="flock_definition" value='{{ flock_definition | replace("'", "&#39;") }}'>
17
- <input type="hidden" name="actual_response" value='{{ result_raw_json | replace("'", "&#39;") }}'>
18
- <input type="hidden" name="reason" value="positive">
19
- <button type="submit" role="button" class="outline contrast" title="Looks good!" style="padding:0.3rem 0.5rem;line-height:1;vertical-align:middle;margin:0;"><i class="fa fa-thumbs-up"></i></button>
20
- </form>
21
-
22
- <!-- Thumbs-down toggles detailed feedback form -->
23
- <button role="button" class="outline contrast" @click="viewMode = 'feedback'" :aria-pressed="viewMode === 'feedback'" title="Something's wrong" style="padding:0.3rem 0.5rem;line-height:1;vertical-align:middle;margin:0;"><i class="fa fa-thumbs-down"></i></button>
24
- </div>
25
- </div>
26
- </header>
27
-
28
- <div x-show="viewMode === 'json'">
29
- {# Check for the new result_raw_json variable first #}
30
- {% if result_raw_json is defined %}
31
- <pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result_raw_json }}</code></pre>
32
- {# Fallback for old context or if result was an error string from backend before formatting #}
33
- {% elif result is string %}
34
- <pre><code class="language-plaintext" style="word-break: break-all; white-space: pre-wrap;">{{ result }}</code></pre>
35
- {% elif result %}
36
- {# Fallback if result_raw_json is somehow not provided but result (dict) is #}
37
- <pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result | tojson(indent=2) }}</code></pre>
38
- {% else %}
39
- <p>No results to display yet.</p>
40
- {% endif %}
41
- </div>
42
-
43
- <div x-show="viewMode === 'structured'">
44
- {% if result is string %}
45
- <p class="error" style="white-space: pre-wrap;">{{ result }}</p>
46
- {% elif result is mapping %}
47
- {{ render_value(result) }}
48
- {% elif result %}
49
- <p>Structured view not available for this result type (not a dictionary).</p>
50
- <pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result | tojson(indent=2) }}</code></pre>
51
- {% else %}
52
- <p>No results to display yet.</p>
53
- {% endif %}
54
- </div>
55
-
56
- <!-- ---------------- Feedback form ---------------- -->
57
- <div x-show="viewMode === 'feedback'" style="margin-top: 1rem;">
58
- <form hx-post="{{ feedback_endpoint }}" hx-target="#results-display-content" hx-swap="innerHTML" hx-indicator="#feedback-loading-indicator">
59
- {# Hidden identifiers #}
60
- {% if share_id %}
61
- <input type="hidden" name="share_id" value="{{ share_id }}">
62
- {% endif %}
63
- <input type="hidden" name="flock_name" value="{{ flock_name }}">
64
- <input type="hidden" name="agent_name" value="{{ agent_name }}">
65
- <input type="hidden" name="flock_definition" value='{{ flock_definition | replace("'", "&#39;") }}'>
66
- <input type="hidden" name="actual_response" value='{{ result_raw_json | replace("'", "&#39;") }}'>
67
-
68
- <label for="feedback_reason">Reason / Comment</label>
69
- <textarea id="feedback_reason" name="reason" placeholder="Why isn't the answer good?" required style="min-height:6rem;"></textarea>
70
-
71
- <label for="expected_response" style="margin-top:0.5rem;">Correct / Expected Response (JSON or text)</label>
72
- <textarea id="expected_response" name="expected_response" style="white-space: pre; font-family: monospace; min-height:10rem;">{{ result_raw_json }}</textarea>
73
-
74
- <button type="submit" class="secondary" style="margin-top:0.5rem;">Send Feedback</button>
75
- <span id="feedback-loading-indicator" class="htmx-indicator"><progress indeterminate></progress> Sending…</span>
76
- </form>
77
- </div>
78
- </article>
@@ -1,9 +0,0 @@
1
- <article>
2
- <h3>Environment Variables</h3>
3
- <div style="display:flex; gap:0.5rem; flex-wrap:wrap;"> <button class="outline small" id="toggle-secrets-btn" hx-post="{{ url_for('htmx_toggle_show_secrets') }}" hx-target="#env-vars-container" hx-swap="outerHTML">
4
- {% if show_secrets %}Hide Secrets{% else %}Show Secrets{% endif %}
5
- </button>
6
- <button class="outline small" hx-get="{{ url_for('htmx_env_add_form') }}" hx-target="#env-vars-container" hx-swap="afterbegin">Add Variable</button>
7
- </div>
8
- {% include 'partials/_env_vars_table.html' %}
9
- </article>
@@ -1,14 +0,0 @@
1
- <article>
2
- <h3>Theme Switcher</h3>
3
- <div style="display:flex; gap:0.5rem; flex-wrap:wrap; align-items:center;">
4
- <label for="theme-select" style="margin:0;">Select Theme:</label> <select id="theme-select" name="theme" hx-get="{{ url_for('htmx_theme_preview') }}" hx-target="#theme-preview" hx-trigger="load, change" hx-include="#theme-select" hx-swap="innerHTML">
5
- {% for t in themes %}
6
- <option value="{{ t }}" {% if t == current_theme %}selected{% endif %}>{{ t }}</option>
7
- {% endfor %}
8
- </select>
9
- <button class="small" hx-post="{{ url_for('apply_theme') }}" hx-target="body" hx-include="#theme-select" hx-swap="none">Apply</button>
10
- </div>
11
- <div id="theme-preview" style="margin-top:1rem;">
12
- <!-- Preview generated by theme-preview endpoint -->
13
- </div>
14
- </article>