Joseph Pollack commited on
Commit
345f6b1
·
unverified ·
1 Parent(s): 2f4eb9e

final countdown

Browse files
Files changed (46) hide show
  1. AUDIO_INPUT_FIX.md +1 -0
  2. ERROR_FIXES_SUMMARY.md +1 -0
  3. FILE_OUTPUT_IMPLEMENTATION_PLAN.md +1 -0
  4. FILE_OUTPUT_VERIFICATION.md +1 -0
  5. FIX_SUMMARY.md +1 -0
  6. MULTIMODAL_SETTINGS_IMPLEMENTATION_PLAN.md +1 -0
  7. MULTIMODAL_SETTINGS_IMPLEMENTATION_SUMMARY.md +1 -0
  8. PDF_REPORT_INTEGRATION.md +1 -0
  9. REPORT_WRITING_AGENTS_ANALYSIS.md +1 -0
  10. SERPER_WEBSEARCH_IMPLEMENTATION_PLAN.md +1 -0
  11. dev/__init__.py +1 -0
  12. docs/api/agents.md +1 -0
  13. docs/api/models.md +1 -0
  14. docs/api/services.md +1 -0
  15. docs/api/tools.md +1 -0
  16. docs/architecture/agents.md +1 -0
  17. docs/contributing/code-quality.md +1 -0
  18. docs/contributing/code-style.md +1 -0
  19. docs/contributing/error-handling.md +1 -0
  20. docs/contributing/implementation-patterns.md +1 -0
  21. docs/contributing/index.md +1 -0
  22. docs/contributing/prompt-engineering.md +1 -0
  23. docs/contributing/testing.md +1 -0
  24. docs/getting-started/installation.md +1 -0
  25. docs/implementation/IMPLEMENTATION_SUMMARY.md +1 -0
  26. docs/implementation/TTS_MODAL_IMPLEMENTATION.md +1 -0
  27. docs/license.md +1 -0
  28. docs/team.md +1 -0
  29. new_env.txt +1 -0
  30. pyproject.toml +1 -0
  31. requirements.txt +17 -0
  32. src/middleware/state_machine.py +1 -0
  33. src/tools/searchxng_web_search.py +1 -0
  34. src/tools/serper_web_search.py +1 -0
  35. src/tools/vendored/crawl_website.py +1 -0
  36. src/tools/vendored/searchxng_client.py +1 -0
  37. src/tools/vendored/serper_client.py +1 -0
  38. src/tools/vendored/web_search_core.py +1 -0
  39. src/tools/web_search_factory.py +1 -0
  40. src/utils/markdown.css +1 -0
  41. src/utils/md_to_pdf.py +1 -0
  42. src/utils/report_generator.py +1 -0
  43. tests/unit/middleware/test_budget_tracker_phase7.py +1 -0
  44. tests/unit/middleware/test_state_machine.py +1 -0
  45. tests/unit/middleware/test_workflow_manager.py +1 -0
  46. uv.lock +186 -0
AUDIO_INPUT_FIX.md CHANGED
@@ -90,3 +90,4 @@ If audio input still doesn't appear:
90
 
91
 
92
 
 
 
90
 
91
 
92
 
93
+
ERROR_FIXES_SUMMARY.md CHANGED
@@ -152,3 +152,4 @@ Some MCP tools use `gr.State` inputs, which Gradio warns won't update between to
152
 
153
 
154
 
 
 
152
 
153
 
154
 
155
+
FILE_OUTPUT_IMPLEMENTATION_PLAN.md CHANGED
@@ -237,3 +237,4 @@ Current implementation in `event_to_chat_message()` already handles this correct
237
 
238
 
239
 
 
 
237
 
238
 
239
 
240
+
FILE_OUTPUT_VERIFICATION.md CHANGED
@@ -220,3 +220,4 @@ No reimplementation needed. All changes are present and correct.
220
 
221
 
222
 
 
 
220
 
221
 
222
 
223
+
FIX_SUMMARY.md CHANGED
@@ -98,3 +98,4 @@ if isinstance(final_result, dict):
98
  - File paths will be included in event data when reports are saved
99
  - Better logging will help debug any future issues with result extraction
100
 
 
 
98
  - File paths will be included in event data when reports are saved
99
  - Better logging will help debug any future issues with result extraction
100
 
101
+
MULTIMODAL_SETTINGS_IMPLEMENTATION_PLAN.md CHANGED
@@ -382,3 +382,4 @@ result["content"] = f"{content}\n\n{file_links}"
382
 
383
 
384
 
 
 
382
 
383
 
384
 
385
+
MULTIMODAL_SETTINGS_IMPLEMENTATION_SUMMARY.md CHANGED
@@ -153,3 +153,4 @@
153
 
154
 
155
 
 
 
153
 
154
 
155
 
156
+
PDF_REPORT_INTEGRATION.md CHANGED
@@ -130,3 +130,4 @@ PDF generation is automatically triggered when:
130
  - PDF compression options
131
  - Batch PDF generation
132
 
 
 
130
  - PDF compression options
131
  - Batch PDF generation
132
 
133
+
REPORT_WRITING_AGENTS_ANALYSIS.md CHANGED
@@ -185,3 +185,4 @@ The infrastructure to handle file outputs in Gradio is in place, but the agents
185
 
186
 
187
 
 
 
185
 
186
 
187
 
188
+
SERPER_WEBSEARCH_IMPLEMENTATION_PLAN.md CHANGED
@@ -399,3 +399,4 @@ This plan details the implementation of SERPER-based web search by vendoring cod
399
 
400
 
401
 
 
 
399
 
400
 
401
 
402
+
dev/__init__.py CHANGED
@@ -1,2 +1,3 @@
1
  """Development utilities and plugins."""
2
 
 
 
1
  """Development utilities and plugins."""
2
 
3
+
docs/api/agents.md CHANGED
@@ -271,3 +271,4 @@ def create_input_parser_agent(model: Any | None = None) -> InputParserAgent
271
 
