krons 0.1.0__py3-none-any.whl → 0.2.0__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 (162) hide show
  1. krons/__init__.py +49 -0
  2. krons/agent/__init__.py +144 -0
  3. krons/agent/mcps/__init__.py +14 -0
  4. krons/agent/mcps/loader.py +287 -0
  5. krons/agent/mcps/wrapper.py +799 -0
  6. krons/agent/message/__init__.py +20 -0
  7. krons/agent/message/action.py +69 -0
  8. krons/agent/message/assistant.py +52 -0
  9. krons/agent/message/common.py +49 -0
  10. krons/agent/message/instruction.py +130 -0
  11. krons/agent/message/prepare_msg.py +187 -0
  12. krons/agent/message/role.py +53 -0
  13. krons/agent/message/system.py +53 -0
  14. krons/agent/operations/__init__.py +82 -0
  15. krons/agent/operations/act.py +100 -0
  16. krons/agent/operations/generate.py +145 -0
  17. krons/agent/operations/llm_reparse.py +89 -0
  18. krons/agent/operations/operate.py +247 -0
  19. krons/agent/operations/parse.py +243 -0
  20. krons/agent/operations/react.py +286 -0
  21. krons/agent/operations/specs.py +235 -0
  22. krons/agent/operations/structure.py +151 -0
  23. krons/agent/operations/utils.py +79 -0
  24. krons/agent/providers/__init__.py +17 -0
  25. krons/agent/providers/anthropic_messages.py +146 -0
  26. krons/agent/providers/claude_code.py +276 -0
  27. krons/agent/providers/gemini.py +268 -0
  28. krons/agent/providers/match.py +75 -0
  29. krons/agent/providers/oai_chat.py +174 -0
  30. krons/agent/third_party/__init__.py +2 -0
  31. krons/agent/third_party/anthropic_models.py +154 -0
  32. krons/agent/third_party/claude_code.py +682 -0
  33. krons/agent/third_party/gemini_models.py +508 -0
  34. krons/agent/third_party/openai_models.py +295 -0
  35. krons/agent/tool.py +291 -0
  36. krons/core/__init__.py +127 -0
  37. krons/core/base/__init__.py +121 -0
  38. {kronos/core → krons/core/base}/broadcaster.py +7 -3
  39. {kronos/core → krons/core/base}/element.py +15 -7
  40. {kronos/core → krons/core/base}/event.py +41 -8
  41. {kronos/core → krons/core/base}/eventbus.py +4 -2
  42. {kronos/core → krons/core/base}/flow.py +14 -7
  43. {kronos/core → krons/core/base}/graph.py +27 -11
  44. {kronos/core → krons/core/base}/node.py +47 -22
  45. {kronos/core → krons/core/base}/pile.py +26 -12
  46. {kronos/core → krons/core/base}/processor.py +23 -9
  47. {kronos/core → krons/core/base}/progression.py +5 -3
  48. {kronos → krons/core}/specs/__init__.py +0 -5
  49. {kronos → krons/core}/specs/adapters/dataclass_field.py +16 -8
  50. {kronos → krons/core}/specs/adapters/pydantic_adapter.py +11 -5
  51. {kronos → krons/core}/specs/adapters/sql_ddl.py +16 -10
  52. {kronos → krons/core}/specs/catalog/__init__.py +2 -2
  53. {kronos → krons/core}/specs/catalog/_audit.py +3 -3
  54. {kronos → krons/core}/specs/catalog/_common.py +2 -2
  55. {kronos → krons/core}/specs/catalog/_content.py +5 -5
  56. {kronos → krons/core}/specs/catalog/_enforcement.py +4 -4
  57. {kronos → krons/core}/specs/factory.py +7 -7
  58. {kronos → krons/core}/specs/operable.py +9 -3
  59. {kronos → krons/core}/specs/protocol.py +4 -2
  60. {kronos → krons/core}/specs/spec.py +25 -13
  61. {kronos → krons/core}/types/base.py +7 -5
  62. {kronos → krons/core}/types/db_types.py +2 -2
  63. {kronos → krons/core}/types/identity.py +1 -1
  64. {kronos → krons}/errors.py +13 -13
  65. {kronos → krons}/protocols.py +9 -4
  66. krons/resource/__init__.py +89 -0
  67. {kronos/services → krons/resource}/backend.py +50 -24
  68. {kronos/services → krons/resource}/endpoint.py +28 -14
  69. {kronos/services → krons/resource}/hook.py +22 -9
  70. {kronos/services → krons/resource}/imodel.py +50 -32
  71. {kronos/services → krons/resource}/registry.py +27 -25
  72. {kronos/services → krons/resource}/utilities/rate_limited_executor.py +10 -6
  73. {kronos/services → krons/resource}/utilities/rate_limiter.py +4 -2
  74. {kronos/services → krons/resource}/utilities/resilience.py +17 -7
  75. krons/resource/utilities/token_calculator.py +185 -0
  76. {kronos → krons}/session/__init__.py +12 -17
  77. krons/session/constraints.py +70 -0
  78. {kronos → krons}/session/exchange.py +14 -6
  79. {kronos → krons}/session/message.py +4 -2
  80. krons/session/registry.py +35 -0
  81. {kronos → krons}/session/session.py +165 -174
  82. krons/utils/__init__.py +85 -0
  83. krons/utils/_function_arg_parser.py +99 -0
  84. krons/utils/_pythonic_function_call.py +249 -0
  85. {kronos → krons}/utils/_to_list.py +9 -3
  86. {kronos → krons}/utils/_utils.py +9 -5
  87. {kronos → krons}/utils/concurrency/__init__.py +38 -38
  88. {kronos → krons}/utils/concurrency/_async_call.py +6 -4
  89. {kronos → krons}/utils/concurrency/_errors.py +3 -1
  90. {kronos → krons}/utils/concurrency/_patterns.py +3 -1
  91. {kronos → krons}/utils/concurrency/_resource_tracker.py +6 -2
  92. krons/utils/display.py +257 -0
  93. {kronos → krons}/utils/fuzzy/__init__.py +6 -1
  94. {kronos → krons}/utils/fuzzy/_fuzzy_match.py +14 -8
  95. {kronos → krons}/utils/fuzzy/_string_similarity.py +3 -1
  96. {kronos → krons}/utils/fuzzy/_to_dict.py +3 -1
  97. krons/utils/schemas/__init__.py +26 -0
  98. krons/utils/schemas/_breakdown_pydantic_annotation.py +131 -0
  99. krons/utils/schemas/_formatter.py +72 -0
  100. krons/utils/schemas/_minimal_yaml.py +151 -0
  101. krons/utils/schemas/_typescript.py +153 -0
  102. {kronos → krons}/utils/sql/_sql_validation.py +1 -1
  103. krons/utils/validators/__init__.py +3 -0
  104. krons/utils/validators/_validate_image_url.py +56 -0
  105. krons/work/__init__.py +126 -0
  106. krons/work/engine.py +333 -0
  107. krons/work/form.py +305 -0
  108. {kronos → krons/work}/operations/__init__.py +7 -4
  109. {kronos → krons/work}/operations/builder.py +4 -4
  110. {kronos/enforcement → krons/work/operations}/context.py +37 -6
  111. {kronos → krons/work}/operations/flow.py +17 -9
  112. krons/work/operations/node.py +103 -0
  113. krons/work/operations/registry.py +103 -0
  114. {kronos/specs → krons/work}/phrase.py +131 -14
  115. {kronos/enforcement → krons/work}/policy.py +3 -3
  116. krons/work/report.py +268 -0
  117. krons/work/rules/__init__.py +47 -0
  118. {kronos/enforcement → krons/work/rules}/common/boolean.py +3 -1
  119. {kronos/enforcement → krons/work/rules}/common/choice.py +9 -3
  120. {kronos/enforcement → krons/work/rules}/common/number.py +3 -1
  121. {kronos/enforcement → krons/work/rules}/common/string.py +9 -3
  122. {kronos/enforcement → krons/work/rules}/rule.py +2 -2
  123. {kronos/enforcement → krons/work/rules}/validator.py +21 -6
  124. {kronos/enforcement → krons/work}/service.py +16 -7
  125. krons/work/worker.py +266 -0
  126. {krons-0.1.0.dist-info → krons-0.2.0.dist-info}/METADATA +19 -5
  127. krons-0.2.0.dist-info/RECORD +154 -0
  128. kronos/core/__init__.py +0 -145
  129. kronos/enforcement/__init__.py +0 -57
  130. kronos/operations/node.py +0 -101
  131. kronos/operations/registry.py +0 -92
  132. kronos/services/__init__.py +0 -81
  133. kronos/specs/adapters/__init__.py +0 -0
  134. kronos/utils/__init__.py +0 -40
  135. krons-0.1.0.dist-info/RECORD +0 -101
  136. {kronos → krons/core/specs/adapters}/__init__.py +0 -0
  137. {kronos → krons/core}/specs/adapters/_utils.py +0 -0
  138. {kronos → krons/core}/specs/adapters/factory.py +0 -0
  139. {kronos → krons/core}/types/__init__.py +0 -0
  140. {kronos → krons/core}/types/_sentinel.py +0 -0
  141. {kronos → krons}/py.typed +0 -0
  142. {kronos/services → krons/resource}/utilities/__init__.py +0 -0
  143. {kronos/services → krons/resource}/utilities/header_factory.py +0 -0
  144. {kronos → krons}/utils/_hash.py +0 -0
  145. {kronos → krons}/utils/_json_dump.py +0 -0
  146. {kronos → krons}/utils/_lazy_init.py +0 -0
  147. {kronos → krons}/utils/_to_num.py +0 -0
  148. {kronos → krons}/utils/concurrency/_cancel.py +0 -0
  149. {kronos → krons}/utils/concurrency/_primitives.py +0 -0
  150. {kronos → krons}/utils/concurrency/_priority_queue.py +0 -0
  151. {kronos → krons}/utils/concurrency/_run_async.py +0 -0
  152. {kronos → krons}/utils/concurrency/_task.py +0 -0
  153. {kronos → krons}/utils/concurrency/_utils.py +0 -0
  154. {kronos → krons}/utils/fuzzy/_extract_json.py +0 -0
  155. {kronos → krons}/utils/fuzzy/_fuzzy_json.py +0 -0
  156. {kronos → krons}/utils/sql/__init__.py +0 -0
  157. {kronos/enforcement → krons/work/rules}/common/__init__.py +0 -0
  158. {kronos/enforcement → krons/work/rules}/common/mapping.py +0 -0
  159. {kronos/enforcement → krons/work/rules}/common/model.py +0 -0
  160. {kronos/enforcement → krons/work/rules}/registry.py +0 -0
  161. {krons-0.1.0.dist-info → krons-0.2.0.dist-info}/WHEEL +0 -0
  162. {krons-0.1.0.dist-info → krons-0.2.0.dist-info}/licenses/LICENSE +0 -0
