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,197 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Handle versioning and pruning operations.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from clm.layer0.model.card import MCard
|
|
8
|
+
|
|
9
|
+
from .base import ExampleRunnerMixin
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def op_handle_version(impl: dict, target: MCard, ctx: dict) -> Any:
|
|
13
|
+
"""Handle versioning builtin: update a handle through multiple versions."""
|
|
14
|
+
# Check for examples list (batch mode)
|
|
15
|
+
examples = ctx.get("examples", [])
|
|
16
|
+
if examples:
|
|
17
|
+
return _run_version_examples(examples)
|
|
18
|
+
|
|
19
|
+
# Single execution mode
|
|
20
|
+
input_data = ctx.get("input", ctx)
|
|
21
|
+
handle = input_data.get("handle", ctx.get("handle", ""))
|
|
22
|
+
versions = input_data.get("versions", ctx.get("versions", []))
|
|
23
|
+
|
|
24
|
+
if not handle:
|
|
25
|
+
return {"success": False, "error": "handle is required"}
|
|
26
|
+
if not versions:
|
|
27
|
+
return {"success": False, "error": "versions list is required"}
|
|
28
|
+
|
|
29
|
+
return _execute_version_single(handle, versions)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def op_handle_prune(impl: dict, target: MCard, ctx: dict) -> Any:
|
|
33
|
+
"""Handle pruning builtin: prune handle history."""
|
|
34
|
+
# Check for examples list (batch mode)
|
|
35
|
+
examples = ctx.get("examples", [])
|
|
36
|
+
if examples:
|
|
37
|
+
return _run_prune_examples(examples)
|
|
38
|
+
|
|
39
|
+
# Single execution mode
|
|
40
|
+
input_data = ctx.get("input", ctx)
|
|
41
|
+
handle = input_data.get("handle", ctx.get("handle", ""))
|
|
42
|
+
versions = input_data.get("versions", ctx.get("versions", []))
|
|
43
|
+
prune_type = input_data.get("prune_type", ctx.get("prune_type", "all"))
|
|
44
|
+
older_than_seconds = input_data.get(
|
|
45
|
+
"older_than_seconds", ctx.get("older_than_seconds")
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
if not handle:
|
|
49
|
+
return {"success": False, "error": "handle is required"}
|
|
50
|
+
|
|
51
|
+
return _execute_prune_single(handle, versions, prune_type, older_than_seconds)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
# Version Helpers
|
|
56
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _run_version_examples(examples: list) -> dict[str, Any]:
|
|
60
|
+
"""Run all versioning examples and return aggregated results."""
|
|
61
|
+
|
|
62
|
+
def executor(input_data: dict) -> dict[str, Any]:
|
|
63
|
+
handle = input_data.get("handle", "")
|
|
64
|
+
versions = input_data.get("versions", [])
|
|
65
|
+
if not handle or not versions:
|
|
66
|
+
return {"success": False, "error": "handle and versions required"}
|
|
67
|
+
return _execute_version_single(handle, versions)
|
|
68
|
+
|
|
69
|
+
def validator(result: dict, expected: dict) -> bool:
|
|
70
|
+
expected_len = expected.get("history_length")
|
|
71
|
+
if expected_len is not None:
|
|
72
|
+
return result.get("history_length") == expected_len
|
|
73
|
+
return result.get("success", False)
|
|
74
|
+
|
|
75
|
+
return ExampleRunnerMixin.run_examples(examples, executor, validator)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _execute_version_single(handle: str, versions: list) -> dict[str, Any]:
|
|
79
|
+
"""Execute a single versioning operation."""
|
|
80
|
+
from clm.layer1.protocols import get_store
|
|
81
|
+
|
|
82
|
+
collection = get_store(":memory:")
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
# Add first version
|
|
86
|
+
first_content = (
|
|
87
|
+
versions[0].get("content", "")
|
|
88
|
+
if isinstance(versions[0], dict)
|
|
89
|
+
else versions[0]
|
|
90
|
+
)
|
|
91
|
+
card = MCard(first_content)
|
|
92
|
+
collection.add_with_handle(card, handle)
|
|
93
|
+
|
|
94
|
+
# Apply subsequent updates
|
|
95
|
+
for version in versions[1:]:
|
|
96
|
+
content = (
|
|
97
|
+
version.get("content", "") if isinstance(version, dict) else version
|
|
98
|
+
)
|
|
99
|
+
new_card = MCard(content)
|
|
100
|
+
collection.update_handle(handle, new_card)
|
|
101
|
+
|
|
102
|
+
# Get final state
|
|
103
|
+
final_card = collection.get_by_handle(handle)
|
|
104
|
+
history = collection.get_handle_history(handle)
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
"success": True,
|
|
108
|
+
"handle": handle,
|
|
109
|
+
"final_hash": final_card.hash if final_card else None,
|
|
110
|
+
"final_content": (
|
|
111
|
+
final_card.get_content(as_text=True) if final_card else None
|
|
112
|
+
),
|
|
113
|
+
"history_length": len(history),
|
|
114
|
+
"history": history,
|
|
115
|
+
}
|
|
116
|
+
except (ValueError, TypeError, KeyError, AttributeError) as e:
|
|
117
|
+
return {"success": False, "error": str(e)}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
121
|
+
# Prune Helpers
|
|
122
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _run_prune_examples(examples: list) -> dict[str, Any]:
|
|
126
|
+
"""Run all pruning examples and return aggregated results."""
|
|
127
|
+
|
|
128
|
+
def executor(input_data: dict) -> dict[str, Any]:
|
|
129
|
+
handle = input_data.get("handle", "")
|
|
130
|
+
versions = input_data.get("versions", [])
|
|
131
|
+
prune_type = input_data.get("prune_type", "all")
|
|
132
|
+
older_than_seconds = input_data.get("older_than_seconds")
|
|
133
|
+
if not handle:
|
|
134
|
+
return {"success": False, "error": "handle is required"}
|
|
135
|
+
return _execute_prune_single(handle, versions, prune_type, older_than_seconds)
|
|
136
|
+
|
|
137
|
+
def validator(result: dict, expected: dict) -> bool:
|
|
138
|
+
expected_after = expected.get("history_after")
|
|
139
|
+
expected_deleted = expected.get("deleted")
|
|
140
|
+
if expected_after is not None:
|
|
141
|
+
return result.get("history_after") == expected_after
|
|
142
|
+
if expected_deleted is not None:
|
|
143
|
+
return result.get("deleted") == expected_deleted
|
|
144
|
+
return result.get("success", False)
|
|
145
|
+
|
|
146
|
+
return ExampleRunnerMixin.run_examples(examples, executor, validator)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _execute_prune_single(
|
|
150
|
+
handle: str, versions: list, prune_type: str, older_than_seconds
|
|
151
|
+
) -> dict[str, Any]:
|
|
152
|
+
"""Execute a single pruning operation."""
|
|
153
|
+
from clm.layer1.protocols import get_store
|
|
154
|
+
|
|
155
|
+
collection = get_store(":memory:")
|
|
156
|
+
|
|
157
|
+
try:
|
|
158
|
+
# Setup handle with versions if provided
|
|
159
|
+
if versions:
|
|
160
|
+
first_content = (
|
|
161
|
+
versions[0].get("content", "")
|
|
162
|
+
if isinstance(versions[0], dict)
|
|
163
|
+
else versions[0]
|
|
164
|
+
)
|
|
165
|
+
card = MCard(first_content)
|
|
166
|
+
collection.add_with_handle(card, handle)
|
|
167
|
+
|
|
168
|
+
for version in versions[1:]:
|
|
169
|
+
content = (
|
|
170
|
+
version.get("content", "") if isinstance(version, dict) else version
|
|
171
|
+
)
|
|
172
|
+
new_card = MCard(content)
|
|
173
|
+
collection.update_handle(handle, new_card)
|
|
174
|
+
|
|
175
|
+
history_before = len(collection.get_handle_history(handle))
|
|
176
|
+
deleted = 0
|
|
177
|
+
|
|
178
|
+
if prune_type == "all":
|
|
179
|
+
deleted = collection.prune_handle_history(handle, delete_all=True)
|
|
180
|
+
elif prune_type == "older_than" and older_than_seconds is not None:
|
|
181
|
+
from datetime import timedelta
|
|
182
|
+
|
|
183
|
+
deleted = collection.prune_handle_history(
|
|
184
|
+
handle, older_than=timedelta(seconds=older_than_seconds)
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
history_after = len(collection.get_handle_history(handle))
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
"success": True,
|
|
191
|
+
"handle": handle,
|
|
192
|
+
"history_before": history_before,
|
|
193
|
+
"deleted": deleted,
|
|
194
|
+
"history_after": history_after,
|
|
195
|
+
}
|
|
196
|
+
except (ValueError, TypeError, KeyError, AttributeError) as e:
|
|
197
|
+
return {"success": False, "error": str(e)}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import json
|
|
3
|
+
|
|
4
|
+
from clm.layer0.model.card import MCard
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def op_provision_genesis_eoa(impl: dict, target: MCard, ctx: dict) -> dict:
|
|
8
|
+
"""
|
|
9
|
+
Native PTR operation for Phase A.1 Genesis EOA Provisioning.
|
|
10
|
+
Generates an Ed25519 keypair, derives the W3C did:key, and stores the identity.
|
|
11
|
+
"""
|
|
12
|
+
import base58
|
|
13
|
+
from cryptography.hazmat.primitives import serialization
|
|
14
|
+
from cryptography.hazmat.primitives.asymmetric import ed25519
|
|
15
|
+
|
|
16
|
+
identities_db = ctx.get("identities_db")
|
|
17
|
+
log_db = ctx.get("log_db")
|
|
18
|
+
|
|
19
|
+
if not identities_db or not log_db:
|
|
20
|
+
raise ValueError("[BOOTSTRAP] Missing topological database in context.")
|
|
21
|
+
|
|
22
|
+
# T00.4: Idempotency Check (Tabula Rasa precondition)
|
|
23
|
+
if identities_db.count() > 0:
|
|
24
|
+
msg = "[BOOTSTRAP] Double bootstrap rejected: Tabula Rasa precondition violated (cardinality > 0)"
|
|
25
|
+
log_db.add(MCard(f"Execution Trace: Abort - {msg}"))
|
|
26
|
+
raise RuntimeError(msg)
|
|
27
|
+
|
|
28
|
+
# Generate Ed25519 Keypair
|
|
29
|
+
private_key = ed25519.Ed25519PrivateKey.generate()
|
|
30
|
+
public_key = private_key.public_key()
|
|
31
|
+
public_bytes = public_key.public_bytes(
|
|
32
|
+
encoding=serialization.Encoding.Raw, format=serialization.PublicFormat.Raw
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
# Derive W3C did:key (Multicodec prefix for Ed25519 is 0xed01)
|
|
36
|
+
multicodec_pubkey = b"\xed\x01" + public_bytes
|
|
37
|
+
did = "did:key:z" + base58.b58encode(multicodec_pubkey).decode("utf-8")
|
|
38
|
+
|
|
39
|
+
# Construct Genesis EOA
|
|
40
|
+
payload = {
|
|
41
|
+
"type": "identity/eoa",
|
|
42
|
+
"did": did,
|
|
43
|
+
"public_key": public_bytes.hex(),
|
|
44
|
+
"algorithm": "Ed25519",
|
|
45
|
+
"role": "genesis_founder",
|
|
46
|
+
"delegation_depth": 0,
|
|
47
|
+
"g_time": {
|
|
48
|
+
"algorithm": "SHA-256",
|
|
49
|
+
"timestamp": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
50
|
+
"locale": did,
|
|
51
|
+
},
|
|
52
|
+
"created_by": "self",
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
card = MCard(json.dumps(payload))
|
|
56
|
+
identities_db.add_with_handle(card, did)
|
|
57
|
+
|
|
58
|
+
log_message = f"Execution Trace: Provisioned Genesis EOA {did} | Hash: {card.hash}"
|
|
59
|
+
log_db.add(MCard(log_message))
|
|
60
|
+
|
|
61
|
+
print(f"[BOOTSTRAP] Provisioned Genesis EOA: {did}")
|
|
62
|
+
|
|
63
|
+
# Return output
|
|
64
|
+
return {
|
|
65
|
+
"status": "success",
|
|
66
|
+
"target_db": "agent_identities",
|
|
67
|
+
"card_hash": card.hash,
|
|
68
|
+
"did": did,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def op_provision_genesis_ca(impl: dict, target: MCard, ctx: dict) -> dict:
|
|
73
|
+
"""
|
|
74
|
+
Native PTR operation for Phase A.1 Genesis CA Provisioning.
|
|
75
|
+
Reads governance PCard content, derives CA DID, and stores the identity.
|
|
76
|
+
"""
|
|
77
|
+
identities_db = ctx.get("identities_db")
|
|
78
|
+
content_db = ctx.get("content_db")
|
|
79
|
+
log_db = ctx.get("log_db")
|
|
80
|
+
# Governance PCard is passed via the previous 'load_file' transition or injected
|
|
81
|
+
content = ctx.get("content", target.get_content(as_text=True) if target else "")
|
|
82
|
+
|
|
83
|
+
if not identities_db or not content_db or not log_db:
|
|
84
|
+
raise ValueError("[BOOTSTRAP] Missing topological database in context.")
|
|
85
|
+
|
|
86
|
+
if not content:
|
|
87
|
+
raise ValueError("[BOOTSTRAP] Missing Governance PCard content for CA binding.")
|
|
88
|
+
|
|
89
|
+
if isinstance(content, bytes):
|
|
90
|
+
content = content.decode("utf-8")
|
|
91
|
+
|
|
92
|
+
governance_card = MCard(content)
|
|
93
|
+
content_db.add(governance_card)
|
|
94
|
+
|
|
95
|
+
ca_did = f"did:pkc:ca:{governance_card.hash}"
|
|
96
|
+
|
|
97
|
+
# Fetch the EOA DID to attribute this CA
|
|
98
|
+
eoa_cards = identities_db.get_all_mcards_raw()
|
|
99
|
+
eoa_did = "unknown"
|
|
100
|
+
for c in eoa_cards:
|
|
101
|
+
parsed = (
|
|
102
|
+
json.loads(c.content.decode("utf-8"))
|
|
103
|
+
if isinstance(c.content, bytes)
|
|
104
|
+
else json.loads(c.content)
|
|
105
|
+
)
|
|
106
|
+
if parsed.get("type") == "identity/eoa":
|
|
107
|
+
eoa_did = parsed.get("did")
|
|
108
|
+
break
|
|
109
|
+
|
|
110
|
+
ca_payload = {
|
|
111
|
+
"type": "identity/ca",
|
|
112
|
+
"did": ca_did,
|
|
113
|
+
"bound_pcard_hash": governance_card.hash,
|
|
114
|
+
"algorithm": "Ed25519",
|
|
115
|
+
"role": "genesis_agency",
|
|
116
|
+
"authorized_by": eoa_did,
|
|
117
|
+
"g_time": {
|
|
118
|
+
"algorithm": "SHA-256",
|
|
119
|
+
"timestamp": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
|
120
|
+
"locale": eoa_did,
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
ca_card = MCard(json.dumps(ca_payload))
|
|
125
|
+
identities_db.add_with_handle(ca_card, ca_did)
|
|
126
|
+
|
|
127
|
+
log_message = (
|
|
128
|
+
f"Execution Trace: Provisioned Genesis CA {ca_did} | Hash: {ca_card.hash}"
|
|
129
|
+
)
|
|
130
|
+
log_db.add(MCard(log_message))
|
|
131
|
+
|
|
132
|
+
print(f"[BOOTSTRAP] Provisioned Genesis CA: {ca_did}")
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
"status": "success",
|
|
136
|
+
"target_db": "agent_identities",
|
|
137
|
+
"card_hash": ca_card.hash,
|
|
138
|
+
"did": ca_did,
|
|
139
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Baldwin Invert Operator (DEL-388-02).
|
|
2
|
+
|
|
3
|
+
Control Inversion Operator (^-1): f: A -> B => f⁻¹: B -> A.
|
|
4
|
+
Inverts arrows or operational sequences, promoting internal parameters
|
|
5
|
+
to first-class external coordinates via the Curry Adjunction,
|
|
6
|
+
preserving triadic syntactic closure.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import copy
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import yaml
|
|
14
|
+
|
|
15
|
+
from clm.layer0.model.card import MCard
|
|
16
|
+
from clm.layer1.operations.split import _parse_manifest, ensure_triadic_closure
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def op_invert(impl: dict[str, Any], target: MCard, ctx: dict[str, Any]) -> dict[str, Any]:
|
|
20
|
+
"""Execute the Baldwin Invert (^-1) operation.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
impl: Configuration dict for invert.
|
|
24
|
+
target: Target MCard to invert.
|
|
25
|
+
ctx: Execution context.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
Dict containing the inverted manifest, new MCard, and closure proof.
|
|
29
|
+
"""
|
|
30
|
+
manifest = _parse_manifest(target)
|
|
31
|
+
updated = copy.deepcopy(manifest)
|
|
32
|
+
|
|
33
|
+
# Invert abstract spec input/output interfaces if present
|
|
34
|
+
spec = updated.get("abstract_spec", {})
|
|
35
|
+
if isinstance(spec, dict):
|
|
36
|
+
inp = spec.get("input_type") or spec.get("domain")
|
|
37
|
+
outp = spec.get("output_type") or spec.get("codomain")
|
|
38
|
+
if inp and outp:
|
|
39
|
+
spec["input_type"] = outp
|
|
40
|
+
spec["output_type"] = inp
|
|
41
|
+
spec["inverted"] = True
|
|
42
|
+
|
|
43
|
+
# Invert concrete implementation steps or direction
|
|
44
|
+
c_impl = updated.get("concrete_impl", {})
|
|
45
|
+
if isinstance(c_impl, dict):
|
|
46
|
+
steps = c_impl.get("steps")
|
|
47
|
+
if isinstance(steps, list):
|
|
48
|
+
c_impl["steps"] = list(reversed(steps))
|
|
49
|
+
c_impl["direction"] = "inverse"
|
|
50
|
+
|
|
51
|
+
final_manifest = ensure_triadic_closure(updated)
|
|
52
|
+
yaml_content = yaml.dump(final_manifest, default_flow_style=False)
|
|
53
|
+
new_card = MCard(yaml_content)
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
"success": True,
|
|
57
|
+
"operator": "invert",
|
|
58
|
+
"syntactic_closure": True,
|
|
59
|
+
"manifest": final_manifest,
|
|
60
|
+
"hash": new_card.hash,
|
|
61
|
+
"content": yaml_content,
|
|
62
|
+
"mcard": new_card,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
__all__ = ["op_invert"]
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""
|
|
2
|
+
File loader operation for ingesting files into CardCollection.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from clm.layer0.model.card import MCard
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def op_loader(impl: dict, target: MCard, ctx: dict) -> Any:
|
|
13
|
+
"""Built-in loader operation using mcard.loader.
|
|
14
|
+
|
|
15
|
+
Loads files from a directory into a CardCollection.
|
|
16
|
+
|
|
17
|
+
Context params:
|
|
18
|
+
source_dir: Directory path to load files from
|
|
19
|
+
db_path: Database path for storage
|
|
20
|
+
recursive: Whether to recursively scan directories (default: True)
|
|
21
|
+
include_problematic: Whether to include problematic files (default: False)
|
|
22
|
+
"""
|
|
23
|
+
from clm.layer1.protocols import get_file_loader, get_store
|
|
24
|
+
|
|
25
|
+
load_file_to_collection = get_file_loader()
|
|
26
|
+
if load_file_to_collection is None:
|
|
27
|
+
raise RuntimeError(
|
|
28
|
+
"No file loader registered with Layer 1 protocols. "
|
|
29
|
+
"Layer 4 must register load_file_to_collection."
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Extract parameters from context (merged balanced + test context)
|
|
33
|
+
params = ctx.get("params", {})
|
|
34
|
+
bal = ctx.get("balanced", {})
|
|
35
|
+
|
|
36
|
+
# Get input/output args from balanced or context
|
|
37
|
+
input_args = {**bal.get("input_arguments", {}), **ctx.get("input_arguments", {})}
|
|
38
|
+
output_args = {**bal.get("output_arguments", {}), **ctx.get("output_arguments", {})}
|
|
39
|
+
|
|
40
|
+
# Merge all parameter sources
|
|
41
|
+
all_params = {**input_args, **output_args, **params}
|
|
42
|
+
|
|
43
|
+
source_dir = all_params.get("source_dir", "test_data")
|
|
44
|
+
db_path = all_params.get("db_path", "data/ingestion/loader.db")
|
|
45
|
+
recursive = all_params.get("recursive", True)
|
|
46
|
+
include_problematic = all_params.get("include_problematic", False)
|
|
47
|
+
|
|
48
|
+
# Resolve source_dir relative to project root if needed
|
|
49
|
+
source_path = Path(source_dir)
|
|
50
|
+
if not source_path.exists():
|
|
51
|
+
cwd = Path(os.getcwd())
|
|
52
|
+
source_path = cwd / source_dir
|
|
53
|
+
if not source_path.exists():
|
|
54
|
+
return {
|
|
55
|
+
"success": False,
|
|
56
|
+
"error": f"Source directory not found: {source_dir}",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Ensure db directory exists
|
|
60
|
+
db_file = Path(db_path)
|
|
61
|
+
db_file.parent.mkdir(parents=True, exist_ok=True)
|
|
62
|
+
|
|
63
|
+
# Clean slate - remove existing db and any SQLite auxiliary files
|
|
64
|
+
for suffix in ["", "-wal", "-shm", "-journal"]:
|
|
65
|
+
f = db_file.with_name(db_file.name + suffix)
|
|
66
|
+
if f.exists():
|
|
67
|
+
try:
|
|
68
|
+
os.remove(f)
|
|
69
|
+
except OSError:
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
# Initialize collection
|
|
74
|
+
collection = get_store(str(db_path))
|
|
75
|
+
|
|
76
|
+
# Load files using built-in loader
|
|
77
|
+
t0 = time.time()
|
|
78
|
+
loader_response = load_file_to_collection(
|
|
79
|
+
source_path,
|
|
80
|
+
collection,
|
|
81
|
+
recursive=recursive,
|
|
82
|
+
include_problematic=include_problematic,
|
|
83
|
+
)
|
|
84
|
+
load_time = time.time() - t0
|
|
85
|
+
|
|
86
|
+
# Unpack response
|
|
87
|
+
if isinstance(loader_response, dict) and "results" in loader_response:
|
|
88
|
+
results = loader_response["results"]
|
|
89
|
+
metrics = loader_response.get("metrics", {})
|
|
90
|
+
else:
|
|
91
|
+
results = loader_response
|
|
92
|
+
metrics = {"files_count": len(results)}
|
|
93
|
+
|
|
94
|
+
# Calculate metrics
|
|
95
|
+
total_size = sum(r.get("size", 0) for r in results)
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
"success": True,
|
|
99
|
+
"metrics": {
|
|
100
|
+
"total_files": metrics.get("files_count", len(results)),
|
|
101
|
+
"total_directories": metrics.get("directories_count", 0),
|
|
102
|
+
"directory_levels": metrics.get("directory_levels", 0),
|
|
103
|
+
"total_size_bytes": total_size,
|
|
104
|
+
"duration_ms": round(load_time * 1000, 2),
|
|
105
|
+
},
|
|
106
|
+
"files": [
|
|
107
|
+
{
|
|
108
|
+
"hash": r.get("hash", "")[:8],
|
|
109
|
+
"filename": r.get("filename", ""),
|
|
110
|
+
"content_type": r.get("content_type", ""),
|
|
111
|
+
}
|
|
112
|
+
for r in results[:10]
|
|
113
|
+
], # Return first 10 for preview
|
|
114
|
+
}
|
|
115
|
+
except (OSError, ValueError, TypeError, KeyError) as e:
|
|
116
|
+
return {"success": False, "error": str(e)}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Multi-Modal Baldwin Modularity Manipulators (Sprint 393 / DEL-393-02).
|
|
2
|
+
|
|
3
|
+
Exports domain-aware algebraic manipulators across four modalities:
|
|
4
|
+
- Tabular (CSV, Parquet, dataframes)
|
|
5
|
+
- Document (Markdown, structured text)
|
|
6
|
+
- Structured (JSON, YAML)
|
|
7
|
+
- Media (images, audio, binary assets)
|
|
8
|
+
|
|
9
|
+
All manipulators adhere to the Six Baldwin Modularity Operators:
|
|
10
|
+
split, substitute, augment, exclude, invert, port.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from .document import DocumentManipulator
|
|
14
|
+
from .media import MediaManipulator
|
|
15
|
+
from .structured import StructuredManipulator
|
|
16
|
+
from .tabular import TabularManipulator
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"TabularManipulator",
|
|
20
|
+
"DocumentManipulator",
|
|
21
|
+
"StructuredManipulator",
|
|
22
|
+
"MediaManipulator",
|
|
23
|
+
]
|