quantalogic 0.2.16__py3-none-any.whl → 0.2.17__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.
quantalogic/xml_parser.py CHANGED
@@ -7,6 +7,7 @@ with support for handling malformed XML and CDATA sections.
7
7
  import html
8
8
  import re
9
9
  from collections import defaultdict
10
+ from functools import lru_cache
10
11
  from typing import Self
11
12
 
12
13
  from loguru import logger
@@ -51,15 +52,38 @@ class ToleranceXMLParser:
51
52
  edge cases such as incomplete tags and CDATA sections.
52
53
  """
53
54
 
55
+ # Default mappings for element name normalization
56
+ DEFAULT_NAME_MAP = {
57
+ "o": "output",
58
+ "i": "input",
59
+ "opt": "optional"
60
+ }
61
+
54
62
  def __init__(self: Self) -> None:
55
63
  """Initialize the parser with regex patterns for matching XML-like elements."""
56
- # Pattern for matching individual XML elements, including malformed tags
57
- # Modified to be more lenient with content and preserve exact formatting
58
- self.element_pattern = re.compile(r"<([^/>]+?)>(.*?)(?:</\1>|<\1>)", re.DOTALL)
64
+ # Pattern for matching individual XML elements with better whitespace handling
65
+ self.element_pattern = re.compile(
66
+ r"<\s*([^/>]+?)\s*>(.*?)(?:</\s*\1\s*>|<\s*\1\s*>)",
67
+ re.DOTALL
68
+ )
59
69
  # Pattern for matching CDATA sections
60
70
  self.cdata_pattern = re.compile(r"<!\[CDATA\[(.*?)]]>", re.DOTALL)
61
71
  logger.debug("Initialized ToleranceXMLParser with regex patterns")
62
72
 
73
+ def _validate_input(self, text: str) -> None:
74
+ """Validate input text before processing.
75
+
76
+ Args:
77
+ text: Input text to validate.
78
+
79
+ Raises:
80
+ ValueError: If input text is invalid.
81
+ """
82
+ if not text or not isinstance(text, str):
83
+ raise ValueError("Input text must be a non-empty string")
84
+ if len(text.strip()) == 0:
85
+ raise ValueError("Input text cannot be whitespace only")
86
+
63
87
  def _extract_and_remove_cdata(self: Self, content: str, preserve_cdata: bool = False) -> tuple[str, list[str]]:
64
88
  """Extract CDATA sections from content.
65
89
 
@@ -96,6 +120,7 @@ class ToleranceXMLParser:
96
120
  # Only unescape HTML entities, preserve everything else exactly as is
97
121
  return html.unescape(content)
98
122
 
123
+ @lru_cache(maxsize=128)
99
124
  def _map_element_name(self: Self, name: str) -> str:
100
125
  """Map element names to their canonical form.
101
126
 
@@ -105,9 +130,82 @@ class ToleranceXMLParser:
105
130
  Returns:
106
131
  Canonical element name.
107
132
  """
