mdrack 1.3.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 (148) hide show
  1. mdrack/__init__.py +3 -0
  2. mdrack/__main__.py +6 -0
  3. mdrack/adapters/__init__.py +1 -0
  4. mdrack/adapters/lmstudio/__init__.py +1 -0
  5. mdrack/adapters/lmstudio/fakes.py +84 -0
  6. mdrack/adapters/markdown_it/__init__.py +5 -0
  7. mdrack/adapters/markdown_it/parser.py +695 -0
  8. mdrack/adapters/sqlite/__init__.py +9 -0
  9. mdrack/adapters/sqlite/canonical_catalog.py +145 -0
  10. mdrack/adapters/sqlite/index_storage.py +558 -0
  11. mdrack/adapters/sqlite/resource_store.py +5 -0
  12. mdrack/application/__init__.py +40 -0
  13. mdrack/application/artifact_cache.py +546 -0
  14. mdrack/application/chunking.py +735 -0
  15. mdrack/application/compatibility.py +1004 -0
  16. mdrack/application/indexing.py +708 -0
  17. mdrack/application/manifest.py +652 -0
  18. mdrack/application/metadata_filters.py +117 -0
  19. mdrack/application/metadata_normalization.py +238 -0
  20. mdrack/application/metadata_projection.py +362 -0
  21. mdrack/application/query.py +68 -0
  22. mdrack/application/resource_catalog.py +1168 -0
  23. mdrack/application/resources.py +1088 -0
  24. mdrack/application/retrieval.py +882 -0
  25. mdrack/application/textual_embedding_space.py +74 -0
  26. mdrack/application/transcript_ingestion.py +774 -0
  27. mdrack/application/vector_values.py +145 -0
  28. mdrack/application/video_composition.py +448 -0
  29. mdrack/cli/__init__.py +501 -0
  30. mdrack/cli/commands/__init__.py +0 -0
  31. mdrack/cli/commands/cache.py +147 -0
  32. mdrack/cli/commands/eval.py +212 -0
  33. mdrack/cli/commands/files.py +110 -0
  34. mdrack/cli/commands/images.py +245 -0
  35. mdrack/cli/commands/metadata.py +212 -0
  36. mdrack/cli/commands/model.py +775 -0
  37. mdrack/cli/commands/raw_audio.py +69 -0
  38. mdrack/cli/commands/raw_text.py +55 -0
  39. mdrack/cli/commands/raw_video.py +54 -0
  40. mdrack/cli/commands/read.py +169 -0
  41. mdrack/cli/commands/rebuild.py +150 -0
  42. mdrack/cli/commands/resource.py +161 -0
  43. mdrack/cli/commands/resources.py +340 -0
  44. mdrack/cli/commands/scan.py +103 -0
  45. mdrack/cli/commands/search.py +501 -0
  46. mdrack/cli/commands/transcript.py +253 -0
  47. mdrack/cli/commands/video.py +186 -0
  48. mdrack/cli/help_topics.py +144 -0
  49. mdrack/config/__init__.py +1 -0
  50. mdrack/config/defaults.py +40 -0
  51. mdrack/config/loader.py +263 -0
  52. mdrack/config/models.py +209 -0
  53. mdrack/diagnostics/__init__.py +0 -0
  54. mdrack/diagnostics/doctor.py +112 -0
  55. mdrack/diagnostics/integrity.py +48 -0
  56. mdrack/diagnostics/storage.py +600 -0
  57. mdrack/domain/__init__.py +5 -0
  58. mdrack/domain/blocks.py +70 -0
  59. mdrack/domain/chunks.py +44 -0
  60. mdrack/domain/documents.py +75 -0
  61. mdrack/domain/identifiers.py +33 -0
  62. mdrack/domain/indexing.py +165 -0
  63. mdrack/domain/profiles.py +137 -0
  64. mdrack/domain/retrieval.py +99 -0
  65. mdrack/embeddings/__init__.py +0 -0
  66. mdrack/embeddings/fake.py +143 -0
  67. mdrack/embeddings/hashing.py +24 -0
  68. mdrack/embeddings/lmstudio.py +27 -0
  69. mdrack/embeddings/protocol.py +5 -0
  70. mdrack/embeddings/runtime.py +79 -0
  71. mdrack/eval/__init__.py +0 -0
  72. mdrack/eval/chunk_audit.py +273 -0
  73. mdrack/eval/metrics.py +74 -0
  74. mdrack/eval/privacy.py +212 -0
  75. mdrack/eval/quality.py +255 -0
  76. mdrack/eval/queries.py +146 -0
  77. mdrack/eval/reporting.py +181 -0
  78. mdrack/eval/retrieval.py +266 -0
  79. mdrack/indexing/__init__.py +0 -0
  80. mdrack/indexing/change_detector.py +116 -0
  81. mdrack/indexing/indexer.py +59 -0
  82. mdrack/indexing/scanner.py +148 -0
  83. mdrack/indexing/transactions.py +266 -0
  84. mdrack/ingestion/__init__.py +25 -0
  85. mdrack/ingestion/frame_captions.py +171 -0
  86. mdrack/ingestion/images.py +787 -0
  87. mdrack/ingestion/media_manifests.py +105 -0
  88. mdrack/ingestion/raw_audio.py +314 -0
  89. mdrack/ingestion/raw_source_provenance.py +448 -0
  90. mdrack/ingestion/raw_text.py +169 -0
  91. mdrack/ingestion/raw_video.py +286 -0
  92. mdrack/ingestion/transcripts/__init__.py +120 -0
  93. mdrack/ingestion/transcripts/common.py +306 -0
  94. mdrack/ingestion/transcripts/srt.py +72 -0
  95. mdrack/ingestion/transcripts/timed_json.py +81 -0
  96. mdrack/ingestion/transcripts/webvtt.py +86 -0
  97. mdrack/ingestion/transcripts/whisper_json.py +77 -0
  98. mdrack/integrations/__init__.py +1 -0
  99. mdrack/integrations/lmstudio/__init__.py +26 -0
  100. mdrack/integrations/lmstudio/client.py +852 -0
  101. mdrack/integrations/providers/__init__.py +21 -0
  102. mdrack/integrations/providers/contracts.py +352 -0
  103. mdrack/markdown/__init__.py +0 -0
  104. mdrack/markdown/chunk_builder.py +425 -0
  105. mdrack/markdown/embedding_text.py +63 -0
  106. mdrack/markdown/frontmatter.py +58 -0
  107. mdrack/markdown/ir.py +124 -0
  108. mdrack/markdown/parser.py +337 -0
  109. mdrack/markdown/section_builder.py +174 -0
  110. mdrack/output/__init__.py +0 -0
  111. mdrack/output/envelope.py +41 -0
  112. mdrack/output/errors.py +75 -0
  113. mdrack/output/json_output.py +24 -0
  114. mdrack/ports/__init__.py +27 -0
  115. mdrack/ports/embeddings.py +35 -0
  116. mdrack/ports/model_catalog.py +79 -0
  117. mdrack/ports/model_lifecycle.py +22 -0
  118. mdrack/ports/parser.py +22 -0
  119. mdrack/ports/reranker.py +39 -0
  120. mdrack/ports/storage.py +112 -0
  121. mdrack/public_api/__init__.py +57 -0
  122. mdrack/public_api/engine.py +745 -0
  123. mdrack/public_api/models.py +82 -0
  124. mdrack/search/__init__.py +3 -0
  125. mdrack/search/hybrid.py +85 -0
  126. mdrack/search/scoring.py +81 -0
  127. mdrack/search/semantic.py +64 -0
  128. mdrack/search/text.py +160 -0
  129. mdrack/storage/__init__.py +0 -0
  130. mdrack/storage/sqlite/__init__.py +0 -0
  131. mdrack/storage/sqlite/connection.py +37 -0
  132. mdrack/storage/sqlite/fts.py +143 -0
  133. mdrack/storage/sqlite/migrations/0000_schema_migrations.sql +4 -0
  134. mdrack/storage/sqlite/migrations/0001_initial.sql +77 -0
  135. mdrack/storage/sqlite/migrations/0002_fts.sql +6 -0
  136. mdrack/storage/sqlite/migrations/0003_provenance.sql +26 -0
  137. mdrack/storage/sqlite/migrations/0004_embedding_profiles.sql +36 -0
  138. mdrack/storage/sqlite/migrations/0005_assets.sql +44 -0
  139. mdrack/storage/sqlite/migrations/0006_complete_provenance.sql +25 -0
  140. mdrack/storage/sqlite/migrations/0007_resource_core.sql +123 -0
  141. mdrack/storage/sqlite/migrations.py +200 -0
  142. mdrack/storage/sqlite/repositories.py +212 -0
  143. mdrack/storage/sqlite/vector.py +212 -0
  144. mdrack-1.3.0.dist-info/METADATA +200 -0
  145. mdrack-1.3.0.dist-info/RECORD +148 -0
  146. mdrack-1.3.0.dist-info/WHEEL +4 -0
  147. mdrack-1.3.0.dist-info/entry_points.txt +2 -0
  148. mdrack-1.3.0.dist-info/licenses/LICENSE +21 -0