krons/work/worker.py ADDED
@@ -0,0 +1,266 @@
1
+ # Copyright (c) 2025 - 2026, HaiyangLi <quantocean.li at gmail dot com>
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ """Worker - Declarative workflow definition via decorated methods.
5
+
6
+ A Worker defines workflows through:
7
+ - @work: Typed operations with assignment DSL (inputs -> outputs)
8
+ - @worklink: Conditional edges between work methods
9
+
10
+ Example:
11
+ class FileCoder(Worker):
12
+ @work(assignment="instruction, context -> code", capacity=2)
13
+ async def write_code(self, form_id, **kwargs):
14
+ result = await llm.chat(**kwargs)
15
+ return form_id, result.code
16
+
17
+ @worklink(from_="write_code", to_="execute_code")
18
+ async def write_to_execute(self, from_result):
19
+ form_id, code = from_result
20
+ return {"form_id": form_id, "code": code}
21
+
22
+ engine = WorkerEngine(worker=FileCoder())
23
+ await engine.add_task(form=my_form, task_function="write_code")
24
+ await engine.execute()
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import functools
30
+ from dataclasses import dataclass
31
+ from typing import TYPE_CHECKING, Awaitable, Callable
32
+ from uuid import UUID
33
+
34
+ if TYPE_CHECKING:
35
+ from .form import Form
36
+
37
+ __all__ = (
38
+ "Worker",
39
+ "WorkConfig",
40
+ "WorkLink",
41
+ "work",
42
+ "worklink",
43
+ )
44
+
45
+
46
+ @dataclass
47
+ class WorkConfig:
48
+ """Configuration for a @work decorated method.
49
+
50
+ Attributes:
51
+ assignment: DSL string 'inputs -> outputs' for typed I/O
52
+ form_param_key: Parameter name that receives form ID
53
+ capacity: Max concurrent executions (rate limiting)
54
+ refresh_time: Seconds between capacity resets
55
+ timeout: Max execution time in seconds
56
+ """
57
+
58
+ assignment: str = ""
59
+ form_param_key: str = ""
60
+ capacity: int = 1
61
+ refresh_time: float = 0.1
62
+ timeout: float | None = None
63
+
64
+
65
+ @dataclass
66
+ class WorkLink:
67
+ """Edge definition between work methods.
68
+
69
+ Attributes:
70
+ from_: Source method name
71
+ to_: Target method name
72
+ handler_name: Name of the handler method on the Worker
73
+ """
74
+
75
+ from_: str
76
+ to_: str
77
+ handler_name: str
78
+
79
+
80
+ class Worker:
81
+ """Base class for declarative workflow definition.
82
+
83
+ Subclass and decorate methods with @work and @worklink to define workflows.
84
+ Worker maintains form storage and tracks work method metadata.
85
+
86
+ Attributes:
87
+ name: Worker name (default: class name)
88
+ forms: Dict mapping form IDs to Form instances
89
+ _work_methods: Registry of @work decorated methods
90
+ _work_links: Registry of @worklink edges
91
+ _stopped: Stop flag for execution
92
+
93
+ Example:
94
+ class MyCoder(Worker):
95
+ name = "coder"
96
+
97
+ @work(assignment="task -> plan", capacity=2)
98
+ async def plan(self, task_name, **kwargs):
99
+ ...
100
+ return task_name
101
+
102
+ @work(assignment="plan -> code", form_param_key="task_name")
103
+ async def implement(self, task_name, **kwargs):
104
+ ...
105
+
106
+ @worklink(from_="plan", to_="implement")
107
+ async def plan_to_implement(self, from_result):
108
+ return {"task_name": from_result}
109
+ """
110
+
111
+ name: str = "worker"
112
+
113
+ def __init__(self) -> None:
114
+ """Initialize worker state."""
115
+ # Form storage: form_id -> Form
116
+ self.forms: dict[str | UUID, Form] = {}
117
+
118
+ # Collect @work methods from class
119
+ self._work_methods: dict[str, tuple[Callable, WorkConfig]] = {}
120
+ self._work_links: list[WorkLink] = []
121
+ self._stopped = False
122
+
123
+ self._collect_work_metadata()
124
+
125
+ def _collect_work_metadata(self) -> None:
126
+ """Scan class for @work and @worklink decorated methods."""
127
+ for name in dir(self):
128
+ if name.startswith("_"):
129
+ continue
130
+
131
+ attr = getattr(self, name, None)
132
+ if attr is None:
133
+ continue
134
+
135
+ # Check for @work decorator
136
+ if hasattr(attr, "_work_config"):
137
+ config: WorkConfig = attr._work_config
138
+ self._work_methods[name] = (attr, config)
139
+
140
+ # Check for @worklink decorator
141
+ if hasattr(attr, "_worklink_from") and hasattr(attr, "_worklink_to"):
142
+ link = WorkLink(
143
+ from_=attr._worklink_from,
144
+ to_=attr._worklink_to,
145
+ handler_name=name,
146
+ )
147
+ self._work_links.append(link)
148
+
149
+ def get_links_from(self, method_name: str) -> list[WorkLink]:
150
+ """Get all outgoing links from a method."""
151
+ return [link for link in self._work_links if link.from_ == method_name]
152
+
153
+ def get_links_to(self, method_name: str) -> list[WorkLink]:
154
+ """Get all incoming links to a method."""
155
+ return [link for link in self._work_links if link.to_ == method_name]
156
+
157
+ async def stop(self) -> None:
158
+ """Signal worker to stop processing."""
159
+ self._stopped = True
160
+
161
+ async def start(self) -> None:
162
+ """Clear stop flag to allow processing."""
163
+ self._stopped = False
164
+
165
+ def is_stopped(self) -> bool:
166
+ """Check if worker is stopped."""
167
+ return self._stopped
168
+
169
+ def __repr__(self) -> str:
170
+ methods = list(self._work_methods.keys())
171
+ links = len(self._work_links)
172
+ forms = len(self.forms)
173
+ return f"{self.__class__.__name__}(methods={methods}, links={links}, forms={forms})"
174
+
175
+
176
+ def work(
177
+ assignment: str = "",
178
+ *,
179
+ form_param_key: str = "",
180
+ capacity: int = 1,
181
+ refresh_time: float = 0.1,
182
+ timeout: float | None = None,
183
+ ) -> Callable[[Callable[..., Awaitable]], Callable[..., Awaitable]]:
184
+ """Decorator for typed work methods.
185
+
186
+ Args:
187
+ assignment: DSL string 'inputs -> outputs' defining typed I/O.
188
+ Used for form field binding when form_param_key is set.
189
+ form_param_key: Parameter name that receives form ID.
190
+ If set, the engine will bind form fields to kwargs.
191
+ capacity: Max concurrent executions (for rate limiting).
192
+ refresh_time: Seconds between capacity resets.
193
+ timeout: Max execution time in seconds.
194
+
195
+ Returns:
196
+ Decorator that attaches WorkConfig to the method.
197
+
198
+ Example:
199
+ @work(assignment="context, instruction -> code", form_param_key="form_id")
200
+ async def write_code(self, form_id, **kwargs):
201
+ # kwargs contains context, instruction from form
202
+ result = await llm.chat(**kwargs)
203
+ return form_id, result.code
204
+ """
205
+
206
+ def decorator(func: Callable[..., Awaitable]) -> Callable[..., Awaitable]:
207
+ config = WorkConfig(
208
+ assignment=assignment,
209
+ form_param_key=form_param_key,
210
+ capacity=capacity,
211
+ refresh_time=refresh_time,
212
+ timeout=timeout,
213
+ )
214
+
215
+ @functools.wraps(func)
216
+ async def wrapper(*args, **kwargs):
217
+ return await func(*args, **kwargs)
218
+
219
+ wrapper._work_config = config # type: ignore[attr-defined]
220
+ return wrapper
221
+
222
+ return decorator
223
+
224
+
225
+ def worklink(
226
+ from_: str,
227
+ to_: str,
228
+ ) -> Callable[[Callable[..., Awaitable]], Callable[..., Awaitable]]:
229
+ """Decorator for conditional edges between work methods.
230
+
231
+ The decorated function receives the result from the 'from_' method
232
+ and returns kwargs dict for the 'to_' method. Return None to skip
233
+ the edge (conditional routing).
234
+
235
+ Args:
236
+ from_: Source method name
237
+ to_: Target method name
238
+
239
+ Returns:
240
+ Decorator that attaches WorkLink info to the method.
241
+
242
+ Example:
243
+ @worklink(from_="write_code", to_="execute_code")
244
+ async def write_to_execute(self, from_result):
245
+ form_id, code = from_result
246
+ return {"form_id": form_id, "code": code}
247
+
248
+ @worklink(from_="execute_code", to_="debug_code")
249
+ async def execute_to_debug(self, from_result):
250
+ form_id, error = from_result
251
+ if error is not None: # Conditional edge
252
+ return {"form_id": form_id, "error": error}
253
+ # Return None = edge not taken
254
+ """
255
+
256
+ def decorator(func: Callable[..., Awaitable]) -> Callable[..., Awaitable]:
257
+ @functools.wraps(func)
258
+ async def wrapper(*args, **kwargs):
259
+ return await func(*args, **kwargs)
260
+
261
+ # Store link info - handler_name will be set during _collect_work_metadata
262
+ wrapper._worklink_from = from_ # type: ignore[attr-defined]
263
+ wrapper._worklink_to = to_ # type: ignore[attr-defined]
264
+ return wrapper
265
+
266
+ return decorator
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: krons
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Spec-based composable framework for building type-safe systems
5
- Project-URL: Homepage, https://github.com/khive-ai/kronos
6
- Project-URL: Repository, https://github.com/khive-ai/kronos
7
- Project-URL: Issues, https://github.com/khive-ai/kronos/issues
5
+ Project-URL: Homepage, https://github.com/khive-ai/krons
6
+ Project-URL: Repository, https://github.com/khive-ai/krons
7
+ Project-URL: Issues, https://github.com/khive-ai/krons/issues
8
8
  Author-email: HaiyangLi <quantocean.li@gmail.com>
9
9
  License-Expression: Apache-2.0
10
10
  License-File: LICENSE
@@ -22,7 +22,21 @@ Requires-Dist: anyio>=4.10.0
22
22
  Requires-Dist: httpx>=0.26.0
23
23
  Requires-Dist: orjson>=3.10.0
24
24
  Requires-Dist: pydantic>=2.10.0
25
+ Requires-Dist: pyyaml>=6.0.3
25
26
  Requires-Dist: rapidfuzz>=3.10.0
27
+ Provides-Extra: agent
28
+ Requires-Dist: fastmcp>=2.14.4; extra == 'agent'
29
+ Requires-Dist: tiktoken>=0.11.0; extra == 'agent'
30
+ Provides-Extra: all
31
+ Requires-Dist: fastmcp>=2.14.4; extra == 'all'
32
+ Requires-Dist: rich>=13.0; extra == 'all'
33
+ Requires-Dist: tiktoken>=0.11.0; extra == 'all'
34
+ Provides-Extra: display
35
+ Requires-Dist: rich>=13.0; extra == 'display'
36
+ Provides-Extra: fastmcp
37
+ Requires-Dist: fastmcp>=2.14.4; extra == 'fastmcp'
38
+ Provides-Extra: tiktoken
39
+ Requires-Dist: tiktoken>=0.11.0; extra == 'tiktoken'
26
40
  Description-Content-Type: text/markdown
27
41
 
28
42
  # krons
@@ -46,7 +60,7 @@ pip install krons
46
60
  ## Quick Start
47
61
 
48
62
  ```python
49
- from kronos.specs import Spec, Operable
63
+ from krons.specs import Spec, Operable
50
64
 
51
65
  # Define specs
52
66
  name_spec = Spec(str, name="name")
@@ -0,0 +1,154 @@
1
+ krons/__init__.py,sha256=4q7g_NShAZ3SXLVTZ4H8vFSCXpps-3tjCs7qg6WkQPI,1359
2
+ krons/errors.py,sha256=nRWkWZmokOlp3hquC2dBe-gowdVIHllENiD0KxU3m8U,4051
3
+ krons/protocols.py,sha256=xYJUHdXbFHYtjy3rcEt8ttIngzigEve7tYa-8G35v7k,15333
4
+ krons/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ krons/agent/__init__.py,sha256=7AfP-1BHYosM5MiqcSOpoGF0y-bQ2OKN8oQePR2o98Y,4581
6
+ krons/agent/tool.py,sha256=JDlj_QCMw6ILKu2NkKLOoywiIlIIQwVfS-A_HT88OTg,8573
7
+ krons/agent/mcps/__init__.py,sha256=B3RYDI0XaDaECpgxqFp5bBIdCFRGPyzbCDpQeljY0P0,447
8
+ krons/agent/mcps/loader.py,sha256=SAw3ZLvBYHfT1bklLI7i15mnqwAA_aZtnJRR9WEfKl4,10554
9
+ krons/agent/mcps/wrapper.py,sha256=tW4aXzMMBqh4BtcuEaLxYqLxttGRJ06UQSjWmqdsGfI,28169
10
+ krons/agent/message/__init__.py,sha256=vumj0lHyraEoshw0tx8yWt5fyUUuAC3qVBiSLQuq-9A,499
11
+ krons/agent/message/action.py,sha256=ynONthCd78gWzl3dbQughJOGd-Iys6lbOzzYwuLXGWU,2047
12
+ krons/agent/message/assistant.py,sha256=V75490V9mQLKbBkH9cYAmnva2-Q3hwCAj_4flLUCvOE,1459
13
+ krons/agent/message/common.py,sha256=j9rpVoZhH6FV9JLVv6K-IgRJqPGnT5Vcw80UsEWv5ME,1282
14
+ krons/agent/message/instruction.py,sha256=jouxli_yDwRcLJhXs8f9cR0MdreW3pNRDIw2ha7K4uE,4793
15
+ krons/agent/message/prepare_msg.py,sha256=85XB-S2qxzXAUxn0cu46LNbWq0JL6w1IO1soJ3ci0Y4,7017
16
+ krons/agent/message/role.py,sha256=wKY5gIov4yHuvHiXEGFJ8YIaDR2YcmyH83JnDLgnFtI,1397
17
+ krons/agent/message/system.py,sha256=vCwFrYtM8K-5bVvl-mo0xW-Q_1AWqIAOgwDnNQ41DeA,1884
18
+ krons/agent/operations/__init__.py,sha256=UqKGE99xyYBGHnEHPVLq8Bf7dvs195gAnpMH3zpjNNA,2095
19
+ krons/agent/operations/act.py,sha256=WeUiVMcYOQN2EYLEvQU17HcqoQkcWzuqIgJjGP4AWXM,3606
20
+ krons/agent/operations/generate.py,sha256=oNXAwUKw3rcPlGkgq8zhggnNJPVcAzIIUhYIca23Ro0,5447
21
+ krons/agent/operations/llm_reparse.py,sha256=kF_KglZu_R4RVTpl-1lheeHGfvsK1bvAJidDdpW1iEA,2696
22
+ krons/agent/operations/operate.py,sha256=zOIPRoLYV0sXeSTmCvuD5mlwArimP456a7GEpxljjQ8,8966
23
+ krons/agent/operations/parse.py,sha256=HN7gnRm5_6gbabah3enaL280FVywQqIK5N6oOZG8NGQ,8261
24
+ krons/agent/operations/react.py,sha256=f5_5IVf8oi2TD8QXT53DefTxd1zO0nMmJ07SrL_28NQ,9468
25
+ krons/agent/operations/specs.py,sha256=UzH3A8VivQkUZdjDq78T_pmBQlY-BJafOVAKvpS0go8,7407
26
+ krons/agent/operations/structure.py,sha256=8HN5_dA4sYZFUbVPffEGmcamm9VUxFveAko59sgWydI,5250
27
+ krons/agent/operations/utils.py,sha256=goot2IAmrxTOoJa1kn2kfvv03i8mb02ifOKfBJMv_Qw,2335
28
+ krons/agent/providers/__init__.py,sha256=XJtszdh8f5sfAR0eQipKplBSLdKwtL0F7uQPmah8g6s,555
29
+ krons/agent/providers/anthropic_messages.py,sha256=x0oBKQa-T3zu8TyZ50Rm1fvgkY8ukzvAZJc1HVugBh0,4388
30
+ krons/agent/providers/claude_code.py,sha256=nTKJkK1gGUdCgXpzRXiGtC840a5qm0tKBeakqlPQ9Kw,9881
31
+ krons/agent/providers/gemini.py,sha256=TCJkk9iSnnkPdDuTlAB5yOphNYUPkPGKVYkrja9zcuI,9059
32
+ krons/agent/providers/match.py,sha256=3kiW-hyfnF6UgBYD7LG4KFhFKXbWpDdtDQ71-9t5wIQ,2251
33
+ krons/agent/providers/oai_chat.py,sha256=-97XBJ6WQT9OsjKSrV5s3or-WhBfUjDHomGiBYjCeVY,5463
34
+ krons/agent/third_party/__init__.py,sha256=gR454Rk5b1Bv3QibE-822UcoSWhpLCLtJae028QGtN4,110
35
+ krons/agent/third_party/anthropic_models.py,sha256=rd2Skh_Xx1S2G1JXi2YFb1j6SHm62e7brNBq9CZPAgI,3968
36
+ krons/agent/third_party/claude_code.py,sha256=NBYMsdPheb0PqGgTO2_aUAR2XoGDsPUwsB7Nd9PjipA,23758
37
+ krons/agent/third_party/gemini_models.py,sha256=2dag2WbSTKLBd8t0F7t_TXCcl7aqsTFgDI6XLkhsZwM,17416
38
+ krons/agent/third_party/openai_models.py,sha256=L-GkJ-bBW5zwPbgCWEYHMNqRiZfFTAUJE96AVZoDAkQ,8040
39
+ krons/core/__init__.py,sha256=HG0wBaNCbH3xGDRNX3657g-hZo4Isu2MKaXeUXmXqa0,3496
40
+ krons/core/base/__init__.py,sha256=Edl_HH2F1l0SMHMzuEPU_IFjkigRR1vtqVXcPm-mr1o,3614
41
+ krons/core/base/broadcaster.py,sha256=Es__WfL-j2h5NS6aU18fgaFkZsJIL-zDe86Qvlea-io,4013
42
+ krons/core/base/element.py,sha256=LqBbmPttXoDAFy56JzWhSJ4sBw_LW7hMGxZUog85N8g,7642
43
+ krons/core/base/event.py,sha256=iZQ65Xg3a8eaCEl4Hca-pxPNtckhrHkydEqYyppbuo0,11524
44
+ krons/core/base/eventbus.py,sha256=z45ORtGey5A1N9hdyEPOhlX1whaTTdqdk7g3XEDL-_8,3761
45
+ krons/core/base/flow.py,sha256=eqsYm8QO7bD5Y9VYnlpHFWpaUCY0rCeKGrDrFUyBVA4,12364
46
+ krons/core/base/graph.py,sha256=FiTMArxuz6At3oYPEoamES3FtBM-AM6QnA7EQ8G18mo,15972
47
+ krons/core/base/node.py,sha256=0_-R6uNe6-LF3adQRZowSIICdy6ep3cQIQRdF0oosoQ,34699
48
+ krons/core/base/pile.py,sha256=ZKvnX3BjMsrH989TLNZII1dDWv4yPhSRzLKXx2yzyKQ,21108
49
+ krons/core/base/processor.py,sha256=GrdNZa5YD0tXle847ttnxuWe4Ego1MhULzWHmSz5RqQ,18768
50
+ krons/core/base/progression.py,sha256=srcrmp_zALgg7II5TJsuMM9DdNJszgTxLxvES0WBOTE,9844
51
+ krons/core/specs/__init__.py,sha256=AKFEXqLmJpW__Y6xorJ1Vbp7AZ46kIs0157STVFGVWk,500
52
+ krons/core/specs/factory.py,sha256=TsRZIoWuz0sLYUGfQ_X5Gff2oBll-quk-kOnpX5_yB0,3362
53
+ krons/core/specs/operable.py,sha256=zO15i56_UzTTuM3yg_-EMtQY1Equ_WBi3rUCoCKrYck,11067
54
+ krons/core/specs/protocol.py,sha256=Se-Cow7de4hF4vkvw5qYj14c37JJ-4aJSDIvJHFyst8,4392
55
+ krons/core/specs/spec.py,sha256=QaVWN3ZrX8l1x15xXtfpNGzSIV01X0H3jy9Mjv9vT8Y,18706
56
+ krons/core/specs/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ krons/core/specs/adapters/_utils.py,sha256=ChWH-C2LRXaXiWM3n7P0DZ8Oci5dSDq59DIJtHx2h-g,1365
58
+ krons/core/specs/adapters/dataclass_field.py,sha256=thhgC3iQsrkfMkKzB4XmDbwh4fpLYocdL0KvY_zxbzo,8802
59
+ krons/core/specs/adapters/factory.py,sha256=_LoSMCtHNkK5kNL5LUDjHvJJ2BtDHAaW1gly5LpNPXQ,1572
60
+ krons/core/specs/adapters/pydantic_adapter.py,sha256=UxnOtJdeIyJEPBBjSACWE-JVc0yWxHSepz5i2SZhS6A,10410
61
+ krons/core/specs/adapters/sql_ddl.py,sha256=NTttvx16X926qeQNWxqdoLlToeiMwufpKEPWNdAXHg0,31377
62
+ krons/core/specs/catalog/__init__.py,sha256=TwS7hvGxa4-2Usu5rKGlhmUS0hhBlRzVNFNKDE7q8eU,1231
63
+ krons/core/specs/catalog/_audit.py,sha256=g-L4eSJw3H0hfejex5LwsnepaGyTUPrL8JbPU7lPycY,1260
64
+ krons/core/specs/catalog/_common.py,sha256=ItOPWV1fEeaz6ss5XNZYUetp204saIs7s5Bl0Jt8AOQ,1207
65
+ krons/core/specs/catalog/_content.py,sha256=pQAbgjoObZcAQLe8Wg-_sqQ8VYZUGsRQJnjuiCjH-p0,1972
66
+ krons/core/specs/catalog/_enforcement.py,sha256=JlKF_qGc-Xk7E_ebvq6lQs19iRBAWk2TOe1Qm7XMf1k,2126
67
+ krons/core/types/__init__.py,sha256=pJ6kuop7vSLZp5jMBs-CQ7CHRjvUuO8kHhpZ34KM85I,1049
68
+ krons/core/types/_sentinel.py,sha256=QJGyRAYNkJ2ylw6dhxPHJNgmxqBdorBd-xx7pNrUykw,8855
69
+ krons/core/types/base.py,sha256=Un3MrPGuyns9SgPczJ5vbQExemTO-9B2Eks87NDd--A,12330
70
+ krons/core/types/db_types.py,sha256=3ZaAXJe4dartmF-IyKr59NVlL2EbGpx7AtVqqbrIXIk,8136
71
+ krons/core/types/identity.py,sha256=Ccb5oJArC1PEzdzNPlLi_oK87uKx7BFevX9rvY9y-14,1949
72
+ krons/resource/__init__.py,sha256=h83vOSa6zXXMRdfxch7yg7kGy6Pe_6c0wWANByATbZ8,2783
73
+ krons/resource/backend.py,sha256=mW1kkAZrUwnBZeMOY_0I_egpTKpuNyIs5Mps4r2cOxk,10979
74
+ krons/resource/endpoint.py,sha256=X_Yt5KLXKN5Wwc75MX0c5gPyE_Dlv16rIfm8CKd1xYE,22253
75
+ krons/resource/hook.py,sha256=XQujjDwBZa2vCktP6Ey0QFfFFNEd6igc1qUR5-tfeQU,17115
76
+ krons/resource/imodel.py,sha256=_BOfbLk5JNoKAnjf3k67E6O2Qef4fsKa1hprw1C4L1Q,18595
77
+ krons/resource/registry.py,sha256=Vqe8uUtMMtxu4NgU5RUPFmpIxtKxdCfmVQQy1lhZMZo,3829
78
+ krons/resource/utilities/__init__.py,sha256=-ycdoYgtXrliJwbtQGMHBRvZL0qX2xLzooL3RNV99x4,1013
79
+ krons/resource/utilities/header_factory.py,sha256=WZCCZMh9EJVi8tnY7dJD07FcTOrrUMvecJmzy8P65Os,2992
80
+ krons/resource/utilities/rate_limited_executor.py,sha256=xtvxTeHowoghb4WpY_9WNgqbFKHPBZKtKbaGyaTpTsk,9710
81
+ krons/resource/utilities/rate_limiter.py,sha256=DdaqnxOnst43ZAxcC9kBnnFbUCAsR89KzA0XL5xGPtU,6003
82
+ krons/resource/utilities/resilience.py,sha256=eOPSZ6m89IH_RCgaGLrFPQGTZtMBZOrs8G0sjSpfv40,14389
83
+ krons/resource/utilities/token_calculator.py,sha256=gBQvkmqL4gnqFx5o-FtPeoLDPBFTdN0ZpFkaT71VVLk,6437
84
+ krons/session/__init__.py,sha256=aCdCYe2HCLV8ujlBZHSqFr0nF8gj_PypI0BXoIU7ThU,1017
85
+ krons/session/constraints.py,sha256=DvmLKyf5eYUX2nxCDcco1-uDipGjiIJwoUxWVtX2w84,2361
86
+ krons/session/exchange.py,sha256=QChEqK5NFZJpHWxPrXd8LkGBCFg6LNONd1ZEy0MufpI,9165
87
+ krons/session/message.py,sha256=mtZ-PYCCoyWLy7BSB5TL5a0hIt0aQX2zdckOCIl6NZ0,2007
88
+ krons/session/registry.py,sha256=13pPKmDZJaj9q27oUOdtH6-jrHP_HDFF8lCdcNF--EE,999
89
+ krons/session/session.py,sha256=bBK6rYPmYu5YcmU-oWoJL9pU8pdzr9Y4Z5wcIIiuirw,13221
90
+ krons/utils/__init__.py,sha256=V-jTKULdofjJXxcEHygefKV_v6XE4H3poCdxPLjvf_4,1718
91
+ krons/utils/_function_arg_parser.py,sha256=H5JVLBVY8W9ZNkZ4_YVtVVY1rFYvnIRhSrAhKEdj2Qc,3479
92
+ krons/utils/_hash.py,sha256=W2Ma9v8-INPaGkur7GTtbF8KwuXSJNSwk8DCNPRvx8Q,6859
93
+ krons/utils/_json_dump.py,sha256=rpBmr0NCmIKRdmpgn1nSWIHI3FTsGYsQjOa3YTxCi3M,12482
94
+ krons/utils/_lazy_init.py,sha256=bCx_W3dfzirB5KnAt6_jmbnwOk2xbU7-kgOhMQqzW70,1806
95
+ krons/utils/_pythonic_function_call.py,sha256=PAqnb-PNzVBvIrXh5-680mj7BlRiUziiHkjxELe0q78,8388
96
+ krons/utils/_to_list.py,sha256=RuiUWkoxHjD-2pqbbumar69AADCKYoGqSKL5FPu6LdM,6114
97
+ krons/utils/_to_num.py,sha256=NyyIL9Az1EaW6QFh9R7AeJdaUPoSRBNVBX9yj78wpok,3102
98
+ krons/utils/_utils.py,sha256=g1LAKX9-AwREb-XzXaAaHMCeSBlhtfWMu7GK1XDDAzg,11145
99
+ krons/utils/display.py,sha256=haAzWny-Ez1H6LphxNsEaYyFY3uctj2xbvgR8ZAUfJg,7312
100
+ krons/utils/concurrency/__init__.py,sha256=1HD-aY4Hevde0Hm0-VYa0eheT5OiwhlnDJtofIuV9wk,6754
101
+ krons/utils/concurrency/_async_call.py,sha256=cb7iXphip1zKPsim6whf-nCvdopq1spQNqx7sWxiejo,10233
102
+ krons/utils/concurrency/_cancel.py,sha256=b9f6yT8gObS6Y3EWKoGzNfYxqM1ZrN_8ctfyIjT1m1U,3326
103
+ krons/utils/concurrency/_errors.py,sha256=8bG72f71OxWYTdQ9AmUnI20UjEz0UYsWjQayter4CNI,2603
104
+ krons/utils/concurrency/_patterns.py,sha256=Xl31p63JkU370N9bA05uu60GDXrgwm1DHCjEq2U8-oo,11540
105
+ krons/utils/concurrency/_primitives.py,sha256=D1Rl1hujXXPdL4Mw6eW5EN8utM3bh8vmmFtXmuvsDw0,9024
106
+ krons/utils/concurrency/_priority_queue.py,sha256=wGi6ESS6AIZ0QNRBQR5UwcSQI5GhKjATBC_aEw6c0aQ,4342
107
+ krons/utils/concurrency/_resource_tracker.py,sha256=aBLTpSaUsUCtRLEHzIaBYu0NOuACFbIt3JGACo7K-0E,3179
108
+ krons/utils/concurrency/_run_async.py,sha256=A_vuPi9-wWRr3oXiAMnv3l7MV2B76jkBXoVztX_Vcgo,1940
109
+ krons/utils/concurrency/_task.py,sha256=4ivkiUUbutheoYZ-G8-mTfHX4YgWguGIy1v5hSU871w,2528
110
+ krons/utils/concurrency/_utils.py,sha256=CyH_z4prYFeCFgwk4Pc3q0m5NRzDB2TP-G2oxdM_-C0,2136
111
+ krons/utils/fuzzy/__init__.py,sha256=aztwfirLUDf8i-NukKhER1Pp0cZBcgtD92G1n_I4cq4,502
112
+ krons/utils/fuzzy/_extract_json.py,sha256=6Y-QEfXrTBdaNmlbMfVm6xJPBKI0RBbr_t0VYGE7nMo,2922
113
+ krons/utils/fuzzy/_fuzzy_json.py,sha256=hV6v9YkQpGxwOnhpLM6jkrG5fZKYluMTxgdqsk5sTew,9151
114
+ krons/utils/fuzzy/_fuzzy_match.py,sha256=6uDoKwqEnms_NMT2T4GB0LC9hhyeuEOOCAu39vO1COA,4953
115
+ krons/utils/fuzzy/_string_similarity.py,sha256=4G0lgBek8zgRcgKi6V0npwRKdkdmQ_wfayr3eCLZmEY,6155
116
+ krons/utils/fuzzy/_to_dict.py,sha256=cS-7NPKIePFlsGSRExCnBRPn7qHIHmcqR1tQBl5tRjE,12941
117
+ krons/utils/schemas/__init__.py,sha256=Si_UjyztaT0Shi85ISs6ESpTLohk9yLSYdy2x4-82Yo,701
118
+ krons/utils/schemas/_breakdown_pydantic_annotation.py,sha256=wfgrCnpPP74UpDyeOxox4uZgVEJZU7UBiBwZHL0ocT0,4075
119
+ krons/utils/schemas/_formatter.py,sha256=DSxYkJDNncno1T_FSEAa1B3BrONfR_swFbd1AOtrtcg,2682
120
+ krons/utils/schemas/_minimal_yaml.py,sha256=IhbPmInpLpuQpPcTtW1noLoVi4JLFBUL2aRaeLvoB2Q,4652
121
+ krons/utils/schemas/_typescript.py,sha256=XrbUQBbWxhzwuAXS6w54vwBno9Bg3dPpqZFRPPQIKBg,5240
122
+ krons/utils/sql/__init__.py,sha256=yNjm9Dr-ZjrZSD3Lext7fPR80qX5svGT2PnXqlb5qXs,264
123
+ krons/utils/sql/_sql_validation.py,sha256=smxNU3HjPhQuRK5ehG9Fl4DeljKK9tqUQIvRUopgvc8,4229
124
+ krons/utils/validators/__init__.py,sha256=qmCYoL6fQL1O6-GcfcUARii_fjXYNed6rKZWOp3skj8,87
125
+ krons/utils/validators/_validate_image_url.py,sha256=WAffNY3WpPFe_lqFLHumJS0_hm92NwIOmDOK1GR61ew,1858
126
+ krons/work/__init__.py,sha256=L7PoU-Y_RFQCiw8HqC7KSp4KkgyardWbB5mmnNu0cjs,3967
127
+ krons/work/engine.py,sha256=ZHZzzRqedpLEkcX5eQ6zZQMXYfgmLMRN2JOwkLajND4,10924
128
+ krons/work/form.py,sha256=wxfjwCe8JglpeoRcflWquMSSldCCU4kOL26Q_r47GGE,9268
129
+ krons/work/phrase.py,sha256=7PYPcprA_p7_eZx32EzHd6d7Nc2zLjiIyYTJmqwRUNo,18949
130
+ krons/work/policy.py,sha256=3fp8L0R2lxJ6w5YkgWF_0B1gkXyPx1nCjSwu0_3mmcY,2146
131
+ krons/work/report.py,sha256=wxjMGnUc8b2Jn26l0t0k0cWetZFDyvyqBz0ldae4BD0,9027
132
+ krons/work/service.py,sha256=yayqnZHb14rhJoXfj_70Xh0WqdAkgwtTvw7OLzBlCY8,12103
133
+ krons/work/worker.py,sha256=hK7t5ztG_5wKPScwjtsctP4-ob6bHw9WKRJTw_gw_Fc,8494
134
+ krons/work/operations/__init__.py,sha256=vU-jy0Xy25W4vj98wV3sk3c8x6hKc5sf4nW3U_FQGdY,999
135
+ krons/work/operations/builder.py,sha256=_OGvooSl8s3Pmx8En15SX4XxQ12wF2ZszwVb5Hqzdpc,7779
136
+ krons/work/operations/context.py,sha256=rMcKR8kJkVk-7X1nW8LGoSjW4Eaj66LM46El8wwURmU,5323
137
+ krons/work/operations/flow.py,sha256=RL_GIIKlIURsbLp4-xRA7bJukeCVx0b_garodGd1NhI,14803
138
+ krons/work/operations/node.py,sha256=3NbM2o22oMpFXy6I7osGKIOIzJ69r5Bby99LHrNifr4,3374
139
+ krons/work/operations/registry.py,sha256=cVQA36_jgr9bxRiCsVM_plGPrTVr08vci1aio3olZyM,3483
140
+ krons/work/rules/__init__.py,sha256=oxBsYI3vxAp85G1pMIpQM_84HUYwHbB1lxa9t4uB6YY,1187
141
+ krons/work/rules/registry.py,sha256=JFdwcIVtysntj6wMY3bO7-hqwNU7QIoIbEQuhsy5O4U,4742
142
+ krons/work/rules/rule.py,sha256=uKjjiBwgzryiAOyTUI2YiqSyFg3QluvNRJ09EwtrbK8,9471
143
+ krons/work/rules/validator.py,sha256=CbbdueLI_6JvbbG0yvcljyhjO3HhpF4mlfBTzdhP4jA,7240
144
+ krons/work/rules/common/__init__.py,sha256=U0rEcHOxLftR4-xJNuuXMSDYFAvbs0KzwV3GhlZcUrY,1026
145
+ krons/work/rules/common/boolean.py,sha256=zX9i-oggejwFA0QYQSj1rDU1epqqpUe-ARFS4aol3qY,2644
146
+ krons/work/rules/common/choice.py,sha256=QT0qMDvoPHTGjYeybRkZX8oolIy8Y3iQIqehoV28cco,3264
147
+ krons/work/rules/common/mapping.py,sha256=Loq54MNEtwpnHN0aypTjFOqwoOKLEysddHh-JESedvs,3824
148
+ krons/work/rules/common/model.py,sha256=xmM6coEThf_fgIiqJiyDgvdfib_FpVeY6LgWPVcWSwU,3026
149
+ krons/work/rules/common/number.py,sha256=cCukgMSpQu5RdYK5rXAUyop9qXgDRfLCioMvE8kIzHg,3162
150
+ krons/work/rules/common/string.py,sha256=zHp_OLh0FL4PvmSlyDTEzb2I97-DBSEyI2zcMo10voA,5090
151
+ krons-0.2.0.dist-info/METADATA,sha256=BibIkvS6d8-3CoLW3Toj0hCpeQiWdv9PgGmk17CUx3g,2527
152
+ krons-0.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
153
+ krons-0.2.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
154
+ krons-0.2.0.dist-info/RECORD,,
kronos/core/__init__.py DELETED
@@ -1,145 +0,0 @@
1
- # Copyright (c) 2025 - 2026, HaiyangLi <quantocean.li at gmail dot com>
2
- # SPDX-License-Identifier: Apache-2.0
3
-
4
- """Core primitives with lazy loading for fast import."""
5
-
6
- from __future__ import annotations
7
-
8
- from typing import TYPE_CHECKING
9
-
10
- # Lazy import mapping
11
- _LAZY_IMPORTS: dict[str, tuple[str, str]] = {
12
- # broadcaster
13
- "Broadcaster": ("kronos.core.broadcaster", "Broadcaster"),
14
- # element
15
- "Element": ("kronos.core.element", "Element"),
16
- # event
17
- "Event": ("kronos.core.event", "Event"),
18
- "EventStatus": ("kronos.core.event", "EventStatus"),
19
- "Execution": ("kronos.core.event", "Execution"),
20
- # eventbus
21
- "EventBus": ("kronos.core.eventbus", "EventBus"),
22
- "Handler": ("kronos.core.eventbus", "Handler"),
23
- # flow
24
- "Flow": ("kronos.core.flow", "Flow"),
25
- # graph
26
- "Edge": ("kronos.core.graph", "Edge"),
27
- "EdgeCondition": ("kronos.core.graph", "EdgeCondition"),
28
- "Graph": ("kronos.core.graph", "Graph"),
29
- # node
30
- "DEFAULT_NODE_CONFIG": ("kronos.core.node", "DEFAULT_NODE_CONFIG"),
31
- "NODE_REGISTRY": ("kronos.core.node", "NODE_REGISTRY"),
32
- "PERSISTABLE_NODE_REGISTRY": ("kronos.core.node", "PERSISTABLE_NODE_REGISTRY"),
33
- "Node": ("kronos.core.node", "Node"),
34
- "NodeConfig": ("kronos.core.node", "NodeConfig"),
35
- "create_node": ("kronos.core.node", "create_node"),
36
- "generate_ddl": ("kronos.core.node", "generate_ddl"),
37
- # phrase
38
- "PHRASE_REGISTRY": ("kronos.core.phrase", "PHRASE_REGISTRY"),
39
- "Phrase": ("kronos.core.phrase", "Phrase"),
40
- "PhraseConfig": ("kronos.core.phrase", "PhraseConfig"),
41
- "PhraseError": ("kronos.core.phrase", "PhraseError"),
42
- "RequirementNotMet": ("kronos.core.phrase", "RequirementNotMet"),
43
- "create_phrase": ("kronos.core.phrase", "create_phrase"),
44
- "get_phrase": ("kronos.core.phrase", "get_phrase"),
45
- "list_phrases": ("kronos.core.phrase", "list_phrases"),
46
- # pile
47
- "Pile": ("kronos.core.pile", "Pile"),
48
- # processor
49
- "Executor": ("kronos.core.processor", "Executor"),
50
- "Processor": ("kronos.core.processor", "Processor"),
51
- # progression
52
- "Progression": ("kronos.core.progression", "Progression"),
53
- }
54
-
55
- _LOADED: dict[str, object] = {}
56
-
57
-
58
- def __getattr__(name: str) -> object:
59
- """Lazy import attributes on first access."""
60
- if name in _LOADED:
61
- return _LOADED[name]
62
-
63
- if name in _LAZY_IMPORTS:
64
- from importlib import import_module
65
-
66
- module_name, attr_name = _LAZY_IMPORTS[name]
67
- module = import_module(module_name)
68
- value = getattr(module, attr_name)
69
- _LOADED[name] = value
70
- return value
71
-
72
- raise AttributeError(f"module 'kronos.core' has no attribute {name!r}")
73
-
74
-
75
- def __dir__() -> list[str]:
76
- """Return all available attributes for autocomplete."""
77
- return list(__all__)
78
-
79
-
80
- # TYPE_CHECKING block for static analysis
81
- if TYPE_CHECKING:
82
- from .broadcaster import Broadcaster
83
- from .element import Element
84
- from .event import Event, EventStatus, Execution
85
- from .eventbus import EventBus, Handler
86
- from .flow import Flow
87
- from .graph import Edge, EdgeCondition, Graph
88
- from .node import (
89
- DEFAULT_NODE_CONFIG,
90
- NODE_REGISTRY,
91
- PERSISTABLE_NODE_REGISTRY,
92
- Node,
93
- NodeConfig,
94
- create_node,
95
- generate_ddl,
96
- )
97
- from .phrase import (
98
- PHRASE_REGISTRY,
99
- Phrase,
100
- PhraseConfig,
101
- PhraseError,
102
- RequirementNotMet,
103
- create_phrase,
104
- get_phrase,
105
- list_phrases,
106
- )
107
- from .pile import Pile
108
- from .processor import Executor, Processor
109
- from .progression import Progression
110
-
111
- __all__ = [
112
- # constants
113
- "DEFAULT_NODE_CONFIG",
114
- "NODE_REGISTRY",
115
- "PERSISTABLE_NODE_REGISTRY",
116
- "PHRASE_REGISTRY",
117
- # classes
118
- "Broadcaster",
119
- "Edge",
120
- "EdgeCondition",
121
- "Element",
122
- "Event",
123
- "EventBus",
124
- "EventStatus",
125
- "Execution",
126
- "Executor",
127
- "Flow",
128
- "Graph",
129
- "Handler",
130
- "Node",
131
- "NodeConfig",
132
- "Phrase",
133
- "PhraseConfig",
134
- "PhraseError",
135
- "Pile",
136
- "Processor",
137
- "Progression",
138
- "RequirementNotMet",
139
- # functions
140
- "create_node",
141
- "create_phrase",
142
- "generate_ddl",
143
- "get_phrase",
144
- "list_phrases",
145
- ]
@@ -1,57 +0,0 @@
1
- # Copyright (c) 2025 - 2026, HaiyangLi <quantocean.li at gmail dot com>
2
- # SPDX-License-Identifier: Apache-2.0
3
-
4
- """Enforcement module - Validation and policy protocols.
5
-
6
- Provides:
7
- - Rule: Base validation rule with auto-correction support
8
- - Validator: Validates data against Spec/Operable using rules
9
- - RuleRegistry: Maps types to validation rules
10
- - Policy protocols: Abstract contracts for policy evaluation
11
-
12
- Mental model:
13
- Rule = validation (is data valid?) - with optional auto-fix
14
- Policy = external evaluation protocol (implementations in domain libs)
15
-
16
- Usage:
17
- from kronos.enforcement import Rule, Validator, RuleRegistry
18
-
19
- # Register rules
20
- registry = RuleRegistry()
21
- registry.register(str, StringRule(min_length=1))
22
-
23
- # Validate
24
- validator = Validator(registry=registry)
25
- result = await validator.validate_spec(spec, value)
26
- """
27
-
28
- from .context import QueryFn, RequestContext
29
- from .policy import EnforcementLevel, PolicyEngine, PolicyResolver, ResolvedPolicy
30
- from .registry import RuleRegistry, get_default_registry
31
- from .rule import Rule, RuleParams, RuleQualifier, ValidationError
32
- from .service import ActionMeta, KronConfig, KronService, action, get_action_meta
33
- from .validator import Validator
34
-
35
- __all__ = (
36
- # Rule system
37
- "Rule",
38
- "RuleParams",
39
- "RuleQualifier",
40
- "RuleRegistry",
41
- "ValidationError",
42
- "Validator",
43
- "get_default_registry",
44
- # Policy protocols
45
- "EnforcementLevel",
46
- "PolicyEngine",
47
- "PolicyResolver",
48
- "ResolvedPolicy",
49
- # Service
50
- "ActionMeta",
51
- "KronConfig",
52
- "KronService",
53
- "QueryFn",
54
- "RequestContext",
55
- "action",
56
- "get_action_meta",
57
- )