flock-core 0.2.4__tar.gz → 0.2.6__tar.gz
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_core-0.2.6/.env_template +28 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.gitignore +1 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/PKG-INFO +6 -2
- {flock_core-0.2.4 → flock_core-0.2.6}/README.md +3 -1
- flock_core-0.2.6/docs/architecture.drawio +24 -0
- flock_core-0.2.6/docs/img/component_diagramm.png +0 -0
- flock_core-0.2.6/docs/img/flock_cli.png +0 -0
- flock_core-0.2.6/docs/img/flow_diagramm.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/03_tool_and_code_agent.py +1 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/05_typed_output2.py +3 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/pyproject.toml +6 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/requirements.txt +16 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/__init__.py +3 -0
- flock_core-0.2.6/src/flock/config.py +47 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/flock.py +10 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/flock_agent.py +1 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/pprint_formatter.py +4 -3
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/logging.py +18 -19
- flock_core-0.2.6/src/flock/core/logging/span_middleware/baggage_span_processor.py +31 -0
- flock_core-0.2.6/src/flock/core/logging/telemetry.py +137 -0
- flock_core-0.2.6/src/flock/core/logging/telemetry_exporter/base_exporter.py +38 -0
- flock_core-0.2.6/src/flock/core/logging/telemetry_exporter/file_exporter.py +85 -0
- flock_core-0.2.6/src/flock/core/logging/telemetry_exporter/sqlite_exporter.py +103 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/trace_and_logged.py +5 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/mixin/dspy_integration.py +23 -10
- flock_core-0.2.6/src/flock/core/tools/basic_tools.py +197 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/tools/dev_tools/github.py +0 -33
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/util/input_resolver.py +19 -0
- flock_core-0.2.6/src/flock/interpreter/python_interpreter.py +675 -0
- flock_core-0.2.6/src/flock/platform/docker_tools.py +49 -0
- flock_core-0.2.6/src/flock/platform/jaeger_install.py +86 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/tests/integration/test_agent_integration.py +1 -1
- {flock_core-0.2.4 → flock_core-0.2.6}/uv.lock +220 -174
- flock_core-0.2.4/docs/architecture.md +0 -244
- flock_core-0.2.4/docs/img/flock_cli.png +0 -0
- flock_core-0.2.4/review/analysis.md +0 -134
- flock_core-0.2.4/src/flock/config.py +0 -29
- flock_core-0.2.4/src/flock/core/logging/telemetry.py +0 -109
- flock_core-0.2.4/src/flock/core/logging/telemetry_exporter/file_span.py +0 -37
- flock_core-0.2.4/src/flock/core/logging/telemetry_exporter/sqllite_span.py +0 -68
- flock_core-0.2.4/src/flock/core/tools/basic_tools.py +0 -296
- {flock_core-0.2.4 → flock_core-0.2.6}/.devcontainer/devcontainer.json +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.github/workflows/.gitkeep +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.vscode/launch.json +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.vscode/settings.json +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/.vscode/tasks.json +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/LICENSE +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/agent_mechanics.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/api/flock.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/api/flock_agents.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/api.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/01_simple_example.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/02_typed_output.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/03_tool_and_code_agent.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/04_descriptions.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/05_typed_output2.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/01_introduction/06_simple_hand_off.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/02_cook_book_wip/flock_without_llms.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples/02_cook_book_wip/project_manager.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/examples.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/generate_examples_docs.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/generate_nav.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/cli_outputs/out.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_01.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_02.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_03.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_04.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_05.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/examples/01_06.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/img/flock.png +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/index.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/installation.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/overrides/extra.css +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/docs/overrides/extra.js +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/01_simple_example.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/02_typed_output.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/04_descriptions.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/01_introduction/06_simple_hand_off.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/02_cook_book/flock_without_llms.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/02_cook_book/long_research_no_handoff.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/02_cook_book/project_manager.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/02_cook_book/self_improvement.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/03_misc_wip/formatting/01_pretty_print.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/03_misc_wip/formatting/02_r/303/255ch_table.py" +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/03_misc_wip/formatting/03_themed_table.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/03_misc_wip/logging_examples/01_basic_logging.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/03_misc_wip/logging_examples/02_temporal_logging.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/README.md +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/notebooks_wip/Untitled-1.ipynb +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/examples/notebooks_wip/my_agent.json +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/mkdocs.yml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/__init__.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/context/context.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/context/context_manager.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/context/context_vars.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/execution/local_executor.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/execution/temporal_executor.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/__init__.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/base_formatter.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/formatter_factory.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/rich_formatters.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/theme_builder.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/logging/formatters/themed_formatter.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/mixin/prompt_parser.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/registry/agent_registry.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/util/cli_helper.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/core/util/serializable.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/3024-day.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/3024-night.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/aardvark-blue.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/abernathy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/adventure.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/adventuretime.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/afterglow.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/alabaster.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/alienblood.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/andromeda.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/apple-classic.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/apple-system-colors.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/arcoiris.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/argonaut copy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/argonaut.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/arthur.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ateliersulphurpool.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/atom.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/atom_test.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/atomonelight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/aurora.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ayu copy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ayu-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ayu-mirage.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ayu.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/banana-blueberry.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/batman.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/belafonte-day.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/belafonte-night.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/birdsofparadise.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/blazer.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/blue-matrix.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/blueberrypie.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/bluedolphin.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/blulocodark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/blulocolight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/borland.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/breeze.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/bright-lights.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/broadcast.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/brogrammer.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-pastel-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-solarized-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-solarized-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-tango-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/builtin-tango-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/c64.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/calamity.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/catppuccin-frappe.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/catppuccin-latte.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/catppuccin-macchiato.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/catppuccin-mocha.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cga.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/chalk.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/chalkboard.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/challengerdeep.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/chester.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ciapre.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/clrs.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cobalt-neon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cobalt2.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/coffee-theme.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/crayonponyfish.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cutiepro.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cyberdyne.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cyberpunk.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dark+.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dark-pastel.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/darkermatrix.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/darkmatrix.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/darkside.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dayfox.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/deep.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/desert.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dimidium.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dimmedmonokai.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/django.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/djangorebornagain.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/djangosmooth.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/doom-peacock.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/doomone.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dotgov.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dracula+.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/dracula.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/duckbones.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/duotone-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/earthsong.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/elemental.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/elementary.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/encom.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/espresso-libre.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/espresso.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/everblush.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/fahrenheit.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/fairyfloss.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/farmhouse-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/farmhouse-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/fideloper.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/firefly-traditional.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/firefoxdev.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/firewatch.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/fishtank.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/flat.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/flatland.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/flexoki-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/flexoki-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/floraverse.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/forestblue.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/framer.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/frontenddelight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/funforrest.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/galaxy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/galizur.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/github-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/github.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/glacier.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/grape.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/grass.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/grey-green.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/gruber-darker.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/gruvboxdark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/gruvboxdarkhard.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/gruvboxlight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/guezwhoz.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hacktober.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hardcore.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/harper.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hax0r-blue.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hax0r-gr33n.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hax0r-r3d.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/highway.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hipster-green.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hivacruz.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/homebrew.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hopscotch.256.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hopscotch.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hurtado.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/hybrid.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ic-green-ppl.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ic-orange-ppl.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iceberg-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iceberg-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/idea.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/idletoes.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ir-black.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-dark-background.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-default.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-light-background.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-smoooooth.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-solarized-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-tango-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/iterm2-tango-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/jackie-brown.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/japanesque.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/jellybeans.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/jetbrains-darcula.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/jubi.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/kanagawabones.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/kibble.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/kolorit.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/konsolas.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/kurokula.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/lab-fox.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/laser.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/later-this-evening.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/lavandula.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/liquidcarbon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/liquidcarbontransparent.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/lovelace.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/man-page.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/mariana.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/material.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/materialdark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/materialdarker.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/materialdesigncolors.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/materialocean.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/mathias.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/matrix.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/medallion.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/mellifluous.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/midnight-in-mojave.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/mirage.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/misterioso.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/molokai.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/monalisa.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/monokai-remastered.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/monokai-soda.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/monokai-vivid.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/n0tch2k.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/neobones-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/neobones-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/neon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/neopolitan.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/neutron.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/night-owlish-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nightfox.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nightlion-v1.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nightlion-v2.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/niji.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nocturnal-winter.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nord-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nord.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/novel.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nvimdark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/nvimlight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/obsidian.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ocean.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/oceanic-next.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/oceanicmaterial.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ollie.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/onehalfdark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/onehalflight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/operator-mono-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/overnight-slumber.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/oxocarbon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/palenighthc.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pandora.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/paraiso-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/paulmillr.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pencildark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pencillight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/peppermint.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/piatto-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pnevma.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/popping-and-locking.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/primary.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pro-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/pro.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/purple-rain.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/purplepeter.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rapture.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/raycast-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/raycast-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rebecca.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/red-alert.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/red-planet.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/red-sands.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/relaxed.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/retro.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rippedcasts.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rose-pine-dawn.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rose-pine-moon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rose-pine.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/rouge-2.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/royal.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ryuuko.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/sakura.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/scarlet-protocol.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/seafoam-pastel.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/seashells.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/seoulbones-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/seoulbones-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/seti.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/shades-of-purple.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/shaman.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/slate.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/sleepyhollow.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/smyck.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/snazzy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/softserver.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/solarized-darcula.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/solarized-dark---patched.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spacedust.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spacegray-eighties.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spacegray.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spiderman.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/spring.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/square.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/sublette.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/subliminal.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/sugarplum.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/sundried.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/symfonic.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/synthwave-everything.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/synthwave.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/synthwavealpha.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tango-adapted.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tango-half-adapted.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/teerb.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/terafox.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/terminal-basic.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/thayer-bright.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/the-hulk.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tinacious-design-(dark).toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tinacious-design-(light).toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tokyonight-day.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tokyonight-storm.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tokyonight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow-night-blue.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow-night-bright.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow-night-burns.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow-night.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/tomorrow.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/toychest.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/treehouse.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/twilight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ubuntu.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ultradark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/ultraviolent.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/underthesea.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/unikitty.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/urple.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/vaughn.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/vesper.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/vibrantink.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/vimbones.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/violet-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/violet-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/warmneon.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/wez.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/whimsy.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/wildcherry.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/wilmersdorf.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/wombat.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/wryan.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/xcodedark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/xcodedarkhc.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/xcodelight.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/xcodelighthc.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/xcodewwdc.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenbones-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenbones-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenbones.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenburn.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenburned.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenwritten-dark.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/themes/zenwritten-light.toml +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/workflow/__init__.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/workflow/activities.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/workflow/agent_activities.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/workflow/temporal_setup.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/src/flock/workflow/workflow.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/tests/unittests/test_flock.py +0 -0
- {flock_core-0.2.4 → flock_core-0.2.6}/tests/unittests/test_flock_agent.py +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Main Config
|
|
2
|
+
|
|
3
|
+
# Your LLM Service Keys
|
|
4
|
+
OPENAI_API_KEY=sk-proj-...
|
|
5
|
+
|
|
6
|
+
# Logging/Telemetry
|
|
7
|
+
|
|
8
|
+
LOCAL_DEBUG = true
|
|
9
|
+
LOG_LEVEL = Debug
|
|
10
|
+
|
|
11
|
+
OTEL_SERVICE_NAME = "flock"
|
|
12
|
+
OTEL_JAEGER_ENDPOINT = "http://localhost:14268/api/traces"
|
|
13
|
+
OTEL_JAEGER_TRANSPORT = "http"
|
|
14
|
+
OTEL_SQL_PATH = "sqlite:///otel.db"
|
|
15
|
+
OTEL_FILE_PATH = "telemetry.json"
|
|
16
|
+
OTEL_ENABLE_SQL = false
|
|
17
|
+
OTEL_ENABLE_FILE = true
|
|
18
|
+
OTEL_ENABLE_JAEGER = false
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Tools
|
|
22
|
+
|
|
23
|
+
GITHUB_PAT=github_pat...
|
|
24
|
+
GITHUB_REPO=
|
|
25
|
+
GITHUB_USERNAME=
|
|
26
|
+
|
|
27
|
+
TAVILY_API_KEY=tvly-...
|
|
28
|
+
SERPER_API_KEY=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flock-core
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Declarative LLM Orchestration at Scale
|
|
5
5
|
Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -11,6 +11,7 @@ Requires-Python: >=3.10
|
|
|
11
11
|
Requires-Dist: cloudpickle>=3.1.1
|
|
12
12
|
Requires-Dist: devtools>=0.12.2
|
|
13
13
|
Requires-Dist: dspy==2.5.42
|
|
14
|
+
Requires-Dist: duckduckgo-search>=7.3.2
|
|
14
15
|
Requires-Dist: httpx>=0.28.1
|
|
15
16
|
Requires-Dist: loguru>=0.7.3
|
|
16
17
|
Requires-Dist: msgpack>=1.1.0
|
|
@@ -22,6 +23,7 @@ Requires-Dist: opentelemetry-instrumentation-logging>=0.51b0
|
|
|
22
23
|
Requires-Dist: opentelemetry-sdk>=1.30.0
|
|
23
24
|
Requires-Dist: pydantic>=2.10.5
|
|
24
25
|
Requires-Dist: python-box>=7.3.2
|
|
26
|
+
Requires-Dist: python-decouple>=3.8
|
|
25
27
|
Requires-Dist: rich>=13.9.4
|
|
26
28
|
Requires-Dist: temporalio>=1.9.0
|
|
27
29
|
Requires-Dist: toml>=0.10.2
|
|
@@ -36,7 +38,9 @@ Description-Content-Type: text/markdown
|
|
|
36
38
|
|
|
37
39
|
<p align="center">
|
|
38
40
|
<img src="docs/img/flock.png" width="600"><br>
|
|
39
|
-
<img alt="Dynamic TOML Badge" src="https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fwhiteducksoftware%2Fflock%2Frefs%2Fheads%
|
|
41
|
+
<img alt="Dynamic TOML Badge" src="https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fwhiteducksoftware%2Fflock%2Frefs%2Fheads%2Fmaster%2Fpyproject.toml&query=%24.project.version&style=for-the-badge&logo=pypi&label=pip%20version">
|
|
42
|
+
<img alt="X (formerly Twitter) Follow" src="https://img.shields.io/twitter/follow/whiteduck_gmbh?style=for-the-badge&logo=X">
|
|
43
|
+
|
|
40
44
|
|
|
41
45
|
|
|
42
46
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<p align="center">
|
|
2
2
|
<img src="docs/img/flock.png" width="600"><br>
|
|
3
|
-
<img alt="Dynamic TOML Badge" src="https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fwhiteducksoftware%2Fflock%2Frefs%2Fheads%
|
|
3
|
+
<img alt="Dynamic TOML Badge" src="https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fwhiteducksoftware%2Fflock%2Frefs%2Fheads%2Fmaster%2Fpyproject.toml&query=%24.project.version&style=for-the-badge&logo=pypi&label=pip%20version">
|
|
4
|
+
<img alt="X (formerly Twitter) Follow" src="https://img.shields.io/twitter/follow/whiteduck_gmbh?style=for-the-badge&logo=X">
|
|
5
|
+
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<mxfile host="65bd71144e">
|
|
2
|
+
<diagram id="iQ7YuHOuaVDECIdskFDT" name="Page-1">
|
|
3
|
+
<mxGraphModel grid="0" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="850" pageHeight="1100" background="light-dark(#FFFFFF, #d8cfb1)" math="0" shadow="1">
|
|
4
|
+
<root>
|
|
5
|
+
<mxCell id="0"/>
|
|
6
|
+
<mxCell id="1" parent="0"/>
|
|
7
|
+
<mxCell id="2" value="sequenceDiagram
 participant Client
 participant Flock
 participant FlockAgent
 participant Registry
 participant Context
 participant LLM
 
 Client->>Flock: run_async(agent, input)
 Flock->>Registry: get_agent(name)
 Registry-->>Flock: agent instance
 
 Flock->>Context: initialize_context(agent, input)
 
 Flock->>FlockAgent: run(inputs)
 activate FlockAgent
 
 FlockAgent->>FlockAgent: initialize(inputs)
 FlockAgent->>FlockAgent: _evaluate(inputs)
 
 FlockAgent->>LLM: process with tools/prompts
 LLM-->>FlockAgent: response
 
 FlockAgent->>FlockAgent: terminate(inputs, result)
 FlockAgent-->>Flock: result
 deactivate FlockAgent
 
 Flock-->>Client: final result" style="shadow=0;dashed=0;align=left;strokeWidth=1;shape=mxgraph.mermaid.abstract.mermaid;labelBackgroundColor=#ffffff;noLabel=1;theme=default;" vertex="1" parent="1">
