quantalogic 0.2.26__py3-none-any.whl → 0.28__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.
@@ -0,0 +1,124 @@
1
+ import random
2
+ from datetime import datetime, timedelta
3
+
4
+ from faker import Faker
5
+ from sqlalchemy import Column, Date, Float, ForeignKey, Integer, String, create_engine
6
+ from sqlalchemy.orm import declarative_base, relationship, sessionmaker
7
+
8
+ Base = declarative_base()
9
+ fake = Faker()
10
+
11
+ def create_sample_database(db_path: str) -> None:
12
+ """
13
+ Creates a sample SQLite database with 5 tables and 10 rows each.
14
+
15
+ Args:
16
+ db_path: Path to the SQLite database file (e.g., 'sample.db')
17
+ """
18
+ # Define database schema
19
+ class Customer(Base):
20
+ __tablename__ = 'customers'
21
+ id = Column(Integer, primary_key=True)
22
+ name = Column(String)
23
+ email = Column(String)
24
+ addresses = relationship("Address", back_populates="customer")
25
+ orders = relationship("Order", back_populates="customer")
26
+
27
+ class Address(Base):
28
+ __tablename__ = 'addresses'
29
+ id = Column(Integer, primary_key=True)
30
+ street = Column(String)
31
+ city = Column(String)
32
+ customer_id = Column(Integer, ForeignKey('customers.id'))
33
+ customer = relationship("Customer", back_populates="addresses")
34
+
35
+ class Product(Base):
36
+ __tablename__ = 'products'
37
+ id = Column(Integer, primary_key=True)
38
+ name = Column(String)
39
+ price = Column(Float)
40
+
41
+ class Order(Base):
42
+ __tablename__ = 'orders'
43
+ id = Column(Integer, primary_key=True)
44
+ order_date = Column(Date)
45
+ customer_id = Column(Integer, ForeignKey('customers.id'))
46
+ customer = relationship("Customer", back_populates="orders")
47
+ items = relationship("OrderItem", back_populates="order")
48
+
49
+ class OrderItem(Base):
50
+ __tablename__ = 'order_items'
51
+ id = Column(Integer, primary_key=True)
52
+ quantity = Column(Integer)
53
+ order_id = Column(Integer, ForeignKey('orders.id'))
54
+ product_id = Column(Integer, ForeignKey('products.id'))
55
+ order = relationship("Order", back_populates="items")
56
+ product = relationship("Product")
57
+
58
+ # Create database and tables
59
+ engine = create_engine(f'sqlite:///{db_path}')
60
+ Base.metadata.create_all(engine)
61
+ Session = sessionmaker(bind=engine) # noqa: N806
62
+ session = Session()
63
+
64
+ # Generate sample data
65
+ try:
66
+ # Create 10 customers
67
+ customers = []
68
+ for _ in range(10):
69
+ customer = Customer(
70
+ name=fake.name(),
71
+ email=fake.email()
72
+ )
73
+ customers.append(customer)
74
+ session.add(customer)
75
+
76
+ session.commit()
77
+
78
+ # Create 10 addresses (1 per customer)
79
+ for customer in customers:
80
+ address = Address(
81
+ street=fake.street_address(),
82
+ city=fake.city(),
83
+ customer=customer
84
+ )
85
+ session.add(address)
86
+
87
+ # Create 10 products
88
+ products = []
89
+ for _ in range(10):
90
+ product = Product(
91
+ name=fake.word().capitalize(),
92
+ price=round(random.uniform(10, 1000), 2)
93
+ )
94
+ products.append(product)
95
+ session.add(product)
96
+
97
+ # Create 10 orders (1 per customer)
98
+ orders = []
99
+ start_date = datetime.now() - timedelta(days=365)
100
+ for customer in customers:
101
+ order = Order(
102
+ order_date=fake.date_between(start_date=start_date),
103
+ customer=customer
104
+ )
105
+ orders.append(order)
106
+ session.add(order)
107
+
108
+ # Create 10 order items (1 per order)
109
+ for order in orders:
110
+ order_item = OrderItem(
111
+ quantity=random.randint(1, 5),
112
+ order=order,
113
+ product=random.choice(products)
114
+ )
115
+ session.add(order_item)
116
+
117
+ session.commit()
118
+ finally:
119
+ session.close()
120
+
121
+ # Example usage
122
+ if __name__ == "__main__":
123
+ create_sample_database("sample.db")
124
+ print("Sample database created successfully!")
@@ -0,0 +1,289 @@
1
+ from datetime import UTC, datetime
2
+ from typing import Dict, List
3
+
4
+ import networkx as nx
5
+ from sqlalchemy import create_engine, inspect, text
6
+ from sqlalchemy.engine import Inspector
7
+
8
+
9
+ def generate_database_report(connection_string: str) -> str:
10
+ """
11
+ Generates a comprehensive Markdown database documentation report with ER diagram.
12
+
13
+ Args:
14
+ connection_string: SQLAlchemy-compatible database connection string
15
+
16
+ Returns:
17
+ Markdown-formatted report as a string
18
+ """
19
+ # Setup database connection and inspection
20
+ engine = create_engine(connection_string)
21
+ inspector = inspect(engine)
22
+
23
+ # Collect database metadata
24
+ db_metadata = {
25
+ 'name': engine.url.database,
26
+ 'dialect': engine.dialect.name,
27
+ 'tables': inspector.get_table_names()
28
+ }
29
+
30
+ # Initialize data structures
31
+ graph = nx.DiGraph()
32
+ table_metadata: Dict[str, dict] = {}
33
+ fk_relationships: List[dict] = []
34
+ sampled_ids: Dict[str, list] = {}
35
+ sample_data: Dict[str, list] = {}
36
+
37
+ # Collect schema metadata and relationships
38
+ for table in db_metadata['tables']:
39
+ columns = inspector.get_columns(table)
40
+ pk = inspector.get_pk_constraint(table).get('constrained_columns', [])
41
+ indexes = inspector.get_indexes(table)
42
+ fks = inspector.get_foreign_keys(table)
43
+
44
+ # Process foreign keys
45
+ for fk in fks:
46
+ process_foreign_key(table, fk, inspector, graph, fk_relationships)
47
+
48
+ table_metadata[table] = {
49
+ 'columns': columns,
50
+ 'primary_keys': pk,
51
+ 'indexes': indexes,
52
+ 'foreign_keys': fks
53
+ }
54
+
55
+ # Process tables in dependency order
56
+ sorted_tables = get_sorted_tables(graph, db_metadata['tables'])
57
+
58
+ # Collect sample data with parent-child relationships
59
+ collect_sample_data(engine, sorted_tables, table_metadata, sample_data, sampled_ids)
60
+
61
+ # Generate Markdown report
62
+ return generate_markdown_report(db_metadata, sorted_tables, table_metadata,
63
+ fk_relationships, sample_data)
64
+
65
+
66
+ def process_foreign_key(
67
+ table: str,
68
+ fk: dict,
69
+ inspector: Inspector,
70
+ graph: nx.DiGraph,
71
+ fk_relationships: List[dict]
72
+ ) -> None:
73
+ """Process and record foreign key relationships with cardinality information."""
74
+ src_col = fk['constrained_columns'][0]
75
+ tgt_table = fk['referred_table']
76
+ tgt_col = fk['referred_columns'][0]
77
+
78
+ # Check uniqueness and nullability in source column
79
+ src_columns = inspector.get_columns(table)
80
+ src_col_meta = next(c for c in src_columns if c['name'] == src_col)
81
+ is_unique = src_col_meta.get('unique', False) or src_col in inspector.get_pk_constraint(table).get('constrained_columns', [])
82
+ is_nullable = src_col_meta['nullable']
83
+
84
+ fk_relationships.append({
85
+ 'source_table': table,
86
+ 'source_column': src_col,
87
+ 'target_table': tgt_table,
88
+ 'target_column': tgt_col,
89
+ 'constraint_name': fk['name'],
90
+ 'is_unique': is_unique,
91
+ 'is_nullable': is_nullable
92
+ })
93
+ graph.add_edge(table, tgt_table)
94
+
95
+
96
+ def get_sorted_tables(graph: nx.DiGraph, tables: List[str]) -> List[str]:
97
+ """Return tables sorted topologically with fallback to original order."""
98
+ try:
99
+ return list(nx.topological_sort(graph))
100
+ except nx.NetworkXUnfeasible:
101
+ return tables
102
+
103
+
104
+ def collect_sample_data(
105
+ engine,
106
+ tables: List[str],
107
+ table_metadata: Dict[str, dict],
108
+ sample_data: Dict[str, list],
109
+ sampled_ids: Dict[str, list]
110
+ ) -> None:
111
+ """Collect sample data while maintaining referential integrity."""
112
+ for table in tables:
113
+ with engine.connect() as conn:
114
+ # Get parent samples
115
+ result = conn.execute(text(f"SELECT * FROM {table} LIMIT 5"))
116
+ samples = [dict(row._mapping) for row in result]
117
+ sample_data[table] = samples
118
+
119
+ # Store IDs for child sampling
120
+ if samples and table_metadata[table]['primary_keys']:
121
+ pk_col = table_metadata[table]['primary_keys'][0]
122
+ sampled_ids[table] = [row[pk_col] for row in samples]
123
+
124
+
125
+ def generate_markdown_report(
126
+ db_metadata: dict,
127
+ tables: List[str],
128
+ table_metadata: Dict[str, dict],
129
+ fk_relationships: List[dict],
130
+ sample_data: Dict[str, list]
131
+ ) -> str:
132
+ """Generate the complete Markdown report."""
133
+ md = []
134
+
135
+ # Database Summary
136
+ md.append("# Database Documentation Report\n")
137
+ md.append(f"**Database Type**: {db_metadata['dialect'].capitalize()}\n")
138
+ md.append(f"**Database Name**: {db_metadata['name']}\n")
139
+ md.append(f"**Total Tables**: {len(db_metadata['tables'])}\n")
140
+ md.append(f"**Generated At**: {datetime.now(UTC).strftime('%Y-%m-%d %H:%M:%S UTC')}\n\n")
141
+
142
+ # ERD Section
143
+ md.append("## Entity Relationship Diagram\n")
144
+ md.append("```mermaid\nerDiagram\n")
145
+ generate_erd_section(md, tables, table_metadata, fk_relationships)
146
+ md.append("```\n\n")
147
+
148
+ # Schema Details
149
+ md.append("## Schema Details\n")
150
+ for table in tables:
151
+ meta = table_metadata[table]
152
+ md.append(f"### {table}\n")
153
+ generate_columns_section(md, meta)
154
+ generate_indexes_section(md, meta)
155
+
156
+ # Relationships
157
+ generate_relationships_section(md, fk_relationships)
158
+
159
+ # Cardinality Report
160
+ generate_cardinality_section(md, fk_relationships)
161
+
162
+ # Data Samples
163
+ md.append("## Data Samples\n")
164
+ for table in tables:
165
+ samples = sample_data[table]
166
+ md.append(f"### {table}\n")
167
+ generate_sample_table(md, samples)
168
+
169
+ return '\n'.join(md)
170
+
171
+
172
+ def generate_erd_section(md: List[str], tables: List[str], table_metadata: Dict[str, dict], fk_relationships: List[dict]) -> None:
173
+ """Generate Mermaid ER diagram section."""
174
+ # Define tables with their columns
175
+ for table in tables:
176
+ table_upper = table.upper()
177
+ md.append(f" {table_upper} {{\n")
178
+ for col in table_metadata[table]['columns']:
179
+ col_type = str(col['type']).split('(')[0].upper() # Simplify type names
180
+ annotations = []
181
+ if col['name'] in table_metadata[table]['primary_keys']:
182
+ annotations.append("PK")
183
+ # Check if column is a foreign key
184
+ for fk in fk_relationships:
185
+ if fk['source_table'] == table and fk['source_column'] == col['name']:
186
+ annotations.append("FK")
187
+ break
188
+ annotation_str = " ".join(annotations)
189
+ md.append(f" {col_type} {col['name']} {annotation_str}\n")
190
+ md.append(" }\n")
191
+
192
+ # Define relationships with cardinality
193
+ for fk in fk_relationships:
194
+ target_table = fk['target_table'].upper()
195
+ source_table = fk['source_table'].upper()
196
+ source_cardinality = get_source_cardinality(fk['is_unique'], fk['is_nullable'])
197
+ md.append(f" {target_table} ||--{source_cardinality} {source_table} : \"{fk['constraint_name']}\"\n")
198
+
199
+
200
+ def get_source_cardinality(is_unique: bool, is_nullable: bool) -> str:
201
+ """Determine Mermaid cardinality symbol for source side of relationship."""
202
+ if is_unique:
203
+ return "|o" if is_nullable else "||"
204
+ else:
205
+ return "o{" if is_nullable else "|{"
206
+
207
+
208
+ def generate_relationships_section(md: List[str], fk_relationships: List[dict]) -> None:
209
+ """Generate foreign key relationships section."""
210
+ if fk_relationships:
211
+ md.append("## Relationships\n")
212
+ for fk in fk_relationships:
213
+ src = f"{fk['source_table']}.{fk['source_column']}"
214
+ tgt = f"{fk['target_table']}.{fk['target_column']}"
215
+ md.append(f"- `{src}` → `{tgt}` (Constraint: `{fk['constraint_name']}`)\n")
216
+ md.append("\n")
217
+
218
+
219
+ def generate_cardinality_section(md: List[str], fk_relationships: List[dict]) -> None:
220
+ """Generate cardinality report section."""
221
+ cardinalities = {}
222
+ for fk in fk_relationships:
223
+ key = (fk['target_table'], fk['source_table'])
224
+ if key in cardinalities:
225
+ continue
226
+
227
+ if fk['is_unique']:
228
+ cardinality = "(1) → (1)"
229
+ else:
230
+ cardinality = "(1) → (N)"
231
+
232
+ cardinalities[key] = f"{fk['target_table']} {cardinality} {fk['source_table']}"
233
+
234
+ if cardinalities:
235
+ md.append("## Cardinality Report\n")
236
+ for entry in cardinalities.values():
237
+ md.append(f"- {entry}\n")
238
+ md.append("\n")
239
+
240
+
241
+ def generate_columns_section(md: List[str], meta: dict) -> None:
242
+ """Generate columns table section."""
243
+ md.append("#### Columns\n")
244
+ md.append("| Column Name | Data Type | Nullable? | Primary Key? |\n")
245
+ md.append("|-------------|-----------|-----------|--------------|\n")
246
+ for col in meta['columns']:
247
+ pk = "Yes" if col['name'] in meta['primary_keys'] else "No"
248
+ md.append(f"| `{col['name']}` | {col['type']} | {'Yes' if col['nullable'] else 'No'} | {pk} |\n")
249
+ md.append("\n")
250
+
251
+
252
+ def generate_indexes_section(md: List[str], meta: dict) -> None:
253
+ """Generate indexes section."""
254
+ if meta['indexes']:
255
+ md.append("#### Indexes\n")
256
+ for idx in meta['indexes']:
257
+ columns = ", ".join(idx['column_names'])
258
+ md.append(f"- `{idx['name']}` ({idx['type'] or 'INDEX'}) → {columns}\n")
259
+ md.append("\n")
260
+
261
+
262
+ def generate_sample_table(md: List[str], samples: list) -> None:
263
+ """Generate sample data table section."""
264
+ if not samples:
265
+ md.append("No records found.\n\n")
266
+ return
267
+
268
+ headers = samples[0].keys()
269
+ md.append("| " + " | ".join(headers) + " |\n")
270
+ md.append("|" + "|".join(["---"] * len(headers)) + "|\n")
271
+
272
+ for row in samples:
273
+ values = []
274
+ for val in row.values():
275
+ if isinstance(val, str) and len(val) > 50:
276
+ values.append(f"{val[:47]}...")
277
+ else:
278
+ values.append(str(val))
279
+ md.append("| " + " | ".join(values) + " |\n")
280
+ md.append("\n")
281
+
282
+
283
+ if __name__ == "__main__":
284
+ from quantalogic.tools.utils.create_sample_database import create_sample_database
285
+
286
+ # Create and document sample database
287
+ create_sample_database("sample.db")
288
+ report = generate_database_report("sqlite:///sample.db")
289
+ print(report)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.2.26
3
+ Version: 0.28
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -12,6 +12,7 @@ Requires-Dist: beautifulsoup4 (>=4.12.3,<5.0.0)
12
12
  Requires-Dist: boto3 (>=1.35.86,<2.0.0)
