flock-core 0.5.8__tar.gz → 0.5.10__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.8 → flock_core-0.5.10}/.github/workflows/quality.yml +17 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/AGENTS.md +285 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/PKG-INFO +134 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/README.md +133 -3
- flock_core-0.5.10/docs/guides/context-providers.md +1515 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/visibility.md +95 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/002-ui-optimization-migration/PLAN.md +1 -1
- flock_core-0.5.10/docs/specs/007-context-provider-security-fix/PLAN.md +470 -0
- flock_core-0.5.10/docs/specs/007-context-provider-security-fix/PRD.md +146 -0
- {flock_core-0.5.8/examples/09-patterms → flock_core-0.5.10/examples/00-patterns}/02-multi_publish.py +16 -3
- {flock_core-0.5.8/examples/09-patterms → flock_core-0.5.10/examples/00-patterns}/03-multi-artifact-multi-publish.py +18 -3
- {flock_core-0.5.8/examples/09-patterms → flock_core-0.5.10/examples/00-patterns}/04-fan-out.py +3 -2
- {flock_core-0.5.8/examples/09-patterms → flock_core-0.5.10/examples/00-patterns}/05-multi-fan-out.py +16 -4
- flock_core-0.5.10/examples/00-patterns/README.md +162 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/01_declarative_pizza.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/04_input_and_output.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/06_mcp_roots.py +14 -14
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/09_debate_club.py +2 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/10_news_agency.py +2 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/11_tracing_detective.py +4 -1
- flock_core-0.5.10/examples/01-cli/README.md +290 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/01_declarative_pizza.py +2 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/04_input_and_output.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/06_mcp_roots.py +11 -13
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/09_debate_club.py +2 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/13_medical_diagnostics_joinspec.py +15 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/16_news_batching.py +2 -2
- flock_core-0.5.10/examples/02-dashboard/README.md +235 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_03_web_detective.py +10 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_05_tracing_detective.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_07_news_agency.py +4 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_08_the_matchmaker.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_11_performance_monitor.py +7 -5
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_12_confidence_booster.py +26 -9
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_13_regex_matcher.py +12 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/04-misc/01_persistent_pizza.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/04-misc/04_persistent_pizza_dashboard.py +3 -1
- flock_core-0.5.10/examples/04-misc/README.md +257 -0
- flock_core-0.5.10/examples/05-engines/README.md +296 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/05-engines/emoji_mood_engine.py +12 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/05-engines/potion_batch_engine.py +40 -25
- flock_core-0.5.10/examples/06-agent-components/README.md +370 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/06-agent-components/cheer_meter_component.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/06-agent-components/plot_twist_component.py +3 -1
- flock_core-0.5.10/examples/07-orchestrator-components/README.md +459 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/07-orchestrator-components/kitchen_monitor_component.py +13 -15
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/07-orchestrator-components/quest_tracker_component.py +15 -3
- flock_core-0.5.10/examples/08-context-provider/01_basic_visibility.py +144 -0
- flock_core-0.5.10/examples/08-context-provider/02_global_provider.py +192 -0
- flock_core-0.5.10/examples/08-context-provider/02_simple_global_provider.py +49 -0
- flock_core-0.5.10/examples/08-context-provider/03_per_agent_provider.py +233 -0
- flock_core-0.5.10/examples/08-context-provider/04_custom_filtering.py +247 -0
- flock_core-0.5.10/examples/08-context-provider/05_password_redactor.py +435 -0
- flock_core-0.5.10/examples/08-context-provider/README.md +502 -0
- flock_core-0.5.10/examples/README.md +298 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/pyproject.toml +42 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/agent.py +149 -62
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/api/themes.py +6 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/artifact_collector.py +6 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/batch_accumulator.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/cli.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/components.py +45 -56
- flock_core-0.5.10/src/flock/context_provider.py +531 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/correlation_engine.py +8 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/collector.py +48 -29
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/events.py +10 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/launcher.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/models/graph.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/service.py +143 -72
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/websocket.py +17 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/engines/dspy_engine.py +174 -98
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/engines/examples/simple_batch_engine.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/examples.py +6 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/indexeddb.test.ts +4 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/indexeddb.ts +1 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/helper/cli_helper.py +14 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/auto_trace.py +6 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/formatters/enum_builder.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/formatters/theme_builder.py +32 -17
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/formatters/themed_formatter.py +38 -22
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/logging.py +21 -7
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/telemetry.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/telemetry_exporter/duckdb_exporter.py +27 -25
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/trace_and_logged.py +14 -5
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/__init__.py +3 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/client.py +49 -19
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/config.py +12 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/manager.py +6 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/sse/flock_sse_server.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/streamable_http/flock_streamable_http_server.py +6 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/tool.py +18 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/types/handlers.py +3 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/types/types.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/orchestrator.py +204 -50
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/orchestrator_component.py +15 -5
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/patches/dspy_streaming_patch.py +12 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/registry.py +9 -3
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/runtime.py +69 -18
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/service.py +19 -6
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/store.py +29 -10
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/subscription.py +6 -4
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/utilities.py +41 -13
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/utility/output_utility_component.py +31 -11
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/e2e/test_critical_scenarios.py +2 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_components.py +121 -195
- flock_core-0.5.10/tests/test_context_provider.py +1266 -0
- flock_core-0.5.10/tests/test_context_security.py +325 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dspy_engine.py +51 -41
- flock_core-0.5.10/tests/test_engine_context.py +283 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_engines.py +3 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_and_gate.py +1 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_batchspec.py +2 -2
- flock_core-0.5.10/tests/test_orchestrator_context_injection.py +578 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_joinspec.py +2 -2
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_runtime.py +17 -17
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_subscription.py +1 -1
- {flock_core-0.5.8 → flock_core-0.5.10}/uv.lock +232 -233
- flock_core-0.5.8/examples/08-spec-driven-development/00_test_specialists.py +0 -349
- flock_core-0.5.8/examples/08-spec-driven-development/01_test_mcp_config.py +0 -117
- flock_core-0.5.8/examples/08-spec-driven-development/02_specify_workflow.py +0 -285
- flock_core-0.5.8/examples/08-spec-driven-development/03_analyze_workflow.py +0 -197
- flock_core-0.5.8/examples/08-spec-driven-development/04_implement_workflow.py +0 -349
- flock_core-0.5.8/examples/08-spec-driven-development/05_refactor_workflow.py +0 -305
- flock_core-0.5.8/examples/08-spec-driven-development/06_dashboard_demo.py +0 -183
- flock_core-0.5.8/examples/08-spec-driven-development/README.md +0 -332
- flock_core-0.5.8/examples/08-spec-driven-development/agents.py +0 -350
- flock_core-0.5.8/examples/08-spec-driven-development/artifacts.py +0 -530
- flock_core-0.5.8/examples/08-spec-driven-development/mcp_config.py +0 -205
- flock_core-0.5.8/examples/08-spec-driven-development/orchestrators.py +0 -435
- flock_core-0.5.8/examples/08-spec-driven-development/spec_tools.py +0 -349
- flock_core-0.5.8/examples/08-spec-driven-development/test_agents.py +0 -300
- flock_core-0.5.8/examples/08-spec-driven-development/test_artifacts.py +0 -296
- flock_core-0.5.8/examples/README.md +0 -262
- {flock_core-0.5.8 → flock_core-0.5.10}/.devcontainer/devcontainer.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.envtemplate +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.github/workflows/deploy-documentation.yml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.gitignore +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.pre-commit-config.yaml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.python-version +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/.vscode/settings.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/AUTO_TRACING.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/CONTRIBUTING.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/ID_AUDIT_REPORT.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/LICENSE +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/ROADMAP.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/USECASES.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/about/changelog.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/about/contributing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/about/roadmap.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/batch.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/bug_diagnosis.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/flock.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/flock_ui_1.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/flock_ui_agent_view.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/flock_ui_blackboard_view.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/join.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/pattern2.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/pizza.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/trace_1.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/trace_2.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/assets/images/trace_3.png +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/bugfixes/websocket-streaming-deadlock-fix.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/community/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/examples/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/getting-started/concepts.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/getting-started/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/getting-started/installation.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/getting-started/quick-start.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/agents.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/batch-processing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/blackboard.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/components.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/dashboard.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/dspy-engine.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/fan-out.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/join-operations.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/mcp-roots.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/orchestrator-components.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/patterns.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/persistent-blackboard.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/predicates.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/testing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/auto-tracing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/how_to_use_tracing_effectively.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/trace-module.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/tracing-production.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/tracing-quickstart.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/tracing/unified-tracing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/guides/use-cases.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/javascripts/extra.js +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/reference/api.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/reference/configuration.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/reference/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/001-sqlite-blackboard-store/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/001-sqlite-blackboard-store/PRD.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/002-ui-optimization-migration/PHASE_4.1_AFTERMATH_AUDIT.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/002-ui-optimization-migration/PHASE_4.1_TASK_LIST.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/002-ui-optimization-migration/PRD.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/003-logic-operations/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-logic-operations-ux/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-logic-operations-ux/PRD.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-orchestrator-component/LOGGING_GUIDE.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-orchestrator-component/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-orchestrator-component/PRD.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-orchestrator-component/README.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/004-orchestrator-component/UNIFIED_IMPLEMENTATION_PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/005-multi-publishes-fan-out/CHANGES_SUMMARY.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/005-multi-publishes-fan-out/CONCURRENCY_FIX.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/005-multi-publishes-fan-out/PHASE4_ARCHITECTURAL_PIVOT.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/005-multi-publishes-fan-out/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/005-multi-publishes-fan-out/PRD.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/specs/006-dspy-engine-refactor/PLAN.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/stylesheets/extra.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tags.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/troubleshooting/streaming-freeze-fix.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/troubleshooting/streaming-freeze-with-dashboard-fix.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/advanced-patterns.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/conditional-routing.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/connect_with_ollama.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/custom-agent-components.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/custom-engines.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/index.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/multi-agent-workflow.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/tutorials/your-first-agent.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/docs/whiteducksoftware/versions.json +0 -0
- {flock_core-0.5.8/examples/09-patterms → flock_core-0.5.10/examples/00-patterns}/01-single_publish.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/02_input_and_output.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/03_code_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/05_mcp_and_tools.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/07_web_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/08_band_formation.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/12_secret_agents.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/13_medical_diagnostics_joinspec.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/14_ecommerce_batch_processing.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/01-cli/15_iot_sensor_batching.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/02_input_and_output.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/03_code_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/05_mcp_and_tools.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/07_web_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/08_band_formation.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/10_news_agency.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/11_tracing_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/12_secret_agents.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/14_ecommerce_batch_processing.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/02-dashboard/15_iot_sensor_batching.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/README.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_01_code_detective.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_02_band_formation.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_04_debate_club.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_06_secret_agents.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_09_the_batch_optimizer.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/03-claudes-workshop/lesson_10_the_smart_factory.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/04-misc/02-dashboard-edge-cases.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/04-misc/03-scale-test-100-agents.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/examples/04-misc/05_lm_studio.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/mkdocs.yml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/requirements.txt +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/build_dashboard.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/bump_version.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/check_version_bump.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/ensure_uv.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/gen_ref_pages.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/scripts/generate_llm_codebase.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/artifacts.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/graph_builder.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/models/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/static_v2/assets/index-DFRnI_mt.js +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/static_v2/assets/index-fPLNdmp1.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/dashboard/static_v2/index.html +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/engines/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/engines/examples/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/README.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/docs/DESIGN_SYSTEM.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/index.html +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/package-lock.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/package.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/App.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/BuildInfo.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/EmptyState.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/EmptyState.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/ErrorBoundary.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/ErrorBoundary.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/LoadingSpinner.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/common/LoadingSpinner.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/controls/PublishControl.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/controls/PublishControl.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/controls/PublishControl.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/DetailWindowContainer.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/LiveOutputTab.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/LiveOutputTab.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/MessageDetailWindow.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/MessageHistoryTab.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/NodeDetailWindow.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/NodeDetailWindow.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/RunStatusTab.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/details/tabs.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/CorrelationIDFilter.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/CorrelationIDFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/FilterFlyout.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/FilterFlyout.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/FilterPills.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/FilterPills.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/FilterPills.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/ProducerFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/SavedFiltersControl.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/SavedFiltersControl.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/TagFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/TimeRangeFilter.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/TimeRangeFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/filters/VisibilityFilter.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/AgentNode.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/AgentNode.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/GraphCanvas.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/LogicOperationsDisplay.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/MessageFlowEdge.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/MessageNode.test.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/MessageNode.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/MiniMap.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/PendingBatchEdge.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/PendingJoinEdge.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/graph/TransformEdge.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/layout/DashboardLayout.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/layout/DashboardLayout.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/layout/Header.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/layout/Header.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/ModuleRegistry.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/ModuleRegistry.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/ModuleWindow.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/TraceModuleJaeger.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/modules/registerModules.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/AdvancedSettings.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/AppearanceSettings.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/GraphSettings.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/MultiSelect.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/SettingsPanel.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/SettingsPanel.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/ThemeSelector.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/components/settings/TracingSettings.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/hooks/useKeyboardShortcuts.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/hooks/useModulePersistence.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/hooks/useModulePersistence.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/hooks/useModules.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/hooks/usePersistence.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/main.tsx +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/api.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/graphService.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/graphService.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/layout.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/layout.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/themeApplicator.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/themeService.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/services/websocket.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/filterStore.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/filterStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/graphStore.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/graphStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/moduleStore.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/moduleStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/settingsStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/streamStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/uiStore.test.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/uiStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/store/wsStore.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/styles/index.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/styles/scrollbar.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/styles/variables.css +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/test/setup.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/types/filters.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/types/graph.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/types/modules.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/types/theme.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/utils/artifacts.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/utils/mockData.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/utils/performance.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/src/vite-env.d.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/tsconfig.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/tsconfig.node.json +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/vite.config.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/frontend/vitest.config.ts +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/formatters/themes.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/span_middleware/baggage_span_processor.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/telemetry_exporter/base_exporter.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/telemetry_exporter/file_exporter.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/logging/telemetry_exporter/sqlite_exporter.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/sse/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/stdio/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/stdio/flock_stdio_server.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/streamable_http/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/websockets/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/servers/websockets/flock_websocket_server.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/types/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/types/callbacks.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/types/factories.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/util/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/mcp/util/helpers.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/patches/__init__.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/3024-day.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/3024-night.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/aardvark-blue.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/abernathy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/adventure.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/adventuretime.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/afterglow.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/alabaster.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/alienblood.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/andromeda.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/apple-classic.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/apple-system-colors.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/arcoiris.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/argonaut copy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/argonaut.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/arthur.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ateliersulphurpool.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/atom.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/atom_test.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/atomonelight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/aurora.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ayu copy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ayu-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ayu-mirage.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ayu.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/banana-blueberry.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/batman.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/belafonte-day.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/belafonte-night.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/birdsofparadise.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/blazer.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/blue-matrix.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/blueberrypie.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/bluedolphin.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/blulocodark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/blulocolight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/borland.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/breeze.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/bright-lights.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/broadcast.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/brogrammer.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-pastel-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-solarized-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-solarized-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-tango-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/builtin-tango-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/c64.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/calamity.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/catppuccin-frappe.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/catppuccin-latte.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/catppuccin-macchiato.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/catppuccin-mocha.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cga.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/chalk.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/chalkboard.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/challengerdeep.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/chester.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ciapre.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/clrs.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cobalt-neon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cobalt2.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/coffee-theme.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/crayonponyfish.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cutiepro.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cyberdyne.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cyberpunk.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dark+.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dark-pastel.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/darkermatrix.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/darkmatrix.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/darkside.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dayfox.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/deep.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/desert.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dimidium.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dimmedmonokai.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/django.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/djangorebornagain.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/djangosmooth.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/doom-peacock.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/doomone.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dotgov.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dracula+.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/dracula.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/duckbones.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/duotone-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/earthsong.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/elemental.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/elementary.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/encom.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/espresso-libre.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/espresso.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/everblush.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/fahrenheit.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/fairyfloss.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/farmhouse-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/farmhouse-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/fideloper.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/firefly-traditional.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/firefoxdev.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/firewatch.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/fishtank.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/flat.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/flatland.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/flexoki-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/flexoki-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/floraverse.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/forestblue.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/framer.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/frontenddelight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/funforrest.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/galaxy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/galizur.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/github-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/github.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/glacier.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/grape.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/grass.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/grey-green.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/gruber-darker.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/gruvboxdark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/gruvboxdarkhard.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/gruvboxlight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/guezwhoz.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hacktober.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hardcore.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/harper.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hax0r-blue.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hax0r-gr33n.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hax0r-r3d.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/highway.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hipster-green.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hivacruz.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/homebrew.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hopscotch.256.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hopscotch.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hurtado.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/hybrid.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ic-green-ppl.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ic-orange-ppl.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iceberg-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iceberg-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/idea.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/idletoes.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ir-black.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-dark-background.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-default.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-light-background.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-smoooooth.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-solarized-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-tango-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/iterm2-tango-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/jackie-brown.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/japanesque.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/jellybeans.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/jetbrains-darcula.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/jubi.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/kanagawabones.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/kibble.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/kolorit.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/konsolas.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/kurokula.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/lab-fox.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/laser.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/later-this-evening.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/lavandula.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/liquidcarbon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/liquidcarbontransparent.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/lovelace.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/man-page.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/mariana.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/material.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/materialdark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/materialdarker.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/materialdesigncolors.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/materialocean.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/mathias.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/matrix.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/medallion.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/mellifluous.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/midnight-in-mojave.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/mirage.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/misterioso.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/molokai.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/monalisa.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/monokai-remastered.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/monokai-soda.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/monokai-vivid.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/n0tch2k.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/neobones-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/neobones-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/neon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/neopolitan.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/neutron.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/night-owlish-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nightfox.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nightlion-v1.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nightlion-v2.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/niji.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nocturnal-winter.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nord-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nord.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/novel.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nvimdark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/nvimlight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/obsidian.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ocean.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/oceanic-next.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/oceanicmaterial.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ollie.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/onehalfdark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/onehalflight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/operator-mono-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/overnight-slumber.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/oxocarbon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/palenighthc.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pandora.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/paraiso-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/paulmillr.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pencildark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pencillight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/peppermint.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/piatto-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pnevma.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/popping-and-locking.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/primary.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pro-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/pro.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/purple-rain.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/purplepeter.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rapture.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/raycast-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/raycast-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rebecca.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/red-alert.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/red-planet.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/red-sands.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/relaxed.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/retro.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rippedcasts.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rose-pine-dawn.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rose-pine-moon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rose-pine.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/rouge-2.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/royal.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ryuuko.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/sakura.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/scarlet-protocol.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/seafoam-pastel.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/seashells.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/seoulbones-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/seoulbones-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/seti.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/shades-of-purple.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/shaman.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/slate.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/sleepyhollow.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/smyck.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/snazzy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/softserver.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/solarized-darcula.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/solarized-dark---patched.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spacedust.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spacegray-eighties.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spacegray.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spiderman.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/spring.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/square.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/sublette.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/subliminal.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/sugarplum.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/sundried.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/symfonic.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/synthwave-everything.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/synthwave.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/synthwavealpha.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tango-adapted.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tango-half-adapted.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/teerb.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/terafox.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/terminal-basic.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/thayer-bright.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/the-hulk.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tinacious-design-(dark).toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tinacious-design-(light).toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tokyonight-day.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tokyonight-storm.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tokyonight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow-night-blue.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow-night-bright.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow-night-burns.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow-night.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/tomorrow.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/toychest.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/treehouse.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/twilight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ubuntu.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ultradark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/ultraviolent.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/underthesea.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/unikitty.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/urple.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/vaughn.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/vesper.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/vibrantink.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/vimbones.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/violet-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/violet-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/warmneon.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/wez.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/whimsy.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/wildcherry.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/wilmersdorf.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/wombat.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/wryan.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/xcodedark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/xcodedarkhc.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/xcodelight.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/xcodelighthc.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/xcodewwdc.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenbones-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenbones-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenbones.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenburn.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenburned.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenwritten-dark.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/themes/zenwritten-light.toml +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/src/flock/visibility.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/PHASE2_TEST_SUMMARY.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/PHASE3_TEST_SUMMARY.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/TEST_COVERAGE_PHASE2.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/conftest.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/contract/test_agent_payload_selection_contract.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/contract/test_artifact_storage_contract.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/contract/test_type_normalization_contract.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/dashboard/test_logic_operations_api.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/dashboard/test_logic_operations_events.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/e2e/README.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/e2e/TESTING_SUMMARY.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/integration/test_collector_orchestrator.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/integration/test_orchestrator_dashboard.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/integration/test_sqlite_store_integration.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/integration/test_websocket_protocol.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_agent.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_agent_builder.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_agent_mcp.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_agent_server_specific_mounts.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_artifacts.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_cli.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_cli_helper.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dashboard_api.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dashboard_collector.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dashboard_graph.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dashboard_launcher.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dashboard_service.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dspy_engine_mcp.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dspy_engine_multioutput.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_dspy_streaming_events.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_filtering_validation.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_logging_config.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_client.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_config.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_coverage_summary.md +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_imports.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_manager.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_server_config_typeddict.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_mcp_tool_handlers.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_combined.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_component.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_orchestrator_mcp.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_output_groups.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_registry.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_service.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_service_extended.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_store.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_store_graph.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_telemetry.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_trace_clearing.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_unified_tracing.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_utilities.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_version_endpoint.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_visibility.py +0 -0
- {flock_core-0.5.8 → flock_core-0.5.10}/tests/test_websocket_manager.py +0 -0
|
@@ -51,12 +51,29 @@ jobs:
|
|
|
51
51
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
52
52
|
uv run pytest --cov=src/flock --cov-branch --cov-report=xml --cov-report=term --cov-fail-under=75
|
|
53
53
|
|
|
54
|
+
- name: Extract test metrics
|
|
55
|
+
id: test-metrics
|
|
56
|
+
run: |
|
|
57
|
+
export PATH="$HOME/.cargo/bin:$PATH"
|
|
58
|
+
|
|
59
|
+
# Count total tests
|
|
60
|
+
TEST_COUNT=$(uv run pytest --collect-only -q | tail -n 1 | awk '{print $1}')
|
|
61
|
+
echo "test_count=$TEST_COUNT" >> $GITHUB_OUTPUT
|
|
62
|
+
echo "📊 Total tests: $TEST_COUNT"
|
|
63
|
+
|
|
64
|
+
# Extract coverage percentage from XML
|
|
65
|
+
COVERAGE=$(python -c "import xml.etree.ElementTree as ET; tree = ET.parse('coverage.xml'); root = tree.getroot(); print(f\"{float(root.attrib['line-rate']) * 100:.0f}\")")
|
|
66
|
+
echo "coverage=$COVERAGE" >> $GITHUB_OUTPUT
|
|
67
|
+
echo "📈 Coverage: $COVERAGE%"
|
|
68
|
+
|
|
54
69
|
- name: Upload coverage to Codecov
|
|
55
70
|
uses: codecov/codecov-action@v4
|
|
56
71
|
with:
|
|
72
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
57
73
|
file: ./coverage.xml
|
|
58
74
|
flags: backend
|
|
59
75
|
name: backend-coverage
|
|
76
|
+
fail_ci_if_error: true
|
|
60
77
|
|
|
61
78
|
- name: Backend build check
|
|
62
79
|
run: |
|
|
@@ -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]`)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flock-core
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.10
|
|
4
4
|
Summary: Flock: A declrative framework for building and orchestrating AI agents.
|
|
5
5
|
Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
|
|
6
6
|
License: MIT
|
|
@@ -37,11 +37,11 @@ Description-Content-Type: text/markdown
|
|
|
37
37
|
<p align="center">
|
|
38
38
|
<a href="https://whiteducksoftware.github.io/flock/" target="_blank"><img alt="Documentation" src="https://img.shields.io/badge/docs-online-blue?style=for-the-badge&logo=readthedocs"></a>
|
|
39
39
|
<a href="https://pypi.org/project/flock-core/" target="_blank"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/flock-core?style=for-the-badge&logo=pypi&label=pip%20version"></a>
|
|
40
|
-
<img alt="Python Version" src="https://img.shields.io/badge/python-3.
|
|
40
|
+
<img alt="Python Version" src="https://img.shields.io/badge/python-3.12%2B-blue?style=for-the-badge&logo=python">
|
|
41
41
|
<a href="LICENSE" target="_blank"><img alt="License" src="https://img.shields.io/github/license/whiteducksoftware/flock?style=for-the-badge"></a>
|
|
42
42
|
<a href="https://whiteduck.de" target="_blank"><img alt="Built by white duck" src="https://img.shields.io/badge/Built%20by-white%20duck%20GmbH-white?style=for-the-badge&labelColor=black"></a>
|
|
43
|
-
<img alt="Test Coverage" src="https://
|
|
44
|
-
<img alt="Tests" src="https://img.shields.io/badge/tests-
|
|
43
|
+
<a href="https://codecov.io/gh/whiteducksoftware/flock" target="_blank"><img alt="Test Coverage" src="https://codecov.io/gh/whiteducksoftware/flock/branch/main/graph/badge.svg?token=YOUR_TOKEN_HERE&style=for-the-badge"></a>
|
|
44
|
+
<img alt="Tests" src="https://img.shields.io/badge/tests-1300+-brightgreen?style=for-the-badge">
|
|
45
45
|
</p>
|
|
46
46
|
|
|
47
47
|
---
|
|
@@ -287,6 +287,39 @@ asyncio.run(main())
|
|
|
287
287
|
|
|
288
288
|
---
|
|
289
289
|
|
|
290
|
+
## Context Provider Primer (Security + Cost)
|
|
291
|
+
|
|
292
|
+
Context Providers are the security and efficiency layer between agents and the blackboard. They decide what each agent sees in its historical context and always enforce visibility rules.
|
|
293
|
+
|
|
294
|
+
Why use them
|
|
295
|
+
- Enforce access control (visibility is applied before engines see data)
|
|
296
|
+
- Cut context size (often 90%+) by filtering to what matters
|
|
297
|
+
- Specialize per agent or set a global default
|
|
298
|
+
|
|
299
|
+
Copy/paste examples
|
|
300
|
+
```python
|
|
301
|
+
from flock import Flock
|
|
302
|
+
from flock.context_provider import FilteredContextProvider
|
|
303
|
+
from flock.store import FilterConfig
|
|
304
|
+
|
|
305
|
+
# Global: show only urgent items (limit context size)
|
|
306
|
+
flock = Flock(
|
|
307
|
+
"openai/gpt-4.1",
|
|
308
|
+
context_provider=FilteredContextProvider(FilterConfig(tags={"urgent"}), limit=50)
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# Per-agent: override global for a specific role
|
|
312
|
+
senior = flock.agent("senior").consumes(LogEntry).publishes(Analysis)
|
|
313
|
+
senior.context_provider = FilteredContextProvider(
|
|
314
|
+
FilterConfig(tags={"ERROR", "WARN"}),
|
|
315
|
+
limit=200
|
|
316
|
+
)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Learn more: docs/guides/context-providers.md
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
290
323
|
## Persistent Blackboard History
|
|
291
324
|
|
|
292
325
|
The in-memory store is still great for local tinkering, but production teams now have a durable option. Plugging in `SQLiteBlackboardStore` turns the blackboard into a persistent event log with first-class ergonomics:
|
|
@@ -541,8 +574,105 @@ artifact.visibility = AfterVisibility(ttl=timedelta(hours=24), then=PublicVisibi
|
|
|
541
574
|
agent.publishes(PublicReport, visibility=PublicVisibility())
|
|
542
575
|
```
|
|
543
576
|
|
|
577
|
+
**Visibility has a dual purpose:** It controls both which agents can be **triggered** by an artifact AND which artifacts agents can **see** in their context. This ensures consistent security across agent execution and data access—agents cannot bypass visibility controls through subscription filters or context providers.
|
|
578
|
+
|
|
544
579
|
**Why this matters:** Financial services, healthcare, defense, SaaS platforms all need this for compliance. Other frameworks make you build it yourself.
|
|
545
580
|
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
### 🔒 Architecturally Impossible to Bypass Security
|
|
584
|
+
|
|
585
|
+
**Here's what makes Flock different:** In most frameworks, security is something you remember to add. In Flock, **it's architecturally impossible to forget.**
|
|
586
|
+
|
|
587
|
+
Every context provider in Flock inherits from `BaseContextProvider`, which enforces visibility filtering **automatically**. You literally cannot create a provider that forgets to check permissions—the security logic is baked into the base class and executes before your custom code even runs.
|
|
588
|
+
|
|
589
|
+
**What this means in practice:**
|
|
590
|
+
|
|
591
|
+
```python
|
|
592
|
+
# ❌ Other frameworks: Security is your responsibility (easy to forget!)
|
|
593
|
+
class MyProvider:
|
|
594
|
+
async def get_context(self, agent):
|
|
595
|
+
artifacts = store.get_all() # OOPS! Forgot to check visibility!
|
|
596
|
+
return artifacts # 🔥 Security vulnerability
|
|
597
|
+
|
|
598
|
+
# ✅ Flock: Security is enforced automatically (impossible to bypass!)
|
|
599
|
+
class MyProvider(BaseContextProvider):
|
|
600
|
+
async def get_artifacts(self, request):
|
|
601
|
+
artifacts = await store.query_artifacts(...)
|
|
602
|
+
return artifacts # ✨ Visibility filtering happens automatically!
|
|
603
|
+
# BaseContextProvider calls .visibility.allows() for you
|
|
604
|
+
# You CANNOT bypass this - it's enforced by the architecture
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
**Built-in providers (all inherit BaseContextProvider):**
|
|
608
|
+
- `DefaultContextProvider` - Full blackboard access (visibility-filtered)
|
|
609
|
+
- `CorrelatedContextProvider` - Workflow isolation (visibility-filtered)
|
|
610
|
+
- `RecentContextProvider` - Token cost control (visibility-filtered)
|
|
611
|
+
- `TimeWindowContextProvider` - Time-based filtering (visibility-filtered)
|
|
612
|
+
- `EmptyContextProvider` - Stateless agents (zero context)
|
|
613
|
+
- `FilteredContextProvider` - Custom filtering (visibility-filtered)
|
|
614
|
+
|
|
615
|
+
**Every single one enforces visibility automatically. Zero chance of accidentally leaking data.**
|
|
616
|
+
|
|
617
|
+
This isn't just convenient—it's **security by design**. When you're building HIPAA-compliant healthcare systems or SOC2-certified SaaS platforms, "impossible to bypass even by accident" is the only acceptable standard.
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
### Context Providers (The Smart Filter)
|
|
622
|
+
|
|
623
|
+
**Control what agents see with custom Context Providers:**
|
|
624
|
+
|
|
625
|
+
```python
|
|
626
|
+
from flock.context_provider import FilteredContextProvider, PasswordRedactorProvider
|
|
627
|
+
from flock.store import FilterConfig
|
|
628
|
+
|
|
629
|
+
# Global filtering - all agents see only urgent items
|
|
630
|
+
flock = Flock(
|
|
631
|
+
"openai/gpt-4.1",
|
|
632
|
+
context_provider=FilteredContextProvider(FilterConfig(tags={"urgent"}))
|
|
633
|
+
)
|
|
634
|
+
|
|
635
|
+
# Per-agent overrides - specialized context per agent
|
|
636
|
+
error_agent = flock.agent("errors").consumes(Log).publishes(Alert)
|
|
637
|
+
error_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR"}))
|
|
638
|
+
|
|
639
|
+
# Production-ready password filtering
|
|
640
|
+
from examples.context_provider import PasswordRedactorProvider
|
|
641
|
+
flock = Flock(
|
|
642
|
+
"openai/gpt-4.1",
|
|
643
|
+
context_provider=PasswordRedactorProvider() # Auto-redacts sensitive data!
|
|
644
|
+
)
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
**What just happened:**
|
|
648
|
+
- ✅ **Filtered context** - Agents see only relevant artifacts (save tokens, improve performance)
|
|
649
|
+
- ✅ **Security boundary** - Visibility enforcement + custom filtering (mandatory, cannot bypass)
|
|
650
|
+
- ✅ **Sensitive data protection** - Auto-redact passwords, API keys, credit cards, SSN, JWT tokens
|
|
651
|
+
- ✅ **Per-agent specialization** - Different agents, different context rules
|
|
652
|
+
|
|
653
|
+
**Production patterns:**
|
|
654
|
+
```python
|
|
655
|
+
# Password/secret redaction (copy-paste ready!)
|
|
656
|
+
provider = PasswordRedactorProvider(
|
|
657
|
+
custom_patterns={"internal_id": r"ID-\d{6}"},
|
|
658
|
+
redaction_text="[REDACTED]"
|
|
659
|
+
)
|
|
660
|
+
|
|
661
|
+
# Role-based access control
|
|
662
|
+
junior_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR"}))
|
|
663
|
+
senior_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR", "WARN"}))
|
|
664
|
+
admin_agent.context_provider = None # See everything (uses default)
|
|
665
|
+
|
|
666
|
+
# Multi-tenant isolation
|
|
667
|
+
agent.context_provider = FilteredContextProvider(
|
|
668
|
+
FilterConfig(tags={"tenant:customer_123"})
|
|
669
|
+
)
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
**Why this matters:** Reduce token costs (90%+ with smart filtering), protect sensitive data (auto-redact secrets), improve performance (agents see only what they need).
|
|
673
|
+
|
|
674
|
+
**📖 [Learn more: Context Providers Guide](https://whiteducksoftware.github.io/flock/guides/context-providers/) | [Steal production code →](examples/08-context-provider/)**
|
|
675
|
+
|
|
546
676
|
### Batching Pattern: Parallel Execution Control
|
|
547
677
|
|
|
548
678
|
**A key differentiator:** The separation of `publish()` and `run_until_idle()` enables parallel execution.
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
<p align="center">
|
|
5
5
|
<a href="https://whiteducksoftware.github.io/flock/" target="_blank"><img alt="Documentation" src="https://img.shields.io/badge/docs-online-blue?style=for-the-badge&logo=readthedocs"></a>
|
|
6
6
|
<a href="https://pypi.org/project/flock-core/" target="_blank"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/flock-core?style=for-the-badge&logo=pypi&label=pip%20version"></a>
|
|
7
|
-
<img alt="Python Version" src="https://img.shields.io/badge/python-3.
|
|
7
|
+
<img alt="Python Version" src="https://img.shields.io/badge/python-3.12%2B-blue?style=for-the-badge&logo=python">
|
|
8
8
|
<a href="LICENSE" target="_blank"><img alt="License" src="https://img.shields.io/github/license/whiteducksoftware/flock?style=for-the-badge"></a>
|
|
9
9
|
<a href="https://whiteduck.de" target="_blank"><img alt="Built by white duck" src="https://img.shields.io/badge/Built%20by-white%20duck%20GmbH-white?style=for-the-badge&labelColor=black"></a>
|
|
10
|
-
<img alt="Test Coverage" src="https://
|
|
11
|
-
<img alt="Tests" src="https://img.shields.io/badge/tests-
|
|
10
|
+
<a href="https://codecov.io/gh/whiteducksoftware/flock" target="_blank"><img alt="Test Coverage" src="https://codecov.io/gh/whiteducksoftware/flock/branch/main/graph/badge.svg?token=YOUR_TOKEN_HERE&style=for-the-badge"></a>
|
|
11
|
+
<img alt="Tests" src="https://img.shields.io/badge/tests-1300+-brightgreen?style=for-the-badge">
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
14
|
---
|
|
@@ -254,6 +254,39 @@ asyncio.run(main())
|
|
|
254
254
|
|
|
255
255
|
---
|
|
256
256
|
|
|
257
|
+
## Context Provider Primer (Security + Cost)
|
|
258
|
+
|
|
259
|
+
Context Providers are the security and efficiency layer between agents and the blackboard. They decide what each agent sees in its historical context and always enforce visibility rules.
|
|
260
|
+
|
|
261
|
+
Why use them
|
|
262
|
+
- Enforce access control (visibility is applied before engines see data)
|
|
263
|
+
- Cut context size (often 90%+) by filtering to what matters
|
|
264
|
+
- Specialize per agent or set a global default
|
|
265
|
+
|
|
266
|
+
Copy/paste examples
|
|
267
|
+
```python
|
|
268
|
+
from flock import Flock
|
|
269
|
+
from flock.context_provider import FilteredContextProvider
|
|
270
|
+
from flock.store import FilterConfig
|
|
271
|
+
|
|
272
|
+
# Global: show only urgent items (limit context size)
|
|
273
|
+
flock = Flock(
|
|
274
|
+
"openai/gpt-4.1",
|
|
275
|
+
context_provider=FilteredContextProvider(FilterConfig(tags={"urgent"}), limit=50)
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
# Per-agent: override global for a specific role
|
|
279
|
+
senior = flock.agent("senior").consumes(LogEntry).publishes(Analysis)
|
|
280
|
+
senior.context_provider = FilteredContextProvider(
|
|
281
|
+
FilterConfig(tags={"ERROR", "WARN"}),
|
|
282
|
+
limit=200
|
|
283
|
+
)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Learn more: docs/guides/context-providers.md
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
257
290
|
## Persistent Blackboard History
|
|
258
291
|
|
|
259
292
|
The in-memory store is still great for local tinkering, but production teams now have a durable option. Plugging in `SQLiteBlackboardStore` turns the blackboard into a persistent event log with first-class ergonomics:
|
|
@@ -508,8 +541,105 @@ artifact.visibility = AfterVisibility(ttl=timedelta(hours=24), then=PublicVisibi
|
|
|
508
541
|
agent.publishes(PublicReport, visibility=PublicVisibility())
|
|
509
542
|
```
|
|
510
543
|
|
|
544
|
+
**Visibility has a dual purpose:** It controls both which agents can be **triggered** by an artifact AND which artifacts agents can **see** in their context. This ensures consistent security across agent execution and data access—agents cannot bypass visibility controls through subscription filters or context providers.
|
|
545
|
+
|
|
511
546
|
**Why this matters:** Financial services, healthcare, defense, SaaS platforms all need this for compliance. Other frameworks make you build it yourself.
|
|
512
547
|
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
### 🔒 Architecturally Impossible to Bypass Security
|
|
551
|
+
|
|
552
|
+
**Here's what makes Flock different:** In most frameworks, security is something you remember to add. In Flock, **it's architecturally impossible to forget.**
|
|
553
|
+
|
|
554
|
+
Every context provider in Flock inherits from `BaseContextProvider`, which enforces visibility filtering **automatically**. You literally cannot create a provider that forgets to check permissions—the security logic is baked into the base class and executes before your custom code even runs.
|
|
555
|
+
|
|
556
|
+
**What this means in practice:**
|
|
557
|
+
|
|
558
|
+
```python
|
|
559
|
+
# ❌ Other frameworks: Security is your responsibility (easy to forget!)
|
|
560
|
+
class MyProvider:
|
|
561
|
+
async def get_context(self, agent):
|
|
562
|
+
artifacts = store.get_all() # OOPS! Forgot to check visibility!
|
|
563
|
+
return artifacts # 🔥 Security vulnerability
|
|
564
|
+
|
|
565
|
+
# ✅ Flock: Security is enforced automatically (impossible to bypass!)
|
|
566
|
+
class MyProvider(BaseContextProvider):
|
|
567
|
+
async def get_artifacts(self, request):
|
|
568
|
+
artifacts = await store.query_artifacts(...)
|
|
569
|
+
return artifacts # ✨ Visibility filtering happens automatically!
|
|
570
|
+
# BaseContextProvider calls .visibility.allows() for you
|
|
571
|
+
# You CANNOT bypass this - it's enforced by the architecture
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**Built-in providers (all inherit BaseContextProvider):**
|
|
575
|
+
- `DefaultContextProvider` - Full blackboard access (visibility-filtered)
|
|
576
|
+
- `CorrelatedContextProvider` - Workflow isolation (visibility-filtered)
|
|
577
|
+
- `RecentContextProvider` - Token cost control (visibility-filtered)
|
|
578
|
+
- `TimeWindowContextProvider` - Time-based filtering (visibility-filtered)
|
|
579
|
+
- `EmptyContextProvider` - Stateless agents (zero context)
|
|
580
|
+
- `FilteredContextProvider` - Custom filtering (visibility-filtered)
|
|
581
|
+
|
|
582
|
+
**Every single one enforces visibility automatically. Zero chance of accidentally leaking data.**
|
|
583
|
+
|
|
584
|
+
This isn't just convenient—it's **security by design**. When you're building HIPAA-compliant healthcare systems or SOC2-certified SaaS platforms, "impossible to bypass even by accident" is the only acceptable standard.
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
### Context Providers (The Smart Filter)
|
|
589
|
+
|
|
590
|
+
**Control what agents see with custom Context Providers:**
|
|
591
|
+
|
|
592
|
+
```python
|
|
593
|
+
from flock.context_provider import FilteredContextProvider, PasswordRedactorProvider
|
|
594
|
+
from flock.store import FilterConfig
|
|
595
|
+
|
|
596
|
+
# Global filtering - all agents see only urgent items
|
|
597
|
+
flock = Flock(
|
|
598
|
+
"openai/gpt-4.1",
|
|
599
|
+
context_provider=FilteredContextProvider(FilterConfig(tags={"urgent"}))
|
|
600
|
+
)
|
|
601
|
+
|
|
602
|
+
# Per-agent overrides - specialized context per agent
|
|
603
|
+
error_agent = flock.agent("errors").consumes(Log).publishes(Alert)
|
|
604
|
+
error_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR"}))
|
|
605
|
+
|
|
606
|
+
# Production-ready password filtering
|
|
607
|
+
from examples.context_provider import PasswordRedactorProvider
|
|
608
|
+
flock = Flock(
|
|
609
|
+
"openai/gpt-4.1",
|
|
610
|
+
context_provider=PasswordRedactorProvider() # Auto-redacts sensitive data!
|
|
611
|
+
)
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
**What just happened:**
|
|
615
|
+
- ✅ **Filtered context** - Agents see only relevant artifacts (save tokens, improve performance)
|
|
616
|
+
- ✅ **Security boundary** - Visibility enforcement + custom filtering (mandatory, cannot bypass)
|
|
617
|
+
- ✅ **Sensitive data protection** - Auto-redact passwords, API keys, credit cards, SSN, JWT tokens
|
|
618
|
+
- ✅ **Per-agent specialization** - Different agents, different context rules
|
|
619
|
+
|
|
620
|
+
**Production patterns:**
|
|
621
|
+
```python
|
|
622
|
+
# Password/secret redaction (copy-paste ready!)
|
|
623
|
+
provider = PasswordRedactorProvider(
|
|
624
|
+
custom_patterns={"internal_id": r"ID-\d{6}"},
|
|
625
|
+
redaction_text="[REDACTED]"
|
|
626
|
+
)
|
|
627
|
+
|
|
628
|
+
# Role-based access control
|
|
629
|
+
junior_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR"}))
|
|
630
|
+
senior_agent.context_provider = FilteredContextProvider(FilterConfig(tags={"ERROR", "WARN"}))
|
|
631
|
+
admin_agent.context_provider = None # See everything (uses default)
|
|
632
|
+
|
|
633
|
+
# Multi-tenant isolation
|
|
634
|
+
agent.context_provider = FilteredContextProvider(
|
|
635
|
+
FilterConfig(tags={"tenant:customer_123"})
|
|
636
|
+
)
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**Why this matters:** Reduce token costs (90%+ with smart filtering), protect sensitive data (auto-redact secrets), improve performance (agents see only what they need).
|
|
640
|
+
|
|
641
|
+
**📖 [Learn more: Context Providers Guide](https://whiteducksoftware.github.io/flock/guides/context-providers/) | [Steal production code →](examples/08-context-provider/)**
|
|
642
|
+
|
|
513
643
|
### Batching Pattern: Parallel Execution Control
|
|
514
644
|
|
|
515
645
|
**A key differentiator:** The separation of `publish()` and `run_until_idle()` enables parallel execution.
|