108
- # Map common element name variations
109
- name_map = {"o": "output", "i": "input", "opt": "optional"}
110
- return name_map.get(name.strip(), name.strip())
133
+ return self.DEFAULT_NAME_MAP.get(name.strip(), name.strip())
134
+
135
+ def _build_element_pattern(self, element_name: str) -> re.Pattern[str]:
136
+ """Build regex pattern for finding specific XML elements.
137
+
138
+ Args:
139
+ element_name: Name of the element to match.
140
+
141
+ Returns:
142
+ Compiled regex pattern for matching the element.
143
+ """
144
+ non_cdata = r"(?:(?!<!\[CDATA\[|]]>).)*?"
145
+ cdata_section = r"(?:<!\[CDATA\[.*?]]>)?"
146
+ content_pattern = f"({non_cdata}{cdata_section}{non_cdata})"
147
+ closing_pattern = "(?:</\1>|<\1>)"
148
+
149
+ return re.compile(
150
+ f"<{element_name}>{content_pattern}{closing_pattern}",
151
+ re.DOTALL
152
+ )
153
+
154
+ def _find_all_elements(self, text: str) -> list[tuple[str, str]]:
155
+ """Find all XML elements in text.
156
+
157
+ Args:
158
+ text: Input text to search.
159
+
160
+ Returns:
161
+ List of tuples containing element names and their content.
162
+ """
163
+ return [(match.group(1), match.group(2) or "")
164
+ for match in self.element_pattern.finditer(text)]
165
+
166
+ def _process_element_content(self, content: str, preserve_cdata: bool) -> str:
167
+ """Process content of a single element.
168
+
169
+ Args:
170
+ content: Raw element content.
171
+ preserve_cdata: Whether to preserve CDATA sections.
172
+
173
+ Returns:
174
+ Processed content string.
175
+ """
176
+ content, cdata_sections = self._extract_and_remove_cdata(content, preserve_cdata)
177
+ content = self._clean_content(content)
178
+
179
+ # If content is empty but we have CDATA sections and we're not preserving them
180
+ if not content.strip() and cdata_sections and not preserve_cdata:
181
+ return cdata_sections[0]
182
+ return content
183
+
184
+ def _process_elements(
185
+ self,
186
+ elements: list[tuple[str, str]],
187
+ preserve_cdata: bool
188
+ ) -> dict[str, str]:
189
+ """Process found elements and handle CDATA sections.
190
+
191
+ Args:
192
+ elements: List of element name and content tuples.
193
+ preserve_cdata: Whether to preserve CDATA sections.
194
+
195
+ Returns:
196
+ Dictionary mapping element names to their processed content.
197
+ """
198
+ result: dict[str, str] = defaultdict(str)
199
+ for name, content in elements:
200
+ name = self._map_element_name(name)
201
+ result[name] = self._process_element_content(content, preserve_cdata)
202
+
203
+ # Handle nested elements
204
+ nested_elements = self._find_all_elements(content)
205
+ nested_results = self._process_elements(nested_elements, preserve_cdata)
206
+ result.update(nested_results)
207
+
208
+ return dict(result)
111
209
 
112
210
  def _extract_element_content(self: Self, text: str, preserve_cdata: bool = False) -> dict[str, str]:
113
211
  """Extract content from nested XML elements.
@@ -119,35 +217,8 @@ class ToleranceXMLParser:
119
217
  Returns:
120
218
  Dictionary mapping element names to their content values.
121
219
  """
122
- elements: dict[str, str] = defaultdict(str)
123
-
124
- # Process each match
125
- for match in self.element_pattern.finditer(text):
126
- name = match.group(1)
127
- content = match.group(2) or ""
128
-
129
- # Map element name to canonical form
130
- name = self._map_element_name(name)
131
-
132
- # Extract and handle CDATA sections
133
- content, cdata_sections = self._extract_and_remove_cdata(content, preserve_cdata)
134
-
135
- # Clean and normalize content
136
- content = self._clean_content(content)
137
-
138
- # If the content is empty but we have CDATA sections and we're
139
- # not preserving them
140
- if not content.strip() and cdata_sections and not preserve_cdata:
141
- content = cdata_sections[0]
142
-
143
- # Store the element content
144
- elements[name] = content
145
-
146
- # Extract nested elements from the content
147
- nested_elements = self._extract_element_content(content, preserve_cdata)
148
- elements.update(nested_elements)
149
-
150
- return dict(elements) # Convert defaultdict to regular dict
220
+ elements = self._find_all_elements(text)
221
+ return self._process_elements(elements, preserve_cdata)
151
222
 