272
 
273
 
 
 
271
 
272
 
273
 
274
+
docs/api/models.md CHANGED
@@ -249,3 +249,4 @@ class BudgetStatus(BaseModel):
249
 
250
 
251
 
 
 
249
 
250
 
251
 
252
+
docs/api/services.md CHANGED
@@ -206,5 +206,6 @@ Analyzes a hypothesis using statistical methods.
206
 
207
 
208
 
 
209
 
210
 
 
206
 
207
 
208
 
209
+
210
 
211
 
docs/api/tools.md CHANGED
@@ -236,3 +236,4 @@ Searches multiple tools in parallel.
236
 
237
 
238
 
 
 
236
 
237
 
238
 
239
+
docs/architecture/agents.md CHANGED
@@ -193,3 +193,4 @@ Factory functions:
193
 
194
 
195
 
 
 
193
 
194
 
195
 
196
+
docs/contributing/code-quality.md CHANGED
@@ -82,3 +82,4 @@ async def search(self, query: str, max_results: int = 10) -> list[Evidence]:
82
 
83
 
84
 
 
 
82
 
83
 
84
 
85
+
docs/contributing/code-style.md CHANGED
@@ -62,3 +62,4 @@ result = await loop.run_in_executor(None, cpu_bound_function, args)
62
 
63
 
64
 
 
 
62
 
63
 
64
 
65
+
docs/contributing/error-handling.md CHANGED
@@ -70,3 +70,4 @@ except httpx.HTTPError as e:
70
 
71
 
72
 
 
 
70
 
71
 
72
 
73
+
docs/contributing/implementation-patterns.md CHANGED
@@ -85,3 +85,4 @@ def get_embedding_service() -> EmbeddingService:
85
 
86
 
87
 
 
 
85
 
86
 
87
 
88
+
docs/contributing/index.md CHANGED
@@ -164,3 +164,4 @@ Thank you for contributing to DeepCritical!
164
 
165
 
166
 
 
 
164
 
165
 
166
 
167
+
docs/contributing/prompt-engineering.md CHANGED
@@ -70,3 +70,4 @@ This document outlines prompt engineering guidelines and citation validation rul
70
 
71
 
72
 
 
 
70
 
71
 
72
 
73
+
docs/contributing/testing.md CHANGED
@@ -74,3 +74,4 @@ async def test_real_pubmed_search():
74
  >>>>>>> Stashed changes
75
 
76
 
 
 
74
  >>>>>>> Stashed changes
75
 
76
 
77
+
docs/getting-started/installation.md CHANGED
@@ -157,3 +157,4 @@ uv run pre-commit install
157
  >>>>>>> Stashed changes
158
 
159
 
 
 
157
  >>>>>>> Stashed changes
158
 
159
 
160
+
docs/implementation/IMPLEMENTATION_SUMMARY.md CHANGED
@@ -184,3 +184,4 @@ Located in `src/app.py` lines 667-712:
184
 
185
 
186
 
 
 
184
 
185
 
186
 
187
+
docs/implementation/TTS_MODAL_IMPLEMENTATION.md CHANGED
@@ -138,3 +138,4 @@ To test TTS:
138
 
139
 
140
 
 
 
138
 
139
 
140
 
141
+
docs/license.md CHANGED
@@ -40,3 +40,4 @@ SOFTWARE.
40
 
41
 
42
 
 
 
40
 
41
 
42
 
43
+
docs/team.md CHANGED
@@ -45,3 +45,4 @@ We welcome contributions! See the [Contributing Guide](contributing/index.md) fo
45
 
46
 
47
 
 
 
45
 
46
 
47
 
48
+
new_env.txt CHANGED
@@ -100,3 +100,4 @@ MODAL_TOKEN_SECRET=your_modal_token_secret_here
100
 
101
 
102
 
 
 
100
 
101
 
102
 
103
+
pyproject.toml CHANGED
@@ -46,6 +46,7 @@ dependencies = [
46
  "fake-useragent==2.2.0",
47
  "socksio==1.0.0",
48
  "neo4j>=6.0.3",
 
49
  ]
50
 
51
  [project.optional-dependencies]
 
46
  "fake-useragent==2.2.0",
47
  "socksio==1.0.0",
48
  "neo4j>=6.0.3",
49
+ "md2pdf>=1.0.1",
50
  ]
51
 
52
  [project.optional-dependencies]
requirements.txt CHANGED
@@ -63,6 +63,23 @@ sentence-transformers>=2.2.0
63
  numpy<2.0 # chromadb compatibility: uses np.float_ removed in NumPy 2.0
64
  neo4j>=6.0.3
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  # Pydantic AI with HuggingFace support
67
  pydantic-ai-slim[huggingface]>=0.0.18
68
 
 
63
  numpy<2.0 # chromadb compatibility: uses np.float_ removed in NumPy 2.0
64
  neo4j>=6.0.3
65
 
