ciris-server 0.5.73__tar.gz → 0.5.74__tar.gz

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 (261) hide show
  1. {ciris_server-0.5.73 → ciris_server-0.5.74}/Cargo.lock +1 -1
  2. ciris_server-0.5.74/Cargo.toml +327 -0
  3. {ciris_server-0.5.73 → ciris_server-0.5.74}/PKG-INFO +1 -1
  4. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/lib.rs +116 -0
  5. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/main.rs +2 -97
  6. ciris_server-0.5.73/Cargo.toml +0 -327
  7. {ciris_server-0.5.73 → ciris_server-0.5.74}/.cargo/config.toml +0 -0
  8. {ciris_server-0.5.73 → ciris_server-0.5.74}/.claude/workflows/localize-ui.js +0 -0
  9. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/bench.yml +0 -0
  10. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/build-wheels.yml +0 -0
  11. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/ci.yml +0 -0
  12. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/client-artifacts.yml +0 -0
  13. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/conformance.yml +0 -0
  14. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/localization.yml +0 -0
  15. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/publish-pypi.yml +0 -0
  16. {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/release.yml +0 -0
  17. {ciris_server-0.5.73 → ciris_server-0.5.74}/.gitignore +0 -0
  18. {ciris_server-0.5.73 → ciris_server-0.5.74}/CHANGELOG.md +0 -0
  19. {ciris_server-0.5.73 → ciris_server-0.5.74}/LICENSE +0 -0
  20. {ciris_server-0.5.73 → ciris_server-0.5.74}/MISSION.md +0 -0
  21. {ciris_server-0.5.73 → ciris_server-0.5.74}/README.md +0 -0
  22. {ciris_server-0.5.73 → ciris_server-0.5.74}/WIRE_VOCABULARY_KINDS.md +0 -0
  23. {ciris_server-0.5.73 → ciris_server-0.5.74}/bench-site/bench_results.json +0 -0
  24. {ciris_server-0.5.73 → ciris_server-0.5.74}/bench-site/index.html +0 -0
  25. {ciris_server-0.5.73 → ciris_server-0.5.74}/bench_results.json +0 -0
  26. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/alm_chain.rs +0 -0
  27. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/erasure_survival.rs +0 -0
  28. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/n_eff_scoring.rs +0 -0
  29. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/pqc_av_streaming.rs +0 -0
  30. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/replication_ingest.rs +0 -0
  31. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/sig_overhead.rs +0 -0
  32. {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/stream_fanout.rs +0 -0
  33. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
  34. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
  35. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.gitignore +0 -0
  36. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
  37. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/Cargo.toml +0 -0
  38. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
  39. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
  40. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
  41. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/LICENSE +0 -0
  42. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/MISSION.md +0 -0
  43. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/README.md +0 -0
  44. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
  45. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
  46. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/project.rs +0 -0
  47. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/deny.toml +0 -0
  48. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
  49. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
  50. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
  51. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
  52. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
  53. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
  54. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
  55. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
  56. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
  57. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
  58. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
  59. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
  60. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
  61. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
  62. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
  63. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
  64. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
  65. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
  66. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
  67. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
  68. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/pyproject.toml +0 -0
  69. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
  70. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/api.rs +0 -0
  71. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
  72. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
  73. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
  74. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
  75. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
  76. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
  77. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
  78. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
  79. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
  80. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/client.rs +0 -0
  81. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
  82. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
  83. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/event.rs +0 -0
  84. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
  85. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
  86. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
  87. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
  88. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
  89. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
  90. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
  91. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/egress.rs +0 -0
  92. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/mod.rs +0 -0
  93. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/node.rs +0 -0
  94. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/retention.rs +0 -0
  95. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
  96. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
  97. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
  98. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
  99. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
  100. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
  101. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
  102. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
  103. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
  104. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
  105. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
  106. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/lib.rs +0 -0
  107. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
  108. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
  109. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
  110. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
  111. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
  112. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
  113. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/handler.rs +0 -0
  114. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/mod.rs +0 -0
  115. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/node.rs +0 -0
  116. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/relay.rs +0 -0
  117. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
  118. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
  119. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
  120. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
  121. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
  122. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
  123. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
  124. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
  125. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
  126. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
  127. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
  128. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/signing/event.rs +0 -0
  129. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
  130. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
  131. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
  132. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/README.md +0 -0
  133. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
  134. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
  135. {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
  136. {ciris_server-0.5.73 → ciris_server-0.5.74}/data/live_mesh_2026-06-22.json +0 -0
  137. {ciris_server-0.5.73 → ciris_server-0.5.74}/docs/SCOPE_PRIVACY.md +0 -0
  138. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/mesh_propagation/main.rs +0 -0
  139. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/accord.rs +0 -0
  140. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/common.rs +0 -0
  141. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/family.rs +0 -0
  142. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/main.rs +0 -0
  143. {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/verify.rs +0 -0
  144. {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/README.md +0 -0
  145. {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/bundle-jre.ps1 +0 -0
  146. {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server-entry.py +0 -0
  147. {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server-installer.iss +0 -0
  148. {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server.spec +0 -0
  149. {ciris_server-0.5.73 → ciris_server-0.5.74}/pyproject.toml +0 -0
  150. {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/__init__.py +0 -0
  151. {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/__main__.py +0 -0
  152. {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/cli.py +0 -0
  153. {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/desktop_launcher.py +0 -0
  154. {ciris_server-0.5.73 → ciris_server-0.5.74}/rust-toolchain.toml +0 -0
  155. {ciris_server-0.5.73 → ciris_server-0.5.74}/scripts/bench_report.py +0 -0
  156. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord.rs +0 -0
  157. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_custody.rs +0 -0
  158. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_halt.rs +0 -0
  159. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_pki/yubico_attestation_root_1.der +0 -0
  160. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_pki/yubico_attestation_root_1.pem +0 -0
  161. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_provision.rs +0 -0
  162. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_reactivate.rs +0 -0
  163. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/adapter.rs +0 -0
  164. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/ABSORPTION.md +0 -0
  165. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/api_keys.rs +0 -0
  166. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/attestation.rs +0 -0
  167. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/bootstrap.rs +0 -0
  168. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/consent.rs +0 -0
  169. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/device_auth.rs +0 -0
  170. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/device_grant.rs +0 -0
  171. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/erasure.rs +0 -0
  172. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/gate.rs +0 -0
  173. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/loopback.rs +0 -0
  174. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/mod.rs +0 -0
  175. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/oauth.rs +0 -0
  176. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/occurrence.rs +0 -0
  177. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/ownership.rs +0 -0
  178. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/portable_occurrence.rs +0 -0
  179. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/roles.rs +0 -0
  180. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/self_login.rs +0 -0
  181. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/session.rs +0 -0
  182. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/store.rs +0 -0
  183. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/verify.rs +0 -0
  184. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/bench_results.rs +0 -0
  185. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/mesh.rs +0 -0
  186. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/mod.rs +0 -0
  187. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/scoreboard.rs +0 -0
  188. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/claim_remote.rs +0 -0
  189. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/compose.rs +0 -0
  190. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config.rs +0 -0
  191. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config_api.rs +0 -0
  192. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config_reconcile.rs +0 -0
  193. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/delegation_transparency.rs +0 -0
  194. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/family.rs +0 -0
  195. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_admin.rs +0 -0
  196. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_nodecode.rs +0 -0
  197. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_peers.rs +0 -0
  198. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/graph_config.rs +0 -0
  199. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/health.rs +0 -0
  200. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/holonomic.rs +0 -0
  201. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/http_log.rs +0 -0
  202. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/identity.rs +0 -0
  203. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/ids.rs +0 -0
  204. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/import.rs +0 -0
  205. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/ingest_http.rs +0 -0
  206. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/memory_api.rs +0 -0
  207. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/mesh_relay.rs +0 -0
  208. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/nodecode.rs +0 -0
  209. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/peer.rs +0 -0
  210. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/proxy.rs +0 -0
  211. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/py_adapter.rs +0 -0
  212. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/quorum.rs +0 -0
  213. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/radio.rs +0 -0
  214. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/replication_reconcile.rs +0 -0
  215. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/age.rs +0 -0
  216. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/mod.rs +0 -0
  217. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/moderation.rs +0 -0
  218. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/named.rs +0 -0
  219. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/watchlist.rs +0 -0
  220. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/scorer/n_eff.rs +0 -0
  221. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/scorer.rs +0 -0
  222. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/system_data.rs +0 -0
  223. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/telemetry_logs.rs +0 -0
  224. {ciris_server-0.5.73 → ciris_server-0.5.74}/src/yubico_attestation_ca.pem +0 -0
  225. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/accord.rs +0 -0
  226. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/alm_chain.rs +0 -0
  227. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/audit_chain.rs +0 -0
  228. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/capacity_scorer.rs +0 -0
  229. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/chaos_mesh.rs +0 -0
  230. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/claim_remote.rs +0 -0
  231. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/config_reconcile.rs +0 -0
  232. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/device_grant.rs +0 -0
  233. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/federation_admin.rs +0 -0
  234. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/federation_session_kex.rs +0 -0
  235. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/graph_config.rs +0 -0
  236. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/ingest_http.rs +0 -0
  237. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/mesh_seed_e2e.rs +0 -0
  238. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/nat_traversal.rs +0 -0
  239. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/nodecode.rs +0 -0
  240. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/noise_floor.rs +0 -0
  241. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/occurrence.rs +0 -0
  242. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/ownership.rs +0 -0
  243. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/peer_replication.rs +0 -0
  244. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/portable_occurrence.rs +0 -0
  245. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage1.rs +0 -0
  246. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage2.rs +0 -0
  247. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage3.rs +0 -0
  248. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage4.rs +0 -0
  249. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage5.rs +0 -0
  250. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage6.rs +0 -0
  251. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage7.rs +0 -0
  252. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage8.rs +0 -0
  253. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/support.rs +0 -0
  254. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates.rs +0 -0
  255. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/replication.rs +0 -0
  256. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/replication_reconcile.rs +0 -0
  257. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/root_bootstrap.rs +0 -0
  258. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/safety.rs +0 -0
  259. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/stream_sth_consistency.rs +0 -0
  260. {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/wire_vocabulary_gate.rs +0 -0
  261. {ciris_server-0.5.73 → ciris_server-0.5.74}/tools/audit_cohort_scope_callers.py +0 -0
@@ -983,7 +983,7 @@ dependencies = [
983
983
 
984
984
  [[package]]
985
985
  name = "ciris-server"
986
- version = "0.5.73"
986
+ version = "0.5.74"
987
987
  dependencies = [
988
988
  "anyhow",
989
989
  "async-trait",
@@ -0,0 +1,327 @@
1
+ [package]
2
+ name = "ciris-server"
3
+ version = "0.5.74" # 0.5.74 = wheel/image config-CLI parity: `ciris-server config set/get` now works from the pip WHEEL/image entry (py_main), not just the standalone binary. The mesh-seed blocker: Node A runs the published wheel, whose py_main dispatched ONLY import-traces + serve — so `config set net.announce_ownership true` (needed for A to emit its Reticulum identity announce → be rooted by key_id over RNS → be reachable by the relay) silently was unavailable. Fix: moved run_config_set_cli/run_config_get_cli/parse_config_value into the LIB (shared by src/main.rs AND python::py_main) + added the `config` arm to py_main. Substrate UNCHANGED (edge v8.3.0 / persist v11.9.1 / verify v8.3.0). 0.5.73 = mesh-seed operability: claim-records-locally + config CLI (binary-only, the gap this release closes) + copy-all delegation card + runbooks.
4
+ edition = "2021"
5
+ # MSRV floor is set by the substrate: ciris-verify v5.2.0 requires 1.86
6
+ # (persist v6.0.1 is 1.83). Build with the higher of the two.
7
+ rust-version = "1.86"
8
+ authors = ["Eric Moore <eric@ciris.ai>"]
9
+ description = "The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate). agent = fabric node + brain. Shipped as both the ciris-server binary and a PyO3 abi3 wheel CIRISAgent consumes. See MISSION.md."
10
+ license = "AGPL-3.0-or-later"
11
+ repository = "https://github.com/CIRISAI/CIRISServer"
12
+ readme = "README.md"
13
+ publish = false
14
+
15
+ # CIRISServer is ONE cohabitation composition in TWO shapes (MISSION.md §1.2/§6):
16
+ # - [lib] cdylib → the PyO3 abi3 wheel CIRISAgent pip-installs (the agent is
17
+ # pure Python; it consumes ciris-server, not the cores).
18
+ # - [lib] rlib → so the ciris-server binary links the same composition.
19
+ # - [[bin]] → the headless fabric node deployment.
20
+ # The composition lives in src/lib.rs; src/main.rs is a thin entry point.
21
+ [workspace]
22
+ # lens-core is absorbed in-tree (CIRISLensCore repo retired); the root package
23
+ # composes it as a path dep. node-core folds in here the same way at Server 1.0.
24
+ members = ["crates/ciris-lens-core"]
25
+ resolver = "2"
26
+
27
+ [lib]
28
+ name = "ciris_server"
29
+ crate-type = ["cdylib", "rlib"]
30
+ path = "src/lib.rs"
31
+
32
+ [[bin]]
33
+ name = "ciris-server"
34
+ path = "src/main.rs"
35
+
36
+ [features]
37
+ # pkcs11 (the YubiKey / PKCS#11-PIV custody backend) ships in DEFAULT so the
38
+ # published wheel + the `ciris-server` binary carry the hardware fed-ID + accord
39
+ # custody path out of the box (no special build). `python`/`extension-module` are
40
+ # deliberately NOT default — the binary must never link libpython; maturin turns
41
+ # them on for the wheel (pyproject [tool.maturin]). TPM/postgres hardware backends
42
+ # are auto-on per-target on Linux (see the [target.*] tables below).
43
+ default = ["pkcs11"]
44
+ # `python` pulls the PyO3 bindings (for the wheel). The binary builds WITHOUT it,
45
+ # so a plain `cargo build` never links libpython.
46
+ # ONE-WHEEL RE-EXPORT (CIRISServer#4): `python` ALSO turns on the substrate
47
+ # crates' OWN pyo3 surfaces (`ciris-persist/pyo3`, `ciris-edge/pyo3`) so their
48
+ # `#[pyclass]`es compile into THIS cdylib — one `.so`, one PyO3 type registry,
49
+ # so the persist `Engine` handed to edge is the SAME type both sides see (the
50
+ # CIRISPersist#109 cross-wheel type-identity bug CANNOT occur). persist names its
51
+ # feature `pyo3` (not `python`); edge likewise, and edge's `pyo3` already pulls
52
+ # `ciris-persist/pyo3` transitively — both listed for explicitness. verify is
53
+ # deliberately ABSENT: it is a ctypes wheel (libciris_verify_ffi.so via
54
+ # ctypes.CDLL), not a `#[pymodule]`, so it cannot be a pyo3 submodule.
55
+ python = [
56
+ "dep:pyo3",
57
+ "dep:pyo3-async-runtimes",
58
+ "ciris-lens-core/python",
59
+ "ciris-persist/pyo3",
60
+ "ciris-edge/pyo3",
61
+ ]
62
+ # `extension-module` is what maturin builds the wheel with (tells PyO3 not to
63
+ # link libpython). The bin must NOT enable it. See pyproject.toml [tool.maturin].
64
+ # Propagated to the substrate crates so THEIR pyo3 surfaces also skip linking
65
+ # libpython (each crate gates `extension-module` as its own feature).
66
+ extension-module = [
67
+ "python",
68
+ "pyo3/extension-module",
69
+ "ciris-persist/extension-module",
70
+ "ciris-edge/extension-module",
71
+ ]
72
+ # `pkcs11` turns on the YubiKey (PKCS#11 / PIV) custody backend for the USER
73
+ # federation identity (`ciris-server identity create --backend pkcs11`). OFF by
74
+ # default: a plain `cargo build` never links `cryptoki`, and the Pkcs11 backend
75
+ # honestly returns NotSupported without it. It flips `ciris-keyring/pkcs11` on
76
+ # (operator hardware; Linux). The YubiKey path is hardware-validated by the
77
+ # operator — there is no token in CI, so it is gated + flagged, not unit-tested.
78
+ # Like the per-target `tpm` posture, it is NOT in `default`; build it explicitly
79
+ # (`--features pkcs11`) on a Linux box with a token attached.
80
+ # `pkcs11` (the YubiKey custody path) pulls `ciris-keyring/pkcs11` directly and
81
+ # GLOBALLY: CIRISVerify v6.12.0 made cryptoki build on ALL targets (feature
82
+ # parity), so it no longer breaks the macos/android/ios wheels. The ciris-server
83
+ # pkcs11 source compiles wherever this feature is on (gated on `feature = "pkcs11"`,
84
+ # no target_os restriction). At runtime a target with no PKCS#11 module (e.g.
85
+ # android, which reaches a YubiKey over NFC via YubiKit instead) returns
86
+ # NotSupported — present everywhere, hardware-validated where a token is attached.
87
+ pkcs11 = ["ciris-keyring/pkcs11"]
88
+ # NOTE: hardware key custody (TPM/SE/StrongBox) is wired per-TARGET below, not as
89
+ # a cargo feature — TPM (tss-esapi) is Linux-only, so a top-level `tpm` feature
90
+ # made `--all-features` drag tss-esapi onto Windows/macOS (where it can't build).
91
+ # The `[target.'cfg(target_os = "linux")']` table enables keyring/tpm + persist
92
+ # postgres on Linux only; runtime auto-detects hardware and degrades to encrypted
93
+ # software when absent (`is_hardware_backed()` reports the posture). This mirrors
94
+ # the substrate crates' per-target keyring/postgres gating.
95
+
96
+ # ----------------------------------------------------------------------------
97
+ # Dependencies — CIRISServer AUTHORS NO PRIMITIVES. It composes the core
98
+ # libraries over ONE shared persist Engine (registry + lens read/write the same
99
+ # corpus in-process; per-slice views via Engine::from_shared).
100
+ #
101
+ # Substrate floor (SHIPPED): persist v8.6.0 / edge v4.5.0 / verify-family v5.11.0
102
+ # (ciris-keyring + ciris-crypto + ciris-verify-core), CEG 1.0-RC12. The composition
103
+ # root pins the singleton construction; the in-tree ciris-lens-core co-bumps in
104
+ # lockstep (MAJOR caret pins persist "8" / edge "4"). edge v4.2.0 ships the relay
105
+ # outer-open primitive (`open_av_outer`, CIRISEdge#149) → multi-tier ALM chains
106
+ # (benches/alm_chain.rs). All additive; no composition-root API change. pyo3 0.29.
107
+ # ----------------------------------------------------------------------------
108
+ [dependencies]
109
+ # The composed cores (authority + observation; node folds in at Server 1.0).
110
+ # ciris-registry-core — re-added at Server 0.5, co-bumped to the 6.6/edge-3.2 floor
111
+ # (CIRISRegistry#76). Held OUT of the 0.1 graph: registry-core@main still pins the
112
+ # OLD floor (persist 5.5.5 / edge 2.2.2 / verify 5.1.3) and would drag a second
113
+ # persist+edge rev into the build. The compose_registry() scaffold stays in
114
+ # src/compose.rs; this dep returns once registry co-bumps.
115
+ ciris-lens-core = { path = "crates/ciris-lens-core" } # ABSORBED in-tree (workspace member); CIRISLensCore repo retired
116
+ # ciris-node-core — folds in at Server 1.0 / agent 2.9.10 (a substrate gen behind: persist 4.10).
117
+
118
+ # The substrate trio (also pulled transitively by the cores; pinned here so the
119
+ # composition root owns the singleton construction).
120
+ # sqlite on all platforms; postgres is Linux-only (libpq/openssl don't link
121
+ # cleanly on the macOS/Windows runners — same posture as persist's own CI). The
122
+ # `[target.linux]` table below adds postgres.
123
+ # `cirislens_wa_cert` + `cirislens_service_token_revocation` expose the auth
124
+ # substrate the fabric absorbs (CIRISServer#9, src/auth): the agent's `wa_cert`
125
+ # table (users/WA/OAuth/api-keys) + the `revoked_service_tokens` table.
126
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v11.9.1", features = ["sqlite", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
127
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v8.3.0", features = ["transport-reticulum", "transport-http", "transport-packet-radio"] }
128
+ # Founder-quorum verification + key-id fingerprint at the composition root
129
+ # (threshold:: module path — NOT re-exported at the crate root).
130
+ # LOCKSTEP: persist v9.4.0 transitively pins verify-core v6.6.x — the whole
131
+ # verify family (verify-core/keyring/crypto) MUST ride the SAME tag or cargo
132
+ # resolves two ciris_verify_core crates with incompatible ThresholdMember/keyring
133
+ # types. v6.6.1 (CIRISVerify#89) adds the create_federation_identity `seal_alias`
134
+ # arg the #247 user-key-derived fix consumes. (6.4–6.6 are HUMANITY_ACCORD + STH
135
+ # stack — the accord-genesis surface CIRISServer#41 consumes.)
136
+ ciris-verify-core = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0" }
137
+ # The hybrid crypto primitives (Ed25519 + ML-DSA-65 software signers) — used by
138
+ # the portable software identity occurrence to build a `HybridSigningIdentity`
139
+ # over two software seeds. Same tag as the rest of the verify family.
140
+ ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0", version = "8", features = ["pqc-ml-dsa", "self-enc"] }
141
+ # Hardware-backed transport-identity keystore (verify v5.2.0 #68 / edge #99).
142
+ # Base = software keystore + byte-identical migration of an existing .rid (works
143
+ # everywhere, no libtss2). The real TPM-2.0 / SE / StrongBox backend rides the
144
+ # `tpm` feature; runtime auto-detects hardware and falls back to software.
145
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0", version = "8", features = ["software", "pqc-ml-dsa"] }
146
+
147
+ # PyO3 bindings for the abi3 wheel — optional, gated behind the `python` feature
148
+ # so the binary never links them. 0.29 matches the persist/edge family floor.
149
+ pyo3 = { version = "0.29", features = ["abi3-py310"], optional = true }
150
+ pyo3-async-runtimes = { version = "0.29", features = ["tokio-runtime"], optional = true }
151
+
152
+ tokio = { version = "1", features = ["rt-multi-thread", "macros", "signal", "time", "sync"] }
153
+ anyhow = "1"
154
+ fs2 = "0.4" # available-disk check for realistic-minimum feature gating
155
+ # GET /v1/identity (the fabric-node identity surface) — merged onto the lens
156
+ # read-API listener. axum pinned to lens-core's 0.8 so the merged Router unifies.
157
+ axum = "0.8"
158
+ base64 = "0.22"
159
+ serde = { version = "1", features = ["derive"] } # holonomic scoreboard model (benchmarks::)
160
+ serde_json = "1"
161
+ getrandom = "0.3" # mint the ML-DSA-65 federation seed on first boot (hybrid PQC)
162
+ # Cosmetic v4 attestation-ids (the content hash is the integrity anchor). Direct
163
+ # dep at the same major persist already pins transitively — no new resolution.
164
+ uuid = { version = "1", features = ["v4"] }
165
+ # Auth subsystem (src/auth, CIRISServer#9): timestamps on the absorbed wa_cert
166
+ # rows, SHA-256 for api-key / service-token hashing, hex for the digest wire form.
167
+ # All three already in the lock as substrate-transitive deps (no new resolution).
168
+ chrono = { version = "0.4", features = ["serde"] }
169
+ sha2 = "0.10"
170
+ hex = "0.4"
171
+ # Auth gap-close (CIRISServer#9, src/auth): the byte-compatible password KDF +
172
+ # the OAuth/native/device-auth outbound-HTTP + JWKS-verify halves. All already in
173
+ # the lock as substrate-transitive deps (reqwest/jsonwebtoken via edge+verify;
174
+ # pbkdf2/hmac/ed25519-dalek via the crypto family) — pinned here so the auth
175
+ # subsystem owns them directly, no new resolution.
176
+ # - pbkdf2 + hmac: reproduce the agent's PBKDF2-HMAC-SHA256(100k) password hash
177
+ # (auth_service.py `_hash_password`/`_verify_password`) byte-for-byte.
178
+ # - ed25519-dalek: verify the ROOT mint signature (the agent's `verify_root_signature`).
179
+ # - jsonwebtoken: Apple Sign-In RS256 JWKS verification.
180
+ # - reqwest (rustls): Google tokeninfo / OAuth code→token / Apple JWKS / Portal HTTP.
181
+ # - urlencoding: build the provider authorize-URL query string (matches urlencode).
182
+ pbkdf2 = { version = "0.12", default-features = false }
183
+ hmac = "0.12"
184
+ subtle = "2" # constant-time password-hash compare (the agent's hmac.compare_digest)
185
+ ed25519-dalek = "2"
186
+ jsonwebtoken = "9"
187
+ urlencoding = "2"
188
+ async-trait = "0.1" # the ProviderClient HTTP seam (async fn in trait)
189
+ reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] }
190
+ # Mesh control-plane relay (#128 Phase D, src/mesh_relay.rs): the RNS responder
191
+ # dispatches a verified control op into the node's OWN axum Router in-process via
192
+ # `tower::ServiceExt::oneshot` (the same-handlers guarantee, RNS_CONTROL_RELAY.md
193
+ # §5.4). Already in the lock as axum's own dependency (and a dev-dep) — promoting
194
+ # it to a runtime dep adds no new resolution.
195
+ tower = { version = "0.5", features = ["util"] }
196
+ flate2 = "1" # read the gz'd legacy-trace dump (import-traces subcommand)
197
+ tracing = "0.1"
198
+ tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
199
+ # Non-blocking rolling file sink for the node log (so a headless node launched by
200
+ # the desktop app logs RELIABLY to <home>/logs/, not just the captured console).
201
+ tracing-appender = "0.2"
202
+
203
+ # Linux-only hardware + Postgres: cargo UNIONS these onto the base deps above.
204
+ # - persist `postgres` (libpq/openssl) — Linux deployment + the postgres
205
+ # conformance lane; macOS/Windows stay sqlite-only.
206
+ # - keyring `tpm` (tss-esapi / TPM 2.0) — the real hardware backend; needs
207
+ # libtss2 (Linux build dep). Other targets keep the software keystore.
208
+ [target.'cfg(target_os = "linux")'.dependencies]
209
+ ciris-persist = { git = "https://github.com/CIRISAI/CIRISPersist", tag = "v11.9.1", features = ["postgres", "cirisgraph", "cirislens_wa_cert", "cirislens_service_token_revocation", "cirisaudit", "cirislens_tasks", "cirislens_thoughts", "cirislens_tickets", "cirislens_correlations", "cirislens_deferral_reports", "cirislens_maintenance_locks", "cirislens_creation_ceremonies", "cirislens_legacy_migration", "cirisincident", "telemetry", "secrets"] }
210
+ # keyring `tpm` (TPM-at-rest, Linux-only via tss-esapi). `pkcs11` is no longer
211
+ # per-target — it rides the global `pkcs11` feature now that cryptoki builds on all
212
+ # targets (CIRISVerify v6.12.0).
213
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0", version = "8", features = ["tpm-plugin"] }
214
+
215
+ # Android (arm64/arm32/x86_64): the keyring `android` backend (JNI → Android
216
+ # Keystore/StrongBox); sqlite bundles, no postgres/tpm. Mirrors persist/edge.
217
+ [target.'cfg(target_os = "android")'.dependencies]
218
+ ciris-keyring = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0", version = "8", features = ["android"] }
219
+
220
+ # serialport (the RNode LoRa driver dep, src/radio.rs) pulls libudev-sys on Linux,
221
+ # which only resolves where libudev exists: desktop/server Linux (gnu, x86_64 or
222
+ # aarch64), macOS, Windows. It does NOT cross-compile for armv7 / musl (no libudev
223
+ # in the cross sysroot — the release armv7+musl legs panicked on it) and isn't
224
+ # usable on android/ios. Gate to exactly the serial-capable targets — the SAME
225
+ # predicate guards `pub mod radio` (lib.rs) + the edge attach (compose.rs).
226
+ [target.'cfg(any(target_os = "macos", target_os = "windows", all(target_os = "linux", target_env = "gnu", any(target_arch = "x86_64", target_arch = "aarch64"))))'.dependencies]
227
+ serialport = "4"
228
+
229
+ # Test-only — the two-node replication integration test (tests/replication.rs)
230
+ # builds + signs CEG batches with the same primitives persist verifies against.
231
+ # ed25519-dalek MUST match persist's locked 2.x (the SigningKey type crosses the
232
+ # Engine::with_signer / put_public_key API boundary).
233
+ [dev-dependencies]
234
+ ed25519-dalek = "2"
235
+ base64 = "0.22"
236
+ chrono = { version = "0.4", features = ["serde"] }
237
+ serde_json = "1"
238
+ criterion = { version = "0.5", features = ["async_tokio"] }
239
+ # Tamper-side raw SQLite handle for the audit hash-chain conformance gate
240
+ # (tests/audit_chain.rs): opens the engine's file-backed DB on a SECOND
241
+ # connection to corrupt one stored row, the only way to land a tampered entry
242
+ # (record_entry validates + rejects, so a broken row can't go in through the
243
+ # trait). Pinned to persist's locked 0.31 + same features (NO `bundled` — links
244
+ # the platform libsqlite3, matching persist's non-mobile target so the two
245
+ # `links = "sqlite3"` crates unify to one symbol set).
246
+ rusqlite = { version = "0.31", features = ["chrono", "serde_json"] }
247
+ # Drive the merged axum Router in-process for the HTTP trace-ingest test
248
+ # (tests/ingest_http.rs): `ServiceExt::oneshot` + read the response body. tower
249
+ # 0.5 / http-body-util 0.1 match axum 0.8's floor (already in-tree transitively).
250
+ tower = { version = "0.5", features = ["util"] }
251
+ http-body-util = "0.1"
252
+ # The PQC primitives the realtime-A/V E2E bench drives directly: hybrid KEX
253
+ # (X25519 + ML-KEM-768) for the per-Link transit key, AES-256-GCM for the
254
+ # two-layer chunk seal. Same pin/features edge composes (tag parity).
255
+ ciris-crypto = { git = "https://github.com/CIRISAI/CIRISVerify", tag = "v8.3.0", version = "8", features = ["hybrid-kex", "aes-gcm", "pqc-ml-dsa", "self-enc"] }
256
+ # Enable edge's OWN fountain codec (`codec-fountain`, L1-A) for the survival-floor
257
+ # proof — dev/test ONLY (feature unification applies to test/bench builds; the
258
+ # shipped wheel stays codec-free, since a relay forwards sealed symbols opaquely
259
+ # and never encodes/decodes). This lets tests/chaos_mesh.rs exercise the SUBSTRATE
260
+ # codec (`fountain_encode`/`fountain_decode`) directly — a real MEASURED proof,
261
+ # not a reference stand-in.
262
+ ciris-edge = { git = "https://github.com/CIRISAI/CIRISEdge", tag = "v8.3.0", features = ["codec-fountain"] }
263
+
264
+ # PQC realtime-A/V streaming E2E benchmark (CIRISEdge#62 realtime_av profile).
265
+ [[bench]]
266
+ name = "pqc_av_streaming"
267
+ harness = false
268
+
269
+ # Replication / corpus-ingest throughput (the CEG-RC5 receive spine).
270
+ [[bench]]
271
+ name = "replication_ingest"
272
+ harness = false
273
+
274
+ # Multi-tier ALM relay chain (CIRISEdge#149 open_av_outer) — per-hop + per-depth
275
+ # cost; the E2E byte-survival invariant is gated in tests/alm_chain.rs.
276
+ [[bench]]
277
+ name = "alm_chain"
278
+ harness = false
279
+
280
+ # Sustained multi-stream seal throughput — measures the actual core-fraction to
281
+ # seal N blob streams @30fps in a real loop (promotes the page's "2,000 blob
282
+ # streams ≈ 6-10% of a core" from arithmetic to MEASURED).
283
+ [[bench]]
284
+ name = "stream_fanout"
285
+ harness = false
286
+
287
+ # N_eff capacity-scoring microbench — the lens constraint eigenspectrum pipeline
288
+ # (ciris_server::scorer::n_eff). Feature-matrix build + Jacobi eigendecomposition
289
+ # + PR/entropy derivation: the per-agent per-cadence-tick CPU cost of
290
+ # `capacity:sustained_coherence:v1`. CI-runnable (pure arithmetic, no network,
291
+ # no database).
292
+ [[bench]]
293
+ name = "n_eff_scoring"
294
+ harness = false
295
+
296
+ # Erasure-survival bench — EMPIRICAL reconstruction rate against the real substrate
297
+ # fountain codec (edge codec-fountain / RaptorQ). Encodes a blob into H holders, drops
298
+ # holders by a per-availability-tier Bernoulli(q) coin, runs many real decode trials,
299
+ # and writes the measured p_reconstruct per tier to target/erasure_survival.json (read
300
+ # by the scoreboard). `harness = false` — survival is a rate, not a latency. Codec is
301
+ # dev-only, so this measurement lives in a bench. `cargo bench --bench erasure_survival`.
302
+ [[bench]]
303
+ name = "erasure_survival"
304
+ harness = false
305
+
306
+ # Signature-overhead micro-bench — per-event sign+verify latency for classical
307
+ # (Ed25519-only) vs hybrid (Ed25519 + ML-DSA-65, the production provenance signature),
308
+ # using the substrate's REAL ciris_crypto primitives. The scoreboard derives the honest
309
+ # "+N%" post-quantum overhead from the two criterion medians. `cargo bench --bench sig_overhead`.
310
+ [[bench]]
311
+ name = "sig_overhead"
312
+ harness = false
313
+
314
+ # Mesh-propagation benchmark — N in-process software-key nodes; ONE group-A
315
+ # publisher advertises a synthetic "video" and a FountainSwarmRuntime per node
316
+ # converges the holding-claim to its cohort ONLY. Measures propagation latency /
317
+ # fan-out / group isolation / throughput over an in-memory bus (swarm LOGIC +
318
+ # cohort gate, not wire transport). `cargo run --example mesh_propagation`.
319
+ [[example]]
320
+ name = "mesh_propagation"
321
+ path = "examples/mesh_propagation/main.rs"
322
+
323
+ [profile.release]
324
+ # panic strategy stays "unwind" (the Win7 build-std lane relies on this being
325
+ # pinned here, not on the build-std crate list — see release.yml win7 lane).
326
+ panic = "unwind"
327
+ strip = false # release workflow strips per-target after build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ciris-server
3
- Version: 0.5.73
3
+ Version: 0.5.74
4
4
  License-File: LICENSE
5
5
  Summary: The fabric node — the federation's headless cohabitation runtime (registry + lens [+ node] over one shared substrate), as the abi3 wheel CIRISAgent consumes. agent = fabric node + brain.
6
6
  Author-email: Eric Moore <eric@ciris.ai>
@@ -507,6 +507,106 @@ pub fn log_dir_from_args(args: &[String]) -> std::path::PathBuf {
507
507
  .join("logs")
508
508
  }
509
509
 
510
+ // ── `config set/get` console subcommand (shared by the binary AND the wheel) ──
511
+ // These live in the LIB (not `src/main.rs`) so the pip console-script — which
512
+ // enters through `python::py_main`, NOT the binary's `main()` — has the exact
513
+ // same `ciris-server config set/get` surface. Before this, `config` was only in
514
+ // the binary, so the published WHEEL/image `ciris-server` had no way to set
515
+ // boot-structural knobs (e.g. `net.announce_ownership`) on a headless node
516
+ // (CIRISServer mesh-seed blocker: Node A runs the wheel, couldn't self-configure).
517
+
518
+ /// `ciris-server config set <key> <json-value> [--home <path>] [--key-id <name>]
519
+ /// [--reason <text>]` — write a node-signed `config:*` object from the console.
520
+ /// JSON-first value parse (`'["a:1"]'`→List, `true`→Bool, `7`→I64), bare-string
521
+ /// fallback. Used by the headless/no-session path.
522
+ pub async fn run_config_set_cli(mut args: impl Iterator<Item = String>) -> anyhow::Result<()> {
523
+ use anyhow::Context;
524
+ let mut home: Option<String> = None;
525
+ let mut key_id = config::DEFAULT_KEY_ID.to_string();
526
+ let mut reason = "console-cli".to_string();
527
+ let mut key: Option<String> = None;
528
+ let mut value_raw: Option<String> = None;
529
+ while let Some(arg) = args.next() {
530
+ match arg.as_str() {
531
+ "--home" => home = Some(args.next().context("--home needs a path")?),
532
+ "--key-id" => key_id = args.next().context("--key-id needs a name")?,
533
+ "--reason" => reason = args.next().context("--reason needs a value")?,
534
+ other if other.starts_with("--") => {
535
+ return Err(anyhow::anyhow!("unknown config-set arg: {other}"))
536
+ }
537
+ positional => {
538
+ if key.is_none() {
539
+ key = Some(positional.to_string());
540
+ } else if value_raw.is_none() {
541
+ value_raw = Some(positional.to_string());
542
+ } else {
543
+ return Err(anyhow::anyhow!(
544
+ "unexpected extra config-set arg: {positional}"
545
+ ));
546
+ }
547
+ }
548
+ }
549
+ }
550
+ let key = key.context("config set requires <key> (e.g. net.announce_ownership)")?;
551
+ let value_raw = value_raw
552
+ .context("config set requires <json-value> (e.g. true or '[\"108.61.242.236:4242\"]')")?;
553
+ let value = parse_config_value(&value_raw);
554
+ let home = home.unwrap_or_else(|| config::DEFAULT_CIRIS_HOME.to_string());
555
+ let cfg = config::ServerConfig::from_home(std::path::PathBuf::from(home), key_id)?;
556
+ let entry = run_config_set(cfg, &key, value, &reason).await?;
557
+ println!(
558
+ "✅ config set {} (version {}, authored by {})",
559
+ entry.key, entry.version, entry.updated_by
560
+ );
561
+ println!("{}", serde_json::to_string_pretty(&entry.value)?);
562
+ Ok(())
563
+ }
564
+
565
+ /// `ciris-server config get <key> [--home <path>] [--key-id <name>]` — read the
566
+ /// latest-wins `config:*` value from the console.
567
+ pub async fn run_config_get_cli(mut args: impl Iterator<Item = String>) -> anyhow::Result<()> {
568
+ use anyhow::Context;
569
+ let mut home: Option<String> = None;
570
+ let mut key_id = config::DEFAULT_KEY_ID.to_string();
571
+ let mut key: Option<String> = None;
572
+ while let Some(arg) = args.next() {
573
+ match arg.as_str() {
574
+ "--home" => home = Some(args.next().context("--home needs a path")?),
575
+ "--key-id" => key_id = args.next().context("--key-id needs a name")?,
576
+ other if other.starts_with("--") => {
577
+ return Err(anyhow::anyhow!("unknown config-get arg: {other}"))
578
+ }
579
+ positional => {
580
+ if key.is_none() {
581
+ key = Some(positional.to_string());
582
+ } else {
583
+ return Err(anyhow::anyhow!(
584
+ "unexpected extra config-get arg: {positional}"
585
+ ));
586
+ }
587
+ }
588
+ }
589
+ }
590
+ let key = key.context("config get requires <key> (e.g. net.announce_ownership)")?;
591
+ let home = home.unwrap_or_else(|| config::DEFAULT_CIRIS_HOME.to_string());
592
+ let cfg = config::ServerConfig::from_home(std::path::PathBuf::from(home), key_id)?;
593
+ match run_config_get(cfg, &key).await? {
594
+ Some(entry) => println!("{}", serde_json::to_string_pretty(&entry.value)?),
595
+ None => eprintln!("(no config for key {key:?})"),
596
+ }
597
+ Ok(())
598
+ }
599
+
600
+ /// Parse a `config set` value: JSON-first (so `'["a:1"]'`→List, `true`→Bool,
601
+ /// `7`→I64), with a bare-string fallback.
602
+ pub fn parse_config_value(raw: &str) -> ConfigValue {
603
+ match serde_json::from_str::<serde_json::Value>(raw) {
604
+ Ok(v) => serde_json::from_value::<ConfigValue>(v)
605
+ .unwrap_or_else(|_| ConfigValue::Str(raw.to_string())),
606
+ Err(_) => ConfigValue::Str(raw.to_string()),
607
+ }
608
+ }
609
+
510
610
  // ── PyO3 abi3 wheel surface (the shape CIRISAgent consumes) ──────────────────
511
611
  // Gated behind the `python` feature so the binary never links libpython.
512
612
  #[cfg(feature = "python")]
@@ -552,6 +652,22 @@ mod python {
552
652
  })?;
553
653
  rt_block_on(crate::import_traces(&dir))
554
654
  }
655
+ // `ciris-server config set/get <key> [value] …` — node-signed
656
+ // `config:*` write/read from the console. This arm MUST live here (not
657
+ // just in the binary's `main()`) so the pip WHEEL/image `ciris-server`
658
+ // can set boot-structural knobs (e.g. `net.announce_ownership`,
659
+ // `net.bootstrap_peers`) on a headless node with no app/owner session.
660
+ Some("config") => {
661
+ let sub = args.next();
662
+ match sub.as_deref() {
663
+ Some("set") => rt_block_on(crate::run_config_set_cli(args)),
664
+ Some("get") => rt_block_on(crate::run_config_get_cli(args)),
665
+ other => Err(pyo3::exceptions::PyRuntimeError::new_err(format!(
666
+ "usage: ciris-server config set <key> <json-value> [--home <path>] [--key-id <name>]\n\
667
+ \x20 ciris-server config get <key> [--home <path>] [--key-id <name>] (got {other:?})"
668
+ ))),
669
+ }
670
+ }
555
671
  // Default-serve path. `first` is the already-consumed first token (a
556
672
  // leading flag like `--home`/`--key-id`, or `None` for a bare boot).
557
673
  // Parse it the SAME way the binary does so the WHEEL honors the flags
@@ -146,8 +146,8 @@ async fn main() -> Result<()> {
146
146
  // session). Lets a HEADLESS node set knobs (e.g. `net.bootstrap_peers`) that
147
147
  // otherwise only the app/owner-session `/v1/config` surface could reach.
148
148
  Some("config") => match args.next().as_deref() {
149
- Some("set") => run_config_set_cli(args).await,
150
- Some("get") => run_config_get_cli(args).await,
149
+ Some("set") => ciris_server::run_config_set_cli(args).await,
150
+ Some("get") => ciris_server::run_config_get_cli(args).await,
151
151
  other => Err(anyhow::anyhow!(
152
152
  "usage: ciris-server config set <key> <json-value> [--home <path>] \
153
153
  [--key-id <alias>] [--reason <text>]\n ciris-server config get <key> \
@@ -414,101 +414,6 @@ async fn run_claim(mut args: impl Iterator<Item = String>) -> Result<()> {
414
414
  Ok(())
415
415
  }
416
416
 
417
- /// `ciris-server config set <key> <json-value> …` — write a signed `config:v1` CEG
418
- /// object from the console (node-signed; the SAME path the node + `/v1/config` use).
419
- async fn run_config_set_cli(mut args: impl Iterator<Item = String>) -> Result<()> {
420
- use ciris_server::config::{DEFAULT_CIRIS_HOME, DEFAULT_KEY_ID};
421
-
422
- let mut home: Option<String> = None;
423
- let mut key_id = DEFAULT_KEY_ID.to_string();
424
- let mut reason = "console-cli".to_string();
425
- let mut key: Option<String> = None;
426
- let mut value_raw: Option<String> = None;
427
- while let Some(arg) = args.next() {
428
- match arg.as_str() {
429
- "--home" => home = Some(args.next().context("--home needs a path")?),
430
- "--key-id" => key_id = args.next().context("--key-id needs a name")?,
431
- "--reason" => reason = args.next().context("--reason needs a value")?,
432
- other if other.starts_with("--") => {
433
- return Err(anyhow::anyhow!("unknown config-set arg: {other}"));
434
- }
435
- positional => {
436
- if key.is_none() {
437
- key = Some(positional.to_string());
438
- } else if value_raw.is_none() {
439
- value_raw = Some(positional.to_string());
440
- } else {
441
- return Err(anyhow::anyhow!(
442
- "unexpected extra config-set arg: {positional}"
443
- ));
444
- }
445
- }
446
- }
447
- }
448
- let key = key.context("config set requires <key> (e.g. net.bootstrap_peers)")?;
449
- let value_raw =
450
- value_raw.context("config set requires <json-value> (e.g. '[\"108.61.242.236:4242\"]')")?;
451
- let value = parse_config_value(&value_raw);
452
-
453
- let home = home.unwrap_or_else(|| DEFAULT_CIRIS_HOME.to_string());
454
- let cfg = ciris_server::ServerConfig::from_home(std::path::PathBuf::from(home), key_id)?;
455
- let entry = ciris_server::run_config_set(cfg, &key, value, &reason).await?;
456
- println!(
457
- "✅ config set {} (version {}, authored by {})",
458
- entry.key, entry.version, entry.updated_by
459
- );
460
- println!("{}", serde_json::to_string_pretty(&entry.value)?);
461
- Ok(())
462
- }
463
-
464
- /// `ciris-server config get <key> …` — read the latest-wins value of a `config:*`
465
- /// key from the node's signed store (prints JSON; unset ⇒ a note on stderr).
466
- async fn run_config_get_cli(mut args: impl Iterator<Item = String>) -> Result<()> {
467
- use ciris_server::config::{DEFAULT_CIRIS_HOME, DEFAULT_KEY_ID};
468
-
469
- let mut home: Option<String> = None;
470
- let mut key_id = DEFAULT_KEY_ID.to_string();
471
- let mut key: Option<String> = None;
472
- while let Some(arg) = args.next() {
473
- match arg.as_str() {
474
- "--home" => home = Some(args.next().context("--home needs a path")?),
475
- "--key-id" => key_id = args.next().context("--key-id needs a name")?,
476
- other if other.starts_with("--") => {
477
- return Err(anyhow::anyhow!("unknown config-get arg: {other}"));
478
- }
479
- positional => {
480
- if key.is_none() {
481
- key = Some(positional.to_string());
482
- } else {
483
- return Err(anyhow::anyhow!(
484
- "unexpected extra config-get arg: {positional}"
485
- ));
486
- }
487
- }
488
- }
489
- }
490
- let key = key.context("config get requires <key> (e.g. net.bootstrap_peers)")?;
491
- let home = home.unwrap_or_else(|| DEFAULT_CIRIS_HOME.to_string());
492
- let cfg = ciris_server::ServerConfig::from_home(std::path::PathBuf::from(home), key_id)?;
493
- match ciris_server::run_config_get(cfg, &key).await? {
494
- Some(entry) => println!("{}", serde_json::to_string_pretty(&entry.value)?),
495
- None => eprintln!("(config key {key:?} is unset)"),
496
- }
497
- Ok(())
498
- }
499
-
500
- /// Parse a `config set` value: **JSON first** (so `'["1.2.3.4:4242"]'` → list,
501
- /// `'true'` → bool, `'7'` → int, `'"foo"'` → string), falling back to a bare string
502
- /// for a non-JSON token (so `config set node.alias mynode` records the string
503
- /// `"mynode"` rather than erroring).
504
- fn parse_config_value(raw: &str) -> ciris_server::ConfigValue {
505
- match serde_json::from_str::<serde_json::Value>(raw) {
506
- Ok(v) => serde_json::from_value::<ciris_server::ConfigValue>(v)
507
- .unwrap_or_else(|_| ciris_server::ConfigValue::Str(raw.to_string())),
508
- Err(_) => ciris_server::ConfigValue::Str(raw.to_string()),
509
- }
510
- }
511
-
512
417
  /// Today's date in UTC as `YYYY-MM-DD` (the default `--date` for `bench-results`,
513
418
  /// overridable so a CI run can stamp the exact build date).
514
419
  fn current_utc_date() -> String {