flock-core 0.5.0b27__py3-none-any.whl → 0.5.0b50__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 (357) 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.0b50.dist-info/METADATA +747 -0
  162. flock_core-0.5.0b50.dist-info/RECORD +398 -0
  163. flock_core-0.5.0b50.dist-info/entry_points.txt +2 -0
  164. {flock_core-0.5.0b27.dist-info → flock_core-0.5.0b50.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 -15
  197. flock/components/utility/memory_utility_component.py +0 -550
  198. flock/components/utility/metrics_utility_component.py +0 -700
  199. flock/config.py +0 -61
  200. flock/core/__init__.py +0 -110
  201. flock/core/agent/__init__.py +0 -16
  202. flock/core/agent/default_agent.py +0 -180
  203. flock/core/agent/flock_agent_components.py +0 -104
  204. flock/core/agent/flock_agent_execution.py +0 -101
  205. flock/core/agent/flock_agent_integration.py +0 -260
  206. flock/core/agent/flock_agent_lifecycle.py +0 -186
  207. flock/core/agent/flock_agent_serialization.py +0 -381
  208. flock/core/api/__init__.py +0 -10
  209. flock/core/api/custom_endpoint.py +0 -45
  210. flock/core/api/endpoints.py +0 -254
  211. flock/core/api/main.py +0 -162
  212. flock/core/api/models.py +0 -97
  213. flock/core/api/run_store.py +0 -224
  214. flock/core/api/runner.py +0 -44
  215. flock/core/api/service.py +0 -214
  216. flock/core/component/__init__.py +0 -15
  217. flock/core/component/agent_component_base.py +0 -309
  218. flock/core/component/evaluation_component.py +0 -62
  219. flock/core/component/routing_component.py +0 -74
  220. flock/core/component/utility_component.py +0 -69
  221. flock/core/config/flock_agent_config.py +0 -58
  222. flock/core/config/scheduled_agent_config.py +0 -40
  223. flock/core/context/context.py +0 -213
  224. flock/core/context/context_manager.py +0 -37
  225. flock/core/context/context_vars.py +0 -10
  226. flock/core/evaluation/utils.py +0 -396
  227. flock/core/execution/batch_executor.py +0 -369
  228. flock/core/execution/evaluation_executor.py +0 -438
  229. flock/core/execution/local_executor.py +0 -31
  230. flock/core/execution/opik_executor.py +0 -103
  231. flock/core/execution/temporal_executor.py +0 -164
  232. flock/core/flock.py +0 -634
  233. flock/core/flock_agent.py +0 -336
  234. flock/core/flock_factory.py +0 -551
  235. flock/core/flock_scheduler.py +0 -166
  236. flock/core/flock_server_manager.py +0 -136
  237. flock/core/interpreter/python_interpreter.py +0 -689
  238. flock/core/mcp/__init__.py +0 -1
  239. flock/core/mcp/flock_mcp_server.py +0 -680
  240. flock/core/mcp/mcp_client_manager.py +0 -201
  241. flock/core/mcp/types/__init__.py +0 -1
  242. flock/core/mixin/dspy_integration.py +0 -403
  243. flock/core/mixin/prompt_parser.py +0 -125
  244. flock/core/orchestration/__init__.py +0 -15
  245. flock/core/orchestration/flock_batch_processor.py +0 -94
  246. flock/core/orchestration/flock_evaluator.py +0 -113
  247. flock/core/orchestration/flock_execution.py +0 -295
  248. flock/core/orchestration/flock_initialization.py +0 -149
  249. flock/core/orchestration/flock_server_manager.py +0 -67
  250. flock/core/orchestration/flock_web_server.py +0 -117
  251. flock/core/registry/__init__.py +0 -45
  252. flock/core/registry/agent_registry.py +0 -69
  253. flock/core/registry/callable_registry.py +0 -139
  254. flock/core/registry/component_discovery.py +0 -142
  255. flock/core/registry/component_registry.py +0 -64
  256. flock/core/registry/config_mapping.py +0 -64
  257. flock/core/registry/decorators.py +0 -137
  258. flock/core/registry/registry_hub.py +0 -205
  259. flock/core/registry/server_registry.py +0 -57
  260. flock/core/registry/type_registry.py +0 -86
  261. flock/core/serialization/__init__.py +0 -13
  262. flock/core/serialization/callable_registry.py +0 -52
  263. flock/core/serialization/flock_serializer.py +0 -832
  264. flock/core/serialization/json_encoder.py +0 -41
  265. flock/core/serialization/secure_serializer.py +0 -175
  266. flock/core/serialization/serializable.py +0 -342
  267. flock/core/serialization/serialization_utils.py +0 -412
  268. flock/core/util/file_path_utils.py +0 -223
  269. flock/core/util/hydrator.py +0 -309
  270. flock/core/util/input_resolver.py +0 -164
  271. flock/core/util/loader.py +0 -59
  272. flock/core/util/splitter.py +0 -219
  273. flock/di.py +0 -27
  274. flock/platform/docker_tools.py +0 -49
  275. flock/platform/jaeger_install.py +0 -86
  276. flock/webapp/__init__.py +0 -1
  277. flock/webapp/app/__init__.py +0 -0
  278. flock/webapp/app/api/__init__.py +0 -0
  279. flock/webapp/app/api/agent_management.py +0 -241
  280. flock/webapp/app/api/execution.py +0 -709
  281. flock/webapp/app/api/flock_management.py +0 -129
  282. flock/webapp/app/api/registry_viewer.py +0 -30
  283. flock/webapp/app/chat.py +0 -665
  284. flock/webapp/app/config.py +0 -104
  285. flock/webapp/app/dependencies.py +0 -117
  286. flock/webapp/app/main.py +0 -1070
  287. flock/webapp/app/middleware.py +0 -113
  288. flock/webapp/app/models_ui.py +0 -7
  289. flock/webapp/app/services/__init__.py +0 -0
  290. flock/webapp/app/services/feedback_file_service.py +0 -363
  291. flock/webapp/app/services/flock_service.py +0 -337
  292. flock/webapp/app/services/sharing_models.py +0 -81
  293. flock/webapp/app/services/sharing_store.py +0 -598
  294. flock/webapp/app/templates/theme_mapper.html +0 -326
  295. flock/webapp/app/theme_mapper.py +0 -812
  296. flock/webapp/app/utils.py +0 -85
  297. flock/webapp/run.py +0 -215
  298. flock/webapp/static/css/chat.css +0 -301
  299. flock/webapp/static/css/components.css +0 -167
  300. flock/webapp/static/css/header.css +0 -39
  301. flock/webapp/static/css/layout.css +0 -46
  302. flock/webapp/static/css/sidebar.css +0 -127
  303. flock/webapp/static/css/two-pane.css +0 -48
  304. flock/webapp/templates/base.html +0 -200
  305. flock/webapp/templates/chat.html +0 -152
  306. flock/webapp/templates/chat_settings.html +0 -19
  307. flock/webapp/templates/flock_editor.html +0 -16
  308. flock/webapp/templates/index.html +0 -12
  309. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  310. flock/webapp/templates/partials/_agent_list.html +0 -18
  311. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  312. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  313. flock/webapp/templates/partials/_chat_container.html +0 -15
  314. flock/webapp/templates/partials/_chat_messages.html +0 -57
  315. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  316. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  317. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  318. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  319. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  320. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  321. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  322. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  323. flock/webapp/templates/partials/_execution_form.html +0 -118
  324. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  325. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  326. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  327. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  328. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  329. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  330. flock/webapp/templates/partials/_registry_table.html +0 -25
  331. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  332. flock/webapp/templates/partials/_results_display.html +0 -78
  333. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  334. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  335. flock/webapp/templates/partials/_settings_view.html +0 -36
  336. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  337. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  338. flock/webapp/templates/partials/_sidebar.html +0 -74
  339. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  340. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  341. flock/webapp/templates/partials/_theme_preview.html +0 -36
  342. flock/webapp/templates/registry_viewer.html +0 -84
  343. flock/webapp/templates/shared_run_page.html +0 -140
  344. flock/workflow/__init__.py +0 -0
  345. flock/workflow/activities.py +0 -196
  346. flock/workflow/agent_activities.py +0 -24
  347. flock/workflow/agent_execution_activity.py +0 -202
  348. flock/workflow/flock_workflow.py +0 -214
  349. flock/workflow/temporal_config.py +0 -96
  350. flock/workflow/temporal_setup.py +0 -68
  351. flock_core-0.5.0b27.dist-info/METADATA +0 -274
  352. flock_core-0.5.0b27.dist-info/RECORD +0 -559
  353. flock_core-0.5.0b27.dist-info/entry_points.txt +0 -2
  354. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  355. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  356. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  357. {flock_core-0.5.0b27.dist-info → flock_core-0.5.0b50.dist-info}/WHEEL +0 -0
@@ -1,36 +0,0 @@
1
- <!-- Settings View -->
2
- <article>
3
- <header>
4
- <h2>Settings</h2>
5
- </header>
6
- <nav>
7
- <ul role="group">
8
- <li>
9
- <button role="button" class="primary" hx-get="{{ url_for('htmx_settings_env_vars') }}" hx-target="#settings-content-container" hx-indicator="#settings-loading" hx-on:click="setActiveButton(this)">Environment</button>
10
- </li>
11
- <li>
12
- <button role="button" class="outline" hx-get="{{ url_for('htmx_settings_theme') }}" hx-target="#settings-content-container" hx-indicator="#settings-loading" hx-on:click="setActiveButton(this)">Theme</button>
13
- </li>
14
- </ul>
15
- </nav>
16
-
17
- <div id="settings-loading" class="htmx-indicator" style="text-align:center; margin-top:1rem;">
18
- <progress></progress> Loading...
19
- </div>
20
-
21
- <div id="settings-content-container" style="margin-top:1.5rem;">
22
- {% include 'partials/_settings_env_content.html' %}
23
- </div>
24
- </article>
25
-
26
- <script>
27
- function setActiveButton(clickedButton) {
28
- const buttons = clickedButton.closest('ul[role="group"]').querySelectorAll('button');
29
- buttons.forEach(btn => {
30
- btn.classList.remove('primary');
31
- btn.classList.add('outline');
32
- });
33
- clickedButton.classList.remove('outline');
34
- clickedButton.classList.add('primary');
35
- }
36
- </script>
@@ -1,11 +0,0 @@
1
- {# This snippet is returned by the /ui/htmx/share/chat/generate-link endpoint #}
2
- {% if share_url %}
3
- <p style="margin-bottom: 0.5rem;"><strong>Shareable Chat Link generated:</strong></p>
4
- <input type="text" id="generatedShareChatLinkInput" value="{{ share_url }}" readonly style="width: 100%; margin-bottom: 0.5rem;">
5
- <p><small>You can select the link above and copy it (Ctrl+C or Cmd+C).</small></p>
6
- <p><small>This link will start a chat session with the agent '{{ agent_name }}' from Flock '{{ flock_name }}' using the currently saved settings.</small></p>
7
- {% elif error_message %}
8
- <p style="color: var(--pico-form-invalid-color);">Error generating chat link: {{ error_message }}</p>
9
- {% else %}
10
- <p><em>Something went wrong, no chat link generated.</em></p>
11
- {% endif %}
@@ -1,35 +0,0 @@
1
- {# This snippet is returned by the /ui/htmx/share/generate-link endpoint #}
2
- {% if share_url %}
3
- <p style="margin-bottom: 0.5rem;"><strong>Shareable Link generated:</strong></p>
4
- <input type="text" id="generatedShareLinkInput" value="{{ share_url }}" readonly style="width: 100%; margin-bottom: 0.5rem;">
5
- {# <button type="button" onclick="copyGeneratedLinkToClipboard()">Copy Link</button> #}
6
- {# <small id="copyGeneratedStatusMsg" style="margin-left: 0.5rem;"></small> #}
7
- <p><small>You can select the link above and copy it (Ctrl+C or Cmd+C).</small></p>
8
- {% elif error_message %}
9
- <p style="color: var(--pico-form-invalid-color);">Error: {{ error_message }}</p>
10
- {% else %}
11
- <p><em>Something went wrong, no link generated.</em></p>
12
- {% endif %}
13
-
14
- {#
15
- <script>
16
- // Minimal JS for copy if desired - but user asked for JS-free.
17
- // If you re-add the button, uncomment this.
18
- function copyGeneratedLinkToClipboard() {
19
- const input = document.getElementById('generatedShareLinkInput');
20
- const msg = document.getElementById('copyGeneratedStatusMsg');
21
- if (!input || !msg) return;
22
-
23
- input.select();
24
- input.setSelectionRange(0, 99999); // For mobile devices
25
- try {
26
- document.execCommand('copy');
27
- msg.textContent = 'Copied!';
28
- setTimeout(() => { msg.textContent = ''; }, 2000);
29
- } catch (err) {
30
- console.error('Failed to copy text: ', err);
31
- msg.textContent = 'Failed to copy.';
32
- }
33
- }
34
- </script>
35
- #}
@@ -1,74 +0,0 @@
1
- <nav>
2
- {% if ui_mode == 'standalone' %}
3
- <h5>Manage Flocks</h5>
4
- <ul>
5
- <li> <button hx-get="{{ url_for('htmx_get_load_flock_view') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
6
- hx-push-url="{{ url_for('page_dashboard') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
7
- class="contrast {% if request.url.path == url_for('page_dashboard') or request.url.path == url_for('htmx_get_load_flock_view') %}active-nav{% endif %}">
8
- <i class="fas fa-folder-open"></i> Load Flock
9
- </button>
10
- </li>
11
- <!-- <li> <button hx-get="{{ url_for('htmx_get_create_flock_form') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
12
- hx-push-url="{{ url_for('page_create') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
13
- class="contrast {% if request.url.path == url_for('page_create') %}active-nav{% endif %}">>
14
- <i class="fas fa-plus-circle"></i> Create New Flock
15
- </button>
16
- </li> -->
17
- </ul>
18
- {% endif %}
19
-
20
- {% if current_flock %}
21
- <hr>
22
- <h5>Current Flock</h5>
23
- <ul>
24
- <li> <button hx-get="{{ url_for('htmx_get_execution_view_container') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
25
- hx-push-url="{{ url_for('page_editor_section', section='execute') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
26
- class="contrast {% if request.url.path == url_for('page_editor_section', section='execute') %}active-nav{% endif %}">
27
- <i class="fas fa-play-circle"></i> Execute Flock
28
- </button>
29
- </li>
30
- <li> <button hx-get="{{ url_for('htmx_get_agent_manager_view') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
31
- hx-push-url="{{ url_for('page_editor_section', section='agents') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
32
- class="contrast{% if request.url.path == url_for('page_editor_section', section='agents') %}active-nav{% endif %}">
33
- <i class="fas fa-robot"></i> Agents ({{ current_flock.agents|length }})
34
- </button>
35
- </li> <li> <button hx-get="{{ url_for('htmx_get_flock_properties_form') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
36
- hx-push-url="{{ url_for('page_editor_section', section='properties') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
37
- class="contrast {% if request.url.path == url_for('page_editor_section', section='properties') %}active-nav{% endif %}">
38
- <i class="fas fa-cog"></i> Properties
39
- </button>
40
- </li>
41
- </ul>
42
- {% endif %}
43
-
44
- <hr>
45
- <h5>Tools</h5>
46
- <ul>
47
- <li> <button hx-get="{{ url_for('htmx_get_registry_viewer') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
48
- hx-push-url="{{ url_for('page_registry') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
49
- class="contrast {% if request.url.path == url_for('page_registry') %}active-nav{% endif %}">
50
- <i class="fas fa-book"></i> View Registry
51
- </button>
52
- </li>
53
- <li> <button hx-get="{{ url_for('htmx_get_settings_view') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
54
- hx-push-url="{{ url_for('page_settings') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
55
- class="contrast {% if request.url.path == url_for('page_settings') %}active-nav{% endif %}">
56
- <i class="fas fa-sliders-h"></i> Settings
57
- </button>
58
- </li>
59
- {% if chat_enabled %} <li> <button hx-get="{{ url_for('htmx_get_chat_view') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
60
- hx-push-url="{{ url_for('page_chat') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
61
- class="contrast {% if request.url.path == url_for('page_chat') %}active-nav{% endif %}">
62
- <i class="fas fa-comments"></i> Chat
63
- </button>
64
- </li> <li> <button hx-get="{{ url_for('chat_settings_form') }}?ui_mode={{ ui_mode }}" hx-target="#main-content-area"
65
- hx-push-url="{{ url_for('chat_settings_standalone') }}?ui_mode={{ ui_mode }}" hx-indicator="#content-loading-indicator-main"
66
- class="contrast {% if request.url.path == url_for('chat_settings_standalone') %}active-nav{% endif %}">
67
- <i class="fas fa-sliders-h"></i> Chat Settings
68
- </button>
69
- </li>
70
- {% endif %}
71
- </ul>
72
- <div id="content-loading-indicator-main" class="htmx-indicator" style="text-align:center; padding:1rem;"><progress
73
- indeterminate></progress></div>
74
- </nav>
@@ -1,195 +0,0 @@
1
- <div id="streaming-results-wrapper"
2
- data-run-id="{{ run_id }}"
3
- data-stream-url="{{ stream_url }}"
4
- data-target-id="results-display"
5
- data-agent-name="{{ agent_name }}">
6
- <header style="margin-bottom: 0.75rem;">
7
- <h5 style="margin: 0;">Streaming {{ agent_name }}</h5>
8
- <p style="margin: 0; color: var(--pico-muted-color);">Live output appears below while the agent runs.</p>
9
- </header>
10
-
11
- <p class="error" data-role="error" hidden></p>
12
- <div class="stream-output" data-role="output" style="min-height: 8rem; white-space: normal; word-break: break-word; font-family: var(--pico-code-font-family, monospace);">Connecting to agent…</div>
13
- <div data-role="progress" style="margin-top: 0.5rem;" role="status">
14
- <progress indeterminate></progress> Streaming response…
15
- </div>
16
- </div>
17
-
18
- <script>
19
- (function () {
20
- const script = document.currentScript;
21
- if (!script) {
22
- return;
23
- }
24
- const wrapper = script.previousElementSibling;
25
- if (!(wrapper instanceof HTMLElement)) {
26
- return;
27
- }
28
- if (wrapper.dataset.streamInit === '1') {
29
- return;
30
- }
31
- wrapper.dataset.streamInit = '1';
32
-
33
- const streamUrl = wrapper.dataset.streamUrl;
34
- const runId = wrapper.dataset.runId;
35
- const targetId = wrapper.dataset.targetId || 'results-display';
36
-
37
- const outputEl = wrapper.querySelector('[data-role="output"]');
38
- const errorEl = wrapper.querySelector('[data-role="error"]');
39
- const progressEl = wrapper.querySelector('[data-role="progress"]');
40
-
41
- if (!streamUrl || !runId || !(outputEl instanceof HTMLElement)) {
42
- if (errorEl instanceof HTMLElement) {
43
- errorEl.textContent = 'Streaming setup failed due to missing metadata.';
44
- errorEl.hidden = false;
45
- }
46
- if (progressEl instanceof HTMLElement) {
47
- progressEl.hidden = true;
48
- }
49
- return;
50
- }
51
-
52
- let plainText = outputEl instanceof HTMLElement ? outputEl.textContent || '' : '';
53
- let source;
54
- const fieldValues = new Map();
55
- let latestStatus = '';
56
-
57
- function escapeHtml(value) {
58
- return value.replace(/[&<>"']/g, (char) => ({
59
- '&': '&amp;',
60
- '<': '&lt;',
61
- '>': '&gt;',
62
- '"': '&quot;',
63
- "'": '&#39;',
64
- })[char]);
65
- }
66
-
67
- function renderTableCell(value) {
68
- return escapeHtml(value).replace(/\n/g, '<br>');
69
- }
70
-
71
- function renderStream() {
72
- if (!(outputEl instanceof HTMLElement)) {
73
- return;
74
- }
75
- if (fieldValues.size > 0) {
76
- outputEl.style.whiteSpace = 'normal';
77
- let rows = '';
78
- fieldValues.forEach((value, field) => {
79
- rows += `<tr><td class="stream-field" style="white-space: nowrap; padding-right: 1rem; vertical-align: top;">${escapeHtml(field)}</td><td>${renderTableCell(value)}</td></tr>`;
80
- });
81
- if (latestStatus) {
82
- rows += `<tr class="stream-status"><td class="stream-field" style="white-space: nowrap; padding-right: 1rem; vertical-align: top;">status</td><td>${escapeHtml(latestStatus)}</td></tr>`;
83
- }
84
- outputEl.innerHTML = `<table class="structured-table streaming-table" style="width:100%; border-collapse: collapse; table-layout: auto;"><tbody>${rows}</tbody></table>`;
85
- } else {
86
- outputEl.style.whiteSpace = 'pre-wrap';
87
- outputEl.textContent = plainText;
88
- }
89
- }
90
-
91
- function showError(message) {
92
- if (errorEl instanceof HTMLElement) {
93
- errorEl.textContent = message;
94
- errorEl.hidden = false;
95
- }
96
- if (progressEl instanceof HTMLElement) {
97
- progressEl.hidden = true;
98
- }
99
- }
100
-
101
- function closeStream() {
102
- if (source) {
103
- source.close();
104
- source = undefined;
105
- }
106
- if (progressEl instanceof HTMLElement) {
107
- progressEl.hidden = true;
108
- }
109
- renderStream();
110
- }
111
-
112
- function renderFinal(html, rawJson) {
113
- const target = document.getElementById(targetId);
114
- if (!target) {
115
- return;
116
- }
117
- target.innerHTML = html;
118
- if (window.htmx) {
119
- window.htmx.process(target);
120
- }
121
- if (window.Prism) {
122
- window.Prism.highlightAllUnder(target);
123
- }
124
- if (outputEl instanceof HTMLElement) {
125
- outputEl.textContent = '';
126
- }
127
- }
128
-
129
- try {
130
- source = new EventSource(streamUrl);
131
- } catch (err) {
132
- console.error('Failed to start EventSource', err);
133
- showError('Failed to connect for streaming.');
134
- return;
135
- }
136
-
137
- source.onmessage = (event) => {
138
- if (!event.data) {
139
- return;
140
- }
141
- let payload;
142
- try {
143
- payload = JSON.parse(event.data);
144
- } catch (err) {
145
- console.warn('Unable to parse streaming payload', err);
146
- return;
147
- }
148
-
149
- switch (payload.type) {
150
- case 'token':
151
- if (typeof payload.chunk === 'string') {
152
- if (payload.field) {
153
- const existing = fieldValues.get(payload.field) || '';
154
- fieldValues.set(payload.field, existing + payload.chunk);
155
- } else {
156
- plainText = (plainText === 'Connecting to agent…' ? '' : plainText) + payload.chunk;
157
- }
158
- renderStream();
159
- }
160
- break;
161
- case 'status':
162
- if (payload.message) {
163
- latestStatus = payload.message;
164
- if (fieldValues.size === 0) {
165
- plainText = (plainText === 'Connecting to agent…' ? '' : plainText);
166
- if (plainText && !plainText.endsWith('\n')) {
167
- plainText += '\n';
168
- }
169
- plainText += payload.message + '\n';
170
- }
171
- renderStream();
172
- }
173
- break;
174
- case 'error':
175
- showError(payload.message || 'An unexpected error occurred while streaming.');
176
- closeStream();
177
- break;
178
- case 'final':
179
- closeStream();
180
- renderFinal(payload.html || '', payload.raw_json || payload.rawJson);
181
- break;
182
- case 'complete':
183
- closeStream();
184
- break;
185
- default:
186
- break;
187
- }
188
- };
189
-
190
- source.onerror = () => {
191
- showError('Connection lost while streaming.');
192
- closeStream();
193
- };
194
- })();
195
- </script>
@@ -1,40 +0,0 @@
1
- {% macro render_value(value, level=0) %}
2
- {% if value is mapping %}
3
- {% if not value %}
4
- <em style="color: var(--pico-muted-color);">(Empty Dictionary)</em>
5
- {% else %}
6
- <table class="structured-table level-{{ level }}" style="margin-left: {{ level * 20 }}px; margin-bottom: 0.5em; border-collapse: collapse; width: auto;">
7
- <tbody>
8
- {% for k, v in value.items() %}
9
- <tr style="border-bottom: 1px solid var(--pico-muted-border-color);">
10
- <td style="font-weight: bold; padding: 0.25em 0.5em; vertical-align: top; border-right: 1px solid var(--pico-muted-border-color); width: 30%;">{{ k }}</td>
11
- <td style="padding: 0.25em 0.5em; vertical-align: top;">{{ render_value(v, level + 1) }}</td>
12
- </tr>
13
- {% endfor %}
14
- </tbody>
15
- </table>
16
- {% endif %}
17
- {% elif value is iterable and value is not string %}
18
- {% if not value %}
19
- <em style="color: var(--pico-code-color);">(Empty List)</em>
20
- {% else %}
21
- <ul style="margin-left: {{ level * 20 }}px; padding-left: 1em; list-style-type: disc; margin-bottom:0.5em;">
22
- {% for item in value %}
23
- <li>{{ render_value(item, level + 1) }}</li>
24
- {% endfor %}
25
- </ul>
26
- {% endif %}
27
- {% elif value is boolean %}
28
- <code style="color: {{ 'var(--flock-success-color)' if value else 'var(--flock-error-color)' }}; font-weight:bold;">{{ value }}</code>
29
- {% elif value is number %}
30
- <code style="color: var(--pico-code-color);">{{ value }}</code>
31
- {% elif value is none %}
32
- <em style="color: var(--pico-code-color);">None</em>
33
- {% else %}
34
- {# Apply pre-wrap for multi-line strings and render markdown #}
35
- <div class="markdown-content" style="word-break: break-word;">{{ value | markdown | safe }}</div>
36
- {% endif %}
37
- {% endmacro %}
38
-
39
- {# Main entry point for this partial, assuming result_data is in context #}
40
- {{ render_value(result_data) }}
@@ -1,36 +0,0 @@
1
- {% if css_vars_str %}
2
- <script>
3
- (function() {
4
- // Remove any existing theme preview
5
- var existingPreview = document.getElementById('theme-preview-css');
6
- if (existingPreview) {
7
- existingPreview.remove();
8
- }
9
-
10
- // Inject new theme preview CSS
11
- var style = document.createElement('style');
12
- style.id = 'theme-preview-css';
13
- style.textContent = `{{ css_vars_str | safe }}`;
14
- document.head.appendChild(style);
15
- })();
16
- </script>
17
- {% endif %}
18
- <article style="border:1px solid var(--pico-border-color); padding:1rem; border-radius:8px;">
19
- <hgroup>
20
- <h3>Theme Preview: {{ theme_name }}</h3>
21
- <p><small>Preview applied globally - navigate away or refresh to revert</small></p>
22
- </hgroup>
23
- <div class="grid" style="grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap:0.5rem;">
24
- {% for color_name, color_value in main_colors %}
25
- <div>
26
- <div style="height:24px; border-radius:4px; background-color: {{ color_value }};"></div>
27
- <small>{{ color_name }}<br>{{ color_value }}</small>
28
- </div>
29
- {% endfor %}
30
- </div>
31
- <hr>
32
- <button>Button</button>
33
- <button class="secondary">Secondary</button>
34
- <button class="contrast">Contrast</button>
35
- <p>Sample text with <a href="#">link</a>, <mark>mark</mark>, <code>code</code>.</p>
36
- </article>
@@ -1,84 +0,0 @@
1
- {% extends "base.html" %}
2
-
3
- {% block title %}Flock UI - Registry Viewer{% endblock %}
4
-
5
- {% block content %}
6
- <article>
7
- <header>
8
- <h2>Flock Registry Viewer</h2>
9
- <p>Browse items registered with the Flock framework.</p>
10
- </header>
11
-
12
- <nav>
13
- <ul role="group">
14
- <li>
15
- <button role="button" class="outline"
16
- hx-get="{{ url_for('htmx_get_registry_table', item_type='type') }}"
17
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
18
- hx-on:click="setActiveButton(this)">
19
- View Types
20
- </button>
21
- </li>
22
- <li>
23
- <button role="button" class="outline"
24
- hx-get="{{ url_for('htmx_get_registry_table', item_type='component') }}"
25
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
26
- hx-on:click="setActiveButton(this)">
27
- View Components
28
- </button>
29
- </li>
30
- <li>
31
- <button role="button" class="outline"
32
- hx-get="{{ url_for('htmx_get_registry_table', item_type='component') }}"
33
- hx-target="#registry-table-container" hx-indicator="#registry-loading"
34
- hx-on:click="setActiveButton(this)">
35
- View Components
36
- </button>
37
- </li>
38
- <li>
39
- <button role="button" class="secondary" hx-get="{{ url_for('chat_feedback_download_all')}}" download>
40
- Download Feedback-Files for Agents
41
- </button>
42
- </li>
43
- </ul>
44
- </nav>
45
-
46
- <div id="registry-loading" class="htmx-indicator" style="text-align: center; margin-top: 1rem;">
47
- <progress></progress> Loading...
48
- </div>
49
-
50
- <div id="registry-table-container" style="margin-top: 1.5rem;">
51
- <p>Select a category above to view registered items.</p>
52
- </div>
53
-
54
- <footer style="margin-top: 2rem;">
55
- <a href="{{ url_for('page_editor_section', section='execute') }}" role="button" class="secondary contrast">Back
56
- to Editor</a>
57
- </footer>
58
- </article>
59
-
60
- <script>
61
- function setActiveButton(clickedButton) {
62
- // Get all buttons in the group
63
- const buttons = clickedButton.closest('ul[role="group"]').querySelectorAll('button');
64
- // Remove 'primary' (or any active class) and add 'outline' to all
65
- buttons.forEach(button => {
66
- button.classList.remove('primary'); // Assuming 'primary' is your active class
67
- button.classList.add('outline');
68
- });
69
- // Add 'primary' and remove 'outline' from the clicked button
70
- clickedButton.classList.remove('outline');
71
- clickedButton.classList.add('primary'); // Use Pico's primary button style for active
72
- }
73
-
74
- // Optional: Set the first button as active on initial load,
75
- // or if you want to default to loading "Types"
76
- document.addEventListener('DOMContentLoaded', function () {
77
- const firstButton = document.querySelector('nav ul[role="group"] button');
78
- if (firstButton) {
79
- // setActiveButton(firstButton); // Uncomment if you want a default active button
80
- // htmx.trigger(firstButton, 'click'); // Uncomment to auto-load Types on page load
81
- }
82
- });
83
- </script>
84
- {% endblock %}
@@ -1,140 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Flock Shared Agent: {{ selected_agent_name }}</title>
7
-
8
- {# Link to Pico.css #}
9
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css" /> <link rel="stylesheet" href="{{ url_for('static', path='css/layout.css') }}">
10
- <link rel="stylesheet" href="{{ url_for('static', path='css/header.css') }}">
11
- <link rel="stylesheet" href="{{ url_for('static', path='css/sidebar.css') }}">
12
- <link rel="stylesheet" href="{{ url_for('static', path='css/components.css') }}">
13
- <link rel="stylesheet" href="{{ url_for('static', path='css/chat.css') }}">
14
- <!-- Font Awesome for icons -->
15
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
16
- <!-- Prism.js CSS for syntax highlighting (okaidia theme) -->
17
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css" referrerpolicy="no-referrer" />
18
- {# Inline generated theme CSS variables #}
19
- {% if theme_css %}
20
- <style>
21
- /* Start Theme CSS */
22
- /* stylelint-disable */
23
- {{ theme_css | safe }}
24
- /* stylelint-enable */
25
- /* End Theme CSS */
26
- </style>
27
- {% endif %}
28
-
29
-
30
- {# HTMX script - ensure this is loaded for the page to work #}
31
- <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous"></script>
32
- <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
33
- </head>
34
- <body>
35
- <main class="main-content">
36
- <header>
37
- <hgroup>
38
- <h2>Run {{ flock.name }} - {{ selected_agent_name }} </h2>
39
- </hgroup>
40
- </header>
41
-
42
- {% if error_message %}
43
- <article class="error-message" role="alert">
44
- <strong>Error:</strong> {{ error_message }}
45
- </article>
46
- {% endif %}
47
-
48
- {% if selected_agent_name and not error_message %} {# Only show form if no fatal error and agent is selected #}
49
- <div style="display: flex; gap: var(--pico-spacing, 1rem);">
50
- <div style="flex: 1;">
51
- <article id="execution-form-content"> <form id="agent-run-form-shared" hx-post="{{ url_for('htmx_run_shared_flock') }}"
52
- hx-target="#results-display"
53
- hx-swap="innerHTML"
54
- hx-indicator="#run-loading-indicator">
55
-
56
- {# Hidden input for the fixed agent name #}
57
- <input type="hidden" name="start_agent_name" value="{{ selected_agent_name }}">
58
-
59
- {# Add share_id as a hidden input to be sent with the form #}
60
- <input type="hidden" name="share_id" value="{{ share_id }}">
61
-
62
- {# flock_definition_str hidden input is no longer needed #}
63
- {# {% if flock_definition_str %} #}
64
- {# <input type="hidden" name="flock_definition_str" value="{{ flock_definition_str }}"> #}
65
- {# {% endif %} #}
66
-
67
- {# Dynamically generated input fields #}
68
- {% if input_fields %}
69
- <h4>Inputs for <code>{{ selected_agent_name }}</code>:</h4>
70
- {% for field in input_fields %}
71
- <label for="agent_input_{{ field.name }}">
72
- {{ field.name }} ({{ field.type }})<br>
73
- {% if field.description %}<small>{{ field.description }}</small>{% endif %}
74
- </label>
75
- {% if field.html_type == "checkbox" %}
76
- <input type="checkbox" id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" role="switch">
77
- {% elif field.html_type == "textarea" %}
78
- <textarea id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" placeholder="{{ field.placeholder | default('Enter value') }}"></textarea>
79
- {% else %}
80
- <input type="{{ field.html_type }}" id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" placeholder="Enter {{ field.type }} value">
81
- {% endif %}
82
- {% endfor %}
83
- {% elif flock and selected_agent_name in flock.agents and not flock.agents[selected_agent_name].input %}
84
- <p>Agent <code>{{ selected_agent_name }}</code> requires no inputs.</p>
85
- {% elif not error_message %}
86
- <p>Could not determine inputs for agent <code>{{ selected_agent_name }}</code>. The input signature might be missing or invalid.</p>
87
- {% endif %}
88
-
89
- <button type="submit" class="hide-on-request">Run Agent</button>
90
- <span id="run-loading-indicator" class="htmx-indicator">
91
- <progress indeterminate></progress> Running...
92
- </span>
93
- </form>
94
- </article>
95
- </div>
96
- <section class="right-pane-framed" style="flex: 2; border-left: 1px solid var(--pico-muted-border-color); padding-left: 1.5rem;">
97
- <header style=" border-bottom: 1px solid var(--pico-muted-border-color); margin-bottom: 1rem;">
98
- <h5>Execution Results</h5>
99
- </header>
100
- <div id="results-display">
101
- <p><code>Results will appear here after running the Flock.</code></p>
102
- </div>
103
- </section>
104
- </div>
105
-
106
- {% elif not error_message %}
107
- <p>This shared link is not configured correctly. No agent specified or an issue occurred loading the configuration.</p>
108
- {% endif %}
109
-
110
- <footer class="main-footer">
111
- <small>Built with FastAPI, HTMX, Pico.CSS by 🤍 white duck 🦆 - Theme: {{ active_theme_name | default('default') }}</small>
112
- </footer>
113
- </main>
114
-
115
- <!-- Prism.js JS (core and autoloader) -->
116
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js" referrerpolicy="no-referrer"></script>
117
- <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js" referrerpolicy="no-referrer"></script>
118
- <script>
119
- // Add HTMX event listener for Prism highlighting
120
- document.addEventListener('htmx:afterSwap', function(event) {
121
- const resultsDisplay = document.getElementById('results-display');
122
- // Check if the swapped element is the results display or a child of it
123
- if (resultsDisplay && (event.detail.target === resultsDisplay || resultsDisplay.contains(event.detail.target))) {
124
- if (typeof Prism !== 'undefined') {
125
- // console.log('Prism highlighting triggered for swapped content in results-display.');
126
- Prism.highlightAllUnder(resultsDisplay);
127
- }
128
- }
129
- });
130
-
131
- // Initial highlight on page load
132
- document.addEventListener('DOMContentLoaded', () => {
133
- if (typeof Prism !== 'undefined') {
134
- // console.log('Prism initial highlighting on shared page.');
135
- Prism.highlightAll();
136
- }
137
- });
138
- </script>
139
- </body>
140
- </html>