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,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>