flock-core 0.4.508__py3-none-any.whl → 0.4.510__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.

@@ -250,7 +250,7 @@ loguru_logger.add(
250
250
  colorize=True,
251
251
  format=custom_format,
252
252
  )
253
- logging.basicConfig(level=LOG_LEVELS["NO_LOGS"])
253
+ logging.basicConfig(level=LOG_LEVELS["ERROR"]) # Default to ERROR level for fallback
254
254
  # Optionally add a file handler, e.g.:
255
255
  # loguru_logger.add("logs/flock.log", rotation="100 MB", retention="30 days", level="DEBUG")
256
256
 
@@ -515,7 +515,7 @@ def get_logger(name: str = "flock") -> FlockLogger:
515
515
  if name not in _LOGGER_CACHE:
516
516
  # New loggers default to errors-only (min_level_severity = ERROR_SEVERITY)
517
517
  # until explicitly configured by configure_logging()
518
- _LOGGER_CACHE[name] = FlockLogger(name, LOG_LEVELS["NO_LOGS"])
518
+ _LOGGER_CACHE[name] = FlockLogger(name, LOG_LEVELS["ERROR"])
519
519
  # The min_level_severity state of existing or newly created loggers
520
520
  # should be managed by the configure_logging() function.
521
521
  return _LOGGER_CACHE[name]
