synkro 0.4.12__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.
Files changed (77) hide show
  1. synkro/__init__.py +179 -0
  2. synkro/advanced.py +186 -0
  3. synkro/cli.py +128 -0
  4. synkro/core/__init__.py +7 -0
  5. synkro/core/checkpoint.py +250 -0
  6. synkro/core/dataset.py +402 -0
  7. synkro/core/policy.py +337 -0
  8. synkro/errors.py +178 -0
  9. synkro/examples/__init__.py +148 -0
  10. synkro/factory.py +276 -0
  11. synkro/formatters/__init__.py +12 -0
  12. synkro/formatters/qa.py +98 -0
  13. synkro/formatters/sft.py +90 -0
  14. synkro/formatters/tool_call.py +127 -0
  15. synkro/generation/__init__.py +9 -0
  16. synkro/generation/follow_ups.py +134 -0
  17. synkro/generation/generator.py +220 -0
  18. synkro/generation/golden_responses.py +244 -0
  19. synkro/generation/golden_scenarios.py +276 -0
  20. synkro/generation/golden_tool_responses.py +416 -0
  21. synkro/generation/logic_extractor.py +126 -0
  22. synkro/generation/multiturn_responses.py +177 -0
  23. synkro/generation/planner.py +131 -0
  24. synkro/generation/responses.py +189 -0
  25. synkro/generation/scenarios.py +90 -0
  26. synkro/generation/tool_responses.py +376 -0
  27. synkro/generation/tool_simulator.py +114 -0
  28. synkro/interactive/__init__.py +12 -0
  29. synkro/interactive/hitl_session.py +77 -0
  30. synkro/interactive/logic_map_editor.py +173 -0
  31. synkro/interactive/rich_ui.py +205 -0
  32. synkro/llm/__init__.py +7 -0
  33. synkro/llm/client.py +235 -0
  34. synkro/llm/rate_limits.py +95 -0
  35. synkro/models/__init__.py +43 -0
  36. synkro/models/anthropic.py +26 -0
  37. synkro/models/google.py +19 -0
  38. synkro/models/openai.py +31 -0
  39. synkro/modes/__init__.py +15 -0
  40. synkro/modes/config.py +66 -0
  41. synkro/modes/qa.py +18 -0
  42. synkro/modes/sft.py +18 -0
  43. synkro/modes/tool_call.py +18 -0
  44. synkro/parsers.py +442 -0
  45. synkro/pipeline/__init__.py +20 -0
  46. synkro/pipeline/phases.py +592 -0
  47. synkro/pipeline/runner.py +424 -0
  48. synkro/pipelines.py +123 -0
  49. synkro/prompts/__init__.py +57 -0
  50. synkro/prompts/base.py +167 -0
  51. synkro/prompts/golden_templates.py +474 -0
  52. synkro/prompts/interactive_templates.py +65 -0
  53. synkro/prompts/multiturn_templates.py +156 -0
  54. synkro/prompts/qa_templates.py +97 -0
  55. synkro/prompts/templates.py +281 -0
  56. synkro/prompts/tool_templates.py +201 -0
  57. synkro/quality/__init__.py +14 -0
  58. synkro/quality/golden_refiner.py +163 -0
  59. synkro/quality/grader.py +153 -0
  60. synkro/quality/multiturn_grader.py +150 -0
  61. synkro/quality/refiner.py +137 -0
  62. synkro/quality/tool_grader.py +126 -0
  63. synkro/quality/tool_refiner.py +128 -0
  64. synkro/quality/verifier.py +228 -0
  65. synkro/reporting.py +537 -0
  66. synkro/schemas.py +472 -0
  67. synkro/types/__init__.py +41 -0
  68. synkro/types/core.py +126 -0
  69. synkro/types/dataset_type.py +30 -0
  70. synkro/types/logic_map.py +345 -0
  71. synkro/types/tool.py +94 -0
  72. synkro-0.4.12.data/data/examples/__init__.py +148 -0
  73. synkro-0.4.12.dist-info/METADATA +258 -0
  74. synkro-0.4.12.dist-info/RECORD +77 -0
  75. synkro-0.4.12.dist-info/WHEEL +4 -0
  76. synkro-0.4.12.dist-info/entry_points.txt +2 -0
  77. synkro-0.4.12.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,258 @@