|
|
8
|
+
<mxGeometry x="271" y="360" width="300" height="300" as="geometry"/>
|
|
9
|
+
</mxCell>
|
|
10
|
+
</root>
|
|
11
|
+
</mxGraphModel>
|
|
12
|
+
</diagram>
|
|
13
|
+
<diagram id="mQwFuZfSuTjpqv4SXbYC" name="Page-2">
|
|
14
|
+
<mxGraphModel dx="354" dy="259" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="light-dark(#FFFFFF, #ffffde)" math="0" shadow="1">
|
|
15
|
+
<root>
|
|
16
|
+
<mxCell id="0"/>
|
|
17
|
+
<mxCell id="1" parent="0"/>
|
|
18
|
+
<mxCell id="gh-ZxXSGDDD0mwRwWCxR-1" value="graph TD
 subgraph Client Application
 client[Client Code]
 end

 subgraph Flock Framework
 orchestrator[Flock Orchestrator]
 registry[Agent Registry]
 context[Context Manager]
 
 subgraph Agents
 base[FlockAgent Base]

 end
 
 subgraph Execution
 local[Local Executor]
 temporal[Temporal Executor]
 end
 
 subgraph Core Services
 logging[Logging System]
 tools[Tool Registry]
 formatter[Output Formatters]
 end
 end

 subgraph External Services
 llm[Language Models]
 temporal_server[Temporal Server]
 end

 %% Client interactions
 client --> orchestrator
 
 %% Orchestrator relations
 orchestrator --> registry
 orchestrator --> context
 orchestrator --> local
 orchestrator --> temporal
 
 %% Agent relations
 base --> tools
 base --> logging
 base --> formatter

 
 %% Execution relations
 local --> llm
 temporal --> temporal_server
 temporal_server --> llm
 
 %% Registry relations
 registry --> base
 registry --> tools

 %% Style
 classDef default fill:#f9f9f9,stroke:#333,stroke-width:2px;
 classDef external fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
 classDef core fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px;
 
 class llm,temporal_server external;
 class orchestrator,registry,context,base,local,temporal core;" style="shadow=0;dashed=0;align=left;strokeWidth=1;shape=mxgraph.mermaid.abstract.mermaid;labelBackgroundColor=#ffffff;noLabel=1;theme=default;" vertex="1" parent="1">