flock/tools/__init__.py CHANGED
@@ -1,188 +0,0 @@
1
- from .azure_tools import (
2
- azure_search_create_index,
3
- azure_search_create_vector_index,
4
- azure_search_delete_documents,
5
- azure_search_get_document,
6
- azure_search_get_index_statistics,
7
- azure_search_initialize_clients,
8
- azure_search_list_indexes,
9
- azure_search_query,
10
- azure_search_upload_documents,
11
- azure_storage_create_container,
12
- azure_storage_delete_blob,
13
- azure_storage_delete_container,
14
- azure_storage_download_blob_to_bytes,
15
- azure_storage_download_blob_to_file,
16
- azure_storage_download_blob_to_text,
17
- azure_storage_get_blob_properties,
18
- azure_storage_list_blobs,
19
- azure_storage_list_containers,
20
- azure_storage_upload_blob_bytes,
21
- azure_storage_upload_blob_from_file,
22
- azure_storage_upload_blob_text,
23
- )
24
- from .code_tools import code_code_eval, code_evaluate_math
25
- from .file_tools import (
26
- file_get_anything_as_markdown,
27
- file_json_parse_safe,
28
- file_json_search,
29
- file_read_from_file,
30
- file_save_to_file,
31
- )
32
- from .github_tools import (
33
- github_create_files,
34
- github_create_user_stories_as_github_issue,
35
- github_upload_readme,
36
- )
37
- from .markdown_tools import (
38
- markdown_extract_code_blocks,
39
- markdown_extract_links,
40
- markdown_extract_tables,
41
- markdown_split_by_headers,
42
- markdown_to_plain_text,
43
- )
44
- from .text_tools import (
45
- text_calculate_hash,
46
- text_chunking_for_embedding,
47
- text_clean_text,
48
- text_count_tokens,
49
- text_count_tokens_estimate,
50
- text_count_words,
51
- text_detect_language,
52
- text_extract_json_from_text,
53
- text_extract_keywords,
54
- text_extract_numbers,
55
- text_extract_urls,
56
- text_format_chat_history,
57
- text_format_table_from_dicts,
58
- text_recursive_splitter,
59
- text_split_by_characters,
60
- text_split_by_sentences,
61
- text_split_by_separator,
62
- text_split_by_tokens,
63
- text_split_code_by_functions,
64
- text_tiktoken_split,
65
- text_truncate_to_token_limit,
66
- )
67
- from .web_tools import (
68
- web_content_as_markdown,
69
- web_search_bing,
70
- web_search_duckduckgo,
71
- web_search_tavily,
72
- )
73
- from .zendesk_tools import (
74
- zendesk_get_article_by_id,
75
- zendesk_get_articles,
76
- zendesk_get_comments_by_ticket_id,
77
- zendesk_get_ticket_by_id,
78
- zendesk_get_tickets,
79
- zendesk_search_articles,
80
- )
81
-
82
- storage_tools = [
83
- azure_storage_list_containers,
84
- azure_storage_create_container,
85
- azure_storage_delete_container,
86
- azure_storage_list_blobs,
87
- azure_storage_upload_blob_text,
88
- azure_storage_upload_blob_bytes,
89
- azure_storage_upload_blob_from_file,
90
- azure_storage_download_blob_to_text,
91
- azure_storage_download_blob_to_bytes,
92
- azure_storage_download_blob_to_file,
93
- azure_storage_delete_blob,
94
- azure_storage_get_blob_properties,
95
- ]
96
-
97
- azure_search_tools = [
98
- azure_search_initialize_clients,
99
- azure_search_create_index,
100
- azure_search_upload_documents,
101
- azure_search_query,
102
- azure_search_get_document,
103
- azure_search_delete_documents,
104
- azure_search_list_indexes,
105
- azure_search_get_index_statistics,
106
- azure_search_create_vector_index,
107
- ]
108
-
109
- file_tools_collection = [
110
- file_get_anything_as_markdown,
111
- file_save_to_file,
112
- file_read_from_file,
113
- file_json_parse_safe,
114
- file_json_search,
115
- ]
116
-
117
- code_tools_collection = [code_evaluate_math, code_code_eval]
118
-
119
- web_tools_collection = [
120
- web_content_as_markdown,
121
- web_search_bing,
122
- web_search_duckduckgo,
123
- web_search_tavily,
124
- ]
125
-
126
- github_tools_collection = [
127
- github_create_user_stories_as_github_issue,
128
- github_upload_readme,
129
- github_create_files,
130
- ]
131
-
132
- llm_processing_tools = [
133
- text_split_by_sentences,
134
- text_split_by_characters,
135
- text_split_by_tokens,
136
- text_split_by_separator,
137
- text_recursive_splitter,
138
- text_chunking_for_embedding,
139
- text_split_code_by_functions,
140
- text_count_tokens,
141
- text_count_tokens_estimate,
142
- text_truncate_to_token_limit,
143
- text_extract_keywords,
144
- text_clean_text,
145
- text_format_chat_history,
146
- text_extract_json_from_text,
147
- text_calculate_hash,
148
- text_format_table_from_dicts,
149
- text_detect_language,
150
- text_tiktoken_split,
151
- text_count_words,
152
- text_extract_urls,
153
- text_extract_numbers,
154
- ]
155
-
156
- markdown_processing_tools = [
157
- markdown_split_by_headers,
158
- markdown_extract_code_blocks,
159
- markdown_extract_links,
160
- markdown_extract_tables,
161
- markdown_to_plain_text,
162
- ]
163
-
164
- zendesk_tools_collection = [
165
- zendesk_get_tickets,
166
- zendesk_get_ticket_by_id,
167
- zendesk_get_comments_by_ticket_id,
168
- zendesk_get_article_by_id,
169
- zendesk_get_articles,
170
- zendesk_search_articles,
171
- ]
172
-
173
- __all__ = [
174
- "azure_search_tools",
175
- "code_tools_collection",
176
- "file_tools_collection",
177
- "github_tools_collection",
178
- "llm_processing_tools",
179
- "markdown_processing_tools",
180
- "storage_tools",
181
- "web_tools_collection",
182
- "zendesk_tools_collection",
183
- ]
184
-
185
- # If there was existing content in __init__.py, this approach might overwrite it.
186
- # A safer approach if __init__.py might exist and have other critical initializations
187
- # would be to read it first, then append/modify.
188
- # For now, assuming a fresh creation or simple __init__.py.
@@ -3,6 +3,10 @@
3
3
  import os
4
4
 
5
5
  import httpx
6
+ from mcp.server.fastmcp import FastMCP
7
+
8
+ mcp = FastMCP("ZendeskTools")
9
+
6
10
 
7
11
  ZENDESK_BEARER_TOKEN = os.getenv("ZENDESK_BEARER_TOKEN")
