flock-core 0.5.0b56__tar.gz → 0.5.0b57__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.

Files changed (636) hide show
  1. flock_core-0.5.0b57/AGENTS.md +1390 -0
  2. flock_core-0.5.0b56/AGENTS.md → flock_core-0.5.0b57/AGENTS.md.backup +493 -1
  3. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/PKG-INFO +6 -2
  4. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/README.md +5 -1
  5. flock_core-0.5.0b57/docs/ai-agents/architecture.md +222 -0
  6. flock_core-0.5.0b57/docs/ai-agents/common-tasks.md +206 -0
  7. flock_core-0.5.0b57/docs/ai-agents/dependencies.md +130 -0
  8. flock_core-0.5.0b57/docs/ai-agents/development.md +202 -0
  9. flock_core-0.5.0b57/docs/ai-agents/frontend.md +203 -0
  10. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/01-the-declarative-way/01_declarative_pizza.py +1 -1
  11. flock_core-0.5.0b57/examples/03-the-dashboard/01_declarative_pizza.py +129 -0
  12. flock_core-0.5.0b57/examples/03-the-dashboard/02-dashboard-edge-cases.py +95 -0
  13. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_01_code_detective.py +2 -2
  14. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/06-readme/01-BugDiagnosis.py +0 -1
  15. flock_core-0.5.0b57/examples/07-notebooks/Untitled-1.ipynb +182 -0
  16. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/pyproject.toml +11 -1
  17. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/package.json +1 -1
  18. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/GraphCanvas.tsx +212 -34
  19. flock_core-0.5.0b57/src/flock/frontend/src/services/layout.ts +357 -0
  20. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/uv.lock +1153 -3
  21. flock_core-0.5.0b56/src/flock/frontend/src/services/layout.ts +0 -146
  22. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.devcontainer/devcontainer.json +0 -0
  23. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.envtemplate +0 -0
  24. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
  25. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.github/workflows/quality.yml +0 -0
  26. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.gitignore +0 -0
  27. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.pre-commit-config.yaml +0 -0
  28. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.python-version +0 -0
  29. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/.vscode/settings.json +0 -0
  30. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/CONTRIBUTING.md +0 -0
  31. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/LICENSE +0 -0
  32. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/ROADMAP.md +0 -0
  33. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/USECASES.md +0 -0
  34. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/AUTO_TRACING.md +0 -0
  35. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/IMPLEMENTATION_SUMMARY.md +0 -0
  36. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/PRE_COMMIT_HOOKS.md +0 -0
  37. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/TRACE_MODULE.md +0 -0
  38. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/TRACING_PRODUCTION_READINESS.md +0 -0
  39. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/UNIFIED_TRACING.md +0 -0
  40. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/UNIFIED_TRACING_DELIVERY.md +0 -0
  41. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/VERSIONING.md +0 -0
  42. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/design_and_goals/landscape_analysis.md +0 -0
  43. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/design_and_goals/motivation.md +0 -0
  44. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/design_and_goals/review.md +0 -0
  45. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/design_and_goals/technical_design.md +0 -0
  46. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/domain/test-improvement-roadmap.md +0 -0
  47. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/how_to_use_tracing_effectively.md +0 -0
  48. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/bug_diagnosis.png +0 -0
  49. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/flock_ui_1.png +0 -0
  50. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/flock_ui_agent_view.png +0 -0
  51. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/flock_ui_blackboard_view.png +0 -0
  52. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/pizza.png +0 -0
  53. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/trace_1.png +0 -0
  54. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/trace_2.png +0 -0
  55. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/img/trace_3.png +0 -0
  56. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/patterns/auto-layout-auto-zoom-removal.md +0 -0
  57. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/patterns/core-architecture.md +0 -0
  58. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/patterns/development-workflow.md +0 -0
  59. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/patterns/project-configuration.md +0 -0
  60. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/patterns/repository-structure.md +0 -0
  61. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/specs/001-test-coverage-improvement/PLAN.md +0 -0
  62. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/specs/001-test-coverage-improvement/PRD.md +0 -0
  63. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/specs/001-test-coverage-improvement/SDD.md +0 -0
  64. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/troubleshooting/codex_bug_analysis.md +0 -0
  65. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/docs/troubleshooting/event-log-memory-leak-analysis.md +0 -0
  66. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/01-the-declarative-way/02_input_and_output.py +0 -0
  67. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/01-the-declarative-way/03_mcp_and_tools.py +0 -0
  68. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/01-the-declarative-way/README.md +0 -0
  69. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/02-the-blackboard/README.md +0 -0
  70. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/03-the-dashboard/README.md +0 -0
  71. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/04-the-api/README.md +0 -0
  72. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/README.md +0 -0
  73. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_02_band_formation.py +0 -0
  74. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_03_web_detective.py +0 -0
  75. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_04_debate_club.py +0 -0
  76. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_05_tracing_detective.py +0 -0
  77. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_06_secret_agents.py +0 -0
  78. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/examples/05-claudes-workshop/lesson_07_news_agency.py +0 -0
  79. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/requirements.txt +0 -0
  80. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/scripts/build_dashboard.py +0 -0
  81. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/scripts/bump_version.py +0 -0
  82. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/scripts/check_version_bump.py +0 -0
  83. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/scripts/generate_llm_codebase.py +0 -0
  84. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/__init__.py +0 -0
  85. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/agent.py +0 -0
  86. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/api/themes.py +0 -0
  87. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/artifacts.py +0 -0
  88. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/cli.py +0 -0
  89. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/components.py +0 -0
  90. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/__init__.py +0 -0
  91. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/collector.py +0 -0
  92. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/events.py +0 -0
  93. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/launcher.py +0 -0
  94. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/service.py +0 -0
  95. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/dashboard/websocket.py +0 -0
  96. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/engines/__init__.py +0 -0
  97. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/engines/dspy_engine.py +0 -0
  98. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/examples.py +0 -0
  99. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/README.md +0 -0
  100. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/docs/DESIGN_SYSTEM.md +0 -0
  101. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/index.html +0 -0
  102. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/package-lock.json +0 -0
  103. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/App.tsx +0 -0
  104. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +0 -0
  105. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +0 -0
  106. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +0 -0
  107. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +0 -0
  108. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/BuildInfo.tsx +0 -0
  109. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/EmptyState.module.css +0 -0
  110. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/EmptyState.tsx +0 -0
  111. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/ErrorBoundary.module.css +0 -0
  112. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/ErrorBoundary.tsx +0 -0
  113. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.css +0 -0
  114. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +0 -0
  115. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/LoadingSpinner.module.css +0 -0
  116. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/common/LoadingSpinner.tsx +0 -0
  117. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/controls/PublishControl.css +0 -0
  118. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/controls/PublishControl.test.tsx +0 -0
  119. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/controls/PublishControl.tsx +0 -0
  120. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/DetailWindowContainer.tsx +0 -0
  121. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/LiveOutputTab.test.tsx +0 -0
  122. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/LiveOutputTab.tsx +0 -0
  123. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/MessageHistoryTab.tsx +0 -0
  124. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/NodeDetailWindow.test.tsx +0 -0
  125. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/NodeDetailWindow.tsx +0 -0
  126. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/RunStatusTab.tsx +0 -0
  127. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/details/tabs.test.tsx +0 -0
  128. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/CorrelationIDFilter.module.css +0 -0
  129. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +0 -0
  130. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/CorrelationIDFilter.tsx +0 -0
  131. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterBar.module.css +0 -0
  132. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterBar.test.tsx +0 -0
  133. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterBar.tsx +0 -0
  134. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterPills.module.css +0 -0
  135. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterPills.test.tsx +0 -0
  136. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/FilterPills.tsx +0 -0
  137. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/TimeRangeFilter.module.css +0 -0
  138. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +0 -0
  139. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/filters/TimeRangeFilter.tsx +0 -0
  140. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/AgentNode.test.tsx +0 -0
  141. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/AgentNode.tsx +0 -0
  142. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/MessageFlowEdge.tsx +0 -0
  143. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/MessageNode.test.tsx +0 -0
  144. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/MessageNode.tsx +0 -0
  145. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/MiniMap.tsx +0 -0
  146. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/graph/TransformEdge.tsx +0 -0
  147. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/layout/DashboardLayout.css +0 -0
  148. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/layout/DashboardLayout.tsx +0 -0
  149. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/layout/Header.module.css +0 -0
  150. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/layout/Header.tsx +0 -0
  151. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/EventLogModule.test.tsx +0 -0
  152. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/EventLogModule.tsx +0 -0
  153. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +0 -0
  154. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +0 -0
  155. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/ModuleRegistry.test.ts +0 -0
  156. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/ModuleRegistry.ts +0 -0
  157. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/ModuleWindow.tsx +0 -0
  158. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/TraceModuleJaeger.tsx +0 -0
  159. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +0 -0
  160. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/modules/registerModules.ts +0 -0
  161. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/AdvancedSettings.tsx +0 -0
  162. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/AppearanceSettings.tsx +0 -0
  163. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/GraphSettings.tsx +0 -0
  164. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/MultiSelect.tsx +0 -0
  165. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/SettingsPanel.css +0 -0
  166. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/SettingsPanel.tsx +0 -0
  167. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/ThemeSelector.tsx +0 -0
  168. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/components/settings/TracingSettings.tsx +0 -0
  169. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/hooks/useKeyboardShortcuts.ts +0 -0
  170. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/hooks/useModulePersistence.test.ts +0 -0
  171. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/hooks/useModulePersistence.ts +0 -0
  172. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/hooks/useModules.ts +0 -0
  173. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/hooks/usePersistence.ts +0 -0
  174. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/main.tsx +0 -0
  175. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/api.ts +0 -0
  176. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/indexeddb.test.ts +0 -0
  177. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/indexeddb.ts +0 -0
  178. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/layout.test.ts +0 -0
  179. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/themeApplicator.ts +0 -0
  180. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/themeService.ts +0 -0
  181. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/websocket.test.ts +0 -0
  182. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/services/websocket.ts +0 -0
  183. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/filterStore.test.ts +0 -0
  184. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/filterStore.ts +0 -0
  185. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/graphStore.test.ts +0 -0
  186. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/graphStore.ts +0 -0
  187. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/moduleStore.test.ts +0 -0
  188. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/moduleStore.ts +0 -0
  189. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/settingsStore.ts +0 -0
  190. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/streamStore.ts +0 -0
  191. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/uiStore.test.ts +0 -0
  192. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/uiStore.ts +0 -0
  193. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/store/wsStore.ts +0 -0
  194. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/styles/index.css +0 -0
  195. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/styles/scrollbar.css +0 -0
  196. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/styles/variables.css +0 -0
  197. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/test/setup.ts +0 -0
  198. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/types/filters.ts +0 -0
  199. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/types/graph.ts +0 -0
  200. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/types/modules.ts +0 -0
  201. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/types/theme.ts +0 -0
  202. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/utils/mockData.ts +0 -0
  203. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/utils/performance.ts +0 -0
  204. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/utils/transforms.test.ts +0 -0
  205. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/utils/transforms.ts +0 -0
  206. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/src/vite-env.d.ts +0 -0
  207. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/tsconfig.json +0 -0
  208. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/tsconfig.node.json +0 -0
  209. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/vite.config.ts +0 -0
  210. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/frontend/vitest.config.ts +0 -0
  211. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/helper/cli_helper.py +0 -0
  212. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/__init__.py +0 -0
  213. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/auto_trace.py +0 -0
  214. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/formatters/enum_builder.py +0 -0
  215. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/formatters/theme_builder.py +0 -0
  216. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/formatters/themed_formatter.py +0 -0
  217. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/formatters/themes.py +0 -0
  218. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/logging.py +0 -0
  219. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/span_middleware/baggage_span_processor.py +0 -0
  220. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/telemetry.py +0 -0
  221. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/telemetry_exporter/base_exporter.py +0 -0
  222. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/telemetry_exporter/duckdb_exporter.py +0 -0
  223. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/telemetry_exporter/file_exporter.py +0 -0
  224. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/telemetry_exporter/sqlite_exporter.py +0 -0
  225. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/logging/trace_and_logged.py +0 -0
  226. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/__init__.py +0 -0
  227. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/client.py +0 -0
  228. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/config.py +0 -0
  229. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/manager.py +0 -0
  230. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/sse/__init__.py +0 -0
  231. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/sse/flock_sse_server.py +0 -0
  232. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/stdio/__init__.py +0 -0
  233. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/stdio/flock_stdio_server.py +0 -0
  234. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/streamable_http/__init__.py +0 -0
  235. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/streamable_http/flock_streamable_http_server.py +0 -0
  236. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/websockets/__init__.py +0 -0
  237. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/servers/websockets/flock_websocket_server.py +0 -0
  238. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/tool.py +0 -0
  239. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/types/__init__.py +0 -0
  240. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/types/callbacks.py +0 -0
  241. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/types/factories.py +0 -0
  242. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/types/handlers.py +0 -0
  243. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/types/types.py +0 -0
  244. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/util/__init__.py +0 -0
  245. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/mcp/util/helpers.py +0 -0
  246. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/orchestrator.py +0 -0
  247. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/registry.py +0 -0
  248. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/runtime.py +0 -0
  249. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/service.py +0 -0
  250. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/store.py +0 -0
  251. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/subscription.py +0 -0
  252. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/3024-day.toml +0 -0
  253. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/3024-night.toml +0 -0
  254. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/aardvark-blue.toml +0 -0
  255. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/abernathy.toml +0 -0
  256. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/adventure.toml +0 -0
  257. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/adventuretime.toml +0 -0
  258. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/afterglow.toml +0 -0
  259. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/alabaster.toml +0 -0
  260. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/alienblood.toml +0 -0
  261. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/andromeda.toml +0 -0
  262. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/apple-classic.toml +0 -0
  263. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/apple-system-colors.toml +0 -0
  264. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/arcoiris.toml +0 -0
  265. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/argonaut copy.toml +0 -0
  266. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/argonaut.toml +0 -0
  267. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/arthur.toml +0 -0
  268. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ateliersulphurpool.toml +0 -0
  269. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/atom.toml +0 -0
  270. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/atom_test.toml +0 -0
  271. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/atomonelight.toml +0 -0
  272. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/aurora.toml +0 -0
  273. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ayu copy.toml +0 -0
  274. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ayu-light.toml +0 -0
  275. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ayu-mirage.toml +0 -0
  276. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ayu.toml +0 -0
  277. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/banana-blueberry.toml +0 -0
  278. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/batman.toml +0 -0
  279. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/belafonte-day.toml +0 -0
  280. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/belafonte-night.toml +0 -0
  281. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/birdsofparadise.toml +0 -0
  282. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/blazer.toml +0 -0
  283. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/blue-matrix.toml +0 -0
  284. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/blueberrypie.toml +0 -0
  285. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/bluedolphin.toml +0 -0
  286. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/blulocodark.toml +0 -0
  287. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/blulocolight.toml +0 -0
  288. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/borland.toml +0 -0
  289. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/breeze.toml +0 -0
  290. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/bright-lights.toml +0 -0
  291. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/broadcast.toml +0 -0
  292. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/brogrammer.toml +0 -0
  293. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-dark.toml +0 -0
  294. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-light.toml +0 -0
  295. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-pastel-dark.toml +0 -0
  296. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-solarized-dark.toml +0 -0
  297. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-solarized-light.toml +0 -0
  298. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-tango-dark.toml +0 -0
  299. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/builtin-tango-light.toml +0 -0
  300. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/c64.toml +0 -0
  301. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/calamity.toml +0 -0
  302. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/catppuccin-frappe.toml +0 -0
  303. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/catppuccin-latte.toml +0 -0
  304. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/catppuccin-macchiato.toml +0 -0
  305. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/catppuccin-mocha.toml +0 -0
  306. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cga.toml +0 -0
  307. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/chalk.toml +0 -0
  308. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/chalkboard.toml +0 -0
  309. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/challengerdeep.toml +0 -0
  310. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/chester.toml +0 -0
  311. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ciapre.toml +0 -0
  312. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/clrs.toml +0 -0
  313. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cobalt-neon.toml +0 -0
  314. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cobalt2.toml +0 -0
  315. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/coffee-theme.toml +0 -0
  316. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/crayonponyfish.toml +0 -0
  317. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cutiepro.toml +0 -0
  318. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cyberdyne.toml +0 -0
  319. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cyberpunk.toml +0 -0
  320. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
  321. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dark+.toml +0 -0
  322. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dark-pastel.toml +0 -0
  323. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/darkermatrix.toml +0 -0
  324. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/darkmatrix.toml +0 -0
  325. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/darkside.toml +0 -0
  326. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dayfox.toml +0 -0
  327. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/deep.toml +0 -0
  328. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/desert.toml +0 -0
  329. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dimidium.toml +0 -0
  330. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dimmedmonokai.toml +0 -0
  331. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/django.toml +0 -0
  332. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/djangorebornagain.toml +0 -0
  333. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/djangosmooth.toml +0 -0
  334. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/doom-peacock.toml +0 -0
  335. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/doomone.toml +0 -0
  336. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dotgov.toml +0 -0
  337. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dracula+.toml +0 -0
  338. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/dracula.toml +0 -0
  339. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/duckbones.toml +0 -0
  340. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/duotone-dark.toml +0 -0
  341. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/earthsong.toml +0 -0
  342. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/elemental.toml +0 -0
  343. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/elementary.toml +0 -0
  344. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/encom.toml +0 -0
  345. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/espresso-libre.toml +0 -0
  346. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/espresso.toml +0 -0
  347. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/everblush.toml +0 -0
  348. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/fahrenheit.toml +0 -0
  349. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/fairyfloss.toml +0 -0
  350. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/farmhouse-dark.toml +0 -0
  351. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/farmhouse-light.toml +0 -0
  352. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/fideloper.toml +0 -0
  353. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/firefly-traditional.toml +0 -0
  354. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/firefoxdev.toml +0 -0
  355. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/firewatch.toml +0 -0
  356. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/fishtank.toml +0 -0
  357. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/flat.toml +0 -0
  358. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/flatland.toml +0 -0
  359. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/flexoki-dark.toml +0 -0
  360. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/flexoki-light.toml +0 -0
  361. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/floraverse.toml +0 -0
  362. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/forestblue.toml +0 -0
  363. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/framer.toml +0 -0
  364. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/frontenddelight.toml +0 -0
  365. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/funforrest.toml +0 -0
  366. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/galaxy.toml +0 -0
  367. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/galizur.toml +0 -0
  368. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/github-dark.toml +0 -0
  369. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/github.toml +0 -0
  370. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/glacier.toml +0 -0
  371. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/grape.toml +0 -0
  372. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/grass.toml +0 -0
  373. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/grey-green.toml +0 -0
  374. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/gruber-darker.toml +0 -0
  375. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/gruvboxdark.toml +0 -0
  376. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/gruvboxdarkhard.toml +0 -0
  377. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/gruvboxlight.toml +0 -0
  378. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/guezwhoz.toml +0 -0
  379. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hacktober.toml +0 -0
  380. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hardcore.toml +0 -0
  381. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/harper.toml +0 -0
  382. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hax0r-blue.toml +0 -0
  383. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hax0r-gr33n.toml +0 -0
  384. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hax0r-r3d.toml +0 -0
  385. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/highway.toml +0 -0
  386. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hipster-green.toml +0 -0
  387. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hivacruz.toml +0 -0
  388. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/homebrew.toml +0 -0
  389. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hopscotch.256.toml +0 -0
  390. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hopscotch.toml +0 -0
  391. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hurtado.toml +0 -0
  392. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/hybrid.toml +0 -0
  393. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ic-green-ppl.toml +0 -0
  394. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ic-orange-ppl.toml +0 -0
  395. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iceberg-dark.toml +0 -0
  396. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iceberg-light.toml +0 -0
  397. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/idea.toml +0 -0
  398. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/idletoes.toml +0 -0
  399. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ir-black.toml +0 -0
  400. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-dark-background.toml +0 -0
  401. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-default.toml +0 -0
  402. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-light-background.toml +0 -0
  403. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
  404. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-smoooooth.toml +0 -0
  405. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
  406. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-solarized-light.toml +0 -0
  407. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-tango-dark.toml +0 -0
  408. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/iterm2-tango-light.toml +0 -0
  409. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/jackie-brown.toml +0 -0
  410. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/japanesque.toml +0 -0
  411. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/jellybeans.toml +0 -0
  412. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/jetbrains-darcula.toml +0 -0
  413. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/jubi.toml +0 -0
  414. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/kanagawabones.toml +0 -0
  415. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/kibble.toml +0 -0
  416. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/kolorit.toml +0 -0
  417. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/konsolas.toml +0 -0
  418. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/kurokula.toml +0 -0
  419. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/lab-fox.toml +0 -0
  420. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/laser.toml +0 -0
  421. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/later-this-evening.toml +0 -0
  422. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/lavandula.toml +0 -0
  423. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/liquidcarbon.toml +0 -0
  424. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/liquidcarbontransparent.toml +0 -0
  425. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
  426. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/lovelace.toml +0 -0
  427. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/man-page.toml +0 -0
  428. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/mariana.toml +0 -0
  429. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/material.toml +0 -0
  430. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/materialdark.toml +0 -0
  431. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/materialdarker.toml +0 -0
  432. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/materialdesigncolors.toml +0 -0
  433. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/materialocean.toml +0 -0
  434. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/mathias.toml +0 -0
  435. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/matrix.toml +0 -0
  436. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/medallion.toml +0 -0
  437. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/mellifluous.toml +0 -0
  438. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/midnight-in-mojave.toml +0 -0
  439. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/mirage.toml +0 -0
  440. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/misterioso.toml +0 -0
  441. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/molokai.toml +0 -0
  442. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/monalisa.toml +0 -0
  443. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/monokai-remastered.toml +0 -0
  444. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/monokai-soda.toml +0 -0
  445. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/monokai-vivid.toml +0 -0
  446. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/n0tch2k.toml +0 -0
  447. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/neobones-dark.toml +0 -0
  448. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/neobones-light.toml +0 -0
  449. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/neon.toml +0 -0
  450. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/neopolitan.toml +0 -0
  451. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/neutron.toml +0 -0
  452. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/night-owlish-light.toml +0 -0
  453. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nightfox.toml +0 -0
  454. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nightlion-v1.toml +0 -0
  455. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nightlion-v2.toml +0 -0
  456. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/niji.toml +0 -0
  457. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nocturnal-winter.toml +0 -0
  458. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nord-light.toml +0 -0
  459. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nord.toml +0 -0
  460. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/novel.toml +0 -0
  461. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nvimdark.toml +0 -0
  462. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/nvimlight.toml +0 -0
  463. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/obsidian.toml +0 -0
  464. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ocean.toml +0 -0
  465. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/oceanic-next.toml +0 -0
  466. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/oceanicmaterial.toml +0 -0
  467. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ollie.toml +0 -0
  468. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/onehalfdark.toml +0 -0
  469. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/onehalflight.toml +0 -0
  470. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/operator-mono-dark.toml +0 -0
  471. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/overnight-slumber.toml +0 -0
  472. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/oxocarbon.toml +0 -0
  473. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/palenighthc.toml +0 -0
  474. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pandora.toml +0 -0
  475. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/paraiso-dark.toml +0 -0
  476. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/paulmillr.toml +0 -0
  477. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pencildark.toml +0 -0
  478. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pencillight.toml +0 -0
  479. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/peppermint.toml +0 -0
  480. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/piatto-light.toml +0 -0
  481. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pnevma.toml +0 -0
  482. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/popping-and-locking.toml +0 -0
  483. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/primary.toml +0 -0
  484. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pro-light.toml +0 -0
  485. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/pro.toml +0 -0
  486. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/purple-rain.toml +0 -0
  487. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/purplepeter.toml +0 -0
  488. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rapture.toml +0 -0
  489. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/raycast-dark.toml +0 -0
  490. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/raycast-light.toml +0 -0
  491. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rebecca.toml +0 -0
  492. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/red-alert.toml +0 -0
  493. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/red-planet.toml +0 -0
  494. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/red-sands.toml +0 -0
  495. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/relaxed.toml +0 -0
  496. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/retro.toml +0 -0
  497. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rippedcasts.toml +0 -0
  498. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rose-pine-dawn.toml +0 -0
  499. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rose-pine-moon.toml +0 -0
  500. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rose-pine.toml +0 -0
  501. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/rouge-2.toml +0 -0
  502. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/royal.toml +0 -0
  503. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ryuuko.toml +0 -0
  504. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/sakura.toml +0 -0
  505. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/scarlet-protocol.toml +0 -0
  506. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/seafoam-pastel.toml +0 -0
  507. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/seashells.toml +0 -0
  508. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/seoulbones-dark.toml +0 -0
  509. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/seoulbones-light.toml +0 -0
  510. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/seti.toml +0 -0
  511. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/shades-of-purple.toml +0 -0
  512. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/shaman.toml +0 -0
  513. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/slate.toml +0 -0
  514. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/sleepyhollow.toml +0 -0
  515. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/smyck.toml +0 -0
  516. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/snazzy.toml +0 -0
  517. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/softserver.toml +0 -0
  518. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/solarized-darcula.toml +0 -0
  519. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/solarized-dark---patched.toml +0 -0
  520. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
  521. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spacedust.toml +0 -0
  522. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
  523. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spacegray-eighties.toml +0 -0
  524. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spacegray.toml +0 -0
  525. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spiderman.toml +0 -0
  526. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/spring.toml +0 -0
  527. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/square.toml +0 -0
  528. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/sublette.toml +0 -0
  529. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/subliminal.toml +0 -0
  530. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/sugarplum.toml +0 -0
  531. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/sundried.toml +0 -0
  532. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/symfonic.toml +0 -0
  533. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/synthwave-everything.toml +0 -0
  534. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/synthwave.toml +0 -0
  535. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/synthwavealpha.toml +0 -0
  536. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tango-adapted.toml +0 -0
  537. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tango-half-adapted.toml +0 -0
  538. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/teerb.toml +0 -0
  539. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/terafox.toml +0 -0
  540. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/terminal-basic.toml +0 -0
  541. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/thayer-bright.toml +0 -0
  542. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/the-hulk.toml +0 -0
  543. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tinacious-design-(dark).toml +0 -0
  544. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tinacious-design-(light).toml +0 -0
  545. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tokyonight-day.toml +0 -0
  546. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tokyonight-storm.toml +0 -0
  547. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tokyonight.toml +0 -0
  548. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow-night-blue.toml +0 -0
  549. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow-night-bright.toml +0 -0
  550. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow-night-burns.toml +0 -0
  551. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
  552. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow-night.toml +0 -0
  553. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/tomorrow.toml +0 -0
  554. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/toychest.toml +0 -0
  555. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/treehouse.toml +0 -0
  556. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/twilight.toml +0 -0
  557. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ubuntu.toml +0 -0
  558. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ultradark.toml +0 -0
  559. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/ultraviolent.toml +0 -0
  560. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/underthesea.toml +0 -0
  561. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/unikitty.toml +0 -0
  562. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/urple.toml +0 -0
  563. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/vaughn.toml +0 -0
  564. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/vesper.toml +0 -0
  565. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/vibrantink.toml +0 -0
  566. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/vimbones.toml +0 -0
  567. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/violet-dark.toml +0 -0
  568. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/violet-light.toml +0 -0
  569. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/warmneon.toml +0 -0
  570. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/wez.toml +0 -0
  571. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/whimsy.toml +0 -0
  572. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/wildcherry.toml +0 -0
  573. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/wilmersdorf.toml +0 -0
  574. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/wombat.toml +0 -0
  575. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/wryan.toml +0 -0
  576. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/xcodedark.toml +0 -0
  577. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/xcodedarkhc.toml +0 -0
  578. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/xcodelight.toml +0 -0
  579. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/xcodelighthc.toml +0 -0
  580. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/xcodewwdc.toml +0 -0
  581. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenbones-dark.toml +0 -0
  582. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenbones-light.toml +0 -0
  583. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenbones.toml +0 -0
  584. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenburn.toml +0 -0
  585. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenburned.toml +0 -0
  586. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenwritten-dark.toml +0 -0
  587. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/themes/zenwritten-light.toml +0 -0
  588. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/utilities.py +0 -0
  589. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/utility/output_utility_component.py +0 -0
  590. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/src/flock/visibility.py +0 -0
  591. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/conftest.py +0 -0
  592. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/contract/test_agent_payload_selection_contract.py +0 -0
  593. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/contract/test_artifact_storage_contract.py +0 -0
  594. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/contract/test_type_normalization_contract.py +0 -0
  595. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/e2e/README.md +0 -0
  596. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/e2e/TESTING_SUMMARY.md +0 -0
  597. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/e2e/test_critical_scenarios.py +0 -0
  598. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/integration/test_collector_orchestrator.py +0 -0
  599. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/integration/test_orchestrator_dashboard.py +0 -0
  600. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/integration/test_websocket_protocol.py +0 -0
  601. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_agent.py +0 -0
  602. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_agent_mcp.py +0 -0
  603. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_artifacts.py +0 -0
  604. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_cli.py +0 -0
  605. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_cli_helper.py +0 -0
  606. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_components.py +0 -0
  607. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dashboard_api.py +0 -0
  608. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dashboard_collector.py +0 -0
  609. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dashboard_launcher.py +0 -0
  610. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dashboard_service.py +0 -0
  611. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dspy_engine.py +0 -0
  612. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dspy_engine_mcp.py +0 -0
  613. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_dspy_streaming_events.py +0 -0
  614. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_engines.py +0 -0
  615. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_logging_config.py +0 -0
  616. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_client.py +0 -0
  617. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_config.py +0 -0
  618. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_coverage_summary.md +0 -0
  619. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_imports.py +0 -0
  620. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_manager.py +0 -0
  621. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_mcp_tool_handlers.py +0 -0
  622. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_orchestrator.py +0 -0
  623. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_orchestrator_mcp.py +0 -0
  624. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_registry.py +0 -0
  625. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_runtime.py +0 -0
  626. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_service.py +0 -0
  627. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_service_extended.py +0 -0
  628. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_store.py +0 -0
  629. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_subscription.py +0 -0
  630. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_telemetry.py +0 -0
  631. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_trace_clearing.py +0 -0
  632. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_unified_tracing.py +0 -0
  633. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_utilities.py +0 -0
  634. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_version_endpoint.py +0 -0
  635. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_visibility.py +0 -0
  636. {flock_core-0.5.0b56 → flock_core-0.5.0b57}/tests/test_websocket_manager.py +0 -0