13
13
  Requires-Dist: click (>=8.1.8,<9.0.0)
14
14
  Requires-Dist: duckduckgo-search (>=7.2.1,<8.0.0)
15
+ Requires-Dist: faker (>=33.3.1,<34.0.0)
15
16
  Requires-Dist: fastapi (>=0.115.6,<0.116.0)
16
17
  Requires-Dist: google-auth (>=2.20.0,<3.0.0)
17
18
  Requires-Dist: google-search-results (>=2.4.2,<3.0.0)
@@ -28,13 +29,16 @@ Requires-Dist: mkdocs-mermaid2-plugin (>=1.1.1,<2.0.0)
28
29
  Requires-Dist: mkdocs-minify-plugin (>=0.7.1,<0.8.0)
29
30
  Requires-Dist: mkdocstrings (>=0.24.0,<0.25.0)
30
31
  Requires-Dist: mkdocstrings-python (>=1.7.0,<2.0.0)
32
+ Requires-Dist: networkx (>=3.4.2,<4.0.0)
31
33
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
32
34
  Requires-Dist: prompt-toolkit (>=3.0.48,<4.0.0)
33
35
  Requires-Dist: pydantic (>=2.10.4,<3.0.0)
34
36
  Requires-Dist: pymdown-extensions (>=10.3.1,<11.0.0)