8
12
 
@@ -12,6 +16,7 @@ HEADERS = {
12
16
  }
13
17
 
14
18
 
19
+ @mcp.tool()
15
20
  def zendesk_get_tickets(number_of_tickets: int = 10) -> list[dict]:
16
21
  """Get all tickets."""
17
22
  ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
@@ -30,7 +35,7 @@ def zendesk_get_tickets(number_of_tickets: int = 10) -> list[dict]:
30
35
  url = data.get("next_page")
31
36
  return all_tickets
32
37
 
33
-
38
+ @mcp.tool()
34
39
  def zendesk_get_ticket_by_id(ticket_id: str) -> dict:
35
40
  """Get a ticket by ID."""
36
41
  ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
@@ -41,7 +46,7 @@ def zendesk_get_ticket_by_id(ticket_id: str) -> dict:
41
46
  response.raise_for_status()
42
47
  return response.json()["ticket"]
43
48
 
44
-
49
+ @mcp.tool()
45
50
  def zendesk_get_comments_by_ticket_id(ticket_id: str) -> list[dict]:
46
51
  """Get all comments for a ticket."""
47
52
  ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_TICKET")
@@ -52,7 +57,7 @@ def zendesk_get_comments_by_ticket_id(ticket_id: str) -> list[dict]:
52
57
  response.raise_for_status()
53
58
  return response.json()["comments"]
54
59
 
55
-
60
+ @mcp.tool()
56
61
  def zendesk_get_article_by_id(article_id: str) -> dict:
57
62
  """Get an article by ID."""
58
63
  ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE")
@@ -66,7 +71,7 @@ def zendesk_get_article_by_id(article_id: str) -> dict:
66
71
  response.raise_for_status()
67
72
  return response.json()["article"]
68
73
 
69
-
74
+ @mcp.tool()
70
75
  def zendesk_get_articles() -> list[dict]:
71
76
  """Get all articles."""
72
77
  ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE")
@@ -78,7 +83,45 @@ def zendesk_get_articles() -> list[dict]:
78
83
  response.raise_for_status()
79
84
  return response.json()["articles"]
80
85
 
86
+ @mcp.tool()
87
+ def zendesk_get_articles_count() -> int:
88
+ """
89
+ Count every Help-Center article in the configured locale.
90
+
91
+ Uses cursor pagination (page[size]=100) because it’s faster and
92
+ has no 10 000-record ceiling. Falls back to offset pagination
93
+ if the account hasn’t been migrated yet.
94
+ """
95
+ ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE") # e.g. "en-us"
96
+ ZENDESK_SUBDOMAIN = os.getenv("ZENDESK_SUBDOMAIN_ARTICLE")
97
+ BASE_URL = f"https://{ZENDESK_SUBDOMAIN}.zendesk.com"
98
+ url = (
99
+ f"{BASE_URL}/api/v2/help_center/{ZENDESK_LOCALE}/articles.json"
100
+ "?page[size]=100" # max page size for HC APIs
101
+ )
102
+
103
+ total = 0
104
+ with httpx.Client(headers=HEADERS, timeout=30.0) as client:
105
+ while url:
106
+ resp = client.get(url)
107
+ resp.raise_for_status()
108
+ data = resp.json()
109
+
110
+ total += len(data.get("articles", []))
111
+ print(f"Locale: {ZENDESK_LOCALE}")
112
+ print(f"Number of articles: {total}")
113
+
114
+ # Cursor pagination (preferred)
115
+ if data.get("meta", {}).get("has_more"):
116
+ url = data.get("links", {}).get("next")
117
+ continue
118
+
119
+ # Offset pagination fallback
120
+ url = data.get("next_page")
121
+
122
+ return total
81
123
 
124
+ @mcp.tool()
82
125
  def zendesk_search_articles(query: str) -> list[dict]:
83
126
  """Search Zendesk Help Center articles using a query string."""
84
127
  ZENDESK_LOCALE = os.getenv("ZENDESK_ARTICLE_LOCALE") # e.g., "en-us"
