flock-core 0.4.0b21__py3-none-any.whl → 0.4.0b23__py3-none-any.whl

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.

@@ -0,0 +1,166 @@
1
+ # src/flock/routers/list_generator/iterative_list_router.py (New File)
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import Field
6
+
7
+ from flock.core.context.context import FlockContext
8
+ from flock.core.flock_agent import FlockAgent
9
+ from flock.core.flock_registry import flock_component
10
+ from flock.core.flock_router import (
11
+ FlockRouter,
12
+ FlockRouterConfig,
13
+ HandOffRequest,
14
+ )
15
+ from flock.core.logging.logging import get_logger
16
+
17
+ # Need signature utils
18
+
19
+ logger = get_logger("router.list_generator")
20
+
21
+
22
+ class IterativeListGeneratorRouterConfig(FlockRouterConfig):
23
+ target_list_field: str = Field(
24
+ ...,
25
+ description="Name of the final list output field (e.g., 'chapters').",
26
+ )
27
+ item_output_field: str = Field(
28
+ ...,
29
+ description="Name of the single item output field for each iteration (e.g., 'chapter').",
30
+ )
31
+ context_input_field: str = Field(
32
+ default="previous_items",
33
+ description="Input field name for passing back generated items (e.g., 'existing_chapters').",
34
+ )
35
+ max_iterations: int = Field(
36
+ default=10, description="Maximum number of items to generate."
37
+ )
38
+ # More advanced: termination_condition: Optional[Callable] = None
39
+ # Store iteration state in context under this prefix
40
+ context_state_prefix: str = Field(
41
+ default="flock.iterator_state_",
42
+ description="Prefix for context keys storing iteration state.",
43
+ )
44
+
45
+ # Field to extract item type from target_list_field signature
46
+ # This might require parsing the original agent's output signature
47
+ # item_type_str: Optional[str] = None # e.g., 'dict[str, str]' or 'MyChapterType'
48
+
49
+
50
+ @flock_component
51
+ class IterativeListGeneratorRouter(FlockRouter):
52
+ name: str = "iterative_list_generator"
53
+ config: IterativeListGeneratorRouterConfig = Field(
54
+ default_factory=IterativeListGeneratorRouterConfig
55
+ )
56
+
57
+ # Helper to get state keys
58
+ def _get_state_keys(self, agent_name: str) -> tuple[str, str]:
59
+ prefix = self.config.context_state_prefix
60
+ list_key = f"{prefix}{agent_name}_{self.config.target_list_field}"
61
+ count_key = f"{prefix}{agent_name}_iteration_count"
62
+ return list_key, count_key
63
+
64
+ async def route(
65
+ self,
66
+ current_agent: FlockAgent,
67
+ result: dict[str, Any],
68
+ context: FlockContext,
69
+ ) -> HandOffRequest:
70
+ list_key, count_key = self._get_state_keys(current_agent.name)
71
+
72
+ # --- State Initialization (First Run) ---
73
+ if count_key not in context.state:
74
+ logger.debug(
75
+ f"Initializing iterative list generation for '{self.config.target_list_field}' in agent '{current_agent.name}'."
76
+ )
77
+ context.set_variable(count_key, 0)
78
+ context.set_variable(list_key, [])
79
+ # Modify agent signature for the *first* iteration (remove context_input_field, use item_output_field)
80
+ # This requires modifying the agent's internal state or creating a temporary one.
81
+ # Let's try modifying the context passed to the *next* run instead.
82
+ context.set_variable(
83
+ f"{current_agent.name}.next_run_output_field",
84
+ self.config.item_output_field,
85
+ )
86
+ context.set_variable(
87
+ f"{current_agent.name}.next_run_input_fields_to_exclude",
88
+ {self.config.context_input_field},
89
+ )
90
+
91
+ # --- Process Result of Previous Iteration ---
92
+ iteration_count = context.get_variable(count_key, 0)
93
+ generated_items = context.get_variable(list_key, [])
94
+
95
+ # Get the single item generated in the *last* run
96
+ # The result dict should contain the 'item_output_field' if it wasn't the very first run
97
+ new_item = result.get(self.config.item_output_field)
98
+
99
+ if (
100
+ new_item is not None and iteration_count > 0
101
+ ): # Add item from previous run (not the init run)
102
+ generated_items.append(new_item)
103
+ context.set_variable(list_key, generated_items) # Update context
104
+ logger.info(
105
+ f"Added item #{iteration_count} to list '{self.config.target_list_field}' for agent '{current_agent.name}'."
106
+ )
107
+ elif iteration_count > 0:
108
+ logger.warning(
109
+ f"Iteration {iteration_count} for agent '{current_agent.name}' did not produce expected output field '{self.config.item_output_field}'."
110
+ )
111
+ # Decide how to handle: stop, retry, continue? Let's continue for now.
112
+
113
+ # Increment iteration count *after* processing the result of the previous one
114
+ current_iteration = iteration_count + 1
115
+ context.set_variable(count_key, current_iteration)
116
+
117
+ # --- Termination Check ---
118
+ if current_iteration > self.config.max_iterations:
119
+ logger.info(
120
+ f"Max iterations ({self.config.max_iterations}) reached for '{self.config.target_list_field}' in agent '{current_agent.name}'. Finalizing."
121
+ )
122
+ # Clean up state
123
+ del context.state[count_key]
124
+ # Final result should be the list itself under the target_list_field key
125
+ final_result = {self.config.target_list_field: generated_items}
126
+ # Handoff with empty next_agent to stop, but potentially override the *result*
127
+ # This is tricky. Routers usually decide the *next agent*, not the *final output*.
128
+ # Maybe the router should just signal termination, and the Flock run loop handles assembling the final output?
129
+ # Let's assume the router signals termination by returning next_agent=""
130
+ # The final list is already in the context under list_key.
131
+ # A final "AssemblerAgent" could read this context variable.
132
+ # OR we modify the HandOffRequest:
133
+ return HandOffRequest(
134
+ next_agent="", final_output_override=final_result
135
+ ) # Needs HandOffRequest modification
136
+
137
+ # --- Prepare for Next Iteration ---
138
+ logger.info(
139
+ f"Routing back to agent '{current_agent.name}' for item #{current_iteration} of '{self.config.target_list_field}'."
140
+ )
141
+
142
+ # The agent needs the context (previously generated items) and the original inputs again.
143
+ # We will pass the generated items via the context_input_field.
144
+ # The original inputs (like story_outline) should still be in the context.
145
+ next_input_override = {
146
+ self.config.context_input_field: generated_items # Pass the list back
147
+ }
148
+
149
+ # Modify agent signature for the *next* iteration (add context_input_field, use item_output_field)
150
+ # This is the trickiest part - how to modify the agent's perceived signature for the next run?
151
+ # Option 1: Pass overrides via HandOffRequest (cleanest)
152
+ next_signature_input = f"{current_agent.input}, {self.config.context_input_field}: list | Previously generated items" # Needs smarter joining
153
+ next_signature_output = (
154
+ self.config.item_output_field
155
+ ) # Only ask for one item
156
+
157
+ # This requires HandOffRequest and Flock execution loop to support signature overrides
158
+ return HandOffRequest(
159
+ next_agent=current_agent.name,
160
+ output_to_input_merge_strategy="add", # Add the context_input_field to existing context
161
+ input_override=next_input_override, # Provide the actual list data
162
+ # --- Hypothetical Overrides ---
163
+ next_run_input_signature_override=next_signature_input,
164
+ next_run_output_signature_override=next_signature_output,
165
+ # -----------------------------
166
+ )
@@ -140,7 +140,7 @@ class LLMRouter(FlockRouter):
140
140
  )
