flock-core 0.4.511__tar.gz → 0.4.512__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 (664) hide show
  1. {flock_core-0.4.511 → flock_core-0.4.512}/PKG-INFO +3 -1
  2. {flock_core-0.4.511 → flock_core-0.4.512}/pyproject.toml +3 -1
  3. flock_core-0.4.512/src/flock/core/config/flock_agent_config.py +11 -0
  4. flock_core-0.4.512/src/flock/core/config/scheduled_agent_config.py +40 -0
  5. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_agent.py +6 -0
  6. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_factory.py +44 -0
  7. flock_core-0.4.512/src/flock/core/flock_scheduler.py +166 -0
  8. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/main.py +66 -11
  9. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/services/sharing_store.py +173 -0
  10. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/run.py +3 -1
  11. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/base.html +10 -11
  12. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/chat.html +7 -10
  13. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/chat_settings.html +3 -4
  14. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/flock_editor.html +1 -2
  15. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/index.html +1 -1
  16. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_agent_detail_form.html +7 -13
  17. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_agent_list.html +1 -2
  18. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_agent_manager_view.html +2 -3
  19. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_chat_container.html +2 -2
  20. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_chat_settings_form.html +6 -8
  21. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_create_flock_form.html +2 -4
  22. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_dashboard_flock_detail.html +2 -3
  23. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_dashboard_flock_file_list.html +1 -2
  24. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +2 -3
  25. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_dashboard_upload_flock_form.html +1 -2
  26. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_env_vars_table.html +2 -4
  27. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_execution_form.html +12 -10
  28. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_execution_view_container.html +2 -3
  29. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_flock_file_list.html +2 -3
  30. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_flock_properties_form.html +2 -2
  31. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_flock_upload_form.html +1 -2
  32. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_load_manager_view.html +2 -3
  33. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_registry_viewer_content.html +4 -5
  34. flock_core-0.4.512/src/flock/webapp/templates/partials/_settings_env_content.html +9 -0
  35. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_settings_theme_content.html +2 -2
  36. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_settings_view.html +2 -2
  37. flock_core-0.4.512/src/flock/webapp/templates/partials/_sidebar.html +74 -0
  38. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/registry_viewer.html +7 -10
  39. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/shared_run_page.html +7 -10
  40. flock_core-0.4.512/test_store_integration.py +107 -0
  41. flock_core-0.4.512/tests/integration/__init__.py +1 -0
  42. flock_core-0.4.512/tests/integration/test_shared_link_store.py +257 -0
  43. {flock_core-0.4.511 → flock_core-0.4.512}/uv.lock +3513 -3481
  44. flock_core-0.4.511/src/flock/webapp/templates/partials/_settings_env_content.html +0 -10
  45. flock_core-0.4.511/src/flock/webapp/templates/partials/_sidebar.html +0 -86
  46. {flock_core-0.4.511 → flock_core-0.4.512}/.devcontainer/devcontainer.json +0 -0
  47. {flock_core-0.4.511 → flock_core-0.4.512}/.env_template +0 -0
  48. {flock_core-0.4.511 → flock_core-0.4.512}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  49. {flock_core-0.4.511 → flock_core-0.4.512}/.github/ISSUE_TEMPLATE/documentation_improvement.yaml +0 -0
  50. {flock_core-0.4.511 → flock_core-0.4.512}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  51. {flock_core-0.4.511 → flock_core-0.4.512}/.github/ISSUE_TEMPLATE/question_support_request.yaml +0 -0
  52. {flock_core-0.4.511 → flock_core-0.4.512}/.github/ISSUE_TEMPLATE/vulnerability_report.md +0 -0
  53. {flock_core-0.4.511 → flock_core-0.4.512}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  54. {flock_core-0.4.511 → flock_core-0.4.512}/.github/workflows/.gitkeep +0 -0
  55. {flock_core-0.4.511 → flock_core-0.4.512}/.github/workflows/deploy-documentation.yml +0 -0
  56. {flock_core-0.4.511 → flock_core-0.4.512}/.github/workflows/deploy-whiteduck-pypi.yml +0 -0
  57. {flock_core-0.4.511 → flock_core-0.4.512}/.gitignore +0 -0
  58. {flock_core-0.4.511 → flock_core-0.4.512}/.gitmodules +0 -0
  59. {flock_core-0.4.511 → flock_core-0.4.512}/.vscode/launch.json +0 -0
  60. {flock_core-0.4.511 → flock_core-0.4.512}/.vscode/settings.json +0 -0
  61. {flock_core-0.4.511 → flock_core-0.4.512}/.vscode/tasks.json +0 -0
  62. {flock_core-0.4.511 → flock_core-0.4.512}/CODE_OF_CONDUCT.md +0 -0
  63. {flock_core-0.4.511 → flock_core-0.4.512}/CONTRIBUTING.md +0 -0
  64. {flock_core-0.4.511 → flock_core-0.4.512}/LICENSE +0 -0
  65. {flock_core-0.4.511 → flock_core-0.4.512}/README.md +0 -0
  66. {flock_core-0.4.511 → flock_core-0.4.512}/SECURITY.md +0 -0
  67. {flock_core-0.4.511 → flock_core-0.4.512}/docs/about/changelog.md +0 -0
  68. {flock_core-0.4.511 → flock_core-0.4.512}/docs/about/contributing.md +0 -0
  69. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/drawio/architecture.drawio +0 -0
  70. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/cli_outputs/out.png +0 -0
  71. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/components_chart.png +0 -0
  72. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_01.png +0 -0
  73. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_02.png +0 -0
  74. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_03.png +0 -0
  75. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_04.png +0 -0
  76. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_05.png +0 -0
  77. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/examples/01_06.png +0 -0
  78. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/flock.png +0 -0
  79. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/flock_cli.png +0 -0
  80. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/flow_chart.png +0 -0
  81. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/getting-started/first_agent_00.png +0 -0
  82. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/hummingbird.png +0 -0
  83. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/icon.png +0 -0
  84. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/icon.png~ +0 -0
  85. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/logo.png +0 -0
  86. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/magpie.png +0 -0
  87. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/memory_concepts.png +0 -0
  88. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/memory_flow.png +0 -0
  89. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/memory_flow_chart.png +0 -0
  90. {flock_core-0.4.511 → flock_core-0.4.512}/docs/assets/images/readme_output.png +0 -0
  91. {flock_core-0.4.511 → flock_core-0.4.512}/docs/components/evaluators.md +0 -0
  92. {flock_core-0.4.511 → flock_core-0.4.512}/docs/components/index.md +0 -0
  93. {flock_core-0.4.511 → flock_core-0.4.512}/docs/components/modules.md +0 -0
  94. {flock_core-0.4.511 → flock_core-0.4.512}/docs/components/tools.md +0 -0
  95. {flock_core-0.4.511 → flock_core-0.4.512}/docs/core-concepts/agents.md +0 -0
  96. {flock_core-0.4.511 → flock_core-0.4.512}/docs/core-concepts/declarative.md +0 -0
  97. {flock_core-0.4.511 → flock_core-0.4.512}/docs/core-concepts/di.md +0 -0
  98. {flock_core-0.4.511 → flock_core-0.4.512}/docs/core-concepts/index.md +0 -0
  99. {flock_core-0.4.511 → flock_core-0.4.512}/docs/core-concepts/workflows.md +0 -0
  100. {flock_core-0.4.511 → flock_core-0.4.512}/docs/create_doc_boilerplate.py +0 -0
  101. {flock_core-0.4.511 → flock_core-0.4.512}/docs/deployment/index.md +0 -0
  102. {flock_core-0.4.511 → flock_core-0.4.512}/docs/deployment/temporal.md +0 -0
  103. {flock_core-0.4.511 → flock_core-0.4.512}/docs/getting-started/concepts.md +0 -0
  104. {flock_core-0.4.511 → flock_core-0.4.512}/docs/getting-started/configuration.md +0 -0
  105. {flock_core-0.4.511 → flock_core-0.4.512}/docs/getting-started/index.md +0 -0
  106. {flock_core-0.4.511 → flock_core-0.4.512}/docs/getting-started/installation.md +0 -0
  107. {flock_core-0.4.511 → flock_core-0.4.512}/docs/getting-started/quickstart.md +0 -0
  108. {flock_core-0.4.511 → flock_core-0.4.512}/docs/guides/chaining-agents.md +0 -0
  109. {flock_core-0.4.511 → flock_core-0.4.512}/docs/guides/custom-endpoints.md +0 -0
  110. {flock_core-0.4.511 → flock_core-0.4.512}/docs/guides/index.md +0 -0
  111. {flock_core-0.4.511 → flock_core-0.4.512}/docs/guides/temporal-configuration.md +0 -0
  112. {flock_core-0.4.511 → flock_core-0.4.512}/docs/index.md +0 -0
  113. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/cli-tool.md +0 -0
  114. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/index.md +0 -0
  115. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/interactive-cli.md +0 -0
  116. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/programmatic.md +0 -0
  117. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/rest-api.md +0 -0
  118. {flock_core-0.4.511 → flock_core-0.4.512}/docs/interacting-with-flock/web-ui.md +0 -0
  119. {flock_core-0.4.511 → flock_core-0.4.512}/docs/reference/flock_agent.md +0 -0
  120. {flock_core-0.4.511 → flock_core-0.4.512}/docs/reference/index.md +0 -0
  121. {flock_core-0.4.511 → flock_core-0.4.512}/docs/release-notes/magpie.md +0 -0
  122. {flock_core-0.4.511 → flock_core-0.4.512}/docs/stylesheets/extra.css +0 -0
  123. {flock_core-0.4.511 → flock_core-0.4.512}/docs/wd-di.md +0 -0
  124. {flock_core-0.4.511 → flock_core-0.4.512}/mkdocs.yml +0 -0
  125. {flock_core-0.4.511 → flock_core-0.4.512}/requirements.txt +0 -0
  126. {flock_core-0.4.511 → flock_core-0.4.512}/scripts/code_collector.py +0 -0
  127. {flock_core-0.4.511 → flock_core-0.4.512}/scripts/create_docs.py +0 -0
  128. {flock_core-0.4.511 → flock_core-0.4.512}/scripts/ensure_uv.py +0 -0
  129. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/__init__.py +0 -0
  130. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/__init__.py +0 -0
  131. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/azure_adapter.py +0 -0
  132. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/chroma_adapter.py +0 -0
  133. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/faiss_adapter.py +0 -0
  134. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/pinecone_adapter.py +0 -0
  135. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/adapter/vector_base.py +0 -0
  136. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/assets/release_notes.md +0 -0
  137. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/config.py +0 -0
  138. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/constants.py +0 -0
  139. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/create_agent.py +0 -0
  140. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/create_flock.py +0 -0
  141. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/execute_flock.py +0 -0
  142. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/load_agent.py +0 -0
  143. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/load_examples.py +0 -0
  144. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/load_flock.py +0 -0
  145. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/load_release_notes.py +0 -0
  146. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/loaded_flock_cli.py +0 -0
  147. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/manage_agents.py +0 -0
  148. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/registry_management.py +0 -0
  149. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/runner.py +0 -0
  150. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/settings.py +0 -0
  151. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/utils.py +0 -0
  152. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/view_results.py +0 -0
  153. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/cli/yaml_editor.py +0 -0
  154. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/config.py +0 -0
  155. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/__init__.py +0 -0
  156. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/__init__.py +0 -0
  157. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/custom_endpoint.py +0 -0
  158. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/endpoints.py +0 -0
  159. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/main.py +0 -0
  160. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/models.py +0 -0
  161. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/run_store.py +0 -0
  162. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/runner.py +0 -0
  163. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/api/service.py +0 -0
  164. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/context/context.py +0 -0
  165. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/context/context_manager.py +0 -0
  166. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/context/context_vars.py +0 -0
  167. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/evaluation/utils.py +0 -0
  168. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/execution/batch_executor.py +0 -0
  169. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/execution/evaluation_executor.py +0 -0
  170. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/execution/local_executor.py +0 -0
  171. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/execution/temporal_executor.py +0 -0
  172. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock.py +0 -0
  173. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_evaluator.py +0 -0
  174. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_module.py +0 -0
  175. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_registry.py +0 -0
  176. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_router.py +0 -0
  177. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/flock_server_manager.py +0 -0
  178. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/interpreter/python_interpreter.py +0 -0
  179. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/__init__.py +0 -0
  180. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/formatters/enum_builder.py +0 -0
  181. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/formatters/theme_builder.py +0 -0
  182. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/formatters/themed_formatter.py +0 -0
  183. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/formatters/themes.py +0 -0
  184. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/logging.py +0 -0
  185. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/span_middleware/baggage_span_processor.py +0 -0
  186. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/telemetry.py +0 -0
  187. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/telemetry_exporter/base_exporter.py +0 -0
  188. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/telemetry_exporter/file_exporter.py +0 -0
  189. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/telemetry_exporter/sqlite_exporter.py +0 -0
  190. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/logging/trace_and_logged.py +0 -0
  191. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/__init__.py +0 -0
  192. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/flock_mcp_server.py +0 -0
  193. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/flock_mcp_tool_base.py +0 -0
  194. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/mcp_client.py +0 -0
  195. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/mcp_client_manager.py +0 -0
  196. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/mcp_config.py +0 -0
  197. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/types/__init__.py +0 -0
  198. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/types/callbacks.py +0 -0
  199. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/types/factories.py +0 -0
  200. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/types/handlers.py +0 -0
  201. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/types/types.py +0 -0
  202. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/util/__init__.py +0 -0
  203. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mcp/util/helpers.py +0 -0
  204. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mixin/dspy_integration.py +0 -0
  205. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/mixin/prompt_parser.py +0 -0
  206. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/__init__.py +0 -0
  207. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/callable_registry.py +0 -0
  208. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/flock_serializer.py +0 -0
  209. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/json_encoder.py +0 -0
  210. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/secure_serializer.py +0 -0
  211. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/serializable.py +0 -0
  212. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/serialization/serialization_utils.py +0 -0
  213. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/cli_helper.py +0 -0
  214. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/file_path_utils.py +0 -0
  215. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/hydrator.py +0 -0
  216. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/input_resolver.py +0 -0
  217. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/loader.py +0 -0
  218. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/core/util/spliter.py +0 -0
  219. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/di.py +0 -0
  220. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/__init__.py +0 -0
  221. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/declarative/__init__.py +0 -0
  222. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/declarative/declarative_evaluator.py +0 -0
  223. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/memory/memory_evaluator.py +0 -0
  224. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/test/test_case_evaluator.py +0 -0
  225. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/evaluators/zep/zep_evaluator.py +0 -0
  226. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/sse/__init__.py +0 -0
  227. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/sse/flock_sse_server.py +0 -0
  228. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/stdio/__init__.py +0 -0
  229. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/stdio/flock_stdio_server.py +0 -0
  230. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/websockets/__init__.py +0 -0
  231. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/mcp/servers/websockets/flock_websocket_server.py +0 -0
  232. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/__init__.py +0 -0
  233. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/assertion/__init__.py +0 -0
  234. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/assertion/assertion_module.py +0 -0
  235. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/callback/__init__.py +0 -0
  236. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/callback/callback_module.py +0 -0
  237. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/enterprise_memory/README.md +0 -0
  238. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/enterprise_memory/enterprise_memory_module.py +0 -0
  239. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/mem0/__init__.py +0 -0
  240. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/mem0/mem0_module.py +0 -0
  241. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/mem0_async/__init__.py +0 -0
  242. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/mem0_async/async_mem0_module.py +0 -0
  243. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/memory/__init__.py +0 -0
  244. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/memory/memory_module.py +0 -0
  245. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/memory/memory_parser.py +0 -0
  246. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/memory/memory_storage.py +0 -0
  247. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/output/__init__.py +0 -0
  248. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/output/output_module.py +0 -0
  249. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/performance/__init__.py +0 -0
  250. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/performance/metrics_module.py +0 -0
  251. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/zep/__init__.py +0 -0
  252. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/modules/zep/zep_module.py +0 -0
  253. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/platform/docker_tools.py +0 -0
  254. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/platform/jaeger_install.py +0 -0
  255. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/__init__.py +0 -0
  256. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/agent/__init__.py +0 -0
  257. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/agent/agent_router.py +0 -0
  258. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/agent/handoff_agent.py +0 -0
  259. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/conditional/conditional_router.py +0 -0
  260. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/default/__init__.py +0 -0
  261. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/default/default_router.py +0 -0
  262. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/feedback/feedback_router.py +0 -0
  263. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/list_generator/list_generator_router.py +0 -0
  264. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/llm/__init__.py +0 -0
  265. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/routers/llm/llm_router.py +0 -0
  266. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/3024-day.toml +0 -0
  267. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/3024-night.toml +0 -0
  268. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/aardvark-blue.toml +0 -0
  269. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/abernathy.toml +0 -0
  270. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/adventure.toml +0 -0
  271. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/adventuretime.toml +0 -0
  272. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/afterglow.toml +0 -0
  273. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/alabaster.toml +0 -0
  274. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/alienblood.toml +0 -0
  275. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/andromeda.toml +0 -0
  276. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/apple-classic.toml +0 -0
  277. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/apple-system-colors.toml +0 -0
  278. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/arcoiris.toml +0 -0
  279. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/argonaut copy.toml +0 -0
  280. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/argonaut.toml +0 -0
  281. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/arthur.toml +0 -0
  282. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ateliersulphurpool.toml +0 -0
  283. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/atom.toml +0 -0
  284. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/atom_test.toml +0 -0
  285. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/atomonelight.toml +0 -0
  286. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/aurora.toml +0 -0
  287. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ayu copy.toml +0 -0
  288. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ayu-light.toml +0 -0
  289. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ayu-mirage.toml +0 -0
  290. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ayu.toml +0 -0
  291. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/banana-blueberry.toml +0 -0
  292. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/batman.toml +0 -0
  293. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/belafonte-day.toml +0 -0
  294. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/belafonte-night.toml +0 -0
  295. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/birdsofparadise.toml +0 -0
  296. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/blazer.toml +0 -0
  297. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/blue-matrix.toml +0 -0
  298. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/blueberrypie.toml +0 -0
  299. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/bluedolphin.toml +0 -0
  300. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/blulocodark.toml +0 -0
  301. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/blulocolight.toml +0 -0
  302. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/borland.toml +0 -0
  303. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/breeze.toml +0 -0
  304. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/bright-lights.toml +0 -0
  305. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/broadcast.toml +0 -0
  306. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/brogrammer.toml +0 -0
  307. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-dark.toml +0 -0
  308. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-light.toml +0 -0
  309. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-pastel-dark.toml +0 -0
  310. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-solarized-dark.toml +0 -0
  311. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-solarized-light.toml +0 -0
  312. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-tango-dark.toml +0 -0
  313. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/builtin-tango-light.toml +0 -0
  314. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/c64.toml +0 -0
  315. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/calamity.toml +0 -0
  316. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/catppuccin-frappe.toml +0 -0
  317. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/catppuccin-latte.toml +0 -0
  318. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/catppuccin-macchiato.toml +0 -0
  319. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/catppuccin-mocha.toml +0 -0
  320. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cga.toml +0 -0
  321. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/chalk.toml +0 -0
  322. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/chalkboard.toml +0 -0
  323. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/challengerdeep.toml +0 -0
  324. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/chester.toml +0 -0
  325. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ciapre.toml +0 -0
  326. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/clrs.toml +0 -0
  327. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cobalt-neon.toml +0 -0
  328. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cobalt2.toml +0 -0
  329. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/coffee-theme.toml +0 -0
  330. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/crayonponyfish.toml +0 -0
  331. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cutiepro.toml +0 -0
  332. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cyberdyne.toml +0 -0
  333. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cyberpunk.toml +0 -0
  334. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/cyberpunkscarletprotocol.toml +0 -0
  335. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dark+.toml +0 -0
  336. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dark-pastel.toml +0 -0
  337. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/darkermatrix.toml +0 -0
  338. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/darkmatrix.toml +0 -0
  339. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/darkside.toml +0 -0
  340. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dayfox.toml +0 -0
  341. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/deep.toml +0 -0
  342. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/desert.toml +0 -0
  343. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dimidium.toml +0 -0
  344. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dimmedmonokai.toml +0 -0
  345. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/django.toml +0 -0
  346. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/djangorebornagain.toml +0 -0
  347. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/djangosmooth.toml +0 -0
  348. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/doom-peacock.toml +0 -0
  349. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/doomone.toml +0 -0
  350. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dotgov.toml +0 -0
  351. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dracula+.toml +0 -0
  352. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/dracula.toml +0 -0
  353. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/duckbones.toml +0 -0
  354. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/duotone-dark.toml +0 -0
  355. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/earthsong.toml +0 -0
  356. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/elemental.toml +0 -0
  357. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/elementary.toml +0 -0
  358. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/encom.toml +0 -0
  359. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/espresso-libre.toml +0 -0
  360. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/espresso.toml +0 -0
  361. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/everblush.toml +0 -0
  362. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/fahrenheit.toml +0 -0
  363. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/fairyfloss.toml +0 -0
  364. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/farmhouse-dark.toml +0 -0
  365. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/farmhouse-light.toml +0 -0
  366. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/fideloper.toml +0 -0
  367. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/firefly-traditional.toml +0 -0
  368. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/firefoxdev.toml +0 -0
  369. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/firewatch.toml +0 -0
  370. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/fishtank.toml +0 -0
  371. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/flat.toml +0 -0
  372. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/flatland.toml +0 -0
  373. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/flexoki-dark.toml +0 -0
  374. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/flexoki-light.toml +0 -0
  375. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/floraverse.toml +0 -0
  376. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/forestblue.toml +0 -0
  377. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/framer.toml +0 -0
  378. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/frontenddelight.toml +0 -0
  379. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/funforrest.toml +0 -0
  380. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/galaxy.toml +0 -0
  381. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/galizur.toml +0 -0
  382. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/github-dark.toml +0 -0
  383. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/github.toml +0 -0
  384. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/glacier.toml +0 -0
  385. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/grape.toml +0 -0
  386. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/grass.toml +0 -0
  387. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/grey-green.toml +0 -0
  388. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/gruber-darker.toml +0 -0
  389. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/gruvboxdark.toml +0 -0
  390. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/gruvboxdarkhard.toml +0 -0
  391. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/gruvboxlight.toml +0 -0
  392. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/guezwhoz.toml +0 -0
  393. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hacktober.toml +0 -0
  394. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hardcore.toml +0 -0
  395. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/harper.toml +0 -0
  396. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hax0r-blue.toml +0 -0
  397. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hax0r-gr33n.toml +0 -0
  398. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hax0r-r3d.toml +0 -0
  399. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/highway.toml +0 -0
  400. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hipster-green.toml +0 -0
  401. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hivacruz.toml +0 -0
  402. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/homebrew.toml +0 -0
  403. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hopscotch.256.toml +0 -0
  404. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hopscotch.toml +0 -0
  405. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hurtado.toml +0 -0
  406. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/hybrid.toml +0 -0
  407. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ic-green-ppl.toml +0 -0
  408. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ic-orange-ppl.toml +0 -0
  409. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iceberg-dark.toml +0 -0
  410. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iceberg-light.toml +0 -0
  411. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/idea.toml +0 -0
  412. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/idletoes.toml +0 -0
  413. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ir-black.toml +0 -0
  414. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-dark-background.toml +0 -0
  415. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-default.toml +0 -0
  416. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-light-background.toml +0 -0
  417. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-pastel-dark-background.toml +0 -0
  418. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-smoooooth.toml +0 -0
  419. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-solarized-dark.toml +0 -0
  420. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-solarized-light.toml +0 -0
  421. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-tango-dark.toml +0 -0
  422. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/iterm2-tango-light.toml +0 -0
  423. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/jackie-brown.toml +0 -0
  424. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/japanesque.toml +0 -0
  425. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/jellybeans.toml +0 -0
  426. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/jetbrains-darcula.toml +0 -0
  427. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/jubi.toml +0 -0
  428. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/kanagawabones.toml +0 -0
  429. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/kibble.toml +0 -0
  430. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/kolorit.toml +0 -0
  431. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/konsolas.toml +0 -0
  432. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/kurokula.toml +0 -0
  433. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/lab-fox.toml +0 -0
  434. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/laser.toml +0 -0
  435. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/later-this-evening.toml +0 -0
  436. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/lavandula.toml +0 -0
  437. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/liquidcarbon.toml +0 -0
  438. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/liquidcarbontransparent.toml +0 -0
  439. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/liquidcarbontransparentinverse.toml +0 -0
  440. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/lovelace.toml +0 -0
  441. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/man-page.toml +0 -0
  442. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/mariana.toml +0 -0
  443. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/material.toml +0 -0
  444. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/materialdark.toml +0 -0
  445. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/materialdarker.toml +0 -0
  446. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/materialdesigncolors.toml +0 -0
  447. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/materialocean.toml +0 -0
  448. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/mathias.toml +0 -0
  449. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/matrix.toml +0 -0
  450. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/medallion.toml +0 -0
  451. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/mellifluous.toml +0 -0
  452. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/midnight-in-mojave.toml +0 -0
  453. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/mirage.toml +0 -0
  454. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/misterioso.toml +0 -0
  455. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/molokai.toml +0 -0
  456. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/monalisa.toml +0 -0
  457. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/monokai-remastered.toml +0 -0
  458. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/monokai-soda.toml +0 -0
  459. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/monokai-vivid.toml +0 -0
  460. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/n0tch2k.toml +0 -0
  461. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/neobones-dark.toml +0 -0
  462. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/neobones-light.toml +0 -0
  463. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/neon.toml +0 -0
  464. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/neopolitan.toml +0 -0
  465. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/neutron.toml +0 -0
  466. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/night-owlish-light.toml +0 -0
  467. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nightfox.toml +0 -0
  468. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nightlion-v1.toml +0 -0
  469. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nightlion-v2.toml +0 -0
  470. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/niji.toml +0 -0
  471. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nocturnal-winter.toml +0 -0
  472. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nord-light.toml +0 -0
  473. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nord.toml +0 -0
  474. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/novel.toml +0 -0
  475. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nvimdark.toml +0 -0
  476. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/nvimlight.toml +0 -0
  477. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/obsidian.toml +0 -0
  478. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ocean.toml +0 -0
  479. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/oceanic-next.toml +0 -0
  480. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/oceanicmaterial.toml +0 -0
  481. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ollie.toml +0 -0
  482. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/onehalfdark.toml +0 -0
  483. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/onehalflight.toml +0 -0
  484. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/operator-mono-dark.toml +0 -0
  485. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/overnight-slumber.toml +0 -0
  486. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/oxocarbon.toml +0 -0
  487. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/palenighthc.toml +0 -0
  488. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pandora.toml +0 -0
  489. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/paraiso-dark.toml +0 -0
  490. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/paulmillr.toml +0 -0
  491. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pencildark.toml +0 -0
  492. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pencillight.toml +0 -0
  493. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/peppermint.toml +0 -0
  494. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/piatto-light.toml +0 -0
  495. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pnevma.toml +0 -0
  496. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/popping-and-locking.toml +0 -0
  497. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/primary.toml +0 -0
  498. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pro-light.toml +0 -0
  499. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/pro.toml +0 -0
  500. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/purple-rain.toml +0 -0
  501. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/purplepeter.toml +0 -0
  502. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rapture.toml +0 -0
  503. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/raycast-dark.toml +0 -0
  504. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/raycast-light.toml +0 -0
  505. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rebecca.toml +0 -0
  506. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/red-alert.toml +0 -0
  507. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/red-planet.toml +0 -0
  508. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/red-sands.toml +0 -0
  509. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/relaxed.toml +0 -0
  510. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/retro.toml +0 -0
  511. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rippedcasts.toml +0 -0
  512. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rose-pine-dawn.toml +0 -0
  513. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rose-pine-moon.toml +0 -0
  514. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rose-pine.toml +0 -0
  515. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/rouge-2.toml +0 -0
  516. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/royal.toml +0 -0
  517. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ryuuko.toml +0 -0
  518. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/sakura.toml +0 -0
  519. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/scarlet-protocol.toml +0 -0
  520. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/seafoam-pastel.toml +0 -0
  521. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/seashells.toml +0 -0
  522. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/seoulbones-dark.toml +0 -0
  523. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/seoulbones-light.toml +0 -0
  524. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/seti.toml +0 -0
  525. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/shades-of-purple.toml +0 -0
  526. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/shaman.toml +0 -0
  527. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/slate.toml +0 -0
  528. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/sleepyhollow.toml +0 -0
  529. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/smyck.toml +0 -0
  530. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/snazzy.toml +0 -0
  531. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/softserver.toml +0 -0
  532. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/solarized-darcula.toml +0 -0
  533. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/solarized-dark---patched.toml +0 -0
  534. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/solarized-dark-higher-contrast.toml +0 -0
  535. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spacedust.toml +0 -0
  536. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spacegray-eighties-dull.toml +0 -0
  537. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spacegray-eighties.toml +0 -0
  538. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spacegray.toml +0 -0
  539. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spiderman.toml +0 -0
  540. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/spring.toml +0 -0
  541. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/square.toml +0 -0
  542. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/sublette.toml +0 -0
  543. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/subliminal.toml +0 -0
  544. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/sugarplum.toml +0 -0
  545. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/sundried.toml +0 -0
  546. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/symfonic.toml +0 -0
  547. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/synthwave-everything.toml +0 -0
  548. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/synthwave.toml +0 -0
  549. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/synthwavealpha.toml +0 -0
  550. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tango-adapted.toml +0 -0
  551. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tango-half-adapted.toml +0 -0
  552. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/teerb.toml +0 -0
  553. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/terafox.toml +0 -0
  554. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/terminal-basic.toml +0 -0
  555. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/thayer-bright.toml +0 -0
  556. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/the-hulk.toml +0 -0
  557. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tinacious-design-(dark).toml +0 -0
  558. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tinacious-design-(light).toml +0 -0
  559. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tokyonight-day.toml +0 -0
  560. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tokyonight-storm.toml +0 -0
  561. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tokyonight.toml +0 -0
  562. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow-night-blue.toml +0 -0
  563. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow-night-bright.toml +0 -0
  564. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow-night-burns.toml +0 -0
  565. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow-night-eighties.toml +0 -0
  566. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow-night.toml +0 -0
  567. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/tomorrow.toml +0 -0
  568. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/toychest.toml +0 -0
  569. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/treehouse.toml +0 -0
  570. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/twilight.toml +0 -0
  571. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ubuntu.toml +0 -0
  572. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ultradark.toml +0 -0
  573. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/ultraviolent.toml +0 -0
  574. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/underthesea.toml +0 -0
  575. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/unikitty.toml +0 -0
  576. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/urple.toml +0 -0
  577. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/vaughn.toml +0 -0
  578. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/vesper.toml +0 -0
  579. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/vibrantink.toml +0 -0
  580. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/vimbones.toml +0 -0
  581. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/violet-dark.toml +0 -0
  582. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/violet-light.toml +0 -0
  583. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/warmneon.toml +0 -0
  584. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/wez.toml +0 -0
  585. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/whimsy.toml +0 -0
  586. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/wildcherry.toml +0 -0
  587. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/wilmersdorf.toml +0 -0
  588. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/wombat.toml +0 -0
  589. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/wryan.toml +0 -0
  590. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/xcodedark.toml +0 -0
  591. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/xcodedarkhc.toml +0 -0
  592. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/xcodelight.toml +0 -0
  593. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/xcodelighthc.toml +0 -0
  594. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/xcodewwdc.toml +0 -0
  595. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenbones-dark.toml +0 -0
  596. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenbones-light.toml +0 -0
  597. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenbones.toml +0 -0
  598. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenburn.toml +0 -0
  599. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenburned.toml +0 -0
  600. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenwritten-dark.toml +0 -0
  601. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/themes/zenwritten-light.toml +0 -0
  602. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/__init__.py +0 -0
  603. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/azure_tools.py +0 -0
  604. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/code_tools.py +0 -0
  605. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/file_tools.py +0 -0
  606. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/github_tools.py +0 -0
  607. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/markdown_tools.py +0 -0
  608. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/system_tools.py +0 -0
  609. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/text_tools.py +0 -0
  610. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/web_tools.py +0 -0
  611. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/tools/zendesk_tools.py +0 -0
  612. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/__init__.py +0 -0
  613. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/__init__.py +0 -0
  614. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/api/__init__.py +0 -0
  615. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/api/agent_management.py +0 -0
  616. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/api/execution.py +0 -0
  617. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/api/flock_management.py +0 -0
  618. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/api/registry_viewer.py +0 -0
  619. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/chat.py +0 -0
  620. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/config.py +0 -0
  621. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/dependencies.py +0 -0
  622. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/models_ui.py +0 -0
  623. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/services/__init__.py +0 -0
  624. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/services/flock_service.py +0 -0
  625. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/services/sharing_models.py +0 -0
  626. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/templates/theme_mapper.html +0 -0
  627. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/theme_mapper.py +0 -0
  628. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/app/utils.py +0 -0
  629. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/chat.css +0 -0
  630. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/components.css +0 -0
  631. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/header.css +0 -0
  632. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/layout.css +0 -0
  633. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/sidebar.css +0 -0
  634. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/static/css/two-pane.css +0 -0
  635. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_agent_tools_checklist.html +0 -0
  636. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_chat_messages.html +0 -0
  637. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -0
  638. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_header_flock_status.html +0 -0
  639. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_registry_table.html +0 -0
  640. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_results_display.html +0 -0
  641. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -0
  642. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_share_link_snippet.html +0 -0
  643. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_structured_data_view.html +0 -0
  644. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/webapp/templates/partials/_theme_preview.html +0 -0
  645. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/__init__.py +0 -0
  646. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/activities.py +0 -0
  647. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/agent_activities.py +0 -0
  648. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/agent_execution_activity.py +0 -0
  649. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/flock_workflow.py +0 -0
  650. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/temporal_config.py +0 -0
  651. {flock_core-0.4.511 → flock_core-0.4.512}/src/flock/workflow/temporal_setup.py +0 -0
  652. {flock_core-0.4.511 → flock_core-0.4.512}/tests/__init__.py +0 -0
  653. {flock_core-0.4.511 → flock_core-0.4.512}/tests/api/test_custom_endpoints.py +0 -0
  654. {flock_core-0.4.511 → flock_core-0.4.512}/tests/core/test_flock_batch.py +0 -0
  655. {flock_core-0.4.511 → flock_core-0.4.512}/tests/core/test_flock_core.py +0 -0
  656. {flock_core-0.4.511 → flock_core-0.4.512}/tests/modules/test_enterprise_memory_store.py +0 -0
  657. {flock_core-0.4.511 → flock_core-0.4.512}/tests/modules/test_vector_adapters.py +0 -0
  658. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/__init__.py +0 -0
  659. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/test_enhanced_serialization.py +0 -0
  660. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/test_file_path_serialization.py +0 -0
  661. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/test_flock_serializer.py +0 -0
  662. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/test_nested_serialization.py +0 -0
  663. {flock_core-0.4.511 → flock_core-0.4.512}/tests/serialization/test_yaml_serialization.py +0 -0
  664. {flock_core-0.4.511 → flock_core-0.4.512}/tests/tools/test_zendesk_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flock-core
