flock-core 0.2.1__tar.gz → 0.2.2__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.1 → flock_core-0.2.2}/PKG-INFO +35 -2
- {flock_core-0.2.1 → flock_core-0.2.2}/README.md +29 -1
- flock_core-0.2.2/docs/agent_mechanics.md +48 -0
- flock_core-0.2.2/docs/img/flock_cli.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/01_simple_example.py +1 -1
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/02_cook_book_wip/project_manager.py +23 -6
- flock_core-0.2.2/examples/02_cook_book_wip/self_improvement.py +104 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/pyproject.toml +6 -1
- flock_core-0.2.2/review/analysis.md +134 -0
- flock_core-0.2.2/src/flock/core/context/context.py +182 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/execution/temporal_executor.py +22 -6
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/flock.py +95 -62
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/flock_agent.py +150 -68
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/logging.py +22 -4
- flock_core-0.2.2/src/flock/core/logging/telemetry.py +21 -0
- flock_core-0.2.2/src/flock/core/logging/trace_and_logged.py +55 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/mixin/dspy_integration.py +40 -14
- flock_core-0.2.2/src/flock/core/registry/agent_registry.py +118 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/tools/basic_tools.py +27 -4
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/tools/dev_tools/github.py +37 -8
- flock_core-0.2.2/src/flock/core/util/cli_helper.py +25 -0
- flock_core-0.2.2/src/flock/workflow/activities.py +175 -0
- flock_core-0.2.2/tests/integration/test_agent_integration.py +49 -0
- flock_core-0.2.2/tests/unittests/test_flock.py +229 -0
- flock_core-0.2.2/tests/unittests/test_flock_agent.py +147 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/uv.lock +338 -4
- flock_core-0.2.1/examples/02_cook_book_wip/04_hand_off_1.py +0 -68
- flock_core-0.2.1/examples/02_cook_book_wip/05_a_chat.py +0 -56
- flock_core-0.2.1/examples/02_cook_book_wip/05_b_rag.py +0 -56
- flock_core-0.2.1/src/flock/agents/batch_agent.py +0 -140
- flock_core-0.2.1/src/flock/agents/loop_agent.py +0 -117
- flock_core-0.2.1/src/flock/agents/trigger_agent.py +0 -113
- flock_core-0.2.1/src/flock/agents/user_agent.py +0 -145
- flock_core-0.2.1/src/flock/core/context/context.py +0 -211
- flock_core-0.2.1/src/flock/core/registry/agent_registry.py +0 -103
- flock_core-0.2.1/src/flock/core/util/cli_helper.py +0 -21
- flock_core-0.2.1/src/flock/workflow/__init__.py +0 -0
- flock_core-0.2.1/src/flock/workflow/activities.py +0 -117
- flock_core-0.2.1/tests/integration/test_agent_integration.py +0 -25
- flock_core-0.2.1/tests/test_agent.py +0 -197
- flock_core-0.2.1/tests/test_basic.py +0 -50
- flock_core-0.2.1/tests/test_formatter.py +0 -43
- {flock_core-0.2.1 → flock_core-0.2.2}/.devcontainer/devcontainer.json +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.github/workflows/.gitkeep +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.gitignore +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.vscode/launch.json +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.vscode/settings.json +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/.vscode/tasks.json +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/LICENSE +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/api/flock.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/api/flock_agents.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/api.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/architecture.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/01_simple_example.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/02_typed_output.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/03_tool_and_code_agent.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/04_descriptions.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/05_typed_output2.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/01_introduction/06_simple_hand_off.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/02_cook_book_wip/flock_without_llms.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples/02_cook_book_wip/project_manager.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/examples.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/generate_examples_docs.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/generate_nav.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/cli_outputs/out.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_01.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_02.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_03.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_04.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_05.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/examples/01_06.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/img/flock.png +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/index.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/installation.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/overrides/extra.css +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/docs/overrides/extra.js +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/02_typed_output.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/03_tool_and_code_agent.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/04_descriptions.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/05_typed_output2.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/01_introduction/06_simple_hand_off.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/02_cook_book_wip/flock_without_llms.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/02_cook_book_wip/long_research_no_handoff.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/03_misc_wip/formatting/01_pretty_print.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/03_misc_wip/formatting/02_r/303/255ch_table.py" +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/03_misc_wip/formatting/03_themed_table.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/03_misc_wip/logging_examples/01_basic_logging.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/03_misc_wip/logging_examples/02_temporal_logging.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/README.md +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/notebooks_wip/Untitled-1.ipynb +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/examples/notebooks_wip/my_agent.json +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/mkdocs.yml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/requirements.txt +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/__init__.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/__init__.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/context/context_manager.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/context/context_vars.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/execution/local_executor.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/__init__.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/base_formatter.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/formatter_factory.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/pprint_formatter.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/rich_formatters.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/theme_builder.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/logging/formatters/themed_formatter.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/mixin/prompt_parser.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/util/input_resolver.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/core/util/serializable.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/3024-day.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/3024-night.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/aardvark-blue.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/abernathy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/adventure.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/adventuretime.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/afterglow.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/alabaster.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/alienblood.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/andromeda.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/apple-classic.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/apple-system-colors.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/arcoiris.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/argonaut copy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/argonaut.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/arthur.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ateliersulphurpool.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/atom.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/atom_test.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/atomonelight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/aurora.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ayu copy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ayu-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ayu-mirage.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ayu.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/banana-blueberry.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/batman.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/belafonte-day.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/belafonte-night.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/birdsofparadise.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/blazer.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/blue-matrix.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/blueberrypie.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/bluedolphin.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/blulocodark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/blulocolight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/borland.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/breeze.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/bright-lights.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/broadcast.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/brogrammer.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-pastel-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-solarized-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-solarized-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-tango-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/builtin-tango-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/c64.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/calamity.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/catppuccin-frappe.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/catppuccin-latte.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/catppuccin-macchiato.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/catppuccin-mocha.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cga.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/chalk.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/chalkboard.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/challengerdeep.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/chester.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ciapre.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/clrs.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cobalt-neon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cobalt2.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/coffee-theme.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/crayonponyfish.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cutiepro.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cyberdyne.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cyberpunk.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dark+.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dark-pastel.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/darkermatrix.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/darkmatrix.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/darkside.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dayfox.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/deep.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/desert.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dimidium.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dimmedmonokai.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/django.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/djangorebornagain.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/djangosmooth.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/doom-peacock.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/doomone.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dotgov.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dracula+.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/dracula.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/duckbones.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/duotone-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/earthsong.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/elemental.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/elementary.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/encom.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/espresso-libre.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/espresso.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/everblush.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/fahrenheit.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/fairyfloss.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/farmhouse-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/farmhouse-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/fideloper.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/firefly-traditional.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/firefoxdev.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/firewatch.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/fishtank.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/flat.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/flatland.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/flexoki-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/flexoki-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/floraverse.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/forestblue.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/framer.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/frontenddelight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/funforrest.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/galaxy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/galizur.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/github-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/github.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/glacier.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/grape.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/grass.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/grey-green.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/gruber-darker.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/gruvboxdark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/gruvboxdarkhard.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/gruvboxlight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/guezwhoz.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hacktober.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hardcore.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/harper.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hax0r-blue.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hax0r-gr33n.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hax0r-r3d.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/highway.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hipster-green.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hivacruz.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/homebrew.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hopscotch.256.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hopscotch.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hurtado.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/hybrid.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ic-green-ppl.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ic-orange-ppl.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iceberg-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iceberg-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/idea.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/idletoes.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ir-black.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-dark-background.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-default.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-light-background.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-smoooooth.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-solarized-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-tango-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/iterm2-tango-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/jackie-brown.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/japanesque.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/jellybeans.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/jetbrains-darcula.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/jubi.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/kanagawabones.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/kibble.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/kolorit.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/konsolas.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/kurokula.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/lab-fox.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/laser.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/later-this-evening.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/lavandula.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/liquidcarbon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/liquidcarbontransparent.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/lovelace.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/man-page.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/mariana.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/material.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/materialdark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/materialdarker.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/materialdesigncolors.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/materialocean.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/mathias.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/matrix.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/medallion.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/mellifluous.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/midnight-in-mojave.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/mirage.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/misterioso.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/molokai.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/monalisa.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/monokai-remastered.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/monokai-soda.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/monokai-vivid.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/n0tch2k.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/neobones-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/neobones-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/neon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/neopolitan.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/neutron.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/night-owlish-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nightfox.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nightlion-v1.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nightlion-v2.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/niji.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nocturnal-winter.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nord-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nord.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/novel.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nvimdark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/nvimlight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/obsidian.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ocean.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/oceanic-next.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/oceanicmaterial.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ollie.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/onehalfdark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/onehalflight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/operator-mono-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/overnight-slumber.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/oxocarbon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/palenighthc.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pandora.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/paraiso-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/paulmillr.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pencildark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pencillight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/peppermint.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/piatto-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pnevma.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/popping-and-locking.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/primary.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pro-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/pro.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/purple-rain.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/purplepeter.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rapture.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/raycast-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/raycast-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rebecca.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/red-alert.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/red-planet.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/red-sands.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/relaxed.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/retro.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rippedcasts.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rose-pine-dawn.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rose-pine-moon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rose-pine.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/rouge-2.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/royal.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ryuuko.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/sakura.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/scarlet-protocol.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/seafoam-pastel.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/seashells.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/seoulbones-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/seoulbones-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/seti.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/shades-of-purple.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/shaman.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/slate.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/sleepyhollow.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/smyck.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/snazzy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/softserver.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/solarized-darcula.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/solarized-dark---patched.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spacedust.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spacegray-eighties.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spacegray.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spiderman.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/spring.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/square.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/sublette.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/subliminal.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/sugarplum.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/sundried.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/symfonic.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/synthwave-everything.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/synthwave.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/synthwavealpha.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tango-adapted.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tango-half-adapted.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/teerb.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/terafox.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/terminal-basic.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/thayer-bright.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/the-hulk.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tinacious-design-(dark).toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tinacious-design-(light).toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tokyonight-day.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tokyonight-storm.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tokyonight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow-night-blue.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow-night-bright.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow-night-burns.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow-night.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/tomorrow.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/toychest.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/treehouse.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/twilight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ubuntu.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ultradark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/ultraviolent.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/underthesea.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/unikitty.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/urple.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/vaughn.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/vesper.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/vibrantink.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/vimbones.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/violet-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/violet-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/warmneon.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/wez.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/whimsy.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/wildcherry.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/wilmersdorf.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/wombat.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/wryan.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/xcodedark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/xcodedarkhc.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/xcodelight.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/xcodelighthc.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/xcodewwdc.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenbones-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenbones-light.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenbones.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenburn.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenburned.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenwritten-dark.toml +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/themes/zenwritten-light.toml +0 -0
- {flock_core-0.2.1/src/flock/agents → flock_core-0.2.2/src/flock/workflow}/__init__.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/workflow/agent_activities.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/workflow/temporal_setup.py +0 -0
- {flock_core-0.2.1 → flock_core-0.2.2}/src/flock/workflow/workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flock-core
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Declarative LLM Orchestration at Scale
|
|
5
5
|
Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -14,6 +14,11 @@ Requires-Dist: dspy==2.5.42
|
|
|
14
14
|
Requires-Dist: httpx>=0.28.1
|
|
15
15
|
Requires-Dist: loguru>=0.7.3
|
|
16
16
|
Requires-Dist: msgpack>=1.1.0
|
|
17
|
+
Requires-Dist: opentelemetry-api>=1.30.0
|
|
18
|
+
Requires-Dist: opentelemetry-exporter-jaeger>=1.21.0
|
|
19
|
+
Requires-Dist: opentelemetry-exporter-otlp>=1.30.0
|
|
20
|
+
Requires-Dist: opentelemetry-instrumentation-logging>=0.51b0
|
|
21
|
+
Requires-Dist: opentelemetry-sdk>=1.30.0
|
|
17
22
|
Requires-Dist: pydantic>=2.10.5
|
|
18
23
|
Requires-Dist: python-box>=7.3.2
|
|
19
24
|
Requires-Dist: rich>=13.9.4
|
|
@@ -30,7 +35,7 @@ Description-Content-Type: text/markdown
|
|
|
30
35
|
|
|
31
36
|
<p align="center">
|
|
32
37
|
<img src="docs/img/flock.png" width="600"><br>
|
|
33
|
-
<h1 align="center">Flock
|
|
38
|
+
<h1 align="center">Flock<br></h1><br>
|
|
34
39
|
|
|
35
40
|
|
|
36
41
|
## Overview
|
|
@@ -83,6 +88,10 @@ Flock is a framework for orchestrating LLM-powered agents. It leverages a **decl
|
|
|
83
88
|
- **DSPy Integration:**
|
|
84
89
|
Flock leverages DSPy for managing LLM interactions. The framework constructs clean signature strings and updates field metadata so that DSPy can include detailed instructions and context for each agent call.
|
|
85
90
|
|
|
91
|
+
|
|
92
|
+
<p align="center">
|
|
93
|
+
<img src="docs/img/flock_cli.png" width="200"><br>
|
|
94
|
+
|
|
86
95
|
## Quick Start
|
|
87
96
|
|
|
88
97
|
Below is a simple example of how to create and run an agent with Flock:
|
|
@@ -238,6 +247,30 @@ pip install flock-core[all-tools]
|
|
|
238
247
|
uv build && uv pip install -e .
|
|
239
248
|
```
|
|
240
249
|
|
|
250
|
+
Install Jaeger for telemetry
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
docker run -d --name jaeger \
|
|
254
|
+
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
|
|
255
|
+
-p 5775:5775/udp \
|
|
256
|
+
-p 6831:6831/udp \
|
|
257
|
+
-p 6832:6832/udp \
|
|
258
|
+
-p 5778:5778 \
|
|
259
|
+
-p 16686:16686 \
|
|
260
|
+
-p 14268:14268 \
|
|
261
|
+
-p 14250:14250 \
|
|
262
|
+
-p 9411:9411 \
|
|
263
|
+
jaegertracing/all-in-one:1.41
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
or zipkin
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
docker run -d -p 9411:9411 openzipkin/zipkin
|
|
272
|
+
|
|
273
|
+
```
|
|
241
274
|
|
|
242
275
|
## Contributing
|
|
243
276
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<p align="center">
|
|
2
2
|
<img src="docs/img/flock.png" width="600"><br>
|
|
3
|
-
<h1 align="center">Flock
|
|
3
|
+
<h1 align="center">Flock<br></h1><br>
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
## Overview
|
|
@@ -53,6 +53,10 @@ Flock is a framework for orchestrating LLM-powered agents. It leverages a **decl
|
|
|
53
53
|
- **DSPy Integration:**
|
|
54
54
|
Flock leverages DSPy for managing LLM interactions. The framework constructs clean signature strings and updates field metadata so that DSPy can include detailed instructions and context for each agent call.
|
|
55
55
|
|
|
56
|
+
|
|
57
|
+
<p align="center">
|
|
58
|
+
<img src="docs/img/flock_cli.png" width="200"><br>
|
|
59
|
+
|
|
56
60
|
## Quick Start
|
|
57
61
|
|
|
58
62
|
Below is a simple example of how to create and run an agent with Flock:
|
|
@@ -208,6 +212,30 @@ pip install flock-core[all-tools]
|
|
|
208
212
|
uv build && uv pip install -e .
|
|
209
213
|
```
|
|
210
214
|
|
|
215
|
+
Install Jaeger for telemetry
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
docker run -d --name jaeger \
|
|
219
|
+
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
|
|
220
|
+
-p 5775:5775/udp \
|
|
221
|
+
-p 6831:6831/udp \
|
|
222
|
+
-p 6832:6832/udp \
|
|
223
|
+
-p 5778:5778 \
|
|
224
|
+
-p 16686:16686 \
|
|
225
|
+
-p 14268:14268 \
|
|
226
|
+
-p 14250:14250 \
|
|
227
|
+
-p 9411:9411 \
|
|
228
|
+
jaegertracing/all-in-one:1.41
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
or zipkin
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
docker run -d -p 9411:9411 openzipkin/zipkin
|
|
237
|
+
|
|
238
|
+
```
|
|
211
239
|
|
|
212
240
|
## Contributing
|
|
213
241
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# The FlockAgent: Embracing AI's Nature
|
|
2
|
+
|
|
3
|
+
You've seen them all - those LLM frameworks trying to tame the beast. 300-line prompts, complex state machines, and endless guardrails. But here's the thing: LLMs are fuzzy by nature. Their responses are "statistically likely but non-deterministic" - a developer's nightmare. Yet we keep trying to force them into our deterministic world, don't we?
|
|
4
|
+
|
|
5
|
+
That's where Flock comes in with a radically different philosophy: Instead of fighting the fuzziness, let's work with it.
|
|
6
|
+
|
|
7
|
+
Think about the current landscape. Graph-based frameworks that turn your "AI agents" into glorified state machines. So much guardrailing that by the time you're done, there's barely any AI left. You wanted agent-based architecture but what is left after all the hard work is something that basically amounts to a classic static service. Ironic, isn't it?
|
|
8
|
+
|
|
9
|
+
Here's our take: Let AI be AI. But give it a proper framework to thrive in.
|
|
10
|
+
|
|
11
|
+
You're the Q to your AI agents. You don't control James Bond's every move - you equip him with the right tools for the mission. That's exactly how Flock works. We're talking full-spectrum support here: From the agent-level tools that make your AI shine, all the way to battle-tested platform capabilities that keep your system running when things get rough.
|
|
12
|
+
|
|
13
|
+
No stones in your path, just pure flexibility.
|
|
14
|
+
|
|
15
|
+
**Why Callables Change Everything**
|
|
16
|
+
|
|
17
|
+
Every aspect of a FlockAgent - inputs, outputs, lifecycle hooks - can be a callable. This isn't just some feature checkbox. It means:
|
|
18
|
+
- Your agent adapts to context on the fly
|
|
19
|
+
- Edge cases? Handle them at runtime
|
|
20
|
+
- Complex logic? No problem - go beyond static configs
|
|
21
|
+
|
|
22
|
+
**The Lifecycle Revolution**
|
|
23
|
+
|
|
24
|
+
We give you hooks where they matter:
|
|
25
|
+
- `initialize`: Set the stage (resources, validation, whatever you need)
|
|
26
|
+
- `evaluate`: Where the magic happens
|
|
27
|
+
- `terminate`: Clean up your act
|
|
28
|
+
- `on_error`: Because stuff happens
|
|
29
|
+
|
|
30
|
+
Now, I know what you're thinking: "This sounds complex." But here's the twist - this complexity is your friend. Clear contracts beat fuzzy prompts any day. Want to switch input parameters? One hook, clearly visible. Want to handle an edge case? Good luck finding it in that 1,500-word prompt you wrote last month.
|
|
31
|
+
|
|
32
|
+
**The Beautiful Basics**
|
|
33
|
+
|
|
34
|
+
At its core, a FlockAgent is beautifully simple:
|
|
35
|
+
- Give it a name
|
|
36
|
+
- Tell it what it needs (input)
|
|
37
|
+
- Tell it what it should produce (output)
|
|
38
|
+
|
|
39
|
+
That's it. The rest is up to you.
|
|
40
|
+
|
|
41
|
+
The result? A framework that's actually ready for production. Your agents are:
|
|
42
|
+
- Modular enough to chain like LEGO bricks
|
|
43
|
+
- Reusable thanks to Pydantic's typing magic
|
|
44
|
+
- Customizable down to their core
|
|
45
|
+
|
|
46
|
+
You get to build real, scalable AI systems without the prompt engineering headaches. No more fighting the AI - just harnessing its power in a way that actually makes sense for production.
|
|
47
|
+
|
|
48
|
+
This isn't just another agent framework. It's a fundamental rethinking of how we work with LLMs in production environments. Because sometimes, the best way to control chaos is to embrace it - with the right tools in hand.
|
|
Binary file
|
|
@@ -39,7 +39,7 @@ async def main():
|
|
|
39
39
|
# The flock is the place where all the agents are at home
|
|
40
40
|
# set local_debug to True to run the flock without Temporal
|
|
41
41
|
# Check out the examples in /temporal to learn about Temporal
|
|
42
|
-
flock = Flock(model=MODEL, local_debug=True)
|
|
42
|
+
flock = Flock(model=MODEL, local_debug=True, enable_logging=True)
|
|
43
43
|
|
|
44
44
|
# --------------------------------
|
|
45
45
|
# Create an agent
|
|
@@ -29,6 +29,7 @@ Let's see how it all comes together!
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
import asyncio
|
|
32
|
+
from dataclasses import dataclass
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
from flock.core.flock import Flock
|
|
@@ -39,14 +40,21 @@ from flock.core.tools import basic_tools
|
|
|
39
40
|
from flock.core.tools.dev_tools import github
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
@dataclass
|
|
44
|
+
class Features:
|
|
45
|
+
title: str
|
|
46
|
+
description: str
|
|
47
|
+
acceptance_criteria: str
|
|
48
|
+
|
|
49
|
+
|
|
42
50
|
async def main():
|
|
43
51
|
|
|
44
|
-
flock = Flock(local_debug=True, output_formatter=FormatterOptions(formatter=RichTables, wait_for_input=
|
|
52
|
+
flock = Flock(local_debug=True, output_formatter=FormatterOptions(formatter=RichTables, wait_for_input=False, settings={}),enable_logging=True)
|
|
45
53
|
|
|
46
54
|
idea_agent = FlockAgent(
|
|
47
55
|
name="idea_agent",
|
|
48
56
|
input="query",
|
|
49
|
-
output="
|
|
57
|
+
output="software_project_idea",
|
|
50
58
|
tools=[basic_tools.web_search_tavily],
|
|
51
59
|
use_cache=True,
|
|
52
60
|
)
|
|
@@ -67,9 +75,17 @@ async def main():
|
|
|
67
75
|
use_cache=True,
|
|
68
76
|
)
|
|
69
77
|
|
|
78
|
+
feature_agent = FlockAgent(
|
|
79
|
+
name="feature_agent",
|
|
80
|
+
input="readme, catchy_project_name, project_pitch, techstack, project_implementation_plan",
|
|
81
|
+
output="features : list[Features]",
|
|
82
|
+
tools=[github.create_user_stories_as_github_issue, github.create_files],
|
|
83
|
+
use_cache=True,
|
|
84
|
+
)
|
|
85
|
+
|
|
70
86
|
issue_agent = FlockAgent(
|
|
71
87
|
name="issue_agent",
|
|
72
|
-
input="
|
|
88
|
+
input="current_feature, readme, techstack, project_implementation_plan, all_feature_titles",
|
|
73
89
|
output="user_stories_on_github, files_on_github",
|
|
74
90
|
tools=[github.create_user_stories_as_github_issue, github.create_files],
|
|
75
91
|
use_cache=True,
|
|
@@ -77,15 +93,16 @@ async def main():
|
|
|
77
93
|
|
|
78
94
|
idea_agent.hand_off = project_plan_agent
|
|
79
95
|
project_plan_agent.hand_off = readme_agent
|
|
80
|
-
readme_agent.hand_off =
|
|
96
|
+
readme_agent.hand_off = feature_agent
|
|
97
|
+
|
|
81
98
|
|
|
82
99
|
flock.add_agent(idea_agent)
|
|
83
100
|
flock.add_agent(project_plan_agent)
|
|
84
101
|
flock.add_agent(readme_agent)
|
|
102
|
+
flock.add_agent(feature_agent)
|
|
85
103
|
flock.add_agent(issue_agent)
|
|
86
104
|
|
|
87
|
-
await flock.run_async(
|
|
88
|
-
input={"query": "fun software project idea"},
|
|
105
|
+
features : Features = await flock.run_async(
|
|
89
106
|
start_agent=idea_agent,
|
|
90
107
|
)
|
|
91
108
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Title: Reasoning assistant with self managed memory
|
|
3
|
+
"""
|
|
4
|
+
import warnings
|
|
5
|
+
warnings.simplefilter("error", UserWarning)
|
|
6
|
+
import asyncio
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
|
|
9
|
+
from flock.core.flock import Flock
|
|
10
|
+
from flock.core.flock_agent import FlockAgent, FlockAgentConfig, HandOff
|
|
11
|
+
|
|
12
|
+
from rich.prompt import Prompt
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class Chat:
|
|
19
|
+
chat_history: list[str] = field(default_factory=list)
|
|
20
|
+
user_query: str = ""
|
|
21
|
+
answer_to_query: str = ""
|
|
22
|
+
memory: str = ""
|
|
23
|
+
|
|
24
|
+
async def before_response(self, agent, inputs):
|
|
25
|
+
console = Console()
|
|
26
|
+
# Load the memory from file (if it exists)
|
|
27
|
+
try:
|
|
28
|
+
with open("memory.txt", "r") as file:
|
|
29
|
+
self.memory = file.read()
|
|
30
|
+
except FileNotFoundError:
|
|
31
|
+
self.memory = ""
|
|
32
|
+
|
|
33
|
+
# Use a Rich-styled prompt to get user input
|
|
34
|
+
self.user_query = Prompt.ask("[bold cyan]User[/bold cyan]")
|
|
35
|
+
inputs["user_query"] = self.user_query
|
|
36
|
+
inputs["chat_history"] = self.chat_history
|
|
37
|
+
inputs["memory"] = self.memory
|
|
38
|
+
|
|
39
|
+
# Triggers after the agent responds to the user query
|
|
40
|
+
async def after_response(self, agent, inputs, outputs):
|
|
41
|
+
# Update answer and history based on the agent's outputs
|
|
42
|
+
console = Console()
|
|
43
|
+
self.answer_to_query = outputs["answer_to_query"]
|
|
44
|
+
self.chat_history.append({"user": self.user_query, "assistant": self.answer_to_query})
|
|
45
|
+
self.memory += outputs.get("important_new_knowledge_to_add_to_memory", "") + "\n"
|
|
46
|
+
|
|
47
|
+
# Save updated memory to file
|
|
48
|
+
with open("memory.txt", "w") as file:
|
|
49
|
+
file.write(self.memory)
|
|
50
|
+
|
|
51
|
+
# Display the assistant's reasoning (if available) in a styled panel
|
|
52
|
+
reasoning = outputs.get("reasoning", "")
|
|
53
|
+
if reasoning:
|
|
54
|
+
reasoning_panel = Panel(
|
|
55
|
+
reasoning,
|
|
56
|
+
title="[bold blue]Assistant Reasoning[/bold blue]",
|
|
57
|
+
border_style="blue",
|
|
58
|
+
)
|
|
59
|
+
console.print(reasoning_panel)
|
|
60
|
+
|
|
61
|
+
# Display the assistant's answer in a styled panel
|
|
62
|
+
answer_panel = Panel(
|
|
63
|
+
self.answer_to_query,
|
|
64
|
+
title="[bold green]Assistant Answer[/bold green]",
|
|
65
|
+
border_style="green",
|
|
66
|
+
)
|
|
67
|
+
console.print(answer_panel)
|
|
68
|
+
|
|
69
|
+
# Triggers at handoff to the next agent
|
|
70
|
+
def hand_off(self, context, result):
|
|
71
|
+
if self.user_query.lower() == "goodbye":
|
|
72
|
+
return None
|
|
73
|
+
return HandOff(next_agent="chatty")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
MODEL = "openai/gpt-4o"
|
|
77
|
+
|
|
78
|
+
async def main():
|
|
79
|
+
|
|
80
|
+
chat_helper = Chat()
|
|
81
|
+
flock = Flock(model=MODEL, local_debug=True)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
chatty = FlockAgent(
|
|
85
|
+
name="chatty",
|
|
86
|
+
description="You are Chatty, a friendly assistant that loves to chat.",
|
|
87
|
+
input="user_query, memory | Memory of previous interactions, chat_history | the current chat history",
|
|
88
|
+
output="answer_to_query, important_new_knowledge_to_add_to_memory | Empty string if no knowledge to add",
|
|
89
|
+
initialize_callback=chat_helper.before_response,
|
|
90
|
+
terminate_callback=chat_helper.after_response,
|
|
91
|
+
config=FlockAgentConfig(disable_output=True,agent_type_override="ChainOfThought")
|
|
92
|
+
)
|
|
93
|
+
flock.add_agent(chatty)
|
|
94
|
+
|
|
95
|
+
chatty.hand_off = chat_helper.hand_off
|
|
96
|
+
|
|
97
|
+
await flock.run_async(
|
|
98
|
+
start_agent=chatty,
|
|
99
|
+
input={"memory": "","user_query": "","chat_history": ""}
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
if __name__ == "__main__":
|
|
104
|
+
asyncio.run(main())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "flock-core"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.2"
|
|
4
4
|
description = "Declarative LLM Orchestration at Scale"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -19,6 +19,11 @@ dependencies = [
|
|
|
19
19
|
"httpx>=0.28.1",
|
|
20
20
|
"loguru>=0.7.3",
|
|
21
21
|
"msgpack>=1.1.0",
|
|
22
|
+
"opentelemetry-api>=1.30.0",
|
|
23
|
+
"opentelemetry-exporter-jaeger>=1.21.0",
|
|
24
|
+
"opentelemetry-exporter-otlp>=1.30.0",
|
|
25
|
+
"opentelemetry-instrumentation-logging>=0.51b0",
|
|
26
|
+
"opentelemetry-sdk>=1.30.0",
|
|
22
27
|
"pydantic>=2.10.5",
|
|
23
28
|
"python-box>=7.3.2",
|
|
24
29
|
"rich>=13.9.4",
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Flock Framework Analysis
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Flock is a sophisticated Python framework for building and orchestrating LLM-powered agents with a unique declarative approach. The framework emphasizes simplicity and clarity by moving away from traditional prompt engineering in favor of a more structured, type-driven architecture.
|
|
6
|
+
|
|
7
|
+
## Core Architecture
|
|
8
|
+
|
|
9
|
+
### 1. Flock Orchestrator (`flock.py`)
|
|
10
|
+
|
|
11
|
+
The `Flock` class serves as the central orchestrator with several key responsibilities:
|
|
12
|
+
|
|
13
|
+
- Agent and tool registration management
|
|
14
|
+
- Context initialization and management
|
|
15
|
+
- Workflow execution (both local and distributed via Temporal)
|
|
16
|
+
- Configuration of logging and output formatting
|
|
17
|
+
|
|
18
|
+
Key features:
|
|
19
|
+
- Support for both local debugging and production (Temporal) execution modes
|
|
20
|
+
- Integrated telemetry and tracing
|
|
21
|
+
- Flexible output formatting
|
|
22
|
+
- Dynamic agent registration and tool management
|
|
23
|
+
|
|
24
|
+
### 2. Agent System (`flock_agent.py`)
|
|
25
|
+
|
|
26
|
+
The `FlockAgent` class is the cornerstone of the framework, implementing a declarative pattern for agent definition. Notable aspects include:
|
|
27
|
+
|
|
28
|
+
#### Declarative Design
|
|
29
|
+
Instead of manual prompt engineering, agents are defined by declaring:
|
|
30
|
+
- Input specifications (with types and descriptions)
|
|
31
|
+
- Output specifications (with types and descriptions)
|
|
32
|
+
- Optional tools for extended functionality
|
|
33
|
+
|
|
34
|
+
#### Agent Lifecycle
|
|
35
|
+
The framework implements a comprehensive lifecycle management system:
|
|
36
|
+
1. Initialization phase (`initialize`)
|
|
37
|
+
2. Evaluation phase (`evaluate`)
|
|
38
|
+
3. Termination phase (`terminate`)
|
|
39
|
+
4. Error handling (`on_error`)
|
|
40
|
+
|
|
41
|
+
#### Serialization Support
|
|
42
|
+
Built-in capabilities for agent serialization and deserialization:
|
|
43
|
+
- `to_dict()`: Converts agent instances to dictionaries
|
|
44
|
+
- `from_dict()`: Reconstructs agents from dictionary representations
|
|
45
|
+
- Support for cloudpickle serialization of callable objects
|
|
46
|
+
|
|
47
|
+
## Key Features
|
|
48
|
+
|
|
49
|
+
### 1. Declarative Programming Model
|
|
50
|
+
- Agents are defined by their input/output specifications rather than prompt templates
|
|
51
|
+
- Type hints and descriptions are used to generate appropriate prompts automatically
|
|
52
|
+
- Reduces boilerplate and improves maintainability
|
|
53
|
+
|
|
54
|
+
### 2. Tool Integration
|
|
55
|
+
- Flexible tool registration system
|
|
56
|
+
- Support for both synchronous and asynchronous tools
|
|
57
|
+
- Tools can be shared across agents
|
|
58
|
+
|
|
59
|
+
### 3. Workflow Management
|
|
60
|
+
- Support for agent chaining through handoffs
|
|
61
|
+
- Built-in context management
|
|
62
|
+
- Integrated with Temporal for production-grade workflow orchestration
|
|
63
|
+
|
|
64
|
+
### 4. Development Experience
|
|
65
|
+
- Local debugging mode for rapid development
|
|
66
|
+
- Rich logging and telemetry integration
|
|
67
|
+
- Comprehensive error handling
|
|
68
|
+
|
|
69
|
+
## Technical Implementation
|
|
70
|
+
|
|
71
|
+
### Context Management
|
|
72
|
+
- Uses a `FlockContext` system for managing state
|
|
73
|
+
- Supports both global and agent-specific contexts
|
|
74
|
+
- Implements context initialization and validation
|
|
75
|
+
|
|
76
|
+
### Execution Models
|
|
77
|
+
1. Local Execution (`run_local_workflow`)
|
|
78
|
+
- Simplified execution for development and debugging
|
|
79
|
+
- Direct agent interaction
|
|
80
|
+
|
|
81
|
+
2. Temporal Execution (`run_temporal_workflow`)
|
|
82
|
+
- Production-grade workflow execution
|
|
83
|
+
- Fault tolerance and scalability
|
|
84
|
+
- Distributed execution support
|
|
85
|
+
|
|
86
|
+
### Integration Features
|
|
87
|
+
- OpenTelemetry integration for tracing and monitoring
|
|
88
|
+
- Rich logging system with customizable formatters
|
|
89
|
+
- DSPy integration for LLM interactions
|
|
90
|
+
|
|
91
|
+
## Strengths
|
|
92
|
+
|
|
93
|
+
1. **Simplicity**
|
|
94
|
+
- Clear separation of concerns
|
|
95
|
+
- Minimal boilerplate code
|
|
96
|
+
- Intuitive agent definition syntax
|
|
97
|
+
|
|
98
|
+
2. **Flexibility**
|
|
99
|
+
- Support for multiple execution modes
|
|
100
|
+
- Extensible tool system
|
|
101
|
+
- Customizable output formatting
|
|
102
|
+
|
|
103
|
+
3. **Production Readiness**
|
|
104
|
+
- Temporal integration for robust workflow execution
|
|
105
|
+
- Comprehensive error handling
|
|
106
|
+
- Built-in monitoring and tracing
|
|
107
|
+
|
|
108
|
+
4. **Developer Experience**
|
|
109
|
+
- Clear documentation and examples
|
|
110
|
+
- Local debugging support
|
|
111
|
+
- Rich logging and error feedback
|
|
112
|
+
|
|
113
|
+
## Areas for Potential Enhancement
|
|
114
|
+
|
|
115
|
+
1. **Documentation**
|
|
116
|
+
- More comprehensive API documentation
|
|
117
|
+
- Additional usage examples
|
|
118
|
+
- Best practices guide
|
|
119
|
+
|
|
120
|
+
2. **Testing Infrastructure**
|
|
121
|
+
- Expanded test coverage
|
|
122
|
+
- Testing utilities for agent development
|
|
123
|
+
- Performance benchmarking tools
|
|
124
|
+
|
|
125
|
+
3. **Tool Ecosystem**
|
|
126
|
+
- Pre-built tool collections
|
|
127
|
+
- Tool documentation and examples
|
|
128
|
+
- Tool validation system
|
|
129
|
+
|
|
130
|
+
## Conclusion
|
|
131
|
+
|
|
132
|
+
Flock represents a sophisticated approach to agent-based LLM development, offering a powerful balance between simplicity and functionality. Its declarative model and robust architecture make it well-suited for both development and production environments. The framework's integration with Temporal and comprehensive feature set position it as a valuable tool for building complex LLM-powered applications.
|
|
133
|
+
|
|
134
|
+
The framework's design choices, particularly its move away from traditional prompt engineering, demonstrate a forward-thinking approach to LLM application development. While there are areas for potential enhancement, the core architecture provides a solid foundation for future development and expansion.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
from dataclasses import asdict, dataclass, field
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any, Literal
|
|
4
|
+
|
|
5
|
+
from opentelemetry import trace
|
|
6
|
+
|
|
7
|
+
from flock.core.context.context_vars import FLOCK_LAST_AGENT, FLOCK_LAST_RESULT
|
|
8
|
+
from flock.core.logging.logging import get_logger
|
|
9
|
+
from flock.core.util.serializable import Serializable
|
|
10
|
+
|
|
11
|
+
logger = get_logger("context")
|
|
12
|
+
tracer = trace.get_tracer(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class AgentRunRecord:
|
|
17
|
+
agent: str = field(default="")
|
|
18
|
+
data: dict[str, Any] = field(default_factory=dict)
|
|
19
|
+
timestamp: str = field(default="")
|
|
20
|
+
hand_off: dict = field(default_factory=dict)
|
|
21
|
+
called_from: str = field(default="")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class AgentDefinition:
|
|
26
|
+
agent_type: str = field(default="")
|
|
27
|
+
agent_name: str = field(default="")
|
|
28
|
+
agent_data: dict = field(default_factory=dict)
|
|
29
|
+
serializer: Literal["json", "cloudpickle", "msgpack"] = field(
|
|
30
|
+
default="cloudpickle"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class FlockContext(Serializable):
|
|
36
|
+
state: dict[str, Any] = field(default_factory=dict)
|
|
37
|
+
history: list[AgentRunRecord] = field(default_factory=list)
|
|
38
|
+
agent_definitions: dict[str, AgentDefinition] = field(default_factory=dict)
|
|
39
|
+
run_id: str = field(default="")
|
|
40
|
+
workflow_id: str = field(default="")
|
|
41
|
+
workflow_timestamp: str = field(default="")
|
|
42
|
+
|
|
43
|
+
def record(
|
|
44
|
+
self,
|
|
45
|
+
agent_name: str,
|
|
46
|
+
data: dict[str, Any],
|
|
47
|
+
timestamp: str,
|
|
48
|
+
hand_off: str,
|
|
49
|
+
called_from: str,
|
|
50
|
+
) -> None:
|
|
51
|
+
record = AgentRunRecord(
|
|
52
|
+
agent=agent_name,
|
|
53
|
+
data=data.copy(),
|
|
54
|
+
timestamp=timestamp,
|
|
55
|
+
hand_off=hand_off,
|
|
56
|
+
called_from=called_from,
|
|
57
|
+
)
|
|
58
|
+
self.history.append(record)
|
|
59
|
+
for key, value in data.items():
|
|
60
|
+
self.set_variable(f"{agent_name}.{key}", value)
|
|
61
|
+
self.set_variable(FLOCK_LAST_RESULT, data)
|
|
62
|
+
self.set_variable(FLOCK_LAST_AGENT, agent_name)
|
|
63
|
+
logger.info(
|
|
64
|
+
"Agent run recorded",
|
|
65
|
+
agent=agent_name,
|
|
66
|
+
timestamp=timestamp,
|
|
67
|
+
data=data,
|
|
68
|
+
)
|
|
69
|
+
current_span = trace.get_current_span()
|
|
70
|
+
if current_span.get_span_context().is_valid:
|
|
71
|
+
current_span.add_event(
|
|
72
|
+
"record",
|
|
73
|
+
attributes={"agent": agent_name, "timestamp": timestamp},
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def get_variable(self, key: str) -> Any:
|
|
77
|
+
return self.state.get(key)
|
|
78
|
+
|
|
79
|
+
def set_variable(self, key: str, value: Any) -> None:
|
|
80
|
+
old_value = self.state.get(key)
|
|
81
|
+
self.state[key] = value
|
|
82
|
+
if old_value != value:
|
|
83
|
+
logger.info(
|
|
84
|
+
"Context variable updated",
|
|
85
|
+
variable=key,
|
|
86
|
+
old=old_value,
|
|
87
|
+
new=value,
|
|
88
|
+
)
|
|
89
|
+
current_span = trace.get_current_span()
|
|
90
|
+
if current_span.get_span_context().is_valid:
|
|
91
|
+
current_span.add_event(
|
|
92
|
+
"set_variable",
|
|
93
|
+
attributes={
|
|
94
|
+
"key": key,
|
|
95
|
+
"old": str(old_value),
|
|
96
|
+
"new": str(value),
|
|
97
|
+
},
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def deepcopy(self) -> "FlockContext":
|
|
101
|
+
return FlockContext.from_dict(self.to_dict())
|
|
102
|
+
|
|
103
|
+
def get_agent_history(self, agent_name: str) -> list[AgentRunRecord]:
|
|
104
|
+
return [record for record in self.history if record.agent == agent_name]
|
|
105
|
+
|
|
106
|
+
def next_input_for(self, agent) -> Any:
|
|
107
|
+
try:
|
|
108
|
+
if hasattr(agent, "input") and isinstance(agent.input, str):
|
|
109
|
+
keys = [k.strip() for k in agent.input.split(",") if k.strip()]
|
|
110
|
+
if len(keys) == 1:
|
|
111
|
+
return self.get_variable(keys[0])
|
|
112
|
+
else:
|
|
113
|
+
return {key: self.get_variable(key) for key in keys}
|
|
114
|
+
else:
|
|
115
|
+
return self.get_variable("init_input")
|
|
116
|
+
except Exception as e:
|
|
117
|
+
logger.error(
|
|
118
|
+
"Error getting next input for agent",
|
|
119
|
+
agent=agent.name,
|
|
120
|
+
error=str(e),
|
|
121
|
+
)
|
|
122
|
+
raise
|
|
123
|
+
|
|
124
|
+
def get_most_recent_value(self, variable_name: str) -> Any:
|
|
125
|
+
for history_record in reversed(self.history):
|
|
126
|
+
if variable_name in history_record.data:
|
|
127
|
+
return history_record.data[variable_name]
|
|
128
|
+
|
|
129
|
+
def get_agent_definition(self, agent_name: str) -> AgentDefinition | None:
|
|
130
|
+
return self.agent_definitions.get(agent_name)
|
|
131
|
+
|
|
132
|
+
def add_agent_definition(
|
|
133
|
+
self, agent_type: type, agent_name: str, agent_data: Any
|
|
134
|
+
) -> None:
|
|
135
|
+
definition = AgentDefinition(
|
|
136
|
+
agent_type=agent_type.__name__,
|
|
137
|
+
agent_name=agent_name,
|
|
138
|
+
agent_data=agent_data,
|
|
139
|
+
)
|
|
140
|
+
self.agent_definitions[agent_name] = definition
|
|
141
|
+
|
|
142
|
+
# Use the reactive setter for dict-like access.
|
|
143
|
+
def __getitem__(self, key: str) -> Any:
|
|
144
|
+
return self.get_variable(key)
|
|
145
|
+
|
|
146
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
147
|
+
self.set_variable(key, value)
|
|
148
|
+
|
|
149
|
+
def to_dict(self) -> dict[str, Any]:
|
|
150
|
+
def convert(obj):
|
|
151
|
+
if isinstance(obj, datetime):
|
|
152
|
+
return obj.isoformat()
|
|
153
|
+
if hasattr(obj, "__dataclass_fields__"):
|
|
154
|
+
return asdict(
|
|
155
|
+
obj, dict_factory=lambda x: {k: convert(v) for k, v in x}
|
|
156
|
+
)
|
|
157
|
+
return obj
|
|
158
|
+
|
|
159
|
+
return convert(asdict(self))
|
|
160
|
+
|
|
161
|
+
@classmethod
|
|
162
|
+
def from_dict(cls, data: dict[str, Any]) -> "FlockContext":
|
|
163
|
+
def convert(obj):
|
|
164
|
+
if isinstance(obj, dict):
|
|
165
|
+
if "timestamp" in obj:
|
|
166
|
+
return AgentRunRecord(
|
|
167
|
+
**{
|
|
168
|
+
**obj,
|
|
169
|
+
"timestamp": datetime.fromisoformat(
|
|
170
|
+
obj["timestamp"]
|
|
171
|
+
),
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
if "agent_type" in obj:
|
|
175
|
+
return AgentDefinition(**obj)
|
|
176
|
+
return {k: convert(v) for k, v in obj.items()}
|
|
177
|
+
if isinstance(obj, list):
|
|
178
|
+
return [convert(v) for v in obj]
|
|
179
|
+
return obj
|
|
180
|
+
|
|
181
|
+
converted = convert(data)
|
|
182
|
+
return cls(**converted)
|