|
|
19
|
+
<mxGeometry x="274" y="325" width="300" height="300" as="geometry"/>
|
|
20
|
+
</mxCell>
|
|
21
|
+
</root>
|
|
22
|
+
</mxGraphModel>
|
|
23
|
+
</diagram>
|
|
24
|
+
</mxfile>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -52,7 +52,7 @@ async def main():
|
|
|
52
52
|
name="my_celebrity_age_agent",
|
|
53
53
|
input="a_person",
|
|
54
54
|
output="persons_age_in_days",
|
|
55
|
-
tools=[basic_tools.
|
|
55
|
+
tools=[basic_tools.web_search_duckduckgo, basic_tools.code_eval],
|
|
56
56
|
use_cache=True,
|
|
57
57
|
)
|
|
58
58
|
flock.add_agent(agent)
|
|
@@ -39,6 +39,8 @@ class RandomPerson:
|
|
|
39
39
|
favorite_movie: str
|
|
40
40
|
short_bio: str
|
|
41
41
|
|
|
42
|
+
RandomUserList = list[RandomPerson]
|
|
43
|
+
|
|
42
44
|
async def main():
|
|
43
45
|
|
|
44
46
|
flock = Flock(local_debug=True)
|
|
@@ -53,7 +55,7 @@ async def main():
|
|
|
53
55
|
people_agent = FlockAgent(
|
|
54
56
|
name="people_agent",
|
|
55
57
|
input="amount_of_people",
|
|
56
|
-
output="random_user_list:
|
|
58
|
+
output="random_user_list: RandomUserList",
|
|
57
59
|
use_cache=True,
|
|
58
60
|
)
|
|
59
61
|
flock.add_agent(people_agent)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "flock-core"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.6"
|
|
4
4
|
description = "Declarative LLM Orchestration at Scale"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -16,6 +16,7 @@ dependencies = [
|
|
|
16
16
|
"cloudpickle>=3.1.1",
|
|
17
17
|
"devtools>=0.12.2",
|
|
18
18
|
"dspy==2.5.42",
|
|
19
|
+
"duckduckgo-search>=7.3.2",
|
|
19
20
|
"httpx>=0.28.1",
|
|
20
21
|
"loguru>=0.7.3",
|
|
21
22
|
"msgpack>=1.1.0",
|
|
@@ -27,6 +28,7 @@ dependencies = [
|
|
|
27
28
|
"opentelemetry-sdk>=1.30.0",
|
|
28
29
|
"pydantic>=2.10.5",
|
|
29
30
|
"python-box>=7.3.2",
|
|
31
|
+
"python-decouple>=3.8",
|
|
30
32
|
"rich>=13.9.4",
|
|
31
33
|
"temporalio>=1.9.0",
|
|
32
34
|
"toml>=0.10.2",
|
|
@@ -65,6 +67,9 @@ build-backend = "hatchling.build"
|
|
|
65
67
|
[tool.hatch.build.targets.wheel]
|
|
66
68
|
packages = ["src/flock"]
|
|
67
69
|
|
|
70
|
+
[project.scripts]
|
|
71
|
+
flock = "flock:main"
|
|
72
|
+
|
|
68
73
|
|
|
69
74
|
[tool.ruff]
|
|
70
75
|
cache-dir = ".cache/ruff"
|
|
@@ -6,16 +6,32 @@ devtools==0.12.2
|
|
|
6
6
|
# via flock-core (./pyproject.toml)
|
|
7
7
|
dspy==2.5.42
|
|
8
8
|
# via flock-core (./pyproject.toml)
|
|
9
|
+
duckduckgo-search==7.3.2
|
|
10
|
+
# via flock-core (./pyproject.toml)
|
|
9
11
|
httpx==0.28.1
|
|
10
12
|
# via flock-core (./pyproject.toml)
|
|
11
13
|
loguru==0.7.3
|
|
12
14
|
# via flock-core (./pyproject.toml)
|
|
13
15
|
msgpack==1.1.0
|
|
14
16
|
# via flock-core (./pyproject.toml)
|
|
17
|
+
opentelemetry-api==1.30.0
|
|
18
|
+
# via flock-core (./pyproject.toml)
|
|
19
|
+
opentelemetry-exporter-jaeger==1.21.0
|
|
20
|
+
# via flock-core (./pyproject.toml)
|
|
21
|
+
opentelemetry-exporter-jaeger-proto-grpc==1.21.0
|
|
22
|
+
# via flock-core (./pyproject.toml)
|
|
23
|
+
opentelemetry-exporter-otlp==1.30.0
|
|
24
|
+
# via flock-core (./pyproject.toml)
|
|
25
|
+
opentelemetry-instrumentation-logging==0.51b0
|
|
26
|
+
# via flock-core (./pyproject.toml)
|
|
27
|
+
opentelemetry-sdk==1.30.0
|
|
28
|
+
# via flock-core (./pyproject.toml)
|
|
15
29
|
pydantic==2.10.6
|
|
16
30
|
# via flock-core (./pyproject.toml)
|
|
17
31
|
python-box==7.3.2
|
|
18
32
|
# via flock-core (./pyproject.toml)
|
|
33
|
+
python-decouple==3.8
|
|
34
|
+
# via flock-core (./pyproject.toml)
|
|
19
35
|
rich==13.9.4
|
|
20
36
|
# via flock-core (./pyproject.toml)
|
|
21
37
|
temporalio==1.9.0
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# flock/config.py
|
|
2
|
+
from decouple import config
|
|
3
|
+
|
|
4
|
+
from flock.core.logging.telemetry import TelemetryConfig
|
|
5
|
+
|
|
6
|
+
# -- Connection and External Service Configurations --
|
|
7
|
+
TEMPORAL_SERVER_URL = config("TEMPORAL_SERVER_URL", "localhost:7233")
|
|
8
|
+
DEFAULT_MODEL = config("DEFAULT_MODEL", "openai/gpt-4o")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# API Keys and related settings
|
|
12
|
+
TAVILY_API_KEY = config("TAVILY_API_KEY", "")
|
|
13
|
+
GITHUB_PAT = config("GITHUB_PAT", "")
|
|
14
|
+
GITHUB_REPO = config("GITHUB_REPO", "")
|
|
15
|
+
GITHUB_USERNAME = config("GITHUB_USERNAME", "")
|
|
16
|
+
|
|
17
|
+
# -- Debugging and Logging Configurations --
|
|
18
|
+
LOCAL_DEBUG = config("LOCAL_DEBUG", True)
|
|
19
|
+
LOG_LEVEL = config("LOG_LEVEL", "DEBUG")
|
|
20
|
+
LOGGING_DIR = config("LOGGING_DIR", "logs")
|
|
21
|
+
|
|
22
|
+
OTEL_SERVICE_NAME = config("OTL_SERVICE_NAME", "otel-flock")
|
|
23
|
+
JAEGER_ENDPOINT = config(
|
|
24
|
+
"JAEGER_ENDPOINT", "http://localhost:14268/api/traces"
|
|
25
|
+
) # Default gRPC endpoint for Jaeger
|
|
26
|
+
JAEGER_TRANSPORT = config(
|
|
27
|
+
"JAEGER_TRANSPORT", "http"
|
|
28
|
+
).lower() # Options: "grpc" or "http"
|
|
29
|
+
OTEL_SQL_DATABASE_NAME = config("OTEL_SQL_DATABASE", "flock_events.db")
|
|
30
|
+
OTEL_FILE_NAME = config("OTEL_FILE_NAME", "flock_events.jsonl")
|
|
31
|
+
OTEL_ENABLE_SQL: bool = config("OTEL_ENABLE_SQL", True) == "True"
|
|
32
|
+
OTEL_ENABLE_FILE: bool = config("OTEL_ENABLE_FILE", True) == "True"
|
|
33
|
+
OTEL_ENABLE_JAEGER: bool = config("OTEL_ENABLE_JAEGER", True) == "True"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
TELEMETRY = TelemetryConfig(
|
|
37
|
+
OTEL_SERVICE_NAME,
|
|
38
|
+
JAEGER_ENDPOINT,
|
|
39
|
+
JAEGER_TRANSPORT,
|
|
40
|
+
LOGGING_DIR,
|
|
41
|
+
OTEL_FILE_NAME,
|
|
42
|
+
OTEL_SQL_DATABASE_NAME,
|
|
43
|
+
OTEL_ENABLE_JAEGER,
|
|
44
|
+
OTEL_ENABLE_FILE,
|
|
45
|
+
OTEL_ENABLE_SQL,
|
|
46
|
+
)
|
|
47
|
+
TELEMETRY.setup_tracing()
|
|
@@ -5,7 +5,7 @@ import uuid
|
|
|
5
5
|
from typing import TypeVar
|
|
6
6
|
|
|
7
7
|
from opentelemetry import trace
|
|
8
|
-
from
|
|
8
|
+
from opentelemetry.baggage import get_baggage, set_baggage
|
|
9
9
|
|
|
10
10
|
from flock.core.context.context import FlockContext
|
|
11
11
|
from flock.core.context.context_manager import initialize_context
|
|
@@ -63,6 +63,11 @@ class Flock:
|
|
|
63
63
|
enable_logging=enable_logging,
|
|
64
64
|
)
|
|
65
65
|
logger.enable_logging = enable_logging
|
|
66
|
+
session_id = get_baggage("session_id")
|
|
67
|
+
if not session_id:
|
|
68
|
+
session_id = str(uuid.uuid4())
|
|
69
|
+
set_baggage("session_id", session_id)
|
|
70
|
+
span.set_attribute("session_id", get_baggage("session_id"))
|
|
66
71
|
|
|
67
72
|
display_banner()
|
|
68
73
|
|
|
@@ -193,12 +198,16 @@ class Flock:
|
|
|
193
198
|
run_id = f"{start_agent.name}_{uuid.uuid4().hex[:4]}"
|
|
194
199
|
logger.debug("Generated run ID", run_id=run_id)
|
|
195
200
|
|
|
201
|
+
set_baggage("run_id", run_id)
|
|
202
|
+
|
|
196
203
|
# TODO - Add a check for required input keys
|
|
197
204
|
input_keys = top_level_to_keys(start_agent.input)
|
|
198
205
|
for key in input_keys:
|
|
199
206
|
if key.startswith("flock."):
|
|
200
207
|
key = key[6:] # Remove the "flock." prefix
|
|
201
208
|
if key not in input:
|
|
209
|
+
from rich.prompt import Prompt
|
|
210
|
+
|
|
202
211
|
input[key] = Prompt.ask(
|
|
203
212
|
f"Please enter {key} for {start_agent.name}"
|
|
204
213
|
)
|
|
@@ -151,7 +151,7 @@ class FlockAgent(BaseModel, ABC, PromptParserMixin, DSPyIntegrationMixin):
|
|
|
151
151
|
),
|
|
152
152
|
)
|
|
153
153
|
|
|
154
|
-
tools: list[Callable[..., Any]] | None = Field(
|
|
154
|
+
tools: list[Callable[..., Any] | Any] | None = Field(
|
|
155
155
|
default=None,
|
|
156
156
|
description="An optional list of callable tools that the agent can leverage during execution.",
|
|
157
157
|
)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from typing import Any
|
|
3
2
|
|
|
4
3
|
from flock.core.logging.formatters.base_formatter import BaseFormatter
|
|
@@ -10,12 +9,14 @@ class PrettyPrintFormatter(BaseFormatter):
|
|
|
10
9
|
) -> None:
|
|
11
10
|
"""Print an agent's result using Rich formatting."""
|
|
12
11
|
from rich.console import Console
|
|
13
|
-
from rich.json import JSON
|
|
14
12
|
|
|
15
13
|
console = Console()
|
|
16
14
|
|
|
17
15
|
console.print(agent_name)
|
|
18
|
-
console.print(
|
|
16
|
+
console.print(str(result), markup=True)
|
|
17
|
+
# try:
|
|
18
|
+
# console.print(JSON(json.dumps(result)))
|
|
19
|
+
# except Exception:
|
|
19
20
|
|
|
20
21
|
def display_data(self, data: dict[str, Any], **kwargs) -> None:
|
|
21
22
|
"""Print an agent's result using Rich formatting."""
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# File: src/flock/core/logging.py
|
|
2
|
-
"""A unified logging module for Flock that works both in local/worker contexts
|
|
3
|
-
and inside Temporal workflows.
|
|
2
|
+
"""A unified logging module for Flock that works both in local/worker contexts and inside Temporal workflows.
|
|
4
3
|
|
|
5
4
|
Key points:
|
|
6
5
|
- We always have Temporal imported, so we cannot decide based on import.
|
|
@@ -24,6 +23,7 @@ with workflow.unsafe.imports_passed_through():
|
|
|
24
23
|
|
|
25
24
|
def in_workflow_context() -> bool:
|
|
26
25
|
"""Returns True if this code is running inside a Temporal workflow context.
|
|
26
|
+
|
|
27
27
|
It does this by attempting to call workflow.info() and returning True
|
|
28
28
|
if successful. Otherwise, it returns False.
|
|
29
29
|
"""
|
|
@@ -31,10 +31,7 @@ def in_workflow_context() -> bool:
|
|
|
31
31
|
workflow.logger.debug("Checking if in workflow context...")
|
|
32
32
|
# loguru_logger.debug("Checking if in workflow context...")
|
|
33
33
|
# This call will succeed only if we're in a workflow context.
|
|
34
|
-
|
|
35
|
-
return True
|
|
36
|
-
else:
|
|
37
|
-
return False
|
|
34
|
+
return bool(hasattr(workflow.info(), "is_replaying"))
|
|
38
35
|
except Exception:
|
|
39
36
|
return False
|
|
40
37
|
|
|
@@ -67,22 +64,24 @@ loguru_logger.add(
|
|
|
67
64
|
|
|
68
65
|
# Define a dummy logger that does nothing
|
|
69
66
|
class DummyLogger:
|
|
70
|
-
|
|
67
|
+
"""A dummy logger that does nothing when called."""
|
|
68
|
+
|
|
69
|
+
def debug(self, *args, **kwargs): # noqa: D102
|
|
71
70
|
pass
|
|
72
71
|
|
|
73
|
-
def info(self, *args, **kwargs):
|
|
72
|
+
def info(self, *args, **kwargs): # noqa: D102
|
|
74
73
|
pass
|
|
75
74
|
|
|
76
|
-
def warning(self, *args, **kwargs):
|
|
75
|
+
def warning(self, *args, **kwargs): # noqa: D102
|
|
77
76
|
pass
|
|
78
77
|
|
|
79
|
-
def error(self, *args, **kwargs):
|
|
78
|
+
def error(self, *args, **kwargs): # noqa: D102
|
|
80
79
|
pass
|
|
81
80
|
|
|
82
|
-
def exception(self, *args, **kwargs):
|
|
81
|
+
def exception(self, *args, **kwargs): # noqa: D102
|
|
83
82
|
pass
|
|
84
83
|
|
|
85
|
-
def success(self, *args, **kwargs):
|
|
84
|
+
def success(self, *args, **kwargs): # noqa: D102
|
|
86
85
|
pass
|
|
87
86
|
|
|
88
87
|
|
|
@@ -92,7 +91,7 @@ dummy_logger = DummyLogger()
|
|
|
92
91
|
class FlockLogger:
|
|
93
92
|
"""A unified logger that selects the appropriate logging mechanism based on context.
|
|
94
93
|
|
|
95
|
-
- If running in a workflow context, it uses Temporal's built
|
|
94
|
+
- If running in a workflow context, it uses Temporal's built-in logger.
|
|
96
95
|
Additionally, if workflow.info().is_replaying is True, it suppresses debug/info/warning logs.
|
|
97
96
|
- Otherwise, it uses Loguru.
|
|
98
97
|
"""
|
|
@@ -114,22 +113,22 @@ class FlockLogger:
|
|
|
114
113
|
trace_id=get_current_trace_id(),
|
|
115
114
|
)
|
|
116
115
|
|
|
117
|
-
def debug(self, message: str, *args, **kwargs):
|
|
116
|
+
def debug(self, message: str, *args, **kwargs): # noqa: D102
|
|
118
117
|
self._get_logger().debug(message, *args, **kwargs)
|
|
119
118
|
|
|
120
|
-
def info(self, message: str, *args, **kwargs):
|
|
119
|
+
def info(self, message: str, *args, **kwargs): # noqa: D102
|
|
121
120
|
self._get_logger().info(message, *args, **kwargs)
|
|
122
121
|
|
|
123
|
-
def warning(self, message: str, *args, **kwargs):
|
|
122
|
+
def warning(self, message: str, *args, **kwargs): # noqa: D102
|
|
124
123
|
self._get_logger().warning(message, *args, **kwargs)
|
|
125
124
|
|
|
126
|
-
def error(self, message: str, *args, **kwargs):
|
|
125
|
+
def error(self, message: str, *args, **kwargs): # noqa: D102
|
|
127
126
|
self._get_logger().error(message, *args, **kwargs)
|
|
128
127
|
|
|
129
|
-
def exception(self, message: str, *args, **kwargs):
|
|
128
|
+
def exception(self, message: str, *args, **kwargs): # noqa: D102
|
|
130
129
|
self._get_logger().exception(message, *args, **kwargs)
|
|
131
130
|
|
|
132
|
-
def success(self, message: str, *args, **kwargs):
|
|
131
|
+
def success(self, message: str, *args, **kwargs): # noqa: D102
|
|
133
132
|
self._get_logger().success(message, *args, **kwargs)
|
|
134
133
|
|
|
135
134
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from opentelemetry.baggage import get_baggage
|
|
2
|
+
from opentelemetry.sdk.trace import SpanProcessor
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class BaggageAttributeSpanProcessor(SpanProcessor):
|
|
6
|
+
"""A custom span processor that, on span start, inspects the baggage items from the parent context
|
|
7
|
+
and attaches specified baggage keys as attributes on the span.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
def __init__(self, baggage_keys=None):
|
|
11
|
+
# baggage_keys: list of baggage keys to attach to spans (e.g. ["session_id", "run_id"])
|
|
12
|
+
if baggage_keys is None:
|
|
13
|
+
baggage_keys = []
|
|
14
|
+
self.baggage_keys = baggage_keys
|
|
15
|
+
|
|
16
|
+
def on_start(self, span, parent_context):
|
|
17
|
+
# For each desired key, look up its value in the parent context baggage and set it as an attribute.
|
|
18
|
+
for key in self.baggage_keys:
|
|
19
|
+
value = get_baggage(key, context=parent_context)
|
|
20
|
+
if value is not None:
|
|
21
|
+
span.set_attribute(key, value)
|
|
22
|
+
|
|
23
|
+
def on_end(self, span):
|
|
24
|
+
# No action required on span end for this processor.
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
def shutdown(self):
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
def force_flush(self, timeout_millis: int = 30000):
|
|
31
|
+
pass
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""This module sets up OpenTelemetry tracing for a service."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from opentelemetry import trace
|
|
6
|
+
from opentelemetry.sdk.resources import Resource
|
|
7
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
8
|
+
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
|
9
|
+
from temporalio import workflow
|
|
10
|
+
|
|
11
|
+
from flock.core.logging.span_middleware.baggage_span_processor import (
|
|
12
|
+
BaggageAttributeSpanProcessor,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
with workflow.unsafe.imports_passed_through():
|
|
16
|
+
from flock.core.logging.telemetry_exporter.file_exporter import (
|
|
17
|
+
FileSpanExporter,
|
|
18
|
+
)
|
|
19
|
+
from flock.core.logging.telemetry_exporter.sqlite_exporter import (
|
|
20
|
+
SqliteTelemetryExporter,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TelemetryConfig:
|
|
25
|
+
"""This configuration class sets up OpenTelemetry tracing.
|
|
26
|
+
|
|
27
|
+
- Export spans to a Jaeger collector using gRPC.
|
|
28
|
+
- Write spans to a file.
|
|
29
|
+
- Save spans in a SQLite database.
|
|
30
|
+
|
|
31
|
+
Only exporters with a non-None configuration will be activated.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
service_name: str,
|
|
37
|
+
jaeger_endpoint: str | None = None,
|
|
38
|
+
jaeger_transport: str = "grpc",
|
|
39
|
+
local_logging_dir: str | None = None,
|
|
40
|
+
file_export_name: str | None = None,
|
|
41
|
+
sqlite_db_name: str | None = None,
|
|
42
|
+
enable_jaeger: bool = True,
|
|
43
|
+
enable_file: bool = True,
|
|
44
|
+
enable_sql: bool = True,
|
|
45
|
+
batch_processor_options: dict | None = None,
|
|
46
|
+
):
|
|
47
|
+
""":param service_name: Name of your service.
|
|
48
|
+
|
|
49
|
+
:param jaeger_endpoint: The Jaeger collector gRPC endpoint (e.g., "localhost:14250").
|
|
50
|
+
:param file_export_path: If provided, spans will be written to this file.
|
|
51
|
+
:param sqlite_db_path: If provided, spans will be stored in this SQLite DB.
|
|
52
|
+
:param batch_processor_options: Dict of options for BatchSpanProcessor (e.g., {"max_export_batch_size": 10}).
|
|
53
|
+
"""
|
|
54
|
+
self.service_name = service_name
|
|
55
|
+
self.jaeger_endpoint = jaeger_endpoint
|
|
56
|
+
self.jaeger_transport = jaeger_transport
|
|
57
|
+
self.file_export_name = file_export_name
|
|
58
|
+
self.sqlite_db_name = sqlite_db_name
|
|
59
|
+
self.local_logging_dir = local_logging_dir
|
|
60
|
+
self.batch_processor_options = batch_processor_options or {}
|
|
61
|
+
self.enable_jaeger = enable_jaeger
|
|
62
|
+
self.enable_file = enable_file
|
|
63
|
+
self.enable_sql = enable_sql
|
|
64
|
+
|
|
65
|
+
def setup_tracing(self):
|
|
66
|
+
"""Set up OpenTelemetry tracing with the specified exporters."""
|
|
67
|
+
# Create a Resource with the service name.
|
|
68
|
+
resource = Resource(attributes={"service.name": self.service_name})
|
|
69
|
+
provider = TracerProvider(resource=resource)
|
|
70
|
+
trace.set_tracer_provider(provider)
|
|
71
|
+
|
|
72
|
+
# List to collect our span processors.
|
|
73
|
+
span_processors = []
|
|
74
|
+
|
|
75
|
+
# If a Jaeger endpoint is specified, add the Jaeger exporter.
|
|
76
|
+
if self.jaeger_endpoint and self.enable_jaeger:
|
|
77
|
+
if self.jaeger_transport == "grpc":
|
|
78
|
+
from opentelemetry.exporter.jaeger.proto.grpc import (
|
|
79
|
+
JaegerExporter,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
jaeger_exporter = JaegerExporter(
|
|
83
|
+
endpoint=self.jaeger_endpoint,
|
|
84
|
+
insecure=True,
|
|
85
|
+
)
|
|
86
|
+
elif self.jaeger_transport == "http":
|
|
87
|
+
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
|
|
88
|
+
|
|
89
|
+
jaeger_exporter = JaegerExporter(
|
|
90
|
+
collector_endpoint=self.jaeger_endpoint,
|
|
91
|
+
)
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError(
|
|
94
|
+
"Invalid JAEGER_TRANSPORT specified. Use 'grpc' or 'http'."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
span_processors.append(SimpleSpanProcessor(jaeger_exporter))
|
|
98
|
+
|
|
99
|
+
# If a file path is provided, add the custom file exporter.
|
|
100
|
+
if self.file_export_name and self.enable_file:
|
|
101
|
+
file_exporter = FileSpanExporter(
|
|
102
|
+
self.local_logging_dir, self.file_export_name
|
|
103
|
+
)
|
|
104
|
+
span_processors.append(SimpleSpanProcessor(file_exporter))
|
|
105
|
+
|
|
106
|
+
# If a SQLite database path is provided, ensure the DB exists and add the SQLite exporter.
|
|
107
|
+
if self.sqlite_db_name and self.enable_sql:
|
|
108
|
+
sqlite_exporter = SqliteTelemetryExporter(
|
|
109
|
+
self.local_logging_dir, self.sqlite_db_name
|
|
110
|
+
)
|
|
111
|
+
span_processors.append(SimpleSpanProcessor(sqlite_exporter))
|
|
112
|
+
|
|
113
|
+
# Register all span processors with the provider.
|
|
114
|
+
for processor in span_processors:
|
|
115
|
+
provider.add_span_processor(processor)
|
|
116
|
+
|
|
117
|
+
provider.add_span_processor(
|
|
118
|
+
BaggageAttributeSpanProcessor(baggage_keys=["session_id", "run_id"])
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
sys.excepthook = self.log_exception_to_otel
|
|
122
|
+
|
|
123
|
+
def log_exception_to_otel(self, exc_type, exc_value, exc_traceback):
|
|
124
|
+
"""Log unhandled exceptions to OpenTelemetry."""
|
|
125
|
+
if issubclass(exc_type, KeyboardInterrupt):
|
|
126
|
+
# Allow normal handling of KeyboardInterrupt
|
|
127
|
+
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
128
|
+
return
|
|
129
|
+
|
|
130
|
+
# Use OpenTelemetry to record the exception
|
|
131
|
+
with self.global_tracer.start_as_current_span(
|
|
132
|
+
"UnhandledException"
|
|
133
|
+
) as span:
|
|
134
|
+
span.record_exception(exc_value)
|
|
135
|
+
span.set_status(
|
|
136
|
+
trace.Status(trace.StatusCode.ERROR, str(exc_value))
|
|
137
|
+
)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Base class for custom OpenTelemetry exporters."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
|
|
5
|
+
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TelemetryExporter(SpanExporter, ABC):
|
|
9
|
+
"""Base class for custom OpenTelemetry exporters."""
|
|
10
|
+
|
|
11
|
+
def __init__(self):
|
|
12
|
+
"""Base class for custom OpenTelemetry exporters."""
|
|
13
|
+
super().__init__()
|
|
14
|
+
|
|
15
|
+
def _export(self, spans):
|
|
16
|
+
"""Forward spans to the Jaeger exporter."""
|
|
17
|
+
try:
|
|
18
|
+
result = self.export(spans)
|
|
19
|
+
if result is None:
|
|
20
|
+
return SpanExportResult.SUCCESS
|
|
21
|
+
return result
|
|
22
|
+
except Exception:
|
|
23
|
+
return SpanExportResult.FAILURE
|
|
24
|
+
finally:
|
|
25
|
+
self.shutdown()
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def export(self, spans) -> SpanExportResult | None:
|
|
29
|
+
"""Export spans to the configured backend.
|
|
30
|
+
|
|
31
|
+
To be implemented by subclasses.
|
|
32
|
+
"""
|
|
33
|
+
raise NotImplementedError("Subclasses must implement the export method")
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def shutdown(self):
|
|
37
|
+
"""Cleanup resources, if any. Optional for subclasses."""
|
|
38
|
+
pass
|