flock-core 0.2.1__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

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