@@ -97,3 +140,8 @@ def zendesk_search_articles(query: str) -> list[dict]:
97
140
  response = client.get(url, params=params)
98
141
  response.raise_for_status()
99
142
  return response.json().get("results", [])
143
+
144
+
145
+ if __name__ == "__main__":
146
+ transport = os.getenv("ZENDESK_MCP_TRANSPORT", "stdio")
147
+ mcp.run(transport=transport)
flock/webapp/app/main.py CHANGED
@@ -24,6 +24,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse
24
24
  from fastapi.staticfiles import StaticFiles
25
25
  from fastapi.templating import Jinja2Templates
26
26
  from pydantic import BaseModel
27
+ from typing import Any
27
28
 
28
29
  from flock.core.api.endpoints import create_api_router
29
30
  from flock.core.api.run_store import RunStore
@@ -147,23 +148,30 @@ async def lifespan(app: FastAPI):
147
148
  set_global_shared_link_store(shared_link_store)
148
149
  logger.info("SharedLinkStore initialized and set globally.")
149
150
  except Exception as e:
150
- logger.error(f"Failed to initialize SharedLinkStore: {e}", exc_info=True)
151
-
152
- # Configure chat features based on environment variables
153
- # These are typically set by __init__.py when launching with --chat or --web --chat
154
- flock_start_mode = os.environ.get("FLOCK_START_MODE")
155
- flock_chat_enabled_env = os.environ.get("FLOCK_CHAT_ENABLED", "false").lower() == "true"
156
-
157
- should_enable_chat_routes = False
158
- if flock_start_mode == "chat":
151
+ logger.error(f"Failed to initialize SharedLinkStore: {e}", exc_info=True) # Configure chat features with clear precedence:
152
+ # 1. Value set by start_unified_server (programmatic)
153
+ # 2. Environment variables (standalone mode)
154
+ programmatic_chat_enabled = getattr(app.state, "chat_enabled", None)
155
+ env_start_mode = os.environ.get("FLOCK_START_MODE")
156
+ env_chat_enabled = os.environ.get("FLOCK_CHAT_ENABLED", "false").lower() == "true"
157
+
158
+ if programmatic_chat_enabled is not None:
159
+ # Programmatic setting takes precedence (from start_unified_server)
160
+ should_enable_chat_routes = programmatic_chat_enabled
161
+ logger.info(f"Using programmatic chat_enabled setting: {should_enable_chat_routes}")
162
+ elif env_start_mode == "chat":
159
163
  should_enable_chat_routes = True
160
- app.state.initial_redirect_to_chat = True # Signal dashboard to redirect
161
- logger.info("FLOCK_START_MODE='chat'. Chat routes will be enabled and initial redirect to chat is set.")
162
- elif flock_chat_enabled_env:
164
+ app.state.initial_redirect_to_chat = True
165
+ app.state.chat_enabled = True
166
+ logger.info("FLOCK_START_MODE='chat'. Enabling chat routes and setting redirect.")
167
+ elif env_chat_enabled:
163
168
  should_enable_chat_routes = True
164
- logger.info("FLOCK_CHAT_ENABLED='true'. Chat routes will be enabled.")
165
-
166
- app.state.chat_enabled = should_enable_chat_routes # For context in templates
169
+ app.state.chat_enabled = True
170
+ logger.info("FLOCK_CHAT_ENABLED='true'. Enabling chat routes.")
171
+ else:
172
+ should_enable_chat_routes = False
173
+ app.state.chat_enabled = False
174
+ logger.info("Chat routes disabled (no programmatic or environment setting).")
167
175
 
168
176
  if should_enable_chat_routes:
169
177
  try:
@@ -171,10 +179,8 @@ async def lifespan(app: FastAPI):
171
179
  app.include_router(chat_router, tags=["Chat"])
172
180
  logger.info("Chat routes included in the application.")
173
181
  except Exception as e:
174
- logger.error(f"Failed to include chat routes during lifespan startup: {e}", exc_info=True)
175
-
176
- # If in standalone chat mode, strip non-essential UI routes
177
- if flock_start_mode == "chat":
182
+ logger.error(f"Failed to include chat routes during lifespan startup: {e}", exc_info=True) # If in standalone chat mode, strip non-essential UI routes
183
+ if env_start_mode == "chat":
178
184
  from fastapi.routing import APIRoute