66
+ ### DOCUMENT STUFF
67
+
68
+ cssselect2==0.8.0
69
+ determinator==0.1.0 (from file:///C:/Users/MeMyself/dchfgrdemo/DeepCritical-HFSpace)
70
+ docopt==0.6.2
71
+ fonttools==4.61.0
72
+ markdown2==2.5.4
73
+ md2pdf==1.0.1
74
+ pydyf==0.11.0
75
+ pyphen==0.17.2
76
+ tinycss2==1.5.1
77
+ tinyhtml5==2.0.0
78
+ weasyprint==66.0
79
+ webencodings==0.5.1
80
+ zopfli==0.4.0
81
+
82
+
83
  # Pydantic AI with HuggingFace support
84
  pydantic-ai-slim[huggingface]>=0.0.18
85
 
src/middleware/state_machine.py CHANGED
@@ -128,3 +128,4 @@ def get_workflow_state() -> WorkflowState:
128
  return init_workflow_state()
129
  return state
130
 
 
 
128
  return init_workflow_state()
129
  return state
130
 
131
+
src/tools/searchxng_web_search.py CHANGED
@@ -114,3 +114,4 @@ class SearchXNGWebSearchTool:
114
  logger.error("Unexpected error in SearchXNG search", error=str(e), query=final_query)
115
  raise SearchError(f"SearchXNG search failed: {e}") from e
116
 
 
 
114
  logger.error("Unexpected error in SearchXNG search", error=str(e), query=final_query)
115
  raise SearchError(f"SearchXNG search failed: {e}") from e
116
 
117
+
src/tools/serper_web_search.py CHANGED
@@ -114,3 +114,4 @@ class SerperWebSearchTool:
114
  logger.error("Unexpected error in Serper search", error=str(e), query=final_query)
115
  raise SearchError(f"Serper search failed: {e}") from e
116
 
 
 
114
  logger.error("Unexpected error in Serper search", error=str(e), query=final_query)
115
  raise SearchError(f"Serper search failed: {e}") from e
116
 
117
+
src/tools/vendored/crawl_website.py CHANGED
@@ -126,3 +126,4 @@ async def crawl_website(starting_url: str) -> list[ScrapeResult] | str:
126
  result = await scrape_urls(pages_to_scrape_snippets)
127
  return result
128
 
 
 
126
  result = await scrape_urls(pages_to_scrape_snippets)
127
  return result
128
 
129
+
src/tools/vendored/searchxng_client.py CHANGED
@@ -95,3 +95,4 @@ class SearchXNGClient:
95
  logger.error("Unexpected error in SearchXNG search", error=str(e), query=query)
96
  raise SearchError(f"SearchXNG search failed: {e}") from e
97
 
 
 
95
  logger.error("Unexpected error in SearchXNG search", error=str(e), query=query)
96
  raise SearchError(f"SearchXNG search failed: {e}") from e
97
 
98
+
src/tools/vendored/serper_client.py CHANGED
@@ -91,3 +91,4 @@ class SerperClient:
91
  logger.error("Unexpected error in Serper search", error=str(e), query=query)
92
  raise SearchError(f"Serper search failed: {e}") from e
93
 
 
 
91
  logger.error("Unexpected error in Serper search", error=str(e), query=query)
92
  raise SearchError(f"Serper search failed: {e}") from e
93
 
94
+
src/tools/vendored/web_search_core.py CHANGED
@@ -200,3 +200,4 @@ def is_valid_url(url: str) -> bool:
200
  return False
201
  return True
202
 
 
 
200
  return False
201
  return True
202
 
203
+
src/tools/web_search_factory.py CHANGED
@@ -67,3 +67,4 @@ def create_web_search_tool() -> SearchTool | None:
67
  logger.error("Unexpected error creating web search tool", error=str(e), provider=provider)
68
  return None
69
 
 
 
67
  logger.error("Unexpected error creating web search tool", error=str(e), provider=provider)
68
  return None
69
 
70
+
src/utils/markdown.css CHANGED
@@ -5,3 +5,4 @@ body {
5
  color: #000;
6
  }
7
 
 
 
5
  color: #000;
6
  }
7
 
8
+
src/utils/md_to_pdf.py CHANGED
@@ -65,3 +65,4 @@ def md_to_pdf(md_text: str, pdf_file_path: str) -> None:
65
 
66
  logger.debug("PDF generated successfully", pdf_path=pdf_file_path)
67
 
 
 
65
 
66
  logger.debug("PDF generated successfully", pdf_path=pdf_file_path)
67
 
68
+
src/utils/report_generator.py CHANGED
@@ -168,3 +168,4 @@ def generate_report_from_evidence(
168
 
169
  return "".join(report_parts)
170
 
 
 
168
 
169
  return "".join(report_parts)
170
 
171
+
tests/unit/middleware/test_budget_tracker_phase7.py CHANGED
@@ -176,5 +176,6 @@ class TestIterationTokenTracking:
176
 
177
 
178
 
 
179
 
180
 
 
176
 
177
 
178
 
179
+
180
 
181
 
tests/unit/middleware/test_state_machine.py CHANGED
@@ -373,5 +373,6 @@ class TestContextVarIsolation:
373
 
374
 
375
 
 
376
 
377
 
 
373
 
374
 
375
 
376
+
377
 
378
 
tests/unit/middleware/test_workflow_manager.py CHANGED
@@ -303,5 +303,6 @@ class TestWorkflowManager:
303
 
304
 
305
 
 
306
 
307
 
 
303
 
304
 
305
 
306
+
307
 
308
 
uv.lock CHANGED
@@ -1095,6 +1095,19 @@ version = "0.9.5"
1095
  source = { registry = "https://pypi.org/simple" }
1096
  sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload-time = "2017-11-26T21:13:08.238Z" }
1097
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1098
  [[package]]
1099
  name = "cyclopts"
1100
  version = "4.2.5"
