flock-core 0.4.0b42__tar.gz → 0.4.0b44__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.4.0b42 → flock_core-0.4.0b44}/PKG-INFO +1 -1
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/pyproject.toml +1 -1
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/__init__.py +1 -2
- flock_core-0.4.0b44/src/flock/core/api/endpoints.py +254 -0
- flock_core-0.4.0b44/src/flock/core/api/main.py +162 -0
- flock_core-0.4.0b44/src/flock/core/api/service.py +214 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock.py +192 -133
- flock_core-0.4.0b44/src/flock/webapp/app/api/agent_management.py +241 -0
- flock_core-0.4.0b44/src/flock/webapp/app/api/execution.py +164 -0
- flock_core-0.4.0b44/src/flock/webapp/app/api/flock_management.py +129 -0
- flock_core-0.4.0b44/src/flock/webapp/app/chat.py +233 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/config.py +6 -3
- flock_core-0.4.0b44/src/flock/webapp/app/dependencies.py +95 -0
- flock_core-0.4.0b44/src/flock/webapp/app/main.py +488 -0
- flock_core-0.4.0b44/src/flock/webapp/app/services/flock_service.py +313 -0
- flock_core-0.4.0b44/src/flock/webapp/run.py +213 -0
- flock_core-0.4.0b44/src/flock/webapp/static/css/chat.css +227 -0
- flock_core-0.4.0b44/src/flock/webapp/static/css/components.css +167 -0
- flock_core-0.4.0b44/src/flock/webapp/static/css/header.css +39 -0
- flock_core-0.4.0b44/src/flock/webapp/static/css/layout.css +46 -0
- flock_core-0.4.0b44/src/flock/webapp/static/css/sidebar.css +127 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/base.html +6 -1
- flock_core-0.4.0b44/src/flock/webapp/templates/chat.html +60 -0
- flock_core-0.4.0b44/src/flock/webapp/templates/chat_settings.html +20 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/flock_editor.html +1 -1
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_agent_detail_form.html +4 -4
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_agent_list.html +2 -2
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_agent_manager_view.html +3 -4
- flock_core-0.4.0b44/src/flock/webapp/templates/partials/_chat_container.html +9 -0
- flock_core-0.4.0b44/src/flock/webapp/templates/partials/_chat_messages.html +13 -0
- flock_core-0.4.0b44/src/flock/webapp/templates/partials/_chat_settings_form.html +65 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_execution_form.html +2 -2
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_execution_view_container.html +1 -1
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_flock_properties_form.html +2 -2
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_registry_viewer_content.html +3 -3
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_sidebar.html +17 -1
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/registry_viewer.html +3 -3
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/uv.lock +1 -1
- flock_core-0.4.0b42/src/flock/core/api/endpoints.py +0 -322
- flock_core-0.4.0b42/src/flock/core/api/main.py +0 -681
- flock_core-0.4.0b42/src/flock/webapp/app/api/agent_management.py +0 -270
- flock_core-0.4.0b42/src/flock/webapp/app/api/execution.py +0 -173
- flock_core-0.4.0b42/src/flock/webapp/app/api/flock_management.py +0 -102
- flock_core-0.4.0b42/src/flock/webapp/app/main.py +0 -1074
- flock_core-0.4.0b42/src/flock/webapp/app/services/flock_service.py +0 -291
- flock_core-0.4.0b42/src/flock/webapp/run.py +0 -132
- flock_core-0.4.0b42/src/flock/webapp/static/css/custom.css +0 -612
- flock_core-0.4.0b42/src/flock/webapp/templates/partials/_agent_manager_view_old.html +0 -19
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.devcontainer/devcontainer.json +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.env_template +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/workflows/.gitkeep +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/workflows/deploy-documentation.yml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.gitignore +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.gitmodules +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.vscode/launch.json +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.vscode/settings.json +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/.vscode/tasks.json +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/LICENSE +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/README.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/about/changelog.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/about/contributing.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/drawio/architecture.drawio +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/cli_outputs/out.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/components_chart.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_01.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_02.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_03.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_04.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_05.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/examples/01_06.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/flock.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/flock_cli.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/flow_chart.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/getting-started/first_agent_00.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/hummingbird.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/icon.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/icon.png~ +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/logo.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/memory_concepts.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/memory_flow.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/assets/images/memory_flow_chart.png +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/components/evaluators.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/components/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/components/modules.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/components/tools.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/core-concepts/agents.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/core-concepts/declarative.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/core-concepts/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/core-concepts/workflows.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/create_doc_boilerplate.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/deployment/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/deployment/temporal.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/getting-started/concepts.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/getting-started/configuration.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/getting-started/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/getting-started/installation.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/getting-started/quickstart.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/guides/chaining-agents.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/guides/custom-endpoints.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/guides/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/guides/temporal-configuration.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/cli-tool.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/interactive-cli.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/programmatic.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/rest-api.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/interacting-with-flock/web-ui.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/reference/flock_agent.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/reference/index.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/release-notes/magpie.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/docs/stylesheets/extra.css +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/mkdocs.yml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/requirements.txt +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/scripts/code_collector.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/scripts/create_docs.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/scripts/ensure_uv.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/assets/release_notes.md +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/config.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/constants.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/create_agent.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/create_flock.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/execute_flock.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/load_agent.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/load_examples.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/load_flock.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/load_release_notes.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/loaded_flock_cli.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/manage_agents.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/registry_management.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/runner.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/settings.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/view_results.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/cli/yaml_editor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/config.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/custom_endpoint.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/models.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/run_store.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/runner.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/ui/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/ui/routes.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/api/ui/utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/context/context.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/context/context_manager.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/context/context_vars.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/evaluation/utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/execution/batch_executor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/execution/evaluation_executor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/execution/local_executor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/execution/temporal_executor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_agent.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_evaluator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_factory.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_registry.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/flock_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/interpreter/python_interpreter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/formatters/enum_builder.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/formatters/theme_builder.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/formatters/themed_formatter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/formatters/themes.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/logging.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/span_middleware/baggage_span_processor.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/telemetry.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/telemetry_exporter/base_exporter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/telemetry_exporter/file_exporter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/telemetry_exporter/sqlite_exporter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/logging/trace_and_logged.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/mixin/dspy_integration.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/mixin/prompt_parser.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/callable_registry.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/flock_serializer.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/json_encoder.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/secure_serializer.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/serializable.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/serialization/serialization_utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/azure_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/basic_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/dev_tools/github.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/llm_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/markdown_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/tools/zendesk_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/cli_helper.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/file_path_utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/hydrator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/input_resolver.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/loader.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/core/util/spliter.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/evaluators/declarative/declarative_evaluator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/evaluators/memory/memory_evaluator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/evaluators/test/test_case_evaluator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/evaluators/zep/zep_evaluator.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/assertion/assertion_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/callback/callback_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/memory/memory_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/memory/memory_parser.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/memory/memory_storage.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/output/output_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/performance/metrics_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/modules/zep/zep_module.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/platform/docker_tools.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/platform/jaeger_install.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/agent/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/agent/agent_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/agent/handoff_agent.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/conditional/conditional_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/default/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/default/default_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/feedback/feedback_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/list_generator/list_generator_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/llm/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/routers/llm/llm_router.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/3024-day.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/3024-night.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/aardvark-blue.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/abernathy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/adventure.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/adventuretime.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/afterglow.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/alabaster.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/alienblood.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/andromeda.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/apple-classic.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/apple-system-colors.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/arcoiris.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/argonaut copy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/argonaut.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/arthur.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ateliersulphurpool.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/atom.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/atom_test.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/atomonelight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/aurora.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ayu copy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ayu-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ayu-mirage.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ayu.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/banana-blueberry.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/batman.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/belafonte-day.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/belafonte-night.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/birdsofparadise.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/blazer.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/blue-matrix.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/blueberrypie.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/bluedolphin.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/blulocodark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/blulocolight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/borland.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/breeze.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/bright-lights.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/broadcast.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/brogrammer.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-pastel-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-solarized-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-solarized-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-tango-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/builtin-tango-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/c64.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/calamity.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/catppuccin-frappe.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/catppuccin-latte.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/catppuccin-macchiato.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/catppuccin-mocha.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cga.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/chalk.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/chalkboard.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/challengerdeep.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/chester.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ciapre.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/clrs.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cobalt-neon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cobalt2.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/coffee-theme.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/crayonponyfish.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cutiepro.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cyberdyne.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cyberpunk.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dark+.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dark-pastel.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/darkermatrix.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/darkmatrix.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/darkside.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dayfox.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/deep.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/desert.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dimidium.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dimmedmonokai.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/django.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/djangorebornagain.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/djangosmooth.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/doom-peacock.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/doomone.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dotgov.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dracula+.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/dracula.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/duckbones.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/duotone-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/earthsong.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/elemental.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/elementary.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/encom.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/espresso-libre.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/espresso.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/everblush.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/fahrenheit.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/fairyfloss.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/farmhouse-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/farmhouse-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/fideloper.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/firefly-traditional.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/firefoxdev.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/firewatch.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/fishtank.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/flat.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/flatland.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/flexoki-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/flexoki-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/floraverse.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/forestblue.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/framer.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/frontenddelight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/funforrest.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/galaxy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/galizur.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/github-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/github.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/glacier.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/grape.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/grass.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/grey-green.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/gruber-darker.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/gruvboxdark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/gruvboxdarkhard.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/gruvboxlight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/guezwhoz.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hacktober.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hardcore.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/harper.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hax0r-blue.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hax0r-gr33n.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hax0r-r3d.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/highway.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hipster-green.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hivacruz.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/homebrew.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hopscotch.256.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hopscotch.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hurtado.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/hybrid.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ic-green-ppl.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ic-orange-ppl.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iceberg-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iceberg-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/idea.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/idletoes.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ir-black.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-dark-background.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-default.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-light-background.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-smoooooth.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-solarized-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-tango-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/iterm2-tango-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/jackie-brown.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/japanesque.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/jellybeans.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/jetbrains-darcula.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/jubi.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/kanagawabones.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/kibble.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/kolorit.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/konsolas.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/kurokula.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/lab-fox.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/laser.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/later-this-evening.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/lavandula.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/liquidcarbon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/liquidcarbontransparent.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/lovelace.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/man-page.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/mariana.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/material.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/materialdark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/materialdarker.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/materialdesigncolors.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/materialocean.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/mathias.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/matrix.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/medallion.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/mellifluous.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/midnight-in-mojave.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/mirage.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/misterioso.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/molokai.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/monalisa.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/monokai-remastered.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/monokai-soda.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/monokai-vivid.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/n0tch2k.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/neobones-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/neobones-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/neon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/neopolitan.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/neutron.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/night-owlish-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nightfox.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nightlion-v1.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nightlion-v2.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/niji.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nocturnal-winter.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nord-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nord.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/novel.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nvimdark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/nvimlight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/obsidian.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ocean.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/oceanic-next.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/oceanicmaterial.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ollie.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/onehalfdark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/onehalflight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/operator-mono-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/overnight-slumber.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/oxocarbon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/palenighthc.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pandora.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/paraiso-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/paulmillr.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pencildark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pencillight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/peppermint.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/piatto-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pnevma.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/popping-and-locking.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/primary.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pro-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/pro.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/purple-rain.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/purplepeter.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rapture.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/raycast-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/raycast-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rebecca.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/red-alert.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/red-planet.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/red-sands.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/relaxed.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/retro.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rippedcasts.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rose-pine-dawn.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rose-pine-moon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rose-pine.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/rouge-2.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/royal.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ryuuko.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/sakura.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/scarlet-protocol.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/seafoam-pastel.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/seashells.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/seoulbones-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/seoulbones-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/seti.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/shades-of-purple.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/shaman.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/slate.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/sleepyhollow.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/smyck.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/snazzy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/softserver.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/solarized-darcula.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/solarized-dark---patched.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spacedust.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spacegray-eighties.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spacegray.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spiderman.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/spring.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/square.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/sublette.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/subliminal.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/sugarplum.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/sundried.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/symfonic.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/synthwave-everything.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/synthwave.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/synthwavealpha.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tango-adapted.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tango-half-adapted.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/teerb.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/terafox.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/terminal-basic.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/thayer-bright.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/the-hulk.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tinacious-design-(dark).toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tinacious-design-(light).toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tokyonight-day.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tokyonight-storm.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tokyonight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow-night-blue.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow-night-bright.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow-night-burns.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow-night.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/tomorrow.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/toychest.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/treehouse.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/twilight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ubuntu.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ultradark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/ultraviolent.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/underthesea.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/unikitty.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/urple.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/vaughn.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/vesper.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/vibrantink.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/vimbones.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/violet-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/violet-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/warmneon.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/wez.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/whimsy.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/wildcherry.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/wilmersdorf.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/wombat.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/wryan.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/xcodedark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/xcodedarkhc.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/xcodelight.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/xcodelighthc.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/xcodewwdc.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenbones-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenbones-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenbones.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenburn.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenburned.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenwritten-dark.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/themes/zenwritten-light.toml +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/api/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/api/registry_viewer.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/models_ui.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/services/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/templates/theme_mapper.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/theme_mapper.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/app/utils.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/index.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_agent_tools_checklist.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_create_flock_form.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_env_vars_table.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_flock_file_list.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_flock_upload_form.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_header_flock_status.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_load_manager_view.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_registry_table.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_results_display.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_settings_env_content.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_settings_theme_content.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_settings_view.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_structured_data_view.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/webapp/templates/partials/_theme_preview.html +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/activities.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/agent_activities.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/agent_execution_activity.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/flock_workflow.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/temporal_config.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/src/flock/workflow/temporal_setup.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/api/test_custom_endpoints.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/core/test_flock_batch.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/core/test_flock_core.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/__init__.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/test_enhanced_serialization.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/test_file_path_serialization.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/test_flock_serializer.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/test_nested_serialization.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/serialization/test_yaml_serialization.py +0 -0
- {flock_core-0.4.0b42 → flock_core-0.4.0b44}/tests/tools/test_zendesk_tools.py +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# src/flock/core/api/endpoints.py
|
|
2
|
+
"""FastAPI endpoints for the Flock API, using FastAPI's dependency injection."""
|
|
3
|
+
|
|
4
|
+
import uuid
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from fastapi import (
|
|
8
|
+
APIRouter,
|
|
9
|
+
BackgroundTasks,
|
|
10
|
+
Depends, # Crucial import for dependency injection
|
|
11
|
+
HTTPException,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from flock.core.logging.logging import get_logger
|
|
15
|
+
|
|
16
|
+
# Import the dependency provider functions
|
|
17
|
+
# This assumes you'll create 'src/flock/webapp/app/dependencies.py' (or similar)
|
|
18
|
+
# with get_flock_instance and get_run_store functions.
|
|
19
|
+
# For now, to make this file runnable in isolation for generation,
|
|
20
|
+
# we might need temporary stubs or to adjust the import path later.
|
|
21
|
+
# Let's assume a common location for dependencies.
|
|
22
|
+
from flock.webapp.app.dependencies import get_flock_instance, get_run_store
|
|
23
|
+
|
|
24
|
+
from .models import (
|
|
25
|
+
FlockAPIRequest,
|
|
26
|
+
FlockAPIResponse,
|
|
27
|
+
FlockBatchRequest,
|
|
28
|
+
FlockBatchResponse,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from flock.core.flock import Flock
|
|
33
|
+
|
|
34
|
+
from .run_store import RunStore
|
|
35
|
+
# We also need the _run_flock, _run_batch, _type_convert_inputs methods.
|
|
36
|
+
# These will be part of the Flock instance itself or helper functions
|
|
37
|
+
# that take Flock/RunStore as arguments. For now, let's assume they
|
|
38
|
+
# are methods on the Flock instance or can be called statically with it.
|
|
39
|
+
|
|
40
|
+
logger = get_logger("api.endpoints")
|
|
41
|
+
|
|
42
|
+
# The create_api_router function no longer needs to be passed the FlockAPI instance
|
|
43
|
+
# as dependencies will be injected directly into the route handlers.
|
|
44
|
+
def create_api_router() -> APIRouter:
|
|
45
|
+
"""Creates the APIRouter for core Flock API endpoints."""
|
|
46
|
+
router = APIRouter()
|
|
47
|
+
|
|
48
|
+
# --- API Endpoints ---
|
|
49
|
+
@router.post("/run/flock", response_model=FlockAPIResponse, tags=["Flock API Core"])
|
|
50
|
+
async def run_flock_workflow(
|
|
51
|
+
request_model: FlockAPIRequest, # Renamed from 'request' to avoid conflict with FastAPI's Request
|
|
52
|
+
background_tasks: BackgroundTasks,
|
|
53
|
+
flock_instance: "Flock" = Depends(get_flock_instance), # Injected
|
|
54
|
+
run_store: "RunStore" = Depends(get_run_store) # Injected
|
|
55
|
+
):
|
|
56
|
+
"""Run a flock workflow starting with the specified agent."""
|
|
57
|
+
run_id = None
|
|
58
|
+
try:
|
|
59
|
+
run_id = str(uuid.uuid4())
|
|
60
|
+
run_store.create_run(run_id)
|
|
61
|
+
response_data = run_store.get_run(run_id)
|
|
62
|
+
|
|
63
|
+
if not response_data:
|
|
64
|
+
logger.error(f"Failed to create run record for run_id: {run_id}")
|
|
65
|
+
raise HTTPException(status_code=500, detail="Failed to initialize run.")
|
|
66
|
+
|
|
67
|
+
processed_inputs = request_model.inputs if request_model.inputs else {}
|
|
68
|
+
logger.info(
|
|
69
|
+
f"API request: run flock '{request_model.agent_name}' (run_id: {run_id})",
|
|
70
|
+
inputs=processed_inputs,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# The _run_flock logic now needs to be called. It could be a method on
|
|
74
|
+
# flock_instance, or a static/helper function that takes flock_instance.
|
|
75
|
+
# Let's assume it's a method on flock_instance for now.
|
|
76
|
+
# To avoid direct calls to private-like methods from router,
|
|
77
|
+
# Flock class would expose a public method that handles this internal logic.
|
|
78
|
+
# For this refactoring step, let's assume a helper `_execute_flock_run` exists
|
|
79
|
+
# that we can call.
|
|
80
|
+
|
|
81
|
+
async def _execute_flock_run_task(run_id_task, agent_name_task, inputs_task):
|
|
82
|
+
# This is a simplified version of what was in FlockAPI._run_flock
|
|
83
|
+
try:
|
|
84
|
+
if agent_name_task not in flock_instance.agents:
|
|
85
|
+
raise ValueError(f"Starting agent '{agent_name_task}' not found")
|
|
86
|
+
# Type conversion would ideally be part of the Flock's run logic
|
|
87
|
+
# or a utility. For now, assume it's handled or simple.
|
|
88
|
+
# typed_inputs = flock_instance._type_convert_inputs(agent_name_task, inputs_task) # Example if kept on Flock
|
|
89
|
+
typed_inputs = inputs_task # Simplified for now
|
|
90
|
+
|
|
91
|
+
result = await flock_instance.run_async(
|
|
92
|
+
start_agent=agent_name_task, input=typed_inputs
|
|
93
|
+
)
|
|
94
|
+
run_store.update_run_result(run_id_task, result)
|
|
95
|
+
except Exception as e_task:
|
|
96
|
+
logger.error(f"Error in background flock run {run_id_task}: {e_task!s}", exc_info=True)
|
|
97
|
+
run_store.update_run_status(run_id_task, "failed", str(e_task))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if request_model.async_run:
|
|
101
|
+
logger.debug(
|
|
102
|
+
f"Running flock '{request_model.agent_name}' asynchronously (run_id: {run_id})"
|
|
103
|
+
)
|
|
104
|
+
background_tasks.add_task(
|
|
105
|
+
_execute_flock_run_task,
|
|
106
|
+
run_id,
|
|
107
|
+
request_model.agent_name,
|
|
108
|
+
processed_inputs,
|
|
109
|
+
)
|
|
110
|
+
run_store.update_run_status(run_id, "running")
|
|
111
|
+
response_data.status = "running"
|
|
112
|
+
else:
|
|
113
|
+
logger.debug(
|
|
114
|
+
f"Running flock '{request_model.agent_name}' synchronously (run_id: {run_id})"
|
|
115
|
+
)
|
|
116
|
+
await _execute_flock_run_task(
|
|
117
|
+
run_id, request_model.agent_name, processed_inputs
|
|
118
|
+
)
|
|
119
|
+
response_data = run_store.get_run(run_id)
|
|
120
|
+
|
|
121
|
+
if not response_data:
|
|
122
|
+
logger.error(f"Run data lost for run_id: {run_id} after execution.")
|
|
123
|
+
raise HTTPException(status_code=500, detail="Run data lost after execution.")
|
|
124
|
+
|
|
125
|
+
return response_data
|
|
126
|
+
except ValueError as ve:
|
|
127
|
+
logger.error(f"Value error starting run for agent '{request_model.agent_name}': {ve}", exc_info=True)
|
|
128
|
+
if run_id: run_store.update_run_status(run_id, "failed", str(ve))
|
|
129
|
+
raise HTTPException(status_code=400, detail=str(ve))
|
|
130
|
+
except Exception as e:
|
|
131
|
+
error_msg = f"Internal server error during flock run: {type(e).__name__}"
|
|
132
|
+
logger.error(f"Error starting flock run: {e!s}", exc_info=True)
|
|
133
|
+
if run_id: run_store.update_run_status(run_id, "failed", error_msg)
|
|
134
|
+
raise HTTPException(status_code=500, detail=error_msg)
|
|
135
|
+
|
|
136
|
+
@router.post("/run/batch", response_model=FlockBatchResponse, tags=["Flock API Core"])
|
|
137
|
+
async def run_batch_workflow(
|
|
138
|
+
request_model: FlockBatchRequest, # Renamed from 'request'
|
|
139
|
+
background_tasks: BackgroundTasks,
|
|
140
|
+
flock_instance: "Flock" = Depends(get_flock_instance),
|
|
141
|
+
run_store: "RunStore" = Depends(get_run_store)
|
|
142
|
+
):
|
|
143
|
+
"""Run a batch of inputs through the flock workflow."""
|
|
144
|
+
batch_id = None
|
|
145
|
+
try:
|
|
146
|
+
if request_model.agent_name not in flock_instance.agents:
|
|
147
|
+
raise ValueError(f"Agent '{request_model.agent_name}' not found in current Flock.")
|
|
148
|
+
|
|
149
|
+
if isinstance(request_model.batch_inputs, list) and not request_model.batch_inputs:
|
|
150
|
+
raise ValueError("Batch inputs list cannot be empty if provided as a list.")
|
|
151
|
+
|
|
152
|
+
batch_id = str(uuid.uuid4())
|
|
153
|
+
run_store.create_batch(batch_id)
|
|
154
|
+
response_data = run_store.get_batch(batch_id)
|
|
155
|
+
|
|
156
|
+
if not response_data:
|
|
157
|
+
logger.error(f"Failed to create batch record for batch_id: {batch_id}")
|
|
158
|
+
raise HTTPException(status_code=500, detail="Failed to initialize batch run.")
|
|
159
|
+
|
|
160
|
+
batch_size = (
|
|
161
|
+
len(request_model.batch_inputs)
|
|
162
|
+
if isinstance(request_model.batch_inputs, list)
|
|
163
|
+
else "CSV/DataFrame"
|
|
164
|
+
)
|
|
165
|
+
logger.info(
|
|
166
|
+
f"API request: run batch with '{request_model.agent_name}' (batch_id: {batch_id})",
|
|
167
|
+
batch_size=batch_size,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
async def _execute_flock_batch_task(batch_id_task, batch_request_task: FlockBatchRequest):
|
|
171
|
+
# This is a simplified version of what was in FlockAPI._run_batch
|
|
172
|
+
try:
|
|
173
|
+
# Directly use the flock_instance's run_batch_async method
|
|
174
|
+
results = await flock_instance.run_batch_async(
|
|
175
|
+
start_agent=batch_request_task.agent_name,
|
|
176
|
+
batch_inputs=batch_request_task.batch_inputs,
|
|
177
|
+
input_mapping=batch_request_task.input_mapping,
|
|
178
|
+
static_inputs=batch_request_task.static_inputs,
|
|
179
|
+
parallel=batch_request_task.parallel,
|
|
180
|
+
max_workers=batch_request_task.max_workers,
|
|
181
|
+
use_temporal=batch_request_task.use_temporal,
|
|
182
|
+
box_results=batch_request_task.box_results,
|
|
183
|
+
return_errors=batch_request_task.return_errors,
|
|
184
|
+
silent_mode=True, # API batch runs should be internally silent
|
|
185
|
+
write_to_csv=None # API handles CSV writing based on request if needed, not here
|
|
186
|
+
)
|
|
187
|
+
run_store.update_batch_result(batch_id_task, results)
|
|
188
|
+
logger.info(f"Batch run completed (batch_id: {batch_id_task})", num_results=len(results))
|
|
189
|
+
except Exception as e_task:
|
|
190
|
+
logger.error(f"Error in background flock batch {batch_id_task}: {e_task!s}", exc_info=True)
|
|
191
|
+
run_store.update_batch_status(batch_id_task, "failed", str(e_task))
|
|
192
|
+
|
|
193
|
+
logger.debug(
|
|
194
|
+
f"Running batch with '{request_model.agent_name}' asynchronously (batch_id: {batch_id})"
|
|
195
|
+
)
|
|
196
|
+
background_tasks.add_task(
|
|
197
|
+
_execute_flock_batch_task,
|
|
198
|
+
batch_id,
|
|
199
|
+
request_model, # Pass the Pydantic request model
|
|
200
|
+
)
|
|
201
|
+
run_store.update_batch_status(batch_id, "running")
|
|
202
|
+
response_data.status = "running"
|
|
203
|
+
|
|
204
|
+
return response_data
|
|
205
|
+
except ValueError as ve:
|
|
206
|
+
error_msg = f"Value error starting batch for agent '{request_model.agent_name}': {ve}"
|
|
207
|
+
logger.error(error_msg, exc_info=True)
|
|
208
|
+
if batch_id: run_store.update_batch_status(batch_id, "failed", str(ve))
|
|
209
|
+
raise HTTPException(status_code=400, detail=str(ve))
|
|
210
|
+
except Exception as e:
|
|
211
|
+
error_msg = f"Internal server error during batch run: {type(e).__name__}: {e!s}"
|
|
212
|
+
logger.error(error_msg, exc_info=True)
|
|
213
|
+
if batch_id: run_store.update_batch_status(batch_id, "failed", error_msg)
|
|
214
|
+
raise HTTPException(status_code=500, detail=error_msg)
|
|
215
|
+
|
|
216
|
+
@router.get("/run/{run_id}", response_model=FlockAPIResponse, tags=["Flock API Core"])
|
|
217
|
+
async def get_run_status(
|
|
218
|
+
run_id: str,
|
|
219
|
+
run_store: "RunStore" = Depends(get_run_store)
|
|
220
|
+
):
|
|
221
|
+
"""Get the status of a specific run."""
|
|
222
|
+
logger.debug(f"API request: get status for run_id: {run_id}")
|
|
223
|
+
run_data = run_store.get_run(run_id)
|
|
224
|
+
if not run_data:
|
|
225
|
+
logger.warning(f"Run ID not found: {run_id}")
|
|
226
|
+
raise HTTPException(status_code=404, detail="Run not found")
|
|
227
|
+
return run_data
|
|
228
|
+
|
|
229
|
+
@router.get("/batch/{batch_id}", response_model=FlockBatchResponse, tags=["Flock API Core"])
|
|
230
|
+
async def get_batch_status(
|
|
231
|
+
batch_id: str,
|
|
232
|
+
run_store: "RunStore" = Depends(get_run_store)
|
|
233
|
+
):
|
|
234
|
+
"""Get the status and results of a specific batch run."""
|
|
235
|
+
logger.debug(f"API request: get status for batch_id: {batch_id}")
|
|
236
|
+
batch_data = run_store.get_batch(batch_id)
|
|
237
|
+
if not batch_data:
|
|
238
|
+
logger.warning(f"Batch ID not found: {batch_id}")
|
|
239
|
+
raise HTTPException(status_code=404, detail="Batch not found")
|
|
240
|
+
return batch_data
|
|
241
|
+
|
|
242
|
+
@router.get("/agents", tags=["Flock API Core"])
|
|
243
|
+
async def list_agents(
|
|
244
|
+
flock_instance: "Flock" = Depends(get_flock_instance)
|
|
245
|
+
):
|
|
246
|
+
"""List all available agents in the currently loaded Flock."""
|
|
247
|
+
logger.debug("API request: list agents")
|
|
248
|
+
agents_list = [
|
|
249
|
+
{"name": agent.name, "description": agent.description or agent.name}
|
|
250
|
+
for agent in flock_instance.agents.values()
|
|
251
|
+
]
|
|
252
|
+
return {"agents": agents_list}
|
|
253
|
+
|
|
254
|
+
return router
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# src/flock/core/api/main.py
|
|
2
|
+
"""This module defines the FlockAPI class, which is now primarily responsible for
|
|
3
|
+
managing and adding user-defined custom API endpoints to a main FastAPI application.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import inspect
|
|
7
|
+
from collections.abc import Callable, Sequence
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
|
+
|
|
10
|
+
from fastapi import ( # Ensure Request is aliased
|
|
11
|
+
Body,
|
|
12
|
+
Depends,
|
|
13
|
+
FastAPI,
|
|
14
|
+
Request as FastAPIRequest,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from flock.core.logging.logging import get_logger
|
|
18
|
+
|
|
19
|
+
from .custom_endpoint import FlockEndpoint
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from flock.core.flock import Flock
|
|
23
|
+
|
|
24
|
+
logger = get_logger("core.api.custom_setup")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class FlockAPI:
|
|
28
|
+
"""A helper class to manage the addition of user-defined custom API endpoints
|
|
29
|
+
to an existing FastAPI application, in the context of a Flock instance.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
flock_instance: "Flock",
|
|
35
|
+
custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
|
|
36
|
+
):
|
|
37
|
+
self.flock = flock_instance
|
|
38
|
+
self.processed_custom_endpoints: list[FlockEndpoint] = []
|
|
39
|
+
if custom_endpoints:
|
|
40
|
+
if isinstance(custom_endpoints, dict):
|
|
41
|
+
logger.warning("Received custom_endpoints as dict, converting. Prefer Sequence[FlockEndpoint].")
|
|
42
|
+
for (path, methods), cb in custom_endpoints.items():
|
|
43
|
+
self.processed_custom_endpoints.append(
|
|
44
|
+
FlockEndpoint(path=path, methods=list(methods) if methods else ["GET"], callback=cb)
|
|
45
|
+
)
|
|
46
|
+
elif isinstance(custom_endpoints, Sequence):
|
|
47
|
+
for ep_item in custom_endpoints: # Renamed loop variable
|
|
48
|
+
if isinstance(ep_item, FlockEndpoint):
|
|
49
|
+
self.processed_custom_endpoints.append(ep_item)
|
|
50
|
+
else:
|
|
51
|
+
logger.warning(f"Skipping non-FlockEndpoint item in custom_endpoints sequence: {type(ep_item)}")
|
|
52
|
+
else:
|
|
53
|
+
logger.warning(f"Unsupported type for custom_endpoints: {type(custom_endpoints)}")
|
|
54
|
+
logger.info(
|
|
55
|
+
f"FlockAPI helper initialized for Flock: '{self.flock.name}'. "
|
|
56
|
+
f"Prepared {len(self.processed_custom_endpoints)} custom endpoints."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def add_custom_routes_to_app(self, app: FastAPI):
|
|
60
|
+
if not self.processed_custom_endpoints:
|
|
61
|
+
logger.debug("No custom endpoints to add to the FastAPI app.")
|
|
62
|
+
return
|
|
63
|
+
|
|
64
|
+
logger.info(f"Adding {len(self.processed_custom_endpoints)} custom endpoints to the FastAPI app instance.")
|
|
65
|
+
|
|
66
|
+
for current_ep_def in self.processed_custom_endpoints: # Use current_ep_def to avoid closure issues
|
|
67
|
+
|
|
68
|
+
# This factory now takes current_ep_def to ensure it uses the correct endpoint's details
|
|
69
|
+
def _create_handler_factory(
|
|
70
|
+
# Capture the specific endpoint definition for this factory instance
|
|
71
|
+
specific_ep: FlockEndpoint
|
|
72
|
+
):
|
|
73
|
+
# This inner function prepares the payload and calls the user's callback
|
|
74
|
+
async def _invoke_user_callback(
|
|
75
|
+
request_param: FastAPIRequest, # Parameter for FastAPI's Request object
|
|
76
|
+
body_param: Any, # Will be populated by the _route_handler
|
|
77
|
+
query_param: Any # Will be populated by the _route_handler
|
|
78
|
+
):
|
|
79
|
+
payload_to_user: dict[str, Any] = {"flock": self.flock} # self here refers to FlockAPI instance
|
|
80
|
+
|
|
81
|
+
if request_param: # Ensure request_param is not None
|
|
82
|
+
payload_to_user.update(request_param.path_params)
|
|
83
|
+
# query_param is already the parsed Pydantic model or None
|
|
84
|
+
if specific_ep.query_model and query_param is not None:
|
|
85
|
+
payload_to_user["query"] = query_param
|
|
86
|
+
# Fallback for raw query if callback expects 'query' but no query_model was set
|
|
87
|
+
elif 'query' in inspect.signature(specific_ep.callback).parameters and not specific_ep.query_model:
|
|
88
|
+
if request_param.query_params:
|
|
89
|
+
payload_to_user["query"] = dict(request_param.query_params)
|
|
90
|
+
|
|
91
|
+
# body_param is already the parsed Pydantic model or None
|
|
92
|
+
if specific_ep.request_model and body_param is not None:
|
|
93
|
+
payload_to_user["body"] = body_param
|
|
94
|
+
# Fallback for raw body if callback expects 'body' but no request_model was set
|
|
95
|
+
elif 'body' in inspect.signature(specific_ep.callback).parameters and \
|
|
96
|
+
not specific_ep.request_model and \
|
|
97
|
+
request_param.method in {"POST", "PUT", "PATCH"}:
|
|
98
|
+
try: payload_to_user["body"] = await request_param.json()
|
|
99
|
+
except Exception: payload_to_user["body"] = await request_param.body()
|
|
100
|
+
|
|
101
|
+
# If user callback explicitly asks for 'request'
|
|
102
|
+
if 'request' in inspect.signature(specific_ep.callback).parameters:
|
|
103
|
+
payload_to_user['request'] = request_param
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
user_callback_sig = inspect.signature(specific_ep.callback)
|
|
107
|
+
final_kwargs = {
|
|
108
|
+
k: v for k, v in payload_to_user.items() if k in user_callback_sig.parameters
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if inspect.iscoroutinefunction(specific_ep.callback):
|
|
112
|
+
return await specific_ep.callback(**final_kwargs)
|
|
113
|
+
return specific_ep.callback(**final_kwargs)
|
|
114
|
+
|
|
115
|
+
# --- Select the correct handler signature based on specific_ep's models ---
|
|
116
|
+
if specific_ep.request_model and specific_ep.query_model:
|
|
117
|
+
async def _route_handler_body_query(
|
|
118
|
+
request: FastAPIRequest, # Correct alias for FastAPI Request
|
|
119
|
+
body: specific_ep.request_model = Body(...), # type: ignore
|
|
120
|
+
query: specific_ep.query_model = Depends(specific_ep.query_model) # type: ignore
|
|
121
|
+
):
|
|
122
|
+
return await _invoke_user_callback(request, body, query)
|
|
123
|
+
return _route_handler_body_query
|
|
124
|
+
elif specific_ep.request_model and not specific_ep.query_model:
|
|
125
|
+
async def _route_handler_body_only(
|
|
126
|
+
request: FastAPIRequest, # Correct alias
|
|
127
|
+
body: specific_ep.request_model = Body(...) # type: ignore
|
|
128
|
+
):
|
|
129
|
+
return await _invoke_user_callback(request, body, None)
|
|
130
|
+
return _route_handler_body_only
|
|
131
|
+
elif not specific_ep.request_model and specific_ep.query_model:
|
|
132
|
+
async def _route_handler_query_only(
|
|
133
|
+
request: FastAPIRequest, # Correct alias
|
|
134
|
+
query: specific_ep.query_model = Depends(specific_ep.query_model) # type: ignore
|
|
135
|
+
):
|
|
136
|
+
return await _invoke_user_callback(request, None, query)
|
|
137
|
+
return _route_handler_query_only
|
|
138
|
+
else: # Neither request_model nor query_model
|
|
139
|
+
async def _route_handler_request_only(
|
|
140
|
+
request: FastAPIRequest # Correct alias
|
|
141
|
+
):
|
|
142
|
+
return await _invoke_user_callback(request, None, None)
|
|
143
|
+
return _route_handler_request_only
|
|
144
|
+
|
|
145
|
+
# Create the handler for the current_ep_def
|
|
146
|
+
selected_handler = _create_handler_factory(current_ep_def) # Pass current_ep_def
|
|
147
|
+
selected_handler.__name__ = f"handler_for_{current_ep_def.path.replace('/', '_').lstrip('_')}_{current_ep_def.methods[0]}"
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
app.add_api_route(
|
|
151
|
+
current_ep_def.path,
|
|
152
|
+
selected_handler,
|
|
153
|
+
methods=current_ep_def.methods or ["GET"],
|
|
154
|
+
name=current_ep_def.name or f"custom:{current_ep_def.path.replace('/', '_').lstrip('_')}",
|
|
155
|
+
include_in_schema=current_ep_def.include_in_schema,
|
|
156
|
+
response_model=current_ep_def.response_model,
|
|
157
|
+
summary=current_ep_def.summary,
|
|
158
|
+
description=current_ep_def.description,
|
|
159
|
+
dependencies=current_ep_def.dependencies,
|
|
160
|
+
tags=["Flock API Custom Endpoints"],
|
|
161
|
+
)
|
|
162
|
+
logger.debug(f"Added custom route to app: {current_ep_def.methods} {current_ep_def.path} (Handler: {selected_handler.__name__}, Summary: {current_ep_def.summary})")
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# flock/core/api/service.py
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from flock.core.api.endpoints import FlockBatchRequest
|
|
6
|
+
from flock.core.api.run_store import RunStore
|
|
7
|
+
from flock.core.flock import Flock
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from flock.core.logging.logging import get_logger
|
|
11
|
+
|
|
12
|
+
logger = get_logger("flock.api")
|
|
13
|
+
|
|
14
|
+
class FlockApiService:
|
|
15
|
+
def __init__(self, flock_instance: "Flock", run_store_instance: "RunStore"):
|
|
16
|
+
self.flock = flock_instance
|
|
17
|
+
self.run_store = run_store_instance
|
|
18
|
+
# You would move the _run_flock, _run_batch, _type_convert_inputs methods here
|
|
19
|
+
# from the old FlockAPI class.
|
|
20
|
+
async def _run_flock(
|
|
21
|
+
self, run_id: str, agent_name: str, inputs: dict[str, Any]
|
|
22
|
+
):
|
|
23
|
+
"""Executes a flock workflow run (internal helper)."""
|
|
24
|
+
try:
|
|
25
|
+
if agent_name not in self.flock.agents:
|
|
26
|
+
raise ValueError(f"Starting agent '{agent_name}' not found")
|
|
27
|
+
|
|
28
|
+
typed_inputs = self._type_convert_inputs(agent_name, inputs)
|
|
29
|
+
|
|
30
|
+
logger.debug(
|
|
31
|
+
f"Executing flock workflow starting with '{agent_name}' (run_id: {run_id})",
|
|
32
|
+
inputs=typed_inputs,
|
|
33
|
+
)
|
|
34
|
+
# Flock.run_async now handles context creation and execution
|
|
35
|
+
result = await self.flock.run_async(
|
|
36
|
+
start_agent=agent_name, input=typed_inputs
|
|
37
|
+
)
|
|
38
|
+
self.run_store.update_run_result(run_id, result)
|
|
39
|
+
|
|
40
|
+
final_agent_name = (
|
|
41
|
+
result.get("agent_name", "N/A") if isinstance(result, dict) else "N/A"
|
|
42
|
+
) # Handle if result is not a dict (e.g. Box)
|
|
43
|
+
logger.info(
|
|
44
|
+
f"Flock workflow completed (run_id: {run_id})",
|
|
45
|
+
final_agent=final_agent_name,
|
|
46
|
+
)
|
|
47
|
+
except Exception as e:
|
|
48
|
+
logger.error(
|
|
49
|
+
f"Error in flock run {run_id} (started with '{agent_name}'): {e!s}",
|
|
50
|
+
exc_info=True,
|
|
51
|
+
)
|
|
52
|
+
self.run_store.update_run_status(run_id, "failed", str(e))
|
|
53
|
+
raise
|
|
54
|
+
|
|
55
|
+
async def _run_batch(self, batch_id: str, request: "FlockBatchRequest"):
|
|
56
|
+
"""Executes a batch of runs (internal helper)."""
|
|
57
|
+
try:
|
|
58
|
+
if request.agent_name not in self.flock.agents:
|
|
59
|
+
raise ValueError(f"Agent '{request.agent_name}' not found")
|
|
60
|
+
|
|
61
|
+
logger.debug(
|
|
62
|
+
f"Executing batch run starting with '{request.agent_name}' (batch_id: {batch_id})",
|
|
63
|
+
batch_size=len(request.batch_inputs)
|
|
64
|
+
if isinstance(request.batch_inputs, list)
|
|
65
|
+
else "CSV/DataFrame",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# --- Re-integrating the threaded batch execution from Flock.run_batch_async ---
|
|
69
|
+
import asyncio
|
|
70
|
+
import threading
|
|
71
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
72
|
+
|
|
73
|
+
def run_batch_sync_in_thread():
|
|
74
|
+
loop = asyncio.new_event_loop()
|
|
75
|
+
asyncio.set_event_loop(loop)
|
|
76
|
+
try:
|
|
77
|
+
batch_size = (
|
|
78
|
+
len(request.batch_inputs)
|
|
79
|
+
if isinstance(request.batch_inputs, list)
|
|
80
|
+
else 0 # Or attempt to get from DataFrame/CSV load
|
|
81
|
+
)
|
|
82
|
+
if batch_size > 0:
|
|
83
|
+
self.run_store.set_batch_total_items(batch_id, batch_size)
|
|
84
|
+
|
|
85
|
+
class ProgressTracker:
|
|
86
|
+
def __init__(self, store, b_id, total_size):
|
|
87
|
+
self.store, self.batch_id, self.total_size = store, b_id, total_size
|
|
88
|
+
self.current_count, self.partial_results, self._lock = 0, [], threading.Lock()
|
|
89
|
+
def increment(self, res=None):
|
|
90
|
+
with self._lock:
|
|
91
|
+
self.current_count += 1
|
|
92
|
+
if res is not None: self.partial_results.append(res)
|
|
93
|
+
try: self.store.update_batch_progress(self.batch_id, self.current_count, self.partial_results)
|
|
94
|
+
except Exception as e_prog: logger.error(f"Error updating progress: {e_prog}")
|
|
95
|
+
return self.current_count
|
|
96
|
+
|
|
97
|
+
progress_tracker = ProgressTracker(self.run_store, batch_id, batch_size)
|
|
98
|
+
|
|
99
|
+
async def progress_aware_worker(index, item_inputs):
|
|
100
|
+
try:
|
|
101
|
+
# Call Flock's run_async for a single item
|
|
102
|
+
item_result = await self.flock.run_async(
|
|
103
|
+
start_agent=request.agent_name,
|
|
104
|
+
input=item_inputs,
|
|
105
|
+
box_result=request.box_results,
|
|
106
|
+
)
|
|
107
|
+
progress_tracker.increment(item_result)
|
|
108
|
+
return item_result
|
|
109
|
+
except Exception as item_err:
|
|
110
|
+
logger.error(f"Error processing batch item {index}: {item_err}")
|
|
111
|
+
progress_tracker.increment(item_err if request.return_errors else None)
|
|
112
|
+
if request.return_errors: return item_err
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
batch_inputs_list = request.batch_inputs
|
|
116
|
+
actual_results_list = []
|
|
117
|
+
|
|
118
|
+
if isinstance(batch_inputs_list, list):
|
|
119
|
+
tasks = []
|
|
120
|
+
for i, item_inputs in enumerate(batch_inputs_list):
|
|
121
|
+
full_inputs = {**(request.static_inputs or {}), **item_inputs}
|
|
122
|
+
tasks.append(progress_aware_worker(i, full_inputs))
|
|
123
|
+
|
|
124
|
+
if request.parallel and request.max_workers > 1:
|
|
125
|
+
semaphore = asyncio.Semaphore(request.max_workers)
|
|
126
|
+
async def bounded_worker(idx, inputs_item):
|
|
127
|
+
async with semaphore: return await progress_aware_worker(idx, inputs_item)
|
|
128
|
+
bounded_tasks = [bounded_worker(i, {**(request.static_inputs or {}), **item}) for i, item in enumerate(batch_inputs_list)]
|
|
129
|
+
actual_results_list = loop.run_until_complete(asyncio.gather(*bounded_tasks, return_exceptions=request.return_errors))
|
|
130
|
+
else:
|
|
131
|
+
for i, item_inputs in enumerate(batch_inputs_list):
|
|
132
|
+
full_inputs = {**(request.static_inputs or {}), **item_inputs}
|
|
133
|
+
actual_results_list.append(loop.run_until_complete(progress_aware_worker(i, full_inputs)))
|
|
134
|
+
else: # DataFrame or CSV path - let Flock's batch processor handle this directly
|
|
135
|
+
# This path relies on self.flock.run_batch_async being able to run within this new event loop.
|
|
136
|
+
# It might be simpler to always convert DataFrame/CSV to list of dicts before this point.
|
|
137
|
+
actual_results_list = loop.run_until_complete(
|
|
138
|
+
self.flock.run_batch_async(
|
|
139
|
+
start_agent=request.agent_name,
|
|
140
|
+
batch_inputs=request.batch_inputs, # DataFrame or path
|
|
141
|
+
input_mapping=request.input_mapping,
|
|
142
|
+
static_inputs=request.static_inputs,
|
|
143
|
+
parallel=request.parallel, # Will be re-evaluated by internal BatchProcessor
|
|
144
|
+
max_workers=request.max_workers,
|
|
145
|
+
use_temporal=request.use_temporal, # Will be re-evaluated
|
|
146
|
+
box_results=request.box_results,
|
|
147
|
+
return_errors=request.return_errors,
|
|
148
|
+
silent_mode=True, # Internal batch runs silently for API
|
|
149
|
+
write_to_csv=None # API handles CSV output separately if needed
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
# Progress for DataFrame/CSV would need integration into BatchProcessor or this loop
|
|
153
|
+
if actual_results_list:
|
|
154
|
+
self.run_store.set_batch_total_items(batch_id, len(actual_results_list))
|
|
155
|
+
self.run_store.update_batch_progress(batch_id, len(actual_results_list), actual_results_list)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
self.run_store.update_batch_result(batch_id, actual_results_list)
|
|
159
|
+
logger.info(f"Batch run completed (batch_id: {batch_id})", num_results=len(actual_results_list))
|
|
160
|
+
return actual_results_list
|
|
161
|
+
except Exception as thread_err:
|
|
162
|
+
logger.error(f"Error in batch run thread {batch_id}: {thread_err!s}", exc_info=True)
|
|
163
|
+
self.run_store.update_batch_status(batch_id, "failed", str(thread_err))
|
|
164
|
+
return None
|
|
165
|
+
finally:
|
|
166
|
+
loop.close()
|
|
167
|
+
# --- End of re-integrated threaded batch execution ---
|
|
168
|
+
|
|
169
|
+
# Submit the synchronous function to a thread pool from the main event loop
|
|
170
|
+
main_loop = asyncio.get_running_loop()
|
|
171
|
+
with ThreadPoolExecutor(thread_name_prefix="flock-api-batch") as pool:
|
|
172
|
+
await main_loop.run_in_executor(pool, run_batch_sync_in_thread)
|
|
173
|
+
|
|
174
|
+
except Exception as e:
|
|
175
|
+
logger.error(
|
|
176
|
+
f"Error setting up batch run {batch_id} (started with '{request.agent_name}'): {e!s}",
|
|
177
|
+
exc_info=True,
|
|
178
|
+
)
|
|
179
|
+
self.run_store.update_batch_status(batch_id, "failed", str(e))
|
|
180
|
+
raise
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _type_convert_inputs(
|
|
187
|
+
self, agent_name: str, inputs: dict[str, Any]
|
|
188
|
+
) -> dict[str, Any]:
|
|
189
|
+
"""Converts input values (esp. from forms) to expected Python types."""
|
|
190
|
+
typed_inputs = {}
|
|
191
|
+
agent_def = self.flock.agents.get(agent_name)
|
|
192
|
+
if not agent_def or not agent_def.input or not isinstance(agent_def.input, str):
|
|
193
|
+
return inputs # Return original if no spec or spec is not a string
|
|
194
|
+
|
|
195
|
+
parsed_fields = self._parse_input_spec(agent_def.input) # Relies on the old UI helper
|
|
196
|
+
field_types = {f["name"]: f["type"] for f in parsed_fields}
|
|
197
|
+
|
|
198
|
+
for k, v in inputs.items():
|
|
199
|
+
target_type_str = field_types.get(k)
|
|
200
|
+
if target_type_str:
|
|
201
|
+
if target_type_str.startswith("bool"):
|
|
202
|
+
typed_inputs[k] = str(v).lower() in ["true", "on", "1", "yes"] if isinstance(v, str) else bool(v)
|
|
203
|
+
elif target_type_str.startswith("int"):
|
|
204
|
+
try: typed_inputs[k] = int(v)
|
|
205
|
+
except (ValueError, TypeError): logger.warning(f"Could not convert '{k}' value '{v}' to int for agent '{agent_name}'"); typed_inputs[k] = v
|
|
206
|
+
elif target_type_str.startswith("float"):
|
|
207
|
+
try: typed_inputs[k] = float(v)
|
|
208
|
+
except (ValueError, TypeError): logger.warning(f"Could not convert '{k}' value '{v}' to float for agent '{agent_name}'"); typed_inputs[k] = v
|
|
209
|
+
# TODO: Add list/dict parsing (e.g., json.loads) if type_str indicates these,
|
|
210
|
+
# especially if inputs come from HTML forms as strings.
|
|
211
|
+
else: typed_inputs[k] = v
|
|
212
|
+
else:
|
|
213
|
+
typed_inputs[k] = v
|
|
214
|
+
return typed_inputs
|