179
185
  logger.info("FLOCK_START_MODE='chat'. Stripping non-chat UI routes.")
180
186
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flock-core
3
- Version: 0.4.508
3
+ Version: 0.4.510
4
4
  Summary: Declarative LLM Orchestration at Scale
5
5
  Author-email: Andre Ratzenberger <andre.ratzenberger@whiteduck.de>
6
6
  License-File: LICENSE
@@ -52,7 +52,7 @@ flock/core/execution/local_executor.py,sha256=rnIQvaJOs6zZORUcR3vvyS6LPREDJTjayg
52
52
  flock/core/execution/temporal_executor.py,sha256=dHcb0xuzPFWU_wbwTgI7glLNyyppei93Txs2sapjhaw,6283
53
53
  flock/core/interpreter/python_interpreter.py,sha256=RaUMZuufsKBNQ4FAeSaOgUuxzs8VYu5TgUUs-xwaxxM,26376
54
54
  flock/core/logging/__init__.py,sha256=xn5fC-8IgsdIv0ywe_cICK1KVhTrVD8t-jYORg0ETUA,155
55
- flock/core/logging/logging.py,sha256=Tgbyu_Ah2g9keD_uQZXNeGsEQuCapGBBKvLiF7L2UrE,19506
55
+ flock/core/logging/logging.py,sha256=-fYk4rv41LUbSLCzaSApg3cFTAk04bDR64-4ve-2mHk,19541
56
56
  flock/core/logging/telemetry.py,sha256=Trssqx02SBovTL843YwY3L-ZGj3KvcfMHLMU7Syk8L0,6561
57
57
  flock/core/logging/trace_and_logged.py,sha256=5vNrK1kxuPMoPJ0-QjQg-EDJL1oiEzvU6UNi6X8FiMs,2117
58
58
  flock/core/logging/formatters/enum_builder.py,sha256=LgEYXUv84wK5vwHflZ5h8HBGgvLH3sByvUQe8tZiyY0,981
@@ -473,7 +473,7 @@ flock/themes/zenburn.toml,sha256=NxOAR3cx-Z9PVErEKHFZ6jsjfKBtPmfyN_vGSri5_qo,171
473
473
  flock/themes/zenburned.toml,sha256=UEmquBbcAO3Zj652XKUwCsNoC2iQSlIh-q5c6DH-7Kc,1664
474
474
  flock/themes/zenwritten-dark.toml,sha256=To5l6520_3UqAGiEumpzGWsHhXxqu9ThrMildXKgIO0,1669
475
475
  flock/themes/zenwritten-light.toml,sha256=G1iEheCPfBNsMTGaVpEVpDzYBHA_T-MV27rolUYolmE,1666
476
- flock/tools/__init__.py,sha256=rVCbfZvX_prgSwSbX9i5oCN0nt3jASusXsksVPU70A8,5098
476
+ flock/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
477
477
  flock/tools/azure_tools.py,sha256=OTJsb0B4l70GcD1W3ZMDHWd3X8nEnszhhz2sllD2z9E,30187
478
478
  flock/tools/code_tools.py,sha256=CRDi3iIN4NQcgz4TJ4b-thFq7uXW_gIXPk-iEoWhF4E,1356
479
479
  flock/tools/file_tools.py,sha256=zbXo5SxyKYLvrE7k3vLF5tGxCeuaeJtCCdWQ1fXJMAA,4626
@@ -482,14 +482,14 @@ flock/tools/markdown_tools.py,sha256=94fjGAJ5DEutoioD0ke-YRbxF6IWJQKuPVBLkNqdBo4
482
482
  flock/tools/system_tools.py,sha256=IUB8MiSxtQH5ZfTGOck3vl4TKva8m1lfU4-W5D5b-4w,202
483
483
  flock/tools/text_tools.py,sha256=mMQ8tkyYDxIorqqzl9ccGyWYjrSynYiYFIeP9qypfdg,22491