3
- Version: 0.4.511
3
+ Version: 0.4.512
4
4
  Summary: Declarative LLM Orchestration at Scale
5
5
  Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
6
6
  License-File: LICENSE
@@ -9,7 +9,9 @@ Classifier: Operating System :: OS Independent
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Requires-Python: >=3.10
11
11
  Requires-Dist: aiosqlite>=0.21.0
12
+ Requires-Dist: azure-data-tables>=12.7.0
12
13
  Requires-Dist: cloudpickle>=3.1.1
14
+ Requires-Dist: croniter>=6.0.0
13
15
  Requires-Dist: devtools>=0.12.2
14
16
  Requires-Dist: dspy==2.6.23
15
17
  Requires-Dist: fastapi>=0.115.8
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flock-core"
3
- version = "0.4.511"
3
+ version = "0.4.512"
4
4
  description = "Declarative LLM Orchestration at Scale"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -52,6 +52,8 @@ dependencies = [
52
52
  "wd-di>=0.2.14",
53
53
  "websockets>=15.0.1",
54
54
  "opik>=1.7.26",
55
+ "azure-data-tables>=12.7.0",
56
+ "croniter>=6.0.0",
55
57
  ]
56
58
 
57
59
  [project.optional-dependencies]
@@ -0,0 +1,11 @@
1
+
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class FlockAgentConfig(BaseModel):
7
+ """FlockAgentConfig is a class that holds the configuration for a Flock agent.
8
+ It is used to store various settings and parameters that can be accessed throughout the agent's lifecycle.
9
+ """
10
+
11
+ pass
@@ -0,0 +1,40 @@
1
+
2
+
3
+
4
+ from pydantic import Field
5
+
6
+ from flock.core.config.flock_agent_config import FlockAgentConfig
7
+
8
+
9
+ class ScheduledAgentConfig(FlockAgentConfig):
10
+ """Configuration specific to agents that run on a schedule."""
11
+ schedule_expression: str = Field(
12
+ ...,
13
+ description="Defines when the agent should run. "
14
+ "Examples: 'every 60m', 'every 1h', 'daily at 02:00', '0 */2 * * *' (cron expression)"
15
+ )
16
+ enabled: bool = Field(
17
+ True,
18
+ description="Whether the scheduled agent is enabled. "
19
+ "If False, the agent will not run even if the schedule expression is valid."
20
+ )
21
+ initial_run: bool = Field(
22
+ False,
23
+ description="If True, the agent will run immediately after being scheduled, "
24
+ "regardless of the schedule expression."
25
+ )
26
+ max_runs: int = Field(
27
+ 0,
28
+ description="Maximum number of times the agent can run. "
29
+ "0 means unlimited runs. If set, the agent will stop running after reaching this limit."
30
+ )
31
+
32
+ def __init__(self, **kwargs):
33
+ super().__init__(**kwargs)
34
+ # Ensure schedule_expression is always set
35
+ if 'schedule_expression' not in kwargs:
36
+ raise ValueError("schedule_expression is required for ScheduledAgentConfig")
37
+
38
+ # Validate initial_run and max_runs
39
+ if self.initial_run and self.max_runs > 0:
40
+ raise ValueError("Cannot set initial_run to True if max_runs is greater than 0")
@@ -10,6 +10,7 @@ from collections.abc import Callable
10
10
  from datetime import datetime
