flock-core 0.5.0b28__py3-none-any.whl → 0.5.0b51__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flock-core might be problematic. Click here for more details.
- flock/__init__.py +12 -217
- flock/agent.py +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/frontend/README.md +678 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4347 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +79 -0
- flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
- flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
- flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -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 +62 -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/MessageHistoryTab.tsx +299 -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 +307 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -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/FilterBar.module.css +29 -0
- flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
- flock/frontend/src/components/filters/FilterBar.tsx +33 -0
- flock/frontend/src/components/filters/FilterPills.module.css +79 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
- flock/frontend/src/components/filters/FilterPills.tsx +67 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
- flock/frontend/src/components/graph/AgentNode.tsx +322 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
- flock/frontend/src/components/graph/MessageNode.tsx +116 -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 +407 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +300 -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/EventLogModule.test.tsx +401 -0
- flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
- flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
- flock/frontend/src/components/modules/registerModules.ts +20 -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/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/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 +139 -0
- flock/frontend/src/hooks/usePersistence.ts +139 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +213 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +794 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +146 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.test.ts +595 -0
- flock/frontend/src/services/websocket.ts +685 -0
- flock/frontend/src/store/filterStore.test.ts +242 -0
- flock/frontend/src/store/filterStore.ts +103 -0
- flock/frontend/src/store/graphStore.test.ts +186 -0
- flock/frontend/src/store/graphStore.ts +414 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +57 -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 +110 -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 +14 -0
- flock/frontend/src/types/graph.ts +55 -0
- flock/frontend/src/types/modules.ts +7 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/mockData.ts +85 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/utils/transforms.test.ts +860 -0
- flock/frontend/src/utils/transforms.ts +323 -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 +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkside.toml +1 -1
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +1 -1
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.0b51.dist-info/METADATA +747 -0
- flock_core-0.5.0b51.dist-info/RECORD +508 -0
- flock_core-0.5.0b51.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -118
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_streaming_results_container.html +0 -195
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/WHEEL +0 -0
|
@@ -5,21 +5,21 @@ import random
|
|
|
5
5
|
import re
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
from flock.core.logging.formatters.themes import OutputTheme
|
|
8
|
+
import toml # install with: pip install toml
|
|
9
|
+
from pydantic import BaseModel
|
|
11
10
|
|
|
12
|
-
with workflow.unsafe.imports_passed_through():
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
# with workflow.unsafe.imports_passed_through():
|
|
12
|
+
from pygments.style import Style
|
|
13
|
+
from pygments.token import Token
|
|
14
|
+
from rich import box
|
|
15
|
+
from rich.console import Console, Group
|
|
16
|
+
from rich.panel import Panel
|
|
17
|
+
from rich.syntax import PygmentsSyntaxTheme, Syntax
|
|
18
|
+
from rich.table import Table
|
|
19
|
+
from rich.theme import Theme
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
# from temporalio import workflow
|
|
22
|
+
from flock.logging.formatters.themes import OutputTheme
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def resolve_style_string(style_str: str, theme: dict) -> str:
|
|
@@ -76,18 +76,10 @@ def generate_default_rich_block(theme: dict | None = None) -> dict[str, Any]:
|
|
|
76
76
|
cursor_cursor = theme["colors"]["cursor"].get("cursor", "#d0d0d0")
|
|
77
77
|
cursor_text = theme["colors"]["cursor"].get("text", "#151515")
|
|
78
78
|
|
|
79
|
-
primary_background = theme["colors"]["primary"].get(
|
|
80
|
-
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
"foreground", "#c5c8c6"
|
|
84
|
-
)
|
|
85
|
-
selection_background = theme["colors"]["selection"].get(
|
|
86
|
-
"background", "#444444"
|
|
87
|
-
)
|
|
88
|
-
selection_text = theme["colors"]["selection"].get(
|
|
89
|
-
"text", primary_foreground
|
|
90
|
-
)
|
|
79
|
+
primary_background = theme["colors"]["primary"].get("background", "#161719")
|
|
80
|
+
primary_foreground = theme["colors"]["primary"].get("foreground", "#c5c8c6")
|
|
81
|
+
selection_background = theme["colors"]["selection"].get("background", "#444444")
|
|
82
|
+
selection_text = theme["colors"]["selection"].get("text", primary_foreground)
|
|
91
83
|
else:
|
|
92
84
|
bright_black = "black"
|
|
93
85
|
bright_blue = "blue"
|
|
@@ -155,9 +147,7 @@ def generate_default_rich_block(theme: dict | None = None) -> dict[str, Any]:
|
|
|
155
147
|
"panel_padding": random.choice([[1, 2], [1, 1], [2, 2], [0, 2]]),
|
|
156
148
|
"panel_title_align": random.choice(["left", "center", "right"]),
|
|
157
149
|
# Add table_row_styles property.
|
|
158
|
-
"table_row_styles": random.choice(
|
|
159
|
-
[["", "dim"], ["", "italic"], ["", "underline"]]
|
|
160
|
-
),
|
|
150
|
+
"table_row_styles": random.choice([["", "dim"], ["", "italic"], ["", "underline"]]),
|
|
161
151
|
}
|
|
162
152
|
# Extra table layout properties (non content properties).
|
|
163
153
|
default_extra_table_props = {
|
|
@@ -178,13 +168,12 @@ def generate_default_rich_block(theme: dict | None = None) -> dict[str, Any]:
|
|
|
178
168
|
"table_highlight": False,
|
|
179
169
|
}
|
|
180
170
|
# Combine all defaults.
|
|
181
|
-
|
|
171
|
+
return {
|
|
182
172
|
**default_color_props,
|
|
183
173
|
**extra_color_props,
|
|
184
174
|
**default_non_color_props,
|
|
185
175
|
**default_extra_table_props,
|
|
186
176
|
}
|
|
187
|
-
return defaults
|
|
188
177
|
|
|
189
178
|
|
|
190
179
|
def load_theme_from_file(filepath: str) -> dict:
|
|
@@ -221,9 +210,7 @@ def get_default_styles(theme: dict | None) -> dict[str, Any]:
|
|
|
221
210
|
else:
|
|
222
211
|
defaults = generate_default_rich_block(theme)
|
|
223
212
|
rich_props = theme.get("rich", {})
|
|
224
|
-
final_styles = {
|
|
225
|
-
key: rich_props.get(key, defaults[key]) for key in defaults
|
|
226
|
-
}
|
|
213
|
+
final_styles = {key: rich_props.get(key, defaults[key]) for key in defaults}
|
|
227
214
|
|
|
228
215
|
# Ensure that panel_padding and table_padding are tuples.
|
|
229
216
|
final_styles["panel_padding"] = tuple(final_styles["panel_padding"])
|
|
@@ -256,14 +243,6 @@ def create_rich_renderable(
|
|
|
256
243
|
if styles is None:
|
|
257
244
|
styles = get_default_styles(theme)
|
|
258
245
|
|
|
259
|
-
# Convert Pydantic BaseModel instances to dicts for rendering
|
|
260
|
-
try:
|
|
261
|
-
from pydantic import BaseModel
|
|
262
|
-
if isinstance(value, BaseModel):
|
|
263
|
-
value = value.model_dump()
|
|
264
|
-
except ImportError:
|
|
265
|
-
pass
|
|
266
|
-
|
|
267
246
|
# If the value is a dictionary, render it as a table.
|
|
268
247
|
if isinstance(value, dict):
|
|
269
248
|
# Convert table_box string into an actual box style.
|
|
@@ -309,41 +288,31 @@ def create_rich_renderable(
|
|
|
309
288
|
return table
|
|
310
289
|
|
|
311
290
|
# If the value is a list or tuple, render each item.
|
|
312
|
-
|
|
291
|
+
if isinstance(value, list | tuple):
|
|
313
292
|
if all(isinstance(item, dict) for item in value):
|
|
314
293
|
sub_tables = []
|
|
315
294
|
for i, item in enumerate(value):
|
|
316
295
|
sub_tables.append(f"[bold]Item {i + 1}[/bold]")
|
|
317
296
|
sub_tables.append(
|
|
318
|
-
create_rich_renderable(
|
|
319
|
-
item, level + 1, theme, styles, max_length=max_length
|
|
320
|
-
)
|
|
297
|
+
create_rich_renderable(item, level + 1, theme, styles, max_length=max_length)
|
|
321
298
|
)
|
|
322
299
|
return Group(*sub_tables)
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
if all(isinstance(item, str) for item in rendered_items):
|
|
331
|
-
return "\n".join(rendered_items)
|
|
332
|
-
else:
|
|
333
|
-
return Group(*rendered_items)
|
|
300
|
+
rendered_items = [
|
|
301
|
+
create_rich_renderable(item, level + 1, theme, styles, max_length=max_length)
|
|
302
|
+
for item in value
|
|
303
|
+
]
|
|
304
|
+
if all(isinstance(item, str) for item in rendered_items):
|
|
305
|
+
return "\n".join(rendered_items)
|
|
306
|
+
return Group(*rendered_items)
|
|
334
307
|
|
|
335
308
|
# Otherwise, return a string representation.
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
)
|
|
344
|
-
if isinstance(value, str) and "\n" in value:
|
|
345
|
-
return f"\n{s}\n"
|
|
346
|
-
return s
|
|
309
|
+
s = str(value).strip()
|
|
310
|
+
if max_length > 0 and len(s) > max_length:
|
|
311
|
+
omitted = len(s) - max_length
|
|
312
|
+
s = s[:max_length] + f"[bold bright_yellow]...(+{omitted}chars)[/bold bright_yellow]"
|
|
313
|
+
if isinstance(value, str) and "\n" in value:
|
|
314
|
+
return f"\n{s}\n"
|
|
315
|
+
return s
|
|
347
316
|
|
|
348
317
|
|
|
349
318
|
def load_syntax_theme_from_file(filepath: str) -> dict:
|
|
@@ -352,12 +321,10 @@ def load_syntax_theme_from_file(filepath: str) -> dict:
|
|
|
352
321
|
theme = toml.load(f)
|
|
353
322
|
|
|
354
323
|
if "colors" not in theme:
|
|
355
|
-
raise ValueError(
|
|
356
|
-
f"Theme file {filepath} does not contain a 'colors' section."
|
|
357
|
-
)
|
|
324
|
+
raise ValueError(f"Theme file {filepath} does not contain a 'colors' section.")
|
|
358
325
|
|
|
359
326
|
# Map theme colors to syntax categories
|
|
360
|
-
|
|
327
|
+
return {
|
|
361
328
|
"background": theme["colors"]["primary"].get("background", "#161719"),
|
|
362
329
|
"text": theme["colors"]["primary"].get("foreground", "#c5c8c6"),
|
|
363
330
|
"comment": theme["colors"]["normal"].get("black", "#666666"),
|
|
@@ -371,8 +338,6 @@ def load_syntax_theme_from_file(filepath: str) -> dict:
|
|
|
371
338
|
"error": theme["colors"]["bright"].get("red", "#ff5555"),
|
|
372
339
|
}
|
|
373
340
|
|
|
374
|
-
return syntax_theme
|
|
375
|
-
|
|
376
341
|
|
|
377
342
|
def create_rich_syntax_theme(syntax_theme: dict) -> Theme:
|
|
378
343
|
"""Convert a syntax theme dict to a Rich-compatible Theme."""
|
|
@@ -476,6 +441,7 @@ class ThemedAgentResultFormatter:
|
|
|
476
441
|
table = Table(**table_kwargs)
|
|
477
442
|
table.add_column("Output", style=styles["column_output"])
|
|
478
443
|
table.add_column("Value", style=styles["column_value"])
|
|
444
|
+
|
|
479
445
|
for key, value in result.items():
|
|
480
446
|
rich_renderable = create_rich_renderable(
|
|
481
447
|
value,
|
|
@@ -497,58 +463,46 @@ class ThemedAgentResultFormatter:
|
|
|
497
463
|
padding=styles["panel_padding"],
|
|
498
464
|
style=styles["panel_style"],
|
|
499
465
|
)
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
)
|
|
466
|
+
syntax = Syntax(
|
|
467
|
+
s, # The formatted string
|
|
468
|
+
"python", # Highlight as Python (change this for other formats)
|
|
469
|
+
theme=self.syntax_style, # Choose a Rich theme (matches your color setup)
|
|
470
|
+
line_numbers=False,
|
|
471
|
+
)
|
|
472
|
+
return Panel(
|
|
473
|
+
syntax,
|
|
474
|
+
title=agent_name,
|
|
475
|
+
title_align=styles["panel_title_align"],
|
|
476
|
+
border_style=styles["panel_border_style"],
|
|
477
|
+
padding=styles["panel_padding"],
|
|
478
|
+
style=styles["panel_style"],
|
|
479
|
+
)
|
|
515
480
|
|
|
516
|
-
def display_result(self, result:
|
|
481
|
+
def display_result(self, result: list[BaseModel], agent_name: str) -> None:
|
|
517
482
|
"""Print an agent's result using Rich formatting."""
|
|
518
483
|
theme = self.theme
|
|
519
|
-
themes_dir = (
|
|
520
|
-
pathlib.Path(__file__).parent.parent.parent.parent / "themes"
|
|
521
|
-
)
|
|
484
|
+
themes_dir = pathlib.Path(__file__).parent.parent.parent / "themes"
|
|
522
485
|
all_themes = list(themes_dir.glob("*.toml"))
|
|
523
|
-
theme = (
|
|
524
|
-
|
|
525
|
-
if not theme.value.endswith(".toml")
|
|
526
|
-
else theme.value
|
|
527
|
-
)
|
|
528
|
-
theme = (
|
|
529
|
-
pathlib.Path(__file__).parent.parent.parent.parent
|
|
530
|
-
/ "themes"
|
|
531
|
-
/ theme
|
|
532
|
-
)
|
|
486
|
+
theme = theme.value + ".toml" if not theme.value.endswith(".toml") else theme.value
|
|
487
|
+
theme = pathlib.Path(__file__).parent.parent.parent / "themes" / theme
|
|
533
488
|
|
|
534
489
|
if pathlib.Path(theme) not in all_themes:
|
|
535
|
-
raise ValueError(
|
|
536
|
-
f"Invalid theme: {theme}\nAvailable themes: {all_themes}"
|
|
537
|
-
)
|
|
490
|
+
raise ValueError(f"Invalid theme: {theme}\nAvailable themes: {all_themes}")
|
|
538
491
|
|
|
539
492
|
theme_dict = load_theme_from_file(theme)
|
|
540
493
|
|
|
541
494
|
styles = get_default_styles(theme_dict)
|
|
542
495
|
self.styles = styles
|
|
543
|
-
self.syntax_style = create_pygments_syntax_theme(
|
|
544
|
-
load_syntax_theme_from_file(theme)
|
|
545
|
-
)
|
|
496
|
+
self.syntax_style = create_pygments_syntax_theme(load_syntax_theme_from_file(theme))
|
|
546
497
|
|
|
547
498
|
console = Console()
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
499
|
+
for item in result:
|
|
500
|
+
# basemodel to dict
|
|
501
|
+
item = item.model_dump()
|
|
502
|
+
panel = self.format_result(
|
|
503
|
+
result=item,
|
|
504
|
+
agent_name=agent_name,
|
|
505
|
+
theme=theme_dict,
|
|
506
|
+
styles=styles,
|
|
507
|
+
)
|
|
508
|
+
console.print(panel)
|
|
@@ -14,13 +14,12 @@ import logging
|
|
|
14
14
|
import sys
|
|
15
15
|
from typing import Literal
|
|
16
16
|
|
|
17
|
-
from opentelemetry import trace
|
|
18
|
-
|
|
19
17
|
# Always import Temporal workflow (since it's part of the project)
|
|
20
|
-
from temporalio import workflow
|
|
18
|
+
# from temporalio import workflow
|
|
19
|
+
# with workflow.unsafe.imports_passed_through():
|
|
20
|
+
from loguru import logger as loguru_logger
|
|
21
|
+
from opentelemetry import trace
|
|
21
22
|
|
|
22
|
-
with workflow.unsafe.imports_passed_through():
|
|
23
|
-
from loguru import logger as loguru_logger
|
|
24
23
|
|
|
25
24
|
# ENABLED_FLOCK_LOGGER_LEVELS constant removed
|
|
26
25
|
|
|
@@ -42,13 +41,14 @@ def in_workflow_context() -> bool:
|
|
|
42
41
|
It does this by attempting to call workflow.info() and returning True
|
|
43
42
|
if successful. Otherwise, it returns False.
|
|
44
43
|
"""
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
return False
|
|
45
|
+
# try:
|
|
46
|
+
# workflow.logger.debug("Checking if in workflow context...")
|
|
47
|
+
# # loguru_logger.debug("Checking if in workflow context...")
|
|
48
|
+
# # This call will succeed only if we're in a workflow context.
|
|
49
|
+
# return bool(hasattr(workflow.info(), "is_replaying"))
|
|
50
|
+
# except Exception:
|
|
51
|
+
# return False
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def get_current_trace_id() -> str:
|
|
@@ -108,7 +108,7 @@ COLOR_MAP = {
|
|
|
108
108
|
|
|
109
109
|
LOGGERS = [
|
|
110
110
|
"flock", # Core Flock orchestration
|
|
111
|
-
"flock.api",
|
|
111
|
+
"flock.api", # Flock API specific logs
|
|
112
112
|
"agent", # General agent operations
|
|
113
113
|
"context", # Context management
|
|
114
114
|
"registry", # Unified registry operations (new)
|
|
@@ -177,9 +177,7 @@ def custom_format(record):
|
|
|
177
177
|
# MAX_LENGTH = 500 # Example value
|
|
178
178
|
if len(message) > MAX_LENGTH:
|
|
179
179
|
truncated_chars = len(message) - MAX_LENGTH
|
|
180
|
-
message = (
|
|
181
|
-
message[:MAX_LENGTH] + f"<yellow>...+({truncated_chars} chars)</yellow>"
|
|
182
|
-
)
|
|
180
|
+
message = message[:MAX_LENGTH] + f"<yellow>...+({truncated_chars} chars)</yellow>"
|
|
183
181
|
|
|
184
182
|
# Determine if category needs bolding (can refine this logic)
|
|
185
183
|
needs_bold = category in BOLD_CATEGORIES
|
|
@@ -247,7 +245,6 @@ class PrintAndFlushSink:
|
|
|
247
245
|
|
|
248
246
|
Already flushed on every write call.
|
|
249
247
|
"""
|
|
250
|
-
pass
|
|
251
248
|
|
|
252
249
|
|
|
253
250
|
# Configure Loguru for non-workflow (local/worker) contexts.
|
|
@@ -264,7 +261,9 @@ logging.basicConfig(level=LOG_LEVELS["ERROR"]) # Default to ERROR level for fal
|
|
|
264
261
|
# loguru_logger.add("logs/flock.log", rotation="100 MB", retention="30 days", level="DEBUG")
|
|
265
262
|
|
|
266
263
|
|
|
267
|
-
def get_default_severity(
|
|
264
|
+
def get_default_severity(
|
|
265
|
+
level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "NO_LOGS", "SUCCESS"] | int,
|
|
266
|
+
) -> int:
|
|
268
267
|
"""Get the default severity for a given level."""
|
|
269
268
|
if isinstance(level, str):
|
|
270
269
|
level_str = level.upper()
|
|
@@ -272,9 +271,17 @@ def get_default_severity(level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CR
|
|
|
272
271
|
return level
|
|
273
272
|
|
|
274
273
|
|
|
275
|
-
def configure_logging(
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
def configure_logging(
|
|
275
|
+
flock_level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "NO_LOGS", "SUCCESS"]
|
|
276
|
+
| int,
|
|
277
|
+
external_level: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "NO_LOGS", "SUCCESS"]
|
|
278
|
+
| int,
|
|
279
|
+
specific_levels: dict[
|
|
280
|
+
str,
|
|
281
|
+
Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "NO_LOGS", "SUCCESS"] | int,
|
|
282
|
+
]
|
|
283
|
+
| None = None,
|
|
284
|
+
) -> None:
|
|
278
285
|
"""Configure both external and internal Flock logging systems.
|
|
279
286
|
|
|
280
287
|
Args:
|
|
@@ -283,19 +290,21 @@ def configure_logging(flock_level: Literal["DEBUG", "INFO", "WARNING", "ERROR",
|
|
|
283
290
|
specific_levels (dict[str, str | int] | None, optional): A dictionary mapping
|
|
284
291
|
logger names to their specific logging levels. Defaults to None.
|
|
285
292
|
"""
|
|
286
|
-
|
|
293
|
+
global _DEFAULT_FLOCK_SEVERITY, _SPECIFIC_SEVERITIES
|
|
287
294
|
|
|
295
|
+
# Get default severity
|
|
288
296
|
external_severity = get_default_severity(external_level)
|
|
289
297
|
logging.basicConfig(level=external_severity)
|
|
290
298
|
|
|
291
|
-
|
|
292
299
|
flock_severity = get_default_severity(flock_level)
|
|
300
|
+
_DEFAULT_FLOCK_SEVERITY = flock_severity # Store for future loggers
|
|
293
301
|
|
|
294
302
|
specific_severities = {}
|
|
295
303
|
if specific_levels:
|
|
296
304
|
for name, logger_level in specific_levels.items():
|
|
297
305
|
severity = get_default_severity(logger_level)
|
|
298
306
|
specific_severities[name] = severity
|
|
307
|
+
_SPECIFIC_SEVERITIES[name] = severity # Store for future loggers
|
|
299
308
|
|
|
300
309
|
# Apply to all cached loggers
|
|
301
310
|
for logger_name, log_instance in _LOGGER_CACHE.items():
|
|
@@ -306,28 +315,26 @@ def configure_logging(flock_level: Literal["DEBUG", "INFO", "WARNING", "ERROR",
|
|
|
306
315
|
log_instance.min_level_severity = target_severity
|
|
307
316
|
|
|
308
317
|
|
|
309
|
-
|
|
310
|
-
|
|
311
318
|
# Define a dummy logger that does nothing
|
|
312
319
|
class DummyLogger:
|
|
313
320
|
"""A dummy logger that does nothing when called."""
|
|
314
321
|
|
|
315
|
-
def debug(self, *args, **kwargs):
|
|
322
|
+
def debug(self, *args, **kwargs):
|
|
316
323
|
pass
|
|
317
324
|
|
|
318
|
-
def info(self, *args, **kwargs):
|
|
325
|
+
def info(self, *args, **kwargs):
|
|
319
326
|
pass
|
|
320
327
|
|
|
321
|
-
def warning(self, *args, **kwargs):
|
|
328
|
+
def warning(self, *args, **kwargs):
|
|
322
329
|
pass
|
|
323
330
|
|
|
324
|
-
def error(self, *args, **kwargs):
|
|
331
|
+
def error(self, *args, **kwargs):
|
|
325
332
|
pass
|
|
326
333
|
|
|
327
|
-
def exception(self, *args, **kwargs):
|
|
334
|
+
def exception(self, *args, **kwargs):
|
|
328
335
|
pass
|
|
329
336
|
|
|
330
|
-
def success(self, *args, **kwargs):
|
|
337
|
+
def success(self, *args, **kwargs):
|
|
331
338
|
pass
|
|
332
339
|
|
|
333
340
|
|
|
@@ -357,9 +364,9 @@ class FlockLogger:
|
|
|
357
364
|
self.min_level_severity = initial_min_level_severity
|
|
358
365
|
|
|
359
366
|
def _get_logger(self):
|
|
360
|
-
if in_workflow_context():
|
|
361
|
-
|
|
362
|
-
|
|
367
|
+
# if in_workflow_context():
|
|
368
|
+
# # Use Temporal's workflow.logger inside a workflow context.
|
|
369
|
+
# return workflow.logger
|
|
363
370
|
# Bind our logger with category and trace_id
|
|
364
371
|
return loguru_logger.bind(
|
|
365
372
|
name=self.name,
|
|
@@ -371,9 +378,7 @@ class FlockLogger:
|
|
|
371
378
|
"""Truncate a message if it exceeds max_length and add truncation indicator."""
|
|
372
379
|
if len(message) > max_length:
|
|
373
380
|
truncated_chars = len(message) - max_length
|
|
374
|
-
return (
|
|
375
|
-
message[:max_length] + f"...<yellow>+({truncated_chars} chars)</yellow>"
|
|
376
|
-
)
|
|
381
|
+
return message[:max_length] + f"...<yellow>+({truncated_chars} chars)</yellow>"
|
|
377
382
|
return message
|
|
378
383
|
|
|
379
384
|
def debug(
|
|
@@ -385,8 +390,10 @@ class FlockLogger:
|
|
|
385
390
|
**kwargs,
|
|
386
391
|
) -> None:
|
|
387
392
|
current_method_severity = LOG_LEVELS["DEBUG"]
|
|
388
|
-
if
|
|
389
|
-
|
|
393
|
+
if (
|
|
394
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
395
|
+
or current_method_severity < self.min_level_severity
|
|
396
|
+
):
|
|
390
397
|
return
|
|
391
398
|
"""Debug a message.
|
|
392
399
|
|
|
@@ -407,8 +414,10 @@ class FlockLogger:
|
|
|
407
414
|
**kwargs,
|
|
408
415
|
) -> None:
|
|
409
416
|
current_method_severity = LOG_LEVELS["INFO"]
|
|
410
|
-
if
|
|
411
|
-
|
|
417
|
+
if (
|
|
418
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
419
|
+
or current_method_severity < self.min_level_severity
|
|
420
|
+
):
|
|
412
421
|
return
|
|
413
422
|
"""Info a message.
|
|
414
423
|
|
|
@@ -429,8 +438,10 @@ class FlockLogger:
|
|
|
429
438
|
**kwargs,
|
|
430
439
|
) -> None:
|
|
431
440
|
current_method_severity = LOG_LEVELS["WARNING"]
|
|
432
|
-
if
|
|
433
|
-
|
|
441
|
+
if (
|
|
442
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
443
|
+
or current_method_severity < self.min_level_severity
|
|
444
|
+
):
|
|
434
445
|
return
|
|
435
446
|
"""Warning a message.
|
|
436
447
|
|
|
@@ -451,8 +462,10 @@ class FlockLogger:
|
|
|
451
462
|
**kwargs,
|
|
452
463
|
) -> None:
|
|
453
464
|
current_method_severity = LOG_LEVELS["ERROR"]
|
|
454
|
-
if
|
|
455
|
-
|
|
465
|
+
if (
|
|
466
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
467
|
+
or current_method_severity < self.min_level_severity
|
|
468
|
+
):
|
|
456
469
|
return
|
|
457
470
|
"""Error a message.
|
|
458
471
|
|
|
@@ -472,9 +485,11 @@ class FlockLogger:
|
|
|
472
485
|
max_length: int = MAX_LENGTH,
|
|
473
486
|
**kwargs,
|
|
474
487
|
) -> None:
|
|
475
|
-
current_method_severity = LOG_LEVELS["ERROR"]
|
|
476
|
-
if
|
|
477
|
-
|
|
488
|
+
current_method_severity = LOG_LEVELS["ERROR"] # Exception implies ERROR level
|
|
489
|
+
if (
|
|
490
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
491
|
+
or current_method_severity < self.min_level_severity
|
|
492
|
+
):
|
|
478
493
|
return
|
|
479
494
|
"""Exception a message.
|
|
480
495
|
|
|
@@ -495,8 +510,10 @@ class FlockLogger:
|
|
|
495
510
|
**kwargs,
|
|
496
511
|
) -> None:
|
|
497
512
|
current_method_severity = LOG_LEVELS["SUCCESS"]
|
|
498
|
-
if
|
|
499
|
-
|
|
513
|
+
if (
|
|
514
|
+
self.min_level_severity == LOG_LEVELS["NO_LOGS"]
|
|
515
|
+
or current_method_severity < self.min_level_severity
|
|
516
|
+
):
|
|
500
517
|
return
|
|
501
518
|
"""Success a message.
|
|
502
519
|
|
|
@@ -510,21 +527,22 @@ class FlockLogger:
|
|
|
510
527
|
|
|
511
528
|
|
|
512
529
|
_LOGGER_CACHE: dict[str, FlockLogger] = {}
|
|
530
|
+
_DEFAULT_FLOCK_SEVERITY: int = LOG_LEVELS["ERROR"]
|
|
531
|
+
_SPECIFIC_SEVERITIES: dict[str, int] = {}
|
|
513
532
|
|
|
514
533
|
|
|
515
534
|
def get_logger(name: str = "flock") -> FlockLogger:
|
|
516
535
|
"""Return a cached FlockLogger instance for the given name.
|
|
517
536
|
|
|
518
|
-
If the logger doesn't exist, it is created
|
|
519
|
-
|
|
520
|
-
the `configure_logging()` function.
|
|
537
|
+
If the logger doesn't exist, it is created using the configured severity level
|
|
538
|
+
from configure_logging() (default: ERROR). Respects specific_levels if configured.
|
|
521
539
|
If a logger with the given name already exists in the cache, its 'min_level_severity'
|
|
522
540
|
state is NOT modified by this function; it's simply returned.
|
|
523
541
|
"""
|
|
524
542
|
if name not in _LOGGER_CACHE:
|
|
525
|
-
#
|
|
526
|
-
|
|
527
|
-
_LOGGER_CACHE[name] = FlockLogger(name,
|
|
543
|
+
# Check if there's a specific severity configured for this logger
|
|
544
|
+
severity = _SPECIFIC_SEVERITIES.get(name, _DEFAULT_FLOCK_SEVERITY)
|
|
545
|
+
_LOGGER_CACHE[name] = FlockLogger(name, severity)
|
|
528
546
|
# The min_level_severity state of existing or newly created loggers
|
|
529
547
|
# should be managed by the configure_logging() function.
|
|
530
548
|
return _LOGGER_CACHE[name]
|
|
@@ -544,15 +562,13 @@ def truncate_for_logging(obj, max_item_length=100, max_items=10):
|
|
|
544
562
|
"""Truncate large data structures for logging purposes."""
|
|
545
563
|
if isinstance(obj, str) and len(obj) > max_item_length:
|
|
546
564
|
return obj[:max_item_length] + f"... ({len(obj) - max_item_length} more chars)"
|
|
547
|
-
|
|
565
|
+
if isinstance(obj, dict):
|
|
548
566
|
if len(obj) > max_items:
|
|
549
567
|
return {
|
|
550
|
-
k: truncate_for_logging(v)
|
|
551
|
-
for i, (k, v) in enumerate(obj.items())
|
|
552
|
-
if i < max_items
|
|
568
|
+
k: truncate_for_logging(v) for i, (k, v) in enumerate(obj.items()) if i < max_items
|
|
553
569
|
}
|
|
554
570
|
return {k: truncate_for_logging(v) for k, v in obj.items()}
|
|
555
|
-
|
|
571
|
+
if isinstance(obj, list):
|
|
556
572
|
if len(obj) > max_items:
|
|
557
573
|
return [truncate_for_logging(item) for item in obj[:max_items]] + [
|
|
558
574
|
f"... ({len(obj) - max_items} more items)"
|