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.
- flock/__init__.py +12 -217
- flock/agent.py +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/{core/util → helper}/cli_helper.py +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkside.toml +1 -1
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +1 -1
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.56b0.dist-info/METADATA +747 -0
- flock_core-0.5.56b0.dist-info/RECORD +398 -0
- flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -118
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_streaming_results_container.html +0 -195
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {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
|
-
'&': '&',
|
|
60
|
-
'<': '<',
|
|
61
|
-
'>': '>',
|
|
62
|
-
'"': '"',
|
|
63
|
-
"'": ''',
|
|
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>
|