flock-core 0.4.542__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.542.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.542.dist-info/METADATA +0 -676
- flock_core-0.4.542.dist-info/RECORD +0 -572
- flock_core-0.4.542.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.542.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""DashboardLauncher - manages npm lifecycle and browser launch for the dashboard.
|
|
2
|
+
|
|
3
|
+
This module handles:
|
|
4
|
+
- npm dependency installation (first run)
|
|
5
|
+
- npm dev server (DASHBOARD_DEV=1) or production build
|
|
6
|
+
- Automatic browser launch
|
|
7
|
+
- Process cleanup on shutdown
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import subprocess
|
|
12
|
+
import sys
|
|
13
|
+
import time
|
|
14
|
+
import webbrowser
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Frontend directory location (adjacent to this dashboard package)
|
|
19
|
+
FRONTEND_DIR = Path(__file__).parent.parent / "frontend"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DashboardLauncher:
|
|
23
|
+
"""Manages dashboard frontend lifecycle.
|
|
24
|
+
|
|
25
|
+
Responsibilities:
|
|
26
|
+
- Ensure npm dependencies installed
|
|
27
|
+
- Start npm dev server (dev mode) or build for production
|
|
28
|
+
- Launch browser automatically
|
|
29
|
+
- Clean up npm processes on shutdown
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
launcher = DashboardLauncher(port=8344)
|
|
33
|
+
launcher.start() # Starts npm and opens browser
|
|
34
|
+
# ... orchestrator runs ...
|
|
35
|
+
launcher.stop() # Cleanup
|
|
36
|
+
|
|
37
|
+
Or as context manager:
|
|
38
|
+
with DashboardLauncher(port=8344):
|
|
39
|
+
# orchestrator.serve() runs
|
|
40
|
+
pass # Automatically cleaned up
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
port: int = 8344,
|
|
46
|
+
frontend_dir: Path | None = None,
|
|
47
|
+
static_dir: Path | None = None,
|
|
48
|
+
):
|
|
49
|
+
"""Initialize dashboard launcher.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
port: HTTP port where dashboard will be served (default: 8344)
|
|
53
|
+
frontend_dir: Optional frontend directory path (defaults to FRONTEND_DIR)
|
|
54
|
+
"""
|
|
55
|
+
self.port = port
|
|
56
|
+
self.frontend_dir = frontend_dir or FRONTEND_DIR
|
|
57
|
+
self.static_dir = static_dir or Path(__file__).parent / "static"
|
|
58
|
+
self.dev_mode = os.getenv("DASHBOARD_DEV", "0") == "1"
|
|
59
|
+
self._npm_process: subprocess.Popen | None = None
|
|
60
|
+
|
|
61
|
+
def _ensure_npm_dependencies(self) -> None:
|
|
62
|
+
"""Ensure npm dependencies are installed.
|
|
63
|
+
|
|
64
|
+
Runs 'npm install'.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
print(f"[Dashboard] Installing npm dependencies in {self.frontend_dir}...")
|
|
68
|
+
try:
|
|
69
|
+
subprocess.run(
|
|
70
|
+
[self._get_npm_command(), "install"],
|
|
71
|
+
cwd=self.frontend_dir,
|
|
72
|
+
check=True,
|
|
73
|
+
capture_output=True,
|
|
74
|
+
text=True,
|
|
75
|
+
)
|
|
76
|
+
print("[Dashboard] npm dependencies installed successfully")
|
|
77
|
+
except subprocess.CalledProcessError as e:
|
|
78
|
+
print(f"[Dashboard] Warning: npm install failed: {e.stderr}")
|
|
79
|
+
print("[Dashboard] Continuing anyway, dashboard may not work correctly")
|
|
80
|
+
except FileNotFoundError:
|
|
81
|
+
print("[Dashboard] Error: npm not found. Please install Node.js and npm.")
|
|
82
|
+
print("[Dashboard] Dashboard will not be available.")
|
|
83
|
+
|
|
84
|
+
def _get_npm_command(self) -> str:
|
|
85
|
+
"""Get npm command (npm or npm.cmd on Windows)."""
|
|
86
|
+
return "npm.cmd" if sys.platform == "win32" else "npm"
|
|
87
|
+
|
|
88
|
+
def _start_npm_process(self) -> None:
|
|
89
|
+
"""Start npm dev server or production build based on mode."""
|
|
90
|
+
if self.dev_mode:
|
|
91
|
+
self._start_dev_server()
|
|
92
|
+
else:
|
|
93
|
+
self._build_production()
|
|
94
|
+
|
|
95
|
+
def _start_dev_server(self) -> None:
|
|
96
|
+
"""Start npm dev server for hot-reload development."""
|
|
97
|
+
print(f"[Dashboard] Starting dev server (DASHBOARD_DEV=1) on port {self.port}...")
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
self._npm_process = subprocess.Popen(
|
|
101
|
+
[self._get_npm_command(), "run", "dev"],
|
|
102
|
+
cwd=self.frontend_dir,
|
|
103
|
+
stdout=subprocess.PIPE,
|
|
104
|
+
stderr=subprocess.PIPE,
|
|
105
|
+
text=True,
|
|
106
|
+
)
|
|
107
|
+
print(f"[Dashboard] Dev server started (PID: {self._npm_process.pid})")
|
|
108
|
+
except FileNotFoundError:
|
|
109
|
+
print("[Dashboard] Error: npm not found. Dev server not started.")
|
|
110
|
+
|
|
111
|
+
def _build_production(self) -> None:
|
|
112
|
+
"""Build frontend for production (static files)."""
|
|
113
|
+
print("[Dashboard] Building frontend for production...")
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
subprocess.run(
|
|
117
|
+
[self._get_npm_command(), "run", "build"],
|
|
118
|
+
cwd=self.frontend_dir,
|
|
119
|
+
check=True,
|
|
120
|
+
capture_output=True,
|
|
121
|
+
text=True,
|
|
122
|
+
)
|
|
123
|
+
print("[Dashboard] Production build completed")
|
|
124
|
+
|
|
125
|
+
# Copy build output from frontend/dist to src/flock/dashboard/static
|
|
126
|
+
self._copy_build_output()
|
|
127
|
+
|
|
128
|
+
except subprocess.CalledProcessError as e:
|
|
129
|
+
print(f"[Dashboard] Warning: Production build failed: {e.stderr}")
|
|
130
|
+
print("[Dashboard] Dashboard may not be available")
|
|
131
|
+
except FileNotFoundError:
|
|
132
|
+
print("[Dashboard] Error: npm not found. Build skipped.")
|
|
133
|
+
|
|
134
|
+
def _copy_build_output(self) -> None:
|
|
135
|
+
"""Copy built frontend files from frontend/dist to dashboard/static."""
|
|
136
|
+
import shutil
|
|
137
|
+
|
|
138
|
+
source_dir = self.frontend_dir / "dist"
|
|
139
|
+
target_dir = self.static_dir
|
|
140
|
+
|
|
141
|
+
if not source_dir.exists():
|
|
142
|
+
print(f"[Dashboard] Warning: Build output not found at {source_dir}")
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
# Remove old static files if they exist
|
|
146
|
+
if target_dir.exists():
|
|
147
|
+
shutil.rmtree(target_dir)
|
|
148
|
+
|
|
149
|
+
# Copy dist to static
|
|
150
|
+
print(f"[Dashboard] Copying build output from {source_dir} to {target_dir}")
|
|
151
|
+
shutil.copytree(source_dir, target_dir)
|
|
152
|
+
print(f"[Dashboard] Static files ready at {target_dir}")
|
|
153
|
+
|
|
154
|
+
def _launch_browser(self) -> None:
|
|
155
|
+
"""Launch browser to dashboard URL after brief delay.
|
|
156
|
+
|
|
157
|
+
Waits 2 seconds to allow server to start before opening browser.
|
|
158
|
+
Catches errors gracefully (e.g., headless environments).
|
|
159
|
+
"""
|
|
160
|
+
# Wait for server to start
|
|
161
|
+
time.sleep(2)
|
|
162
|
+
|
|
163
|
+
dashboard_url = f"http://localhost:{self.port}"
|
|
164
|
+
print(f"[Dashboard] Opening browser to {dashboard_url}...")
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
webbrowser.open(dashboard_url)
|
|
168
|
+
print("[Dashboard] Browser launched successfully")
|
|
169
|
+
except Exception as e:
|
|
170
|
+
print(f"[Dashboard] Could not launch browser: {e}")
|
|
171
|
+
print(f"[Dashboard] Please open {dashboard_url} manually")
|
|
172
|
+
|
|
173
|
+
def start(self) -> None:
|
|
174
|
+
"""Start dashboard: install deps, start npm, launch browser.
|
|
175
|
+
|
|
176
|
+
This method:
|
|
177
|
+
1. Ensures npm dependencies are installed
|
|
178
|
+
2. Starts npm dev server (dev mode) or builds production
|
|
179
|
+
3. Launches browser to dashboard URL
|
|
180
|
+
"""
|
|
181
|
+
print(f"[Dashboard] Starting dashboard on port {self.port}")
|
|
182
|
+
print(f"[Dashboard] Mode: {'DEVELOPMENT' if self.dev_mode else 'PRODUCTION'}")
|
|
183
|
+
print(f"[Dashboard] Frontend directory: {self.frontend_dir}")
|
|
184
|
+
|
|
185
|
+
# Step 1: Ensure dependencies installed
|
|
186
|
+
self._ensure_npm_dependencies()
|
|
187
|
+
|
|
188
|
+
# Step 2: Start npm process
|
|
189
|
+
self._start_npm_process()
|
|
190
|
+
|
|
191
|
+
# Step 3: Launch browser
|
|
192
|
+
self._launch_browser()
|
|
193
|
+
|
|
194
|
+
def stop(self) -> None:
|
|
195
|
+
"""Stop dashboard and cleanup npm processes.
|
|
196
|
+
|
|
197
|
+
Attempts graceful termination, falls back to kill if needed.
|
|
198
|
+
"""
|
|
199
|
+
if self._npm_process is None:
|
|
200
|
+
return
|
|
201
|
+
|
|
202
|
+
print("[Dashboard] Stopping npm process...")
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
# Try graceful termination first
|
|
206
|
+
self._npm_process.terminate()
|
|
207
|
+
|
|
208
|
+
# Wait up to 5 seconds for process to exit
|
|
209
|
+
for _ in range(5):
|
|
210
|
+
if self._npm_process.poll() is not None:
|
|
211
|
+
print("[Dashboard] npm process stopped gracefully")
|
|
212
|
+
return
|
|
213
|
+
time.sleep(1)
|
|
214
|
+
|
|
215
|
+
# Force kill if still running
|
|
216
|
+
print("[Dashboard] npm process did not stop gracefully, forcing kill...")
|
|
217
|
+
self._npm_process.kill()
|
|
218
|
+
self._npm_process.wait(timeout=2)
|
|
219
|
+
print("[Dashboard] npm process killed")
|
|
220
|
+
|
|
221
|
+
except Exception as e:
|
|
222
|
+
print(f"[Dashboard] Error stopping npm process: {e}")
|
|
223
|
+
|
|
224
|
+
finally:
|
|
225
|
+
self._npm_process = None
|
|
226
|
+
|
|
227
|
+
def __enter__(self):
|
|
228
|
+
"""Context manager entry: start dashboard."""
|
|
229
|
+
self.start()
|
|
230
|
+
return self
|
|
231
|
+
|
|
232
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
233
|
+
"""Context manager exit: stop dashboard."""
|
|
234
|
+
self.stop()
|
|
235
|
+
return False # Don't suppress exceptions
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class GraphTimeRangePreset(str, Enum):
|
|
11
|
+
LAST_5_MIN = "last5min"
|
|
12
|
+
LAST_10_MIN = "last10min"
|
|
13
|
+
LAST_1_HOUR = "last1hour"
|
|
14
|
+
ALL = "all"
|
|
15
|
+
CUSTOM = "custom"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class GraphTimeRange(BaseModel):
|
|
19
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
20
|
+
|
|
21
|
+
preset: GraphTimeRangePreset = GraphTimeRangePreset.LAST_10_MIN
|
|
22
|
+
start: datetime | None = None
|
|
23
|
+
end: datetime | None = None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GraphFilters(BaseModel):
|
|
27
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
28
|
+
|
|
29
|
+
correlation_id: str | None = None
|
|
30
|
+
time_range: GraphTimeRange = Field(default_factory=GraphTimeRange)
|
|
31
|
+
artifact_types: list[str] = Field(default_factory=list, alias="artifactTypes")
|
|
32
|
+
producers: list[str] = Field(default_factory=list)
|
|
33
|
+
tags: list[str] = Field(default_factory=list)
|
|
34
|
+
visibility: list[str] = Field(default_factory=list)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GraphRequestOptions(BaseModel):
|
|
38
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
39
|
+
|
|
40
|
+
include_statistics: bool = Field(default=True, alias="includeStatistics")
|
|
41
|
+
label_offset_strategy: str = Field(default="stack", alias="labelOffsetStrategy")
|
|
42
|
+
limit: int = 500
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class GraphRequest(BaseModel):
|
|
46
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
47
|
+
|
|
48
|
+
view_mode: Literal["agent", "blackboard"] = Field(alias="viewMode")
|
|
49
|
+
filters: GraphFilters = Field(default_factory=GraphFilters)
|
|
50
|
+
options: GraphRequestOptions = Field(default_factory=GraphRequestOptions)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class GraphPosition(BaseModel):
|
|
54
|
+
x: float = 0.0
|
|
55
|
+
y: float = 0.0
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class GraphMarker(BaseModel):
|
|
59
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
60
|
+
|
|
61
|
+
type: str = "arrowclosed"
|
|
62
|
+
width: float = 20.0
|
|
63
|
+
height: float = 20.0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class GraphNode(BaseModel):
|
|
67
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
68
|
+
|
|
69
|
+
id: str
|
|
70
|
+
type: Literal["agent", "message"]
|
|
71
|
+
data: dict[str, Any] = Field(default_factory=dict)
|
|
72
|
+
position: GraphPosition | None = None
|
|
73
|
+
hidden: bool = False
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class GraphEdge(BaseModel):
|
|
77
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
78
|
+
|
|
79
|
+
id: str
|
|
80
|
+
source: str
|
|
81
|
+
target: str
|
|
82
|
+
type: Literal["message_flow", "transformation"]
|
|
83
|
+
label: str | None = None
|
|
84
|
+
data: dict[str, Any] = Field(default_factory=dict)
|
|
85
|
+
marker_end: GraphMarker | None = Field(default=None, alias="markerEnd")
|
|
86
|
+
hidden: bool = False
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class GraphAgentMetrics(BaseModel):
|
|
90
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
91
|
+
|
|
92
|
+
total: int = 0
|
|
93
|
+
by_type: dict[str, int] = Field(default_factory=dict, alias="byType")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class GraphStatistics(BaseModel):
|
|
97
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
98
|
+
|
|
99
|
+
produced_by_agent: dict[str, GraphAgentMetrics] = Field(
|
|
100
|
+
default_factory=dict, alias="producedByAgent"
|
|
101
|
+
)
|
|
102
|
+
consumed_by_agent: dict[str, GraphAgentMetrics] = Field(
|
|
103
|
+
default_factory=dict, alias="consumedByAgent"
|
|
104
|
+
)
|
|
105
|
+
artifact_summary: dict[str, Any] = Field(default_factory=dict, alias="artifactSummary")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class GraphArtifact(BaseModel):
|
|
109
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
110
|
+
|
|
111
|
+
artifact_id: str = Field(alias="artifactId")
|
|
112
|
+
artifact_type: str = Field(alias="artifactType")
|
|
113
|
+
produced_by: str = Field(alias="producedBy")
|
|
114
|
+
consumed_by: list[str] = Field(default_factory=list, alias="consumedBy")
|
|
115
|
+
published_at: datetime = Field(alias="publishedAt")
|
|
116
|
+
payload: dict[str, Any] = Field(default_factory=dict)
|
|
117
|
+
correlation_id: str | None = Field(default=None, alias="correlationId")
|
|
118
|
+
visibility_kind: str | None = Field(default=None, alias="visibilityKind")
|
|
119
|
+
tags: list[str] = Field(default_factory=list)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class GraphRun(BaseModel):
|
|
123
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
124
|
+
|
|
125
|
+
run_id: str = Field(alias="runId")
|
|
126
|
+
agent_name: str = Field(alias="agentName")
|
|
127
|
+
correlation_id: str | None = Field(default=None, alias="correlationId")
|
|
128
|
+
status: Literal["active", "completed", "error"] = "active"
|
|
129
|
+
consumed_artifacts: list[str] = Field(default_factory=list, alias="consumedArtifacts")
|
|
130
|
+
produced_artifacts: list[str] = Field(default_factory=list, alias="producedArtifacts")
|
|
131
|
+
duration_ms: float | None = Field(default=None, alias="durationMs")
|
|
132
|
+
started_at: datetime | None = Field(default=None, alias="startedAt")
|
|
133
|
+
completed_at: datetime | None = Field(default=None, alias="completedAt")
|
|
134
|
+
metrics: dict[str, Any] = Field(default_factory=dict)
|
|
135
|
+
error_message: str | None = Field(default=None, alias="errorMessage")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class GraphState(BaseModel):
|
|
139
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
140
|
+
|
|
141
|
+
consumptions: dict[str, list[str]] = Field(default_factory=dict)
|
|
142
|
+
runs: list[GraphRun] = Field(default_factory=list)
|
|
143
|
+
agent_status: dict[str, str] = Field(default_factory=dict, alias="agentStatus")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class GraphSnapshot(BaseModel):
|
|
147
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
148
|
+
|
|
149
|
+
generated_at: datetime = Field(alias="generatedAt")
|
|
150
|
+
view_mode: Literal["agent", "blackboard"] = Field(alias="viewMode")
|
|
151
|
+
filters: GraphFilters
|
|
152
|
+
nodes: list[GraphNode] = Field(default_factory=list)
|
|
153
|
+
edges: list[GraphEdge] = Field(default_factory=list)
|
|
154
|
+
statistics: GraphStatistics | None = None
|
|
155
|
+
total_artifacts: int = Field(alias="totalArtifacts", default=0)
|
|
156
|
+
truncated: bool = False
|