11
11
  from typing import TYPE_CHECKING, Any, TypeVar
12
12
 
13
+ from flock.core.config.flock_agent_config import FlockAgentConfig
13
14
  from flock.core.mcp.flock_mcp_server import FlockMCPServerBase
14
15
  from flock.core.serialization.json_encoder import FlockJSONEncoder
15
16
  from flock.workflow.temporal_config import TemporalActivityConfig
@@ -124,6 +125,11 @@ class FlockAgent(BaseModel, Serializable, DSPyIntegrationMixin, ABC):
124
125
  description="Dictionary of FlockModules attached to this agent.",
125
126
  )
126
127
 
128
+ config: FlockAgentConfig = Field(
129
+ default_factory=lambda: FlockAgentConfig(),
130
+ description="Configuration for this agent, holding various settings and parameters.",
131
+ )
132
+
127
133
  # --- Temporal Configuration (Optional) ---
128
134
  temporal_activity_config: TemporalActivityConfig | None = Field(
129
135
  default=None,
@@ -7,6 +7,7 @@ from typing import Any, Literal
7
7
 
8
8
  from pydantic import AnyUrl, BaseModel, Field, FileUrl
9
9
 
10
+ from flock.core.config.scheduled_agent_config import ScheduledAgentConfig
10
11
  from flock.core.flock_agent import FlockAgent, SignatureType
11
12
  from flock.core.logging.formatters.themes import OutputTheme
12
13
  from flock.core.mcp.flock_mcp_server import FlockMCPServerBase
@@ -381,3 +382,46 @@ class FlockFactory:
381
382
  agent.add_module(output_module)
382
383
  agent.add_module(metrics_module)
383
384
  return agent
385
+
386
+ @staticmethod
387
+ def create_scheduled_agent(
388
+ name: str,
389
+ schedule_expression: str, # e.g., "every 1h", "0 0 * * *"
390
+ description: str | Callable[..., str] | None = None,
391
+ model: str | Callable[..., str] | None = None,
392
+ input: SignatureType = None, # Input might be implicit or none
393
+ output: SignatureType = None, # Input might be implicit or none
394
+ tools: list[Callable[..., Any] | Any] | None = None,
395
+ servers: list[str | FlockMCPServerBase] | None = None,
396
+ use_cache: bool = False, # Whether to cache results
397
+ temperature: float = 0.7, # Temperature for model responses
398
+ # ... other common agent params from create_default_agent ...
399
+ temporal_activity_config: TemporalActivityConfig | None = None, # If you want scheduled tasks to be Temporal activities
400
+ **kwargs # Forward other standard agent params
401
+ ) -> FlockAgent:
402
+ """Creates a FlockAgent configured to run on a schedule."""
403
+ agent_config = ScheduledAgentConfig( # Use the new config type
404
+ schedule_expression=schedule_expression,
405
+ enabled=True,
406
+ initial_run=True,
407
+ max_runs=0,
408
+ **kwargs
409
+ )
410
+
411
+
412
+ agent = FlockFactory.create_default_agent( # Reuse your existing factory
413
+ name=name,
414
+ description=description,
415
+ model=model,
416
+ input=input + ", trigger_time: str | Time of scheduled execution",
417
+ output=output,
418
+ tools=tools,
419
+ servers=servers,
420
+ temporal_activity_config=temporal_activity_config,
421
+ use_cache=use_cache,
422
+ temperature=temperature,
423
+ **kwargs
424
+ )
425
+ agent.config = agent_config # Assign the scheduled agent config
426
+
427
+ return agent
@@ -0,0 +1,166 @@
1
+ # src/flock/core/scheduler.py (new file or inside flock.py)
2
+ import asyncio
3
+ import traceback
4
+ from datetime import datetime, timedelta, timezone
5
+
6
+ from croniter import croniter # pip install croniter
7
+
8
+ from flock.core.flock import Flock
9
+ from flock.core.flock_agent import FlockAgent # For type hinting
10
+ from flock.core.logging.logging import get_logger
11
+
12
+ logger = get_logger("flock.scheduler")
13
+
14
+ class FlockScheduler:
15
+ def __init__(self, flock_instance: Flock):
16
+ self.flock = flock_instance
17
+ self._scheduled_tasks: list[tuple[FlockAgent, croniter | timedelta, datetime | None]] = []
18
+ self._stop_event = asyncio.Event()
19
+ self._is_running = False
20
+
21
+ def _parse_schedule_expression(self, expression: str) -> croniter | timedelta:
22
+ """Parses a schedule expression.
23
+ Supports cron syntax and simple intervals like 'every Xm', 'every Xh', 'every Xd'.
24
+ """
25
+ expression = expression.strip().lower()
26
+ if expression.startswith("every "):
27
+ try:
28
+ parts = expression.split(" ")
29
+ value = int(parts[1][:-1])
30
+ unit = parts[1][-1]
31
+ if unit == 's': return timedelta(seconds=value)
32
+ if unit == 'm': return timedelta(minutes=value)
33
+ elif unit == 'h': return timedelta(hours=value)
34
+ elif unit == 'd': return timedelta(days=value)
35
+ else: raise ValueError(f"Invalid time unit: {unit}")
36
+ except Exception as e:
37
+ logger.error(f"Invalid interval expression '{expression}': {e}")
38
+ raise ValueError(f"Invalid interval expression: {expression}") from e
39
+ else:
40
+ # Assume cron expression
41
+ if not croniter.is_valid(expression):
42
+ raise ValueError(f"Invalid cron expression: {expression}")
43
+ return croniter(expression, datetime.now(timezone.utc))
44
+
45
+ def add_agent(self, agent: FlockAgent):
46
+ """Adds an agent to the scheduler if it has a schedule expression."""
47
+ # Assuming schedule_expression is stored in agent._flock_config or a dedicated field
48
+ schedule_expression = None
49
+ if hasattr(agent, '_flock_config') and isinstance(agent._flock_config, dict):
50
+ schedule_expression = agent._flock_config.get('schedule_expression')
51
+ elif hasattr(agent, 'schedule_expression'): # If directly on agent
52
+ schedule_expression = agent.schedule_expression
53
+ elif hasattr(agent, 'config') and hasattr(agent.config, 'schedule_expression'): # If on agent.config
54
+ schedule_expression = agent.config.schedule_expression
55
+
56
+
57
+ if not schedule_expression:
58
+ logger.warning(f"Agent '{agent.name}' has no schedule_expression. Skipping.")
59
+ return
60
+
61
+ try:
62
+ parsed_schedule = self._parse_schedule_expression(schedule_expression)
63
+ self._scheduled_tasks.append((agent, parsed_schedule, None)) # agent, schedule, last_run_utc
64
+ logger.info(f"Scheduled agent '{agent.name}' with expression: {schedule_expression}")
65
+ except ValueError as e:
66
+ logger.error(f"Could not schedule agent '{agent.name}': {e}")
67
+
68
+ def _load_scheduled_agents_from_flock(self):
69
+ """Scans the Flock instance for agents with scheduling configuration."""
70
+ self._scheduled_tasks = [] # Clear existing before loading
71
+ for agent_name, agent_instance in self.flock.agents.items():
72
+ self.add_agent(agent_instance)
73
+ logger.info(f"Loaded {len(self._scheduled_tasks)} scheduled agents from Flock '{self.flock.name}'.")
74
+
75
+ async def _run_agent_task(self, agent: FlockAgent, trigger_time: datetime):
76
+ logger.info(f"Triggering scheduled agent '{agent.name}' at {trigger_time.isoformat()}")
77
+ try:
78
+ # Input for a scheduled agent could include the trigger time
79
+ await self.flock.run_async(start_agent=agent.name, input={"trigger_time": trigger_time})
80
+ logger.info(f"Scheduled agent '{agent.name}' finished successfully.")
81
+ except Exception as e:
82
+ logger.error(f"Error running scheduled agent '{agent.name}': {e}\n{traceback.format_exc()}")
83
+
84
+ async def _scheduler_loop(self):
85
+ self._is_running = True
86
+ logger.info("FlockScheduler loop started.")
87
+ while not self._stop_event.is_set():
88
+ now_utc = datetime.now(timezone.utc)
89
+ tasks_to_run_this_cycle = []
90
+
91
+ for i, (agent, schedule, last_run_utc) in enumerate(self._scheduled_tasks):
92
+ should_run = False
93
+ next_run_utc = None
94
+
95
+ if isinstance(schedule, croniter):
96
+ # For cron, get the next scheduled time AFTER the last run (or now if never run)
97
+ base_time = last_run_utc if last_run_utc else now_utc
98
+ # Croniter's get_next gives the next time *after* the base_time.
99
+ # If last_run_utc is None (first run), we check if the *current* now_utc
100
+ # is past the first scheduled time.
101
+ # A simpler check: is `now_utc` >= `schedule.get_next(datetime, base_time=last_run_utc if last_run_utc else now_utc - timedelta(seconds=1))` ?
102
+ # Let's refine croniter check to be more precise.
103
+ # If we are past the *next* scheduled time since *last check*
104
+ if last_run_utc is None: # First run check
105
+ next_run_utc = schedule.get_next(datetime, start_time=now_utc - timedelta(seconds=1)) # Check if first run is due
106
+ if next_run_utc <= now_utc:
107
+ should_run = True
108
+ else:
109
+ next_run_utc = schedule.get_next(datetime, start_time=last_run_utc)
110
+ if next_run_utc <= now_utc:
111
+ should_run = True
112
+
113
+ elif isinstance(schedule, timedelta): # Simple interval
114
+ if last_run_utc is None or (now_utc - last_run_utc >= schedule):
115
+ should_run = True
116
+ next_run_utc = now_utc # Or now_utc + schedule for next interval start
117
+ else:
118
+ next_run_utc = last_run_utc + schedule
119
+
120
+
121
+ if should_run:
122
+ tasks_to_run_this_cycle.append(self._run_agent_task(agent, now_utc))
123
+ # Update last_run_utc for this agent *before* awaiting its execution
124
+ # For cron, advance the iterator to the *current* scheduled time that triggered it.
125
+ if isinstance(schedule, croniter):
126
+ current_cron_trigger = schedule.get_current(datetime) # This is the time it *should* have run
127
+ self._scheduled_tasks[i] = (agent, schedule, current_cron_trigger)
128
+
129
+ elif isinstance(schedule, timedelta):
130
+ self._scheduled_tasks[i] = (agent, schedule, now_utc) # Mark as run now
131
+
132
+ if tasks_to_run_this_cycle:
133
+ await asyncio.gather(*tasks_to_run_this_cycle, return_exceptions=True)
134
+
135
+ try:
136
+ # Sleep for a short interval, e.g., 10 seconds, or until stop_event is set
137
+ await asyncio.wait_for(self._stop_event.wait(), timeout=10.0)
138
+ except asyncio.TimeoutError:
139
+ pass # Timeout is normal, means continue loop
140
+ self._is_running = False
141
+ logger.info("FlockScheduler loop stopped.")
142
+
143
+ async def start(self) -> asyncio.Task | None: # Modified to return Task or None
144
+ if self._is_running:
145
+ logger.warning("Scheduler is already running.")
146
+ return None # Or return the existing task if you store it
147
+
148
+ self._load_scheduled_agents_from_flock()
149
+ if not self._scheduled_tasks:
150
+ logger.info("No scheduled agents found. Scheduler will not start a loop task.")
151
+ return None # Return None if no tasks to schedule
152
+
153
+ self._stop_event.clear()
154
+ loop_task = asyncio.create_task(self._scheduler_loop())
155
+ # Store the task if you need to reference it, e.g., for forced cancellation beyond _stop_event
156
+ # self._loop_task = loop_task
157
+ return loop_task # Return the created task
158
+
159
+ async def stop(self):
160
+ if not self._is_running and not self._stop_event.is_set(): # Check if stop already called
161
+ logger.info("Scheduler is not running or already signaled to stop.")
162
+ return
163
+ logger.info("Stopping FlockScheduler...")
164
+ self._stop_event.set()
165
+ # If you stored self._loop_task, you can await it here or in the lifespan manager
166
+ # await self._loop_task # (This might block if loop doesn't exit quickly)
@@ -1,4 +1,5 @@
1
1
  # src/flock/webapp/app/main.py
2
+ import asyncio
2
3
  import json
3
4
  import os # Added import
4
5
  import shutil
@@ -8,6 +9,7 @@ import urllib.parse
8
9
  import uuid
9
10
  from contextlib import asynccontextmanager
10
11
  from pathlib import Path
12
+ from typing import Any
11
13
 
12
14
  import markdown2 # Import markdown2
13
15
  from fastapi import (
@@ -24,13 +26,13 @@ from fastapi.responses import HTMLResponse, RedirectResponse
24
26
  from fastapi.staticfiles import StaticFiles
25
27
  from fastapi.templating import Jinja2Templates
26
28
  from pydantic import BaseModel
27
- from typing import Any
28
29
 
29
30
  from flock.core.api.endpoints import create_api_router
30
31
  from flock.core.api.run_store import RunStore
31
32
 
32
33
  # Import core Flock components and API related modules
33
34
  from flock.core.flock import Flock # For type hinting
35
+ from flock.core.flock_scheduler import FlockScheduler
34
36
  from flock.core.logging.logging import get_logger # For logging
35
37
  from flock.core.util.spliter import parse_schema
36
38
 
@@ -44,7 +46,6 @@ from flock.webapp.app.api import (
44
46
  from flock.webapp.app.config import (
45
47
  DEFAULT_THEME_NAME,
46
48
  FLOCK_FILES_DIR,
47
- SHARED_LINKS_DB_PATH,
48
49
  THEMES_DIR,
49
50
  get_current_theme_name,
50
51
  )
@@ -72,7 +73,7 @@ from flock.webapp.app.services.flock_service import (
72
73
  from flock.webapp.app.services.sharing_models import SharedLinkConfig
73
74
  from flock.webapp.app.services.sharing_store import (
74
75
  SharedLinkStoreInterface,
75
- SQLiteSharedLinkStore,
76
+ create_shared_link_store,
76
77
  )
77
78
  from flock.webapp.app.theme_mapper import alacritty_to_pico
78
79
 
@@ -138,23 +139,21 @@ async def lifespan(app: FastAPI):
138
139
  logger.info("FastAPI application starting up...")
139
140
  # Flock instance and RunStore are expected to be set on app.state
140
141
  # by `start_unified_server` in `webapp/run.py` *before* uvicorn starts the app.
141
- # The call to `set_global_flock_services` also happens there.
142
-
143
- # Initialize and set the SharedLinkStore
142
+ # The call to `set_global_flock_services` also happens there. # Initialize and set the SharedLinkStore
144
143
  try:
145
- logger.info(f"Initializing SharedLinkStore with DB path: {SHARED_LINKS_DB_PATH}")
146
- shared_link_store = SQLiteSharedLinkStore(db_path=str(SHARED_LINKS_DB_PATH))
144
+ logger.info("Initializing SharedLinkStore using factory...")
145
+ shared_link_store = create_shared_link_store()
147
146
  await shared_link_store.initialize() # Create tables if they don't exist
148
147
  set_global_shared_link_store(shared_link_store)
149
148
  logger.info("SharedLinkStore initialized and set globally.")
150
149
  except Exception as e:
151
- logger.error(f"Failed to initialize SharedLinkStore: {e}", exc_info=True) # Configure chat features with clear precedence:
150
+ logger.error(f"Failed to initialize SharedLinkStore: {e}", exc_info=True)# Configure chat features with clear precedence:
152
151
  # 1. Value set by start_unified_server (programmatic)
153
152
  # 2. Environment variables (standalone mode)
154
153
  programmatic_chat_enabled = getattr(app.state, "chat_enabled", None)
155
154
  env_start_mode = os.environ.get("FLOCK_START_MODE")
156
155
  env_chat_enabled = os.environ.get("FLOCK_CHAT_ENABLED", "false").lower() == "true"
157
-
156
+
158
157
  if programmatic_chat_enabled is not None:
159
158
  # Programmatic setting takes precedence (from start_unified_server)
160
159
  should_enable_chat_routes = programmatic_chat_enabled
@@ -235,11 +234,66 @@ async def lifespan(app: FastAPI):
235
234
  logger.info(f"Lifespan: Added {len(pending_endpoints)} custom API routes to main app.")
236
235
  else:
237
236
  logger.warning("Lifespan: Pending custom endpoints found, but no Flock instance in app.state. Cannot add custom routes.")
237
+
238
+ # --- Add Scheduler Startup Logic ---
239
+ flock_instance_from_state: Flock | None = getattr(app.state, "flock_instance", None)
240
+ if flock_instance_from_state:
241
+ # Create and start the scheduler
242
+ scheduler = FlockScheduler(flock_instance_from_state)
243
+ app.state.flock_scheduler = scheduler # Store for access during shutdown
244
+
245
+ scheduler_loop_task = await scheduler.start() # Start returns the task
246
+ if scheduler_loop_task:
247
+ app.state.flock_scheduler_task = scheduler_loop_task # Store the task
248
+ logger.info("FlockScheduler background task started.")
249
+ else:
250
+ app.state.flock_scheduler_task = None
251
+ logger.info("FlockScheduler initialized, but no scheduled agents found or loop not started.")
252
+ else:
253
+ app.state.flock_scheduler = None
254
+ app.state.flock_scheduler_task = None
255
+ logger.warning("No Flock instance found in app.state; FlockScheduler not started.")
256
+ # --- End Scheduler Startup Logic ---
257
+
238
258
  yield
239
259
  logger.info("FastAPI application shutting down...")
240
260
 
241
- app = FastAPI(title="Flock Web UI & API", lifespan=lifespan)
261
+ # --- Add Scheduler Shutdown Logic ---
262
+ logger.info("FastAPI application initiating shutdown...")
263
+ scheduler_to_stop: FlockScheduler | None = getattr(app.state, "flock_scheduler", None)
264
+ scheduler_task_to_await: asyncio.Task | None = getattr(app.state, "flock_scheduler_task", None)
242
265
 
266
+ if scheduler_to_stop:
267
+ logger.info("Attempting to stop FlockScheduler...")
268
+ await scheduler_to_stop.stop() # Signal the scheduler loop to stop
269
+
270
+ if scheduler_task_to_await and not scheduler_task_to_await.done():
271
+ logger.info("Waiting for FlockScheduler task to complete...")
272
+ try:
273
+ await asyncio.wait_for(scheduler_task_to_await, timeout=10.0) # Wait for graceful exit
274
+ logger.info("FlockScheduler task completed gracefully.")
275
+ except asyncio.TimeoutError:
276
+ logger.warning("FlockScheduler task did not complete in time, cancelling.")
277
+ scheduler_task_to_await.cancel()
278
+ try:
279
+ await scheduler_task_to_await # Await cancellation
280
+ except asyncio.CancelledError:
281
+ logger.info("FlockScheduler task cancelled.")
282
+ except Exception as e:
283
+ logger.error(f"Error during FlockScheduler task finalization: {e}", exc_info=True)
284
+ elif scheduler_task_to_await and scheduler_task_to_await.done():
285
+ logger.info("FlockScheduler task was already done.")
286
+ else:
287
+ logger.info("FlockScheduler instance found, but no running task was stored to await.")
288
+ else:
289
+ logger.info("No active FlockScheduler found to stop.")
290
+
291
+ logger.info("FastAPI application finished shutdown sequence.")
292
+ # --- End Scheduler Shutdown Logic ---
293
+
294
+ app = FastAPI(title="Flock Web UI & API", lifespan=lifespan, docs_url="/docs",
295
+ openapi_url="/openapi.json", root_path=os.getenv("FLOCK_ROOT_PATH", ""))
296
+ logger.info("FastAPI booting complete.")
243
297
  BASE_DIR = Path(__file__).resolve().parent.parent
244
298
  app.mount("/static", StaticFiles(directory=str(BASE_DIR / "static")), name="static")
245
299
  templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
@@ -826,6 +880,7 @@ async def ui_create_flock_action(request: Request, flock_name: str = Form(...),
826
880
  context = get_base_context_web(request, success=success_msg_text, ui_mode=ui_mode_query)
827
881
  return templates.TemplateResponse("partials/_execution_view_container.html", context, headers=response_headers)
828
882
 
883
+
829
884
  # --- Settings Page & Endpoints ---
830
885
  @app.get("/ui/settings", response_class=HTMLResponse, tags=["UI Pages"])
831
886
  async def page_settings(request: Request, error: str = None, success: str = None, ui_mode: str = Query("standalone")):
@@ -1,3 +1,5 @@
1
+ """Shared link and feedback storage implementations supporting SQLite and Azure Table Storage."""
2
+
1
3
  import logging
2
4
  import sqlite3
3
5
  from abc import ABC, abstractmethod
@@ -10,6 +12,17 @@ from flock.webapp.app.services.sharing_models import (
10
12
  SharedLinkConfig,
11
13
  )
12
14
 
15
+ # Azure Table Storage imports - will be conditionally imported
16
+ try:
17
+ from azure.core.exceptions import ResourceExistsError, ResourceNotFoundError
18
+ from azure.data.tables.aio import TableServiceClient
19
+ AZURE_AVAILABLE = True
20
+ except ImportError:
21
+ AZURE_AVAILABLE = False
22
+ TableServiceClient = None
23
+ ResourceNotFoundError = None
24
+ ResourceExistsError = None
25
+
13
26
  # Get a logger instance
14
27
  logger = logging.getLogger(__name__)
15
28
 
@@ -46,6 +59,7 @@ class SQLiteSharedLinkStore(SharedLinkStoreInterface):
46
59
  """SQLite implementation for storing and retrieving shared link configurations."""
47
60
 
48
61
  def __init__(self, db_path: str):
62
+ """Initialize SQLite store with database path."""
49
63
  self.db_path = Path(db_path)
50
64
  self.db_path.parent.mkdir(parents=True, exist_ok=True) # Ensure directory exists
51
65
  logger.info(f"SQLiteSharedLinkStore initialized with db_path: {self.db_path}")
@@ -213,3 +227,162 @@ class SQLiteSharedLinkStore(SharedLinkStoreInterface):
213
227
  except sqlite3.Error as e:
214
228
  logger.error(f"SQLite error saving feedback {record.feedback_id}: {e}", exc_info=True)
215
229
  raise
230
+
231
+ class AzureTableSharedLinkStore(SharedLinkStoreInterface):
232
+ """Azure Table Storage implementation for storing and retrieving shared link configurations."""
233
+
234
+ def __init__(self, connection_string: str):
235
+ """Initialize Azure Table Storage store with connection string."""
236
+ if not AZURE_AVAILABLE:
237
+ raise ImportError("Azure Table Storage dependencies not available. Install with: pip install azure-data-tables")
238
+
239
+ self.connection_string = connection_string
240
+ self.table_service_client = TableServiceClient.from_connection_string(connection_string)
241
+ self.shared_links_table_name = "flocksharedlinks"
242
+ self.feedback_table_name = "flockfeedback"
243
+ logger.info("AzureTableSharedLinkStore initialized")
244
+
245
+ async def initialize(self) -> None:
246
+ """Initializes the Azure Tables (creates them if they don't exist)."""
247
+ try:
248
+ # Create shared_links table
249
+ try:
250
+ await self.table_service_client.create_table(self.shared_links_table_name)
251
+ logger.info(f"Created Azure Table: {self.shared_links_table_name}")
252
+ except ResourceExistsError:
253
+ logger.debug(f"Azure Table already exists: {self.shared_links_table_name}")
254
+
255
+ # Create feedback table
256
+ try:
257
+ await self.table_service_client.create_table(self.feedback_table_name)
258
+ logger.info(f"Created Azure Table: {self.feedback_table_name}")
259
+ except ResourceExistsError:
260
+ logger.debug(f"Azure Table already exists: {self.feedback_table_name}")
261
+
262
+ logger.info("Azure Table Storage initialized successfully")
263
+ except Exception as e:
264
+ logger.error(f"Error initializing Azure Table Storage: {e}", exc_info=True)
265
+ raise
266
+
267
+ async def save_config(self, config: SharedLinkConfig) -> SharedLinkConfig:
268
+ """Saves a shared link configuration to Azure Table Storage."""
269
+ try:
270
+ table_client = self.table_service_client.get_table_client(self.shared_links_table_name)
271
+
272
+ entity = {
273
+ "PartitionKey": "shared_links", # Use a fixed partition key for simplicity
274
+ "RowKey": config.share_id,
275
+ "share_id": config.share_id,
276
+ "agent_name": config.agent_name,
277
+ "flock_definition": config.flock_definition,
278
+ "created_at": config.created_at.isoformat(),
279
+ "share_type": config.share_type,
280
+ "chat_message_key": config.chat_message_key,
281
+ "chat_history_key": config.chat_history_key,
282
+ "chat_response_key": config.chat_response_key,
283
+ }
284
+
285
+ await table_client.upsert_entity(entity)
286
+ logger.info(f"Saved shared link config to Azure Table Storage for ID: {config.share_id} with type: {config.share_type}")
287
+ return config
288
+ except Exception as e:
289
+ logger.error(f"Error saving config to Azure Table Storage for ID {config.share_id}: {e}", exc_info=True)
290
+ raise
291
+
292
+ async def get_config(self, share_id: str) -> SharedLinkConfig | None:
293
+ """Retrieves a shared link configuration from Azure Table Storage by its ID."""
294
+ try:
295
+ table_client = self.table_service_client.get_table_client(self.shared_links_table_name)
296
+
297
+ entity = await table_client.get_entity(partition_key="shared_links", row_key=share_id)
298
+
299
+ logger.debug(f"Retrieved shared link config from Azure Table Storage for ID: {share_id}")
300
+ return SharedLinkConfig(
301
+ share_id=entity["share_id"],
302
+ agent_name=entity["agent_name"],
303
+ created_at=entity["created_at"], # Pydantic will parse from ISO format
304
+ flock_definition=entity["flock_definition"],
305
+ share_type=entity.get("share_type", "agent_run"),
306
+ chat_message_key=entity.get("chat_message_key"),
307
+ chat_history_key=entity.get("chat_history_key"),
308
+ chat_response_key=entity.get("chat_response_key"),
309
+ )
310
+ except ResourceNotFoundError:
311
+ logger.debug(f"No shared link config found in Azure Table Storage for ID: {share_id}")
312
+ return None
313
+ except Exception as e:
314
+ logger.error(f"Error retrieving config from Azure Table Storage for ID {share_id}: {e}", exc_info=True)
315
+ return None
316
+
317
+ async def delete_config(self, share_id: str) -> bool:
318
+ """Deletes a shared link configuration from Azure Table Storage by its ID."""
319
+ try:
320
+ table_client = self.table_service_client.get_table_client(self.shared_links_table_name)
321
+
322
+ await table_client.delete_entity(partition_key="shared_links", row_key=share_id)
323
+ logger.info(f"Deleted shared link config from Azure Table Storage for ID: {share_id}")
324
+ return True
325
+ except ResourceNotFoundError:
326
+ logger.info(f"Attempted to delete non-existent shared link config from Azure Table Storage for ID: {share_id}")
327
+ return False
328
+ except Exception as e:
329
+ logger.error(f"Error deleting config from Azure Table Storage for ID {share_id}: {e}", exc_info=True)
330
+ return False
331
+
332
+ # ----------------------- Feedback methods -----------------------
333
+
334
+ async def save_feedback(self, record: FeedbackRecord) -> FeedbackRecord:
335
+ """Persist a feedback record to Azure Table Storage."""
336
+ try:
337
+ table_client = self.table_service_client.get_table_client(self.feedback_table_name)
338
+
339
+ entity = {
340
+ "PartitionKey": "feedback", # Use a fixed partition key for simplicity
341
+ "RowKey": record.feedback_id,
342
+ "feedback_id": record.feedback_id,
343
+ "share_id": record.share_id,
344
+ "context_type": record.context_type,
345
+ "reason": record.reason,
346
+ "expected_response": record.expected_response,
347
+ "actual_response": record.actual_response,
348
+ "flock_name": record.flock_name,
349
+ "agent_name": record.agent_name,
350
+ "flock_definition": record.flock_definition,
351
+ "created_at": record.created_at.isoformat(),
352
+ }
353
+
354
+ await table_client.upsert_entity(entity)
355
+ logger.info(f"Saved feedback to Azure Table Storage: {record.feedback_id} (share={record.share_id})")
356
+ return record
357
+ except Exception as e:
358
+ logger.error(f"Error saving feedback to Azure Table Storage {record.feedback_id}: {e}", exc_info=True)
359
+ raise
360
+
361
+
362
+ # ----------------------- Factory Function -----------------------
363
+
364
+ def create_shared_link_store(store_type: str | None = None, connection_string: str | None = None) -> SharedLinkStoreInterface:
365
+ """Factory function to create the appropriate shared link store based on configuration.
366
+
367
+ Args:
368
+ store_type: Type of store to create ("local" for SQLite, "azure-storage" for Azure Table Storage)
369
+ connection_string: Connection string for the store (file path for SQLite, connection string for Azure)
370
+
371
+ Returns:
372
+ Configured SharedLinkStoreInterface implementation
373
+ """
374
+ import os
375
+
376
+ # Get values from environment if not provided
377
+ if store_type is None:
378
+ store_type = os.getenv("FLOCK_WEBAPP_STORE", "local").lower()
379
+
380
+ if connection_string is None:
381
+ connection_string = os.getenv("FLOCK_WEBAPP_STORE_CONNECTION", ".flock/shared_links.db")
382
+
383
+ if store_type == "local":
384
+ return SQLiteSharedLinkStore(connection_string)
385
+ elif store_type == "azure-storage":
386
+ return AzureTableSharedLinkStore(connection_string)
387
+ else:
388
+ raise ValueError(f"Unsupported store type: {store_type}. Supported types: 'local', 'azure-storage'")