flock-core 0.5.9__tar.gz → 0.5.11__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.5.11/.github/issue_draft_non_blocking_serve.md +205 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/AGENTS.md +285 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/PKG-INFO +150 -26
- {flock_core-0.5.9 → flock_core-0.5.11}/README.md +149 -25
- flock_core-0.5.11/docs/guides/context-providers.md +1515 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/dashboard.md +28 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/index.md +11 -0
- flock_core-0.5.11/docs/guides/rest-api.md +466 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/visibility.md +95 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/02-multi_publish.py +10 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/03-multi-artifact-multi-publish.py +12 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/04-fan-out.py +3 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/05-multi-fan-out.py +10 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/01_declarative_pizza.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/04_input_and_output.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/06_mcp_roots.py +14 -14
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/09_debate_club.py +2 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/10_news_agency.py +2 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/11_tracing_detective.py +4 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/01_declarative_pizza.py +2 -1
- flock_core-0.5.11/examples/02-dashboard/02_non_blocking_serve.py +97 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/04_input_and_output.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/06_mcp_roots.py +11 -13
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/09_debate_club.py +2 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/13_medical_diagnostics_joinspec.py +15 -6
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/16_news_batching.py +2 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_03_web_detective.py +10 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_05_tracing_detective.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_07_news_agency.py +4 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_08_the_matchmaker.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_11_performance_monitor.py +7 -5
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_12_confidence_booster.py +26 -9
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_13_regex_matcher.py +12 -6
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/01_persistent_pizza.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/04_persistent_pizza_dashboard.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/05-engines/emoji_mood_engine.py +12 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/05-engines/potion_batch_engine.py +40 -25
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/06-agent-components/cheer_meter_component.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/06-agent-components/plot_twist_component.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/07-orchestrator-components/kitchen_monitor_component.py +13 -15
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/07-orchestrator-components/quest_tracker_component.py +15 -3
- flock_core-0.5.11/examples/08-context-provider/01_basic_visibility.py +144 -0
- flock_core-0.5.11/examples/08-context-provider/02_global_provider.py +192 -0
- flock_core-0.5.11/examples/08-context-provider/02_simple_global_provider.py +49 -0
- flock_core-0.5.11/examples/08-context-provider/03_per_agent_provider.py +233 -0
- flock_core-0.5.11/examples/08-context-provider/04_custom_filtering.py +247 -0
- flock_core-0.5.11/examples/08-context-provider/05_password_redactor.py +435 -0
- flock_core-0.5.11/examples/08-context-provider/README.md +502 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/pyproject.toml +7 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/agent.py +149 -62
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/api/themes.py +6 -2
- flock_core-0.5.11/src/flock/api_models.py +285 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/artifact_collector.py +6 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/batch_accumulator.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/cli.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/components.py +45 -56
- flock_core-0.5.11/src/flock/context_provider.py +531 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/correlation_engine.py +8 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/collector.py +48 -29
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/events.py +10 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/launcher.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/models/graph.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/service.py +187 -93
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/websocket.py +17 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/engines/dspy_engine.py +174 -98
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/engines/examples/simple_batch_engine.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/examples.py +6 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/indexeddb.test.ts +4 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/indexeddb.ts +1 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/helper/cli_helper.py +14 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/auto_trace.py +6 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/formatters/enum_builder.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/formatters/theme_builder.py +32 -17
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/formatters/themed_formatter.py +38 -22
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/logging.py +21 -7
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/telemetry.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/telemetry_exporter/duckdb_exporter.py +27 -25
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/trace_and_logged.py +14 -5
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/__init__.py +3 -6
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/client.py +49 -19
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/config.py +12 -6
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/manager.py +6 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/sse/flock_sse_server.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/streamable_http/flock_streamable_http_server.py +6 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/tool.py +18 -6
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/types/handlers.py +3 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/types/types.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/orchestrator.py +449 -58
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/orchestrator_component.py +15 -5
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/patches/dspy_streaming_patch.py +12 -4
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/registry.py +9 -3
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/runtime.py +69 -18
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/service.py +135 -64
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/store.py +29 -10
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/subscription.py +6 -4
- flock_core-0.5.11/src/flock/system_artifacts.py +33 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/utilities.py +41 -13
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/utility/output_utility_component.py +31 -11
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/e2e/test_critical_scenarios.py +2 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/integration/test_orchestrator_dashboard.py +241 -0
- flock_core-0.5.11/tests/test_api_models.py +320 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_components.py +121 -195
- flock_core-0.5.11/tests/test_context_provider.py +1266 -0
- flock_core-0.5.11/tests/test_context_security.py +325 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dspy_engine.py +51 -41
- flock_core-0.5.11/tests/test_engine_context.py +283 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_engines.py +3 -2
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_batchspec.py +2 -2
- flock_core-0.5.11/tests/test_orchestrator_context_injection.py +578 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_runtime.py +17 -17
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_subscription.py +1 -1
- {flock_core-0.5.9 → flock_core-0.5.11}/uv.lock +386 -367
- flock_core-0.5.9/docs/specs/001-sqlite-blackboard-store/PLAN.md +0 -169
- flock_core-0.5.9/docs/specs/001-sqlite-blackboard-store/PRD.md +0 -146
- flock_core-0.5.9/docs/specs/002-ui-optimization-migration/PHASE_4.1_AFTERMATH_AUDIT.md +0 -243
- flock_core-0.5.9/docs/specs/002-ui-optimization-migration/PHASE_4.1_TASK_LIST.md +0 -464
- flock_core-0.5.9/docs/specs/002-ui-optimization-migration/PLAN.md +0 -743
- flock_core-0.5.9/docs/specs/002-ui-optimization-migration/PRD.md +0 -146
- flock_core-0.5.9/docs/specs/003-logic-operations/PLAN.md +0 -1252
- flock_core-0.5.9/docs/specs/004-logic-operations-ux/PLAN.md +0 -630
- flock_core-0.5.9/docs/specs/004-logic-operations-ux/PRD.md +0 -146
- flock_core-0.5.9/docs/specs/004-orchestrator-component/LOGGING_GUIDE.md +0 -652
- flock_core-0.5.9/docs/specs/004-orchestrator-component/PLAN.md +0 -509
- flock_core-0.5.9/docs/specs/004-orchestrator-component/PRD.md +0 -146
- flock_core-0.5.9/docs/specs/004-orchestrator-component/README.md +0 -104
- flock_core-0.5.9/docs/specs/004-orchestrator-component/UNIFIED_IMPLEMENTATION_PLAN.md +0 -1028
- flock_core-0.5.9/docs/specs/005-multi-publishes-fan-out/CHANGES_SUMMARY.md +0 -160
- flock_core-0.5.9/docs/specs/005-multi-publishes-fan-out/CONCURRENCY_FIX.md +0 -304
- flock_core-0.5.9/docs/specs/005-multi-publishes-fan-out/PHASE4_ARCHITECTURAL_PIVOT.md +0 -277
- flock_core-0.5.9/docs/specs/005-multi-publishes-fan-out/PLAN.md +0 -616
- flock_core-0.5.9/docs/specs/005-multi-publishes-fan-out/PRD.md +0 -146
- flock_core-0.5.9/docs/specs/006-dspy-engine-refactor/PLAN.md +0 -1052
- {flock_core-0.5.9 → flock_core-0.5.11}/.devcontainer/devcontainer.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.envtemplate +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.github/workflows/deploy-documentation.yml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.github/workflows/quality.yml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.gitignore +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.pre-commit-config.yaml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.python-version +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/.vscode/settings.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/AUTO_TRACING.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/CONTRIBUTING.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/ID_AUDIT_REPORT.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/LICENSE +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/ROADMAP.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/USECASES.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/about/changelog.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/about/contributing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/about/roadmap.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/batch.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/bug_diagnosis.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/flock.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/flock_ui_1.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/flock_ui_agent_view.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/flock_ui_blackboard_view.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/join.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/pattern2.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/pizza.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/trace_1.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/trace_2.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/assets/images/trace_3.png +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/bugfixes/websocket-streaming-deadlock-fix.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/community/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/examples/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/getting-started/concepts.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/getting-started/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/getting-started/installation.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/getting-started/quick-start.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/agents.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/batch-processing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/blackboard.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/components.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/dspy-engine.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/fan-out.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/join-operations.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/mcp-roots.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/orchestrator-components.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/patterns.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/persistent-blackboard.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/predicates.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/testing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/auto-tracing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/how_to_use_tracing_effectively.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/trace-module.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/tracing-production.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/tracing-quickstart.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/tracing/unified-tracing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/guides/use-cases.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/javascripts/extra.js +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/reference/api.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/reference/configuration.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/reference/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/stylesheets/extra.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tags.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/troubleshooting/streaming-freeze-fix.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/troubleshooting/streaming-freeze-with-dashboard-fix.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/advanced-patterns.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/conditional-routing.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/connect_with_ollama.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/custom-agent-components.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/custom-engines.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/index.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/multi-agent-workflow.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/tutorials/your-first-agent.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/docs/whiteducksoftware/versions.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/01-single_publish.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/00-patterns/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/02_input_and_output.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/03_code_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/05_mcp_and_tools.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/07_web_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/08_band_formation.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/12_secret_agents.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/13_medical_diagnostics_joinspec.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/14_ecommerce_batch_processing.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/15_iot_sensor_batching.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/01-cli/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/02_input_and_output.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/03_code_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/05_mcp_and_tools.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/07_web_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/08_band_formation.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/10_news_agency.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/11_tracing_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/12_secret_agents.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/14_ecommerce_batch_processing.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/15_iot_sensor_batching.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/02-dashboard/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_01_code_detective.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_02_band_formation.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_04_debate_club.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_06_secret_agents.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_09_the_batch_optimizer.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/03-claudes-workshop/lesson_10_the_smart_factory.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/02-dashboard-edge-cases.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/03-scale-test-100-agents.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/05_lm_studio.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/04-misc/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/05-engines/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/06-agent-components/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/07-orchestrator-components/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/examples/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/mkdocs.yml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/requirements.txt +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/build_dashboard.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/bump_version.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/check_version_bump.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/ensure_uv.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/gen_ref_pages.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/scripts/generate_llm_codebase.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/artifacts.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/graph_builder.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/models/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/static_v2/assets/index-DFRnI_mt.js +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/static_v2/assets/index-fPLNdmp1.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/dashboard/static_v2/index.html +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/engines/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/engines/examples/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/docs/DESIGN_SYSTEM.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/index.html +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/package-lock.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/package.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/App.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/BuildInfo.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/EmptyState.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/EmptyState.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/ErrorBoundary.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/ErrorBoundary.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/LoadingSpinner.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/common/LoadingSpinner.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/controls/PublishControl.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/controls/PublishControl.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/controls/PublishControl.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/DetailWindowContainer.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/LiveOutputTab.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/LiveOutputTab.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/MessageDetailWindow.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/MessageHistoryTab.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/NodeDetailWindow.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/NodeDetailWindow.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/RunStatusTab.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/details/tabs.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/CorrelationIDFilter.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/CorrelationIDFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/FilterFlyout.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/FilterFlyout.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/FilterPills.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/FilterPills.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/FilterPills.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/ProducerFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/SavedFiltersControl.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/SavedFiltersControl.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/TagFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/TimeRangeFilter.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/TimeRangeFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/filters/VisibilityFilter.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/AgentNode.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/AgentNode.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/GraphCanvas.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/LogicOperationsDisplay.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/MessageFlowEdge.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/MessageNode.test.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/MessageNode.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/MiniMap.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/PendingBatchEdge.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/PendingJoinEdge.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/graph/TransformEdge.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/layout/DashboardLayout.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/layout/DashboardLayout.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/layout/Header.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/layout/Header.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/ModuleRegistry.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/ModuleRegistry.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/ModuleWindow.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/TraceModuleJaeger.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/modules/registerModules.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/AdvancedSettings.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/AppearanceSettings.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/GraphSettings.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/MultiSelect.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/SettingsPanel.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/SettingsPanel.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/ThemeSelector.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/components/settings/TracingSettings.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/hooks/useKeyboardShortcuts.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/hooks/useModulePersistence.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/hooks/useModulePersistence.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/hooks/useModules.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/hooks/usePersistence.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/main.tsx +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/api.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/graphService.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/graphService.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/layout.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/layout.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/themeApplicator.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/themeService.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/services/websocket.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/filterStore.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/filterStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/graphStore.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/graphStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/moduleStore.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/moduleStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/settingsStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/streamStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/uiStore.test.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/uiStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/store/wsStore.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/styles/index.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/styles/scrollbar.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/styles/variables.css +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/test/setup.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/types/filters.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/types/graph.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/types/modules.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/types/theme.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/utils/artifacts.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/utils/mockData.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/utils/performance.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/src/vite-env.d.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/tsconfig.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/tsconfig.node.json +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/vite.config.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/frontend/vitest.config.ts +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/formatters/themes.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/span_middleware/baggage_span_processor.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/telemetry_exporter/base_exporter.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/telemetry_exporter/file_exporter.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/logging/telemetry_exporter/sqlite_exporter.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/sse/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/stdio/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/stdio/flock_stdio_server.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/streamable_http/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/websockets/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/servers/websockets/flock_websocket_server.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/types/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/types/callbacks.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/types/factories.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/util/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/mcp/util/helpers.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/patches/__init__.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/3024-day.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/3024-night.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/aardvark-blue.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/abernathy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/adventure.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/adventuretime.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/afterglow.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/alabaster.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/alienblood.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/andromeda.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/apple-classic.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/apple-system-colors.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/arcoiris.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/argonaut copy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/argonaut.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/arthur.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ateliersulphurpool.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/atom.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/atom_test.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/atomonelight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/aurora.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ayu copy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ayu-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ayu-mirage.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ayu.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/banana-blueberry.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/batman.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/belafonte-day.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/belafonte-night.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/birdsofparadise.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/blazer.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/blue-matrix.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/blueberrypie.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/bluedolphin.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/blulocodark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/blulocolight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/borland.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/breeze.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/bright-lights.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/broadcast.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/brogrammer.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-pastel-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-solarized-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-solarized-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-tango-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/builtin-tango-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/c64.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/calamity.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/catppuccin-frappe.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/catppuccin-latte.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/catppuccin-macchiato.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/catppuccin-mocha.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cga.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/chalk.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/chalkboard.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/challengerdeep.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/chester.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ciapre.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/clrs.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cobalt-neon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cobalt2.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/coffee-theme.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/crayonponyfish.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cutiepro.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cyberdyne.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cyberpunk.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dark+.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dark-pastel.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/darkermatrix.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/darkmatrix.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/darkside.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dayfox.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/deep.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/desert.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dimidium.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dimmedmonokai.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/django.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/djangorebornagain.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/djangosmooth.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/doom-peacock.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/doomone.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dotgov.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dracula+.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/dracula.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/duckbones.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/duotone-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/earthsong.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/elemental.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/elementary.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/encom.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/espresso-libre.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/espresso.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/everblush.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/fahrenheit.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/fairyfloss.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/farmhouse-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/farmhouse-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/fideloper.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/firefly-traditional.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/firefoxdev.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/firewatch.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/fishtank.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/flat.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/flatland.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/flexoki-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/flexoki-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/floraverse.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/forestblue.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/framer.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/frontenddelight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/funforrest.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/galaxy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/galizur.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/github-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/github.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/glacier.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/grape.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/grass.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/grey-green.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/gruber-darker.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/gruvboxdark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/gruvboxdarkhard.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/gruvboxlight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/guezwhoz.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hacktober.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hardcore.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/harper.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hax0r-blue.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hax0r-gr33n.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hax0r-r3d.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/highway.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hipster-green.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hivacruz.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/homebrew.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hopscotch.256.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hopscotch.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hurtado.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/hybrid.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ic-green-ppl.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ic-orange-ppl.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iceberg-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iceberg-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/idea.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/idletoes.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ir-black.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-dark-background.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-default.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-light-background.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-smoooooth.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-solarized-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-tango-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/iterm2-tango-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/jackie-brown.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/japanesque.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/jellybeans.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/jetbrains-darcula.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/jubi.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/kanagawabones.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/kibble.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/kolorit.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/konsolas.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/kurokula.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/lab-fox.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/laser.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/later-this-evening.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/lavandula.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/liquidcarbon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/liquidcarbontransparent.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/lovelace.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/man-page.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/mariana.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/material.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/materialdark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/materialdarker.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/materialdesigncolors.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/materialocean.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/mathias.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/matrix.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/medallion.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/mellifluous.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/midnight-in-mojave.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/mirage.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/misterioso.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/molokai.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/monalisa.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/monokai-remastered.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/monokai-soda.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/monokai-vivid.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/n0tch2k.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/neobones-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/neobones-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/neon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/neopolitan.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/neutron.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/night-owlish-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nightfox.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nightlion-v1.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nightlion-v2.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/niji.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nocturnal-winter.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nord-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nord.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/novel.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nvimdark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/nvimlight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/obsidian.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ocean.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/oceanic-next.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/oceanicmaterial.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ollie.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/onehalfdark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/onehalflight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/operator-mono-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/overnight-slumber.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/oxocarbon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/palenighthc.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pandora.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/paraiso-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/paulmillr.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pencildark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pencillight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/peppermint.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/piatto-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pnevma.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/popping-and-locking.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/primary.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pro-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/pro.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/purple-rain.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/purplepeter.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rapture.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/raycast-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/raycast-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rebecca.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/red-alert.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/red-planet.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/red-sands.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/relaxed.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/retro.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rippedcasts.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rose-pine-dawn.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rose-pine-moon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rose-pine.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/rouge-2.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/royal.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ryuuko.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/sakura.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/scarlet-protocol.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/seafoam-pastel.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/seashells.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/seoulbones-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/seoulbones-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/seti.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/shades-of-purple.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/shaman.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/slate.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/sleepyhollow.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/smyck.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/snazzy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/softserver.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/solarized-darcula.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/solarized-dark---patched.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spacedust.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spacegray-eighties.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spacegray.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spiderman.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/spring.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/square.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/sublette.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/subliminal.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/sugarplum.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/sundried.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/symfonic.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/synthwave-everything.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/synthwave.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/synthwavealpha.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tango-adapted.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tango-half-adapted.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/teerb.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/terafox.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/terminal-basic.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/thayer-bright.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/the-hulk.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tinacious-design-(dark).toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tinacious-design-(light).toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tokyonight-day.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tokyonight-storm.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tokyonight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow-night-blue.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow-night-bright.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow-night-burns.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow-night.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/tomorrow.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/toychest.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/treehouse.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/twilight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ubuntu.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ultradark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/ultraviolent.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/underthesea.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/unikitty.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/urple.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/vaughn.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/vesper.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/vibrantink.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/vimbones.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/violet-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/violet-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/warmneon.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/wez.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/whimsy.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/wildcherry.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/wilmersdorf.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/wombat.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/wryan.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/xcodedark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/xcodedarkhc.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/xcodelight.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/xcodelighthc.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/xcodewwdc.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenbones-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenbones-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenbones.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenburn.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenburned.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenwritten-dark.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/themes/zenwritten-light.toml +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/src/flock/visibility.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/PHASE2_TEST_SUMMARY.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/PHASE3_TEST_SUMMARY.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/TEST_COVERAGE_PHASE2.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/conftest.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/contract/test_agent_payload_selection_contract.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/contract/test_artifact_storage_contract.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/contract/test_type_normalization_contract.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/dashboard/test_logic_operations_api.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/dashboard/test_logic_operations_events.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/e2e/README.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/e2e/TESTING_SUMMARY.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/integration/test_collector_orchestrator.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/integration/test_sqlite_store_integration.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/integration/test_websocket_protocol.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_agent.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_agent_builder.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_agent_mcp.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_agent_server_specific_mounts.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_artifacts.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_cli.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_cli_helper.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dashboard_api.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dashboard_collector.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dashboard_graph.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dashboard_launcher.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dashboard_service.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dspy_engine_mcp.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dspy_engine_multioutput.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_dspy_streaming_events.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_filtering_validation.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_logging_config.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_client.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_config.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_coverage_summary.md +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_imports.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_manager.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_server_config_typeddict.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_mcp_tool_handlers.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_and_gate.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_combined.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_component.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_joinspec.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_orchestrator_mcp.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_output_groups.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_registry.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_service.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_service_extended.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_store.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_store_graph.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_telemetry.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_trace_clearing.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_unified_tracing.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_utilities.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_version_endpoint.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_visibility.py +0 -0
- {flock_core-0.5.9 → flock_core-0.5.11}/tests/test_websocket_manager.py +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# 🚀 [FEATURE] Non-Blocking `serve()` for Dashboard Examples
|
|
2
|
+
|
|
3
|
+
### Is your feature request related to a problem?
|
|
4
|
+
|
|
5
|
+
Dashboard examples currently face a limitation: once `flock.serve(dashboard=True)` is called, execution blocks indefinitely. This makes it impossible to publish messages or perform any setup logic after starting the dashboard server, unlike CLI examples which use `run_until_idle()` for controlled execution.
|
|
6
|
+
|
|
7
|
+
**Current workaround:**
|
|
8
|
+
Users must publish all messages *before* calling `serve()`, which is awkward for demos and prevents realistic workflows where the server runs continuously while processing incoming messages.
|
|
9
|
+
|
|
10
|
+
**Example of the problem:**
|
|
11
|
+
```python
|
|
12
|
+
# This doesn't work - can't execute after serve()
|
|
13
|
+
async def main():
|
|
14
|
+
await flock.serve(dashboard=True) # blocks forever
|
|
15
|
+
|
|
16
|
+
# This code never runs! ❌
|
|
17
|
+
pizza = MyDreamPizza(pizza_idea="pizza with pineapple")
|
|
18
|
+
await flock.publish(pizza)
|
|
19
|
+
await flock.run_until_idle()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Describe the solution you want to see
|
|
23
|
+
|
|
24
|
+
Add a `blocking` parameter to `serve()` that allows starting the dashboard server as a background task:
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
async def serve(
|
|
28
|
+
self,
|
|
29
|
+
*,
|
|
30
|
+
dashboard: bool = False,
|
|
31
|
+
dashboard_v2: bool = False,
|
|
32
|
+
host: str = "127.0.0.1",
|
|
33
|
+
port: int = 8344,
|
|
34
|
+
blocking: bool = True, # NEW: default True for backwards compatibility
|
|
35
|
+
) -> Task[None] | None:
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Usage example:**
|
|
39
|
+
```python
|
|
40
|
+
async def main():
|
|
41
|
+
# Start dashboard in background
|
|
42
|
+
await flock.serve(dashboard=True, blocking=False)
|
|
43
|
+
|
|
44
|
+
# Now we can publish messages!
|
|
45
|
+
pizza = MyDreamPizza(pizza_idea="pizza with pineapple")
|
|
46
|
+
await flock.publish(pizza)
|
|
47
|
+
await flock.run_until_idle()
|
|
48
|
+
|
|
49
|
+
# Dashboard stays alive for inspection
|
|
50
|
+
print("Check dashboard at http://localhost:8344")
|
|
51
|
+
await asyncio.Event().wait() # Keep running
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Key requirements:**
|
|
55
|
+
- Backwards compatible (`blocking=True` by default)
|
|
56
|
+
- Return `Task[None]` handle when `blocking=False`
|
|
57
|
+
- Proper cleanup of dashboard launcher and server on shutdown or task cancellation
|
|
58
|
+
- Works seamlessly with `run_until_idle()`
|
|
59
|
+
|
|
60
|
+
### Describe alternatives you have considered
|
|
61
|
+
|
|
62
|
+
**Option 1: Startup hook pattern**
|
|
63
|
+
```python
|
|
64
|
+
async def setup():
|
|
65
|
+
await flock.publish(...)
|
|
66
|
+
|
|
67
|
+
await flock.serve(dashboard=True, on_startup=setup)
|
|
68
|
+
```
|
|
69
|
+
❌ Less flexible, doesn't allow continuous message publishing
|
|
70
|
+
|
|
71
|
+
**Option 2: Separate `serve_background()` method**
|
|
72
|
+
```python
|
|
73
|
+
await flock.serve_background(dashboard=True)
|
|
74
|
+
```
|
|
75
|
+
❌ API duplication, less discoverable
|
|
76
|
+
|
|
77
|
+
**Option 3: Always non-blocking**
|
|
78
|
+
```python
|
|
79
|
+
await flock.serve(dashboard=True) # always returns immediately
|
|
80
|
+
```
|
|
81
|
+
❌ Breaking change for existing users
|
|
82
|
+
|
|
83
|
+
### Additional context
|
|
84
|
+
|
|
85
|
+
**Complexity: Medium** (6-9 hours estimated)
|
|
86
|
+
- Core async pattern is straightforward (codebase already uses `asyncio.create_task` extensively)
|
|
87
|
+
- Cleanup coordination requires careful handling (dashboard launcher + server task lifecycle)
|
|
88
|
+
- Backwards compatibility is preserved with default parameter
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 🛠️ Implementation Plan
|
|
93
|
+
|
|
94
|
+
### 1. Core Changes
|
|
95
|
+
|
|
96
|
+
**File: `src/flock/orchestrator.py`**
|
|
97
|
+
|
|
98
|
+
- Add `blocking: bool = True` parameter to `serve()` method (line 753)
|
|
99
|
+
- Add `_server_task: Task[None] | None = None` field to `__init__` (around line 165)
|
|
100
|
+
- Update return type: `-> Task[None] | None`
|
|
101
|
+
- When `blocking=False`:
|
|
102
|
+
- Wrap server execution in `asyncio.create_task()`
|
|
103
|
+
- Add cleanup callback for dashboard launcher on task completion
|
|
104
|
+
- Track task in `_server_task` field
|
|
105
|
+
- Return task handle
|
|
106
|
+
|
|
107
|
+
**Estimated effort:** 2-3 hours
|
|
108
|
+
|
|
109
|
+
### 2. Cleanup Logic
|
|
110
|
+
|
|
111
|
+
**File: `src/flock/orchestrator.py`**
|
|
112
|
+
|
|
113
|
+
- Add server cleanup to `shutdown()` method (line 718)
|
|
114
|
+
- Cancel `_server_task` if running
|
|
115
|
+
- Stop `_dashboard_launcher` if present
|
|
116
|
+
- Handle `asyncio.CancelledError` gracefully
|
|
117
|
+
- Ensure proper resource cleanup on both normal completion and cancellation
|
|
118
|
+
|
|
119
|
+
**Estimated effort:** 1-2 hours
|
|
120
|
+
|
|
121
|
+
### 3. Testing
|
|
122
|
+
|
|
123
|
+
**File: `tests/integration/test_orchestrator_dashboard.py` (or new test file)**
|
|
124
|
+
|
|
125
|
+
Test scenarios:
|
|
126
|
+
- ✅ Non-blocking serve starts successfully and returns task
|
|
127
|
+
- ✅ Can publish messages after non-blocking serve
|
|
128
|
+
- ✅ Server processes messages during `run_until_idle()`
|
|
129
|
+
- ✅ Dashboard launcher cleanup on task completion
|
|
130
|
+
- ✅ Cleanup on explicit `shutdown()` call
|
|
131
|
+
- ✅ Backwards compatibility: `blocking=True` works as before
|
|
132
|
+
- ✅ Task cancellation cleans up resources properly
|
|
133
|
+
|
|
134
|
+
**Estimated effort:** 2-3 hours
|
|
135
|
+
|
|
136
|
+
### 4. Documentation
|
|
137
|
+
|
|
138
|
+
**Files to update:**
|
|
139
|
+
- `src/flock/orchestrator.py` - Update `serve()` docstring with:
|
|
140
|
+
- New `blocking` parameter description
|
|
141
|
+
- Example showing non-blocking usage
|
|
142
|
+
- Return type documentation
|
|
143
|
+
|
|
144
|
+
**Estimated effort:** 30 minutes
|
|
145
|
+
|
|
146
|
+
### 5. Example
|
|
147
|
+
|
|
148
|
+
**File: `examples/02-dashboard/02_non_blocking_serve.py` (new)**
|
|
149
|
+
|
|
150
|
+
Create example demonstrating:
|
|
151
|
+
- Starting dashboard in non-blocking mode
|
|
152
|
+
- Publishing messages after server starts
|
|
153
|
+
- Using `run_until_idle()` to process messages
|
|
154
|
+
- Keeping server alive for inspection
|
|
155
|
+
|
|
156
|
+
**Estimated effort:** 1 hour
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## ✅ Definition of Done
|
|
161
|
+
|
|
162
|
+
- [ ] `blocking` parameter implemented with default `True`
|
|
163
|
+
- [ ] Non-blocking mode returns `Task[None]` handle
|
|
164
|
+
- [ ] Server cleanup logic handles both normal and cancelled completion
|
|
165
|
+
- [ ] All tests passing (new + existing)
|
|
166
|
+
- [ ] Docstring updated with parameter and examples
|
|
167
|
+
- [ ] New example created: `examples/02-dashboard/02_non_blocking_serve.py`
|
|
168
|
+
- [ ] Backwards compatibility verified (existing examples still work)
|
|
169
|
+
- [ ] Manual validation: example runs and dashboard stays accessible
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 🧪 Validation Strategy
|
|
174
|
+
|
|
175
|
+
**Automated:**
|
|
176
|
+
- Unit/integration tests for non-blocking behavior
|
|
177
|
+
- Cleanup verification tests
|
|
178
|
+
- Backwards compatibility regression tests
|
|
179
|
+
|
|
180
|
+
**Manual:**
|
|
181
|
+
1. Run new example: `python examples/02-dashboard/02_non_blocking_serve.py`
|
|
182
|
+
2. Verify dashboard accessible at http://localhost:8344
|
|
183
|
+
3. Verify messages appear in dashboard
|
|
184
|
+
4. Verify server stays alive after `run_until_idle()`
|
|
185
|
+
5. Test graceful shutdown (Ctrl+C)
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 📅 Timeline Estimate
|
|
190
|
+
|
|
191
|
+
**Total effort:** 6-9 hours
|
|
192
|
+
|
|
193
|
+
Breakdown:
|
|
194
|
+
- Implementation: 3-5 hours
|
|
195
|
+
- Testing: 2-3 hours
|
|
196
|
+
- Documentation + Example: 1.5 hours
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 🔗 Technical References
|
|
201
|
+
|
|
202
|
+
- `orchestrator.py:753` - Current `serve()` implementation
|
|
203
|
+
- `orchestrator.py:580, 588, 1417` - Existing `asyncio.create_task` usage patterns
|
|
204
|
+
- `orchestrator.py:718` - Existing `shutdown()` method
|
|
205
|
+
- `service.py:279` - `BlackboardHTTPService.run_async()` (blocks on `uvicorn.Server.serve()`)
|
|
@@ -53,7 +53,7 @@ A blackboard architecture framework where specialized AI agents collaborate thro
|
|
|
53
53
|
|
|
54
54
|
### Prerequisites
|
|
55
55
|
|
|
56
|
-
- **Python 3.
|
|
56
|
+
- **Python 3.12+** (we use modern async features)
|
|
57
57
|
- **UV package manager** (faster than pip, handles virtual envs)
|
|
58
58
|
- **Node.js 18+** (22+ recommended) for dashboard frontend
|
|
59
59
|
- **OpenAI API key** (for running examples)
|
|
@@ -107,6 +107,7 @@ For deep dives into specific topics, see:
|
|
|
107
107
|
**Core Architecture:**
|
|
108
108
|
- **[Architecture & Blackboard](docs/guides/blackboard.md)** - Core pattern, structure, and behavior
|
|
109
109
|
- **[Agent Guide](docs/guides/agents.md)** - Complete agent development reference
|
|
110
|
+
- **[Context Providers](docs/guides/context-providers.md)** - Smart filtering & security boundaries for agent context ⭐ **NEW in 0.5**
|
|
110
111
|
|
|
111
112
|
**Components & Extensibility:**
|
|
112
113
|
- **[Agent Components](docs/guides/components.md)** - Extend agent behavior with lifecycle hooks
|
|
@@ -296,6 +297,288 @@ Kick the tyres with `examples/02-the-blackboard/01_persistent_pizza.py`, then la
|
|
|
296
297
|
|
|
297
298
|
---
|
|
298
299
|
|
|
300
|
+
### 🔐 Context Providers - Smart Filtering & Security Boundaries
|
|
301
|
+
|
|
302
|
+
**Context Providers are the intelligent filter layer between agents and the blackboard—controlling what each agent sees, reducing token costs by 90%+, and automatically redacting sensitive data.**
|
|
303
|
+
|
|
304
|
+
#### Why Context Providers Matter
|
|
305
|
+
|
|
306
|
+
**The Problem:**
|
|
307
|
+
- Agents seeing ALL artifacts wastes tokens (costs)
|
|
308
|
+
- No way to filter sensitive data before agents see it
|
|
309
|
+
- Performance degrades as blackboard grows
|
|
310
|
+
- Security vulnerabilities if agents bypass visibility
|
|
311
|
+
|
|
312
|
+
**The Solution:**
|
|
313
|
+
Context Providers enforce a security boundary that:
|
|
314
|
+
- ✅ **Reduces token costs** - Agents see only relevant artifacts (90%+ savings)
|
|
315
|
+
- ✅ **Protects sensitive data** - Auto-redact passwords, API keys, credit cards
|
|
316
|
+
- ✅ **Improves performance** - Less context = faster agent execution
|
|
317
|
+
- ✅ **Enforces security** - Agents cannot bypass provider filtering
|
|
318
|
+
|
|
319
|
+
**Understanding the Three-Layer Model:**
|
|
320
|
+
|
|
321
|
+
Flock uses three complementary filtering layers:
|
|
322
|
+
|
|
323
|
+
1. **Visibility** (security boundary) - Controls BOTH which agents trigger AND which artifacts they see in context
|
|
324
|
+
2. **Subscription Filters** (routing logic) - Controls WHEN agents trigger (e.g., `.consumes(Task, tags={"urgent"})`)
|
|
325
|
+
3. **Context Providers** (context shaping) - Controls WHAT agents see in their historical context
|
|
326
|
+
|
|
327
|
+
These layers work together to provide fine-grained control over agent execution and data access. Context Providers are the third layer—they filter what agents see in context but do NOT control triggering.
|
|
328
|
+
|
|
329
|
+
#### Quick Start: Global Filtering
|
|
330
|
+
|
|
331
|
+
**Filter all agents to see only urgent items:**
|
|
332
|
+
|
|
333
|
+
```python
|
|
334
|
+
from flock import Flock
|
|
335
|
+
from flock.context_provider import FilteredContextProvider
|
|
336
|
+
from flock.store import FilterConfig
|
|
337
|
+
|
|
338
|
+
# Create provider that filters by tags
|
|
339
|
+
urgent_only = FilteredContextProvider(
|
|
340
|
+
FilterConfig(tags={"urgent", "high"}),
|
|
341
|
+
limit=50 # Max 50 artifacts
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# Apply to ALL agents
|
|
345
|
+
flock = Flock("openai/gpt-4.1", context_provider=urgent_only)
|
|
346
|
+
|
|
347
|
+
# Publish with tags
|
|
348
|
+
await flock.publish(Task(...), tags={"urgent"}) # ✅ Agents see this
|
|
349
|
+
await flock.publish(Task(...), tags={"low"}) # ❌ Agents don't see this
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
#### Per-Agent Filtering (Role-Based)
|
|
353
|
+
|
|
354
|
+
**Different agents see different context:**
|
|
355
|
+
|
|
356
|
+
```python
|
|
357
|
+
# Global: Errors only
|
|
358
|
+
error_provider = FilteredContextProvider(FilterConfig(tags={"ERROR"}))
|
|
359
|
+
flock = Flock("openai/gpt-4.1", context_provider=error_provider)
|
|
360
|
+
|
|
361
|
+
# Junior engineer: Errors only (uses global)
|
|
362
|
+
junior = flock.agent("junior").consumes(LogEntry).publishes(Report).agent
|
|
363
|
+
|
|
364
|
+
# Senior engineer: Errors + Warnings (override global)
|
|
365
|
+
warn_provider = FilteredContextProvider(FilterConfig(tags={"ERROR", "WARN"}))
|
|
366
|
+
senior = flock.agent("senior").consumes(LogEntry).publishes(Analysis).agent
|
|
367
|
+
senior.context_provider = warn_provider # 🎯 Per-agent override!
|
|
368
|
+
|
|
369
|
+
# Platform team: Everything (override global)
|
|
370
|
+
all_provider = FilteredContextProvider(FilterConfig(tags={"DEBUG", "INFO", "WARN", "ERROR"}))
|
|
371
|
+
platform = flock.agent("platform").consumes(LogEntry).publishes(Report).agent
|
|
372
|
+
platform.context_provider = all_provider
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Provider Priority:**
|
|
376
|
+
```
|
|
377
|
+
Per-Agent Provider > Global Provider > DefaultContextProvider
|
|
378
|
+
(highest) (medium) (fallback)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### Production-Ready: Password Redaction
|
|
382
|
+
|
|
383
|
+
**Automatically redact sensitive data from agent context:**
|
|
384
|
+
|
|
385
|
+
```python
|
|
386
|
+
from examples.context_provider import PasswordRedactorProvider
|
|
387
|
+
|
|
388
|
+
# Create provider with built-in patterns
|
|
389
|
+
provider = PasswordRedactorProvider(
|
|
390
|
+
redaction_text="[REDACTED]",
|
|
391
|
+
redact_emails=True,
|
|
392
|
+
log_redactions=True # Audit trail
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
flock = Flock("openai/gpt-4.1", context_provider=provider)
|
|
396
|
+
|
|
397
|
+
# Publish data with secrets
|
|
398
|
+
await flock.publish(UserData(
|
|
399
|
+
password="MySecret123", # → [REDACTED]
|
|
400
|
+
api_key="sk-1234567890abcdef", # → [REDACTED]
|
|
401
|
+
email="user@example.com" # → [REDACTED]
|
|
402
|
+
))
|
|
403
|
+
|
|
404
|
+
# Agents see redacted version automatically!
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**What gets redacted:**
|
|
408
|
+
- 🔒 Passwords and secrets
|
|
409
|
+
- 🔑 API keys (OpenAI, AWS, GitHub, GitLab, Stripe, Google)
|
|
410
|
+
- 🎫 Bearer tokens and JWT
|
|
411
|
+
- 💳 Credit card numbers (Visa, MC, Amex, Discover)
|
|
412
|
+
- 🆔 Social Security Numbers
|
|
413
|
+
- 🔐 Private keys (RSA, EC, OpenSSH)
|
|
414
|
+
- 📧 Email addresses (optional)
|
|
415
|
+
|
|
416
|
+
#### FilterConfig API Reference
|
|
417
|
+
|
|
418
|
+
**Declarative filtering with multiple criteria:**
|
|
419
|
+
|
|
420
|
+
```python
|
|
421
|
+
from flock.store import FilterConfig
|
|
422
|
+
|
|
423
|
+
# Combine multiple filters (AND logic)
|
|
424
|
+
config = FilterConfig(
|
|
425
|
+
tags={"ERROR", "CRITICAL"}, # OR logic: any of these tags
|
|
426
|
+
type_names={"SystemEvent", "Alert"}, # OR logic: any of these types
|
|
427
|
+
produced_by=["monitor", "watchdog"], # OR logic: from any of these agents
|
|
428
|
+
correlation_id="incident-123" # Exact match
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
provider = FilteredContextProvider(config, limit=100)
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**Criteria are combined with AND logic:**
|
|
435
|
+
- Must have (ERROR OR CRITICAL) tag
|
|
436
|
+
- AND must be (SystemEvent OR Alert) type
|
|
437
|
+
- AND must be from (monitor OR watchdog) agent
|
|
438
|
+
- AND must have correlation_id "incident-123"
|
|
439
|
+
|
|
440
|
+
#### Custom Context Providers
|
|
441
|
+
|
|
442
|
+
**Build your own filtering logic:**
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
from flock.context_provider import BaseContextProvider, ContextRequest
|
|
446
|
+
from flock.artifacts import Artifact
|
|
447
|
+
|
|
448
|
+
class TimeBoundProvider(BaseContextProvider):
|
|
449
|
+
"""Only show artifacts from last 1 hour.
|
|
450
|
+
|
|
451
|
+
Security is enforced automatically by BaseContextProvider!
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
async def get_artifacts(self, request: ContextRequest) -> list[Artifact]:
|
|
455
|
+
cutoff = datetime.now() - timedelta(hours=1)
|
|
456
|
+
|
|
457
|
+
# Query all artifacts
|
|
458
|
+
artifacts, _ = await request.store.query_artifacts(limit=1000)
|
|
459
|
+
|
|
460
|
+
# Apply time-based filtering
|
|
461
|
+
recent = [a for a in artifacts if a.created_at >= cutoff]
|
|
462
|
+
|
|
463
|
+
return recent
|
|
464
|
+
|
|
465
|
+
# ✨ BaseContextProvider automatically:
|
|
466
|
+
# - Filters by visibility (MANDATORY, cannot bypass!)
|
|
467
|
+
# - Excludes requested IDs
|
|
468
|
+
# - Serializes to standard format
|
|
469
|
+
|
|
470
|
+
# Usage
|
|
471
|
+
provider = TimeBoundProvider()
|
|
472
|
+
flock = Flock("openai/gpt-4.1", context_provider=provider)
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**Why this is better:**
|
|
476
|
+
- ✅ **75% less code** - 5 lines vs 20+ lines
|
|
477
|
+
- ✅ **Impossible to bypass security** - visibility enforced by base class
|
|
478
|
+
- ✅ **Consistent serialization** - automatic standard format
|
|
479
|
+
- ✅ **Focus on business logic** - not infrastructure
|
|
480
|
+
|
|
481
|
+
#### Real-World Use Cases
|
|
482
|
+
|
|
483
|
+
**Healthcare (HIPAA Compliance):**
|
|
484
|
+
```python
|
|
485
|
+
# Redact PHI (Protected Health Information)
|
|
486
|
+
from examples.context_provider import PasswordRedactorProvider
|
|
487
|
+
|
|
488
|
+
phi_provider = PasswordRedactorProvider(
|
|
489
|
+
custom_patterns={
|
|
490
|
+
"ssn": r"\b\d{3}-\d{2}-\d{4}\b",
|
|
491
|
+
"mrn": r"MRN[:\s]*\d{6,10}",
|
|
492
|
+
"dob": r"\b\d{2}/\d{2}/\d{4}\b",
|
|
493
|
+
}
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
flock = Flock("openai/gpt-4.1", context_provider=phi_provider)
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
**DevOps (Log Filtering):**
|
|
500
|
+
```python
|
|
501
|
+
# Error engineers see only errors
|
|
502
|
+
error_provider = FilteredContextProvider(FilterConfig(tags={"ERROR", "CRITICAL"}))
|
|
503
|
+
error_agent.context_provider = error_provider
|
|
504
|
+
|
|
505
|
+
# Platform team sees everything
|
|
506
|
+
all_provider = FilteredContextProvider(FilterConfig(tags={"DEBUG", "INFO", "WARN", "ERROR"}))
|
|
507
|
+
platform_agent.context_provider = all_provider
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
**Multi-Tenant SaaS (Customer Isolation):**
|
|
511
|
+
```python
|
|
512
|
+
# Each tenant gets isolated context
|
|
513
|
+
tenant_a_provider = FilteredContextProvider(FilterConfig(correlation_id=f"tenant_{customer_a.id}"))
|
|
514
|
+
tenant_a_agent.context_provider = tenant_a_provider
|
|
515
|
+
|
|
516
|
+
tenant_b_provider = FilteredContextProvider(FilterConfig(correlation_id=f"tenant_{customer_b.id}"))
|
|
517
|
+
tenant_b_agent.context_provider = tenant_b_provider
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
#### Performance Impact
|
|
521
|
+
|
|
522
|
+
**Token Cost Reduction:**
|
|
523
|
+
|
|
524
|
+
```python
|
|
525
|
+
# ❌ Before (no filtering): Agent sees 1000 artifacts = 200,000 tokens
|
|
526
|
+
# Cost: $0.006 per agent call
|
|
527
|
+
|
|
528
|
+
# ✅ After (smart filtering): Agent sees 10 relevant artifacts = 2,000 tokens
|
|
529
|
+
# Cost: $0.00006 per agent call
|
|
530
|
+
|
|
531
|
+
# 💰 99% cost reduction!
|
|
532
|
+
|
|
533
|
+
provider = FilteredContextProvider(FilterConfig(tags={"urgent"}), limit=10)
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
#### Security Best Practices
|
|
537
|
+
|
|
538
|
+
**✅ DO:**
|
|
539
|
+
- Always enforce visibility (NEVER skip)
|
|
540
|
+
- Use `FilteredContextProvider` for common patterns
|
|
541
|
+
- Test redaction patterns with real data
|
|
542
|
+
- Log security events for audit trails
|
|
543
|
+
- Limit by default (start restrictive)
|
|
544
|
+
|
|
545
|
+
**❌ DON'T:**
|
|
546
|
+
- Don't skip visibility filtering (security boundary!)
|
|
547
|
+
- Don't leak sensitive data in nested objects
|
|
548
|
+
- Don't cache redacted data without re-applying redaction
|
|
549
|
+
- Don't trust agent input (agents are untrusted)
|
|
550
|
+
- Don't expose infrastructure details
|
|
551
|
+
|
|
552
|
+
#### Learn More
|
|
553
|
+
|
|
554
|
+
**📚 Complete Guide:** [docs/guides/context-providers.md](docs/guides/context-providers.md) - Architecture, security model, advanced patterns
|
|
555
|
+
|
|
556
|
+
**💡 Examples:** [examples/08-context-provider/](examples/08-context-provider/) - 5 progressive examples from beginner to expert
|
|
557
|
+
|
|
558
|
+
**🎁 Production Code:** [examples/08-context-provider/05_password_redactor.py](examples/08-context-provider/05_password_redactor.py) - Copy-paste ready password filtering
|
|
559
|
+
|
|
560
|
+
#### Quick Reference
|
|
561
|
+
|
|
562
|
+
```python
|
|
563
|
+
# Global filtering
|
|
564
|
+
flock = Flock("openai/gpt-4.1", context_provider=FilteredContextProvider(FilterConfig(tags={"urgent"})))
|
|
565
|
+
|
|
566
|
+
# Per-agent override
|
|
567
|
+
agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR", "WARN"}))
|
|
568
|
+
|
|
569
|
+
# Password redaction
|
|
570
|
+
from examples.context_provider import PasswordRedactorProvider
|
|
571
|
+
flock = Flock("openai/gpt-4.1", context_provider=PasswordRedactorProvider())
|
|
572
|
+
|
|
573
|
+
# Custom provider
|
|
574
|
+
class MyProvider(ContextProvider):
|
|
575
|
+
async def __call__(self, request: ContextRequest) -> list[dict[str, Any]]:
|
|
576
|
+
# Query + filter by visibility (MANDATORY) + your logic
|
|
577
|
+
pass
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
299
582
|
### 🔒 Test Isolation and Mock Cleanup - The Contamination Trap
|
|
300
583
|
|
|
301
584
|
**We fixed 32 failing tests caused by test contamination - here's what we learned:**
|
|
@@ -1335,7 +1618,7 @@ Add to existing test file if relevant, or create new file following naming conve
|
|
|
1335
1618
|
|
|
1336
1619
|
### Q: What Python version features can I use?
|
|
1337
1620
|
|
|
1338
|
-
Python 3.
|
|
1621
|
+
Python 3.12+, so you can use:
|
|
1339
1622
|
- `match`/`case` statements
|
|
1340
1623
|
- `TaskGroup` for parallel execution
|
|
1341
1624
|
- Improved type hints (`list[str]` not `List[str]`)
|