@@ -1184,6 +1197,7 @@ dependencies = [
1184
  { name = "llama-index-llms-openai" },
1185
  { name = "llama-index-vector-stores-chroma" },
1186
  { name = "lxml" },
 
1187
  { name = "modal" },
1188
  { name = "neo4j" },
1189
  { name = "numpy" },
@@ -1277,6 +1291,7 @@ requires-dist = [
1277
  { name = "llama-index-vector-stores-chroma", specifier = ">=0.5.3" },
1278
  { name = "llama-index-vector-stores-chroma", marker = "extra == 'modal'" },
1279
  { name = "lxml", specifier = ">=6.0.2" },
 
1280
  { name = "mkdocs", marker = "extra == 'dev'", specifier = ">=1.6.0" },
1281
  { name = "mkdocs-codeinclude-plugin", marker = "extra == 'dev'", specifier = ">=0.2.0" },
1282
  { name = "mkdocs-material", marker = "extra == 'dev'", specifier = ">=9.0.0" },
@@ -1371,6 +1386,12 @@ wheels = [
1371
  { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" },
1372
  ]
1373
 
 
 
 
 
 
 
1374
  [[package]]
1375
  name = "docstring-parser"
1376
  version = "0.17.0"
@@ -1577,6 +1598,62 @@ wheels = [
1577
  { url = "https://files.pythonhosted.org/packages/ee/1b/00a78aa2e8fbd63f9af08c9c19e6deb3d5d66b4dda677a0f61654680ee89/flatbuffers-25.9.23-py2.py3-none-any.whl", hash = "sha256:255538574d6cb6d0a79a17ec8bc0d30985913b87513a01cce8bcdb6b4c44d0e2", size = 30869, upload-time = "2025-09-24T05:25:28.912Z" },
1578
  ]
1579
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1580
  [[package]]
1581
  name = "frozenlist"
1582
  version = "1.8.0"
@@ -2923,6 +3000,15 @@ wheels = [
2923
  { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
2924
  ]
2925
 
 
 
 
 
 
 
 
 
 
2926
  [[package]]
2927
  name = "markupsafe"
2928
  version = "3.0.3"
@@ -3039,6 +3125,17 @@ ws = [
3039
  { name = "websockets" },
3040
  ]
3041
 
 
 
 
 
 
 
 
 
 
 
 
3042
  [[package]]
3043
  name = "mdurl"
3044
  version = "0.1.2"
@@ -4896,6 +4993,15 @@ wheels = [
4896
  { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" },
4897
  ]
4898
 
 
 
 
 
 
 
 
 
 
4899
  [[package]]
4900
  name = "pygments"
4901
  version = "2.19.2"
@@ -4950,6 +5056,15 @@ wheels = [
4950
  { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" },
4951
  ]
4952
 
 
 
 
 
 
 
 
 
 
4953
  [[package]]
4954
  name = "pypika"
4955
  version = "0.48.9"
@@ -5972,6 +6087,30 @@ wheels = [
5972
  { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" },
5973
  ]
5974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5975
  [[package]]
5976
  name = "tokenizers"
5977
  version = "0.22.1"
@@ -6502,6 +6641,34 @@ wheels = [
6502
  { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" },
6503
  ]
6504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6505
  [[package]]
6506
  name = "websocket-client"
6507
  version = "1.9.0"
@@ -6739,3 +6906,22 @@ sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50e
6739
  wheels = [
6740
  { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" },
6741
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1095
  source = { registry = "https://pypi.org/simple" }
1096
  sdist = { url = "https://files.pythonhosted.org/packages/f1/2a/8c3ac3d8bc94e6de8d7ae270bb5bc437b210bb9d6d9e46630c98f4abd20c/csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05", size = 237808, upload-time = "2017-11-26T21:13:08.238Z" }
1097
 
1098
+ [[package]]
1099
+ name = "cssselect2"
1100
+ version = "0.8.0"
1101
+ source = { registry = "https://pypi.org/simple" }
1102
+ dependencies = [
1103
+ { name = "tinycss2" },
1104
+ { name = "webencodings" },
1105
+ ]
1106
+ sdist = { url = "https://files.pythonhosted.org/packages/9f/86/fd7f58fc498b3166f3a7e8e0cddb6e620fe1da35b02248b1bd59e95dbaaa/cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a", size = 35716, upload-time = "2025-03-05T14:46:07.988Z" }
1107
+ wheels = [
1108
+ { url = "https://files.pythonhosted.org/packages/0f/e7/aa315e6a749d9b96c2504a1ba0ba031ba2d0517e972ce22682e3fccecb09/cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e", size = 15454, upload-time = "2025-03-05T14:46:06.463Z" },
1109
+ ]
1110
+
1111
  [[package]]
1112
  name = "cyclopts"
1113
  version = "4.2.5"
 
1197
  { name = "llama-index-llms-openai" },
1198
  { name = "llama-index-vector-stores-chroma" },
1199
  { name = "lxml" },
1200
+ { name = "md2pdf" },
1201
  { name = "modal" },
1202
  { name = "neo4j" },
1203
  { name = "numpy" },
 
1291
  { name = "llama-index-vector-stores-chroma", specifier = ">=0.5.3" },
1292
  { name = "llama-index-vector-stores-chroma", marker = "extra == 'modal'" },
1293
  { name = "lxml", specifier = ">=6.0.2" },
1294
+ { name = "md2pdf", specifier = ">=1.0.1" },
1295
  { name = "mkdocs", marker = "extra == 'dev'", specifier = ">=1.6.0" },
1296
  { name = "mkdocs-codeinclude-plugin", marker = "extra == 'dev'", specifier = ">=0.2.0" },
1297
  { name = "mkdocs-material", marker = "extra == 'dev'", specifier = ">=9.0.0" },
 
1386
  { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" },
1387
  ]
1388
 
1389
+ [[package]]
1390
+ name = "docopt"
1391
+ version = "0.6.2"
1392
+ source = { registry = "https://pypi.org/simple" }
1393
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" }
1394
+
1395
  [[package]]
1396
  name = "docstring-parser"
1397
  version = "0.17.0"
 
1598
  { url = "https://files.pythonhosted.org/packages/ee/1b/00a78aa2e8fbd63f9af08c9c19e6deb3d5d66b4dda677a0f61654680ee89/flatbuffers-25.9.23-py2.py3-none-any.whl", hash = "sha256:255538574d6cb6d0a79a17ec8bc0d30985913b87513a01cce8bcdb6b4c44d0e2", size = 30869, upload-time = "2025-09-24T05:25:28.912Z" },
1599
  ]
1600
 
1601
+ [[package]]
1602
+ name = "fonttools"
1603
+ version = "4.61.0"
1604
+ source = { registry = "https://pypi.org/simple" }
1605
+ sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" }
1606
+ wheels = [
1607
+ { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" },
1608
+ { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" },
1609
+ { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" },
1610
+ { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" },
1611
+ { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" },
1612
+ { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" },
1613
+ { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" },
1614
+ { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" },
1615
+ { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" },
1616
+ { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" },
1617
+ { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" },
1618
+ { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" },
1619
+ { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" },
1620
+ { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" },
1621
+ { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" },
1622
+ { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" },
1623
+ { url = "https://files.pythonhosted.org/packages/17/45/334f0d7f181e5473cfb757e1b60f4e60e7fc64f28d406e5d364a952718c0/fonttools-4.61.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba774b8cbd8754f54b8eb58124e8bd45f736b2743325ab1a5229698942b9b433", size = 2841801, upload-time = "2025-11-28T17:05:01.621Z" },
1624
+ { url = "https://files.pythonhosted.org/packages/cc/63/97b9c78e1f79bc741d4efe6e51f13872d8edb2b36e1b9fb2bab0d4491bb7/fonttools-4.61.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c84b430616ed73ce46e9cafd0bf0800e366a3e02fb7e1ad7c1e214dbe3862b1f", size = 2379024, upload-time = "2025-11-28T17:05:03.668Z" },
1625
+ { url = "https://files.pythonhosted.org/packages/4e/80/c87bc524a90dbeb2a390eea23eae448286983da59b7e02c67fa0ca96a8c5/fonttools-4.61.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b2b734d8391afe3c682320840c8191de9bd24e7eb85768dd4dc06ed1b63dbb1b", size = 4923706, upload-time = "2025-11-28T17:05:05.494Z" },
1626
+ { url = "https://files.pythonhosted.org/packages/6d/f6/a3b0374811a1de8c3f9207ec88f61ad1bb96f938ed89babae26c065c2e46/fonttools-4.61.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5c5fff72bf31b0e558ed085e4fd7ed96eb85881404ecc39ed2a779e7cf724eb", size = 4979751, upload-time = "2025-11-28T17:05:07.665Z" },
1627
+ { url = "https://files.pythonhosted.org/packages/a5/3b/30f63b4308b449091573285f9d27619563a84f399946bca3eadc9554afbe/fonttools-4.61.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14a290c5c93fcab76b7f451e6a4b7721b712d90b3b5ed6908f1abcf794e90d6d", size = 4921113, upload-time = "2025-11-28T17:05:09.551Z" },
1628
+ { url = "https://files.pythonhosted.org/packages/41/6c/58e6e9b7d9d8bf2d7010bd7bb493060b39b02a12d1cda64a8bfb116ce760/fonttools-4.61.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:13e3e20a5463bfeb77b3557d04b30bd6a96a6bb5c15c7b2e7908903e69d437a0", size = 5063183, upload-time = "2025-11-28T17:05:11.677Z" },
1629
+ { url = "https://files.pythonhosted.org/packages/3f/e3/52c790ab2b07492df059947a1fd7778e105aac5848c0473029a4d20481a2/fonttools-4.61.0-cp313-cp313-win32.whl", hash = "sha256:6781e7a4bb010be1cd69a29927b0305c86b843395f2613bdabe115f7d6ea7f34", size = 2263159, upload-time = "2025-11-28T17:05:13.292Z" },
1630
+ { url = "https://files.pythonhosted.org/packages/e9/1f/116013b200fbeba871046554d5d2a45fefa69a05c40e9cdfd0d4fff53edc/fonttools-4.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:c53b47834ae41e8e4829171cc44fec0fdf125545a15f6da41776b926b9645a9a", size = 2313530, upload-time = "2025-11-28T17:05:14.848Z" },
1631
+ { url = "https://files.pythonhosted.org/packages/d3/99/59b1e25987787cb714aa9457cee4c9301b7c2153f0b673e2b8679d37669d/fonttools-4.61.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:96dfc9bc1f2302224e48e6ee37e656eddbab810b724b52e9d9c13a57a6abad01", size = 2841429, upload-time = "2025-11-28T17:05:16.671Z" },
1632
+ { url = "https://files.pythonhosted.org/packages/2b/b2/4c1911d4332c8a144bb3b44416e274ccca0e297157c971ea1b3fbb855590/fonttools-4.61.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b2065d94e5d63aafc2591c8b6ccbdb511001d9619f1bca8ad39b745ebeb5efa", size = 2378987, upload-time = "2025-11-28T17:05:18.69Z" },
1633
+ { url = "https://files.pythonhosted.org/packages/24/b0/f442e90fde5d2af2ae0cb54008ab6411edc557ee33b824e13e1d04925ac9/fonttools-4.61.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e0d87e81e4d869549585ba0beb3f033718501c1095004f5e6aef598d13ebc216", size = 4873270, upload-time = "2025-11-28T17:05:20.625Z" },
1634
+ { url = "https://files.pythonhosted.org/packages/bb/04/f5d5990e33053c8a59b90b1d7e10ad9b97a73f42c745304da0e709635fab/fonttools-4.61.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfa2eb9bae650e58f0e8ad53c49d19a844d6034d6b259f30f197238abc1ccee", size = 4968270, upload-time = "2025-11-28T17:05:22.515Z" },
1635
+ { url = "https://files.pythonhosted.org/packages/94/9f/2091402e0d27c9c8c4bab5de0e5cd146d9609a2d7d1c666bbb75c0011c1a/fonttools-4.61.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4238120002e68296d55e091411c09eab94e111c8ce64716d17df53fd0eb3bb3d", size = 4919799, upload-time = "2025-11-28T17:05:24.437Z" },
1636
+ { url = "https://files.pythonhosted.org/packages/a8/72/86adab22fde710b829f8ffbc8f264df01928e5b7a8f6177fa29979ebf256/fonttools-4.61.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6ceac262cc62bec01b3bb59abccf41b24ef6580869e306a4e88b7e56bb4bdda", size = 5030966, upload-time = "2025-11-28T17:05:26.115Z" },
1637
+ { url = "https://files.pythonhosted.org/packages/e8/a7/7c8e31b003349e845b853f5e0a67b95ff6b052fa4f5224f8b72624f5ac69/fonttools-4.61.0-cp314-cp314-win32.whl", hash = "sha256:adbb4ecee1a779469a77377bbe490565effe8fce6fb2e6f95f064de58f8bac85", size = 2267243, upload-time = "2025-11-28T17:05:27.807Z" },
1638
+ { url = "https://files.pythonhosted.org/packages/20/ee/f434fe7749360497c52b7dcbcfdbccdaab0a71c59f19d572576066717122/fonttools-4.61.0-cp314-cp314-win_amd64.whl", hash = "sha256:02bdf8e04d1a70476564b8640380f04bb4ac74edc1fc71f1bacb840b3e398ee9", size = 2318822, upload-time = "2025-11-28T17:05:29.882Z" },
1639
+ { url = "https://files.pythonhosted.org/packages/33/b3/c16255320255e5c1863ca2b2599bb61a46e2f566db0bbb9948615a8fe692/fonttools-4.61.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:627216062d90ab0d98215176d8b9562c4dd5b61271d35f130bcd30f6a8aaa33a", size = 2924917, upload-time = "2025-11-28T17:05:31.46Z" },
1640
+ { url = "https://files.pythonhosted.org/packages/e2/b8/08067ae21de705a817777c02ef36ab0b953cbe91d8adf134f9c2da75ed6d/fonttools-4.61.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b446623c9cd5f14a59493818eaa80255eec2468c27d2c01b56e05357c263195", size = 2413576, upload-time = "2025-11-28T17:05:33.343Z" },
1641
+ { url = "https://files.pythonhosted.org/packages/42/f1/96ff43f92addce2356780fdc203f2966206f3d22ea20e242c27826fd7442/fonttools-4.61.0-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:70e2a0c0182ee75e493ef33061bfebf140ea57e035481d2f95aa03b66c7a0e05", size = 4877447, upload-time = "2025-11-28T17:05:35.278Z" },
1642
+ { url = "https://files.pythonhosted.org/packages/d0/1e/a3d8e51ed9ccfd7385e239ae374b78d258a0fb82d82cab99160a014a45d1/fonttools-4.61.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9064b0f55b947e929ac669af5311ab1f26f750214db6dd9a0c97e091e918f486", size = 5095681, upload-time = "2025-11-28T17:05:37.142Z" },
1643
+ { url = "https://files.pythonhosted.org/packages/eb/f6/d256bd6c1065c146a0bdddf1c62f542e08ae5b3405dbf3fcc52be272f674/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cb5e45a824ce14b90510024d0d39dae51bd4fbb54c42a9334ea8c8cf4d95cbe", size = 4974140, upload-time = "2025-11-28T17:05:39.5Z" },
1644
+ { url = "https://files.pythonhosted.org/packages/5d/0c/96633eb4b26f138cc48561c6e0c44b4ea48acea56b20b507d6b14f8e80ce/fonttools-4.61.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e5ca8c62efdec7972dfdfd454415c4db49b89aeaefaaacada432f3b7eea9866", size = 5001741, upload-time = "2025-11-28T17:05:41.424Z" },
1645
+ { url = "https://files.pythonhosted.org/packages/6f/9a/3b536bad3be4f26186f296e749ff17bad3e6d57232c104d752d24b2e265b/fonttools-4.61.0-cp314-cp314t-win32.whl", hash = "sha256:63c7125d31abe3e61d7bb917329b5543c5b3448db95f24081a13aaf064360fc8", size = 2330707, upload-time = "2025-11-28T17:05:43.548Z" },
1646
+ { url = "https://files.pythonhosted.org/packages/18/ea/e6b9ac610451ee9f04477c311ad126de971f6112cb579fa391d2a8edb00b/fonttools-4.61.0-cp314-cp314t-win_amd64.whl", hash = "sha256:67d841aa272be5500de7f447c40d1d8452783af33b4c3599899319f6ef9ad3c1", size = 2395950, upload-time = "2025-11-28T17:05:45.638Z" },
1647
+ { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" },
1648
+ ]
1649
+
1650
+ [package.optional-dependencies]
1651
+ woff = [
1652
+ { name = "brotli", marker = "platform_python_implementation == 'CPython'" },
1653
+ { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" },
1654
+ { name = "zopfli" },
1655
+ ]
1656
+
1657
  [[package]]
1658
  name = "frozenlist"
1659
  version = "1.8.0"
 
3000
  { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
3001
  ]
3002
 
3003
+ [[package]]
3004
+ name = "markdown2"
3005
+ version = "2.5.4"
3006
+ source = { registry = "https://pypi.org/simple" }
3007
+ sdist = { url = "https://files.pythonhosted.org/packages/42/f8/b2ae8bf5f28f9b510ae097415e6e4cb63226bb28d7ee01aec03a755ba03b/markdown2-2.5.4.tar.gz", hash = "sha256:a09873f0b3c23dbfae589b0080587df52ad75bb09a5fa6559147554736676889", size = 145652, upload-time = "2025-07-27T16:16:24.307Z" }
3008
+ wheels = [
3009
+ { url = "https://files.pythonhosted.org/packages/b8/06/2697b5043c3ecb720ce0d243fc7cf5024c0b5b1e450506e9b21939019963/markdown2-2.5.4-py3-none-any.whl", hash = "sha256:3c4b2934e677be7fec0e6f2de4410e116681f4ad50ec8e5ba7557be506d3f439", size = 49954, upload-time = "2025-07-27T16:16:23.026Z" },
3010
+ ]
3011
+
3012
  [[package]]
3013
  name = "markupsafe"
3014
  version = "3.0.3"
 
3125
  { name = "websockets" },
3126
  ]
3127
 
3128
+ [[package]]
3129
+ name = "md2pdf"
3130
+ version = "1.0.1"
3131
+ source = { registry = "https://pypi.org/simple" }
3132
+ dependencies = [
3133
+ { name = "docopt" },
3134
+ { name = "markdown2" },
3135
+ { name = "weasyprint" },
3136
+ ]
3137
+ sdist = { url = "https://files.pythonhosted.org/packages/de/b0/adbef5356f97a6d33c7811805b06e3774c7a58ea70dc28039ae4ad1ba1be/md2pdf-1.0.1.tar.gz", hash = "sha256:3d5aab77dcd5b6f5827b193819ab1a8c1cec506ce5f6c777c3411b703352cd98", size = 6377, upload-time = "2023-04-12T09:11:46.781Z" }
3138
+
3139
  [[package]]
3140
  name = "mdurl"
3141
  version = "0.1.2"
 
4993
  { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" },
4994
  ]
4995
 
4996
+ [[package]]
4997
+ name = "pydyf"
4998
+ version = "0.11.0"
4999
+ source = { registry = "https://pypi.org/simple" }
5000
+ sdist = { url = "https://files.pythonhosted.org/packages/2e/c2/97fc6ce4ce0045080dc99446def812081b57750ed8aa67bfdfafa4561fe5/pydyf-0.11.0.tar.gz", hash = "sha256:394dddf619cca9d0c55715e3c55ea121a9bf9cbc780cdc1201a2427917b86b64", size = 17769, upload-time = "2024-07-12T12:26:51.95Z" }
5001
+ wheels = [
5002
+ { url = "https://files.pythonhosted.org/packages/c9/ac/d5db977deaf28c6ecbc61bbca269eb3e8f0b3a1f55c8549e5333e606e005/pydyf-0.11.0-py3-none-any.whl", hash = "sha256:0aaf9e2ebbe786ec7a78ec3fbffa4cdcecde53fd6f563221d53c6bc1328848a3", size = 8104, upload-time = "2024-07-12T12:26:49.896Z" },
5003
+ ]
5004
+
5005
  [[package]]
5006
  name = "pygments"
5007
  version = "2.19.2"
 
5056
  { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" },
5057
  ]
5058
 
5059
+ [[package]]
5060
+ name = "pyphen"
5061
+ version = "0.17.2"
5062
+ source = { registry = "https://pypi.org/simple" }
5063
+ sdist = { url = "https://files.pythonhosted.org/packages/69/56/e4d7e1bd70d997713649c5ce530b2d15a5fc2245a74ca820fc2d51d89d4d/pyphen-0.17.2.tar.gz", hash = "sha256:f60647a9c9b30ec6c59910097af82bc5dd2d36576b918e44148d8b07ef3b4aa3", size = 2079470, upload-time = "2025-01-20T13:18:36.296Z" }
5064
+ wheels = [
5065
+ { url = "https://files.pythonhosted.org/packages/7b/1f/c2142d2edf833a90728e5cdeb10bdbdc094dde8dbac078cee0cf33f5e11b/pyphen-0.17.2-py3-none-any.whl", hash = "sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd", size = 2079358, upload-time = "2025-01-20T13:18:29.629Z" },
5066
+ ]
5067
+
5068
  [[package]]
5069
  name = "pypika"
5070
  version = "0.48.9"
 
6087
  { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" },
6088
  ]
6089
 
6090
+ [[package]]
6091
+ name = "tinycss2"
6092
+ version = "1.5.1"
6093
+ source = { registry = "https://pypi.org/simple" }
6094
+ dependencies = [
6095
+ { name = "webencodings" },
6096
+ ]
6097
+ sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" }
6098
+ wheels = [
6099
+ { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" },
6100
+ ]
6101
+
6102
+ [[package]]
6103
+ name = "tinyhtml5"
6104
+ version = "2.0.0"
6105
+ source = { registry = "https://pypi.org/simple" }
6106
+ dependencies = [
6107
+ { name = "webencodings" },
6108
+ ]
6109
+ sdist = { url = "https://files.pythonhosted.org/packages/fd/03/6111ed99e9bf7dfa1c30baeef0e0fb7e0bd387bd07f8e5b270776fe1de3f/tinyhtml5-2.0.0.tar.gz", hash = "sha256:086f998833da24c300c414d9fe81d9b368fd04cb9d2596a008421cbc705fcfcc", size = 179507, upload-time = "2024-10-29T15:37:14.078Z" }
6110
+ wheels = [
6111
+ { url = "https://files.pythonhosted.org/packages/5c/de/27c57899297163a4a84104d5cec0af3b1ac5faf62f44667e506373c6b8ce/tinyhtml5-2.0.0-py3-none-any.whl", hash = "sha256:13683277c5b176d070f82d099d977194b7a1e26815b016114f581a74bbfbf47e", size = 39793, upload-time = "2024-10-29T15:37:11.743Z" },
6112
+ ]
6113
+
6114
  [[package]]
6115
  name = "tokenizers"
6116
  version = "0.22.1"
 
6641
  { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" },
6642
  ]
6643
 
6644
+ [[package]]
6645
+ name = "weasyprint"
6646
+ version = "66.0"
6647
+ source = { registry = "https://pypi.org/simple" }
6648
+ dependencies = [
6649
+ { name = "cffi" },
6650
+ { name = "cssselect2" },
6651
+ { name = "fonttools", extra = ["woff"] },
6652
+ { name = "pillow" },
6653
+ { name = "pydyf" },
6654
+ { name = "pyphen" },
6655
+ { name = "tinycss2" },
6656
+ { name = "tinyhtml5" },
6657
+ ]
6658
+ sdist = { url = "https://files.pythonhosted.org/packages/32/99/480b5430b7eb0916e7d5df1bee7d9508b28b48fee28da894d0a050e0e930/weasyprint-66.0.tar.gz", hash = "sha256:da71dc87dc129ac9cffdc65e5477e90365ab9dbae45c744014ec1d06303dde40", size = 504224, upload-time = "2025-07-24T11:44:42.771Z" }
6659
+ wheels = [
6660
+ { url = "https://files.pythonhosted.org/packages/0f/d1/c5d9b341bf3d556c1e4c6566b3efdda0b1bb175510aa7b09dd3eee246923/weasyprint-66.0-py3-none-any.whl", hash = "sha256:82b0783b726fcd318e2c977dcdddca76515b30044bc7a830cc4fbe717582a6d0", size = 301965, upload-time = "2025-07-24T11:44:40.968Z" },
6661
+ ]
6662
+
6663
+ [[package]]
6664
+ name = "webencodings"
6665
+ version = "0.5.1"
6666
+ source = { registry = "https://pypi.org/simple" }
6667
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" }
6668
+ wheels = [
6669
+ { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" },
6670
+ ]
6671
+
6672
  [[package]]
6673
  name = "websocket-client"
6674
  version = "1.9.0"
 
6906
  wheels = [
6907
  { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" },
6908
  ]
6909
+
6910
+ [[package]]
6911
+ name = "zopfli"
6912
+ version = "0.4.0"
6913
+ source = { registry = "https://pypi.org/simple" }
6914
+ sdist = { url = "https://files.pythonhosted.org/packages/be/4c/efa0760686d4cc69e68a8f284d3c6c5884722c50f810af0e277fb7d61621/zopfli-0.4.0.tar.gz", hash = "sha256:a8ee992b2549e090cd3f0178bf606dd41a29e0613a04cdf5054224662c72dce6", size = 176720, upload-time = "2025-11-07T17:00:59.507Z" }
6915
+ wheels = [
6916
+ { url = "https://files.pythonhosted.org/packages/98/62/ec5cb67ee379c6a4f296f1277b971ff8c26460bf8775f027f82c519a0a72/zopfli-0.4.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d1b98ad47c434ef213444a03ef2f826eeec100144d64f6a57504b9893d3931ce", size = 287433, upload-time = "2025-11-07T17:00:45.662Z" },
6917
+ { url = "https://files.pythonhosted.org/packages/5a/9e/8f81e69bd771014a488c4c64476b6e6faab91b2c913d0f81eca7e06401eb/zopfli-0.4.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:18b5f1570f64d4988482e4466f10ef5f2a30f687c19ad62a64560f2152dc89eb", size = 847135, upload-time = "2025-11-07T17:00:47.483Z" },
6918
+ { url = "https://files.pythonhosted.org/packages/24/84/6e60eeaaa1c1eae7b4805f1c528f3e8ae62cef323ec1e52347a11031e3ba/zopfli-0.4.0-cp310-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72a010d205d00b2855acc2302772067362f9ab5a012e3550662aec60d28e6b3", size = 831606, upload-time = "2025-11-07T17:00:48.576Z" },
6919
+ { url = "https://files.pythonhosted.org/packages/6d/aa/a4d5de7ed8e809953cb5e8992bddc40f38461ec5a44abfb010953875adfc/zopfli-0.4.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c3ba02a9a6ca90481d2b2f68bab038b310d63a1e3b5ae305e95a6599787ed941", size = 1789376, upload-time = "2025-11-07T17:00:49.63Z" },
6920
+ { url = "https://files.pythonhosted.org/packages/39/95/4d1e943fbc44157f58b623625686d0b970f2fda269e721fbf9546b93f6cc/zopfli-0.4.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7d66337be6d5613dec55213e9ac28f378c41e2cc04fbad4a10748e4df774ca85", size = 1879013, upload-time = "2025-11-07T17:00:50.751Z" },
6921
+ { url = "https://files.pythonhosted.org/packages/95/db/4f2eebf73c0e2df293a366a1d176cd315a74ce0b00f83826a7ba9ddd1ab3/zopfli-0.4.0-cp310-abi3-win32.whl", hash = "sha256:03181d48e719fcb6cf8340189c61e8f9883d8bbbdf76bf5212a74457f7d083c1", size = 83655, upload-time = "2025-11-07T17:00:51.797Z" },
6922
+ { url = "https://files.pythonhosted.org/packages/24/f6/bd80c5278b1185dc41155c77bc61bfe1d817254a7f2115f66aa69a270b89/zopfli-0.4.0-cp310-abi3-win_amd64.whl", hash = "sha256:f94e4dd7d76b4fe9f5d9229372be20d7f786164eea5152d1af1c34298c3d5975", size = 100824, upload-time = "2025-11-07T17:00:52.658Z" },
6923
+ { url = "https://files.pythonhosted.org/packages/76/30/92a53a60f20b639c9ce67d0e99cdfc3c4adfc6bc3530a60b724c4765f7e7/zopfli-0.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b8bdb41fbfdc4738b7bdc09ed7c1e951579fae192391a5e694d59bb186cdbec7", size = 156095, upload-time = "2025-11-07T17:00:53.476Z" },
6924
+ { url = "https://files.pythonhosted.org/packages/6f/62/480d6b8d12cc6ef1a1da54fe62f30602c7941256a50c563f37e18168bab1/zopfli-0.4.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9097e8e1dfdb7f5aea5464e469946857e80502b6d29ba1b232450916bd4a74d1", size = 126543, upload-time = "2025-11-07T17:00:56.505Z" },
6925
+ { url = "https://files.pythonhosted.org/packages/6e/d6/1e182231c836c13c5438d13f7425e51fcc7d2dc96a03b1665d6100b7713c/zopfli-0.4.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f67d04280065e24cb9a4174cb6b3d1f763687f8cb2963aa135ad8f57c6995f5a", size = 124992, upload-time = "2025-11-07T17:00:57.474Z" },
6926
+ { url = "https://files.pythonhosted.org/packages/4e/52/4e67fa948c213368540a807a96da822035c71ffcc7a5ada8ee90da5b9614/zopfli-0.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:25e4863b8dc30e5d5309f87c106b0b7d3da4ed0e340b8a52b36d4471e797589f", size = 100851, upload-time = "2025-11-07T17:00:58.331Z" },
6927
+ ]