37
+ Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
35
38
  Requires-Dist: requests (>=2.32.3,<3.0.0)
36
39
  Requires-Dist: rich (>=13.9.4,<14.0.0)
37
40
  Requires-Dist: serpapi (>=0.1.5,<0.2.0)
41
+ Requires-Dist: sqlalchemy (>=2.0.37,<3.0.0)
38
42
  Requires-Dist: tenacity (>=9.0.0,<10.0.0)
39
43
  Requires-Dist: toml (>=0.10.2,<0.11.0)
40
44
  Requires-Dist: tree-sitter (>=0.23.2,<0.24.0)
@@ -82,7 +86,7 @@ We created [QuantaLogic](https://www.quantalogic.app) because we saw a significa
82
86
  ## 🌟 Highlights
83
87
 
84
88
  - **ReAct Framework**: Advanced implementation combining LLM reasoning with concrete actions
85
- - **Universal LLM Support**: Integration with OpenAI, Anthropic, LM Studio, Bedrock, Ollama, DeepSeek V3, via LiteLLM
89
+ - **Universal LLM Support**: Integration with OpenAI, Anthropic, LM Studio, Bedrock, Ollama, DeepSeek V3, DeepSeek R1, via LiteLLM. Example usage: `quantalogic --model-name deepseek/deepseek-reasoner` or `quantalogic --model-name openrouter/deepseek/deepseek-r1`
86
90
  - **Secure Tool System**: Docker-based code execution and file manipulation tools
87
91
  - **Real-time Monitoring**: Web interface with SSE-based event visualization
88
92
  - **Memory Management**: Intelligent context handling and optimization
@@ -1,9 +1,8 @@
1
- quantalogic/.DS_Store,sha256=eca-id755LHcqhOPlLg84Op_uvWhoJGFTR_i_r8G2K8,6148
2
1
  quantalogic/__init__.py,sha256=kX0c_xmD9OslWnAE92YHMGuD7xZcTo8ZOF_5R64HKps,784
3
2
  quantalogic/agent.py,sha256=r6MbnVaBv9tYNk8WR7YJAjXlEGgko8GSYitWzr7uNMY,31841
4
3
  quantalogic/agent_config.py,sha256=9sjDnCPlAqVM45oguB_D509WSCaXZmuaVUtLcOvDlPg,7572
5
4
  quantalogic/agent_factory.py,sha256=ODVGuGtugSzmSdP6jiWlT8WyC5onANc6BIs83FC90Bg,3782
6
- quantalogic/coding_agent.py,sha256=UJ0fdKKA8XSB2py0NW4-e-orozo78ZAprXWuortYBiA,4935
5
+ quantalogic/coding_agent.py,sha256=Z7ik6LUvLKDnaW9Ax1iZGC7p1WMnlYEUIlE5lkBP414,4975
7
6
  quantalogic/console_print_events.py,sha256=KB-DGi52As8M96eUs1N_vgNqKIFtqv_H8NTOd3TLTgQ,2163
8
7
  quantalogic/console_print_token.py,sha256=qSU-3kmoZk4T5-1ybrEBi8tIXDPcz7eyWKhGh3E8uIg,395
9
8
  quantalogic/docs_cli.py,sha256=3giVbUpespB9ZdTSJ955A3BhcOaBl5Lwsn1AVy9XAeY,1663
@@ -27,14 +26,16 @@ quantalogic/server/templates/index.html,sha256=nDnXJoQEm1vXbhXtgaYk0G5VXj0wwzE6K
27
26
  quantalogic/task_file_reader.py,sha256=AMIJoeVY9Hhu0dBJ-C5EyaOFsXLkhn2oBhVs-WTnnLk,1460
28
27
  quantalogic/task_runner.py,sha256=FtxfZs2dxdsSZoiW92K3dpfegFe0dyKx9ZP5CCyEAzo,9965
29
28
  quantalogic/tool_manager.py,sha256=JAC5E5kLfYzYJx0QRIWbG14q1hlkOcwJFBG7HE8twpU,2425
30
- quantalogic/tools/__init__.py,sha256=GcYjE1r6aNQ_JZ8uwk0yaCCCMBz6zrD_PjkRtZiUhSk,1923
29
+ quantalogic/tools/__init__.py,sha256=pTirT5UBynuTkAzFYebu7ttGAMP3_A0idFvDp6lGZJQ,2146
31
30
  quantalogic/tools/agent_tool.py,sha256=MXCXxWHRch7VK4UWhtRP1jeI8Np9Ne2CUGo8vm1oZiM,3064
32
31
  quantalogic/tools/dalle_e.py,sha256=nur2kl6DKjaWWaHcmF_y9vS5bvty2fW8hQfdgf5KWfs,10948
33
32
  quantalogic/tools/download_http_file_tool.py,sha256=wTfanbXjIRi5-qrbluuLvNmDNhvmYAnlMVb3dO8C2ss,2210
34
33
  quantalogic/tools/duckduckgo_search_tool.py,sha256=xVaEb_SUK5NL3lwMQXj1rGQYYvNT-td-qaB9QCes27Q,7014
35
34
  quantalogic/tools/edit_whole_content_tool.py,sha256=nXmpAvojvqvAcqNMy1kUKZ1ocboky_ZcnCR4SNCSPgw,2360
36
35
  quantalogic/tools/elixir_tool.py,sha256=fzPPtAW-Koy9KB0r5k2zV1f1U0WphL-LXPPOBkeNkug,7652
37
- quantalogic/tools/execute_bash_command_tool.py,sha256=fnx-zSPpxR2EofaleygAorrR21gRs43jBWh7IBAoNKw,4131
36
+ quantalogic/tools/execute_bash_command_tool.py,sha256=0JGeJobY1QC6mx8HZYTqNAUg5cNc5Xn8a26J45XaDRE,4693
37
+ quantalogic/tools/generate_database_report_tool.py,sha256=QbZjtmegGEOEZAIa-CSeBo5O9dYBZTk_PWrumyFUg1Q,1890
38
+ quantalogic/tools/grep_app_tool.py,sha256=BDxygwx7WCbqbiP2jmSRnIsoIUVYG5A4SKzId524ys4,19957
38
39
  quantalogic/tools/input_question_tool.py,sha256=UoTlNhdmdr-eyiVtVCG2qJe_R4bU_ag-DzstSdmYkvM,1848
39
40
  quantalogic/tools/jinja_tool.py,sha256=1bqkFia2GtfntIyTVg4tCiPP8S1dX43U7QsrBE1Ngps,2893
40
41
  quantalogic/tools/language_handlers/__init__.py,sha256=5GD6TYsMqRni0nwePp2KOjNQ04GnT5wihT6YAuvx43c,699
@@ -60,9 +61,13 @@ quantalogic/tools/replace_in_file_tool.py,sha256=n63s09Y8RXOKGjxfWw0D6F6JpQ6ERSJ
60
61
  quantalogic/tools/ripgrep_tool.py,sha256=sRzHaWac9fa0cCGhECJN04jw_Ko0O3u45KDWzMIYcvY,14291
61
62
  quantalogic/tools/search_definition_names.py,sha256=Qj9ex226vHs8Jf-kydmTh7B_R8O5buIsJpQu3CvYw7k,18601
62
63
  quantalogic/tools/serpapi_search_tool.py,sha256=sX-Noch77kGP2XiwislPNFyy3_4TH6TwMK6C81L3q9Y,5316
64
+ quantalogic/tools/sql_query_tool.py,sha256=oScXJeLevIiKj_2-byPtD1fQ2FltlzywazVI68aNidc,6068
63
65
  quantalogic/tools/task_complete_tool.py,sha256=L8tuyVoN07Q2hOsxx17JTW0C5Jd_N-C0i_0PtCUQUKU,929
64
66
  quantalogic/tools/tool.py,sha256=fdD-wwAOgfua2RRk1FHv_mlNBQ1FTzPO8vMIKiRirZM,9800
65
67
  quantalogic/tools/unified_diff_tool.py,sha256=wTKXIoBEPcC_EcQmpJZVi95vq0Ncvsw1Kyc7XqPO6dU,14147
68
+ quantalogic/tools/utils/__init__.py,sha256=qLQaS1JvZt_Bfg5sTj-TUa47u2IatLaIwDZe0EtXELI,344
69
+ quantalogic/tools/utils/create_sample_database.py,sha256=Aus9xRLGfQfsYnxsAkJ5CW-Za6fwKQeqm2mOXqgkMis,4018
70
+ quantalogic/tools/utils/generate_database_report.py,sha256=0D-5fWOfpAh1jEcld5OTQP5x6XkJE5jpNY6FyHv1L2s,10345
66
71
  quantalogic/tools/wikipedia_search_tool.py,sha256=bdZ_0dYTxpEfU04tBFsatnLM5P9Z3kAZgKQEjsopJLA,5405
67
72
  quantalogic/tools/write_file_tool.py,sha256=_mx9_Zjg2oMAAVzlcHEKjZVZUxQVgbRfcoMKgWnoZcg,3764
68
73
  quantalogic/utils/__init__.py,sha256=Ltq7tzLuHCl9BpCvfRVA9Sjrtp1RJesrn7G980lbl_c,563
@@ -80,8 +85,8 @@ quantalogic/version_check.py,sha256=cttR1lR3OienGLl7NrK1Te1fhDkqSjCci7HC1vFUTSY,
80
85
  quantalogic/welcome_message.py,sha256=IXMhem8h7srzNUwvw8G_lmEkHU8PFfote021E_BXmVk,3039
81
86
  quantalogic/xml_parser.py,sha256=uMLQNHTRCg116FwcjRoquZmSwVtE4LEH-6V2E3RD-dA,11466
82
87
  quantalogic/xml_tool_parser.py,sha256=Vz4LEgDbelJynD1siLOVkJ3gLlfHsUk65_gCwbYJyGc,3784
83
- quantalogic-0.2.26.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
84
- quantalogic-0.2.26.dist-info/METADATA,sha256=jb0PIHKkAGlfW5x3GPQvcbzJNbG-79nxJm-t8zCN7hA,20216
85
- quantalogic-0.2.26.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
86
- quantalogic-0.2.26.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
87
- quantalogic-0.2.26.dist-info/RECORD,,
88
+ quantalogic-0.28.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
89
+ quantalogic-0.28.dist-info/METADATA,sha256=qeDO4LMDkO8ZX4n2KYXl6AUM-M6b20l8F4x40rTjKYw,20530
90
+ quantalogic-0.28.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
91
+ quantalogic-0.28.dist-info/entry_points.txt,sha256=h74O_Q3qBRCrDR99qvwB4BpBGzASPUIjCfxHq6Qnups,183
92
+ quantalogic-0.28.dist-info/RECORD,,
quantalogic/.DS_Store DELETED
Binary file