mdrack/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ """MDRack — Local command-line Markdown knowledge rack for AI agents."""
2
+
3
+ __version__ = "1.3.0"
mdrack/__main__.py ADDED
@@ -0,0 +1,6 @@
1
+ """Allow running mdrack as `python -m mdrack`."""
2
+
3
+ from mdrack.cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -0,0 +1 @@
1
+ """Infrastructure adapters implementing MDRack ports."""
@@ -0,0 +1 @@
1
+ """Offline LM Studio adapter helpers and deterministic fakes."""
@@ -0,0 +1,84 @@
1
+ """Offline deterministic fakes for LM Studio-facing ports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from mdrack.domain.profiles import EmbeddingCapabilities
6
+ from mdrack.embeddings.fake import FakeEmbeddingProvider
7
+ from mdrack.ports.model_catalog import ModelDescriptor
8
+ from mdrack.ports.model_lifecycle import LoadedModel
9
+ from mdrack.ports.reranker import (
10
+ RerankDocument,
11
+ RerankerError,
12
+ RerankerUnavailable,
13
+ RerankScore,
14
+ )
15
+
16
+
17
+ class DeterministicReranker:
18
+ def __init__(
19
+ self,
20
+ *,
21
+ score_by_candidate: dict[str, float] | None = None,
22
+ mode: str = "success",
23
+ ) -> None:
24
+ self.score_by_candidate = score_by_candidate or {}
25
+ self.mode = mode
26
+
27
+ async def rerank(
28
+ self,
29
+ query: str,
30
+ documents: list[RerankDocument],
31
+ *,
32
+ top_n: int,
33
+ ) -> list[RerankScore]:
34
+ del query
35
+ if self.mode == "unsupported":
36
+ raise RerankerUnavailable()
37
+ if self.mode == "failure":
38
+ raise RerankerError("provider_error")
39
+ scored = [
40
+ RerankScore(document.candidate_id, self.score_by_candidate.get(document.candidate_id, 0.0))
41
+ for document in documents
42
+ ]
43
+ scored.sort(key=lambda item: (-item.score, item.candidate_id))
44
+ return scored[:top_n]
45
+
46
+
47
+ class FakeModelCatalogProvider:
48
+ def __init__(self, models: list[ModelDescriptor] | None = None) -> None:
49
+ self.models = models or []
50
+
51
+ async def list_models(self) -> list[ModelDescriptor]:
52
+ return list(self.models)
53
+
54
+ async def embedding_capabilities(self, model_key: str) -> EmbeddingCapabilities:
55
+ del model_key
56
+ return EmbeddingCapabilities()
57
+
58
+ async def supports_reranking(self, model_key: str) -> bool | None:
59
+ del model_key
60
+ return None
61
+
62
+
63
+ class FakeModelLifecycleProvider:
64
+ def __init__(self) -> None:
65
+ self.loaded: dict[str, LoadedModel] = {}
66
+
67
+ async def list_loaded_models(self) -> list[LoadedModel]:
68
+ return sorted(self.loaded.values(), key=lambda model: model.key)
69
+
70
+ async def load_model(self, model_key: str) -> LoadedModel:
71
+ loaded = LoadedModel(model_key, f"fake:{model_key}", "loaded")
72
+ self.loaded[loaded.instance_id or model_key] = loaded
73
+ return loaded
74
+
75
+ async def unload_model(self, instance_id: str) -> None:
76
+ self.loaded.pop(instance_id, None)
77
+
78
+
79
+ __all__ = [
80
+ "DeterministicReranker",
81
+ "FakeEmbeddingProvider",
82
+ "FakeModelCatalogProvider",
83
+ "FakeModelLifecycleProvider",
84
+ ]
@@ -0,0 +1,5 @@
1
+ """markdown-it-py parser adapter."""
2
+
3
+ from mdrack.adapters.markdown_it.parser import MarkdownItParser
4
+
5
+ __all__ = ["MarkdownItParser"]