1
+ Metadata-Version: 2.4
2
+ Name: synkro
3
+ Version: 0.4.12
4
+ Summary: Generate training datasets from any document
5
+ Author: Murtaza Meerza
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Keywords: dataset-generation,fine-tuning,llm,synthetic-data,training-data
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: beautifulsoup4>=4.12
19
+ Requires-Dist: html2text>=2020.1
20
+ Requires-Dist: httpx>=0.25
21
+ Requires-Dist: litellm>=1.40
22
+ Requires-Dist: mammoth>=1.6
23
+ Requires-Dist: marker-pdf>=0.2
24
+ Requires-Dist: pydantic>=2.0
25
+ Requires-Dist: python-dotenv>=1.0
26
+ Requires-Dist: rich>=13.0
27
+ Requires-Dist: typer>=0.9
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
30
+ Requires-Dist: pytest>=7.0; extra == 'dev'
31
+ Requires-Dist: ruff>=0.1; extra == 'dev'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # Synkro
35
+
36
+ Turn policies, handbooks, and documentation into high-quality training data for fine-tuning LLMs.
37
+
38
+ ## Features
39
+
40
+ - **Quality Evaluation** - Each response is graded and automatically refined if it fails
41
+ - **Multiple Formats** - SFT (chat), QA (question-answer), and Tool Calling
42
+ - **Tool Call Training** - Generate OpenAI function calling format for teaching models to use custom tools
43
+ - **Top LLM Providers** - OpenAI, Anthropic, and Google
44
+ - **File Support** - PDF, DOCX, TXT, Markdown, URLs
45
+ - **CLI Included** - Generate datasets from the command line
46
+
47
+ ## Installation
48
+
49
+ ```bash
50
+ pip install synkro
51
+ ```
52
+
53
+ ## Quick Start
54
+
55
+ ```python
56
+ from synkro.pipelines import create_pipeline
57
+ from synkro.models.google import Google
58
+ from synkro.types import DatasetType
59
+
60
+ pipeline = create_pipeline(
61
+ model=Google.GEMINI_25_FLASH, # Fast generation
62
+ grading_model=Google.GEMINI_25_PRO, # Quality grading
63
+ dataset_type=DatasetType.SFT,
64
+ )
65
+
66
+ dataset = pipeline.generate(
67
+ "All expenses over $50 require manager approval.",
68
+ traces=50,
69
+ )
70
+ dataset.save("training.jsonl")
71
+ ```
72
+
73
+ ### From Files
74
+
75
+ ```python
76
+ from synkro.pipelines import create_pipeline
77
+ from synkro.core.policy import Policy
78
+
79
+ policy = Policy.from_file("handbook.pdf") # PDF, DOCX, TXT, MD
80
+ pipeline = create_pipeline()
81
+ dataset = pipeline.generate(policy, traces=100)
82
+ dataset.save()
83
+ ```
84
+
85
+ ### From URLs
86
+
87
+ ```python
88
+ from synkro.core.policy import Policy
89
+
90
+ policy = Policy.from_url("https://example.com/terms")
91
+ dataset = pipeline.generate(policy)
92
+ ```
93
+
94
+ ## Dataset Types
95
+
96
+ | Format | Output | Best For |
97
+ |--------|--------|----------|
98
+ | **SFT** | Chat messages | Fine-tuning chat models |
99
+ | **QA** | Question-answer pairs | RAG systems, knowledge bases |
100
+ | **TOOL_CALL** | Function calling format | Training models to use custom tools |
101
+
102
+ ### SFT (Default)
103
+
104
+ ```python
105
+ from synkro.types import DatasetType
106
+
107
+ pipeline = create_pipeline(dataset_type=DatasetType.SFT)
108
+ dataset = pipeline.generate(policy)
109
+ ```
110
+
111
+ Output:
112
+ ```json
113
+ {"messages": [
114
+ {"role": "system", "content": "You are a policy expert..."},
115
+ {"role": "user", "content": "What's the approval process for $350?"},
116
+ {"role": "assistant", "content": "For a $350 expense, you need..."}
117
+ ]}
118
+ ```
119
+
120
+ ### QA
121
+
122
+ ```python
123
+ pipeline = create_pipeline(dataset_type=DatasetType.QA)
124
+ ```
125
+
126
+ Output:
127
+ ```json
128
+ {"question": "What's the approval process?", "answer": "You need...", "context": "..."}
129
+ ```
130
+
131
+ ### Tool Calling
132
+
133
+ Generate training data for teaching models when and how to use your custom tools:
134
+
135
+ ```python
136
+ from synkro import create_pipeline, ToolDefinition, DatasetType
137
+
138
+ # Define your tools
139
+ web_search = ToolDefinition(
140
+ name="web_search",
141
+ description="Search the web for current information",
142
+ parameters={
143
+ "type": "object",
144
+ "properties": {
145
+ "query": {"type": "string", "description": "Search query"}
146
+ },
147
+ "required": ["query"]
148
+ },
149
+ mock_responses=["NYC: 72°F, sunny", "BTC: $67,234"]
150
+ )
151
+
152
+ # Create pipeline with tools
153
+ pipeline = create_pipeline(
154
+ dataset_type=DatasetType.TOOL_CALL,
155
+ tools=[web_search],
156
+ )
157
+
158
+ # Generate from tool usage guidelines
159
+ dataset = pipeline.generate("""
160
+ Use web_search for real-time data like weather, prices.
161
+ Answer general questions directly without tools.
162
+ """, traces=20)
163
+
164
+ dataset.save("tool_training.jsonl", format="tool_call")
165
+ ```
166
+
167
+ Output (OpenAI function calling format):
168
+ ```json
169
+ {"messages": [
170
+ {"role": "system", "content": "You have access to: web_search..."},
171
+ {"role": "user", "content": "What's the weather in NYC?"},
172
+ {"role": "assistant", "content": null, "tool_calls": [
173
+ {"id": "call_abc", "type": "function", "function": {"name": "web_search", "arguments": "{\"query\": \"weather NYC\"}"}}
174
+ ]},
175
+ {"role": "tool", "tool_call_id": "call_abc", "content": "NYC: 72°F, sunny"},
176
+ {"role": "assistant", "content": "The weather in NYC is 72°F and sunny."}
177
+ ]}
178
+ ```
179
+
180
+ ## Evaluation & Grading
181
+
182
+ Every response is graded on policy compliance, citations, and reasoning. Failed responses are automatically refined (up to N iterations).
183
+
184
+ ```python
185
+ from synkro.pipelines import create_pipeline
186
+ from synkro.models.openai import OpenAI
187
+
188
+ pipeline = create_pipeline(
189
+ model=OpenAI.GPT_4O_MINI, # Fast generation
190
+ grading_model=OpenAI.GPT_4O, # Quality grading
191
+ max_iterations=3, # Refinement attempts
192
+ )
193
+
194
+ dataset = pipeline.generate(policy, traces=100)
195
+
196
+ # Check quality
197
+ print(f"Pass rate: {dataset.passing_rate:.1%}")
198
+
199
+ # Filter to only passing traces
200
+ high_quality = dataset.filter(passed=True)
201
+ high_quality.save("training.jsonl")
202
+ ```
203
+
204
+ ## CLI
205
+
206
+ ```bash
207
+ # From file
208
+ synkro generate policy.pdf --traces 50 --format sft
209
+
210
+ # From text
211
+ synkro generate "All expenses over $50 need approval" -n 20
212
+
213
+ # From URL
214
+ synkro generate https://example.com/policy -o training.jsonl
215
+
216
+ # Skip interactive mode
217
+ synkro generate policy.pdf --no-interactive
218
+ ```
219
+
220
+ **Options:**
221
+ - `--traces, -n` - Number of traces (default: 20)
222
+ - `--format, -f` - Output format: sft, qa, or tool_call (default: sft)
223
+ - `--output, -o` - Output file path
224
+ - `--model, -m` - Model for generation
225
+ - `--interactive/-i, --no-interactive/-I` - Review/edit extracted rules before generation (default: on)
226
+
227
+ ## Interactive Mode
228
+
229
+ By default, synkro extracts policy rules into a Logic Map and lets you review/edit them before generation:
230
+
231
+ ```
232
+ 📜 Logic Map (3 rules extracted)
233
+ ├── R001: Expenses over $50 require manager approval
234
+ ├── R002: Client meals limited to $75/person
235
+ └── R003: Receipts required for all expenses
236
+
237
+ Enter feedback (or 'done'): Add a rule for travel expenses over $500
238
+ ✓ Added R004: Travel expenses over $500 require VP approval
239
+
240
+ Enter feedback (or 'done'): done
241
+ ```
242
+
243
+ Commands: `done`, `undo`, `reset`, `show R001`
244
+
245
+ ## Logic Map Inspection
246
+
247
+ Access the extracted rules programmatically:
248
+
249
+ ```python
250
+ result = pipeline.generate(policy, traces=50, return_logic_map=True)
251
+
252
+ # Inspect extracted rules
253
+ for rule in result.logic_map.rules:
254
+ print(f"{rule.rule_id}: {rule.text}")
255
+
256
+ # Get the dataset
257
+ dataset = result.dataset
258
+ ```
@@ -0,0 +1,77 @@
1
+ synkro/__init__.py,sha256=z6CqcFG7rfW7nhSKg0bEUnXGmMzPoCY7dBL0nnlRr7c,6129
2
+ synkro/advanced.py,sha256=txqzWM4QJD52QCHdx0ee2fliZgLRuFgzyZzLVf1OfTk,4933
3
+ synkro/cli.py,sha256=PIiLIzQjHWABzSh8k4eMYf3igrGSITbzUPyMmZJy6cE,3181
4
+ synkro/errors.py,sha256=HlzJmlnOdXRb_AtwMTuJeAgy_xTF30KfLmOOCa878gM,5878
5
+ synkro/factory.py,sha256=_oki5uqDyWYR-11ty1K8AO5jGoLtTOuZxVXMTvh7Rhs,10694
6
+ synkro/parsers.py,sha256=YFTHODdxoWT94xj1NNGLGuYNIHlAAV6o_xl6GIoKSz4,13800
7
+ synkro/pipelines.py,sha256=g3JssK4GEgHeiHgZIFMtsLZHzsFgzudsX8rq3IYfZgg,4313
8
+ synkro/reporting.py,sha256=sU2mSPXeHmyYsp4i5XZ4AOckk80zzF9otrWcMgWpnLo,22884
9
+ synkro/schemas.py,sha256=kJHFDx_6yzn29EftA60k7LtHW_Sxr_ztDhbto79WKXM,16371
10
+ synkro/core/__init__.py,sha256=DG4rFXQyJdVQmqBmMDYMNiNlFZwIBrGhp8yw5rB7rEw,167
11
+ synkro/core/checkpoint.py,sha256=EiKWr9btEOPQwsZjmdjyl5SISdrYYPOkCyAgRCLGbv4,8630
12
+ synkro/core/dataset.py,sha256=iB5WxIlwh8MFOaO5is96fCqhK2zs-xOy-lf_UUp3GBE,13082
13
+ synkro/core/policy.py,sha256=waKUtZXXx6-RIKGz5cEzuBpnF26rSTw6OPSbktjrsQs,10592
14
+ synkro/examples/__init__.py,sha256=kMrh5pnL9himSR_uSo2uQxyExyRGAmYucLZ1p5t5NZs,4436
15
+ synkro/formatters/__init__.py,sha256=xMZRPjDRTFcoEOF2XT_bhapzpMafSDsAAtwhhneFIv4,292
16
+ synkro/formatters/qa.py,sha256=_hZbvHR9BYLBK1NpBbZf6BpwsBtFzdvsWZ-P7735gRE,2877
17
+ synkro/formatters/sft.py,sha256=FcweL_SX69WK-K14MzDiUlJYGRa06aTdzirt1Vq5CxA,2470
18
+ synkro/formatters/tool_call.py,sha256=PUVwX6gCW4Qo3vzTy_tELnWXoIJHdCpBn-7kQU2nUFM,4147
19
+ synkro/generation/__init__.py,sha256=AyInSLljvtnTDnhLMHRePecHp1OkcQNVrwUymRJkuNo,348
20
+ synkro/generation/follow_ups.py,sha256=ghzS5jlRO3SPdSgHNe2ML-Ydz5c_vuhpSlm1uHhqf2s,4568
21
+ synkro/generation/generator.py,sha256=4u4Vxk8NT1SweHICazlkijab_Et7nEI6Tfb2wrjCmLE,8406
22
+ synkro/generation/golden_responses.py,sha256=RxQYuTz6ySxnBdF2C1B05aNGdWUuvJ0JcR3GcANzMtA,7848
23
+ synkro/generation/golden_scenarios.py,sha256=CMe_GYkdWwJYxtVV4s5XnYEB0g89j8dYuPTiDNDna4A,9204
24
+ synkro/generation/golden_tool_responses.py,sha256=YaP512GqM2Nn5pXR35xEkUhRllvTCVqRsjDia1qvukU,13929
25
+ synkro/generation/logic_extractor.py,sha256=y_TvNDF5aYw3iQitQa9LPoTHiu3O8fD-csPaUZdR-vI,3848
26
+ synkro/generation/multiturn_responses.py,sha256=pM_mTGUb0yi_q8biWO6TXXE8vj8cKqWXirBrNdo925Y,5592
27
+ synkro/generation/planner.py,sha256=gdEFda3he_YlPii4M6ksc7TYvt2nNN0eesEauTbmYvo,4625
28
+ synkro/generation/responses.py,sha256=zMRTtTzg9hfR6Bwo1iFK-TStSUUYihf3b1p3bTu7JUA,5672
29
+ synkro/generation/scenarios.py,sha256=SrsTrTzLkcBGmME63JcCL0I_guKy931NnpXRVZVgNSs,2717
30
+ synkro/generation/tool_responses.py,sha256=UwjdOS5BWQ6bBPCvP3nKdSOuKBr8daMhlrmcXAbIpEs,12284
31
+ synkro/generation/tool_simulator.py,sha256=lnlPlhKPXZTrv34Fu9J_eTeQcGtN-HYEx06Fi8Z05CA,3640
32
+ synkro/interactive/__init__.py,sha256=gxMAj9rl8yvABs83tRgqENwuLm4Ezpxd1D_czg2oAMM,368
33
+ synkro/interactive/hitl_session.py,sha256=xkpJ9-XcRl8-pw_-WSVS0MiZLTnn-oXIYd3q52Ve-q4,2341
34
+ synkro/interactive/logic_map_editor.py,sha256=wu2cR5OWOPQtAOHyhsoEICEtlHdlAVMOYgfDDCecwSM,5879
35
+ synkro/interactive/rich_ui.py,sha256=VLJ2iF-Wh6Avhyiozxbz4DZODi646YFN4-HQ3dJk7QU,7566
36
+ synkro/llm/__init__.py,sha256=o-mYVn6GoWfZOp8k53TwivcQ92XsqzIsOSo2NLBHKxk,210
37
+ synkro/llm/client.py,sha256=OKjO32UFxaKLeFTpLTYSFywm2LU3mOXK3TpfBhOMwrA,7343
38
+ synkro/llm/rate_limits.py,sha256=lo_HAvfElovW3s6Oj2zpQUvtp81d_KWBFQefbonrEVg,2412
39
+ synkro/models/__init__.py,sha256=h07Gn4c8tMiRMBlOXimxMRKO9Zq4Wom-v5rdlSIaKlY,984
40
+ synkro/models/anthropic.py,sha256=wngs0GrOn13BtM0qGZvFrPoz9vy2T2o19qb0UkeqsQ4,782
41
+ synkro/models/google.py,sha256=J_ePDNzfcbnZOrprGwwMZY-g6hjCFH1rWB6_8yHrlHA,474
42
+ synkro/models/openai.py,sha256=HD9P_GTYpaX7nfdBreYTuEWpoN1g0oosPIQQL7BgThs,699
43
+ synkro/modes/__init__.py,sha256=HF1mL-4gAPQAd5InOn5YM7k2x8YF4hWZtdJw3I4CRKw,362
44
+ synkro/modes/config.py,sha256=Q3ZyNB-wPWj7emcJ4MTiC_Z1LEfTNfyWxiEQ-W6UYnU,1700
45
+ synkro/modes/qa.py,sha256=xtaW6JGaJH5dua0Zf0gxnuo0yZhh8Wu1Yb1OK_z5twM,463
46
+ synkro/modes/sft.py,sha256=oVijQlXYT1CgzXYE2wf4vAmxTja5wZxG8ii3F-5XEA4,506
47
+ synkro/modes/tool_call.py,sha256=EWdG_cb6eN3OP3JGxvwjH_1aKXSX0PgPT7MoBuxoqkM,518
48
+ synkro/pipeline/__init__.py,sha256=cyDk301kmJYE7ro3eO4bLiQWhpMqvUqL5zIMG_1t1pU,398
49
+ synkro/pipeline/phases.py,sha256=7Nqqd5UKV0kUQZypZi9c5NvohxFgi88Y7iCcf72SG6g,19598
50
+ synkro/pipeline/runner.py,sha256=0xpcZTwueMLFB8aHDU_X5qEkZqUmw_H0zz3cBYkxO14,16599
51
+ synkro/prompts/__init__.py,sha256=kzxPkQ0ffHxMCgQrVBNtihh8PrmO8VDkhWzgX62p2JY,1400
52
+ synkro/prompts/base.py,sha256=TZv21qqTJ6huazueclkCQEsDbRkind9PqP4eTk99g5A,4587
53
+ synkro/prompts/golden_templates.py,sha256=vraPzOxu-zK6B1Ea62gMhguqXfpBXyTPzTzCjuyAywE,18202
54
+ synkro/prompts/interactive_templates.py,sha256=K1Y5S5O-D8QrBCXxr3TeER1ZAkgmGnjqer92DKZCpNA,2678
55
+ synkro/prompts/multiturn_templates.py,sha256=JhAD0AIi6Y_hEERjXkZN_xQtwn6TjW0mbE4QOB1IpIQ,5386
56
+ synkro/prompts/qa_templates.py,sha256=tJzDwDo6ReTUZCzumxlDMl9BOwztnL1aFnGkj6ceSeM,2726
57
+ synkro/prompts/templates.py,sha256=VfAW5PkBVOMzEAbLhxyUHR2yC2HQcDA5-7h1vOdtPRE,13147
58
+ synkro/prompts/tool_templates.py,sha256=XLhy6tvO9m5sctMPRGBLeS3LDp6V4woWE_YkojPmnq0,6242
59
+ synkro/quality/__init__.py,sha256=EBTJaJ7PgnxY5-bSAYWROL_YNK9KSwledqrtlAO8YgM,352
60
+ synkro/quality/golden_refiner.py,sha256=0ZC1hOz5k6P5sbBKtDnIgfkbQrwMzrKxFkj2gH0IN10,5801
61
+ synkro/quality/grader.py,sha256=bNB3HaqtGpbVcdPBio8LRTPstkbGle9z-V3Wh2l5248,4908
62
+ synkro/quality/multiturn_grader.py,sha256=BPvjn3qZADqcA-daXG6G-nzl7PArnooOxw1-WZGFCOI,5162
63
+ synkro/quality/refiner.py,sha256=bg6mVaIfAqHy1Zk1QCM-debkNxLlfGaeKEqFe8NLImo,4007
64
+ synkro/quality/tool_grader.py,sha256=k9zVgsTxTt6vWG-cZXu7SHIKoWPhq-lOWlWRr4w-HWU,4427
65
+ synkro/quality/tool_refiner.py,sha256=HARfJa8RdIkU5LewnQy2JZ-43cHtWMcBerZriYD_LSo,4574
66
+ synkro/quality/verifier.py,sha256=lA56Q99DGdSFOwOunNdapccuKa3d1W_uQwlHbAVkFsQ,8643
67
+ synkro/types/__init__.py,sha256=PH8uNYHGadGhF9hdbbCpsviDlA855y9X0rWbcsh1T0s,711
68
+ synkro/types/core.py,sha256=IkEf82k3fU9cUsaSVXGRx_SZhv5qiLEQN3rIDbfPG24,4570
69
+ synkro/types/dataset_type.py,sha256=qgcDNVThniQ09xHyfigVmfG8-TEk81L3mFjQxnn51gU,857
70
+ synkro/types/logic_map.py,sha256=6PqUlsPwer78Ab7BDaM57uHZ8Gti1qM1Z-7hqugez7s,10726
71
+ synkro/types/tool.py,sha256=Zej5UWWYqYxEyRhDclxc_Fkdt7aQiE7hNnEeR5DJb9w,3232
72
+ synkro-0.4.12.data/data/examples/__init__.py,sha256=kMrh5pnL9himSR_uSo2uQxyExyRGAmYucLZ1p5t5NZs,4436
73
+ synkro-0.4.12.dist-info/METADATA,sha256=gEab5DYGQMbsWXS7bVSDHn4g2zykdCMuBkQiiFMsdRw,7201
74
+ synkro-0.4.12.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
75
+ synkro-0.4.12.dist-info/entry_points.txt,sha256=trxD69adEHCwUkRdvJ5-elW5BIHzx77QRTM_cxK5mzk,43
76
+ synkro-0.4.12.dist-info/licenses/LICENSE,sha256=-L5MVraHKLJI1BfHTaTPSkNuWMWYkQroo2g1FwdRDQw,1070
77
+ synkro-0.4.12.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ synkro = synkro.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Murtaza Meerza
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.