flock-core 0.4.543__py3-none-any.whl → 0.5.0__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 +1079 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +86 -0
- flock/cli.py +147 -0
- flock/components.py +189 -0
- flock/dashboard/__init__.py +30 -0
- flock/dashboard/collector.py +559 -0
- flock/dashboard/events.py +188 -0
- flock/dashboard/graph_builder.py +563 -0
- flock/dashboard/launcher.py +235 -0
- flock/dashboard/models/graph.py +156 -0
- flock/dashboard/service.py +991 -0
- flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
- flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
- flock/dashboard/static_v2/index.html +13 -0
- flock/dashboard/websocket.py +246 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +932 -0
- flock/examples.py +131 -0
- flock/frontend/README.md +778 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4337 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +139 -0
- flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
- flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
- flock/frontend/src/components/filters/FilterPills.module.css +220 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
- flock/frontend/src/components/filters/FilterPills.tsx +143 -0
- flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
- flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
- flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
- flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
- flock/frontend/src/components/filters/TagFilter.tsx +21 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
- flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
- flock/frontend/src/components/graph/AgentNode.tsx +324 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
- flock/frontend/src/components/graph/MessageNode.tsx +129 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +420 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
- flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
- flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
- flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
- flock/frontend/src/components/modules/registerModules.ts +29 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +157 -0
- flock/frontend/src/hooks/usePersistence.ts +141 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +337 -0
- flock/frontend/src/services/graphService.test.ts +330 -0
- flock/frontend/src/services/graphService.ts +75 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +848 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +357 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.ts +650 -0
- flock/frontend/src/store/filterStore.test.ts +250 -0
- flock/frontend/src/store/filterStore.ts +272 -0
- flock/frontend/src/store/graphStore.test.ts +570 -0
- flock/frontend/src/store/graphStore.ts +462 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +75 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +122 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +47 -0
- flock/frontend/src/types/graph.ts +95 -0
- flock/frontend/src/types/modules.ts +10 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/artifacts.ts +24 -0
- flock/frontend/src/utils/mockData.ts +98 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/{core/util → helper}/cli_helper.py +9 -5
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/logging/auto_trace.py +159 -0
- 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 -107
- flock/{core/logging → logging}/logging.py +78 -61
- flock/{core/logging → logging}/telemetry.py +66 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/logging/trace_and_logged.py +304 -0
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
- flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
- flock/mcp/manager.py +286 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +16 -58
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
- flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
- flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +12 -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 +3 -3
- flock/orchestrator.py +970 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +277 -0
- flock/store.py +1214 -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/darkmatrix.toml +2 -2
- flock/themes/darkside.toml +1 -1
- flock/themes/deep.toml +2 -2
- 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 +5 -5
- 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/utility/output_utility_component.py +226 -0
- flock/visibility.py +107 -0
- flock_core-0.5.0.dist-info/METADATA +964 -0
- flock_core-0.5.0.dist-info/RECORD +525 -0
- flock_core-0.5.0.dist-info/entry_points.txt +2 -0
- {flock_core-0.4.543.dist-info → flock_core-0.5.0.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/config.py +0 -56
- flock/core/__init__.py +0 -44
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -262
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -101
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/config/flock_agent_config.py +0 -11
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -214
- flock/core/context/context_manager.py +0 -40
- flock/core/context/context_vars.py +0 -11
- flock/core/evaluation/utils.py +0 -395
- 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 -166
- flock/core/flock.py +0 -1003
- flock/core/flock_agent.py +0 -1258
- flock/core/flock_evaluator.py +0 -60
- flock/core/flock_factory.py +0 -513
- flock/core/flock_module.py +0 -207
- flock/core/flock_registry.py +0 -702
- flock/core/flock_router.py +0 -83
- 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/logging/live_capture.py +0 -137
- flock/core/logging/trace_and_logged.py +0 -59
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -640
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -445
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -854
- 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 -409
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -141
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -41
- flock/evaluators/__init__.py +0 -1
- flock/evaluators/declarative/__init__.py +0 -1
- flock/evaluators/declarative/declarative_evaluator.py +0 -217
- flock/evaluators/memory/memory_evaluator.py +0 -90
- flock/evaluators/test/test_case_evaluator.py +0 -38
- flock/evaluators/zep/zep_evaluator.py +0 -59
- flock/modules/__init__.py +0 -1
- flock/modules/assertion/__init__.py +0 -1
- flock/modules/assertion/assertion_module.py +0 -286
- flock/modules/callback/__init__.py +0 -1
- flock/modules/callback/callback_module.py +0 -91
- flock/modules/enterprise_memory/README.md +0 -99
- flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
- flock/modules/mem0/__init__.py +0 -1
- flock/modules/mem0/mem0_module.py +0 -126
- flock/modules/mem0_async/__init__.py +0 -1
- flock/modules/mem0_async/async_mem0_module.py +0 -126
- flock/modules/memory/__init__.py +0 -1
- flock/modules/memory/memory_module.py +0 -429
- flock/modules/memory/memory_parser.py +0 -125
- flock/modules/memory/memory_storage.py +0 -736
- flock/modules/output/__init__.py +0 -1
- flock/modules/output/output_module.py +0 -196
- flock/modules/performance/__init__.py +0 -1
- flock/modules/performance/metrics_module.py +0 -678
- flock/modules/zep/__init__.py +0 -1
- flock/modules/zep/zep_module.py +0 -192
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/routers/__init__.py +0 -1
- flock/routers/agent/__init__.py +0 -1
- flock/routers/agent/agent_router.py +0 -236
- flock/routers/agent/handoff_agent.py +0 -58
- flock/routers/conditional/conditional_router.py +0 -486
- flock/routers/default/__init__.py +0 -1
- flock/routers/default/default_router.py +0 -80
- flock/routers/feedback/feedback_router.py +0 -114
- flock/routers/list_generator/list_generator_router.py +0 -166
- flock/routers/llm/__init__.py +0 -1
- flock/routers/llm/llm_router.py +0 -365
- flock/tools/__init__.py +0 -0
- flock/tools/azure_tools.py +0 -781
- flock/tools/code_tools.py +0 -167
- flock/tools/file_tools.py +0 -149
- flock/tools/github_tools.py +0 -157
- flock/tools/markdown_tools.py +0 -205
- flock/tools/system_tools.py +0 -9
- flock/tools/text_tools.py +0 -810
- flock/tools/web_tools.py +0 -92
- flock/tools/zendesk_tools.py +0 -501
- 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 -237
- flock/webapp/app/api/execution.py +0 -503
- flock/webapp/app/api/flock_management.py +0 -125
- flock/webapp/app/api/registry_viewer.py +0 -29
- flock/webapp/app/chat.py +0 -662
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1086
- 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 -345
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -597
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -811
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -219
- 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 -281
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -389
- 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 -127
- 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/_live_logs.html +0 -13
- 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/_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 -237
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -240
- flock/workflow/flock_workflow.py +0 -225
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -60
- flock_core-0.4.543.dist-info/METADATA +0 -676
- flock_core-0.4.543.dist-info/RECORD +0 -572
- flock_core-0.4.543.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.4.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
|
@@ -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,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>
|
flock/workflow/__init__.py
DELETED
|
File without changes
|
flock/workflow/activities.py
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"""Defines Temporal activities for running a chain of agents with logging and tracing."""
|
|
2
|
-
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
|
|
5
|
-
from opentelemetry import trace
|
|
6
|
-
from temporalio import activity
|
|
7
|
-
|
|
8
|
-
from flock.core.context.context import FlockContext
|
|
9
|
-
from flock.core.context.context_vars import (
|
|
10
|
-
FLOCK_CURRENT_AGENT,
|
|
11
|
-
FLOCK_MODEL,
|
|
12
|
-
FLOCK_USE_PRODUCTION_TOOLS,
|
|
13
|
-
)
|
|
14
|
-
from flock.core.flock_agent import FlockAgent
|
|
15
|
-
from flock.core.flock_registry import get_registry
|
|
16
|
-
from flock.core.flock_router import HandOffRequest
|
|
17
|
-
from flock.core.logging.logging import get_logger
|
|
18
|
-
from flock.core.util.input_resolver import resolve_inputs
|
|
19
|
-
|
|
20
|
-
logger = get_logger("activities")
|
|
21
|
-
tracer = trace.get_tracer(__name__)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@activity.defn
|
|
25
|
-
async def run_agent(context: FlockContext) -> dict:
|
|
26
|
-
"""Runs a chain of agents using the provided context.
|
|
27
|
-
|
|
28
|
-
The context contains state, history, and agent definitions.
|
|
29
|
-
After each agent run, its output is merged into the context.
|
|
30
|
-
"""
|
|
31
|
-
# Start a top-level span for the entire run_agent activity.
|
|
32
|
-
with tracer.start_as_current_span("run_agent") as span:
|
|
33
|
-
registry = get_registry()
|
|
34
|
-
|
|
35
|
-
previous_agent_name = ""
|
|
36
|
-
if isinstance(context, dict):
|
|
37
|
-
context = FlockContext.from_dict(context)
|
|
38
|
-
current_agent_name = context.get_variable(FLOCK_CURRENT_AGENT)
|
|
39
|
-
span.set_attribute("initial.agent", current_agent_name)
|
|
40
|
-
logger.info("Starting agent chain", initial_agent=current_agent_name)
|
|
41
|
-
|
|
42
|
-
agent = registry.get_agent(current_agent_name)
|
|
43
|
-
if agent.model is None or agent.evaluator.config.model is None:
|
|
44
|
-
agent.set_model(context.get_variable(FLOCK_MODEL))
|
|
45
|
-
agent.resolve_callables(context=context)
|
|
46
|
-
if not agent:
|
|
47
|
-
logger.error("Agent not found", agent=current_agent_name)
|
|
48
|
-
span.record_exception(
|
|
49
|
-
Exception(f"Agent '{current_agent_name}' not found")
|
|
50
|
-
)
|
|
51
|
-
return {"error": f"Agent '{current_agent_name}' not found."}
|
|
52
|
-
|
|
53
|
-
# Loop over agents in the chain.
|
|
54
|
-
while agent:
|
|
55
|
-
# Create a nested span for this iteration.
|
|
56
|
-
with tracer.start_as_current_span("agent_iteration") as iter_span:
|
|
57
|
-
iter_span.set_attribute("agent.name", agent.name)
|
|
58
|
-
agent.context = context
|
|
59
|
-
# Resolve inputs for the agent.
|
|
60
|
-
agent_inputs = resolve_inputs(
|
|
61
|
-
agent.input, context, previous_agent_name
|
|
62
|
-
)
|
|
63
|
-
iter_span.add_event(
|
|
64
|
-
"resolved inputs", attributes={"inputs": str(agent_inputs)}
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
# Execute the agent with its own span.
|
|
68
|
-
with tracer.start_as_current_span("execute_agent") as exec_span:
|
|
69
|
-
logger.info("Executing agent", agent=agent.name)
|
|
70
|
-
try:
|
|
71
|
-
use_prod_tools = bool(
|
|
72
|
-
context.get_variable(
|
|
73
|
-
FLOCK_USE_PRODUCTION_TOOLS, False
|
|
74
|
-
)
|
|
75
|
-
)
|
|
76
|
-
exec_span.set_attribute(
|
|
77
|
-
"tools.selection",
|
|
78
|
-
"production" if use_prod_tools else "dev",
|
|
79
|
-
)
|
|
80
|
-
result = await agent.run_async(
|
|
81
|
-
agent_inputs,
|
|
82
|
-
use_production_tools=use_prod_tools,
|
|
83
|
-
)
|
|
84
|
-
exec_span.set_attribute("result", str(result))
|
|
85
|
-
logger.debug(
|
|
86
|
-
"Agent execution completed", agent=agent.name
|
|
87
|
-
)
|
|
88
|
-
except Exception as e:
|
|
89
|
-
logger.error(
|
|
90
|
-
"Agent execution failed",
|
|
91
|
-
agent=agent.name,
|
|
92
|
-
error=str(e),
|
|
93
|
-
)
|
|
94
|
-
exec_span.record_exception(e)
|
|
95
|
-
raise
|
|
96
|
-
|
|
97
|
-
# Determine the next agent using the handoff router if available
|
|
98
|
-
handoff_data = HandOffRequest()
|
|
99
|
-
|
|
100
|
-
if agent.handoff_router:
|
|
101
|
-
logger.info(
|
|
102
|
-
f"Using handoff router: {agent.handoff_router.__class__.__name__}",
|
|
103
|
-
agent=agent.name,
|
|
104
|
-
)
|
|
105
|
-
try:
|
|
106
|
-
# Route to the next agent
|
|
107
|
-
handoff_data = await agent.handoff_router.route(
|
|
108
|
-
agent, result, context
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
if callable(handoff_data):
|
|
112
|
-
logger.debug(
|
|
113
|
-
"Executing handoff function", agent=agent.name
|
|
114
|
-
)
|
|
115
|
-
try:
|
|
116
|
-
handoff_data = handoff_data(context, result)
|
|
117
|
-
if isinstance(
|
|
118
|
-
handoff_data.next_agent, FlockAgent
|
|
119
|
-
):
|
|
120
|
-
handoff_data.next_agent = (
|
|
121
|
-
handoff_data.next_agent.name
|
|
122
|
-
)
|
|
123
|
-
except Exception as e:
|
|
124
|
-
logger.error(
|
|
125
|
-
"Handoff function error {} {}",
|
|
126
|
-
agent=agent.name,
|
|
127
|
-
error=str(e),
|
|
128
|
-
)
|
|
129
|
-
iter_span.record_exception(e)
|
|
130
|
-
return {"error": f"Handoff function error: {e}"}
|
|
131
|
-
elif isinstance(handoff_data.next_agent, FlockAgent):
|
|
132
|
-
handoff_data.next_agent = (
|
|
133
|
-
handoff_data.next_agent.name
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
if not handoff_data.next_agent:
|
|
137
|
-
logger.info(
|
|
138
|
-
"Router found no suitable next agent",
|
|
139
|
-
agent=agent.name,
|
|
140
|
-
)
|
|
141
|
-
context.record(
|
|
142
|
-
agent.name,
|
|
143
|
-
result,
|
|
144
|
-
timestamp=datetime.now().isoformat(),
|
|
145
|
-
hand_off=None,
|
|
146
|
-
called_from=previous_agent_name,
|
|
147
|
-
)
|
|
148
|
-
logger.info("Completing chain", agent=agent.name)
|
|
149
|
-
iter_span.add_event("chain completed")
|
|
150
|
-
return result
|
|
151
|
-
except Exception as e:
|
|
152
|
-
logger.error(
|
|
153
|
-
"Router error {} {}",
|
|
154
|
-
agent.name,
|
|
155
|
-
str(e),
|
|
156
|
-
)
|
|
157
|
-
iter_span.record_exception(e)
|
|
158
|
-
return {"error": f"Router error: {e}"}
|
|
159
|
-
else:
|
|
160
|
-
# No router, so no handoff
|
|
161
|
-
logger.info(
|
|
162
|
-
"No handoff router defined, completing chain",
|
|
163
|
-
agent=agent.name,
|
|
164
|
-
)
|
|
165
|
-
context.record(
|
|
166
|
-
agent.name,
|
|
167
|
-
result,
|
|
168
|
-
timestamp=datetime.now().isoformat(),
|
|
169
|
-
hand_off=None,
|
|
170
|
-
called_from=previous_agent_name,
|
|
171
|
-
)
|
|
172
|
-
iter_span.add_event("chain completed")
|
|
173
|
-
return result
|
|
174
|
-
|
|
175
|
-
# Record the agent run in the context.
|
|
176
|
-
context.record(
|
|
177
|
-
agent.name,
|
|
178
|
-
result,
|
|
179
|
-
timestamp=datetime.now().isoformat(),
|
|
180
|
-
hand_off=handoff_data.model_dump(),
|
|
181
|
-
called_from=previous_agent_name,
|
|
182
|
-
)
|
|
183
|
-
previous_agent_name = agent.name
|
|
184
|
-
previous_agent_output = agent.output
|
|
185
|
-
if handoff_data.override_context:
|
|
186
|
-
context.update(handoff_data.override_context)
|
|
187
|
-
|
|
188
|
-
# Prepare the next agent.
|
|
189
|
-
try:
|
|
190
|
-
agent = registry.get_agent(handoff_data.next_agent)
|
|
191
|
-
if handoff_data.output_to_input_merge_strategy == "add":
|
|
192
|
-
agent.input = previous_agent_output + ", " + agent.input
|
|
193
|
-
|
|
194
|
-
if handoff_data.add_input_fields:
|
|
195
|
-
for field in handoff_data.add_input_fields:
|
|
196
|
-
agent.input = field + ", " + agent.input
|
|
197
|
-
|
|
198
|
-
if handoff_data.add_output_fields:
|
|
199
|
-
for field in handoff_data.add_output_fields:
|
|
200
|
-
agent.output = field + ", " + agent.output
|
|
201
|
-
|
|
202
|
-
if handoff_data.add_description:
|
|
203
|
-
if agent.description:
|
|
204
|
-
agent.description = (
|
|
205
|
-
agent.description
|
|
206
|
-
+ "\n"
|
|
207
|
-
+ handoff_data.add_description
|
|
208
|
-
)
|
|
209
|
-
else:
|
|
210
|
-
agent.description = handoff_data.add_description
|
|
211
|
-
|
|
212
|
-
agent.resolve_callables(context=context)
|
|
213
|
-
if not agent:
|
|
214
|
-
logger.error(
|
|
215
|
-
"Next agent not found",
|
|
216
|
-
agent=handoff_data.next_agent,
|
|
217
|
-
)
|
|
218
|
-
iter_span.record_exception(
|
|
219
|
-
Exception(
|
|
220
|
-
f"Next agent '{handoff_data.next_agent}' not found"
|
|
221
|
-
)
|
|
222
|
-
)
|
|
223
|
-
return {
|
|
224
|
-
"error": f"Next agent '{handoff_data.next_agent}' not found."
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
context.set_variable(FLOCK_CURRENT_AGENT, agent.name)
|
|
228
|
-
|
|
229
|
-
logger.info("Handing off to next agent", next=agent.name)
|
|
230
|
-
iter_span.set_attribute("next.agent", agent.name)
|
|
231
|
-
except Exception as e:
|
|
232
|
-
logger.error("Error during handoff", error=str(e))
|
|
233
|
-
iter_span.record_exception(e)
|
|
234
|
-
return {"error": f"Error during handoff: {e}"}
|
|
235
|
-
|
|
236
|
-
# If the loop exits unexpectedly, return the initial input.
|
|
237
|
-
return context.get_variable("init_input")
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
from temporalio import activity
|
|
2
|
-
|
|
3
|
-
from flock.core.context.context import FlockContext
|
|
4
|
-
from flock.core.flock_agent import FlockAgent
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@activity.defn
|
|
8
|
-
async def run_declarative_agent_activity(params: dict) -> dict:
|
|
9
|
-
"""Temporal activity to run a declarative (or batch) agent.
|
|
10
|
-
|
|
11
|
-
Expects a dictionary with:
|
|
12
|
-
- "agent_data": a dict representation of the agent (as produced by .dict()),
|
|
13
|
-
- "context_data": a dict containing the FlockContext state and optionally other fields.
|
|
14
|
-
|
|
15
|
-
The activity reconstructs the agent and a FlockContext, then calls the agent’s _evaluate() method.
|
|
16
|
-
"""
|
|
17
|
-
agent_data = params.get("agent_data")
|
|
18
|
-
context_data = params.get("context_data", {})
|
|
19
|
-
# Reconstruct the agent from its serialized representation.
|
|
20
|
-
agent = FlockAgent.from_dict(agent_data)
|
|
21
|
-
# Reconstruct the FlockContext from the state.
|
|
22
|
-
context = FlockContext.from_dict(context_data)
|
|
23
|
-
result = await agent.evaluate(context)
|
|
24
|
-
return result
|