484
484
  flock/tools/web_tools.py,sha256=Wl3qO5lKq4PYtmYahgeFGBQ8tDC0uKY4k9A1Zn-MqFw,2588
485
- flock/tools/zendesk_tools.py,sha256=HQ7qBVSrRfemwolz0IOXl8Z02vJCLE6mTd-cARVdX88,3576
485
+ flock/tools/zendesk_tools.py,sha256=e7KMfHVl7wGbstwdz9CvoChyuoZfpS9n4TEtvrxawgI,5162
486
486
  flock/webapp/__init__.py,sha256=YtRbbyciN3Z2oMB9fdXZuvM3e49R8m2mY5qHLDoapRA,37
487
487
  flock/webapp/run.py,sha256=Ekg-mQSl7RUDJAEDTBJMIlLyvhWqWPMjg8hPqmgFREE,8945
488
488
  flock/webapp/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
489
489
  flock/webapp/app/chat.py,sha256=d5a_mr3H2nuWNFSpSlI_HyqX-J_4krndd4A-8S25EKM,28679
490
490
  flock/webapp/app/config.py,sha256=lqmneujnNZk-EFJV5cWpvxkqisxH3T3zT_YOI0JYThE,4809
491
491
  flock/webapp/app/dependencies.py,sha256=JUcwY1N6SZplU141lMN2wk9dOC9er5HCedrKTJN9wJk,5533
492
- flock/webapp/app/main.py,sha256=n5cTAFyuLXayolYAN_UnmiMAKoEE6_G4tmfSEc0Poog,53807
492
+ flock/webapp/app/main.py,sha256=g3kjtzJOC0UzWBBT4D9KyBKJxQWM1TkxHgsDaFqNuGs,54247
493
493
  flock/webapp/app/models_ui.py,sha256=vrEBLbhEp6FziAgBSFOLT1M7ckwadsTdT7qus5_NduE,329
494
494
  flock/webapp/app/theme_mapper.py,sha256=QzWwLWpED78oYp3FjZ9zxv1KxCyj43m8MZ0fhfzz37w,34302
495
495
  flock/webapp/app/utils.py,sha256=RF8DMKKAj1XPmm4txUdo2OdswI1ATQ7cqUm6G9JFDzA,2942
@@ -554,8 +554,8 @@ flock/workflow/agent_execution_activity.py,sha256=Gy6FtuVAjf0NiUXmC3syS2eJpNQF4R
554
554
  flock/workflow/flock_workflow.py,sha256=iSUF_soFvWar0ffpkzE4irkDZRx0p4HnwmEBi_Ne2sY,9666
555
555
  flock/workflow/temporal_config.py,sha256=3_8O7SDEjMsSMXsWJBfnb6XTp0TFaz39uyzSlMTSF_I,3988
556
556
  flock/workflow/temporal_setup.py,sha256=YIHnSBntzOchHfMSh8hoLeNXrz3B1UbR14YrR6soM7A,1606
557
- flock_core-0.4.508.dist-info/METADATA,sha256=_THooyyskEuH1CU8OfPv_CcHecZ1lEtSTFjeoOS5Q24,22584
558
- flock_core-0.4.508.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
559
- flock_core-0.4.508.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
560
- flock_core-0.4.508.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
561
- flock_core-0.4.508.dist-info/RECORD,,
557
+ flock_core-0.4.510.dist-info/METADATA,sha256=dvIk6QrWRGCj3KgVkZWt6Lzi_d5eoAGbM_zRZLlLlnA,22584
558
+ flock_core-0.4.510.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
559
+ flock_core-0.4.510.dist-info/entry_points.txt,sha256=rWaS5KSpkTmWySURGFZk6PhbJ87TmvcFQDi2uzjlagQ,37
560
+ flock_core-0.4.510.dist-info/licenses/LICENSE,sha256=iYEqWy0wjULzM9GAERaybP4LBiPeu7Z1NEliLUdJKSc,1072
561
+ flock_core-0.4.510.dist-info/RECORD,,