Coverage for src / lexigram / contracts / __init__.py: 0%
23 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-15 18:57 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-15 18:57 +0800
1"""Lexigram Unified Types.
3This package provides a centralized location for all framework-wide
4type definitions, protocols, and data classes.
5"""
7from __future__ import annotations
9import pkgutil
10from typing import TYPE_CHECKING, Any
12__path__ = pkgutil.extend_path(__path__, __name__)
14# -- Version ---------------------------------------------------------------
16import importlib.metadata
18from lexigram.contracts.core.constants import __version__ as __version__
20# ---------------------------------------------------------------------------
21# Lazy Imports (deferred until first attribute access)
22# ---------------------------------------------------------------------------
23if TYPE_CHECKING:
24 from lexigram.contracts import (
25 admin,
26 ai,
27 auth,
28 core,
29 data,
30 domain,
31 events,
32 exceptions,
33 feature_flags,
34 graphql,
35 infra,
36 mapping,
37 mcp,
38 monitor,
39 observability,
40 search,
41 security,
42 tenancy,
43 web,
44 workflow,
45 )
46 from lexigram.contracts.ai import (
47 AgentError,
48 AgentExecutorProtocol,
49 AgentProtocol,
50 AgentResponse,
51 AIProviderProtocol,
52 ChatMessage,
53 ContextPrunerProtocol,
54 DocumentVectorStoreProtocol,
55 EmbeddingClientProtocol,
56 EpisodicMemoryProtocol,
57 LLMClientProtocol,
58 MemoryConsolidatorProtocol,
59 MemoryProtocol,
60 MemoryStoreProtocol,
61 PromptAssemblerProtocol,
62 PromptCompressorProtocol,
63 SemanticCacheProtocol,
64 SemanticMemoryProtocol,
65 StrategyError,
66 StrategyProtocol,
67 TokenBudget,
68 TokenCounterProtocol,
69 ToolError,
70 ToolProtocol,
71 ToolRegistryProtocol,
72 WorkingMemoryProtocol,
73 )
74 from lexigram.contracts.ai.workflow import AIWorkflowNodeProtocol
75 from lexigram.contracts.audit import AuditEntry
76 from lexigram.contracts.auth import (
77 AuthenticatedUserProtocol,
78 AuthorizerProtocol,
79 AuthProviderProtocol,
80 PasswordHasherProtocol,
81 TokenManagerProtocol,
82 UserProtocol,
83 )
84 from lexigram.contracts.cli import (
85 CliContributorProtocol,
86 GeneratorDefinition,
87 GeneratorOption,
88 )
89 from lexigram.contracts.core import (
90 JSON,
91 AggregateHealthResult,
92 AsyncStringSerializerProtocol,
93 ClockProtocol,
94 ConfigProtocol,
95 ContainerProtocol,
96 ContainerRegistrarProtocol,
97 ContainerResolverProtocol,
98 Duration,
99 GracefulShutdownProtocol,
100 HealthCheckAggregatorProtocol,
101 HealthCheckProtocol,
102 HealthCheckResult,
103 HealthStatus,
104 IdGeneratorProtocol,
105 IdStrategy,
106 Lifecycle,
107 LockStoreProtocol,
108 Metadata,
109 OnApplicationBootstrapProtocol,
110 OnApplicationShutdownProtocol,
111 OnBeforeShutdownProtocol,
112 OnModuleInitProtocol,
113 ProviderPriority,
114 ProviderProtocol,
115 Result,
116 SerializerProtocol,
117 ServiceScope,
118 TokenPayload,
119 )
120 from lexigram.contracts.core.idempotency import (
121 IdempotencyMiddlewareProtocol,
122 IdempotencyStoreProtocol,
123 )
124 from lexigram.contracts.core.lock import (
125 AsyncLockProtocol,
126 DistributedLockProtocol,
127 LockInfo,
128 LockManagerProtocol,
129 )
130 from lexigram.contracts.core.validation import ValidationError
131 from lexigram.contracts.data import (
132 ConnectionPoolProtocol,
133 ConnectionProtocol,
134 DatabaseProviderProtocol,
135 DeleteResult,
136 InsertResult,
137 MigrationManagerProtocol,
138 MigrationRecord,
139 QueryLogEntry,
140 QueryLoggerProtocol,
141 QueryResult,
142 ReadOnlyRepositoryProtocol,
143 RepositoryProtocol,
144 UnitOfWorkProtocol,
145 UpdateResult,
146 )
147 from lexigram.contracts.data.sql.migrations import MigrationRunnerProtocol
148 from lexigram.contracts.data.vector.protocols import VectorStoreProtocol
149 from lexigram.contracts.domain.aggregates import AggregateRootProtocol
150 from lexigram.contracts.domain.events import DomainEvent
151 from lexigram.contracts.domain.pagination import (
152 CursorPage,
153 CursorPageProtocol,
154 OffsetPageProtocol,
155 )
156 from lexigram.contracts.domain.specification import SpecificationProtocol
157 from lexigram.contracts.events import (
158 CommandBusProtocol,
159 DomainEventPublisherProtocol,
160 EventBusProtocol,
161 EventHandlerProtocol,
162 EventStoreProtocol,
163 QueryBusProtocol,
164 WebhookSignatureVerifierProtocol,
165 )
166 from lexigram.contracts.exceptions.components import (
167 SecretNotFoundError,
168 )
169 from lexigram.contracts.exceptions.events import (
170 DuplicateHandlerError,
171 HandlerNotFoundError,
172 )
173 from lexigram.contracts.exceptions.security import (
174 SecretAccessError,
175 )
176 from lexigram.contracts.feature_flags import (
177 FlagEvaluation,
178 FlagType,
179 FlagValue,
180 )
181 from lexigram.contracts.infra.cache import (
182 CacheBackendProtocol,
183 CacheProviderProtocol,
184 )
185 from lexigram.contracts.infra.resilience import (
186 CircuitBreakerConfig,
187 RetryConfig,
188 )
189 from lexigram.contracts.infra.resources import (
190 PoolManagerProtocol,
191 PoolProtocol,
192 PoolStatsProtocol,
193 )
194 from lexigram.contracts.infra.state import StateStoreProtocol
195 from lexigram.contracts.infra.storage import BlobStoreProtocol
196 from lexigram.contracts.infra.tasks import (
197 JobProtocol,
198 JobStatus,
199 TaskExecutorProtocol,
200 TaskProviderProtocol,
201 TaskQueueProtocol,
202 )
203 from lexigram.contracts.mapping import ObjectMapperProtocol
204 from lexigram.contracts.mcp import (
205 MCPError,
206 MCPInitializationError,
207 MCPMethodNotFoundError,
208 MCPPromptError,
209 MCPProtocolError,
210 MCPResourceError,
211 MCPServerProtocol,
212 MCPToolCallError,
213 MCPToolProviderProtocol,
214 MCPTransportProtocol,
215 )
216 from lexigram.contracts.observability.metrics import HealthCheckRegistryProtocol
217 from lexigram.contracts.search import SearchEngineProtocol
218 from lexigram.contracts.security import (
219 AsyncSecretStoreProtocol,
220 HasherProtocol,
221 KeyDerivationProtocol,
222 )
223 from lexigram.contracts.security.secrets import SecretStoreProtocol
224 from lexigram.contracts.tenancy import (
225 TenantConfigError,
226 TenantConfigProviderProtocol,
227 TenantError,
228 TenantInactiveError,
229 TenantInfo,
230 TenantIsolationStrategyProtocol,
231 TenantNotFoundError,
232 TenantProviderProtocol,
233 TenantProvisioningError,
234 TenantResolutionContext,
235 TenantResolutionError,
236 TenantResolverProtocol,
237 TenantSlugConflictError,
238 TenantStatus,
239 TenantSuspendedError,
240 )
241 from lexigram.contracts.web import (
242 CORSPolicyProtocol,
243 ErrorDetail,
244 ErrorResponseDTO,
245 HttpRequestLoggerProtocol,
246 PaginatedResponseDTO,
247 )
248 from lexigram.contracts.workflow import (
249 SagaManagerProtocol,
250 SagaProtocol,
251 )
253_SUBMODULE_NAMES: frozenset[str] = frozenset(
254 {
255 "admin",
256 "ai",
257 "auth",
258 "cli",
259 "codegen",
260 "core",
261 "data",
262 "domain",
263 "events",
264 "exceptions",
265 "feature_flags",
266 "graphql",
267 "infra",
268 "lib",
269 "lifecycle",
270 "mailer",
271 "mapping",
272 "mcp",
273 "monitor",
274 "notification",
275 "observability",
276 "search",
277 "security",
278 "tenancy",
279 "web",
280 "workflow",
281 }
282)
284_LAZY_IMPORTS: dict[str, tuple[str, str]] = {
285 # lifecycle
286 "AuditableProtocol": ("lexigram.contracts.lifecycle", "AuditableProtocol"),
287 "CacheAwareProtocol": ("lexigram.contracts.lifecycle", "CacheAwareProtocol"),
288 "ExportableProtocol": ("lexigram.contracts.lifecycle", "ExportableProtocol"),
289 "TransactionalProtocol": ("lexigram.contracts.lifecycle", "TransactionalProtocol"),
290 "ValidatableProtocol": ("lexigram.contracts.lifecycle", "ValidatableProtocol"),
291 # cli
292 "CliContributorProtocol": ("lexigram.contracts.cli", "CliContributorProtocol"),
293 "GeneratorDefinition": ("lexigram.contracts.cli", "GeneratorDefinition"),
294 "GeneratorOption": ("lexigram.contracts.cli", "GeneratorOption"),
295 # agents (merged into ai/)
296 "AgentError": ("lexigram.contracts.ai", "AgentError"),
297 "AgentExecutorProtocol": ("lexigram.contracts.ai", "AgentExecutorProtocol"),
298 "AgentProtocol": ("lexigram.contracts.ai", "AgentProtocol"),
299 "AgentResponse": ("lexigram.contracts.ai", "AgentResponse"),
300 "StrategyError": ("lexigram.contracts.ai", "StrategyError"),
301 "StrategyProtocol": ("lexigram.contracts.ai", "StrategyProtocol"),
302 "ToolError": ("lexigram.contracts.ai", "ToolError"),
303 "ToolProtocol": ("lexigram.contracts.ai", "ToolProtocol"),
304 "ToolRegistryProtocol": ("lexigram.contracts.ai", "ToolRegistryProtocol"),
305 # ai
306 "AIProviderProtocol": ("lexigram.contracts.ai", "AIProviderProtocol"),
307 "ChatMessage": ("lexigram.contracts.ai.llm", "ChatMessage"),
308 "ContextPrunerProtocol": ("lexigram.contracts.ai.session", "ContextPrunerProtocol"),
309 "EmbeddingClientProtocol": ("lexigram.contracts.ai", "EmbeddingClientProtocol"),
310 "EpisodicMemoryProtocol": ("lexigram.contracts.ai", "EpisodicMemoryProtocol"),
311 "LLMClientProtocol": ("lexigram.contracts.ai", "LLMClientProtocol"),
312 "MemoryConsolidatorProtocol": (
313 "lexigram.contracts.ai",
314 "MemoryConsolidatorProtocol",
315 ),
316 "MemoryProtocol": ("lexigram.contracts.ai", "MemoryProtocol"),
317 "MemoryStoreProtocol": ("lexigram.contracts.ai", "MemoryStoreProtocol"),
318 "PromptAssemblerProtocol": ("lexigram.contracts.ai.llm", "PromptAssemblerProtocol"),
319 "PromptCompressorProtocol": (
320 "lexigram.contracts.ai.rag",
321 "PromptCompressorProtocol",
322 ),
323 "SemanticCacheProtocol": ("lexigram.contracts.ai.llm", "SemanticCacheProtocol"),
324 "SemanticMemoryProtocol": ("lexigram.contracts.ai", "SemanticMemoryProtocol"),
325 "TokenBudget": ("lexigram.contracts.ai.llm", "TokenBudget"),
326 "TokenCounterProtocol": ("lexigram.contracts.ai.llm", "TokenCounterProtocol"),
327 "DocumentVectorStoreProtocol": (
328 "lexigram.contracts.ai.vector",
329 "DocumentVectorStoreProtocol",
330 ),
331 "VectorStoreProtocol": (
332 "lexigram.contracts.data.vector.protocols",
333 "VectorStoreProtocol",
334 ),
335 "WorkingMemoryProtocol": ("lexigram.contracts.ai", "WorkingMemoryProtocol"),
336 # auth
337 "AuthProviderProtocol": ("lexigram.contracts.auth", "AuthProviderProtocol"),
338 "AuthenticatedUserProtocol": (
339 "lexigram.contracts.auth",
340 "AuthenticatedUserProtocol",
341 ),
342 "AuthorizerProtocol": ("lexigram.contracts.auth", "AuthorizerProtocol"),
343 "PasswordHasherProtocol": ("lexigram.contracts.auth", "PasswordHasherProtocol"),
344 "TokenManagerProtocol": ("lexigram.contracts.auth", "TokenManagerProtocol"),
345 "UserProtocol": ("lexigram.contracts.auth", "UserProtocol"),
346 # cache
347 "CacheBackendProtocol": ("lexigram.contracts.infra.cache", "CacheBackendProtocol"),
348 "CacheProviderProtocol": (
349 "lexigram.contracts.infra.cache",
350 "CacheProviderProtocol",
351 ),
352 # core
353 "AggregateHealthResult": ("lexigram.contracts.core", "AggregateHealthResult"),
354 "ConfigProtocol": ("lexigram.contracts.core", "ConfigProtocol"),
355 "ClockProtocol": ("lexigram.contracts.core", "ClockProtocol"),
356 "ContainerProtocol": ("lexigram.contracts.core", "ContainerProtocol"),
357 "ContainerRegistrarProtocol": (
358 "lexigram.contracts.core",
359 "ContainerRegistrarProtocol",
360 ),
361 "ContainerResolverProtocol": (
362 "lexigram.contracts.core",
363 "ContainerResolverProtocol",
364 ),
365 "GracefulShutdownProtocol": ("lexigram.contracts.core", "GracefulShutdownProtocol"),
366 "HealthCheckAggregatorProtocol": (
367 "lexigram.contracts.core",
368 "HealthCheckAggregatorProtocol",
369 ),
370 "HealthCheckProtocol": ("lexigram.contracts.core", "HealthCheckProtocol"),
371 "HealthCheckRegistryProtocol": (
372 "lexigram.contracts.observability.metrics",
373 "HealthCheckRegistryProtocol",
374 ),
375 "HealthCheckResult": ("lexigram.contracts.core", "HealthCheckResult"),
376 "HealthStatus": ("lexigram.contracts.core", "HealthStatus"),
377 "Duration": ("lexigram.contracts.core", "Duration"),
378 "IdGeneratorProtocol": ("lexigram.contracts.core", "IdGeneratorProtocol"),
379 "IdStrategy": ("lexigram.contracts.core", "IdStrategy"),
380 "JSON": ("lexigram.contracts.core", "JSON"),
381 "Lifecycle": ("lexigram.contracts.core", "Lifecycle"),
382 "LockStoreProtocol": ("lexigram.contracts.core", "LockStoreProtocol"),
383 "Metadata": ("lexigram.contracts.core", "Metadata"),
384 "OnApplicationBootstrapProtocol": (
385 "lexigram.contracts.core",
386 "OnApplicationBootstrapProtocol",
387 ),
388 "OnApplicationShutdownProtocol": (
389 "lexigram.contracts.core",
390 "OnApplicationShutdownProtocol",
391 ),
392 "OnBeforeShutdownProtocol": ("lexigram.contracts.core", "OnBeforeShutdownProtocol"),
393 "OnModuleInitProtocol": ("lexigram.contracts.core", "OnModuleInitProtocol"),
394 "ProviderPriority": ("lexigram.contracts.core", "ProviderPriority"),
395 "ProviderProtocol": ("lexigram.contracts.core", "ProviderProtocol"),
396 "Result": ("lexigram.contracts.core", "Result"),
397 "AsyncStringSerializerProtocol": (
398 "lexigram.contracts.core",
399 "AsyncStringSerializerProtocol",
400 ),
401 "SerializerProtocol": ("lexigram.contracts.core", "SerializerProtocol"),
402 "ServiceScope": ("lexigram.contracts.core", "ServiceScope"),
403 "TokenPayload": ("lexigram.contracts.core", "TokenPayload"),
404 # idempotency
405 "IdempotencyMiddlewareProtocol": (
406 "lexigram.contracts.core.idempotency",
407 "IdempotencyMiddlewareProtocol",
408 ),
409 "IdempotencyStoreProtocol": (
410 "lexigram.contracts.core.idempotency",
411 "IdempotencyStoreProtocol",
412 ),
413 # lock
414 "AsyncLockProtocol": ("lexigram.contracts.core.lock", "AsyncLockProtocol"),
415 "DistributedLockProtocol": (
416 "lexigram.contracts.core.lock",
417 "DistributedLockProtocol",
418 ),
419 "LockInfo": ("lexigram.contracts.core.lock", "LockInfo"),
420 "LockManagerProtocol": ("lexigram.contracts.core.lock", "LockManagerProtocol"),
421 # validation
422 "ValidationError": ("lexigram.contracts.core.validation", "ValidationError"),
423 # data
424 "ConnectionPoolProtocol": ("lexigram.contracts.data", "ConnectionPoolProtocol"),
425 "ConnectionProtocol": ("lexigram.contracts.data", "ConnectionProtocol"),
426 "DatabaseProviderProtocol": ("lexigram.contracts.data", "DatabaseProviderProtocol"),
427 "DeleteResult": ("lexigram.contracts.data", "DeleteResult"),
428 "InsertResult": ("lexigram.contracts.data", "InsertResult"),
429 "MigrationManagerProtocol": ("lexigram.contracts.data", "MigrationManagerProtocol"),
430 "MigrationRecord": ("lexigram.contracts.data", "MigrationRecord"),
431 "QueryLogEntry": ("lexigram.contracts.data", "QueryLogEntry"),
432 "QueryLoggerProtocol": ("lexigram.contracts.data", "QueryLoggerProtocol"),
433 "QueryResult": ("lexigram.contracts.data", "QueryResult"),
434 "ReadOnlyRepositoryProtocol": (
435 "lexigram.contracts.data",
436 "ReadOnlyRepositoryProtocol",
437 ),
438 "RepositoryProtocol": ("lexigram.contracts.data", "RepositoryProtocol"),
439 "UnitOfWorkProtocol": ("lexigram.contracts.data", "UnitOfWorkProtocol"),
440 "UpdateResult": ("lexigram.contracts.data", "UpdateResult"),
441 # migrations
442 "MigrationRunnerProtocol": (
443 "lexigram.contracts.data.sql.migrations",
444 "MigrationRunnerProtocol",
445 ),
446 # aggregates
447 "AggregateRootProtocol": (
448 "lexigram.contracts.domain.aggregates",
449 "AggregateRootProtocol",
450 ),
451 # events
452 "DomainEvent": ("lexigram.contracts.domain.events", "DomainEvent"),
453 # specification
454 "SpecificationProtocol": (
455 "lexigram.contracts.domain.specification",
456 "SpecificationProtocol",
457 ),
458 # state
459 "StateStoreProtocol": ("lexigram.contracts.infra.state", "StateStoreProtocol"),
460 # events
461 "CommandBusProtocol": ("lexigram.contracts.events", "CommandBusProtocol"),
462 "DomainEventPublisherProtocol": (
463 "lexigram.contracts.events",
464 "DomainEventPublisherProtocol",
465 ),
466 "EventBusProtocol": ("lexigram.contracts.events", "EventBusProtocol"),
467 "EventHandlerProtocol": ("lexigram.contracts.events", "EventHandlerProtocol"),
468 "EventStoreProtocol": ("lexigram.contracts.events", "EventStoreProtocol"),
469 "QueryBusProtocol": ("lexigram.contracts.events", "QueryBusProtocol"),
470 # components
471 "SecretNotFoundError": (
472 "lexigram.contracts.exceptions.components",
473 "SecretNotFoundError",
474 ),
475 # security
476 "SecretAccessError": (
477 "lexigram.contracts.exceptions.security",
478 "SecretAccessError",
479 ),
480 # events
481 "DuplicateHandlerError": (
482 "lexigram.contracts.exceptions.events",
483 "DuplicateHandlerError",
484 ),
485 "HandlerNotFoundError": (
486 "lexigram.contracts.exceptions.events",
487 "HandlerNotFoundError",
488 ),
489 # mapping
490 "ObjectMapperProtocol": ("lexigram.contracts.mapping", "ObjectMapperProtocol"),
491 # mcp
492 "MCPError": ("lexigram.contracts.mcp", "MCPError"),
493 "MCPInitializationError": ("lexigram.contracts.mcp", "MCPInitializationError"),
494 "MCPMethodNotFoundError": ("lexigram.contracts.mcp", "MCPMethodNotFoundError"),
495 "MCPPromptError": ("lexigram.contracts.mcp", "MCPPromptError"),
496 "MCPProtocolError": ("lexigram.contracts.mcp", "MCPProtocolError"),
497 "MCPResourceError": ("lexigram.contracts.mcp", "MCPResourceError"),
498 "MCPServerProtocol": ("lexigram.contracts.mcp", "MCPServerProtocol"),
499 "MCPToolCallError": ("lexigram.contracts.mcp", "MCPToolCallError"),
500 "MCPToolProviderProtocol": ("lexigram.contracts.mcp", "MCPToolProviderProtocol"),
501 "MCPTransportProtocol": ("lexigram.contracts.mcp", "MCPTransportProtocol"),
502 # monitor
503 "ProjectionTier": ("lexigram.contracts.monitor", "ProjectionTier"),
504 "WebhookSignatureVerifierProtocol": (
505 "lexigram.contracts.events",
506 "WebhookSignatureVerifierProtocol",
507 ),
508 # resilience
509 "CircuitBreakerConfig": (
510 "lexigram.contracts.infra.resilience",
511 "CircuitBreakerConfig",
512 ),
513 "RetryConfig": ("lexigram.contracts.infra.resilience", "RetryConfig"),
514 # search
515 "SearchEngineProtocol": ("lexigram.contracts.search", "SearchEngineProtocol"),
516 # security
517 "AsyncSecretStoreProtocol": (
518 "lexigram.contracts.security",
519 "AsyncSecretStoreProtocol",
520 ),
521 "HasherProtocol": ("lexigram.contracts.security", "HasherProtocol"),
522 "KeyDerivationProtocol": (
523 "lexigram.contracts.security",
524 "KeyDerivationProtocol",
525 ),
526 # secrets
527 "SecretStoreProtocol": (
528 "lexigram.contracts.security.secrets",
529 "SecretStoreProtocol",
530 ),
531 # resources
532 "PoolProtocol": ("lexigram.contracts.infra.resources", "PoolProtocol"),
533 "PoolManagerProtocol": (
534 "lexigram.contracts.infra.resources",
535 "PoolManagerProtocol",
536 ),
537 "PoolStatsProtocol": ("lexigram.contracts.infra.resources", "PoolStatsProtocol"),
538 # storage
539 "BlobStoreProtocol": ("lexigram.contracts.infra.storage", "BlobStoreProtocol"),
540 # tasks
541 "JobProtocol": ("lexigram.contracts.infra.tasks", "JobProtocol"),
542 "JobStatus": ("lexigram.contracts.infra.tasks", "JobStatus"),
543 "TaskExecutorProtocol": ("lexigram.contracts.infra.tasks", "TaskExecutorProtocol"),
544 "TaskProviderProtocol": ("lexigram.contracts.infra.tasks", "TaskProviderProtocol"),
545 "TaskQueueProtocol": ("lexigram.contracts.infra.tasks", "TaskQueueProtocol"),
546 # web
547 "CORSPolicyProtocol": ("lexigram.contracts.web", "CORSPolicyProtocol"),
548 "ErrorDetail": ("lexigram.contracts.web", "ErrorDetail"),
549 "ErrorResponseDTO": ("lexigram.contracts.web", "ErrorResponseDTO"),
550 "HttpRequestLoggerProtocol": (
551 "lexigram.contracts.web",
552 "HttpRequestLoggerProtocol",
553 ),
554 "PaginatedResponseDTO": ("lexigram.contracts.web", "PaginatedResponseDTO"),
555 # workflow
556 "SagaProtocol": ("lexigram.contracts.workflow", "SagaProtocol"),
557 "SagaManagerProtocol": ("lexigram.contracts.workflow", "SagaManagerProtocol"),
558 "WorkflowNodeProtocol": (
559 "lexigram.contracts.workflow.protocols",
560 "WorkflowNodeProtocol",
561 ),
562 "AIWorkflowNodeProtocol": (
563 "lexigram.contracts.ai.workflow",
564 "AIWorkflowNodeProtocol",
565 ),
566 # audit
567 "AuditEntry": ("lexigram.contracts.audit", "AuditEntry"),
568 # feature_flags
569 "FlagEvaluation": ("lexigram.contracts.feature_flags", "FlagEvaluation"),
570 "FlagType": ("lexigram.contracts.feature_flags", "FlagType"),
571 "FlagValue": ("lexigram.contracts.feature_flags", "FlagValue"),
572 # pagination
573 "CursorPage": ("lexigram.contracts.domain.pagination", "CursorPage"),
574 "CursorPageProtocol": (
575 "lexigram.contracts.domain.pagination",
576 "CursorPageProtocol",
577 ),
578 "OffsetPageProtocol": (
579 "lexigram.contracts.domain.pagination",
580 "OffsetPageProtocol",
581 ),
582 # tenancy
583 "TenantConfigError": ("lexigram.contracts.tenancy", "TenantConfigError"),
584 "TenantConfigProviderProtocol": (
585 "lexigram.contracts.tenancy",
586 "TenantConfigProviderProtocol",
587 ),
588 "TenantError": ("lexigram.contracts.tenancy", "TenantError"),
589 "TenantInactiveError": ("lexigram.contracts.tenancy", "TenantInactiveError"),
590 "TenantInfo": ("lexigram.contracts.tenancy", "TenantInfo"),
591 "TenantIsolationStrategyProtocol": (
592 "lexigram.contracts.tenancy",
593 "TenantIsolationStrategyProtocol",
594 ),
595 "TenantNotFoundError": ("lexigram.contracts.tenancy", "TenantNotFoundError"),
596 "TenantProviderProtocol": ("lexigram.contracts.tenancy", "TenantProviderProtocol"),
597 "TenantProvisioningError": (
598 "lexigram.contracts.tenancy",
599 "TenantProvisioningError",
600 ),
601 "TenantResolutionContext": (
602 "lexigram.contracts.tenancy",
603 "TenantResolutionContext",
604 ),
605 "TenantResolutionError": ("lexigram.contracts.tenancy", "TenantResolutionError"),
606 "TenantResolverProtocol": ("lexigram.contracts.tenancy", "TenantResolverProtocol"),
607 "TenantSlugConflictError": (
608 "lexigram.contracts.tenancy",
609 "TenantSlugConflictError",
610 ),
611 "TenantStatus": ("lexigram.contracts.tenancy", "TenantStatus"),
612 "TenantSuspendedError": ("lexigram.contracts.tenancy", "TenantSuspendedError"),
613}
616def __getattr__(name: str) -> Any:
617 """Lazy-load public symbols on first access."""
618 if name in _LAZY_IMPORTS:
619 import importlib
621 module_path, attr_name = _LAZY_IMPORTS[name]
622 module = importlib.import_module(module_path)
623 value = getattr(module, attr_name)
624 globals()[name] = value
625 return value
626 if name in _SUBMODULE_NAMES:
627 import importlib
629 return importlib.import_module(f"lexigram.contracts.{name}")
630 raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
633def __dir__() -> list[str]:
634 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys()))
637__all__ = list(_LAZY_IMPORTS)