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.
- {ciris_server-0.5.73 → ciris_server-0.5.74}/Cargo.lock +1 -1
- ciris_server-0.5.74/Cargo.toml +327 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/PKG-INFO +1 -1
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/lib.rs +116 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/main.rs +2 -97
- ciris_server-0.5.73/Cargo.toml +0 -327
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.cargo/config.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.claude/workflows/localize-ui.js +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/bench.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/build-wheels.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/ci.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/client-artifacts.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/conformance.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/localization.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/publish-pypi.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.github/workflows/release.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/.gitignore +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/CHANGELOG.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/LICENSE +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/MISSION.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/README.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/WIRE_VOCABULARY_KINDS.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/bench-site/bench_results.json +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/bench-site/index.html +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/bench_results.json +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/alm_chain.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/erasure_survival.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/n_eff_scoring.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/pqc_av_streaming.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/replication_ingest.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/sig_overhead.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/benches/stream_fanout.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.gitignore +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/Cargo.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/LICENSE +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/MISSION.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/README.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/benches/project.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/deny.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
- {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
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/pyproject.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/api.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/client.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/event.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/egress.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/node.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/retention.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/lib.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/handler.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/node.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/relay.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/signing/event.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/README.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/data/live_mesh_2026-06-22.json +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/docs/SCOPE_PRIVACY.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/mesh_propagation/main.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/accord.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/common.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/family.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/main.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/examples/qa_runner/verify.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/README.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/bundle-jre.ps1 +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server-entry.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server-installer.iss +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/installers/windows/ciris-server.spec +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/pyproject.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/__init__.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/__main__.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/cli.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/python/ciris_server/desktop_launcher.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/rust-toolchain.toml +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/scripts/bench_report.py +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_custody.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_halt.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_pki/yubico_attestation_root_1.der +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_pki/yubico_attestation_root_1.pem +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_provision.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/accord_reactivate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/adapter.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/ABSORPTION.md +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/api_keys.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/attestation.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/bootstrap.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/consent.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/device_auth.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/device_grant.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/erasure.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/gate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/loopback.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/oauth.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/occurrence.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/ownership.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/portable_occurrence.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/roles.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/self_login.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/session.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/store.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/auth/verify.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/bench_results.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/mesh.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/benchmarks/scoreboard.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/claim_remote.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/compose.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config_api.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/config_reconcile.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/delegation_transparency.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/family.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_admin.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_nodecode.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/federation_peers.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/graph_config.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/health.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/holonomic.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/http_log.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/identity.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/ids.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/import.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/ingest_http.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/memory_api.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/mesh_relay.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/nodecode.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/peer.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/proxy.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/py_adapter.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/quorum.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/radio.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/replication_reconcile.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/age.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/mod.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/moderation.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/named.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/safety/watchlist.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/scorer/n_eff.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/scorer.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/system_data.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/telemetry_logs.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/src/yubico_attestation_ca.pem +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/accord.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/alm_chain.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/audit_chain.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/capacity_scorer.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/chaos_mesh.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/claim_remote.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/config_reconcile.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/device_grant.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/federation_admin.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/federation_session_kex.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/graph_config.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/ingest_http.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/mesh_seed_e2e.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/nat_traversal.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/nodecode.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/noise_floor.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/occurrence.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/ownership.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/peer_replication.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/portable_occurrence.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage1.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage2.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage3.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage4.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage5.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage6.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage7.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/stage8.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates/support.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/release_gates.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/replication.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/replication_reconcile.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/root_bootstrap.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/safety.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/stream_sth_consistency.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tests/wire_vocabulary_gate.rs +0 -0
- {ciris_server-0.5.73 → ciris_server-0.5.74}/tools/audit_cohort_scope_callers.py +0 -0
|
@@ -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.
|
|
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 {
|