152
223
  def extract_elements(
153
224
  self: Self,
@@ -172,9 +243,7 @@ class ToleranceXMLParser:
172
243
  ValueError: If the input text is invalid or contains malformed XML.
173
244
  """
174
245
  try:
175
- if not text or not isinstance(text, str):
176
- raise ValueError("Input text must be a non-empty string")
177
-
246
+ self._validate_input(text)
178
247
  logger.debug(f"Extracting elements: {element_names or 'all'}")
179
248
 
180
249
  # Extract all elements and their content
@@ -206,18 +275,9 @@ class ToleranceXMLParser:
206
275
  ValueError: If the input text is invalid or contains malformed XML.
207
276
  """
208
277
  try:
209
- if not text or not isinstance(text, str):
210
- raise ValueError("Input text must be a non-empty string")
211
-
278
+ self._validate_input(text)
212
279
  elements: list[XMLElement] = []
213
- pattern = re.compile(
214
- f"<{element_name}>"
215
- r"((?:(?!<!\[CDATA\[|]]>).)*?"
216
- r"(?:<!\[CDATA\[.*?]]>)?"
217
- r"(?:(?!<!\[CDATA\[|]]>).)*?)"
218
- f"(?:</\1>|<\1>)",
219
- re.DOTALL,
220
- )
280
+ pattern = self._build_element_pattern(element_name)
221
281
 
222
282
  for match in pattern.finditer(text):
223
283
  content = match.group(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.2.16
3
+ Version: 0.2.17
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -15,11 +15,20 @@ Requires-Dist: fastapi (>=0.115.6,<0.116.0)
15
15
  Requires-Dist: google-auth (>=2.20.0,<3.0.0)
16
16
  Requires-Dist: google-search-results (>=2.4.2,<3.0.0)
17
17
  Requires-Dist: litellm (>=1.56.4,<2.0.0)
18
+ Requires-Dist: llmlingua (>=0.2.2,<0.3.0)
18
19
  Requires-Dist: loguru (>=0.7.3,<0.8.0)
19
20
  Requires-Dist: markitdown (>=0.0.1a3,<0.0.2)
21
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin (>=1.2.0,<2.0.0)
22
+ Requires-Dist: mkdocs-macros-plugin (>=1.0.4,<2.0.0)
23
+ Requires-Dist: mkdocs-material[imaging] (>=9.5.49,<10.0.0)
24
+ Requires-Dist: mkdocs-mermaid2-plugin (>=1.1.1,<2.0.0)
25
+ Requires-Dist: mkdocs-minify-plugin (>=0.7.1,<0.8.0)
26
+ Requires-Dist: mkdocstrings (>=0.24.0,<0.25.0)
27
+ Requires-Dist: mkdocstrings-python (>=1.7.0,<2.0.0)
20
28
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
21
29
  Requires-Dist: prompt-toolkit (>=3.0.48,<4.0.0)
22
30
  Requires-Dist: pydantic (>=2.10.4,<3.0.0)
31
+ Requires-Dist: pymdown-extensions (>=10.3.1,<11.0.0)
23
32
  Requires-Dist: rich (>=13.9.4,<14.0.0)
24
33
  Requires-Dist: serpapi (>=0.1.5,<0.2.0)
25
34
  Requires-Dist: tenacity (>=9.0.0,<10.0.0)
@@ -43,7 +52,7 @@ Description-Content-Type: text/markdown
43
52
 
44
53
  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
45
54
  [![Python](https://img.shields.io/badge/Python-3.12+-blue.svg)](https://www.python.org/downloads/)
46
- [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg)]()
55
+ [![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://quantalogic.github.io/quantalogic/)
47
56
 
48
57
  QuantaLogic is a ReAct (Reasoning & Action) framework for building advanced AI agents.
49
58
 
@@ -51,6 +60,8 @@ It seamlessly integrates large language models (LLMs) with a robust tool system,
51
60
 
52
61
  The `cli` version include coding capabilities comparable to Aider.
53
62
 
63
+ [📖 Documentation](https://quantalogic.github.io/quantalogic/)
64
+
54
65
 
55
66
  ## Why QuantaLogic?
56
67
 
@@ -80,6 +91,7 @@ We created [QuantaLogic](https://www.quantalogic.app) because we saw a significa
80
91
  - [Development](#-development)
81
92
  - [Contributing](#-contributing)
82
93
  - [License](#-license)
94
+ - [Documentation Development](#-documentation-development)
83
95
 
84
96
  ## 📦 Installation
85
97
 
@@ -128,9 +140,9 @@ Usage: quantalogic [OPTIONS] COMMAND [ARGS]...
128
140
  Options:
129
141
  --version Show version information.
130
142
  --model-name TEXT Specify the text model to use (litellm format,
131
- e.g. "openrouter/deepseek-chat").
143
+ e.g. "openrouter/deepseek/deepseek-chat").
132
144
  --vision-model-name TEXT Specify the vision model to use (litellm format,
133
- e.g. "openrouter/A/gpt-4o-mini").
145
+ e.g. "openrouter/openai/gpt-4o-mini").
134
146
  --log [info|debug|warning] Set logging level (info/debug/warning).
135
147
  --verbose Enable verbose output.
136
148
  --max-iterations INTEGER Maximum iterations for task solving (default: 30).
@@ -251,7 +263,7 @@ from quantalogic.tools import PythonTool, ReadFileTool
251
263
 
252
264
  # Create agent with specific tools
253
265
  agent = Agent(
254
- model_name="openrouter/deepseek-chat",
266
+ model_name="openrouter/deepseek/deepseek-chat",
255
267
  tools=[
256
268
  PythonTool(),
257
269
  ReadFileTool()
@@ -844,148 +856,7 @@ print(results)
844
856
  ```
845
857
  ```
846
858
 
847
- #### Creating Custom Tools
848
-
849
- ```python
850
- from quantalogic.tools import Tool, ToolArgument
851
-
852
- class DatabaseTool(Tool):
853
- name: str = "database_tool"
854
- description: str = "Execute database operations"
855
- need_validation: bool = True
856
-
857
- arguments: list[ToolArgument] = [
858
- ToolArgument(
859
- name="query",
860
- arg_type="string",
861
- description="SQL query to execute",
862
- required=True
863
- )
864
- ]
865
-
866
- def execute(self, query: str) -> str:
867
- # Tool implementation
868
- return "Query results"
869
859
  ```
870
-
871
-
872
- ## 🌐 Web Interface
873
-
874
- Features:
875
- - Real-time event visualization
876
- - Task submission and monitoring
877
- - Interactive validation dialogs
878
- - Model selection
879
- - Event filtering and search
880
-
881
- ### API Endpoints
882
-
883
- | Endpoint | Method | Description |
884
- | ------------------ | ------ | --------------- |
885
- | `/tasks` | POST | Submit tasks |
886
- | `/tasks/{task_id}` | GET | Task status |
887
- | `/events` | GET | SSE endpoint |
888
- | `/validate` | POST | Task validation |
889
-
890
-
891
- ## 📖 Examples
892
-
893
- ### Python Tool Integration Example
894
-
895
- ```python
896
- import os
897
-
898
- from quantalogic import Agent, console_print_events
899
- from quantalogic.tools import (
900
- PythonTool,
901
- )
902
-
903
- # Verify API key is set - required for authentication with DeepSeek's API
904
- # This check ensures the agent won't fail during runtime due to missing credentials
905
- if not os.environ.get("DEEPSEEK_API_KEY"):
906
- raise ValueError("DEEPSEEK_API_KEY environment variable is not set")
907
-
908
- # Initialize agent with DeepSeek model and Python tool
909
- agent = Agent(model_name="deepseek/deepseek-chat", tools=[PythonTool()])
910
-
911
- # Configure comprehensive event monitoring system
912
- # Tracks all agent activities including:
913
- # - Code execution steps
914
- # - Tool interactions
915
- # - Error conditions
916
- # Essential for debugging and performance optimization
917
- agent.event_emitter.on(
918
- "*",
919
- console_print_events,
920
- )
921
-
922
- # Execute a precision mathematics task demonstrating:
923
- # - High-precision calculations
924
- # - PythonTool integration
925
- # - Real-time monitoring capabilities
926
- result = agent.solve_task("1. Calculate PI with 10000 decimal places.")
927
- print(result)
928
- ```
929
-
930
- ### Agent with Event Monitoring
931
-
932
- ```python
933
- import os
934
-
935
- from quantalogic import Agent, console_print_events
936
- from quantalogic.tools import (
937
- LLMTool,
938
- )
939
-
940
- # Verify API key is set - required for authentication with DeepSeek's API
941
- # This check ensures the agent won't fail during runtime due to missing credentials
942
- if not os.environ.get("DEEPSEEK_API_KEY"):
943
- raise ValueError("DEEPSEEK_API_KEY environment variable is not set")
944
-
945
- # Initialize agent with DeepSeek model and LLM tool
946
- # The LLM tool serves dual purpose:
947
- # 1. As a reasoning engine for the agent's cognitive processes
948
- # 2. As a latent space explorer, enabling the agent to:
949
- # - Discover novel solution paths
950
- # - Generate creative combinations of concepts
951
- # - Explore alternative reasoning strategies
952
- # Using the same model ensures consistent behavior across both roles
953
- agent = Agent(model_name="deepseek/deepseek-chat", tools=[LLMTool(model_name="deepseek/deepseek-chat")])
954
-
955
- # Set up event monitoring to track agent's lifecycle
956
- # This helps in debugging and understanding the agent's behavior
957
- agent.event_emitter.on(
958
- [
959
- "task_complete",
960
- "task_think_start",
961
- "task_think_end",
962
- "tool_execution_start",
963
- "tool_execution_end",
964
- "error_max_iterations_reached",
965
- "memory_full",
966
- "memory_compacted",
967
- "memory_summary",
968
- ],
969
- console_print_events,
970
- )
971
-
972
- # Execute a multi-step task showcasing agent's capabilities
973
- # Demonstrates:
974
- # 1. Creative content generation
975
- # 2. Language translation
976
- # 3. Style adaptation
977
- # 4. Multi-step reasoning and execution
978
- result = agent.solve_task(
979
- "1. Write a poem in English about a dog. "
980
- "2. Translate the poem into French. "
981
- "3. Choose 2 French authors"
982
- "4. Rewrite the translated poem with the style of the chosen authors. "
983
- )
984
- print(result)
985
- ```
986
-
987
-
988
-
989
860
  ### Project Documentation
990
861
 
991
862
  ```python
@@ -993,7 +864,7 @@ from quantalogic import Agent
993
864
  from quantalogic.tools import MarkitdownTool, ReadFileTool
994
865
 
995
866
  agent = Agent(
996
- model_name="openrouter/deepseek-chat",
867
+ model_name="openrouter/deepseek/deepseek-chat",
997
868
  tools=[MarkitdownTool(), ReadFileTool()]
998
869
  )
999
870
 
@@ -1,18 +1,20 @@
1
- quantalogic/__init__.py,sha256=HFk7_19UzHzYwvPzb9QTQ4w_lPwTTPda61AYb8qggZY,686
2
- quantalogic/agent.py,sha256=uKY0y1ruJUUvnXmEyQASIFQbmoGZEj08w4T--eduEpQ,26711
3
- quantalogic/agent_config.py,sha256=RWXnRpZeT_twtDIFVHY0K7EdHLmEbb8LvVGRr0oc3Q8,4634
4
- quantalogic/coding_agent.py,sha256=xKrkf-d3BDQRaeD6ODKDwgtpmWFmZxwP_IaNY6Py9Ew,3528
1
+ quantalogic/__init__.py,sha256=kX0c_xmD9OslWnAE92YHMGuD7xZcTo8ZOF_5R64HKps,784
2
+ quantalogic/agent.py,sha256=w4ljI0ccOagTioJLFWQH05M7P304qe-NB6Cca_JIjgU,27900
3
+ quantalogic/agent_config.py,sha256=zS7uPPPJ7sxKy4iBY5lkgDdDZR7H6mEGy4Q605-4oXs,5516
4
+ quantalogic/coding_agent.py,sha256=NDXZyGBwxnjy3E5MmZ43axA1IIq7uFH14DpbNRVLWzM,3899
5
+ quantalogic/console_print_events.py,sha256=KB-DGi52As8M96eUs1N_vgNqKIFtqv_H8NTOd3TLTgQ,2163
6
+ quantalogic/console_print_token.py,sha256=qSU-3kmoZk4T5-1ybrEBi8tIXDPcz7eyWKhGh3E8uIg,395
7
+ quantalogic/docs_cli.py,sha256=3giVbUpespB9ZdTSJ955A3BhcOaBl5Lwsn1AVy9XAeY,1663
5
8
  quantalogic/event_emitter.py,sha256=jqot2g4JRXc88K6PW837Oqxbf7shZfO-xdPaUWmzupk,7901
6
- quantalogic/generative_model.py,sha256=pDbjwPfOQEtuZBk8o9uT8vxjauFfXwTM7GkMco73jfU,11787
9
+ quantalogic/generative_model.py,sha256=DcLFYNS9H588dPfIL5s4pajG9EVpdPN0Mp36waQIFRk,12294
7
10
  quantalogic/interactive_text_editor.py,sha256=kYeTA2qej5kxtPvAUHy_Dr2MhrGQAyenLFpW9mU9Rmw,6855
8
- quantalogic/main.py,sha256=pMcJ7cLNcBWKsMRFFl7I1XVY52nmbXMcL_A4tNyU_Ts,11905
11
+ quantalogic/main.py,sha256=rHctMiV9-XRf6O-PIisjOdaF2y1SQNclUJQ53KPdh9A,14138
9
12
  quantalogic/memory.py,sha256=zbtRuM05jaS2lJll-92dt5JfYVLERnF_m_9xqp2x-k0,6304
10
13
  quantalogic/model_names.py,sha256=UZlz25zG9B2dpfwdw_e1Gw5qFsKQ7iME9FJh9Ts4u6s,938
11
- quantalogic/print_event.py,sha256=nl1aRdYnsU72SRezafePF82zKtrqGfY8OoTx2QfbdE8,2206
12
14
  quantalogic/prompts.py,sha256=jRAm9YYvwx8KAx42Ak2H7y2p_1jIVuL1e3Wsd2Y81Cc,3548
13
15
  quantalogic/search_agent.py,sha256=Jy-Zw77giZOlON_bDO0u3ppfRxv_O0EGcGmN4QuuLmQ,1944
14
16
  quantalogic/server/__init__.py,sha256=8sz_PYAUCrkM6JM5EAUeIzNM4NPW6j6UT72JVkc21WQ,91
15
- quantalogic/server/agent_server.py,sha256=38GEK_MpLp--CX_dCkopTFOU7KcGuOw4-GciwmRJyyg,22502
17
+ quantalogic/server/agent_server.py,sha256=JNginXlkgBfJLqgKffoTBSvBWI8ZO1uXUgTOqLINk_g,22517
16
18
  quantalogic/server/models.py,sha256=nVUGWElOsUw8QnRCGJylk25wCew_5gohe6nldYighUA,1322
17
19
  quantalogic/server/routes.py,sha256=00nFe6s0T4Gv8vCp0wQFjWGo1tC8FViH8h0koAJdWs4,4216
18
20
  quantalogic/server/state.py,sha256=TwtL0BTp_LT-fynF1IR4k8WVXuxXWtSv3NgWG9fuUME,7369
@@ -39,8 +41,8 @@ quantalogic/tools/language_handlers/rust_handler.py,sha256=t_AqKVa3KVk6SVkq_UjUU
39
41
  quantalogic/tools/language_handlers/scala_handler.py,sha256=wr-cWOIFOc0UYwODmEtT6rV63Qf1NyNB_BLo23GLrvk,1281
40
42
  quantalogic/tools/language_handlers/typescript_handler.py,sha256=L4vuJMYxKO3_83dQhdwZ9fogauIV7rwoicRT0xLGfkQ,1738
41
43
  quantalogic/tools/list_directory_tool.py,sha256=8Hy38DelSh-mRqS_uDLpeBYoHLtEy5ji77xI-TJu3Ms,4176
42
- quantalogic/tools/llm_tool.py,sha256=9SNApqvNT2qF9GWxEVzMKq8XiVtc-UoyamhsIWvgZQI,5456
43
- quantalogic/tools/llm_vision_tool.py,sha256=OP2B6bYjnKvO7TjSG0gEtwvV5L0m4uFDWAaU54cOG3w,4913
44
+ quantalogic/tools/llm_tool.py,sha256=m9OyF38QQ0afWKtmbwrGxpt1p3T-ZWAkgwRp2ScToiI,6877
45
+ quantalogic/tools/llm_vision_tool.py,sha256=eVDIrANxxZCHxYp9xaAN8hLdFhlYm7bUu2tX9-1xUbI,5496
44
46
  quantalogic/tools/markitdown_tool.py,sha256=lpbJBLx43_x2DjiZAV1HSidkHeqkkV0KvgeLG2fphK4,4339
45
47
  quantalogic/tools/nodejs_tool.py,sha256=zdnE0VFj_5786uR2L0o-SKR0Gk8L-U7rdj7xGHJYIq0,19905
46
48
  quantalogic/tools/python_tool.py,sha256=70HLbfU2clOBgj4axDOtIKzXwEBMNGEAX1nGSf-KNNQ,18156
@@ -66,10 +68,10 @@ quantalogic/utils/git_ls.py,sha256=_aXg2TwqYv9CoOrhQ1gqHCqu1j8wOVigQNWbGncSDlM,4
66
68
  quantalogic/utils/read_file.py,sha256=tSRVHk8dIP4nNLL89v5kRki4hOTjVyjbmuEb2zwvwCY,2077
67
69
  quantalogic/utils/read_http_text_content.py,sha256=n3IayT5KcqctIVVF2gOQQAMf3Ow6eenlVgfXTpLcQbw,4410
68
70
  quantalogic/version.py,sha256=ea_cRutaQk5_lwlLbUUvPFuOT7Of7-gAsDl7wdveS-g,107
69
- quantalogic/xml_parser.py,sha256=cTRorr5sVfkIzH72M0C-GQ9ROGPiz2FTT66U9ndjzhE,9538
71
+ quantalogic/xml_parser.py,sha256=uMLQNHTRCg116FwcjRoquZmSwVtE4LEH-6V2E3RD-dA,11466
70
72
  quantalogic/xml_tool_parser.py,sha256=lsVzClZBrZan7wjCuCKnGHWzksXI3VMy_vWthxu2_bo,3738
71
- quantalogic-0.2.16.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
- quantalogic-0.2.16.dist-info/METADATA,sha256=38YNMH6-P_Sj7eUvqvsKfN1cgevdzcH2GFDCgwH-6As,41875
73
- quantalogic-0.2.16.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
74
- quantalogic-0.2.16.dist-info/entry_points.txt,sha256=wgSq5SRU98yvlRHGEZD1Xn7sS5CSjH2RfUtTa6Qy28Q,52
75
- quantalogic-0.2.16.dist-info/RECORD,,
73
+ quantalogic-0.2.17.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
74
+ quantalogic-0.2.17.dist-info/METADATA,sha256=0RCGjrnGzipu7eGuYGEgmd1jDFWetzPCjzHHBMHDS_o,38574
75
+ quantalogic-0.2.17.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
76
+ quantalogic-0.2.17.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
77
+ quantalogic-0.2.17.dist-info/RECORD,,
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ docs-build=quantalogic.docs_cli:build_docs
3
+ docs-deploy=quantalogic.docs_cli:deploy_docs
4
+ docs-serve=quantalogic.docs_cli:serve_docs
5
+ quantalogic=quantalogic.main:cli
6
+
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- quantalogic=quantalogic.main:cli
3
-