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,348 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Layer 1: Identity-First Zeroth Guard (DV-373-02).
|
|
3
|
+
|
|
4
|
+
Enforces the Agentic Closure Theorem and Type Lattice root constraint:
|
|
5
|
+
No action can occur in the CLM without verified cryptographic authorship.
|
|
6
|
+
Every transition enforces a zeroth guard: V_identity = verifyIdentity(AgentDid).
|
|
7
|
+
|
|
8
|
+
Supports:
|
|
9
|
+
- EOA: Externally Owned Agent (Ed25519 DID key, e.g. did:key:z6M...)
|
|
10
|
+
- CA: Contract Account / Multi-Sig (e.g. did:pkc:ca:..., did:clm:...)
|
|
11
|
+
- Genesis Agent DID: did:key:z6MkhaXgBZDvotDkL5257faiz48Z8x28xhr554x4tp4MaEBx
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import re
|
|
18
|
+
import time
|
|
19
|
+
import uuid
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from typing import Any, Literal
|
|
22
|
+
|
|
23
|
+
import yaml
|
|
24
|
+
|
|
25
|
+
from clm.layer1.arrow_compiler import VCardGuard
|
|
26
|
+
|
|
27
|
+
GENESIS_AGENT_DID = "did:key:z6MkhaXgBZDvotDkL5257faiz48Z8x28xhr554x4tp4MaEBx"
|
|
28
|
+
|
|
29
|
+
# Regular expressions for valid DIDs
|
|
30
|
+
# W3C did:key with base58btc Multicodec ed25519-pub (starts with z6M)
|
|
31
|
+
_EOA_DID_REGEX = re.compile(r"^did:key:z6M[1-9A-HJ-NP-Za-km-z]{40,60}$")
|
|
32
|
+
_CA_DID_REGEX = re.compile(r"^did:(pkc:ca|clm):[a-zA-Z0-9_\-\.:]+$")
|
|
33
|
+
|
|
34
|
+
AgentClass = Literal["EOA", "CA", "UNKNOWN"]
|
|
35
|
+
AgentType = Literal["eoa", "ca"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def classify_agent_did(did: str) -> AgentClass:
|
|
39
|
+
"""Classifies a DID as an Externally Owned Agent (EOA) or Contract Account (CA)."""
|
|
40
|
+
if not did or not isinstance(did, str):
|
|
41
|
+
return "UNKNOWN"
|
|
42
|
+
if did == GENESIS_AGENT_DID or _EOA_DID_REGEX.match(did):
|
|
43
|
+
return "EOA"
|
|
44
|
+
if _CA_DID_REGEX.match(did) or did.startswith("did:pkc:ca:") or did.startswith("did:clm:"):
|
|
45
|
+
return "CA"
|
|
46
|
+
return "UNKNOWN"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def verify_identity(did: str | None) -> bool:
|
|
50
|
+
"""Verifies that a DID is cryptographically valid and authorizable."""
|
|
51
|
+
if not did:
|
|
52
|
+
return False
|
|
53
|
+
agent_class = classify_agent_did(did)
|
|
54
|
+
return agent_class in ("EOA", "CA")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class IdentityVerificationError(Exception):
|
|
58
|
+
"""Raised when an identity zeroth guard fails (T ∧ V_identity = ⊥)."""
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def assert_identity_gate(did: str | None) -> None:
|
|
63
|
+
"""Enforces the zeroth guard.
|
|
64
|
+
|
|
65
|
+
Raises IdentityVerificationError if did is missing or invalid.
|
|
66
|
+
"""
|
|
67
|
+
if not verify_identity(did):
|
|
68
|
+
raise IdentityVerificationError(
|
|
69
|
+
f"V_identity check failed: DID '{did}' is not a valid EOA or CA authorization (T ∧ V_identity = ⊥)"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def create_identity_zeroth_guard(agent_did: str | None = None) -> VCardGuard:
|
|
74
|
+
"""Returns a VCardGuard checking the Zeroth Identity condition."""
|
|
75
|
+
target_did = agent_did or GENESIS_AGENT_DID
|
|
76
|
+
return VCardGuard(
|
|
77
|
+
name="V_identity_zeroth_guard",
|
|
78
|
+
predicate=lambda _: verify_identity(target_did),
|
|
79
|
+
error_message=f"Zeroth guard failed for DID '{target_did}'",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
84
|
+
# W3C Agent Identity Schemas (EOA & CA Duality)
|
|
85
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class VerificationMethod:
|
|
90
|
+
"""W3C standard verification method for declaring public keys."""
|
|
91
|
+
|
|
92
|
+
id: str
|
|
93
|
+
type: str
|
|
94
|
+
controller: str
|
|
95
|
+
publicKeyBase58: str
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@dataclass
|
|
99
|
+
class AgentIdentity:
|
|
100
|
+
"""Base class for all Agents in the system."""
|
|
101
|
+
|
|
102
|
+
did: str
|
|
103
|
+
agent_type: AgentType
|
|
104
|
+
|
|
105
|
+
def to_dict(self) -> dict[str, Any]:
|
|
106
|
+
raise NotImplementedError("Subclasses must implement to_dict")
|
|
107
|
+
|
|
108
|
+
def to_yaml(self) -> str:
|
|
109
|
+
return yaml.safe_dump(self.to_dict(), default_flow_style=False)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@dataclass
|
|
113
|
+
class EOAAgent(AgentIdentity):
|
|
114
|
+
"""Externally Owned Agent (EOA)."""
|
|
115
|
+
|
|
116
|
+
agent_type: Literal["eoa"] = "eoa"
|
|
117
|
+
verification_methods: list[VerificationMethod] = field(default_factory=list)
|
|
118
|
+
|
|
119
|
+
def validate(self) -> None:
|
|
120
|
+
if not self.did.startswith("did:pkc:eoa:") and not self.did.startswith("did:key:"):
|
|
121
|
+
raise ValueError(f"EOA Data Schema Violation: Invalid EOA DID structure: {self.did}")
|
|
122
|
+
if len(self.verification_methods) == 0:
|
|
123
|
+
raise ValueError("EOA Data Schema Violation: At least one VerificationMethod is required for an EOA.")
|
|
124
|
+
|
|
125
|
+
def to_dict(self) -> dict[str, Any]:
|
|
126
|
+
return {
|
|
127
|
+
"did": self.did,
|
|
128
|
+
"agent_type": self.agent_type,
|
|
129
|
+
"verification_methods": [
|
|
130
|
+
{
|
|
131
|
+
"id": p.id,
|
|
132
|
+
"type": p.type,
|
|
133
|
+
"controller": p.controller,
|
|
134
|
+
"publicKeyBase58": p.publicKeyBase58,
|
|
135
|
+
}
|
|
136
|
+
for p in self.verification_methods
|
|
137
|
+
],
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@dataclass
|
|
142
|
+
class ContractAgent(AgentIdentity):
|
|
143
|
+
"""Contract Agent (CA)."""
|
|
144
|
+
|
|
145
|
+
agent_type: Literal["ca"] = "ca"
|
|
146
|
+
bound_clm_hash: str | None = None
|
|
147
|
+
controller_did: str | None = None
|
|
148
|
+
|
|
149
|
+
def validate(self) -> None:
|
|
150
|
+
if not self.did.startswith("did:pkc:ca:") and not self.did.startswith("did:clm:"):
|
|
151
|
+
raise ValueError(f"CA Data Schema Violation: Invalid CA DID structure: {self.did}")
|
|
152
|
+
if not self.bound_clm_hash:
|
|
153
|
+
raise ValueError("CA Data Schema Violation: ContractAgent MUST have a bound_clm_hash")
|
|
154
|
+
|
|
155
|
+
def to_dict(self) -> dict[str, Any]:
|
|
156
|
+
return {
|
|
157
|
+
"did": self.did,
|
|
158
|
+
"agent_type": self.agent_type,
|
|
159
|
+
"bound_clm_hash": self.bound_clm_hash,
|
|
160
|
+
"controller_did": self.controller_did,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def parse_identity(data_dict: dict[str, Any]) -> AgentIdentity:
|
|
165
|
+
"""Parses a dictionary into typed EOA or CA schemas."""
|
|
166
|
+
agent_type = data_dict.get("agent_type")
|
|
167
|
+
if agent_type == "eoa":
|
|
168
|
+
methods = data_dict.get("verification_methods", [])
|
|
169
|
+
v_methods = [
|
|
170
|
+
VerificationMethod(
|
|
171
|
+
id=m["id"],
|
|
172
|
+
type=m["type"],
|
|
173
|
+
controller=m["controller"],
|
|
174
|
+
publicKeyBase58=m["publicKeyBase58"],
|
|
175
|
+
)
|
|
176
|
+
for m in methods
|
|
177
|
+
]
|
|
178
|
+
agent = EOAAgent(did=data_dict["did"], verification_methods=v_methods)
|
|
179
|
+
agent.validate()
|
|
180
|
+
return agent
|
|
181
|
+
elif agent_type == "ca":
|
|
182
|
+
agent = ContractAgent(
|
|
183
|
+
did=data_dict["did"],
|
|
184
|
+
bound_clm_hash=data_dict.get("bound_clm_hash"),
|
|
185
|
+
controller_did=data_dict.get("controller_did"),
|
|
186
|
+
)
|
|
187
|
+
agent.validate()
|
|
188
|
+
return agent
|
|
189
|
+
raise ValueError(f"Unknown agent type mapping: {agent_type}")
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
193
|
+
# PCard Identity State Machine & Lineage
|
|
194
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@dataclass
|
|
198
|
+
class PCardState:
|
|
199
|
+
"""State of a PCard Identity at a specific point in time."""
|
|
200
|
+
|
|
201
|
+
version: int
|
|
202
|
+
head: str
|
|
203
|
+
previous: str | None = None
|
|
204
|
+
timestamp: float = field(default_factory=time.time)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass
|
|
208
|
+
class PCardContract:
|
|
209
|
+
"""Contract rules governing the PCard's evolution."""
|
|
210
|
+
|
|
211
|
+
upgradability: str = "uups"
|
|
212
|
+
rules: list[str] = field(default_factory=list)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@dataclass
|
|
216
|
+
class PCardMetadata:
|
|
217
|
+
"""Metadata for the PCard Identity."""
|
|
218
|
+
|
|
219
|
+
id: str
|
|
220
|
+
owner: str
|
|
221
|
+
created_at: float = field(default_factory=time.time)
|
|
222
|
+
description: str | None = None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class PCardIdentity:
|
|
226
|
+
"""Represents the persistent evolutionary identity of a Cubical Logic Model."""
|
|
227
|
+
|
|
228
|
+
def __init__(
|
|
229
|
+
self, metadata: PCardMetadata, state: PCardState, contract: PCardContract
|
|
230
|
+
) -> None:
|
|
231
|
+
self.metadata = metadata
|
|
232
|
+
self.state = state
|
|
233
|
+
self.contract = contract
|
|
234
|
+
self.logger = logging.getLogger(__name__)
|
|
235
|
+
|
|
236
|
+
@classmethod
|
|
237
|
+
def create_genesis(
|
|
238
|
+
cls,
|
|
239
|
+
snapshot_hash: str,
|
|
240
|
+
owner: str,
|
|
241
|
+
pcard_id: str | None = None,
|
|
242
|
+
description: str | None = None,
|
|
243
|
+
) -> "PCardIdentity":
|
|
244
|
+
pcard_id = pcard_id or str(uuid.uuid4())
|
|
245
|
+
metadata = PCardMetadata(id=pcard_id, owner=owner, description=description)
|
|
246
|
+
state = PCardState(version=1, head=snapshot_hash, previous=None)
|
|
247
|
+
contract = PCardContract()
|
|
248
|
+
return cls(metadata, state, contract)
|
|
249
|
+
|
|
250
|
+
def upgrade(self, new_snapshot_hash: str) -> None:
|
|
251
|
+
new_state = PCardState(
|
|
252
|
+
version=self.state.version + 1,
|
|
253
|
+
head=new_snapshot_hash,
|
|
254
|
+
previous=self.state.head,
|
|
255
|
+
)
|
|
256
|
+
self.state = new_state
|
|
257
|
+
self.logger.info(
|
|
258
|
+
f"PCard {self.metadata.id} upgraded to version {self.state.version}"
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
def fork(self, owner: str, description: str | None = None) -> "PCardIdentity":
|
|
262
|
+
new_id = str(uuid.uuid4())
|
|
263
|
+
metadata = PCardMetadata(
|
|
264
|
+
id=new_id,
|
|
265
|
+
owner=owner,
|
|
266
|
+
description=description or f"Fork of {self.metadata.id}",
|
|
267
|
+
)
|
|
268
|
+
state = PCardState(
|
|
269
|
+
version=1,
|
|
270
|
+
head=self.state.head,
|
|
271
|
+
previous=None,
|
|
272
|
+
)
|
|
273
|
+
contract = PCardContract()
|
|
274
|
+
self.logger.info(f"PCard {self.metadata.id} forked to {new_id}")
|
|
275
|
+
return PCardIdentity(metadata, state, contract)
|
|
276
|
+
|
|
277
|
+
def to_dict(self) -> dict[str, Any]:
|
|
278
|
+
return {
|
|
279
|
+
"type": "PCard",
|
|
280
|
+
"metadata": {
|
|
281
|
+
"id": self.metadata.id,
|
|
282
|
+
"owner": self.metadata.owner,
|
|
283
|
+
"created_at": self.metadata.created_at,
|
|
284
|
+
"description": self.metadata.description,
|
|
285
|
+
},
|
|
286
|
+
"state": {
|
|
287
|
+
"version": self.state.version,
|
|
288
|
+
"head": self.state.head,
|
|
289
|
+
"previous": self.state.previous,
|
|
290
|
+
"timestamp": self.state.timestamp,
|
|
291
|
+
},
|
|
292
|
+
"contract": {
|
|
293
|
+
"upgradability": self.contract.upgradability,
|
|
294
|
+
"rules": self.contract.rules,
|
|
295
|
+
},
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
def to_yaml(self) -> str:
|
|
299
|
+
return yaml.safe_dump(self.to_dict(), default_flow_style=False)
|
|
300
|
+
|
|
301
|
+
@classmethod
|
|
302
|
+
def from_yaml(cls, yaml_content: str) -> "PCardIdentity":
|
|
303
|
+
data = yaml.safe_load(yaml_content)
|
|
304
|
+
if data.get("type") != "PCard":
|
|
305
|
+
raise ValueError("Invalid YAML: type must be 'PCard'")
|
|
306
|
+
|
|
307
|
+
metadata_data = data.get("metadata", {})
|
|
308
|
+
metadata = PCardMetadata(
|
|
309
|
+
id=metadata_data.get("id"),
|
|
310
|
+
owner=metadata_data.get("owner"),
|
|
311
|
+
created_at=metadata_data.get("created_at", time.time()),
|
|
312
|
+
description=metadata_data.get("description"),
|
|
313
|
+
)
|
|
314
|
+
state_data = data.get("state", {})
|
|
315
|
+
state = PCardState(
|
|
316
|
+
version=state_data.get("version"),
|
|
317
|
+
head=state_data.get("head"),
|
|
318
|
+
previous=state_data.get("previous"),
|
|
319
|
+
timestamp=state_data.get("timestamp", time.time()),
|
|
320
|
+
)
|
|
321
|
+
contract_data = data.get("contract", {})
|
|
322
|
+
contract = PCardContract(
|
|
323
|
+
upgradability=contract_data.get("upgradability", "uups"),
|
|
324
|
+
rules=contract_data.get("rules", []),
|
|
325
|
+
)
|
|
326
|
+
return cls(metadata, state, contract)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
__all__ = [
|
|
330
|
+
"GENESIS_AGENT_DID",
|
|
331
|
+
"AgentClass",
|
|
332
|
+
"AgentType",
|
|
333
|
+
"classify_agent_did",
|
|
334
|
+
"verify_identity",
|
|
335
|
+
"IdentityVerificationError",
|
|
336
|
+
"assert_identity_gate",
|
|
337
|
+
"create_identity_zeroth_guard",
|
|
338
|
+
"VerificationMethod",
|
|
339
|
+
"AgentIdentity",
|
|
340
|
+
"EOAAgent",
|
|
341
|
+
"ContractAgent",
|
|
342
|
+
"parse_identity",
|
|
343
|
+
"PCardState",
|
|
344
|
+
"PCardContract",
|
|
345
|
+
"PCardMetadata",
|
|
346
|
+
"PCardIdentity",
|
|
347
|
+
]
|
|
348
|
+
|
clm/layer1/matrix.py
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""Layer 1: Integer Incidence Matrix & P-Invariant Nullspace Analysis.
|
|
2
|
+
|
|
3
|
+
Canonical Path: kernel/scripts/clm/layer1/matrix.py
|
|
4
|
+
Parity: Rust `src/layer1/matrix.rs`, TypeScript `src/layer1/matrix.ts`
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from clm.layer0.math_utils import math_gcd, math_lcm, solve_nullspace
|
|
13
|
+
from clm.layer0.types import PolynomialTerm, PrimeHash
|
|
14
|
+
from clm.layer1.sparse_net import PrecomputedInvariants, SparseIncidenceMatrix
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"math_gcd",
|
|
18
|
+
"math_lcm",
|
|
19
|
+
"solve_nullspace",
|
|
20
|
+
"IncidenceMatrix",
|
|
21
|
+
"PolynomialStructure",
|
|
22
|
+
"SparseIncidenceMatrix",
|
|
23
|
+
"PrecomputedInvariants",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class IncidenceMatrix:
|
|
29
|
+
"""Integer Incidence Matrix D = D^+ - D^- for a Petri Net topology."""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
places: list[str],
|
|
34
|
+
transitions: list[str],
|
|
35
|
+
d_minus: list[list[int]],
|
|
36
|
+
d_plus: list[list[int]],
|
|
37
|
+
d: list[list[int]],
|
|
38
|
+
) -> None:
|
|
39
|
+
self.places = places
|
|
40
|
+
self.transitions = transitions
|
|
41
|
+
self.d_minus = d_minus
|
|
42
|
+
self.d_plus = d_plus
|
|
43
|
+
self.d = d
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def from_topology(cls, topo: dict[str, Any]) -> IncidenceMatrix:
|
|
47
|
+
"""Constructs an IncidenceMatrix from a Petri net topology definition."""
|
|
48
|
+
places = [p["id"] for p in topo.get("places", [])]
|
|
49
|
+
transitions = [t["id"] for t in topo.get("transitions", [])]
|
|
50
|
+
|
|
51
|
+
place_to_idx = {pid: i for i, pid in enumerate(places)}
|
|
52
|
+
|
|
53
|
+
num_p = len(places)
|
|
54
|
+
num_t = len(transitions)
|
|
55
|
+
|
|
56
|
+
d_minus = [[0] * num_t for _ in range(num_p)]
|
|
57
|
+
d_plus = [[0] * num_t for _ in range(num_p)]
|
|
58
|
+
|
|
59
|
+
for j, t in enumerate(topo.get("transitions", [])):
|
|
60
|
+
for inp in t.get("inputs", []):
|
|
61
|
+
if inp in place_to_idx:
|
|
62
|
+
d_minus[place_to_idx[inp]][j] += 1
|
|
63
|
+
for outp in t.get("outputs", []):
|
|
64
|
+
if outp in place_to_idx:
|
|
65
|
+
d_plus[place_to_idx[outp]][j] += 1
|
|
66
|
+
|
|
67
|
+
d = [[0] * num_t for _ in range(num_p)]
|
|
68
|
+
for r in range(num_p):
|
|
69
|
+
for c in range(num_t):
|
|
70
|
+
d[r][c] = d_plus[r][c] - d_minus[r][c]
|
|
71
|
+
|
|
72
|
+
return cls(places, transitions, d_minus, d_plus, d)
|
|
73
|
+
|
|
74
|
+
def p_invariants(self) -> list[list[int]]:
|
|
75
|
+
"""Solves x^T * D = 0^T for the rational/integer P-invariant basis."""
|
|
76
|
+
return solve_nullspace(self.d, len(self.places), len(self.transitions), transpose=True)
|
|
77
|
+
|
|
78
|
+
def verify_invariant(self, weights: list[int]) -> bool:
|
|
79
|
+
"""Verifies if a weight vector x satisfies x^T * D = 0^T."""
|
|
80
|
+
if len(weights) != len(self.places):
|
|
81
|
+
return False
|
|
82
|
+
for t in range(len(self.transitions)):
|
|
83
|
+
s = sum(weights[p] * self.d[p][t] for p in range(len(self.places)))
|
|
84
|
+
if s != 0:
|
|
85
|
+
return False
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclass
|
|
90
|
+
class PolynomialStructure:
|
|
91
|
+
"""Represents the polynomial structure of a PCard (Layer 1).
|
|
92
|
+
|
|
93
|
+
F(X) = Sum(A_i * X^{B_i}) + C
|
|
94
|
+
|
|
95
|
+
Where:
|
|
96
|
+
- A_i: Abstract Specifications (Coefficients)
|
|
97
|
+
- B_i: Balanced Expectations (Exponents)
|
|
98
|
+
- C: Concrete Implementation (Constant/Base)
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
terms: list[PolynomialTerm] = field(default_factory=list)
|
|
102
|
+
constant: PrimeHash | None = None
|
|
103
|
+
|
|
104
|
+
def add_term(self, abstract_hash: str, balanced_hash: str) -> None:
|
|
105
|
+
"""Add a term (A * X^B) to the polynomial."""
|
|
106
|
+
self.terms.append(
|
|
107
|
+
PolynomialTerm(
|
|
108
|
+
coefficient=PrimeHash(abstract_hash),
|
|
109
|
+
exponent=PrimeHash(balanced_hash),
|
|
110
|
+
)
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def set_constant(self, concrete_hash: str) -> None:
|
|
114
|
+
"""Set the constant term (C) - the Concrete Implementation."""
|
|
115
|
+
self.constant = PrimeHash(concrete_hash)
|
|
116
|
+
|
|
117
|
+
def compose(self, other: "PolynomialStructure") -> "PolynomialStructure":
|
|
118
|
+
"""Compose this polynomial with another: (F * G)(X)."""
|
|
119
|
+
new_poly = PolynomialStructure()
|
|
120
|
+
new_poly.terms.extend(self.terms)
|
|
121
|
+
new_poly.terms.extend(other.terms)
|
|
122
|
+
new_poly.constant = other.constant or self.constant
|
|
123
|
+
return new_poly
|
|
124
|
+
|
|
125
|
+
def to_dict(self) -> dict[str, Any]:
|
|
126
|
+
"""Convert to dictionary representation."""
|
|
127
|
+
return {
|
|
128
|
+
"terms": [
|
|
129
|
+
{
|
|
130
|
+
"coefficient": str(t.coefficient),
|
|
131
|
+
"exponent": str(t.exponent),
|
|
132
|
+
"weight": t.weight,
|
|
133
|
+
}
|
|
134
|
+
for t in self.terms
|
|
135
|
+
],
|
|
136
|
+
"constant": str(self.constant) if self.constant else None,
|
|
137
|
+
}
|
|
138
|
+
|