@@ -0,0 +1,1390 @@
1
+ # AGENTS.md
2
+
3
+ **Welcome, AI coding agent!** 👋
4
+
5
+ This is Flock Flow, a production-grade blackboard-first AI agent orchestration framework. This guide gets you up to speed quickly on the current project state and development patterns.
6
+
7
+ **Current Version:** 0.1.16
8
+ **Architecture:** Hybrid Python/TypeScript with real-time dashboard
9
+ **Package Manager:** UV (NOT pip!)
10
+ **Status:** Production-ready with comprehensive monitoring
11
+
12
+ ---
13
+
14
+ ## 🎯 Project Snapshot
15
+
16
+ ### What Is Flock Flow?
17
+
18
+ A blackboard architecture framework where specialized AI agents collaborate through a shared typed workspace—no direct coupling, no rigid workflows, just emergent intelligence.
19
+
20
+ **Core Pattern:** Blackboard Architecture (like Hearsay-II from 1970s, but for modern LLMs)
21
+
22
+ **Key Differentiator:** The only framework treating blackboard orchestration as a first-class citizen with built-in visibility controls, real-time monitoring, and enterprise-grade safety features.
23
+
24
+ ### Architecture in 30 Seconds
25
+
26
+ ```
27
+ ┌─────────────────────────────────────────────┐
28
+ │ Blackboard (Typed Artifacts) │
29
+ │ ┌──────┐ → ┌──────┐ → ┌──────┐ → ┌──────┐│
30
+ │ │ Idea │ │Movie │ │Script│ │Review││
31
+ │ └──────┘ └──────┘ └──────┘ └──────┘│
32
+ └─────────────────────────────────────────────┘
33
+ ↑ ↑ ↑ ↑
34
+ Agent A Agent B Agent C Agent D
35
+ (produce) (consume (consume (consume
36
+ & produce) & produce) & produce)
37
+ ```
38
+
39
+ **Key Concepts:**
40
+ - **Artifacts:** Typed data (Pydantic models) published to blackboard
41
+ - **Subscriptions:** Declarative rules for when agents react
42
+ - **Visibility:** Built-in access control (Public/Private/Tenant/Label-based/Time-based)
43
+ - **Components:** Pluggable utilities (metrics, budgets, guards) + engines (DSPy, custom)
44
+ - **Real-time Dashboard:** React/TypeScript interface for live monitoring
45
+
46
+ ---
47
+
48
+ ## 🚀 Quick Setup
49
+
50
+ ### Prerequisites
51
+
52
+ - **Python 3.10+** (we use modern async features)
53
+ - **UV package manager** (faster than pip, handles virtual envs)
54
+ - **Node.js 22+** (for dashboard frontend)
55
+ - **OpenAI API key** (for running examples)
56
+
57
+ ### Installation
58
+
59
+ ```bash
60
+ # Clone repo
61
+ git clone https://github.com/yourusername/flock-flow.git
62
+ cd flock-flow
63
+
64
+ # Install Python dependencies (UV creates venv automatically)
65
+ poe install # Equivalent to: uv sync --dev --all-groups --all-extras
66
+
67
+ # Set up environment
68
+ export OPENAI_API_KEY="sk-..."
69
+ export DEFAULT_MODEL="openai/gpt-4o-mini"
70
+
71
+ # Verify installation
72
+ uv run python -c "from flock import Flock; print('✅ Ready!')"
73
+ ```
74
+
75
+ ### Run Examples
76
+
77
+ ```bash
78
+ # Showcase examples (workshops & demos)
79
+ uv run python examples/showcase/01_hello_flock.py
80
+ uv run python examples/showcase/02_blog_review.py
81
+ uv run python examples/showcase/04_dashboard.py
82
+
83
+ # Feature examples (with assertions)
84
+ uv run python examples/features/feedback_prevention.py
85
+ uv run python examples/features/visibility/public_visibility.py
86
+ ```
87
+
88
+ ---
89
+
90
+ ## 📚 Detailed Guides
91
+
92
+ For deep dives into specific topics, see:
93
+
94
+ - **[Architecture Guide](docs/ai-agents/architecture.md)** - Core architecture, project structure, code style
95
+ - **[Development Workflow](docs/ai-agents/development.md)** - Testing, quality standards, versioning, pre-commit hooks
96
+ - **[Frontend Guide](docs/ai-agents/frontend.md)** - Dashboard usage, frontend development, React/TypeScript
97
+ - **[Dependencies Guide](docs/ai-agents/dependencies.md)** - Package management, UV commands, adding dependencies
98
+ - **[Common Tasks](docs/ai-agents/common-tasks.md)** - Adding agents/components, performance tips, security
99
+
100
+ ---
101
+
102
+ ## 🚨 CRITICAL PATTERNS (Learn from Our Experience)
103
+
104
+ ### ⚡ invoke() vs run_until_idle() - The Double Execution Trap
105
+
106
+ **This pattern cost us hours of debugging - learn from our pain!**
107
+
108
+ #### The Problem
109
+ After API migration from `arun()` to `invoke()`, tests started executing component hooks **twice**:
110
+
111
+ ```python
112
+ # Expected: ['A', 'B', 'C']
113
+ # Actual: ['A', 'B', 'C', 'A', 'B', 'C'] # Double execution!
114
+ ```
115
+
116
+ #### Root Cause Analysis
117
+ `invoke()` method behavior depends on `publish_outputs` parameter:
118
+
119
+ ```python
120
+ # invoke() with default publish_outputs=True:
121
+ await orchestrator.invoke(agent, input_artifact)
122
+ await orchestrator.run_until_idle() # ❌ Triggers SECOND execution!
123
+
124
+ # invoke() with publish_outputs=False:
125
+ await orchestrator.invoke(agent, input_artifact, publish_outputs=False)
126
+ # ✅ No double execution - just direct agent execution
127
+ ```
128
+
129
+ **Why this happens:**
130
+ 1. `invoke(..., publish_outputs=True)` executes agent AND publishes results to blackboard
131
+ 2. `run_until_idle()` processes published artifacts, triggering agent execution again
132
+ 3. Component hooks fire on BOTH executions → double execution
133
+
134
+ #### When to Use Which Pattern
135
+
136
+ **✅ USE `publish_outputs=False` for:**
137
+ - Unit testing specific agent behavior
138
+ - Testing component hooks in isolation
139
+ - Direct execution without cascade
140
+ - Most test scenarios
141
+
142
+ ```python
143
+ # ✅ CORRECT: Test component execution order
144
+ await orchestrator.invoke(agent, input_artifact, publish_outputs=False)
145
+ assert component_order == ["A", "B", "C"]
146
+ ```
147
+
148
+ **✅ USE `publish_outputs=True` + `run_until_idle()` for:**
149
+ - Integration testing agent cascades
150
+ - Testing multi-agent workflows
151
+ - End-to-end scenario validation
152
+ - Event-driven behavior testing
153
+
154
+ ```python
155
+ # ✅ CORRECT: Test agent cascade
156
+ await orchestrator.invoke(agent_a, input_artifact, publish_outputs=True)
157
+ await orchestrator.run_until_idle() # Process agent_b, agent_c...
158
+ assert len(output_artifacts) == 3
159
+ ```
160
+
161
+ #### Quick Reference
162
+
163
+ | Scenario | invoke() call | run_until_idle() | Result |
164
+ |----------|---------------|------------------|---------|
165
+ | Unit test | `invoke(..., publish_outputs=False)` | No | ✅ Single execution |
166
+ | Integration test | `invoke(..., publish_outputs=True)` | Yes | ✅ Cascade execution |
167
+ | Bug we fixed | `invoke(..., publish_outputs=True)` | Yes | ❌ Double execution |
168
+
169
+ **Rule of thumb:** Start with `publish_outputs=False` for tests, only enable publication if you specifically need cascade behavior.
170
+
171
+ ---
172
+
173
+ ### ⚡ Batching Pattern: publish() + run_until_idle() Separation = Parallel Power
174
+
175
+ **Why `run_until_idle()` is separate from `publish()` - it's not a bug, it's a feature!**
176
+
177
+ #### Sequential vs Parallel Execution
178
+
179
+ **❌ If `run_until_idle()` was built into `publish()`:**
180
+ ```python
181
+ # Hypothetical auto-run design
182
+ await flock.publish(review1) # Publishes AND waits for completion
183
+ await flock.publish(review2) # Publishes AND waits for completion
184
+ await flock.publish(review3) # Publishes AND waits for completion
185
+
186
+ # Result: SEQUENTIAL processing (3x time)
187
+ ```
188
+
189
+ **✅ With current design (separated):**
190
+ ```python
191
+ # Queue up multiple artifacts
192
+ await flock.publish(review1) # Schedules agents
193
+ await flock.publish(review2) # Schedules agents
194
+ await flock.publish(review3) # Schedules agents
195
+
196
+ # Now trigger execution
197
+ await flock.run_until_idle() # All independent agents run in PARALLEL!
198
+
199
+ # Result: PARALLEL processing (~1x time if agents are independent)
200
+ ```
201
+
202
+ #### Best Practices
203
+
204
+ **✅ DO: Batch when possible**
205
+ ```python
206
+ # Good: Batch-publish customer reviews
207
+ for review in customer_reviews:
208
+ await flock.publish(review)
209
+ await flock.run_until_idle()
210
+ ```
211
+
212
+ **✅ DO: Use for multi-type workflows**
213
+ ```python
214
+ # Good: Publish different types, let agents run in parallel
215
+ await flock.publish(XRayImage(...))
216
+ await flock.publish(LabResults(...))
217
+ await flock.publish(PatientHistory(...))
218
+ await flock.run_until_idle() # Radiologist, lab_tech, historian run concurrently
219
+ ```
220
+
221
+ **⚠️ CAREFUL: Separate workflows with traced_run()**
222
+ ```python
223
+ # Better: Separate workflows explicitly
224
+ async with flock.traced_run("review_workflow"):
225
+ await flock.publish(review_workflow_input)
226
+ await flock.run_until_idle()
227
+
228
+ async with flock.traced_run("order_workflow"):
229
+ await flock.publish(order_workflow_input)
230
+ await flock.run_until_idle()
231
+ ```
232
+
233
+ #### Key Takeaway
234
+
235
+ The separation of `publish()` and `run_until_idle()` gives you **control over execution timing and batching**. This enables:
236
+ - ⚡ **Parallel execution** when agents are independent
237
+ - 🎛️ **Fine-grained control** over when execution happens
238
+ - 📊 **Better performance** for bulk operations
239
+ - 🔍 **Clearer workflow boundaries** with `traced_run()`
240
+
241
+ **This is not a bug or oversight - it's a fundamental design choice that enables patterns other frameworks can't easily support.**
242
+
243
+ ---
244
+
245
+ ### 🔒 Test Isolation and Mock Cleanup - The Contamination Trap
246
+
247
+ **We fixed 32 failing tests caused by test contamination - here's what we learned:**
248
+
249
+ #### The Problem
250
+ Tests were modifying class-level properties with PropertyMock that persisted across test boundaries:
251
+
252
+ ```python
253
+ # ❌ WRONG: Contaminates other tests
254
+ def test_something(orchestrator):
255
+ type(orchestrator).agents = PropertyMock(return_value=[mock_agent])
256
+ # No cleanup - mock persists!
257
+ ```
258
+
259
+ #### The Solution
260
+ Always use fixture cleanup with yield pattern:
261
+
262
+ ```python
263
+ # ✅ CORRECT: Proper cleanup
264
+ @pytest.fixture
265
+ def dashboard_service_with_mocks(orchestrator):
266
+ original_agents = getattr(type(orchestrator), "agents", None)
267
+ type(orchestrator).agents = PropertyMock(return_value=[mock_agent])
268
+ try:
269
+ yield service
270
+ finally:
271
+ # Restore original or delete if it didn't exist
272
+ if original_agents is not None:
273
+ type(orchestrator).agents = original_agents
274
+ elif hasattr(type(orchestrator), "agents"):
275
+ delattr(type(orchestrator), "agents")
276
+ ```
277
+
278
+ #### Best Practices for Test Isolation
279
+
280
+ 1. **Create Helper Functions for Complex Mocks**
281
+ 2. **Use Fixture Cleanup Pattern** (store original, try/finally, restore)
282
+ 3. **Test in Isolation First** (run files individually to check contamination)
283
+ 4. **Common Contamination Sources**: PropertyMock on class attributes, module-level patches, shared mutable state, async event loops, Rich/logging state pollution
284
+
285
+ ---
286
+
287
+ ### 📦 Version Bumping - Don't Break PyPI Releases!
288
+
289
+ **⚠️ CRITICAL FOR ALL CODE CHANGES:** Always increment version numbers when making changes that will be committed and pushed. Forgetting this breaks the PyPI publishing workflow!
290
+
291
+ #### Why This Matters
292
+
293
+ The automated PyPI release pipeline checks if the version in `pyproject.toml` has been incremented. If you push code changes without bumping the version:
294
+ - ❌ PyPI publish workflow fails
295
+ - ❌ Users can't get your fixes/features via `pip install`
296
+ - ❌ Other developers get confused about which version has which features
297
+
298
+ #### What to Bump
299
+
300
+ **Backend version (REQUIRED for ALL changes):**
301
+ ```toml
302
+ # pyproject.toml
303
+ [project]
304
+ version = "0.5.0b56" # Increment this! e.g., "0.5.0b57"
305
+ ```
306
+
307
+ **Frontend version (REQUIRED for dashboard/UI changes):**
308
+ ```json
309
+ // src/flock/frontend/package.json
310
+ {
311
+ "version": "0.1.2" // Increment this! e.g., "0.1.3"
312
+ }
313
+ ```
314
+
315
+ #### When to Bump
316
+
317
+ **✅ ALWAYS bump backend version for:**
318
+ - Any Python code changes in `src/flock/`
319
+ - Bug fixes, features, refactors
320
+ - Documentation changes (increment patch)
321
+ - Any commit that will be pushed to a branch
322
+
323
+ **✅ ALWAYS bump frontend version for:**
324
+ - Dashboard UI changes
325
+ - React/TypeScript component updates
326
+ - CSS/styling changes
327
+ - Any changes in `src/flock/frontend/src/`
328
+
329
+ #### Versioning Pattern
330
+
331
+ We use **semantic versioning with beta tags**:
332
+ - `0.5.0b56` → `0.5.0b57` for regular changes (increment beta number)
333
+ - `0.1.2` → `0.1.3` for frontend changes (increment patch)
334
+
335
+ #### How to Bump
336
+
337
+ ```bash
338
+ # 1. Make your code changes
339
+ # 2. Bump versions BEFORE committing
340
+ # Edit pyproject.toml: version = "0.5.0b57"
341
+ # Edit package.json: "version": "0.1.3"
342
+
343
+ # 3. Commit version bumps with your changes OR as separate commit
344
+ git add pyproject.toml src/flock/frontend/package.json
345
+ git commit -m "chore: bump version to 0.5.0b57"
346
+
347
+ # 4. Push (pre-commit hook will verify versions were bumped)
348
+ git push
349
+ ```
350
+
351
+ #### Pre-commit Hook Protection
352
+
353
+ The repository has a pre-commit hook that **checks if versions were bumped**. If you forget, it will warn you:
354
+
355
+ ```bash
356
+ check if version bump needed.............................................Failed
357
+ - hook id: version-check
358
+
359
+ ❌ No version changes detected in modified Python/frontend files
360
+ ```
361
+
362
+ #### Quick Checklist for PRs
363
+
364
+ Before creating a PR, verify:
365
+ - [ ] Backend version bumped in `pyproject.toml` (if any Python changes)
366
+ - [ ] Frontend version bumped in `package.json` (if any UI changes)
367
+ - [ ] Version bump committed (separate commit is fine)
368
+ - [ ] Pre-commit hooks pass
369
+ - [ ] **PR targets `0.5.0b` branch (NOT `main`!)** ⚠️
370
+
371
+ #### ⚠️ CRITICAL: PR Base Branch
372
+
373
+ **ALL pull requests MUST target the `0.5.0b` branch, NOT `main`!**
374
+
375
+ ```bash
376
+ # ✅ CORRECT: PR into 0.5.0b branch
377
+ gh pr create --base 0.5.0b --title "..." --body "..."
378
+
379
+ # ❌ WRONG: PR into main branch
380
+ gh pr create --base main --title "..." --body "..."
381
+ ```
382
+
383
+ **Why this matters:**
384
+ - The `0.5.0b` branch is the active development branch for the 0.5.0 beta release
385
+ - PRs into `main` bypass the beta testing process
386
+ - Features need to be validated in beta before reaching `main`
387
+
388
+ **If you accidentally create a PR against `main`:**
389
+ 1. Close the incorrect PR: `gh pr close <number>`
390
+ 2. Recreate against `0.5.0b`: `gh pr create --base 0.5.0b ...`
391
+
392
+ **Remember: It's better to increment versions too often than too rarely. Each meaningful change should get a version bump!**
393
+
394
+ ---
395
+
396
+ ## 🔍 Observability & Debugging with OpenTelemetry + DuckDB
397
+
398
+ Flock includes **production-grade distributed tracing** that captures every operation with full input/output data—enabling both human and AI-assisted debugging.
399
+
400
+ ---
401
+
402
+ ## 🤖 FOR AI AGENTS: Tracing is Your PRIMARY Debugging Tool
403
+
404
+ **⚠️ CRITICAL FOR AI AGENTS:** When debugging or testing Flock applications, **ALWAYS start with tracing**. The trace database contains the complete execution history with full input/output capture—this is your source of truth.
405
+
406
+ ### Why Tracing First?
407
+
408
+ **Traditional debugging (logs, print statements):**
409
+ - ❌ Requires code changes
410
+ - ❌ Missing context (what happened before/after)
411
+ - ❌ No timing information
412
+ - ❌ Incomplete input/output data
413
+
414
+ **Tracing-first debugging:**
415
+ - ✅ **Zero code changes** - just query the database
416
+ - ✅ **Complete execution history** - every operation captured
417
+ - ✅ **Full I/O data** - exact inputs that caused issues
418
+ - ✅ **Timing analysis** - identify bottlenecks instantly
419
+ - ✅ **Parent-child relationships** - understand call hierarchy
420
+ - ✅ **Correlation IDs** - track requests across agents
421
+
422
+ ### AI Agent Debugging Workflow (Step-by-Step)
423
+
424
+ **When a user reports an issue or asks you to debug/test:**
425
+
426
+ #### Step 1: Enable Tracing (if not already enabled)
427
+ ```bash
428
+ # Check if tracing is enabled
429
+ cat .env | grep FLOCK_AUTO_TRACE
430
+
431
+ # If not enabled, add to .env:
432
+ FLOCK_AUTO_TRACE=true
433
+ FLOCK_TRACE_FILE=true
434
+
435
+ # Or export temporarily:
436
+ export FLOCK_AUTO_TRACE=true FLOCK_TRACE_FILE=true
437
+ ```
438
+
439
+ #### Step 2: Run the Code to Capture Trace
440
+ ```bash
441
+ # Run the problematic script/test
442
+ uv run python examples/path/to/script.py
443
+
444
+ # Or run specific test
445
+ uv run pytest tests/test_file.py::test_name -v
446
+ ```
447
+
448
+ #### Step 3: Query Trace Database for Overview
449
+ ```python
450
+ import duckdb
451
+
452
+ conn = duckdb.connect('.flock/traces.duckdb', read_only=True)
453
+
454
+ # Get recent traces
455
+ traces = conn.execute("""
456
+ SELECT
457
+ trace_id,
458
+ COUNT(*) as span_count,
459
+ MIN(start_time) as trace_start,
460
+ (MAX(end_time) - MIN(start_time)) / 1000000.0 as total_duration_ms,
461
+ SUM(CASE WHEN status_code = 'ERROR' THEN 1 ELSE 0 END) as error_count
462
+ FROM spans
463
+ GROUP BY trace_id
464
+ ORDER BY trace_start DESC
465
+ LIMIT 10
466
+ """).fetchall()
467
+
468
+ for trace in traces:
469
+ print(f"Trace: {trace[0][:16]}... | Spans: {trace[1]} | Duration: {trace[3]:.2f}ms | Errors: {trace[4]}")
470
+ ```
471
+
472
+ #### Step 4: Analyze Specific Trace
473
+ ```python
474
+ # Get the most recent trace (or the one with errors)
475
+ latest_trace_id = traces[0][0]
476
+
477
+ # Get execution flow with hierarchy
478
+ flow = conn.execute("""
479
+ SELECT
480
+ span_id,
481
+ parent_id,
482
+ name,
483
+ service,
484
+ duration_ms,
485
+ status_code,
486
+ status_description,
487
+ json_extract(attributes, '$.correlation_id') as correlation_id
488
+ FROM spans
489
+ WHERE trace_id = ?
490
+ ORDER BY start_time ASC
491
+ """, [latest_trace_id]).fetchall()
492
+
493
+ # Print hierarchical execution
494
+ for span in flow:
495
+ indent = ' ' if span[1] else '' # Indent children
496
+ status_icon = '✅' if span[5] == 'OK' else '❌'
497
+ print(f"{status_icon} {indent}{span[2]} ({span[3]}) - {span[4]:.2f}ms")
498
+ if span[6]: # Error description
499
+ print(f" ERROR: {span[6]}")
500
+ ```
501
+
502
+ #### Step 5: Examine Input/Output Data
503
+ ```python
504
+ # Get input that caused an error
505
+ error_details = conn.execute("""
506
+ SELECT
507
+ name,
508
+ status_description,
509
+ json_extract(attributes, '$.input.artifacts') as input_artifacts,
510
+ json_extract(attributes, '$.output.value') as output_value,
511
+ attributes
512
+ FROM spans
513
+ WHERE trace_id = ?
514
+ AND status_code = 'ERROR'
515
+ """, [latest_trace_id]).fetchall()
516
+
517
+ # Inspect the exact input that caused failure
518
+ import json
519
+ for error in error_details:
520
+ print(f"\n❌ ERROR in {error[0]}")
521
+ print(f"Message: {error[1]}")
522
+ print(f"Input: {error[2]}")
523
+ print(f"Output: {error[3]}")
524
+ ```
525
+
526
+ #### Step 6: Identify Root Cause
527
+ ```python
528
+ # Common root cause queries:
529
+
530
+ # 1. Find the slowest operation in the trace
531
+ slowest = conn.execute("""
532
+ SELECT name, service, duration_ms
533
+ FROM spans
534
+ WHERE trace_id = ?
535
+ ORDER BY duration_ms DESC
536
+ LIMIT 1
537
+ """, [latest_trace_id]).fetchone()
538
+ print(f"Bottleneck: {slowest[0]} ({slowest[1]}) took {slowest[2]:.2f}ms")
539
+
540
+ # 2. Check if agent was triggered correctly
541
+ agent_triggers = conn.execute("""
542
+ SELECT
543
+ name,
544
+ json_extract(attributes, '$.input.artifacts') as consumed_artifacts
545
+ FROM spans
546
+ WHERE trace_id = ?
547
+ AND name LIKE 'Agent.execute'
548
+ """, [latest_trace_id]).fetchall()
549
+
550
+ # 3. Verify artifact types produced
551
+ artifacts_produced = conn.execute("""
552
+ SELECT DISTINCT
553
+ service as agent,
554
+ json_extract(attributes, '$.output.type') as artifact_type
555
+ FROM spans
556
+ WHERE trace_id = ?
557
+ AND attributes->>'output.type' IS NOT NULL
558
+ """, [latest_trace_id]).fetchall()
559
+ ```
560
+
561
+ #### Step 7: Report Findings & Fix
562
+ ```python
563
+ # Close connection
564
+ conn.close()
565
+
566
+ # Now you have:
567
+ # - Exact execution flow
568
+ # - Input data that caused the issue
569
+ # - Timing information (bottlenecks)
570
+ # - Error messages and stack traces
571
+ # - Artifact flow between agents
572
+
573
+ # Report to user with specific findings
574
+ print("""
575
+ DIAGNOSIS COMPLETE:
576
+
577
+ Issue: <describe the problem>
578
+ Root Cause: <specific operation/input that failed>
579
+ Evidence:
580
+ - Trace ID: {trace_id}
581
+ - Failed at: {operation_name}
582
+ - Input: {input_data}
583
+ - Duration: {duration}ms
584
+
585
+ Recommendation: <how to fix>
586
+ """)
587
+ ```
588
+
589
+ ### Essential Queries for AI Agents
590
+
591
+ **Keep these queries ready for common debugging tasks:**
592
+
593
+ #### 1. Find Most Recent Workflow Execution
594
+ ```python
595
+ latest_workflow = conn.execute("""
596
+ SELECT trace_id,
597
+ COUNT(*) as operations,
598
+ (MAX(end_time) - MIN(start_time)) / 1000000.0 as duration_ms
599
+ FROM spans
600
+ GROUP BY trace_id
601
+ ORDER BY MIN(start_time) DESC
602
+ LIMIT 1
603
+ """).fetchone()
604
+ ```
605
+
606
+ #### 2. Check Agent Lifecycle Execution
607
+ ```python
608
+ # Verify all lifecycle hooks fired correctly
609
+ lifecycle = conn.execute("""
610
+ SELECT name, duration_ms, status_code
611
+ FROM spans
612
+ WHERE trace_id = ?
613
+ AND service LIKE '%Component'
614
+ OR service LIKE '%Engine'
615
+ ORDER BY start_time ASC
616
+ """, [trace_id]).fetchall()
617
+
618
+ # Expected order: on_initialize → on_pre_consume → on_pre_evaluate →
619
+ # evaluate → on_post_evaluate → on_post_publish → on_terminate
620
+ ```
621
+
622
+ #### 3. Validate Artifact Flow
623
+ ```python
624
+ # Track artifact transformations
625
+ artifact_flow = conn.execute("""
626
+ SELECT
627
+ name,
628
+ service,
629
+ json_extract(attributes, '$.input.artifacts[0].type') as input_type,
630
+ json_extract(attributes, '$.output.type') as output_type
631
+ FROM spans
632
+ WHERE trace_id = ?
633
+ AND (attributes->>'input.artifacts' IS NOT NULL
634
+ OR attributes->>'output.type' IS NOT NULL)
635
+ ORDER BY start_time ASC
636
+ """, [trace_id]).fetchall()
637
+
638
+ # Verify expected transformations: InputType → Agent → OutputType
639
+ ```
640
+
641
+ #### 4. Detect Performance Issues
642
+ ```python
643
+ # Find operations that took >1 second
644
+ slow_ops = conn.execute("""
645
+ SELECT
646
+ name,
647
+ service,
648
+ duration_ms,
649
+ json_extract(attributes, '$.input.artifacts[0].payload') as input_payload
650
+ FROM spans
651
+ WHERE trace_id = ?
652
+ AND duration_ms > 1000
653
+ ORDER BY duration_ms DESC
654
+ """, [trace_id]).fetchall()
655
+
656
+ # Check if large payloads are causing slowness
657
+ for op in slow_ops:
658
+ if op[3]:
659
+ payload_size = len(str(op[3]))
660
+ print(f"{op[0]}: {op[2]:.0f}ms (payload: {payload_size} bytes)")
661
+ ```
662
+
663
+ #### 5. Debug Test Failures
664
+ ```python
665
+ # When a test fails, find what actually happened vs expected
666
+ test_execution = conn.execute("""
667
+ SELECT
668
+ name,
669
+ status_code,
670
+ status_description,
671
+ json_extract(attributes, '$.input.artifacts') as input,
672
+ json_extract(attributes, '$.output.value') as output
673
+ FROM spans
674
+ WHERE trace_id = ?
675
+ ORDER BY start_time ASC
676
+ """, [trace_id]).fetchall()
677
+
678
+ # Compare actual output with test expectations
679
+ ```
680
+
681
+ ### Common Debugging Scenarios for AI Agents
682
+
683
+ #### Scenario A: "Test is failing but I don't know why"
684
+ ```bash
685
+ # Step 1: Run test with tracing
686
+ FLOCK_AUTO_TRACE=true FLOCK_TRACE_FILE=true uv run pytest tests/test_file.py::test_name -v
687
+
688
+ # Step 2: Query for test execution
689
+ uv run python -c "
690
+ import duckdb
691
+ conn = duckdb.connect('.flock/traces.duckdb', read_only=True)
692
+
693
+ # Find most recent trace
694
+ trace = conn.execute('''
695
+ SELECT trace_id FROM spans
696
+ GROUP BY trace_id
697
+ ORDER BY MIN(start_time) DESC LIMIT 1
698
+ ''').fetchone()[0]
699
+
700
+ # Get all operations
701
+ ops = conn.execute('''
702
+ SELECT name, status_code, duration_ms
703
+ FROM spans WHERE trace_id = ?
704
+ ORDER BY start_time
705
+ ''', [trace]).fetchall()
706
+
707
+ for op in ops:
708
+ status = '✅' if op[1] == 'OK' else '❌'
709
+ print(f'{status} {op[0]}: {op[2]:.2f}ms')
710
+ "
711
+ ```
712
+
713
+ #### Scenario B: "Agent not producing expected output"
714
+ ```python
715
+ import duckdb
716
+ conn = duckdb.connect('.flock/traces.duckdb', read_only=True)
717
+
718
+ # Find what the agent actually produced
719
+ trace_id = '<latest_trace_id>'
720
+ output = conn.execute("""
721
+ SELECT
722
+ service as agent_name,
723
+ json_extract(attributes, '$.output.type') as output_type,
724
+ json_extract(attributes, '$.output.value') as output_value
725
+ FROM spans
726
+ WHERE trace_id = ?
727
+ AND name = 'Agent.execute'
728
+ """, [trace_id]).fetchone()
729
+
730
+ print(f"Agent: {output[0]}")
731
+ print(f"Output Type: {output[1]}")
732
+ print(f"Output Value: {output[2]}")
733
+
734
+ # Compare with expected output type in test
735
+ ```
736
+
737
+ #### Scenario C: "Agent not being triggered"
738
+ ```python
739
+ # Check if artifact was published and if agent subscribed
740
+ trace_id = '<latest_trace_id>'
741
+
742
+ published = conn.execute("""
743
+ SELECT json_extract(attributes, '$.output.type') as artifact_type
744
+ FROM spans
745
+ WHERE trace_id = ?
746
+ AND name = 'Flock.publish'
747
+ """, [trace_id]).fetchone()
748
+
749
+ print(f"Published artifact type: {published[0]}")
750
+
751
+ # Check if any agent consumed it
752
+ consumers = conn.execute("""
753
+ SELECT service, json_extract(attributes, '$.input.artifacts[0].type') as consumed_type
754
+ FROM spans
755
+ WHERE trace_id = ?
756
+ AND name = 'Agent.execute'
757
+ """, [trace_id]).fetchall()
758
+
759
+ if not consumers:
760
+ print("❌ No agents consumed this artifact!")
761
+ print("Check agent subscription rules (consumes clause)")
762
+ else:
763
+ for consumer in consumers:
764
+ print(f"✅ {consumer[0]} consumed {consumer[1]}")
765
+ ```
766
+
767
+ #### Scenario D: "Performance regression"
768
+ ```python
769
+ # Compare execution times across traces
770
+ import duckdb
771
+ conn = duckdb.connect('.flock/traces.duckdb', read_only=True)
772
+
773
+ # Get last 10 executions of same operation
774
+ perf_history = conn.execute("""
775
+ SELECT
776
+ trace_id,
777
+ start_time,
778
+ duration_ms
779
+ FROM spans
780
+ WHERE name = 'DSPyEngine.evaluate' -- or any operation
781
+ ORDER BY start_time DESC
782
+ LIMIT 10
783
+ """).fetchall()
784
+
785
+ # Calculate average and detect outliers
786
+ durations = [p[2] for p in perf_history]
787
+ avg = sum(durations) / len(durations)
788
+ latest = durations[0]
789
+
790
+ print(f"Latest: {latest:.2f}ms")
791
+ print(f"Average: {avg:.2f}ms")
792
+ print(f"Change: {((latest / avg - 1) * 100):+.1f}%")
793
+
794
+ if latest > avg * 1.5:
795
+ print("⚠️ Performance regression detected!")
796
+ ```
797
+
798
+ ### Best Practices for AI Agents
799
+
800
+ **✅ DO:**
801
+ - **Always enable tracing** before running code to debug
802
+ - **Start with overview queries** (get all traces, find latest)
803
+ - **Work from general to specific** (trace → spans → attributes → I/O)
804
+ - **Use read-only connections** (`read_only=True`)
805
+ - **Close connections** when done
806
+ - **Clear old traces** periodically: `Flock.clear_traces()`
807
+ - **Use correlation IDs** to track related operations
808
+
809
+ **❌ DON'T:**
810
+ - Don't modify code just to add logging - query traces instead
811
+ - Don't guess at execution flow - trace database has the truth
812
+ - Don't skip trace analysis for "obvious" bugs - verify with data
813
+ - Don't forget to check `status_description` for error details
814
+ - Don't ignore timing data - it reveals bottlenecks
815
+
816
+ ### Tracing-First Testing Workflow
817
+
818
+ When writing or debugging tests:
819
+
820
+ 1. **Run test with tracing enabled**
821
+ ```bash
822
+ FLOCK_AUTO_TRACE=true FLOCK_TRACE_FILE=true uv run pytest tests/test_file.py -v
823
+ ```
824
+
825
+ 2. **Query trace to see what actually happened**
826
+ ```python
827
+ # Get test execution trace
828
+ trace_id = conn.execute("SELECT trace_id FROM spans GROUP BY trace_id ORDER BY MIN(start_time) DESC LIMIT 1").fetchone()[0]
829
+ ```
830
+
831
+ 3. **Verify assertions match reality**
832
+ ```python
833
+ # What did the agent actually produce?
834
+ actual = conn.execute("SELECT json_extract(attributes, '$.output.value') FROM spans WHERE trace_id = ? AND name = 'Agent.execute'", [trace_id]).fetchone()
835
+
836
+ # Does it match test expectations?
837
+ expected = "BugDiagnosis artifact with severity='Critical'"
838
+ ```
839
+
840
+ 4. **Debug failures with exact I/O data**
841
+ ```python
842
+ # Get the exact input that caused test failure
843
+ failure_input = conn.execute("""
844
+ SELECT json_extract(attributes, '$.input.artifacts')
845
+ FROM spans WHERE trace_id = ? AND status_code = 'ERROR'
846
+ """, [trace_id]).fetchone()
847
+ ```
848
+
849
+ ### Quick Start: Enable Tracing
850
+
851
+ ```bash
852
+ # Enable auto-tracing (add to .env or export)
853
+ FLOCK_AUTO_TRACE=true # Enable tracing for all operations
854
+ FLOCK_TRACE_FILE=true # Store traces in DuckDB
855
+
856
+ # Run your application
857
+ python examples/showcase/01_declarative_pizza.py
858
+
859
+ # Traces stored in: .flock/traces.duckdb
860
+ ```
861
+
862
+ ### 🆕 Unified Tracing with traced_run()
863
+
864
+ **New in v0.5.0**: Wrap entire workflows in a single parent trace for better observability!
865
+
866
+ ```python
867
+ # ✅ Unified trace
868
+ async with flock.traced_run("pizza_workflow"):
869
+ await flock.publish(pizza_idea)
870
+ await flock.run_until_idle()
871
+ ```
872
+
873
+ **Result**: Single trace with proper hierarchy
874
+
875
+ ### 🗑️ Clearing Traces
876
+
877
+ Clear trace database for fresh debug sessions:
878
+
879
+ ```python
880
+ # Clear all traces
881
+ result = Flock.clear_traces()
882
+ print(f"Deleted {result['deleted_count']} spans")
883
+ ```
884
+
885
+ 📖 **Full tracing documentation**: [docs/UNIFIED_TRACING.md](docs/UNIFIED_TRACING.md)
886
+
887
+ ---
888
+
889
+ ## ❓ FAQ for AI Agents
890
+
891
+ ### Q: How do I debug or test Flock code?
892
+
893
+ **⚠️ ALWAYS START WITH TRACING!**
894
+
895
+ Quick debugging workflow:
896
+ ```bash
897
+ # 1. Enable tracing
898
+ export FLOCK_AUTO_TRACE=true FLOCK_TRACE_FILE=true
899
+
900
+ # 2. Run the code
901
+ uv run python examples/path/to/script.py
902
+
903
+ # 3. Query trace database
904
+ uv run python -c "
905
+ import duckdb
906
+ conn = duckdb.connect('.flock/traces.duckdb', read_only=True)
907
+
908
+ # Get latest trace
909
+ trace = conn.execute('''
910
+ SELECT trace_id, COUNT(*) as spans,
911
+ (MAX(end_time)-MIN(start_time))/1000000.0 as duration_ms
912
+ FROM spans GROUP BY trace_id
913
+ ORDER BY MIN(start_time) DESC LIMIT 1
914
+ ''').fetchone()
915
+
916
+ print(f'Trace: {trace[0][:32]}...')
917
+ print(f'Spans: {trace[1]}, Duration: {trace[2]:.2f}ms')
918
+
919
+ # Get execution flow
920
+ flow = conn.execute('''
921
+ SELECT name, duration_ms, status_code
922
+ FROM spans WHERE trace_id = ?
923
+ ORDER BY start_time
924
+ ''', [trace[0]]).fetchall()
925
+
926
+ for op in flow:
927
+ status = '✅' if op[2] == 'OK' else '❌'
928
+ print(f'{status} {op[0]}: {op[1]:.2f}ms')
929
+ "
930
+ ```
931
+
932
+ 📖 **Complete guide:** [🤖 FOR AI AGENTS: Tracing is Your PRIMARY Debugging Tool](#-for-ai-agents-tracing-is-your-primary-debugging-tool) (scroll up in this file)
933
+
934
+ ### Q: Where should I save new files?
935
+
936
+ **⚠️ CRITICAL: NEVER save files to the project root directory!**
937
+
938
+ Always use the appropriate subdirectory:
939
+ - **Tests**: `/tests` - All test files only
940
+ - **Source Code**: `/src/flock` - Production code only
941
+ - **Documentation**: `/docs` - Documentation only
942
+ - **Examples**: `/examples` - Example scripts only
943
+ - **Frontend**: `/frontend/src` - React components and frontend code
944
+
945
+ **Never create files in the root directory** - it should only contain configuration files like `pyproject.toml`, `README.md`, etc.
946
+
947
+ ### Q: How do I add a new dependency?
948
+
949
+ ```bash
950
+ # Python
951
+ uv add package-name
952
+
953
+ # Frontend
954
+ cd frontend && npm install package-name
955
+ ```
956
+
957
+ 📖 **Full guide:** [Dependencies Guide](docs/ai-agents/dependencies.md)
958
+
959
+ ### Q: How do I run a specific test?
960
+
961
+ ```bash
962
+ # Backend
963
+ uv run pytest tests/test_file.py::test_name -v
964
+
965
+ # Frontend
966
+ cd frontend && npm test -- test_name
967
+ ```
968
+
969
+ ### Q: How do I start the dashboard?
970
+
971
+ ```python
972
+ await orchestrator.serve(dashboard=True)
973
+ ```
974
+
975
+ 📖 **Full guide:** [Frontend Guide](docs/ai-agents/frontend.md)
976
+
977
+ ### Q: How do I test UI features and debug dashboard issues?
978
+
979
+ **Use playwright-mcp with dashboard examples for comprehensive manual UI testing.**
980
+
981
+ #### Step-by-Step Testing Workflow
982
+
983
+ **1. Start the Dashboard Example**
984
+ ```bash
985
+ # Run in background to keep testing
986
+ uv run python examples/03-the-dashboard/01_declarative_pizza.py
987
+ ```
988
+
989
+ Wait for these success indicators in the output:
990
+ - `[Dashboard] Production build completed`
991
+ - `INFO: Uvicorn running on http://127.0.0.1:8000`
992
+ - `[Dashboard] Browser launched successfully`
993
+
994
+ **2. Navigate and Verify Initial Load**
995
+ ```python
996
+ # Use playwright-mcp tools
997
+ mcp__playwright__browser_navigate(url="http://localhost:8000")
998
+ ```
999
+
1000
+ **✅ What to verify:**
1001
+ - Page title: "🦆🐓 Flock 🐤🐧"
1002
+ - WebSocket status (top right): **"Connected"** (green)
1003
+ - Two view buttons: "Agent View" (active) and "Blackboard View"
1004
+ - Control buttons: Publish, Agent Details, Filters, Settings
1005
+
1006
+ **3. Test Agent View**
1007
+
1008
+ Take a snapshot to see the agent graph:
1009
+ ```python
1010
+ mcp__playwright__browser_snapshot()
1011
+ ```
1012
+
1013
+ **✅ What to verify in Agent View:**
1014
+ - Agent nodes displayed (e.g., `pizza_master`)
1015
+ - Each node shows:
1016
+ - Agent name and status (should be "idle" initially)
1017
+ - Input types with count (e.g., ↓ 0 __main__.MyDreamPizza)
1018
+ - Output types with count (e.g., ↑ 0 __main__.Pizza)
1019
+ - React Flow controls (zoom in/out, fit view, mini-map)
1020
+
1021
+ **4. Open Agent Details Panel**
1022
+ ```python
1023
+ # Click the Agent Details button
1024
+ mcp__playwright__browser_click(element="Agent Details button", ref="<ref>")
1025
+ ```
1026
+
1027
+ **✅ What to verify:**
1028
+ - Panel opens showing agent name
1029
+ - Three tabs: "Live Output", "Message History", "Run Status"
1030
+ - Shows "Idle - no output" initially
1031
+
1032
+ **5. Test Publishing an Artifact**
1033
+
1034
+ ```python
1035
+ # Step 1: Select artifact type
1036
+ mcp__playwright__browser_select_option(
1037
+ element="Artifact Type dropdown",
1038
+ ref="<ref>",
1039
+ values=["__main__.MyDreamPizza"]
1040
+ )
1041
+ ```
1042
+
1043
+ **✅ What to verify after selecting type:**
1044
+ - Form dynamically generates input fields based on artifact schema
1045
+ - For MyDreamPizza: Should show "Pizza Idea" textbox
1046
+
1047
+ ```python
1048
+ # Step 2: Fill in the input
1049
+ mcp__playwright__browser_type(
1050
+ element="Pizza Idea textbox",
1051
+ ref="<ref>",
1052
+ text="a spicy Hawaiian pizza with jalapeños and pineapple"
1053
+ )
1054
+
1055
+ # Step 3: Publish
1056
+ mcp__playwright__browser_click(
1057
+ element="Publish Artifact button",
1058
+ ref="<ref>"
1059
+ )
1060
+ ```
1061
+
1062
+ **✅ What to verify after publishing:**
1063
+ - Agent status changes: "idle" → "running" → "idle"
1064
+ - Input count increases: ↓ 0 → ↓ 1
1065
+ - Output count increases: ↑ 0 → ↑ 1
1066
+ - **External node appears** on the graph (shows who published the artifact)
1067
+ - Edge connects external → pizza_master
1068
+
1069
+ **6. Monitor Live Execution**
1070
+
1071
+ **✅ What to verify in Agent Details panel:**
1072
+ - Event counter increases (e.g., "316 events")
1073
+ - Live streaming output appears token-by-token
1074
+ - Console shows WebSocket messages: `[WebSocket] Streaming output: {...}`
1075
+ - Final output shows complete structured data
1076
+ - "--- End of output ---" marker when complete
1077
+
1078
+ **7. Test Blackboard View**
1079
+ ```python
1080
+ # Switch to Blackboard View
1081
+ mcp__playwright__browser_click(
1082
+ element="Blackboard View button",
1083
+ ref="<ref>"
1084
+ )
1085
+ ```
1086
+
1087
+ **✅ What to verify in Blackboard View:**
1088
+ - **Input artifact node** showing:
1089
+ - Type: `__main__.MyDreamPizza`
1090
+ - Producer: "by: external"
1091
+ - Timestamp
1092
+ - Full JSON payload (expandable)
1093
+ - **Output artifact node** showing:
1094
+ - Type: `__main__.Pizza`
1095
+ - Producer: "by: pizza_master"
1096
+ - Timestamp
1097
+ - Complete structured data with all fields
1098
+ - **Edge** connecting input → output artifacts
1099
+ - Data is fully browsable (can expand/collapse nested objects)
1100
+
1101
+ **8. Take Screenshots for Verification**
1102
+ ```python
1103
+ # Capture key states for visual verification
1104
+ mcp__playwright__browser_take_screenshot(filename="dashboard-test.png")
1105
+ ```
1106
+
1107
+ #### Common Issues and Troubleshooting
1108
+
1109
+ **Issue: Dashboard doesn't load**
1110
+ - Check: Backend server started? Look for "Uvicorn running" message
1111
+ - Check: Frontend build completed? Look for "Production build completed"
1112
+ - Solution: Wait 5-10 seconds after starting for build to complete
1113
+
1114
+ **Issue: WebSocket shows "Disconnected"**
1115
+ - Check: Console for WebSocket errors
1116
+ - Check: Server logs for WebSocket connection messages
1117
+ - Solution: Refresh page, verify server is running
1118
+
1119
+ **Issue: No live output during agent execution**
1120
+ - Check: Agent Details panel is open
1121
+ - Check: "Live Output" tab is active
1122
+ - Check: Console shows `[WebSocket] Streaming output` messages
1123
+ - Solution: Verify WebSocket connection status
1124
+
1125
+ **Issue: Artifacts not appearing in Blackboard View**
1126
+ - Check: Did agent execution complete? (status back to "idle")
1127
+ - Check: Output count increased? (↑ 1)
1128
+ - Solution: Switch back to Agent View to verify execution, then return to Blackboard View
1129
+
1130
+ #### Why Manual Testing with Playwright-MCP?
1131
+
1132
+ - ✅ **Live testing** - Real dashboard with actual agents executing
1133
+ - ✅ **Visual verification** - See exactly what users see
1134
+ - ✅ **WebSocket testing** - Verify real-time streaming works correctly
1135
+ - ✅ **Full workflow** - Test complete user journey from publish → execute → view results
1136
+ - ✅ **Screenshot capture** - Document UI state for debugging/documentation
1137
+ - ✅ **Interactive debugging** - Click, type, inspect like a real user
1138
+
1139
+ 📖 **Dashboard examples:** [`examples/03-the-dashboard/`](examples/03-the-dashboard/)
1140
+
1141
+ ---
1142
+
1143
+ #### Advanced Dashboard Testing: Multi-Agent Cascades & Conditional Consumption
1144
+
1145
+ **Test with:** `examples/03-the-dashboard/02-dashboard-edge-cases.py`
1146
+
1147
+ This example demonstrates advanced features not visible in simple single-agent workflows.
1148
+
1149
+ **1. Use Auto Layout for Complex Graphs**
1150
+
1151
+ When testing with 3+ agents, use the context menu to organize the graph:
1152
+
1153
+ ```python
1154
+ # After navigating to dashboard
1155
+ # Right-click on the canvas (not on a node)
1156
+ mcp__playwright__browser_click(element="Canvas area", ref="<ref>", button="right")
1157
+
1158
+ # Click Auto Layout from context menu
1159
+ mcp__playwright__browser_click(element="Auto Layout button", ref="<ref>")
1160
+ ```
1161
+
1162
+ **✅ What to verify:**
1163
+ - Agents arranged in clean vertical or horizontal hierarchy
1164
+ - No overlapping nodes
1165
+ - Edges clearly visible between agents
1166
+
1167
+ **2. Test Conditional Consumption (Lambda Filters)**
1168
+
1169
+ This example has agents with `where` clauses that filter which artifacts they consume:
1170
+
1171
+ ```python
1172
+ # In the code:
1173
+ chapter_agent.consumes(Review, where=lambda r: r.score >= 9) # Only high scores
1174
+ book_idea_agent.consumes(Review, where=lambda r: r.score <= 8) # Only low scores (feedback loop)
1175
+ ```
1176
+
1177
+ **✅ What to verify after publishing Idea:**
1178
+ - **Edge labels show filtered counts**: e.g., `__main__.Review(1)` means "1 Review consumed out of 3 total"
1179
+ - **Input counts reflect actual consumption**: chapter_agent shows ↓ 1 Review (not ↓ 3)
1180
+ - **Feedback loops work**: book_idea_agent consumes both Idea AND Review artifacts
1181
+
1182
+ **3. Monitor Multi-Agent Cascade Execution**
1183
+
1184
+ Expected workflow for edge cases example:
1185
+ ```
1186
+ 1. Publish Idea artifact
1187
+ 2. book_idea_agent: ↓ 1 Idea → ↑ 3 BookHook (produces multiple outputs!)
1188
+ 3. reviewer_agent: ↓ 3 BookHook → ↑ 3 Review (processes each hook)
1189
+ 4. chapter_agent: ↓ 1 Review → ↑ 1 BookOutline (filtered: only score >= 9)
1190
+ 5. book_idea_agent: ↓ 2 Review → ↑ 0 BookHook (feedback loop for low scores)
1191
+ ```
1192
+
1193
+ **✅ What to verify during cascade:**
1194
+ - Agent statuses transition: idle → running → idle
1195
+ - Counters update in real-time as each agent completes
1196
+ - External node persists showing initial publisher
1197
+ - Edges appear/update showing data flow
1198
+
1199
+ **4. Handle Large Artifact Counts**
1200
+
1201
+ **⚠️ IMPORTANT**: When page has 8+ artifacts, `browser_snapshot()` exceeds 25K token limit and fails.
1202
+
1203
+ **Solution**: Use `browser_take_screenshot()` for visual verification instead:
1204
+
1205
+ ```python
1206
+ # ❌ This will fail with many artifacts
1207
+ mcp__playwright__browser_snapshot()
1208
+
1209
+ # ✅ Use screenshots instead
1210
+ mcp__playwright__browser_take_screenshot(filename="cascade-state.png")
1211
+ ```
1212
+
1213
+ **5. Verify Final State in Blackboard View**
1214
+
1215
+ ```python
1216
+ # Switch to Blackboard View
1217
+ mcp__playwright__browser_click(element="Blackboard View button", ref="<ref>")
1218
+
1219
+ # Take screenshot (snapshot will fail with many artifacts)
1220
+ mcp__playwright__browser_take_screenshot(filename="blackboard-artifacts.png")
1221
+ ```
1222
+
1223
+ **✅ What to verify:**
1224
+ - All produced artifacts visible as nodes
1225
+ - **1 Idea** → **3 BookHooks** → **3 Reviews** → **1 BookOutline**
1226
+ - Edges show complete transformation chain
1227
+ - Final artifact (BookOutline) contains expected structured data
1228
+ - Timestamps show execution order
1229
+
1230
+ #### Expected Execution Time
1231
+
1232
+ **Simple example (01_declarative_pizza.py)**: ~5 seconds (1 agent, 1 artifact)
1233
+ **Edge cases (02-dashboard-edge-cases.py)**: ~60 seconds (3 agents, 8 artifacts, feedback loop)
1234
+
1235
+ Plan your testing time accordingly!
1236
+
1237
+ #### Key Dashboard Features Learned
1238
+
1239
+ **Auto Layout** ⭐
1240
+ - Access via right-click context menu
1241
+ - Automatically organizes complex agent graphs
1242
+ - Essential for 3+ agent workflows
1243
+
1244
+ **Filtered Edge Labels** ⭐
1245
+ - Shows actual consumed count vs total available
1246
+ - Format: `ArtifactType(consumed_count)`
1247
+ - Makes conditional consumption transparent
1248
+
1249
+ **Feedback Loops** ⭐
1250
+ - Agents can consume multiple artifact types
1251
+ - Low-scoring Reviews loop back to book_idea_agent
1252
+ - Counts accumulate correctly across iterations
1253
+
1254
+ **Real-time Updates** ⭐
1255
+ - Status changes: idle → running → idle
1256
+ - Counters increment as artifacts produced/consumed
1257
+ - WebSocket delivers updates without page refresh
1258
+
1259
+ 📖 **Dashboard examples:** [`examples/03-the-dashboard/`](examples/03-the-dashboard/)
1260
+
1261
+ ---
1262
+
1263
+ ### Q: How do I use unified tracing?
1264
+
1265
+ ```python
1266
+ # Wrap workflows in a single trace
1267
+ async with flock.traced_run("workflow_name"):
1268
+ await flock.publish(data)
1269
+ await flock.run_until_idle()
1270
+
1271
+ # Clear traces for fresh debug session
1272
+ result = Flock.clear_traces()
1273
+ ```
1274
+
1275
+ 📖 **Full guide:** [docs/UNIFIED_TRACING.md](docs/UNIFIED_TRACING.md)
1276
+
1277
+ ### Q: Where should I add new tests?
1278
+
1279
+ Add to existing test file if relevant, or create new file following naming convention `test_<module>.py` for backend, `<name>.test.tsx` for frontend.
1280
+
1281
+ ### Q: What Python version features can I use?
1282
+
1283
+ Python 3.10+, so you can use:
1284
+ - `match`/`case` statements
1285
+ - `TaskGroup` for parallel execution
1286
+ - Improved type hints (`list[str]` not `List[str]`)
1287
+
1288
+ ### Q: How do I debug WebSocket issues?
1289
+
1290
+ Check browser console for WebSocket logs, use Network tab to inspect connection, and verify backend WebSocket server is running on correct port.
1291
+
1292
+ ---
1293
+
1294
+ ## 🎯 Quick Reference
1295
+
1296
+ ### Essential Commands
1297
+
1298
+ ```bash
1299
+ # Setup
1300
+ poe install # Install all dependencies
1301
+
1302
+ # Development
1303
+ poe build # Build project
1304
+ poe lint # Lint code
1305
+ poe format # Format code
1306
+
1307
+ # Testing
1308
+ poe test # Run tests
1309
+ poe test-cov # Run with coverage
1310
+ poe test-critical # Run critical path tests
1311
+
1312
+ # Frontend
1313
+ cd frontend
1314
+ npm run dev # Start dev server
1315
+ npm test # Run frontend tests
1316
+ npm run build # Build for production
1317
+
1318
+ # UI Testing (with playwright-mcp)
1319
+ uv run python examples/03-the-dashboard/01_declarative_pizza.py # Start dashboard
1320
+ # Then use playwright-mcp to interact with UI for manual testing
1321
+ ```
1322
+
1323
+ ### Code Snippets
1324
+
1325
+ **Create orchestrator:**
1326
+ ```python
1327
+ from flock.orchestrator import Flock
1328
+ orchestrator = Flock("openai/gpt-4o")
1329
+ ```
1330
+
1331
+ **Define agent:**
1332
+ ```python
1333
+ agent = (
1334
+ orchestrator.agent("name")
1335
+ .description("What it does")
1336
+ .consumes(InputType)
1337
+ .publishes(OutputType)
1338
+ )
1339
+ ```
1340
+
1341
+ **Run agent:**
1342
+ ```python
1343
+ await orchestrator.arun(agent, input_data)
1344
+ ```
1345
+
1346
+ **Unified tracing:**
1347
+ ```python
1348
+ # Wrap workflow in single trace
1349
+ async with flock.traced_run("workflow_name"):
1350
+ await flock.publish(data)
1351
+ await flock.run_until_idle()
1352
+
1353
+ # Clear traces
1354
+ Flock.clear_traces()
1355
+ ```
1356
+
1357
+ **Start dashboard:**
1358
+ ```python
1359
+ await orchestrator.serve(dashboard=True)
1360
+ ```
1361
+
1362
+ ---
1363
+
1364
+ ## 📞 Getting Help
1365
+
1366
+ ### Documentation
1367
+
1368
+ **AI Agent Guides (this repo):**
1369
+ - **[Architecture Guide](docs/ai-agents/architecture.md)** - Core architecture, project structure, code style
1370
+ - **[Development Workflow](docs/ai-agents/development.md)** - Testing, quality standards, versioning
1371
+ - **[Frontend Guide](docs/ai-agents/frontend.md)** - Dashboard usage, frontend development
1372
+ - **[Dependencies Guide](docs/ai-agents/dependencies.md)** - Package management, UV commands
1373
+ - **[Common Tasks](docs/ai-agents/common-tasks.md)** - Adding agents/components, performance
1374
+
1375
+ **Additional Documentation:**
1376
+ - **Contributing Guide:** [`CONTRIBUTING.md`](CONTRIBUTING.md) - Complete contribution workflow
1377
+ - **Versioning Guide:** [`docs/VERSIONING.md`](docs/VERSIONING.md) - Smart version bumping
1378
+ - **Pre-commit Hooks:** [`docs/PRE_COMMIT_HOOKS.md`](docs/PRE_COMMIT_HOOKS.md) - Quality automation
1379
+ - **Unified Tracing:** [`docs/UNIFIED_TRACING.md`](docs/UNIFIED_TRACING.md) - Workflow tracing & trace management
1380
+ - **Examples:** [`examples/`](examples/) - Working code examples
1381
+ - **Analysis Documents:** [`docs/patterns/`](docs/patterns/)
1382
+
1383
+ ---
1384
+
1385
+ **Welcome to the team! Let's build the future of AI agent orchestration together.** 🚀
1386
+
1387
+ ---
1388
+
1389
+ *Last updated: October 8, 2025*
1390
+ *This file follows the modern AGENTS.md format for AI coding agents.*