141
141
  return HandOffRequest(
142
142
  next_agent=next_agent_name,
143
- hand_off_mode="add",
143
+ output_to_input_merge_strategy="add",
144
144
  override_next_agent=None,
145
145
  override_context=None,
146
146
  )
@@ -171,8 +171,27 @@ async def run_agent(context: FlockContext) -> dict:
171
171
  # Prepare the next agent.
172
172
  try:
173
173
  agent = registry.get_agent(handoff_data.next_agent)
174
- if handoff_data.hand_off_mode == "add":
174
+ if handoff_data.output_to_input_merge_strategy == "add":
175
175
  agent.input = previous_agent_output + ", " + agent.input
176
+
177
+ if handoff_data.add_input_fields:
178
+ for field in handoff_data.add_input_fields:
179
+ agent.input = field + ", " + agent.input
180
+
181
+ if handoff_data.add_output_fields:
182
+ for field in handoff_data.add_output_fields:
183
+ agent.output = field + ", " + agent.output
184
+
185
+ if handoff_data.add_description:
186
+ if agent.description:
187
+ agent.description = (
188
+ agent.description
189
+ + "\n"
190
+ + handoff_data.add_description
191
+ )
192
+ else:
193
+ agent.description = handoff_data.add_description
194
+
176
195
  agent.resolve_callables(context=context)
