clm-kernel 0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. clm/__init__.py +230 -0
  2. clm/__main__.py +25 -0
  3. clm/cross_cutting/__init__.py +50 -0
  4. clm/cross_cutting/_test_runner.py +36 -0
  5. clm/cross_cutting/async_utils.py +25 -0
  6. clm/cross_cutting/cel_builder.py +123 -0
  7. clm/cross_cutting/cel_converter.py +697 -0
  8. clm/cross_cutting/cel_engine.py +252 -0
  9. clm/cross_cutting/cel_ops.py +72 -0
  10. clm/cross_cutting/cel_ops_db.py +157 -0
  11. clm/cross_cutting/cel_ops_files.py +99 -0
  12. clm/cross_cutting/cel_ops_state.py +71 -0
  13. clm/cross_cutting/cel_ops_strings.py +64 -0
  14. clm/cross_cutting/cel_resolver.py +63 -0
  15. clm/cross_cutting/cel_slices.py +56 -0
  16. clm/cross_cutting/cel_store.py +330 -0
  17. clm/cross_cutting/clm_logger.py +140 -0
  18. clm/cross_cutting/config/__init__.py +155 -0
  19. clm/cross_cutting/config/config_constants.py +392 -0
  20. clm/cross_cutting/config/env_parameters.py +90 -0
  21. clm/cross_cutting/config/logging.py +378 -0
  22. clm/cross_cutting/config/settings.py +504 -0
  23. clm/cross_cutting/context.py +5 -0
  24. clm/cross_cutting/domain_models.py +55 -0
  25. clm/cross_cutting/domain_types.py +61 -0
  26. clm/cross_cutting/effects.py +67 -0
  27. clm/cross_cutting/errors.py +153 -0
  28. clm/cross_cutting/governance.py +331 -0
  29. clm/cross_cutting/guards.py +41 -0
  30. clm/cross_cutting/mcard.py +321 -0
  31. clm/cross_cutting/native.py +185 -0
  32. clm/cross_cutting/observability.py +289 -0
  33. clm/cross_cutting/pcard.py +434 -0
  34. clm/cross_cutting/registry.py +71 -0
  35. clm/cross_cutting/resources.py +84 -0
  36. clm/cross_cutting/secrets.py +44 -0
  37. clm/cross_cutting/subprocess_utils.py +118 -0
  38. clm/cross_cutting/telemetry.py +164 -0
  39. clm/cross_cutting/testing/__init__.py +8 -0
  40. clm/cross_cutting/testing/comparator.py +187 -0
  41. clm/cross_cutting/testing/datasets.py +87 -0
  42. clm/cross_cutting/timeutil.py +20 -0
  43. clm/cross_cutting/types/new_type_check.py +0 -0
  44. clm/cross_cutting/utils/__init__.py +1 -0
  45. clm/cross_cutting/utils/url_safety.py +50 -0
  46. clm/cross_cutting/vcard.py +560 -0
  47. clm/cross_cutting/writer.py +118 -0
  48. clm/layer0/README.md +50 -0
  49. clm/layer0/__init__.py +223 -0
  50. clm/layer0/algebra.py +60 -0
  51. clm/layer0/algebra_baldwin.py +133 -0
  52. clm/layer0/algebra_baldwin_generators.py +36 -0
  53. clm/layer0/algebra_equivalence.py +262 -0
  54. clm/layer0/algebra_ingest.py +306 -0
  55. clm/layer0/algebra_manifest_io.py +156 -0
  56. clm/layer0/assembler.py +481 -0
  57. clm/layer0/cel/__init__.py +23 -0
  58. clm/layer0/cel_eval.py +491 -0
  59. clm/layer0/codec.py +106 -0
  60. clm/layer0/context.py +122 -0
  61. clm/layer0/db.py +160 -0
  62. clm/layer0/exceptions.py +73 -0
  63. clm/layer0/fibration.py +106 -0
  64. clm/layer0/gates.py +50 -0
  65. clm/layer0/hash.py +80 -0
  66. clm/layer0/loader.py +826 -0
  67. clm/layer0/math_utils.py +163 -0
  68. clm/layer0/mcard.py +96 -0
  69. clm/layer0/model/__init__.py +0 -0
  70. clm/layer0/model/action.py +223 -0
  71. clm/layer0/model/card.py +280 -0
  72. clm/layer0/model/card_triad.py +427 -0
  73. clm/layer0/model/compatibility.py +60 -0
  74. clm/layer0/model/dictionary.py +46 -0
  75. clm/layer0/model/dots.py +331 -0
  76. clm/layer0/model/event_producer.py +88 -0
  77. clm/layer0/model/g_time.py +89 -0
  78. clm/layer0/model/handle.py +163 -0
  79. clm/layer0/model/hash/__init__.py +6 -0
  80. clm/layer0/model/hash/algorithms/__init__.py +3 -0
  81. clm/layer0/model/hash/algorithms/custom_hash.py +7 -0
  82. clm/layer0/model/hash/algorithms/local_sha256.py +178 -0
  83. clm/layer0/model/hash/constants.py +53 -0
  84. clm/layer0/model/hash/enums.py +60 -0
  85. clm/layer0/model/hash/validator.py +307 -0
  86. clm/layer0/model/interpreter.py +275 -0
  87. clm/layer0/model/pagination.py +45 -0
  88. clm/layer0/model/pcard.py +716 -0
  89. clm/layer0/model/schema.py +44 -0
  90. clm/layer0/model/utils/__init__.py +1 -0
  91. clm/layer0/model/utils/content_analyzer.py +152 -0
  92. clm/layer0/model/validators/__init__.py +1 -0
  93. clm/layer0/model/validators/base_validator.py +44 -0
  94. clm/layer0/model/validators/binary_validator.py +66 -0
  95. clm/layer0/model/validators/text_validator.py +82 -0
  96. clm/layer0/model/validators/validation_registry.py +49 -0
  97. clm/layer0/model/vcard.py +823 -0
  98. clm/layer0/model/vcard_ext/__init__.py +39 -0
  99. clm/layer0/model/vcard_ext/core.py +60 -0
  100. clm/layer0/model/vcard_ext/network.py +23 -0
  101. clm/layer0/model/vcard_ext/observability.py +63 -0
  102. clm/layer0/model/vcard_ext/storage.py +60 -0
  103. clm/layer0/model/vcard_ext/vendors.py +211 -0
  104. clm/layer0/model/vcard_sandwich.py +119 -0
  105. clm/layer0/model/vcard_vocabulary.py +463 -0
  106. clm/layer0/model/workflow.py +274 -0
  107. clm/layer0/narrative.py +431 -0
  108. clm/layer0/ontology/collection.py +125 -0
  109. clm/layer0/parser.py +429 -0
  110. clm/layer0/relations.py +73 -0
  111. clm/layer0/rule_evaluator.py +251 -0
  112. clm/layer0/schema/__init__.py +38 -0
  113. clm/layer0/schema/ddl.py +97 -0
  114. clm/layer0/templates/abstract.yaml +99 -0
  115. clm/layer0/templates/balanced.yaml +253 -0
  116. clm/layer0/templates/concrete.yaml +172 -0
  117. clm/layer0/type_registry.py +223 -0
  118. clm/layer0/types.py +204 -0
  119. clm/layer0/utils.py +886 -0
  120. clm/layer0/verifier_core.py +262 -0
  121. clm/layer1/__init__.py +31 -0
  122. clm/layer1/action_dispatcher.py +275 -0
  123. clm/layer1/adapter_registry.py +233 -0
  124. clm/layer1/algebra_baldwin_generators.py +192 -0
  125. clm/layer1/arrow_compiler.py +525 -0
  126. clm/layer1/batch_processor.py +152 -0
  127. clm/layer1/cel/__init__.py +27 -0
  128. clm/layer1/cel/builder.py +173 -0
  129. clm/layer1/engine.py +759 -0
  130. clm/layer1/engine_async.py +89 -0
  131. clm/layer1/eval_callback.py +49 -0
  132. clm/layer1/gate_composer.py +229 -0
  133. clm/layer1/hoare_sandwich.py +298 -0
  134. clm/layer1/identity_guard.py +348 -0
  135. clm/layer1/matrix.py +138 -0
  136. clm/layer1/neural_runtime.py +221 -0
  137. clm/layer1/operations/__init__.py +123 -0
  138. clm/layer1/operations/augment.py +156 -0
  139. clm/layer1/operations/base.py +109 -0
  140. clm/layer1/operations/builtins.py +338 -0
  141. clm/layer1/operations/dispatch.py +144 -0
  142. clm/layer1/operations/exclude.py +107 -0
  143. clm/layer1/operations/handle.py +197 -0
  144. clm/layer1/operations/identity.py +139 -0
  145. clm/layer1/operations/invert.py +66 -0
  146. clm/layer1/operations/loader.py +116 -0
  147. clm/layer1/operations/manipulators/__init__.py +23 -0
  148. clm/layer1/operations/manipulators/document.py +211 -0
  149. clm/layer1/operations/manipulators/media.py +134 -0
  150. clm/layer1/operations/manipulators/structured.py +159 -0
  151. clm/layer1/operations/manipulators/tabular.py +334 -0
  152. clm/layer1/operations/port.py +65 -0
  153. clm/layer1/operations/services.py +529 -0
  154. clm/layer1/operations/split.py +117 -0
  155. clm/layer1/operations/substitute.py +75 -0
  156. clm/layer1/petri.py +1052 -0
  157. clm/layer1/pocketflow_orchestrator.py +408 -0
  158. clm/layer1/pocketflow_scheduler.py +519 -0
  159. clm/layer1/protocols.py +197 -0
  160. clm/layer1/runtime_adapter.py +718 -0
  161. clm/layer1/runtimes/__init__.py +71 -0
  162. clm/layer1/runtimes/_generated_assertions.py +125 -0
  163. clm/layer1/runtimes/_generated_types.py +42 -0
  164. clm/layer1/runtimes/base.py +265 -0
  165. clm/layer1/runtimes/binary.py +101 -0
  166. clm/layer1/runtimes/factory.py +203 -0
  167. clm/layer1/runtimes/javascript.py +321 -0
  168. clm/layer1/runtimes/javascript_runtime.js +33 -0
  169. clm/layer1/runtimes/js_scripts/isomorphism.mjs +22 -0
  170. clm/layer1/runtimes/js_scripts/loader.mjs +52 -0
  171. clm/layer1/runtimes/lambda_calc.py +126 -0
  172. clm/layer1/runtimes/python.py +288 -0
  173. clm/layer1/runtimes/python_runtime.py +41 -0
  174. clm/layer1/runtimes/script.py +114 -0
  175. clm/layer1/sandbox.py +334 -0
  176. clm/layer1/savepoint_guard.py +136 -0
  177. clm/layer1/sparse_net.py +122 -0
  178. clm/layer1/spec_tester.py +165 -0
  179. clm/layer1/store.py +295 -0
  180. clm/layer1/test_runner.py +498 -0
  181. clm/layer1/type_inspector.py +166 -0
  182. clm/layer1/verifier.py +772 -0
  183. clm/layer1/vm.py +91 -0
  184. clm/layer2/__init__.py +78 -0
  185. clm/layer2/card_collection.py +678 -0
  186. clm/layer2/classifier.py +479 -0
  187. clm/layer2/engine/__init__.py +1 -0
  188. clm/layer2/engine/abstract_sql_engine.py +320 -0
  189. clm/layer2/engine/base.py +193 -0
  190. clm/layer2/engine/duckdb_engine.py +576 -0
  191. clm/layer2/engine/sqlite_engine.py +518 -0
  192. clm/layer2/fiber/__init__.py +31 -0
  193. clm/layer2/fiber/context.py +89 -0
  194. clm/layer2/fiber/disposable.py +163 -0
  195. clm/layer2/fiber/fiber.py +125 -0
  196. clm/layer2/fiber/hoare.py +191 -0
  197. clm/layer2/file_io.py +376 -0
  198. clm/layer2/file_registrar.py +77 -0
  199. clm/layer2/ingest.py +202 -0
  200. clm/layer2/lineage.py +322 -0
  201. clm/layer2/mcard_fs.py +262 -0
  202. clm/layer2/merkle.py +11 -0
  203. clm/layer2/mime.py +244 -0
  204. clm/layer2/mime_detector.py +245 -0
  205. clm/layer2/private_collection.py +118 -0
  206. clm/layer2/shared_store.py +11 -0
  207. clm/layer2/storage/__init__.py +190 -0
  208. clm/layer2/storage/db_bitemporal.py +141 -0
  209. clm/layer2/storage/db_driver.py +331 -0
  210. clm/layer2/storage/db_hyperlinks.py +214 -0
  211. clm/layer2/storage/db_pool.py +139 -0
  212. clm/layer2/storage/db_repository.py +229 -0
  213. clm/layer2/storage/savepoint.py +78 -0
  214. clm/layer2/storage/sqlite_wal.py +74 -0
  215. clm/layer2/tridb.py +245 -0
  216. clm/layer2/vcard_receipt.py +71 -0
  217. clm/layer2/vfs.py +17 -0
  218. clm/layer3/__init__.py +141 -0
  219. clm/layer3/agency/__init__.py +19 -0
  220. clm/layer3/agency/config.py +220 -0
  221. clm/layer3/agency/providers/__init__.py +15 -0
  222. clm/layer3/agency/providers/base.py +91 -0
  223. clm/layer3/agency/providers/mlc_llm.py +169 -0
  224. clm/layer3/agency/providers/ollama.py +203 -0
  225. clm/layer3/agency/router.py +71 -0
  226. clm/layer3/agency/runtime.py +524 -0
  227. clm/layer3/gateway.py +353 -0
  228. clm/layer3/open_interpreter_adapter.py +159 -0
  229. clm/layer3/rag/__init__.py +70 -0
  230. clm/layer3/rag/cli.py +228 -0
  231. clm/layer3/rag/config.py +153 -0
  232. clm/layer3/rag/embeddings/__init__.py +16 -0
  233. clm/layer3/rag/embeddings/base.py +79 -0
  234. clm/layer3/rag/embeddings/ollama.py +211 -0
  235. clm/layer3/rag/embeddings/vision.py +290 -0
  236. clm/layer3/rag/engine.py +276 -0
  237. clm/layer3/rag/graph/__init__.py +22 -0
  238. clm/layer3/rag/graph/community.py +198 -0
  239. clm/layer3/rag/graph/engine.py +433 -0
  240. clm/layer3/rag/graph/extractor.py +255 -0
  241. clm/layer3/rag/graph/schema.py +115 -0
  242. clm/layer3/rag/graph/store.py +641 -0
  243. clm/layer3/rag/indexer.py +333 -0
  244. clm/layer3/rag/llm_providers.json +52 -0
  245. clm/layer3/rag/semantic_versioning.py +313 -0
  246. clm/layer3/rag/vector/__init__.py +28 -0
  247. clm/layer3/rag/vector/handle_vector_store.py +749 -0
  248. clm/layer3/rag/vector/schema.py +151 -0
  249. clm/layer3/rag/vector/store.py +632 -0
  250. clm/layer3/reticulum/__init__.py +55 -0
  251. clm/layer3/reticulum/bridge.py +74 -0
  252. clm/layer3/reticulum/daemon.py +88 -0
  253. clm/layer3/reticulum/discovery.py +164 -0
  254. clm/layer3/reticulum/identity.py +107 -0
  255. clm/layer3/reticulum/media.py +148 -0
  256. clm/layer3/reticulum/transport.py +133 -0
  257. clm/layer3/satori/__init__.py +209 -0
  258. clm/layer3/satori/alpha_conversion.py +168 -0
  259. clm/layer3/satori/beta_reduction.py +359 -0
  260. clm/layer3/satori/continuation.py +38 -0
  261. clm/layer3/satori/eta_conversion.py +205 -0
  262. clm/layer3/satori/free_variables.py +163 -0
  263. clm/layer3/satori/io_effects.py +370 -0
  264. clm/layer3/satori/lambda_runtime.py +726 -0
  265. clm/layer3/satori/lambda_term.py +230 -0
  266. clm/layer3/satori/sheaf_audit.py +261 -0
  267. clm/layer3/satori/speech_act.py +279 -0
  268. clm/layer4/README.md +9 -0
  269. clm/layer4/__init__.py +67 -0
  270. clm/layer4/_sovereign_executor.py +580 -0
  271. clm/layer4/action_commands.py +719 -0
  272. clm/layer4/api.py +236 -0
  273. clm/layer4/bootstrap/__init__.py +13 -0
  274. clm/layer4/bootstrap/bootstrapper.py +118 -0
  275. clm/layer4/bootstrap/cleanup.py +44 -0
  276. clm/layer4/bootstrap/clm_hooks.py +49 -0
  277. clm/layer4/bootstrap/genesis.py +77 -0
  278. clm/layer4/bootstrap/injection.py +125 -0
  279. clm/layer4/cli.py +549 -0
  280. clm/layer4/collection_manager.py +553 -0
  281. clm/layer4/commands/__init__.py +81 -0
  282. clm/layer4/commands/action_cmd.py +42 -0
  283. clm/layer4/commands/check_cmd.py +82 -0
  284. clm/layer4/commands/envelope.py +73 -0
  285. clm/layer4/commands/evaluate_cmd.py +224 -0
  286. clm/layer4/commands/mcard_cmd.py +24 -0
  287. clm/layer4/commands/petri_cmd.py +92 -0
  288. clm/layer4/commands/tridb_cmd.py +319 -0
  289. clm/layer4/commands/version_cmd.py +27 -0
  290. clm/layer4/diff_commands.py +167 -0
  291. clm/layer4/eoa_sponsor.py +232 -0
  292. clm/layer4/events.py +69 -0
  293. clm/layer4/flux_gateway.py +133 -0
  294. clm/layer4/gateway.py +91 -0
  295. clm/layer4/loader.py +307 -0
  296. clm/layer4/mcard_commands.py +166 -0
  297. clm/layer4/membrane.py +273 -0
  298. clm/layer4/navigation.py +50 -0
  299. clm/layer4/protocol/protocol_entry_python.py +108 -0
  300. clm/layer4/protocol/python_sync.py +126 -0
  301. clm/layer4/runner.py +150 -0
  302. clm/layer4/satori.py +262 -0
  303. clm/layer4/server/python_sync_client.py +150 -0
  304. clm/layer4/server/python_sync_server.py +139 -0
  305. clm/layer4/server/service_api.py +315 -0
  306. clm/layer4/server/start_servers.py +107 -0
  307. clm/layer4/server/stop_servers.py +24 -0
  308. clm/layer4/simulated_optimization_fix.py +0 -0
  309. clm/layer4/storage.py +463 -0
  310. clm/layer4/tridb_admin.py +268 -0
  311. clm/layer4/websocket/test_ws_client.py +104 -0
  312. clm/layer4/websocket/test_ws_server.py +138 -0
  313. clm/layer4/websocket/ws_server_local.py +160 -0
  314. clm/layer5/__init__.py +51 -0
  315. clm/layer5/async_batch_writer.py +133 -0
  316. clm/layer5/learning.py +276 -0
  317. clm/layer5/telemetry_hook.py +107 -0
  318. clm/layer5/type_lattice.py +238 -0
  319. clm/py.typed +0 -0
  320. clm/schemas/__init__.py +652 -0
  321. clm/schemas/abstract_face_schema.yaml +77 -0
  322. clm/schemas/cel_schema.yaml +416 -0
  323. clm/schemas/lifecycle/__init__.py +45 -0
  324. clm/schemas/lifecycle/models.py +123 -0
  325. clm/schemas/lifecycle/service.py +364 -0
  326. clm/schemas/mcard_schema.sql +192 -0
  327. clm/schemas/mcard_vector_schema.sql +283 -0
  328. clm/schemas/mlp-context-v1.json +91 -0
  329. clm_kernel-0.0.0.dist-info/METADATA +121 -0
  330. clm_kernel-0.0.0.dist-info/RECORD +333 -0
  331. clm_kernel-0.0.0.dist-info/WHEEL +4 -0
  332. clm_kernel-0.0.0.dist-info/entry_points.txt +3 -0
  333. clm_kernel-0.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,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
+ ]