clm-kernel 0.0.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 (333) hide show
  1. clm/__init__.py +230 -0
  2. clm/__main__.py +25 -0
  3. clm/cross_cutting/__init__.py +50 -0
  4. clm/cross_cutting/_test_runner.py +36 -0
  5. clm/cross_cutting/async_utils.py +25 -0
  6. clm/cross_cutting/cel_builder.py +123 -0
  7. clm/cross_cutting/cel_converter.py +697 -0
  8. clm/cross_cutting/cel_engine.py +252 -0
  9. clm/cross_cutting/cel_ops.py +72 -0
  10. clm/cross_cutting/cel_ops_db.py +157 -0
  11. clm/cross_cutting/cel_ops_files.py +99 -0
  12. clm/cross_cutting/cel_ops_state.py +71 -0
  13. clm/cross_cutting/cel_ops_strings.py +64 -0
  14. clm/cross_cutting/cel_resolver.py +63 -0
  15. clm/cross_cutting/cel_slices.py +56 -0
  16. clm/cross_cutting/cel_store.py +330 -0
  17. clm/cross_cutting/clm_logger.py +140 -0
  18. clm/cross_cutting/config/__init__.py +155 -0
  19. clm/cross_cutting/config/config_constants.py +392 -0
  20. clm/cross_cutting/config/env_parameters.py +90 -0
  21. clm/cross_cutting/config/logging.py +378 -0
  22. clm/cross_cutting/config/settings.py +504 -0
  23. clm/cross_cutting/context.py +5 -0
  24. clm/cross_cutting/domain_models.py +55 -0
  25. clm/cross_cutting/domain_types.py +61 -0
  26. clm/cross_cutting/effects.py +67 -0
  27. clm/cross_cutting/errors.py +153 -0
  28. clm/cross_cutting/governance.py +331 -0
  29. clm/cross_cutting/guards.py +41 -0
  30. clm/cross_cutting/mcard.py +321 -0
  31. clm/cross_cutting/native.py +185 -0
  32. clm/cross_cutting/observability.py +289 -0
  33. clm/cross_cutting/pcard.py +434 -0
  34. clm/cross_cutting/registry.py +71 -0
  35. clm/cross_cutting/resources.py +84 -0
  36. clm/cross_cutting/secrets.py +44 -0
  37. clm/cross_cutting/subprocess_utils.py +118 -0
  38. clm/cross_cutting/telemetry.py +164 -0
  39. clm/cross_cutting/testing/__init__.py +8 -0
  40. clm/cross_cutting/testing/comparator.py +187 -0
  41. clm/cross_cutting/testing/datasets.py +87 -0
  42. clm/cross_cutting/timeutil.py +20 -0
  43. clm/cross_cutting/types/new_type_check.py +0 -0
  44. clm/cross_cutting/utils/__init__.py +1 -0
  45. clm/cross_cutting/utils/url_safety.py +50 -0
  46. clm/cross_cutting/vcard.py +560 -0
  47. clm/cross_cutting/writer.py +118 -0
  48. clm/layer0/README.md +50 -0
  49. clm/layer0/__init__.py +223 -0
  50. clm/layer0/algebra.py +60 -0
  51. clm/layer0/algebra_baldwin.py +133 -0
  52. clm/layer0/algebra_baldwin_generators.py +36 -0
  53. clm/layer0/algebra_equivalence.py +262 -0
  54. clm/layer0/algebra_ingest.py +306 -0
  55. clm/layer0/algebra_manifest_io.py +156 -0
  56. clm/layer0/assembler.py +481 -0
  57. clm/layer0/cel/__init__.py +23 -0
  58. clm/layer0/cel_eval.py +491 -0
  59. clm/layer0/codec.py +106 -0
  60. clm/layer0/context.py +122 -0
  61. clm/layer0/db.py +160 -0
  62. clm/layer0/exceptions.py +73 -0
  63. clm/layer0/fibration.py +106 -0
  64. clm/layer0/gates.py +50 -0
  65. clm/layer0/hash.py +80 -0
  66. clm/layer0/loader.py +826 -0
  67. clm/layer0/math_utils.py +163 -0
  68. clm/layer0/mcard.py +96 -0
  69. clm/layer0/model/__init__.py +0 -0
  70. clm/layer0/model/action.py +223 -0
  71. clm/layer0/model/card.py +280 -0
  72. clm/layer0/model/card_triad.py +427 -0
  73. clm/layer0/model/compatibility.py +60 -0
  74. clm/layer0/model/dictionary.py +46 -0
  75. clm/layer0/model/dots.py +331 -0
  76. clm/layer0/model/event_producer.py +88 -0
  77. clm/layer0/model/g_time.py +89 -0
  78. clm/layer0/model/handle.py +163 -0
  79. clm/layer0/model/hash/__init__.py +6 -0
  80. clm/layer0/model/hash/algorithms/__init__.py +3 -0
  81. clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
  82. clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
  83. clm/layer0/model/hash/constants.py +53 -0
  84. clm/layer0/model/hash/enums.py +60 -0
  85. clm/layer0/model/hash/validator.py +307 -0
  86. clm/layer0/model/interpreter.py +275 -0
  87. clm/layer0/model/pagination.py +45 -0
  88. clm/layer0/model/pcard.py +716 -0
  89. clm/layer0/model/schema.py +44 -0
  90. clm/layer0/model/utils/__init__.py +1 -0
  91. clm/layer0/model/utils/content_analyzer.py +152 -0
  92. clm/layer0/model/validators/__init__.py +1 -0
  93. clm/layer0/model/validators/base_validator.py +44 -0
  94. clm/layer0/model/validators/binary_validator.py +66 -0
  95. clm/layer0/model/validators/text_validator.py +82 -0
  96. clm/layer0/model/validators/validation_registry.py +49 -0
  97. clm/layer0/model/vcard.py +823 -0
  98. clm/layer0/model/vcard_ext/__init__.py +39 -0
  99. clm/layer0/model/vcard_ext/core.py +60 -0
  100. clm/layer0/model/vcard_ext/network.py +23 -0
  101. clm/layer0/model/vcard_ext/observability.py +63 -0
  102. clm/layer0/model/vcard_ext/storage.py +60 -0
  103. clm/layer0/model/vcard_ext/vendors.py +211 -0
  104. clm/layer0/model/vcard_sandwich.py +119 -0
  105. clm/layer0/model/vcard_vocabulary.py +463 -0
  106. clm/layer0/model/workflow.py +274 -0
  107. clm/layer0/narrative.py +431 -0
  108. clm/layer0/ontology/collection.py +125 -0
  109. clm/layer0/parser.py +429 -0
  110. clm/layer0/relations.py +73 -0
  111. clm/layer0/rule_evaluator.py +251 -0
  112. clm/layer0/schema/__init__.py +38 -0
  113. clm/layer0/schema/ddl.py +97 -0
  114. clm/layer0/templates/abstract.yaml +99 -0
  115. clm/layer0/templates/balanced.yaml +253 -0
  116. clm/layer0/templates/concrete.yaml +172 -0
  117. clm/layer0/type_registry.py +223 -0
  118. clm/layer0/types.py +204 -0
  119. clm/layer0/utils.py +886 -0
  120. clm/layer0/verifier_core.py +262 -0
  121. clm/layer1/__init__.py +31 -0
  122. clm/layer1/action_dispatcher.py +275 -0
  123. clm/layer1/adapter_registry.py +233 -0
  124. clm/layer1/algebra_baldwin_generators.py +192 -0
  125. clm/layer1/arrow_compiler.py +525 -0
  126. clm/layer1/batch_processor.py +152 -0
  127. clm/layer1/cel/__init__.py +27 -0
  128. clm/layer1/cel/builder.py +173 -0
  129. clm/layer1/engine.py +759 -0
  130. clm/layer1/engine_async.py +89 -0
  131. clm/layer1/eval_callback.py +49 -0
  132. clm/layer1/gate_composer.py +229 -0
  133. clm/layer1/hoare_sandwich.py +298 -0
  134. clm/layer1/identity_guard.py +348 -0
  135. clm/layer1/matrix.py +138 -0
  136. clm/layer1/neural_runtime.py +221 -0
  137. clm/layer1/operations/__init__.py +123 -0
  138. clm/layer1/operations/augment.py +156 -0
  139. clm/layer1/operations/base.py +109 -0
  140. clm/layer1/operations/builtins.py +338 -0
  141. clm/layer1/operations/dispatch.py +144 -0
  142. clm/layer1/operations/exclude.py +107 -0
  143. clm/layer1/operations/handle.py +197 -0
  144. clm/layer1/operations/identity.py +139 -0
  145. clm/layer1/operations/invert.py +66 -0
  146. clm/layer1/operations/loader.py +116 -0
  147. clm/layer1/operations/manipulators/__init__.py +23 -0
  148. clm/layer1/operations/manipulators/document.py +211 -0
  149. clm/layer1/operations/manipulators/media.py +134 -0
  150. clm/layer1/operations/manipulators/structured.py +159 -0
  151. clm/layer1/operations/manipulators/tabular.py +334 -0
  152. clm/layer1/operations/port.py +65 -0
  153. clm/layer1/operations/services.py +529 -0
  154. clm/layer1/operations/split.py +117 -0
  155. clm/layer1/operations/substitute.py +75 -0
  156. clm/layer1/petri.py +1052 -0
  157. clm/layer1/pocketflow_orchestrator.py +408 -0
  158. clm/layer1/pocketflow_scheduler.py +519 -0
  159. clm/layer1/protocols.py +197 -0
  160. clm/layer1/runtime_adapter.py +718 -0
  161. clm/layer1/runtimes/__init__.py +71 -0
  162. clm/layer1/runtimes/_generated_assertions.py +125 -0
  163. clm/layer1/runtimes/_generated_types.py +42 -0
  164. clm/layer1/runtimes/base.py +265 -0
  165. clm/layer1/runtimes/binary.py +101 -0
  166. clm/layer1/runtimes/factory.py +203 -0
  167. clm/layer1/runtimes/javascript.py +321 -0
  168. clm/layer1/runtimes/javascript_runtime.js +33 -0
  169. clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
  170. clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
  171. clm/layer1/runtimes/lambda_calc.py +126 -0
  172. clm/layer1/runtimes/python.py +288 -0
  173. clm/layer1/runtimes/python_runtime.py +41 -0
  174. clm/layer1/runtimes/script.py +114 -0
  175. clm/layer1/sandbox.py +334 -0
  176. clm/layer1/savepoint_guard.py +136 -0
  177. clm/layer1/sparse_net.py +122 -0
  178. clm/layer1/spec_tester.py +165 -0
  179. clm/layer1/store.py +295 -0
  180. clm/layer1/test_runner.py +498 -0
  181. clm/layer1/type_inspector.py +166 -0
  182. clm/layer1/verifier.py +772 -0
  183. clm/layer1/vm.py +91 -0
  184. clm/layer2/__init__.py +78 -0
  185. clm/layer2/card_collection.py +678 -0
  186. clm/layer2/classifier.py +479 -0
  187. clm/layer2/engine/__init__.py +1 -0
  188. clm/layer2/engine/abstract_sql_engine.py +320 -0
  189. clm/layer2/engine/base.py +193 -0
  190. clm/layer2/engine/duckdb_engine.py +576 -0
  191. clm/layer2/engine/sqlite_engine.py +518 -0
  192. clm/layer2/fiber/__init__.py +31 -0
  193. clm/layer2/fiber/context.py +89 -0
  194. clm/layer2/fiber/disposable.py +163 -0
  195. clm/layer2/fiber/fiber.py +125 -0
  196. clm/layer2/fiber/hoare.py +191 -0
  197. clm/layer2/file_io.py +376 -0
  198. clm/layer2/file_registrar.py +77 -0
  199. clm/layer2/ingest.py +202 -0
  200. clm/layer2/lineage.py +322 -0
  201. clm/layer2/mcard_fs.py +262 -0
  202. clm/layer2/merkle.py +11 -0
  203. clm/layer2/mime.py +244 -0
  204. clm/layer2/mime_detector.py +245 -0
  205. clm/layer2/private_collection.py +118 -0
  206. clm/layer2/shared_store.py +11 -0
  207. clm/layer2/storage/__init__.py +190 -0
  208. clm/layer2/storage/db_bitemporal.py +141 -0
  209. clm/layer2/storage/db_driver.py +331 -0
  210. clm/layer2/storage/db_hyperlinks.py +214 -0
  211. clm/layer2/storage/db_pool.py +139 -0
  212. clm/layer2/storage/db_repository.py +229 -0
  213. clm/layer2/storage/savepoint.py +78 -0
  214. clm/layer2/storage/sqlite_wal.py +74 -0
  215. clm/layer2/tridb.py +245 -0
  216. clm/layer2/vcard_receipt.py +71 -0
  217. clm/layer2/vfs.py +17 -0
  218. clm/layer3/__init__.py +141 -0
  219. clm/layer3/agency/__init__.py +19 -0
  220. clm/layer3/agency/config.py +220 -0
  221. clm/layer3/agency/providers/__init__.py +15 -0
  222. clm/layer3/agency/providers/base.py +91 -0
  223. clm/layer3/agency/providers/mlc_llm.py +169 -0
  224. clm/layer3/agency/providers/ollama.py +203 -0
  225. clm/layer3/agency/router.py +71 -0
  226. clm/layer3/agency/runtime.py +524 -0
  227. clm/layer3/gateway.py +353 -0
  228. clm/layer3/open_interpreter_adapter.py +159 -0
  229. clm/layer3/rag/__init__.py +70 -0
  230. clm/layer3/rag/cli.py +228 -0
  231. clm/layer3/rag/config.py +153 -0
  232. clm/layer3/rag/embeddings/__init__.py +16 -0
  233. clm/layer3/rag/embeddings/base.py +79 -0
  234. clm/layer3/rag/embeddings/ollama.py +211 -0
  235. clm/layer3/rag/embeddings/vision.py +290 -0
  236. clm/layer3/rag/engine.py +276 -0
  237. clm/layer3/rag/graph/__init__.py +22 -0
  238. clm/layer3/rag/graph/community.py +198 -0
  239. clm/layer3/rag/graph/engine.py +433 -0
  240. clm/layer3/rag/graph/extractor.py +255 -0
  241. clm/layer3/rag/graph/schema.py +115 -0
  242. clm/layer3/rag/graph/store.py +641 -0
  243. clm/layer3/rag/indexer.py +333 -0
  244. clm/layer3/rag/llm_providers.json +52 -0
  245. clm/layer3/rag/semantic_versioning.py +313 -0
  246. clm/layer3/rag/vector/__init__.py +28 -0
  247. clm/layer3/rag/vector/handle_vector_store.py +749 -0
  248. clm/layer3/rag/vector/schema.py +151 -0
  249. clm/layer3/rag/vector/store.py +632 -0
  250. clm/layer3/reticulum/__init__.py +55 -0
  251. clm/layer3/reticulum/bridge.py +74 -0
  252. clm/layer3/reticulum/daemon.py +88 -0
  253. clm/layer3/reticulum/discovery.py +164 -0
  254. clm/layer3/reticulum/identity.py +107 -0
  255. clm/layer3/reticulum/media.py +148 -0
  256. clm/layer3/reticulum/transport.py +133 -0
  257. clm/layer3/satori/__init__.py +209 -0
  258. clm/layer3/satori/alpha_conversion.py +168 -0
  259. clm/layer3/satori/beta_reduction.py +359 -0
  260. clm/layer3/satori/continuation.py +38 -0
  261. clm/layer3/satori/eta_conversion.py +205 -0
  262. clm/layer3/satori/free_variables.py +163 -0
  263. clm/layer3/satori/io_effects.py +370 -0
  264. clm/layer3/satori/lambda_runtime.py +726 -0
  265. clm/layer3/satori/lambda_term.py +230 -0
  266. clm/layer3/satori/sheaf_audit.py +261 -0
  267. clm/layer3/satori/speech_act.py +279 -0
  268. clm/layer4/README.md +9 -0
  269. clm/layer4/__init__.py +67 -0
  270. clm/layer4/_sovereign_executor.py +580 -0
  271. clm/layer4/action_commands.py +719 -0
  272. clm/layer4/api.py +236 -0
  273. clm/layer4/bootstrap/__init__.py +13 -0
  274. clm/layer4/bootstrap/bootstrapper.py +118 -0
  275. clm/layer4/bootstrap/cleanup.py +44 -0
  276. clm/layer4/bootstrap/clm_hooks.py +49 -0
  277. clm/layer4/bootstrap/genesis.py +77 -0
  278. clm/layer4/bootstrap/injection.py +125 -0
  279. clm/layer4/cli.py +549 -0
  280. clm/layer4/collection_manager.py +553 -0
  281. clm/layer4/commands/__init__.py +81 -0
  282. clm/layer4/commands/action_cmd.py +42 -0
  283. clm/layer4/commands/check_cmd.py +82 -0
  284. clm/layer4/commands/envelope.py +73 -0
  285. clm/layer4/commands/evaluate_cmd.py +224 -0
  286. clm/layer4/commands/mcard_cmd.py +24 -0
  287. clm/layer4/commands/petri_cmd.py +92 -0
  288. clm/layer4/commands/tridb_cmd.py +319 -0
  289. clm/layer4/commands/version_cmd.py +27 -0
  290. clm/layer4/diff_commands.py +167 -0
  291. clm/layer4/eoa_sponsor.py +232 -0
  292. clm/layer4/events.py +69 -0
  293. clm/layer4/flux_gateway.py +133 -0
  294. clm/layer4/gateway.py +91 -0
  295. clm/layer4/loader.py +307 -0
  296. clm/layer4/mcard_commands.py +166 -0
  297. clm/layer4/membrane.py +273 -0
  298. clm/layer4/navigation.py +50 -0
  299. clm/layer4/protocol/protocol_entry_python.py +108 -0
  300. clm/layer4/protocol/python_sync.py +126 -0
  301. clm/layer4/runner.py +150 -0
  302. clm/layer4/satori.py +262 -0
  303. clm/layer4/server/python_sync_client.py +150 -0
  304. clm/layer4/server/python_sync_server.py +139 -0
  305. clm/layer4/server/service_api.py +315 -0
  306. clm/layer4/server/start_servers.py +107 -0
  307. clm/layer4/server/stop_servers.py +24 -0
  308. clm/layer4/simulated_optimization_fix.py +0 -0
  309. clm/layer4/storage.py +463 -0
  310. clm/layer4/tridb_admin.py +268 -0
  311. clm/layer4/websocket/test_ws_client.py +104 -0
  312. clm/layer4/websocket/test_ws_server.py +138 -0
  313. clm/layer4/websocket/ws_server_local.py +160 -0
  314. clm/layer5/__init__.py +51 -0
  315. clm/layer5/async_batch_writer.py +133 -0
  316. clm/layer5/learning.py +276 -0
  317. clm/layer5/telemetry_hook.py +107 -0
  318. clm/layer5/type_lattice.py +238 -0
  319. clm/py.typed +0 -0
  320. clm/schemas/__init__.py +652 -0
  321. clm/schemas/abstract_face_schema.yaml +77 -0
  322. clm/schemas/cel_schema.yaml +416 -0
  323. clm/schemas/lifecycle/__init__.py +45 -0
  324. clm/schemas/lifecycle/models.py +123 -0
  325. clm/schemas/lifecycle/service.py +364 -0
  326. clm/schemas/mcard_schema.sql +192 -0
  327. clm/schemas/mcard_vector_schema.sql +283 -0
  328. clm/schemas/mlp-context-v1.json +91 -0
  329. clm_kernel-0.0.0.dist-info/METADATA +121 -0
  330. clm_kernel-0.0.0.dist-info/RECORD +333 -0
  331. clm_kernel-0.0.0.dist-info/WHEEL +4 -0
  332. clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
  333. clm_kernel-0.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,211 @@