177
196
  if not agent:
178
197
  logger.error(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flock-core
3
- Version: 0.4.0b21
3
+ Version: 0.4.0b23
4
4
  Summary: Declarative LLM Orchestration at Scale
5
5
  Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
6
6
  License-File: LICENSE
@@ -17,6 +17,7 @@ Requires-Dist: dspy==2.6.16
17
17
  Requires-Dist: duckduckgo-search>=7.3.2
18
18
  Requires-Dist: fastapi>=0.115.8
19
19
  Requires-Dist: httpx>=0.28.1
20
+ Requires-Dist: inspect-ai>=0.3.88
20
21
  Requires-Dist: litellm==1.63.7
21
22
  Requires-Dist: loguru>=0.7.3
22
23
  Requires-Dist: matplotlib>=3.10.0
@@ -20,12 +20,12 @@ flock/cli/yaml_editor.py,sha256=K3N0bh61G1TSDAZDnurqW9e_-hO6CtSQKXQqlDhCjVo,1252
20
20
  flock/cli/assets/release_notes.md,sha256=bqnk50jxM3w5uY44Dc7MkdT8XmRREFxrVBAG9XCOSSU,4896
21
21
  flock/core/__init__.py,sha256=p7lmQULRu9ejIAELfanZiyMhW0CougIPvyFHW2nqBFQ,847
22
22
  flock/core/flock.py,sha256=RcDUc__ukjUy9aSA_n0t8SxXCex4BV_nagTcg22peJ0,25116
23
- flock/core/flock_agent.py,sha256=ZmkiHd2oLao_263b7nmf26TQfyevX9_HNlhHPIkd3UM,33497
23
+ flock/core/flock_agent.py,sha256=Hqh9jh_m-8hc9n9qE34XvTiOx92s7Xu_yR87M0n7GPU,33187
24
24
  flock/core/flock_evaluator.py,sha256=dOXZeDOGZcAmJ9ahqq_2bdGUU1VOXY4skmwTVpAjiVw,1685
25
- flock/core/flock_factory.py,sha256=vLkCASLh7Vrb5NFjb4ZQT5xN3zsUDud51hAQxb82oTk,2993
25
+ flock/core/flock_factory.py,sha256=38cq0kovBhjulEecdnNk3MWSklX5lcdg0brhx49ixfQ,2993
26
26
  flock/core/flock_module.py,sha256=96aFVYAgwpKN53xGbivQDUpikOYGFCxK5mqhclOcxY0,3003
27
- flock/core/flock_registry.py,sha256=ekYpQgSkZVnbyPbl8gA7nf54brt94rYZZBe2RwEGtUc,20828
28
- flock/core/flock_router.py,sha256=A5GaxcGvtiFlRLHBTW7okh5RDm3BdKam2uXvRHRaj7k,2187
27
+ flock/core/flock_registry.py,sha256=KjLqJrCpCuvk4Ot5ASbRAWXwy5gHBneS_8IjttRPRnQ,22292
28
+ flock/core/flock_router.py,sha256=1OAXDsdaIIFApEfo6SRfFEDoTuGt3Si7n2MXiySEfis,2644
29
29
  flock/core/api/__init__.py,sha256=OKlhzDWZJfA6ddBwxQUmATY0TSzESsH032u00iVGvdA,228
30
30
  flock/core/api/endpoints.py,sha256=qQnJmtcYGkjdKtLllVpyJVjc-iZrvu5EEeVIryyt4tc,12987
31
31
  flock/core/api/main.py,sha256=glu9ThsYNTt35Ogjx732SGYJ9-aFftpvzLMQEJ7VuvQ,19189
@@ -56,7 +56,7 @@ flock/core/logging/span_middleware/baggage_span_processor.py,sha256=gJfRl8FeB6jd
56
56
  flock/core/logging/telemetry_exporter/base_exporter.py,sha256=rQJJzS6q9n2aojoSqwCnl7ZtHrh5LZZ-gkxUuI5WfrQ,1124
57
57
  flock/core/logging/telemetry_exporter/file_exporter.py,sha256=nKAjJSZtA7FqHSTuTiFtYYepaxOq7l1rDvs8U8rSBlA,3023
58
58
  flock/core/logging/telemetry_exporter/sqlite_exporter.py,sha256=CDsiMb9QcqeXelZ6ZqPSS56ovMPGqOu6whzBZRK__Vg,3498
59
- flock/core/mixin/dspy_integration.py,sha256=lB3VLBa5dnBJQOgdJCFGWC_0-XMyXmqCHmnCPFyrZuY,17197
59
+ flock/core/mixin/dspy_integration.py,sha256=JlGtakuy_lXXEEXBycd7ygmdUBKS-4qPWNqx3Wqfy78,17187
60
60
  flock/core/mixin/prompt_parser.py,sha256=eOqI-FK3y17gVqpc_y5GF-WmK1Jv8mFlkZxTcgweoxI,5121
61
61
  flock/core/serialization/__init__.py,sha256=CML7fPgG6p4c0CDBlJ_uwV1aZZhJKK9uy3IoIHfO87w,431
62
62
  flock/core/serialization/callable_registry.py,sha256=sUZECTZWsM3fJ8FDRQ-FgLNW9hF26nY17AD6fJKADMc,1419
@@ -64,7 +64,7 @@ flock/core/serialization/flock_serializer.py,sha256=TEePKaJqU-_XWHTMWyMHloDNwmkK
64
64
  flock/core/serialization/json_encoder.py,sha256=gAKj2zU_8wQiNvdkby2hksSA4fbPNwTjup_yz1Le1Vw,1229
65
65
  flock/core/serialization/secure_serializer.py,sha256=n5-zRvvXddgJv1FFHsaQ2wuYdL3WUSGPvG_LGaffEJo,6144
66
66
  flock/core/serialization/serializable.py,sha256=qlv8TsTqRuklXiNuCMrvro5VKz764xC2i3FlgLJSkdk,12129
67
- flock/core/serialization/serialization_utils.py,sha256=63CV41Jba29EEqS85h_6ADgbeYvVmfILmbXv742LiXQ,12702
67
+ flock/core/serialization/serialization_utils.py,sha256=AHRf90trgnj2Q6aaGaq5eja5PRcuJANUsp2wafGUeig,15257
68
68
  flock/core/tools/azure_tools.py,sha256=hwLnI2gsEq6QzUoWj5eCGDKTdXY1XUf6K-H5Uwva2MY,17093
69
69
  flock/core/tools/basic_tools.py,sha256=Ye7nlI4RRkqWRy8nH9CKuItBmh_ZXxUpouGnCOfx0s0,9050
70
70
  flock/core/tools/llm_tools.py,sha256=Bdt4Dpur5dGpxd2KFEQyxjfZazvW1HCDKY6ydMj6UgQ,21811
@@ -74,14 +74,15 @@ flock/core/tools/dev_tools/github.py,sha256=a2OTPXS7kWOVA4zrZHynQDcsmEi4Pac5MfSj
74
74
  flock/core/util/cli_helper.py,sha256=EnK4X-FgaO71JsSXLdy0R-cxE3UctlFZtzldursw-Bw,49845
75
75
  flock/core/util/file_path_utils.py,sha256=Odf7uU32C-x1KNighbNERSiMtkzW4h8laABIoFK7A5M,6246
76
76
  flock/core/util/hydrator.py,sha256=QJvCA8F4nkSP5akp3yg0cT6oaajOr1n7sldW5dCs6Lo,10733
77
- flock/core/util/input_resolver.py,sha256=g9vDPdY4OH-G7qjas5ksGEHueokHGFPMoLOvC-ngeLo,5984
77
+ flock/core/util/input_resolver.py,sha256=ttFiz5L_uzSvxEhWOPL09WfLF--RlLOikLP5hrgE7Mo,6138
78
78
  flock/core/util/loader.py,sha256=j3q2qem5bFMP2SmMuYjb-ISxsNGNZd1baQmpvAnRUUk,2244
79
- flock/evaluators/declarative/declarative_evaluator.py,sha256=nagYTKqoduQ968Pij4bZh0584RYH4MDPdYnh9dtaYHc,5905
79
+ flock/evaluators/declarative/declarative_evaluator.py,sha256=gdB1w6_stRhU91D21O9sxqkMbF9VRvaiV6-trwjYLpM,6107
80
80
  flock/evaluators/memory/azure_search_evaluator.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  flock/evaluators/memory/memory_evaluator.py,sha256=SmerXyNaqm8DTV0yw-WqWkn9DXIf6x-nPG1eyTV6NY8,3452
82
82
  flock/evaluators/natural_language/natural_language_evaluator.py,sha256=6nVEeh8_uwv_h-d3FWlA0GbzDzRtdhvxCGKirHtyvOU,2012
83
83
  flock/evaluators/test/test_case_evaluator.py,sha256=9vVhYbRrq68TNn8wo9z_yFD4UydhPKlygzy0mDmLLJU,1124
84
84
  flock/evaluators/zep/zep_evaluator.py,sha256=9NOELl7JAuUcx_FQrxY6b-_vN3MjwDyW7ZppPIGeCFc,1954
85
+ flock/modules/assertion/assertion_module.py,sha256=f4hUxqB-KsDXJF2FQJ7hIv-0jJZ_g2Sa0scdgozW1Js,12824
85
86
  flock/modules/azure-search/azure_search_module.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
87
  flock/modules/callback/callback_module.py,sha256=volGGgHtY19qj1wHR6m5a_hmXSbV3Ca3uY6I76YmcfU,2833
87
88
  flock/modules/memory/memory_module.py,sha256=bSkdFBW-Pp5ldHhXi8v4kfRM7zknfLR2fsOtbTosucI,14916
@@ -94,12 +95,15 @@ flock/platform/docker_tools.py,sha256=fpA7-6rJBjPOUBLdQP4ny2QPgJ_042nmqRn5GtKnoY
94
95
  flock/platform/jaeger_install.py,sha256=MyOMJQx4TQSMYvdUJxfiGSo3YCtsfkbNXcAcQ9bjETA,2898
95
96
  flock/routers/__init__.py,sha256=w9uL34Auuo26-q_EGlE8Z9iHsw6S8qutTAH_ZI7pn7M,39
96
97
  flock/routers/agent/__init__.py,sha256=0ZOYpR8BMnR5iCGfcUiv99g7aT_g13xvm2Shl-XzybY,65
97
- flock/routers/agent/agent_router.py,sha256=9s3AwcBqpyhpPXOTqyMSVtS8Bcme1RDdqSUfWIqEBfc,8139
98
+ flock/routers/agent/agent_router.py,sha256=uSLWlVTGNspp1WZf1rut-58Yxit6ud33aNT3mqbbVJc,8224
98
99
  flock/routers/agent/handoff_agent.py,sha256=p-0XEPXIyv1T3DGAhhXg2SYXmrwEaJ5pnuLgRSvbiZg,1903
100
+ flock/routers/conditional/conditional_router.py,sha256=G4zulYBVo4xd6ExJrszmqYa5pyOsE6GXoD5MugNQa78,21223
99
101
  flock/routers/default/__init__.py,sha256=DOatGX_aE2DWvf55a0Tv7qDK05QFD-hL3sm7g58hmLU,61
100
- flock/routers/default/default_router.py,sha256=D9TCAAeNfzt3Se6QduGO2TmZ6038XlQLV6Y1u5IGI-0,2232
102
+ flock/routers/default/default_router.py,sha256=wKbZFBSL9VhHjm5fzEVMwGkyRtmO3_lfmRnZ02BFeQ8,2279
103
+ flock/routers/feedback/feedback_router.py,sha256=fFHUGnmKBAfdzgIh7EzjHOdEntgTN59JWpc_GsHAawo,4907
104
+ flock/routers/list_generator/list_generator_router.py,sha256=OWnZJNfYCL-V78WxyUNlb8S48xj0-VE59d8XOpppvzk,7692
101
105
  flock/routers/llm/__init__.py,sha256=OV89ebq8RPWZwCJTS2_P46Q0yKD_03rwq_fBOsETd08,63
102
- flock/routers/llm/llm_router.py,sha256=3WXUK2TqZENYXSFb7o_WtpONq0SsebaZZpytCRr1daw,12217
106
+ flock/routers/llm/llm_router.py,sha256=k2nxWxkBZaOPByiwUIYjN7N5jcFNAmqhSZm0LcF0tok,12234
103
107
  flock/themes/3024-day.toml,sha256=uOVHqEzSyHx0WlUk3D0lne4RBsNBAPCTy3C58yU7kEY,667
104
108
  flock/themes/3024-night.toml,sha256=qsXUwd6ZYz6J-R129_Ao2TKlvvK60svhZJJjB5c8Tfo,1667
105
109
  flock/themes/aardvark-blue.toml,sha256=5ZgsxP3pWLPN3yJ2Wd9ErCo7fy_VJpIfje4kriDKlqo,1667
@@ -437,12 +441,12 @@ flock/themes/zenburned.toml,sha256=UEmquBbcAO3Zj652XKUwCsNoC2iQSlIh-q5c6DH-7Kc,1
437
441
  flock/themes/zenwritten-dark.toml,sha256=To5l6520_3UqAGiEumpzGWsHhXxqu9ThrMildXKgIO0,1669
438
442
  flock/themes/zenwritten-light.toml,sha256=G1iEheCPfBNsMTGaVpEVpDzYBHA_T-MV27rolUYolmE,1666
439
443
  flock/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
440
- flock/workflow/activities.py,sha256=eVZDnxGJl_quNO-UTV3YgvTV8LrRaHN3QDAA1ANKzac,9065
444
+ flock/workflow/activities.py,sha256=Rcgcepa-RzaEjKo2aNuI14O_sX8ij0RrqeyPa0oSw8M,9910
441
445
  flock/workflow/agent_activities.py,sha256=NhBZscflEf2IMfSRa_pBM_TRP7uVEF_O0ROvWZ33eDc,963
442
446
  flock/workflow/temporal_setup.py,sha256=VWBgmBgfTBjwM5ruS_dVpA5AVxx6EZ7oFPGw4j3m0l0,1091
443
447
  flock/workflow/workflow.py,sha256=I9MryXW_bqYVTHx-nl2epbTqeRy27CAWHHA7ZZA0nAk,1696
444
- flock_core-0.4.0b21.dist-info/METADATA,sha256=q4rcJrfPWmenOfchiag5UQhLaLmdr68TE-f7G6p7Hd8,12970
445
- flock_core-0.4.0b21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
446
- flock_core-0.4.0b21.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
447
- flock_core-0.4.0b21.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
448
- flock_core-0.4.0b21.dist-info/RECORD,,
448
+ flock_core-0.4.0b23.dist-info/METADATA,sha256=jiZmPSrAwNEiyugjNKF63f0qloquD8CFWb8SWodU588,13004
449
+ flock_core-0.4.0b23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
450
+ flock_core-0.4.0b23.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
451
+ flock_core-0.4.0b23.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
452
+ flock_core-0.4.0b23.dist-info/RECORD,,