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.
- clm/__init__.py +230 -0
- clm/__main__.py +25 -0
- clm/cross_cutting/__init__.py +50 -0
- clm/cross_cutting/_test_runner.py +36 -0
- clm/cross_cutting/async_utils.py +25 -0
- clm/cross_cutting/cel_builder.py +123 -0
- clm/cross_cutting/cel_converter.py +697 -0
- clm/cross_cutting/cel_engine.py +252 -0
- clm/cross_cutting/cel_ops.py +72 -0
- clm/cross_cutting/cel_ops_db.py +157 -0
- clm/cross_cutting/cel_ops_files.py +99 -0
- clm/cross_cutting/cel_ops_state.py +71 -0
- clm/cross_cutting/cel_ops_strings.py +64 -0
- clm/cross_cutting/cel_resolver.py +63 -0
- clm/cross_cutting/cel_slices.py +56 -0
- clm/cross_cutting/cel_store.py +330 -0
- clm/cross_cutting/clm_logger.py +140 -0
- clm/cross_cutting/config/__init__.py +155 -0
- clm/cross_cutting/config/config_constants.py +392 -0
- clm/cross_cutting/config/env_parameters.py +90 -0
- clm/cross_cutting/config/logging.py +378 -0
- clm/cross_cutting/config/settings.py +504 -0
- clm/cross_cutting/context.py +5 -0
- clm/cross_cutting/domain_models.py +55 -0
- clm/cross_cutting/domain_types.py +61 -0
- clm/cross_cutting/effects.py +67 -0
- clm/cross_cutting/errors.py +153 -0
- clm/cross_cutting/governance.py +331 -0
- clm/cross_cutting/guards.py +41 -0
- clm/cross_cutting/mcard.py +321 -0
- clm/cross_cutting/native.py +185 -0
- clm/cross_cutting/observability.py +289 -0
- clm/cross_cutting/pcard.py +434 -0
- clm/cross_cutting/registry.py +71 -0
- clm/cross_cutting/resources.py +84 -0
- clm/cross_cutting/secrets.py +44 -0
- clm/cross_cutting/subprocess_utils.py +118 -0
- clm/cross_cutting/telemetry.py +164 -0
- clm/cross_cutting/testing/__init__.py +8 -0
- clm/cross_cutting/testing/comparator.py +187 -0
- clm/cross_cutting/testing/datasets.py +87 -0
- clm/cross_cutting/timeutil.py +20 -0
- clm/cross_cutting/types/new_type_check.py +0 -0
- clm/cross_cutting/utils/__init__.py +1 -0
- clm/cross_cutting/utils/url_safety.py +50 -0
- clm/cross_cutting/vcard.py +560 -0
- clm/cross_cutting/writer.py +118 -0
- clm/layer0/README.md +50 -0
- clm/layer0/__init__.py +223 -0
- clm/layer0/algebra.py +60 -0
- clm/layer0/algebra_baldwin.py +133 -0
- clm/layer0/algebra_baldwin_generators.py +36 -0
- clm/layer0/algebra_equivalence.py +262 -0
- clm/layer0/algebra_ingest.py +306 -0
- clm/layer0/algebra_manifest_io.py +156 -0
- clm/layer0/assembler.py +481 -0
- clm/layer0/cel/__init__.py +23 -0
- clm/layer0/cel_eval.py +491 -0
- clm/layer0/codec.py +106 -0
- clm/layer0/context.py +122 -0
- clm/layer0/db.py +160 -0
- clm/layer0/exceptions.py +73 -0
- clm/layer0/fibration.py +106 -0
- clm/layer0/gates.py +50 -0
- clm/layer0/hash.py +80 -0
- clm/layer0/loader.py +826 -0
- clm/layer0/math_utils.py +163 -0
- clm/layer0/mcard.py +96 -0
- clm/layer0/model/__init__.py +0 -0
- clm/layer0/model/action.py +223 -0
- clm/layer0/model/card.py +280 -0
- clm/layer0/model/card_triad.py +427 -0
- clm/layer0/model/compatibility.py +60 -0
- clm/layer0/model/dictionary.py +46 -0
- clm/layer0/model/dots.py +331 -0
- clm/layer0/model/event_producer.py +88 -0
- clm/layer0/model/g_time.py +89 -0
- clm/layer0/model/handle.py +163 -0
- clm/layer0/model/hash/__init__.py +6 -0
- clm/layer0/model/hash/algorithms/__init__.py +3 -0
- clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
- clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
- clm/layer0/model/hash/constants.py +53 -0
- clm/layer0/model/hash/enums.py +60 -0
- clm/layer0/model/hash/validator.py +307 -0
- clm/layer0/model/interpreter.py +275 -0
- clm/layer0/model/pagination.py +45 -0
- clm/layer0/model/pcard.py +716 -0
- clm/layer0/model/schema.py +44 -0
- clm/layer0/model/utils/__init__.py +1 -0
- clm/layer0/model/utils/content_analyzer.py +152 -0
- clm/layer0/model/validators/__init__.py +1 -0
- clm/layer0/model/validators/base_validator.py +44 -0
- clm/layer0/model/validators/binary_validator.py +66 -0
- clm/layer0/model/validators/text_validator.py +82 -0
- clm/layer0/model/validators/validation_registry.py +49 -0
- clm/layer0/model/vcard.py +823 -0
- clm/layer0/model/vcard_ext/__init__.py +39 -0
- clm/layer0/model/vcard_ext/core.py +60 -0
- clm/layer0/model/vcard_ext/network.py +23 -0
- clm/layer0/model/vcard_ext/observability.py +63 -0
- clm/layer0/model/vcard_ext/storage.py +60 -0
- clm/layer0/model/vcard_ext/vendors.py +211 -0
- clm/layer0/model/vcard_sandwich.py +119 -0
- clm/layer0/model/vcard_vocabulary.py +463 -0
- clm/layer0/model/workflow.py +274 -0
- clm/layer0/narrative.py +431 -0
- clm/layer0/ontology/collection.py +125 -0
- clm/layer0/parser.py +429 -0
- clm/layer0/relations.py +73 -0
- clm/layer0/rule_evaluator.py +251 -0
- clm/layer0/schema/__init__.py +38 -0
- clm/layer0/schema/ddl.py +97 -0
- clm/layer0/templates/abstract.yaml +99 -0
- clm/layer0/templates/balanced.yaml +253 -0
- clm/layer0/templates/concrete.yaml +172 -0
- clm/layer0/type_registry.py +223 -0
- clm/layer0/types.py +204 -0
- clm/layer0/utils.py +886 -0
- clm/layer0/verifier_core.py +262 -0
- clm/layer1/__init__.py +31 -0
- clm/layer1/action_dispatcher.py +275 -0
- clm/layer1/adapter_registry.py +233 -0
- clm/layer1/algebra_baldwin_generators.py +192 -0
- clm/layer1/arrow_compiler.py +525 -0
- clm/layer1/batch_processor.py +152 -0
- clm/layer1/cel/__init__.py +27 -0
- clm/layer1/cel/builder.py +173 -0
- clm/layer1/engine.py +759 -0
- clm/layer1/engine_async.py +89 -0
- clm/layer1/eval_callback.py +49 -0
- clm/layer1/gate_composer.py +229 -0
- clm/layer1/hoare_sandwich.py +298 -0
- clm/layer1/identity_guard.py +348 -0
- clm/layer1/matrix.py +138 -0
- clm/layer1/neural_runtime.py +221 -0
- clm/layer1/operations/__init__.py +123 -0
- clm/layer1/operations/augment.py +156 -0
- clm/layer1/operations/base.py +109 -0
- clm/layer1/operations/builtins.py +338 -0
- clm/layer1/operations/dispatch.py +144 -0
- clm/layer1/operations/exclude.py +107 -0
- clm/layer1/operations/handle.py +197 -0
- clm/layer1/operations/identity.py +139 -0
- clm/layer1/operations/invert.py +66 -0
- clm/layer1/operations/loader.py +116 -0
- clm/layer1/operations/manipulators/__init__.py +23 -0
- clm/layer1/operations/manipulators/document.py +211 -0
- clm/layer1/operations/manipulators/media.py +134 -0
- clm/layer1/operations/manipulators/structured.py +159 -0
- clm/layer1/operations/manipulators/tabular.py +334 -0
- clm/layer1/operations/port.py +65 -0
- clm/layer1/operations/services.py +529 -0
- clm/layer1/operations/split.py +117 -0
- clm/layer1/operations/substitute.py +75 -0
- clm/layer1/petri.py +1052 -0
- clm/layer1/pocketflow_orchestrator.py +408 -0
- clm/layer1/pocketflow_scheduler.py +519 -0
- clm/layer1/protocols.py +197 -0
- clm/layer1/runtime_adapter.py +718 -0
- clm/layer1/runtimes/__init__.py +71 -0
- clm/layer1/runtimes/_generated_assertions.py +125 -0
- clm/layer1/runtimes/_generated_types.py +42 -0
- clm/layer1/runtimes/base.py +265 -0
- clm/layer1/runtimes/binary.py +101 -0
- clm/layer1/runtimes/factory.py +203 -0
- clm/layer1/runtimes/javascript.py +321 -0
- clm/layer1/runtimes/javascript_runtime.js +33 -0
- clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
- clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
- clm/layer1/runtimes/lambda_calc.py +126 -0
- clm/layer1/runtimes/python.py +288 -0
- clm/layer1/runtimes/python_runtime.py +41 -0
- clm/layer1/runtimes/script.py +114 -0
- clm/layer1/sandbox.py +334 -0
- clm/layer1/savepoint_guard.py +136 -0
- clm/layer1/sparse_net.py +122 -0
- clm/layer1/spec_tester.py +165 -0
- clm/layer1/store.py +295 -0
- clm/layer1/test_runner.py +498 -0
- clm/layer1/type_inspector.py +166 -0
- clm/layer1/verifier.py +772 -0
- clm/layer1/vm.py +91 -0
- clm/layer2/__init__.py +78 -0
- clm/layer2/card_collection.py +678 -0
- clm/layer2/classifier.py +479 -0
- clm/layer2/engine/__init__.py +1 -0
- clm/layer2/engine/abstract_sql_engine.py +320 -0
- clm/layer2/engine/base.py +193 -0
- clm/layer2/engine/duckdb_engine.py +576 -0
- clm/layer2/engine/sqlite_engine.py +518 -0
- clm/layer2/fiber/__init__.py +31 -0
- clm/layer2/fiber/context.py +89 -0
- clm/layer2/fiber/disposable.py +163 -0
- clm/layer2/fiber/fiber.py +125 -0
- clm/layer2/fiber/hoare.py +191 -0
- clm/layer2/file_io.py +376 -0
- clm/layer2/file_registrar.py +77 -0
- clm/layer2/ingest.py +202 -0
- clm/layer2/lineage.py +322 -0
- clm/layer2/mcard_fs.py +262 -0
- clm/layer2/merkle.py +11 -0
- clm/layer2/mime.py +244 -0
- clm/layer2/mime_detector.py +245 -0
- clm/layer2/private_collection.py +118 -0
- clm/layer2/shared_store.py +11 -0
- clm/layer2/storage/__init__.py +190 -0
- clm/layer2/storage/db_bitemporal.py +141 -0
- clm/layer2/storage/db_driver.py +331 -0
- clm/layer2/storage/db_hyperlinks.py +214 -0
- clm/layer2/storage/db_pool.py +139 -0
- clm/layer2/storage/db_repository.py +229 -0
- clm/layer2/storage/savepoint.py +78 -0
- clm/layer2/storage/sqlite_wal.py +74 -0
- clm/layer2/tridb.py +245 -0
- clm/layer2/vcard_receipt.py +71 -0
- clm/layer2/vfs.py +17 -0
- clm/layer3/__init__.py +141 -0
- clm/layer3/agency/__init__.py +19 -0
- clm/layer3/agency/config.py +220 -0
- clm/layer3/agency/providers/__init__.py +15 -0
- clm/layer3/agency/providers/base.py +91 -0
- clm/layer3/agency/providers/mlc_llm.py +169 -0
- clm/layer3/agency/providers/ollama.py +203 -0
- clm/layer3/agency/router.py +71 -0
- clm/layer3/agency/runtime.py +524 -0
- clm/layer3/gateway.py +353 -0
- clm/layer3/open_interpreter_adapter.py +159 -0
- clm/layer3/rag/__init__.py +70 -0
- clm/layer3/rag/cli.py +228 -0
- clm/layer3/rag/config.py +153 -0
- clm/layer3/rag/embeddings/__init__.py +16 -0
- clm/layer3/rag/embeddings/base.py +79 -0
- clm/layer3/rag/embeddings/ollama.py +211 -0
- clm/layer3/rag/embeddings/vision.py +290 -0
- clm/layer3/rag/engine.py +276 -0
- clm/layer3/rag/graph/__init__.py +22 -0
- clm/layer3/rag/graph/community.py +198 -0
- clm/layer3/rag/graph/engine.py +433 -0
- clm/layer3/rag/graph/extractor.py +255 -0
- clm/layer3/rag/graph/schema.py +115 -0
- clm/layer3/rag/graph/store.py +641 -0
- clm/layer3/rag/indexer.py +333 -0
- clm/layer3/rag/llm_providers.json +52 -0
- clm/layer3/rag/semantic_versioning.py +313 -0
- clm/layer3/rag/vector/__init__.py +28 -0
- clm/layer3/rag/vector/handle_vector_store.py +749 -0
- clm/layer3/rag/vector/schema.py +151 -0
- clm/layer3/rag/vector/store.py +632 -0
- clm/layer3/reticulum/__init__.py +55 -0
- clm/layer3/reticulum/bridge.py +74 -0
- clm/layer3/reticulum/daemon.py +88 -0
- clm/layer3/reticulum/discovery.py +164 -0
- clm/layer3/reticulum/identity.py +107 -0
- clm/layer3/reticulum/media.py +148 -0
- clm/layer3/reticulum/transport.py +133 -0
- clm/layer3/satori/__init__.py +209 -0
- clm/layer3/satori/alpha_conversion.py +168 -0
- clm/layer3/satori/beta_reduction.py +359 -0
- clm/layer3/satori/continuation.py +38 -0
- clm/layer3/satori/eta_conversion.py +205 -0
- clm/layer3/satori/free_variables.py +163 -0
- clm/layer3/satori/io_effects.py +370 -0
- clm/layer3/satori/lambda_runtime.py +726 -0
- clm/layer3/satori/lambda_term.py +230 -0
- clm/layer3/satori/sheaf_audit.py +261 -0
- clm/layer3/satori/speech_act.py +279 -0
- clm/layer4/README.md +9 -0
- clm/layer4/__init__.py +67 -0
- clm/layer4/_sovereign_executor.py +580 -0
- clm/layer4/action_commands.py +719 -0
- clm/layer4/api.py +236 -0
- clm/layer4/bootstrap/__init__.py +13 -0
- clm/layer4/bootstrap/bootstrapper.py +118 -0
- clm/layer4/bootstrap/cleanup.py +44 -0
- clm/layer4/bootstrap/clm_hooks.py +49 -0
- clm/layer4/bootstrap/genesis.py +77 -0
- clm/layer4/bootstrap/injection.py +125 -0
- clm/layer4/cli.py +549 -0
- clm/layer4/collection_manager.py +553 -0
- clm/layer4/commands/__init__.py +81 -0
- clm/layer4/commands/action_cmd.py +42 -0
- clm/layer4/commands/check_cmd.py +82 -0
- clm/layer4/commands/envelope.py +73 -0
- clm/layer4/commands/evaluate_cmd.py +224 -0
- clm/layer4/commands/mcard_cmd.py +24 -0
- clm/layer4/commands/petri_cmd.py +92 -0
- clm/layer4/commands/tridb_cmd.py +319 -0
- clm/layer4/commands/version_cmd.py +27 -0
- clm/layer4/diff_commands.py +167 -0
- clm/layer4/eoa_sponsor.py +232 -0
- clm/layer4/events.py +69 -0
- clm/layer4/flux_gateway.py +133 -0
- clm/layer4/gateway.py +91 -0
- clm/layer4/loader.py +307 -0
- clm/layer4/mcard_commands.py +166 -0
- clm/layer4/membrane.py +273 -0
- clm/layer4/navigation.py +50 -0
- clm/layer4/protocol/protocol_entry_python.py +108 -0
- clm/layer4/protocol/python_sync.py +126 -0
- clm/layer4/runner.py +150 -0
- clm/layer4/satori.py +262 -0
- clm/layer4/server/python_sync_client.py +150 -0
- clm/layer4/server/python_sync_server.py +139 -0
- clm/layer4/server/service_api.py +315 -0
- clm/layer4/server/start_servers.py +107 -0
- clm/layer4/server/stop_servers.py +24 -0
- clm/layer4/simulated_optimization_fix.py +0 -0
- clm/layer4/storage.py +463 -0
- clm/layer4/tridb_admin.py +268 -0
- clm/layer4/websocket/test_ws_client.py +104 -0
- clm/layer4/websocket/test_ws_server.py +138 -0
- clm/layer4/websocket/ws_server_local.py +160 -0
- clm/layer5/__init__.py +51 -0
- clm/layer5/async_batch_writer.py +133 -0
- clm/layer5/learning.py +276 -0
- clm/layer5/telemetry_hook.py +107 -0
- clm/layer5/type_lattice.py +238 -0
- clm/py.typed +0 -0
- clm/schemas/__init__.py +652 -0
- clm/schemas/abstract_face_schema.yaml +77 -0
- clm/schemas/cel_schema.yaml +416 -0
- clm/schemas/lifecycle/__init__.py +45 -0
- clm/schemas/lifecycle/models.py +123 -0
- clm/schemas/lifecycle/service.py +364 -0
- clm/schemas/mcard_schema.sql +192 -0
- clm/schemas/mcard_vector_schema.sql +283 -0
- clm/schemas/mlp-context-v1.json +91 -0
- clm_kernel-0.0.0.dist-info/METADATA +121 -0
- clm_kernel-0.0.0.dist-info/RECORD +333 -0
- clm_kernel-0.0.0.dist-info/WHEEL +4 -0
- clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
- 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)
|