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,28 +0,0 @@
|
|
|
1
|
-
<article id="flock-preview-article">
|
|
2
|
-
<header>
|
|
3
|
-
<h4>Preview: {{ preview_flock.name if preview_flock else selected_filename }}</h4>
|
|
4
|
-
</header>
|
|
5
|
-
{% if preview_flock %}
|
|
6
|
-
<p><strong>Default Model:</strong> {{ preview_flock.model or 'Not set' }}</p>
|
|
7
|
-
<p><strong>Description:</strong> {{ preview_flock.description or 'None' }}</p>
|
|
8
|
-
<p><strong>Agents:</strong> {{ preview_flock.agents_count }}</p>
|
|
9
|
-
<form hx-post="{{ url_for('ui_load_flock_by_name_action') }}"
|
|
10
|
-
hx-target="#main-content-area" {# This will load the full editor for this flock #}
|
|
11
|
-
hx-swap="innerHTML"
|
|
12
|
-
hx-indicator="#flock-preview-loading-indicator">
|
|
13
|
-
<input type="hidden" name="selected_flock_filename" value="{{ selected_filename }}">
|
|
14
|
-
<button type="submit" class="primary">Load this Flock into Editor</button>
|
|
15
|
-
<span id="flock-preview-loading-indicator" class="htmx-indicator"><progress indeterminate></progress></span>
|
|
16
|
-
</form>
|
|
17
|
-
{% else %}
|
|
18
|
-
<p class="error">Could not load preview for <code>{{ selected_filename }}</code>. It might be corrupted or not a valid Flock file.</p>
|
|
19
|
-
<p><small>You can still attempt to load it into the editor.</small></p>
|
|
20
|
-
<form hx-post="{{ url_for('ui_load_flock_by_name_action') }}" hx-target="#main-content-area" hx-swap="innerHTML">
|
|
21
|
-
<input type="hidden" name="selected_flock_filename" value="{{ selected_filename }}">
|
|
22
|
-
<button type="submit" class="secondary">Attempt to Load into Editor</button>
|
|
23
|
-
</form>
|
|
24
|
-
{% endif %}
|
|
25
|
-
<hr>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
</article>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<article>
|
|
2
|
-
<header>
|
|
3
|
-
<h5>Upload New Flock File</h5>
|
|
4
|
-
</header> <form hx-post="{{ url_for('load_flock_by_upload') }}"
|
|
5
|
-
hx-target="#main-content-area" {# Target the main area to show editor on success #}
|
|
6
|
-
hx-swap="innerHTML"
|
|
7
|
-
hx-encoding="multipart/form-data"
|
|
8
|
-
hx-indicator="#dashboard-upload-loading-indicator">
|
|
9
|
-
<label for="flock_file_upload_dashboard">Upload <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code> file:</label>
|
|
10
|
-
<input type="file" id="flock_file_upload_dashboard" name="flock_file_upload" accept=".yaml,.yml,.flock" required>
|
|
11
|
-
<button type="submit">Upload and Load Flock</button>
|
|
12
|
-
<span id="dashboard-upload-loading-indicator" class="htmx-indicator"><progress indeterminate></progress> Uploading...</span>
|
|
13
|
-
</form>
|
|
14
|
-
<hr>
|
|
15
|
-
<p><small>Alternatively, select a Flock from the list on the left to view its details or load it.</small></p>
|
|
16
|
-
</article>
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{% if input_fields %}
|
|
2
|
-
{% for field in input_fields %}
|
|
3
|
-
<fieldset> {# Group each field #}
|
|
4
|
-
<label for="agent_input_{{ field.name }}">{{ field.name }} ({{ field.type }})</label>
|
|
5
|
-
{% if field.description %}
|
|
6
|
-
<small>{{ field.description }}</small>
|
|
7
|
-
{% endif %}
|
|
8
|
-
{% if field.html_type == 'textarea' %}
|
|
9
|
-
<textarea id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" rows="3" placeholder="{{ field.placeholder if field.placeholder else ('Enter ' + field.type) }}"></textarea>
|
|
10
|
-
{% elif field.html_type == 'checkbox' %}
|
|
11
|
-
<label for="agent_input_{{ field.name }}_cb">
|
|
12
|
-
<input type="checkbox" id="agent_input_{{ field.name }}_cb" name="agent_input_{{ field.name }}" value="true">
|
|
13
|
-
Enabled
|
|
14
|
-
</label>
|
|
15
|
-
{% else %}
|
|
16
|
-
<input type="{{ field.html_type }}" id="agent_input_{{ field.name }}" name="agent_input_{{ field.name }}" placeholder="{{ field.placeholder if field.placeholder else ('Enter ' + field.type) }}">
|
|
17
|
-
{% endif %}
|
|
18
|
-
</fieldset>
|
|
19
|
-
{% endfor %}
|
|
20
|
-
{% else %}
|
|
21
|
-
<p><small>This agent requires no specific inputs, or input signature could not be parsed.</small></p>
|
|
22
|
-
{% endif %}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<div id="env-vars-container">
|
|
2
|
-
<table class="striped" style="font-size:0.9rem;">
|
|
3
|
-
<thead>
|
|
4
|
-
<tr>
|
|
5
|
-
<th>Name</th>
|
|
6
|
-
<th>Value</th>
|
|
7
|
-
<th>Actions</th>
|
|
8
|
-
</tr>
|
|
9
|
-
</thead>
|
|
10
|
-
<tbody>
|
|
11
|
-
{% for var in env_vars %}
|
|
12
|
-
<tr>
|
|
13
|
-
<td>{{ var.name }}</td>
|
|
14
|
-
<td>{{ var.value }}</td> <td> <button class="secondary small outline" hx-post="{{ url_for('htmx_env_edit') }}" hx-vals='{"var_name": "{{ var.name }}"}'
|
|
15
|
-
hx-prompt="Enter new value for {{ var.name }}" hx-target="#env-vars-container" hx-swap="outerHTML">Edit</button>
|
|
16
|
-
<button class="contrast small outline" hx-post="{{ url_for('htmx_env_delete') }}" hx-vals='{"var_name": "{{ var.name }}"}'
|
|
17
|
-
hx-confirm="Delete {{ var.name }}?" hx-target="#env-vars-container" hx-swap="outerHTML" style="margin-left:0.25rem;">Delete</button>
|
|
18
|
-
</td>
|
|
19
|
-
</tr>
|
|
20
|
-
{% endfor %}
|
|
21
|
-
</tbody>
|
|
22
|
-
</table>
|
|
23
|
-
</div>
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
// Create URL template for agent input forms
|
|
3
|
-
window.agentInputFormUrlTemplate = '{{ url_for("htmx_get_agent_input_form", agent_name="AGENT_PLACEHOLDER") }}';
|
|
4
|
-
</script>
|
|
5
|
-
|
|
6
|
-
<article id="execution-form-content">
|
|
7
|
-
<header>
|
|
8
|
-
<h2>Run Flock</h2>
|
|
9
|
-
</header>
|
|
10
|
-
{% if flock and flock.agents %} <form hx-post="{{ url_for('htmx_run_flock') }}" hx-target="#results-display"
|
|
11
|
-
hx-swap="innerHTML" hx-indicator="#run-loading-indicator" x-data="{ selectedAgentForInput: '' }">
|
|
12
|
-
|
|
13
|
-
<label for="start_agent_name_select">Select Start Agent:</label>
|
|
14
|
-
<select id="start_agent_name_select" name="start_agent_name" required x-model="selectedAgentForInput" @change="
|
|
15
|
-
if ($event.target.value) {
|
|
16
|
-
const url = window.agentInputFormUrlTemplate.replace('AGENT_PLACEHOLDER', $event.target.value);
|
|
17
|
-
htmx.ajax('GET', url, {target: '#dynamic-input-form-fields', swap: 'innerHTML', indicator: '#input-form-loading-indicator'});
|
|
18
|
-
} else {
|
|
19
|
-
document.getElementById('dynamic-input-form-fields').innerHTML = '<p><small>Select an agent to see its input fields.</small></p>';
|
|
20
|
-
}
|
|
21
|
-
">
|
|
22
|
-
<option value="" disabled {% if not selected_agent_name %}selected{% endif %}>-- Choose an agent --</option>
|
|
23
|
-
{% for agent_name_key in flock.agents.keys() %}
|
|
24
|
-
<option value="{{ agent_name_key }}" {% if selected_agent_name==agent_name_key %}selected{% endif %}>{{
|
|
25
|
-
agent_name_key }}</option>
|
|
26
|
-
{% endfor %}
|
|
27
|
-
</select>
|
|
28
|
-
|
|
29
|
-
<div id="dynamic-input-form-fields">
|
|
30
|
-
<!-- Input fields for the selected agent will be loaded here -->
|
|
31
|
-
<p><small>Select an agent to see its input fields.</small></p>
|
|
32
|
-
</div>
|
|
33
|
-
<div id="input-form-loading-indicator" class="htmx-indicator">
|
|
34
|
-
<progress indeterminate></progress> Loading input form...
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<button type="submit" {% if not flock.agents %}disabled{% endif %}>Run Flock</button>
|
|
38
|
-
<div id="share-agent-link-container" style="margin-top: 0.5rem;">
|
|
39
|
-
<a href="#" id="shareAgentHtmxLink" hx-post="{{ url_for('htmx_generate_share_link') }}"
|
|
40
|
-
hx-target="#shareLinkDisplayArea" hx-swap="innerHTML" hx-indicator="#share-loading-indicator"
|
|
41
|
-
hx-include="#start_agent_name_select"
|
|
42
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
43
|
-
Create shareable link...
|
|
44
|
-
</a>
|
|
45
|
-
<span id="share-loading-indicator" class="htmx-indicator">
|
|
46
|
-
<progress indeterminate></progress> Generating link...
|
|
47
|
-
</span>
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<div id="feedback-download-container" style="margin-top: 0.5rem;">
|
|
51
|
-
<div x-show="selectedAgentForInput" x-cloak
|
|
52
|
-
style="display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;">
|
|
53
|
-
<span style="padding: 0.25rem; text-decoration: underline;">Download feedback for selected
|
|
54
|
-
agent:</span>
|
|
55
|
-
<div>
|
|
56
|
-
<a href="#" id="downloadFeedbackLink" hx-indicator="#download-feedback-loading-indicator"
|
|
57
|
-
hx-include="#start_agent_name_select"
|
|
58
|
-
:href="selectedAgentForInput ? '{{ url_for('chat_feedback_download', agent_name='AGENT_PLACEHOLDER', format='csv') }}'.replace('AGENT_PLACEHOLDER', selectedAgentForInput) : '#'"
|
|
59
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
60
|
-
CSV
|
|
61
|
-
</a>
|
|
62
|
-
<a href="#" id="downloadFeedbackLinkXlsx" hx-indicator="#download-feedback-loading-indicator"
|
|
63
|
-
hx-include="#start_agent_name_select"
|
|
64
|
-
:href="selectedAgentForInput ? '{{ url_for('chat_feedback_download', agent_name='AGENT_PLACEHOLDER', format='xlsx') }}'.replace('AGENT_PLACEHOLDER', selectedAgentForInput) : '#'"
|
|
65
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
66
|
-
XLSX
|
|
67
|
-
</a>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
<span id="download-feedback-loading-indicator" class="htmx-indicator">
|
|
71
|
-
<progress indeterminate></progress> Preparing file...
|
|
72
|
-
</span>
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
<div id="feedback-download-container-all" style="margin-top: 0.5rem;">
|
|
76
|
-
<div style="display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;">
|
|
77
|
-
<span style="padding: 0.25rem; text-decoration: underline;">Download feedback for all
|
|
78
|
-
agents:</span>
|
|
79
|
-
<div>
|
|
80
|
-
<a href="{{ url_for('chat_feedback_download_all', format='csv') }}" id="downloadFeedbackLinkAll"
|
|
81
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
82
|
-
CSV
|
|
83
|
-
</a>
|
|
84
|
-
<a href="{{ url_for('chat_feedback_download_all', format='xlsx') }}"
|
|
85
|
-
id="downloadFeedbackLinkAllXlsx"
|
|
86
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
87
|
-
XLSX
|
|
88
|
-
</a>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
<span id="download-feedback-loading-indicator-all" class="htmx-indicator">
|
|
92
|
-
<progress indeterminate></progress> Preparing file...
|
|
93
|
-
</span>
|
|
94
|
-
</div>
|
|
95
|
-
|
|
96
|
-
<span id="run-loading-indicator" class="htmx-indicator">
|
|
97
|
-
<progress indeterminate></progress> Running...
|
|
98
|
-
</span>
|
|
99
|
-
</form>
|
|
100
|
-
{% elif flock and not flock.agents %}
|
|
101
|
-
<p>No agents available in the current Flock. Add agents to enable execution.</p>
|
|
102
|
-
{% else %}
|
|
103
|
-
<p>Load or create a Flock to enable execution.</p>
|
|
104
|
-
{% endif %}
|
|
105
|
-
|
|
106
|
-
<div id="shareLinkDisplayArea" style="margin-top: 1rem;">
|
|
107
|
-
<!-- Content will be loaded here by HTMX -->
|
|
108
|
-
</div>
|
|
109
|
-
|
|
110
|
-
</article>
|
|
111
|
-
|
|
112
|
-
<script>
|
|
113
|
-
document.addEventListener('DOMContentLoaded', function () {
|
|
114
|
-
// All previous JavaScript for toggling share link visibility is removed.
|
|
115
|
-
// If there are other unrelated JavaScript functions in this script block,
|
|
116
|
-
// they would remain.
|
|
117
|
-
});
|
|
118
|
-
</script>
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<article class="two-pane-flex-container" x-data="{ showLeftPane: true }">
|
|
2
|
-
<!-- Left pane - collapsed state -->
|
|
3
|
-
<div class="left-pane-collapsed" x-show="!showLeftPane" style="display: none;">
|
|
4
|
-
<a href="#" class="pane-toggle" @click.prevent="showLeftPane = true" aria-label="Expand left pane">Show</a>
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
<!-- Left pane - expanded state -->
|
|
8
|
-
<section id="execution-left-pane" x-show="showLeftPane" style="flex: 1; min-width: 200px; max-width: 500px;">
|
|
9
|
-
<div class="pane-header" style="display: flex; justify-content: flex-end; margin-bottom: 10px;">
|
|
10
|
-
<a href="#" class="pane-toggle" @click.prevent="showLeftPane = false" aria-label="Hide left pane">Hide</a>
|
|
11
|
-
</div>
|
|
12
|
-
{# The Execution Form will be loaded here #} <div id="execution-form-wrapper" hx-get="{{ url_for('htmx_get_execution_form_content') }}"
|
|
13
|
-
hx-trigger="load" hx-swap="innerHTML">
|
|
14
|
-
<p>Loading execution form...</p><progress indeterminate></progress>
|
|
15
|
-
</div>
|
|
16
|
-
</section>
|
|
17
|
-
|
|
18
|
-
<section id="execution-right-pane" class="right-pane-framed"
|
|
19
|
-
:style="showLeftPane ? 'flex: 2; border-left: 1px solid var(--pico-muted-border-color); padding-left: 1.5rem;' : 'flex: 1; border-left: none; padding-left: 0;'">
|
|
20
|
-
{# The Results Display area, always present when this container is loaded #}
|
|
21
|
-
<header style=" border-bottom: 1px solid var(--pico-muted-border-color); margin-bottom: 1rem;">
|
|
22
|
-
<h5>Execution Results</h5>
|
|
23
|
-
</header>
|
|
24
|
-
<div id="results-display">
|
|
25
|
-
<p><code>Results will appear here after running the Flock.</code></p>
|
|
26
|
-
</div>
|
|
27
|
-
</section>
|
|
28
|
-
</article>
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{% if flock_files %}
|
|
2
|
-
<ul class="item-list">
|
|
3
|
-
{% for file_name in flock_files %} <li hx-post="{{ url_for('ui_load_flock_by_name_action') }}"
|
|
4
|
-
hx-vals='{"selected_flock_filename": "{{ file_name }}"}'
|
|
5
|
-
{# After successful load, the main.py route for by-name will now return
|
|
6
|
-
the flock properties form targeted to the main content area AND
|
|
7
|
-
trigger flockLoaded event for the sidebar.
|
|
8
|
-
For the right pane of *this* view, we might want to show file details.
|
|
9
|
-
Let's assume for now loading a flock navigates to the editor.
|
|
10
|
-
If we want to show details *here*, the target would be #flock-file-detail-or-upload
|
|
11
|
-
#}
|
|
12
|
-
hx-target="#main-content-area" {# This will load the editor page content #}
|
|
13
|
-
hx-swap="innerHTML"
|
|
14
|
-
hx-indicator="#flock-file-list-loading-indicator"
|
|
15
|
-
hx-push-url="{{ url_for('page_editor_section', ui_mode='properties') }}"> {# Push URL to editor after load #}
|
|
16
|
-
{{ file_name }}
|
|
17
|
-
</li>
|
|
18
|
-
{% endfor %}
|
|
19
|
-
</ul>
|
|
20
|
-
{% else %}
|
|
21
|
-
<p style="padding: 1rem;">No Flock files found. Create one or upload.</p>
|
|
22
|
-
{% endif %}
|
|
23
|
-
<div id="flock-file-list-loading-indicator" class="htmx-indicator" style="text-align:center;"><progress indeterminate></progress></div>
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
<article id="flock-properties-form-article">
|
|
2
|
-
<header>
|
|
3
|
-
<h2>Flock Properties </h2>
|
|
4
|
-
|
|
5
|
-
</header>
|
|
6
|
-
|
|
7
|
-
{% if update_message %}
|
|
8
|
-
<div class="form-message {{ 'success' if success else 'error' }}" role="alert"
|
|
9
|
-
x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 3000)"
|
|
10
|
-
x-transition:leave="transition ease-in duration-300"
|
|
11
|
-
x-transition:leave-start="opacity-100"
|
|
12
|
-
x-transition:leave-end="opacity-0">
|
|
13
|
-
{{ update_message }}
|
|
14
|
-
</div>
|
|
15
|
-
{% endif %}
|
|
16
|
-
{% if save_message %}
|
|
17
|
-
<div class="form-message {{ 'success' if success else 'error' }}" role="alert"
|
|
18
|
-
x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 3000)"
|
|
19
|
-
x-transition:leave="transition ease-in duration-300"
|
|
20
|
-
x-transition:leave-start="opacity-100"
|
|
21
|
-
x-transition:leave-end="opacity-0">
|
|
22
|
-
{{ save_message }}
|
|
23
|
-
</div>
|
|
24
|
-
{% endif %}
|
|
25
|
-
|
|
26
|
-
<form hx-post="{{ url_for('htmx_update_flock_properties') }}" hx-target="#flock-properties-form-article" hx-swap="innerHTML" hx-indicator="#flock-props-loading">
|
|
27
|
-
<label for="flock_name">Flock Name</label>
|
|
28
|
-
<input type="text" id="flock_name" name="flock_name" value="{{ flock.name if flock else '' }}" required>
|
|
29
|
-
|
|
30
|
-
<label for="default_model">Default Model</label>
|
|
31
|
-
<input type="text" id="default_model" name="default_model" value="{{ flock.model if flock and flock.model else '' }}" placeholder="e.g., openai/gpt-4o">
|
|
32
|
-
|
|
33
|
-
<label for="description">Description</label>
|
|
34
|
-
<textarea id="description" name="description" placeholder="A brief description of this Flock.">{{ flock.description if flock and flock.description else '' }}</textarea>
|
|
35
|
-
|
|
36
|
-
<div class="grid">
|
|
37
|
-
<button type="submit">Update Properties <span id="flock-props-loading" class="htmx-indicator"><progress indeterminate></progress></span></button>
|
|
38
|
-
</div>
|
|
39
|
-
</form>
|
|
40
|
-
<hr>
|
|
41
|
-
<form hx-post="{{ url_for('htmx_save_flock') }}" hx-target="#flock-properties-form-article" hx-swap="innerHTML" hx-indicator="#flock-save-loading">
|
|
42
|
-
<label for="save_filename">Save Flock As:</label>
|
|
43
|
-
<input type="text" id="save_filename" name="save_filename"
|
|
44
|
-
value="{{ current_filename if current_filename else (flock.name.replace(' ', '_').lower() + '.flock.yaml' if flock and flock.name else 'my_flock.flock.yaml') }}"
|
|
45
|
-
required
|
|
46
|
-
placeholder="filename.flock.yaml">
|
|
47
|
-
<small>Will save to <code>./.flock_ui_projects/</code>. Use <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code>.</small>
|
|
48
|
-
<div class="grid">
|
|
49
|
-
<button type="submit">Save to File <span id="flock-save-loading" class="htmx-indicator"><progress indeterminate></progress></span></button>
|
|
50
|
-
</div>
|
|
51
|
-
</form>
|
|
52
|
-
</article>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<article>
|
|
2
|
-
<header>
|
|
3
|
-
<h5>Upload New Flock File</h5>
|
|
4
|
-
</header> <form hx-post="{{ url_for('load_flock_by_upload') }}"
|
|
5
|
-
hx-target="#main-content-area" {# After upload, go to editor #}
|
|
6
|
-
hx-swap="innerHTML"
|
|
7
|
-
hx-encoding="multipart/form-data"
|
|
8
|
-
hx-indicator="#upload-loading-indicator-pane">
|
|
9
|
-
<label for="flock_file_upload_pane">Upload <code>.flock.yaml</code>, <code>.yaml</code>, or <code>.yml</code> file:</label>
|
|
10
|
-
<input type="file" id="flock_file_upload_pane" name="flock_file_upload" accept=".yaml,.yml,.flock" required>
|
|
11
|
-
<button type="submit">Upload and Load Flock</button>
|
|
12
|
-
<span id="upload-loading-indicator-pane" class="htmx-indicator"><progress indeterminate></progress> Uploading...</span>
|
|
13
|
-
</form>
|
|
14
|
-
{# Optionally, if a file from the list was clicked to show details before loading: #}
|
|
15
|
-
{# {% if selected_file_details %} ... display details ... {% endif %} #}
|
|
16
|
-
</article>
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<!-- <article id="dashboard-flock-manager-content"> -->
|
|
2
|
-
<!-- {# This outer header is removed, title moves into the left-pane's new article structure #}
|
|
3
|
-
{# <header>
|
|
4
|
-
<h2>Manage & Load Flocks</h2> #}
|
|
5
|
-
</header> -->
|
|
6
|
-
|
|
7
|
-
{% if error_message %}
|
|
8
|
-
<div class="error DANGER" role="alert" x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 5000)">
|
|
9
|
-
{{ error_message }} <button type="button" class="close" @click="show = false">×</button>
|
|
10
|
-
</div>
|
|
11
|
-
{% endif %}
|
|
12
|
-
{% if success_message %}
|
|
13
|
-
<div class="success SUCCESS" role="alert" x-data="{ show: true }" x-show="show" x-init="setTimeout(() => show = false, 5000)">
|
|
14
|
-
{{ success_message }} <button type="button" class="close" @click="show = false">×</button>
|
|
15
|
-
</div>
|
|
16
|
-
{% endif %}
|
|
17
|
-
|
|
18
|
-
<article class="two-pane-flex-container">
|
|
19
|
-
<article class="left-pane"> {# Changed section to article, or wrap section in article #}
|
|
20
|
-
<header class="grid">
|
|
21
|
-
<h2>Load Flock</h2> {# Moved title here #}
|
|
22
|
-
<div style="text-align: right;">
|
|
23
|
-
<button role="button" class="outline" hx-get="{{ url_for('htmx_get_create_flock_form') }}?ui_mode={{ ui_mode }}" hx-target="#flock-properties-or-action-content" hx-swap="innerHTML">Add New Flock</button>
|
|
24
|
-
</div>
|
|
25
|
-
</header>
|
|
26
|
-
{# Content of the left pane now goes into this article #}
|
|
27
|
-
<div style="padding: var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal); flex-grow: 1; display: flex; flex-direction: column;"> <div hx-get="{{ url_for('htmx_get_dashboard_flock_file_list_partial') }}"
|
|
28
|
-
hx-trigger="load, flockFileListChanged from:body"
|
|
29
|
-
hx-swap="innerHTML"
|
|
30
|
-
id="dashboard-flock-file-list-target"
|
|
31
|
-
class="item-list-container" style="flex-grow: 1; overflow-y: auto;border: 1px solid var(--pico-border-color); border-radius: var(--pico-border-radius);">
|
|
32
|
-
<p style="padding:1rem; border: 1px solid var(--pico-border-color); border-radius: var(--pico-border-radius);">Loading files...</p><progress indeterminate></progress>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
</article>
|
|
36
|
-
|
|
37
|
-
<section id="flock-detail-action-column" class="right-pane-framed">
|
|
38
|
-
<header>
|
|
39
|
-
<h5>Flock Details</h5>
|
|
40
|
-
</header>
|
|
41
|
-
<div id="flock-properties-or-action-content">
|
|
42
|
-
<article style="text-align:center; margin-top: 2rem; border: none; background: transparent;">
|
|
43
|
-
<p>Select a Flock from the list to view its details and load it into the editor.</p>
|
|
44
|
-
<p><small>To create a new Flock or upload an existing one, use the options in the sidebar.</small></p>
|
|
45
|
-
</article>
|
|
46
|
-
</div>
|
|
47
|
-
</section>
|
|
48
|
-
</article>
|
|
49
|
-
<!-- </article> -->
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<article style="margin-top:0; padding-top:0;"> {# Remove top margin/padding from article to align with buttons #}
|
|
2
|
-
<header>
|
|
3
|
-
<h4 style="margin-bottom: 0.5rem;">{{ item_type_display }}</h4>
|
|
4
|
-
</header>
|
|
5
|
-
{% if items %}
|
|
6
|
-
<table>
|
|
7
|
-
<thead>
|
|
8
|
-
<tr>
|
|
9
|
-
<th>Name</th>
|
|
10
|
-
<th>Module Path</th>
|
|
11
|
-
</tr>
|
|
12
|
-
</thead>
|
|
13
|
-
<tbody>
|
|
14
|
-
{% for item in items %}
|
|
15
|
-
<tr>
|
|
16
|
-
<td>{{ item.name }}</td>
|
|
17
|
-
<td>{{ item.module }}</td>
|
|
18
|
-
</tr>
|
|
19
|
-
{% endfor %}
|
|
20
|
-
</tbody>
|
|
21
|
-
</table>
|
|
22
|
-
{% else %}
|
|
23
|
-
<p>No {{ item_type_display.lower() }} found in the registry.</p>
|
|
24
|
-
{% endif %}
|
|
25
|
-
</article>
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
<article>
|
|
2
|
-
<header>
|
|
3
|
-
<h2>Flock Registry Viewer</h2>
|
|
4
|
-
<p>Browse items registered with the Flock framework.</p>
|
|
5
|
-
</header>
|
|
6
|
-
|
|
7
|
-
<nav>
|
|
8
|
-
<ul role="group">
|
|
9
|
-
<li>
|
|
10
|
-
<button role="button" class="outline"
|
|
11
|
-
hx-get="{{ url_for('htmx_get_registry_table', item_type='type') }}"
|
|
12
|
-
hx-target="#registry-table-container" hx-indicator="#registry-loading"
|
|
13
|
-
hx-on:click="setActiveButton(this)">
|
|
14
|
-
View Types
|
|
15
|
-
</button>
|
|
16
|
-
</li>
|
|
17
|
-
<li>
|
|
18
|
-
<button role="button" class="outline"
|
|
19
|
-
hx-get="{{ url_for('htmx_get_registry_table', item_type='tool') }}"
|
|
20
|
-
hx-target="#registry-table-container" hx-indicator="#registry-loading"
|
|
21
|
-
hx-on:click="setActiveButton(this)">
|
|
22
|
-
View Tools/Callables
|
|
23
|
-
</button>
|
|
24
|
-
</li>
|
|
25
|
-
<li>
|
|
26
|
-
<button role="button" class="outline"
|
|
27
|
-
hx-get="{{ url_for('htmx_get_registry_table', item_type='component') }}"
|
|
28
|
-
hx-target="#registry-table-container" hx-indicator="#registry-loading"
|
|
29
|
-
hx-on:click="setActiveButton(this)">
|
|
30
|
-
View Components
|
|
31
|
-
</button>
|
|
32
|
-
</li>
|
|
33
|
-
<li>
|
|
34
|
-
<span style="padding: 0.25rem; text-decoration: underline;">Feedback-Files</span>
|
|
35
|
-
<div>
|
|
36
|
-
<a href="{{ url_for('chat_feedback_download_all', format='csv') }}" id="downloadFeedbackLinkAll"
|
|
37
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
38
|
-
CSV
|
|
39
|
-
</a>
|
|
40
|
-
<a href="{{ url_for('chat_feedback_download_all', format='xlsx') }}"
|
|
41
|
-
id="downloadFeedbackLinkAllXlsx"
|
|
42
|
-
style="padding: 0.25rem 0.5rem; margin: 0.25rem; background: var(--pico-primary); color: white; text-decoration: none; border-radius: 4px; font-size: 0.875rem;">
|
|
43
|
-
XLSX
|
|
44
|
-
</a>
|
|
45
|
-
</div>
|
|
46
|
-
</li>
|
|
47
|
-
</ul>
|
|
48
|
-
</nav>
|
|
49
|
-
|
|
50
|
-
<div id="registry-loading" class="htmx-indicator" style="text-align: center; margin-top: 1rem;">
|
|
51
|
-
<progress></progress> Loading...
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<div id="registry-table-container" style="margin-top: 1.5rem;">
|
|
55
|
-
<p>Select a category above to view registered items.</p>
|
|
56
|
-
</div>
|
|
57
|
-
</article>
|
|
58
|
-
|
|
59
|
-
<script>
|
|
60
|
-
// Make sure this script is included or available globally
|
|
61
|
-
function setActiveButton(clickedButton) {
|
|
62
|
-
const buttons = clickedButton.closest('ul[role="group"]').querySelectorAll('button');
|
|
63
|
-
buttons.forEach(button => {
|
|
64
|
-
button.classList.remove('primary');
|
|
65
|
-
button.classList.add('outline');
|
|
66
|
-
});
|
|
67
|
-
clickedButton.classList.remove('outline');
|
|
68
|
-
clickedButton.classList.add('primary');
|
|
69
|
-
}
|
|
70
|
-
</script>
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
{% from "partials/_structured_data_view.html" import render_value %}
|
|
2
|
-
|
|
3
|
-
<article id="results-display-content" x-data="{ viewMode: 'structured' }">
|
|
4
|
-
<header class="grid">
|
|
5
|
-
<h5 style="margin-bottom: 0;">Execution Result</h5>
|
|
6
|
-
<div style="text-align: right;">
|
|
7
|
-
<button role="button" class="outline contrast" @click="viewMode = 'structured'" :aria-pressed="viewMode === 'structured'">Structured</button>
|
|
8
|
-
<button role="button" class="outline contrast" @click="viewMode = 'json'" :aria-pressed="viewMode === 'json'">Raw JSON</button>
|
|
9
|
-
|
|
10
|
-
<div style="display:inline-block;margin-left:0.5rem;">
|
|
11
|
-
<!-- Quick thumbs-up feedback (inline form so we have the identifiers) -->
|
|
12
|
-
<form hx-post="{{ feedback_endpoint }}" hx-target="#results-display-content" hx-swap="innerHTML" style="display:inline-block;vertical-align:middle;margin:0;" hx-indicator="#feedback-loading-indicator">
|
|
13
|
-
{% if share_id %}<input type="hidden" name="share_id" value="{{ share_id }}">{% endif %}
|
|
14
|
-
<input type="hidden" name="flock_name" value="{{ flock_name }}">
|
|
15
|
-
<input type="hidden" name="agent_name" value="{{ agent_name }}">
|
|
16
|
-
<input type="hidden" name="flock_definition" value='{{ flock_definition | replace("'", "'") }}'>
|
|
17
|
-
<input type="hidden" name="actual_response" value='{{ result_raw_json | replace("'", "'") }}'>
|
|
18
|
-
<input type="hidden" name="reason" value="positive">
|
|
19
|
-
<button type="submit" role="button" class="outline contrast" title="Looks good!" style="padding:0.3rem 0.5rem;line-height:1;vertical-align:middle;margin:0;"><i class="fa fa-thumbs-up"></i></button>
|
|
20
|
-
</form>
|
|
21
|
-
|
|
22
|
-
<!-- Thumbs-down toggles detailed feedback form -->
|
|
23
|
-
<button role="button" class="outline contrast" @click="viewMode = 'feedback'" :aria-pressed="viewMode === 'feedback'" title="Something's wrong" style="padding:0.3rem 0.5rem;line-height:1;vertical-align:middle;margin:0;"><i class="fa fa-thumbs-down"></i></button>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
</header>
|
|
27
|
-
|
|
28
|
-
<div x-show="viewMode === 'json'">
|
|
29
|
-
{# Check for the new result_raw_json variable first #}
|
|
30
|
-
{% if result_raw_json is defined %}
|
|
31
|
-
<pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result_raw_json }}</code></pre>
|
|
32
|
-
{# Fallback for old context or if result was an error string from backend before formatting #}
|
|
33
|
-
{% elif result is string %}
|
|
34
|
-
<pre><code class="language-plaintext" style="word-break: break-all; white-space: pre-wrap;">{{ result }}</code></pre>
|
|
35
|
-
{% elif result %}
|
|
36
|
-
{# Fallback if result_raw_json is somehow not provided but result (dict) is #}
|
|
37
|
-
<pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result | tojson(indent=2) }}</code></pre>
|
|
38
|
-
{% else %}
|
|
39
|
-
<p>No results to display yet.</p>
|
|
40
|
-
{% endif %}
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
<div x-show="viewMode === 'structured'">
|
|
44
|
-
{% if result is string %}
|
|
45
|
-
<p class="error" style="white-space: pre-wrap;">{{ result }}</p>
|
|
46
|
-
{% elif result is mapping %}
|
|
47
|
-
{{ render_value(result) }}
|
|
48
|
-
{% elif result %}
|
|
49
|
-
<p>Structured view not available for this result type (not a dictionary).</p>
|
|
50
|
-
<pre><code class="language-json" style="word-break: break-all; white-space: pre-wrap;">{{ result | tojson(indent=2) }}</code></pre>
|
|
51
|
-
{% else %}
|
|
52
|
-
<p>No results to display yet.</p>
|
|
53
|
-
{% endif %}
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<!-- ---------------- Feedback form ---------------- -->
|
|
57
|
-
<div x-show="viewMode === 'feedback'" style="margin-top: 1rem;">
|
|
58
|
-
<form hx-post="{{ feedback_endpoint }}" hx-target="#results-display-content" hx-swap="innerHTML" hx-indicator="#feedback-loading-indicator">
|
|
59
|
-
{# Hidden identifiers #}
|
|
60
|
-
{% if share_id %}
|
|
61
|
-
<input type="hidden" name="share_id" value="{{ share_id }}">
|
|
62
|
-
{% endif %}
|
|
63
|
-
<input type="hidden" name="flock_name" value="{{ flock_name }}">
|
|
64
|
-
<input type="hidden" name="agent_name" value="{{ agent_name }}">
|
|
65
|
-
<input type="hidden" name="flock_definition" value='{{ flock_definition | replace("'", "'") }}'>
|
|
66
|
-
<input type="hidden" name="actual_response" value='{{ result_raw_json | replace("'", "'") }}'>
|
|
67
|
-
|
|
68
|
-
<label for="feedback_reason">Reason / Comment</label>
|
|
69
|
-
<textarea id="feedback_reason" name="reason" placeholder="Why isn't the answer good?" required style="min-height:6rem;"></textarea>
|
|
70
|
-
|
|
71
|
-
<label for="expected_response" style="margin-top:0.5rem;">Correct / Expected Response (JSON or text)</label>
|
|
72
|
-
<textarea id="expected_response" name="expected_response" style="white-space: pre; font-family: monospace; min-height:10rem;">{{ result_raw_json }}</textarea>
|
|
73
|
-
|
|
74
|
-
<button type="submit" class="secondary" style="margin-top:0.5rem;">Send Feedback</button>
|
|
75
|
-
<span id="feedback-loading-indicator" class="htmx-indicator"><progress indeterminate></progress> Sending…</span>
|
|
76
|
-
</form>
|
|
77
|
-
</div>
|
|
78
|
-
</article>
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<article>
|
|
2
|
-
<h3>Environment Variables</h3>
|
|
3
|
-
<div style="display:flex; gap:0.5rem; flex-wrap:wrap;"> <button class="outline small" id="toggle-secrets-btn" hx-post="{{ url_for('htmx_toggle_show_secrets') }}" hx-target="#env-vars-container" hx-swap="outerHTML">
|
|
4
|
-
{% if show_secrets %}Hide Secrets{% else %}Show Secrets{% endif %}
|
|
5
|
-
</button>
|
|
6
|
-
<button class="outline small" hx-get="{{ url_for('htmx_env_add_form') }}" hx-target="#env-vars-container" hx-swap="afterbegin">Add Variable</button>
|
|
7
|
-
</div>
|
|
8
|
-
{% include 'partials/_env_vars_table.html' %}
|
|
9
|
-
</article>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<article>
|
|
2
|
-
<h3>Theme Switcher</h3>
|
|
3
|
-
<div style="display:flex; gap:0.5rem; flex-wrap:wrap; align-items:center;">
|
|
4
|
-
<label for="theme-select" style="margin:0;">Select Theme:</label> <select id="theme-select" name="theme" hx-get="{{ url_for('htmx_theme_preview') }}" hx-target="#theme-preview" hx-trigger="load, change" hx-include="#theme-select" hx-swap="innerHTML">
|
|
5
|
-
{% for t in themes %}
|
|
6
|
-
<option value="{{ t }}" {% if t == current_theme %}selected{% endif %}>{{ t }}</option>
|
|
7
|
-
{% endfor %}
|
|
8
|
-
</select>
|
|
9
|
-
<button class="small" hx-post="{{ url_for('apply_theme') }}" hx-target="body" hx-include="#theme-select" hx-swap="none">Apply</button>
|
|
10
|
-
</div>
|
|
11
|
-
<div id="theme-preview" style="margin-top:1rem;">
|
|
12
|
-
<!-- Preview generated by theme-preview endpoint -->
|
|
13
|
-
</div>
|
|
14
|
-
</article>
|