1
+ """Document Baldwin Modularity Manipulator (Sprint 393 / DEL-393-02).
2
+
3
+ Algebraic operations over Markdown and structured text documents:
4
+ - split: Partition Markdown by heading hierarchy (e.g. H2 headings).
5
+ - substitute: Replace text blocks, keywords, or section contents.
6
+ - augment: Inject/update YAML frontmatter or append sections.
7
+ - exclude: Redact sections by heading or strip comments/frontmatter.
8
+ - invert: Invert section ordering or reverse document flow.
9
+ - port: Transcode Markdown to plain text or HTML.
10
+
11
+ Layer 1 module (no imports above L1).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import re
17
+ from typing import Any
18
+
19
+ import yaml
20
+
21
+
22
+ class DocumentManipulator:
23
+ """Modality manipulator for Markdown and text documents."""
24
+
25
+ @staticmethod
26
+ def _parse_frontmatter(text: str) -> tuple[dict[str, Any], str]:
27
+ """Extract YAML frontmatter if present."""
28
+ if text.startswith("---\n"):
29
+ parts = text.split("---\n", 2)
30
+ if len(parts) >= 3:
31
+ try:
32
+ fm = yaml.safe_load(parts[1])
33
+ body = parts[2]
34
+ return fm if isinstance(fm, dict) else {}, body
35
+ except Exception:
36
+ pass
37
+ return {}, text
38
+
39
+ @staticmethod
40
+ def _render_document(frontmatter: dict[str, Any], body: str) -> str:
41
+ """Combine YAML frontmatter with body."""
42
+ if not frontmatter:
43
+ return body
44
+ fm_str = yaml.dump(frontmatter, sort_keys=False)
45
+ return f"---\n{fm_str}---\n{body.lstrip()}"
46
+
47
+ @classmethod
48
+ def split(
49
+ cls,
50
+ data: str | bytes,
51
+ parameters: dict[str, Any] | None = None,
52
+ ) -> dict[str, str]:
53
+ """Split a Markdown document by heading level (default H2 ##).
54
+
55
+ Returns a dictionary mapping section titles to section Markdown text.
56
+ """
57
+ params = parameters or {}
58
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
59
+ heading_level = params.get("heading_level", 2)
60
+ pattern = rf"^({'#' * heading_level}\s+.+)$"
61
+
62
+ sections = re.split(pattern, text, flags=re.MULTILINE)
63
+ if len(sections) <= 1:
64
+ return {"document": text}
65
+
66
+ results: dict[str, str] = {}
67
+ intro = sections[0].strip()
68
+ if intro:
69
+ results["intro"] = intro
70
+
71
+ # sections has alternating [heading, content, heading, content...]
72
+ i = 1
73
+ while i < len(sections):
74
+ heading = sections[i].strip().lstrip("#").strip()
75
+ content = sections[i + 1].strip() if i + 1 < len(sections) else ""
76
+ clean_key = re.sub(r"[^a-zA-Z0-9_\-]+", "_", heading.lower()).strip("_") or f"section_{i}"
77
+ results[clean_key] = f"{sections[i]}\n\n{content}".strip()
78
+ i += 2
79
+
80
+ return results
81
+
82
+ @classmethod
83
+ def substitute(
84
+ cls,
85
+ data: str | bytes,
86
+ parameters: dict[str, Any] | None = None,
87
+ ) -> str:
88
+ """Substitute text or patterns in a document."""
89
+ params = parameters or {}
90
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
91
+ replacements = params.get("replacements", {})
92
+
93
+ res = text
94
+ for old, new in replacements.items():
95
+ res = res.replace(old, str(new))
96
+ return res
97
+
98
+ @classmethod
99
+ def augment(
100
+ cls,
101
+ data: str | bytes,
102
+ parameters: dict[str, Any] | None = None,
103
+ ) -> str:
104
+ """Augment document by updating frontmatter or appending content."""
105
+ params = parameters or {}
106
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
107
+ fm, body = cls._parse_frontmatter(text)
108
+
109
+ frontmatter_add = params.get("frontmatter", {})
110
+ append_content = params.get("append", "")
111
+
112
+ fm.update(frontmatter_add)
113
+ new_body = body
114
+ if append_content:
115
+ new_body = f"{body.rstrip()}\n\n{append_content}\n"
116
+
117
+ return cls._render_document(fm, new_body)
118
+
119
+ @classmethod
120
+ def exclude(
121
+ cls,
122
+ data: str | bytes,
123
+ parameters: dict[str, Any] | None = None,
124
+ ) -> str:
125
+ """Exclude (redact) sections by heading or remove frontmatter."""
126
+ params = parameters or {}
127
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
128
+ exclude_sections = set(params.get("sections", []))
129
+ strip_frontmatter = params.get("strip_frontmatter", False)
130
+
131
+ fm, body = cls._parse_frontmatter(text)
132
+ if strip_frontmatter:
133
+ fm = {}
134
+
135
+ if exclude_sections:
136
+ # Filter out sections matching headings
137
+ pattern = r"^(#{1,6}\s+.+)$"
138
+ parts = re.split(pattern, body, flags=re.MULTILINE)
139
+ filtered_body = [parts[0]]
140
+ i = 1
141
+ while i < len(parts):
142
+ heading_line = parts[i]
143
+ heading_text = heading_line.strip().lstrip("#").strip()
144
+ content = parts[i + 1] if i + 1 < len(parts) else ""
145
+ if heading_text not in exclude_sections:
146
+ filtered_body.append(heading_line)
147
+ filtered_body.append(content)
148
+ i += 2
149
+ body = "".join(filtered_body)
150
+
151
+ return cls._render_document(fm, body)
152
+
153
+ @classmethod
154
+ def invert(
155
+ cls,
156
+ data: str | bytes,
157
+ parameters: dict[str, Any] | None = None,
158
+ ) -> str:
159
+ _ = parameters
160
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
161
+ fm, body = cls._parse_frontmatter(text)
162
+
163
+ pattern = r"^(#{1,6}\s+.+)$"
164
+ parts = re.split(pattern, body, flags=re.MULTILINE)
165
+ if len(parts) <= 1:
166
+ return text
167
+
168
+ intro = parts[0]
169
+ sections: list[str] = []
170
+ i = 1
171
+ while i < len(parts):
172
+ heading_line = parts[i]
173
+ content = parts[i + 1] if i + 1 < len(parts) else ""
174
+ sections.append(f"{heading_line}{content}")
175
+ i += 2
176
+
177
+ reversed_body = intro + "".join(reversed(sections))
178
+ return cls._render_document(fm, reversed_body)
179
+
180
+ @classmethod
181
+ def port(
182
+ cls,
183
+ data: str | bytes,
184
+ parameters: dict[str, Any] | None = None,
185
+ ) -> str:
186
+ """Port Markdown to plain text or basic HTML."""
187
+ params = parameters or {}
188
+ target_fmt = params.get("target_format", "text").lower()
189
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
190
+ _, body = cls._parse_frontmatter(text)
191
+
192
+ if target_fmt == "html":
193
+ # Simple conversion of headings and paragraphs
194
+ lines = body.splitlines()
195
+ html_lines: list[str] = []
196
+ for ln in lines:
197
+ if ln.startswith("### "):
198
+ html_lines.append(f"<h3>{ln[4:].strip()}</h3>")
199
+ elif ln.startswith("## "):
200
+ html_lines.append(f"<h2>{ln[3:].strip()}</h2>")
201
+ elif ln.startswith("# "):
202
+ html_lines.append(f"<h1>{ln[2:].strip()}</h1>")
203
+ elif ln.strip():
204
+ html_lines.append(f"<p>{ln.strip()}</p>")
205
+ return "\n".join(html_lines)
206
+
207
+ # Default plain text: strip markdown syntax
208
+ plain = re.sub(r"^#{1,6}\s+", "", body, flags=re.MULTILINE)
209
+ plain = re.sub(r"\[(.*?)\]\(.*?\)", r"\1", plain)
210
+ plain = re.sub(r"[*_`]", "", plain)
211
+ return plain.strip()
@@ -0,0 +1,134 @@
1
+ """Media Baldwin Modularity Manipulator (Sprint 393 / DEL-393-02).
2
+
3
+ Algebraic operations over Binary and Multi-Media assets (images, audio, 3D models):
4
+ - split: Chunk bytes into partitions or slice channels.
5
+ - substitute: Replace byte segments or metadata blocks.
6
+ - augment: Extract and embed structural media headers.
7
+ - exclude: Strip EXIF or trailing metadata chunks for privacy.
8
+ - invert: Invert byte payloads (bit-level complement).
9
+ - port: Transcode representation (raw bytes to base64, SVG to XML).
10
+
11
+ Layer 1 module (no imports above L1).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import base64
17
+ from typing import Any
18
+
19
+
20
+ class MediaManipulator:
21
+ """Modality manipulator for binary and media assets."""
22
+
23
+ @staticmethod
24
+ def _to_bytes(data: Any) -> bytes:
25
+ if isinstance(data, bytes):
26
+ return data
27
+ if isinstance(data, str):
28
+ # Check if base64 encoded
29
+ try:
30
+ return base64.b64decode(data)
31
+ except Exception:
32
+ return data.encode("utf-8")
33
+ return bytes(str(data), encoding="utf-8")
34
+
35
+ @classmethod
36
+ def split(
37
+ cls,
38
+ data: Any,
39
+ parameters: dict[str, Any] | None = None,
40
+ ) -> dict[str, bytes]:
41
+ """Split binary asset into chunks."""
42
+ b = cls._to_bytes(data)
43
+ params = parameters or {}
44
+ chunk_size = params.get("chunk_size")
45
+
46
+ if chunk_size and chunk_size > 0:
47
+ chunks: dict[str, bytes] = {}
48
+ for i in range(0, len(b), chunk_size):
49
+ chunks[f"chunk_{i // chunk_size}"] = b[i : i + chunk_size]
50
+ return chunks
51
+
52
+ # Default 50/50 split
53
+ mid = len(b) // 2
54
+ return {
55
+ "part_1": b[:mid],
56
+ "part_2": b[mid:],
57
+ }
58
+
59
+ @classmethod
60
+ def substitute(
61
+ cls,
62
+ data: Any,
63
+ parameters: dict[str, Any] | None = None,
64
+ ) -> bytes:
65
+ """Substitute byte patterns in media."""
66
+ b = cls._to_bytes(data)
67
+ params = parameters or {}
68
+ old_bytes = params.get("old_bytes")
69
+ new_bytes = params.get("new_bytes", b"")
70
+
71
+ if old_bytes and isinstance(old_bytes, bytes):
72
+ return b.replace(old_bytes, new_bytes)
73
+ return b
74
+
75
+ @classmethod
76
+ def augment(
77
+ cls,
78
+ data: Any,
79
+ parameters: dict[str, Any] | None = None,
80
+ ) -> dict[str, Any]:
81
+ """Extract and return media metadata annotations."""
82
+ b = cls._to_bytes(data)
83
+ params = parameters or {}
84
+ tag = params.get("tag", "processed")
85
+
86
+ meta: dict[str, Any] = {
87
+ "byte_size": len(b),
88
+ "tag": tag,
89
+ }
90
+ if len(b) >= 8 and b.startswith(b"\x89PNG\r\n\x1a\n"):
91
+ meta["mime_type"] = "image/png"
92
+ elif len(b) >= 3 and b.startswith(b"\xff\xd8\xff"):
93
+ meta["mime_type"] = "image/jpeg"
94
+ elif b.startswith(b"%PDF-"):
95
+ meta["mime_type"] = "application/pdf"
96
+ return meta
97
+
98
+ @classmethod
99
+ def exclude(
100
+ cls,
101
+ data: Any,
102
+ parameters: dict[str, Any] | None = None,
103
+ ) -> bytes:
104
+ """Strip trailing padding or metadata from media bytes."""
105
+ b = cls._to_bytes(data)
106
+ params = parameters or {}
107
+ strip_bytes = params.get("strip_trailing_zeros", True)
108
+ if strip_bytes:
109
+ return b.rstrip(b"\x00")
110
+ return b
111
+
112
+ @classmethod
113
+ def invert(
114
+ cls,
115
+ data: Any,
116
+ parameters: dict[str, Any] | None = None,
117
+ ) -> bytes:
118
+ """Bitwise complement of media bytes."""
119
+ b = cls._to_bytes(data)
120
+ return bytes(x ^ 0xFF for x in b)
121
+
122
+ @classmethod
123
+ def port(
124
+ cls,
125
+ data: Any,
126
+ parameters: dict[str, Any] | None = None,
127
+ ) -> str:
128
+ """Port binary media to base64 string or ASCII hex."""
129
+ b = cls._to_bytes(data)
130
+ params = parameters or {}
131
+ target_fmt = params.get("target_format", "base64").lower()
132
+ if target_fmt == "hex":
133
+ return b.hex()
134
+ return base64.b64encode(b).decode("ascii")
@@ -0,0 +1,159 @@
1
+ """Structured Data Baldwin Modularity Manipulator (Sprint 393 / DEL-393-02).
2
+
3
+ Algebraic operations over JSON and YAML structured data:
4
+ - split: Partition dictionary keys or array elements into disjoint sub-objects.
5
+ - substitute: Replace values at specific key paths.
6
+ - augment: Merge attributes or enrich structures with metadata.
7
+ - exclude: Redact sensitive keys (PII/secrets) recursively.
8
+ - invert: Invert key-value mappings or reverse arrays.
9
+ - port: Transcode JSON to YAML or YAML to JSON.
10
+
11
+ Layer 1 module (no imports above L1).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import copy
17
+ import json
18
+ from typing import Any
19
+
20
+ import yaml
21
+
22
+
23
+ class StructuredManipulator:
24
+ """Modality manipulator for JSON and YAML structured data."""
25
+
26
+ @staticmethod
27
+ def _parse_data(data: str | bytes | dict | list) -> tuple[Any, str]:
28
+ """Parse raw JSON/YAML or return structured object."""
29
+ if isinstance(data, (dict, list)):
30
+ return copy.deepcopy(data), "object"
31
+ text = data.decode("utf-8") if isinstance(data, bytes) else str(data)
32
+ stripped = text.strip()
33
+ if stripped.startswith("{") or stripped.startswith("["):
34
+ try:
35
+ return json.loads(stripped), "json"
36
+ except Exception:
37
+ pass
38
+ try:
39
+ return yaml.safe_load(stripped), "yaml"
40
+ except Exception:
41
+ return {"raw": text}, "raw"
42
+
43
+ @classmethod
44
+ def split(
45
+ cls,
46
+ data: str | bytes | dict | list,
47
+ parameters: dict[str, Any] | None = None,
48
+ ) -> dict[str, Any]:
49
+ """Split a structured object into partitions by key sets."""
50
+ params = parameters or {}
51
+ obj, fmt = cls._parse_data(data)
52
+ if not isinstance(obj, dict):
53
+ return {"all": obj}
54
+
55
+ key_groups = params.get("groups", {})
56
+ if key_groups:
57
+ partitions: dict[str, dict[str, Any]] = {}
58
+ for group_name, keys in key_groups.items():
59
+ partitions[group_name] = {k: obj[k] for k in keys if k in obj}
60
+ return partitions
61
+
62
+ # Default split: split keys in half
63
+ keys = list(obj.keys())
64
+ mid = len(keys) // 2
65
+ return {
66
+ "part_1": {k: obj[k] for k in keys[:mid]},
67
+ "part_2": {k: obj[k] for k in keys[mid:]},
68
+ }
69
+
70
+ @classmethod
71
+ def substitute(
72
+ cls,
73
+ data: str | bytes | dict | list,
74
+ parameters: dict[str, Any] | None = None,
75
+ ) -> Any:
76
+ """Substitute values or rename keys at specified paths."""
77
+ params = parameters or {}
78
+ obj, fmt = cls._parse_data(data)
79
+ replacements = params.get("replacements", {})
80
+
81
+ if isinstance(obj, dict):
82
+ for k, new_v in replacements.items():
83
+ if k in obj:
84
+ obj[k] = new_v
85
+ return obj
86
+
87
+ @classmethod
88
+ def augment(
89
+ cls,
90
+ data: str | bytes | dict | list,
91
+ parameters: dict[str, Any] | None = None,
92
+ ) -> Any:
93
+ """Augment structured object with new fields or metadata."""
94
+ params = parameters or {}
95
+ obj, fmt = cls._parse_data(data)
96
+ fields = params.get("fields", {})
97
+
98
+ if isinstance(obj, dict):
99
+ obj.update(fields)
100
+ elif isinstance(obj, list) and isinstance(fields, dict):
101
+ obj.append(fields)
102
+ return obj
103
+
104
+ @classmethod
105
+ def exclude(
106
+ cls,
107
+ data: str | bytes | dict | list,
108
+ parameters: dict[str, Any] | None = None,
109
+ ) -> Any:
110
+ """Recursively exclude specified keys from structured data."""
111
+ params = parameters or {}
112
+ obj, fmt = cls._parse_data(data)
113
+ exclude_keys = set(params.get("keys", []))
114
+
115
+ def _prune(item: Any) -> Any:
116
+ if isinstance(item, dict):
117
+ return {k: _prune(v) for k, v in item.items() if k not in exclude_keys}
118
+ elif isinstance(item, list):
119
+ return [_prune(x) for x in item]
120
+ return item
121
+
122
+ return _prune(obj)
123
+
124
+ @classmethod
125
+ def invert(
126
+ cls,
127
+ data: str | bytes | dict | list,
128
+ parameters: dict[str, Any] | None = None,
129
+ ) -> Any:
130
+ _ = parameters
131
+ obj, fmt = cls._parse_data(data)
132
+
133
+ if isinstance(obj, dict):
134
+ # Invert key/value if values are hashable
135
+ inverted: dict[str, str] = {}
136
+ for k, v in obj.items():
137
+ if isinstance(v, (str, int, float, bool)):
138
+ inverted[str(v)] = str(k)
139
+ else:
140
+ inverted[str(k)] = str(v)
141
+ return inverted
142
+ elif isinstance(obj, list):
143
+ return list(reversed(obj))
144
+ return obj
145
+
146
+ @classmethod
147
+ def port(
148
+ cls,
149
+ data: str | bytes | dict | list,
150
+ parameters: dict[str, Any] | None = None,
151
+ ) -> str:
152
+ """Port between JSON and YAML."""
153
+ params = parameters or {}
154
+ target_fmt = params.get("target_format", "yaml").lower()
155
+ obj, _ = cls._parse_data(data)
156
+
157
+ if target_fmt in ("json", "application/json"):
158
+ return json.dumps(obj, indent=2)
159
+ return yaml.dump(obj, sort_keys=False)