ciris-server 0.2.0__tar.gz → 0.2.2__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.2.0 → ciris_server-0.2.2}/.github/workflows/publish-pypi.yml +25 -4
- {ciris_server-0.2.0 → ciris_server-0.2.2}/CHANGELOG.md +28 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/Cargo.lock +43 -1
- {ciris_server-0.2.0 → ciris_server-0.2.2}/Cargo.toml +2 -1
- {ciris_server-0.2.0 → ciris_server-0.2.2}/PKG-INFO +1 -1
- {ciris_server-0.2.0 → ciris_server-0.2.2}/pyproject.toml +1 -1
- {ciris_server-0.2.0 → ciris_server-0.2.2}/src/compose.rs +1 -1
- ciris_server-0.2.2/src/import.rs +266 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/src/lib.rs +42 -8
- ciris_server-0.2.2/src/main.rs +26 -0
- ciris_server-0.2.0/src/main.rs +0 -14
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.cargo/config.toml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/bench.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/ci.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/conformance.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.github/workflows/release.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/.gitignore +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/LENS_TO_SERVER_MIGRATION.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/PQC_AV_STREAMING_BENCH.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/REGISTRY_FOLD_DERISK.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/FSD/SERVER_1.0_PLAN.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/LICENSE +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/MISSION.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/README.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/benches/pqc_av_streaming.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/benches/replication_ingest.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.github/workflows/bench.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.github/workflows/ci.yml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.gitignore +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.pre-commit-config.yaml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/Cargo.toml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/CIRIS_LENS_CORE.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/LENS_CORE_V0_5.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/FSD/OPEN_QUESTIONS.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/LICENSE +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/MISSION.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/README.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/aggregate.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/canonicalize.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/benches/project.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/deny.toml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/BENCHMARKS.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/COHABITATION.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PRE_COMMIT.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PYPI_PUBLISH.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/RELEASE_NOTES.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/THREAT_MODEL.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/json_path.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/metadata.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/extraction/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/distilbert_loader.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/fields.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ner.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/ort_loader.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/proptests.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/regex.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/walker.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/patterns_from_cirislens_core/scrubber/xlm_r_loader.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/pyproject.toml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/api.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/delegate.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/audit/pyo3.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/canonical/ceg_egress.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/canonical/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/attestation.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/score.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/batch.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/client.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/consent.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/correlation.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/event.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/partial.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/py_engine.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capture/seal.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/declared.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/cohort/resourcing.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/egress.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/node.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/retention.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/config/upstream.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/axis_metrics.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/correlated_action.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/distributive_access.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/manifold.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/extract/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/extract/projection.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/ffi/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/ffi/pyo3.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/lib.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/observability/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/pipeline/lifecycle.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/pipeline/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/eviction.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/retention/summary.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/handler.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/node.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/relay.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/role/ret_relay.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/aggregate.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scores/oracle.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/assembly.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/axis_calibration.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/calibration.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/capacity.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/n_eff.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/result.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/signing/event.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/signing/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/wire/mod.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/wire/signer.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/README.md +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/canonical_fixtures.json +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/parity/generate_canonical_fixtures.py +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/tests/sovereign_rlib.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/rust-toolchain.toml +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/scripts/bench_report.py +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/src/config.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/src/quorum.rs +0 -0
- {ciris_server-0.2.0 → ciris_server-0.2.2}/tests/replication.rs +0 -0
|
@@ -115,13 +115,13 @@ jobs:
|
|
|
115
115
|
android:
|
|
116
116
|
name: wheel android-${{ matrix.abi }}
|
|
117
117
|
runs-on: ubuntu-latest
|
|
118
|
-
|
|
118
|
+
# Green as of 0.2.1 (arm64-v8a + armeabi-v7a both package). A required gate now.
|
|
119
119
|
strategy:
|
|
120
120
|
fail-fast: false
|
|
121
121
|
matrix:
|
|
122
122
|
include:
|
|
123
|
-
- { abi: armeabi-v7a, target: armv7-linux-androideabi, clang: armv7a-linux-androideabi24, pw: 32 }
|
|
124
|
-
- { abi: arm64-v8a, target: aarch64-linux-android, clang: aarch64-linux-android24, pw: 64 }
|
|
123
|
+
- { abi: armeabi-v7a, target: armv7-linux-androideabi, clang: armv7a-linux-androideabi24, legacy: arm-linux-androideabi, pw: 32 }
|
|
124
|
+
- { abi: arm64-v8a, target: aarch64-linux-android, clang: aarch64-linux-android24, legacy: aarch64-linux-android, pw: 64 }
|
|
125
125
|
steps:
|
|
126
126
|
- uses: actions/checkout@v4
|
|
127
127
|
- uses: dtolnay/rust-toolchain@stable
|
|
@@ -155,8 +155,29 @@ jobs:
|
|
|
155
155
|
- name: Build wheel (maturin, Android NDK)
|
|
156
156
|
env:
|
|
157
157
|
ANDROID_NDK_HOME: ${{ steps.ndk.outputs.ndk-path }}
|
|
158
|
-
|
|
158
|
+
ANDROID_API_LEVEL: "24" # maturin can't infer the API level for armv7 (it can for arm64)
|
|
159
159
|
run: |
|
|
160
|
+
# cc-rs guesses the wrong NDK clang name (arm-linux-androideabi-clang);
|
|
161
|
+
# point CC/CXX/AR + the cargo linker at the real r26b tools (what
|
|
162
|
+
# cargo-ndk would set). Var names use the underscore/SCREAMING target.
|
|
163
|
+
TC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
|
|
164
|
+
CLANG="${TC}/${{ matrix.clang }}-clang"
|
|
165
|
+
TUS="$(echo '${{ matrix.target }}' | tr - _)"
|
|
166
|
+
TSC="$(echo "$TUS" | tr a-z A-Z)"
|
|
167
|
+
export "CC_${TUS}=${CLANG}"
|
|
168
|
+
export "CXX_${TUS}=${CLANG}++"
|
|
169
|
+
export "AR_${TUS}=${TC}/llvm-ar"
|
|
170
|
+
export "RANLIB_${TUS}=${TC}/llvm-ranlib"
|
|
171
|
+
export "CARGO_TARGET_${TSC}_LINKER=${CLANG}"
|
|
172
|
+
# openssl-src (pulled by persist on android) hardcodes the LEGACY NDK
|
|
173
|
+
# tool names that r26b dropped; shim them → the r26b llvm tools.
|
|
174
|
+
export ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}"
|
|
175
|
+
ln -sf "${TC}/llvm-ar" "${TC}/${{ matrix.legacy }}-ar"
|
|
176
|
+
ln -sf "${TC}/llvm-ranlib" "${TC}/${{ matrix.legacy }}-ranlib"
|
|
177
|
+
ln -sf "${CLANG}" "${TC}/${{ matrix.legacy }}-clang"
|
|
178
|
+
ln -sf "${CLANG}++" "${TC}/${{ matrix.legacy }}-clang++"
|
|
179
|
+
export PATH="${TC}:${PATH}"
|
|
180
|
+
export RUSTFLAGS="-L ${RUNNER_TEMP}/python-stub -C link-arg=-Wl,--no-as-needed -C link-arg=-lpython3.10"
|
|
160
181
|
python -m pip install --upgrade pip
|
|
161
182
|
pip install "maturin>=1.7,<2"
|
|
162
183
|
maturin build --release --out dist --target ${{ matrix.target }}
|
|
@@ -4,6 +4,34 @@ All notable changes to CIRISServer. Format follows [Keep a Changelog](https://ke
|
|
|
4
4
|
this project uses [Semantic Versioning](https://semver.org/). The minor line tracks
|
|
5
5
|
the fabric-node scope (0.1 lens · 0.5 +registry · 1.0 +node), paced by the CIRISAgent train.
|
|
6
6
|
|
|
7
|
+
## [0.2.2] — 2026-06-15
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **`import-traces` on the wheel** (pip-only bridge): the abi3 wheel now exposes
|
|
11
|
+
`ciris_server.import_traces(dump_dir)`, and the `ciris-server` console script
|
|
12
|
+
accepts `ciris-server import-traces <dump-dir>` (same CLI as the binary). The
|
|
13
|
+
legacy CIRISLens dump → persist-corpus-as-CEG import no longer needs the
|
|
14
|
+
source-built binary. Verified from the installed wheel against the prod dump:
|
|
15
|
+
all 12,165 traces, errored=0.
|
|
16
|
+
|
|
17
|
+
## [0.2.1] — 2026-06-15
|
|
18
|
+
|
|
19
|
+
Android wheels (incl. arm32) now publish; legacy-trace importer.
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- **`ciris-server import-traces <dump-dir>`** — imports the legacy CIRISLens
|
|
23
|
+
TimescaleDB dump into the persist corpus as CEG objects. Reconstructs flat
|
|
24
|
+
1.9.x lens rows → `CompleteTrace`/`BatchEnvelope` (reasoning columns →
|
|
25
|
+
components; original schema + signature in a provenance component); stamped
|
|
26
|
+
`2.7.legacy`; imported pre-verified; idempotent. A salvage pass repairs the
|
|
27
|
+
dump's systematic `\\"`→`\"` export mis-escaping and flags those rows
|
|
28
|
+
`_salvaged: true`. Validated on the prod dump: **all 12,165 traces →
|
|
29
|
+
20,959 trace-events, errored=0** (3,635 salvaged).
|
|
30
|
+
- **Android wheels** (armeabi-v7a + arm64-v8a) now build & publish (NDK r26b
|
|
31
|
+
cross-compile: explicit `CC`/`AR`/linker for the toolchain, legacy-NDK
|
|
32
|
+
tool-name shims for openssl-src, `ANDROID_API_LEVEL`). Promoted from
|
|
33
|
+
continue-on-error to a required publish lane.
|
|
34
|
+
|
|
7
35
|
## [0.2.0] — 2026-06-15
|
|
8
36
|
|
|
9
37
|
All-platforms-green CI, **full hybrid post-quantum federation signatures**, and a
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
# It is not intended for manual editing.
|
|
3
3
|
version = 4
|
|
4
4
|
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "adler2"
|
|
7
|
+
version = "2.0.1"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
|
|
10
|
+
|
|
5
11
|
[[package]]
|
|
6
12
|
name = "aead"
|
|
7
13
|
version = "0.5.2"
|
|
@@ -982,7 +988,7 @@ dependencies = [
|
|
|
982
988
|
|
|
983
989
|
[[package]]
|
|
984
990
|
name = "ciris-server"
|
|
985
|
-
version = "0.2.
|
|
991
|
+
version = "0.2.2"
|
|
986
992
|
dependencies = [
|
|
987
993
|
"anyhow",
|
|
988
994
|
"axum",
|
|
@@ -996,6 +1002,7 @@ dependencies = [
|
|
|
996
1002
|
"ciris-verify-core",
|
|
997
1003
|
"criterion",
|
|
998
1004
|
"ed25519-dalek",
|
|
1005
|
+
"flate2",
|
|
999
1006
|
"fs2",
|
|
1000
1007
|
"getrandom 0.3.4",
|
|
1001
1008
|
"pyo3",
|
|
@@ -1196,6 +1203,15 @@ dependencies = [
|
|
|
1196
1203
|
"libc",
|
|
1197
1204
|
]
|
|
1198
1205
|
|
|
1206
|
+
[[package]]
|
|
1207
|
+
name = "crc32fast"
|
|
1208
|
+
version = "1.5.0"
|
|
1209
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1210
|
+
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
|
|
1211
|
+
dependencies = [
|
|
1212
|
+
"cfg-if",
|
|
1213
|
+
]
|
|
1214
|
+
|
|
1199
1215
|
[[package]]
|
|
1200
1216
|
name = "criterion"
|
|
1201
1217
|
version = "0.5.1"
|
|
@@ -1740,6 +1756,16 @@ version = "0.4.2"
|
|
|
1740
1756
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1741
1757
|
checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
|
|
1742
1758
|
|
|
1759
|
+
[[package]]
|
|
1760
|
+
name = "flate2"
|
|
1761
|
+
version = "1.1.9"
|
|
1762
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1763
|
+
checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
|
|
1764
|
+
dependencies = [
|
|
1765
|
+
"crc32fast",
|
|
1766
|
+
"miniz_oxide",
|
|
1767
|
+
]
|
|
1768
|
+
|
|
1743
1769
|
[[package]]
|
|
1744
1770
|
name = "float_eq"
|
|
1745
1771
|
version = "1.0.1"
|
|
@@ -3047,6 +3073,16 @@ version = "0.2.1"
|
|
|
3047
3073
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3048
3074
|
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
|
3049
3075
|
|
|
3076
|
+
[[package]]
|
|
3077
|
+
name = "miniz_oxide"
|
|
3078
|
+
version = "0.8.9"
|
|
3079
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3080
|
+
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
|
|
3081
|
+
dependencies = [
|
|
3082
|
+
"adler2",
|
|
3083
|
+
"simd-adler32",
|
|
3084
|
+
]
|
|
3085
|
+
|
|
3050
3086
|
[[package]]
|
|
3051
3087
|
name = "mio"
|
|
3052
3088
|
version = "1.2.1"
|
|
@@ -5031,6 +5067,12 @@ dependencies = [
|
|
|
5031
5067
|
"rand_core 0.10.1",
|
|
5032
5068
|
]
|
|
5033
5069
|
|
|
5070
|
+
[[package]]
|
|
5071
|
+
name = "simd-adler32"
|
|
5072
|
+
version = "0.3.9"
|
|
5073
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
5074
|
+
checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
|
|
5075
|
+
|
|
5034
5076
|
[[package]]
|
|
5035
5077
|
name = "siphasher"
|
|
5036
5078
|
version = "1.0.3"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "ciris-server"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.2" # 0.1 = lens-only (agent ~2.9.7); 0.5 = +registry (~2.9.8); 1.0 = +node (~2.9.10). Patch forward (0.1.1) on breakage.
|
|
4
4
|
edition = "2021"
|
|
5
5
|
# MSRV floor is set by the substrate: ciris-verify v5.2.0 requires 1.86
|
|
6
6
|
# (persist v6.0.1 is 1.83). Build with the higher of the two.
|
|
@@ -110,6 +110,7 @@ axum = "0.8"
|
|
|
110
110
|
base64 = "0.22"
|
|
111
111
|
serde_json = "1"
|
|
112
112
|
getrandom = "0.3" # mint the ML-DSA-65 federation seed on first boot (hybrid PQC)
|
|
113
|
+
flate2 = "1" # read the gz'd legacy-trace dump (import-traces subcommand)
|
|
113
114
|
tracing = "0.1"
|
|
114
115
|
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
|
|
115
116
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ciris-server
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
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>
|
|
@@ -12,7 +12,7 @@ build-backend = "maturin"
|
|
|
12
12
|
[project]
|
|
13
13
|
name = "ciris-server"
|
|
14
14
|
# Mirrors Cargo.toml; bump in lockstep.
|
|
15
|
-
version = "0.2.
|
|
15
|
+
version = "0.2.2" # matches the Cargo crate. 0.1 = lens-only; patch forward (0.1.1) on breakage
|
|
16
16
|
description = "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."
|
|
17
17
|
authors = [{ name = "Eric Moore", email = "eric@ciris.ai" }]
|
|
18
18
|
license = { text = "AGPL-3.0-or-later" }
|
|
@@ -250,7 +250,7 @@ fn federation_pqc_signer(cfg: &ServerConfig) -> Result<Arc<dyn PqcSigner>> {
|
|
|
250
250
|
/// already-sealed seed is loaded, or a fresh one is generated + sealed
|
|
251
251
|
/// (`get_platform_ed25519_signer`). Either way the seed is TPM/SE/StrongBox-sealed
|
|
252
252
|
/// at rest with software-encrypted fallback; the pubkey stays 32-byte Ed25519.
|
|
253
|
-
fn federation_signer(cfg: &ServerConfig) -> Result<Box<dyn HardwareSigner>> {
|
|
253
|
+
pub(crate) fn federation_signer(cfg: &ServerConfig) -> Result<Box<dyn HardwareSigner>> {
|
|
254
254
|
let seed_path = cfg.seed_path(); // identity_dir/ed25519.seed — the takeover source
|
|
255
255
|
if seed_path.exists() {
|
|
256
256
|
let bytes =
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
//! `ciris-server import-traces <dump-dir>` — import the legacy CIRISLens
|
|
2
|
+
//! TimescaleDB trace dump into the persist-v7 corpus as **CEG objects**
|
|
3
|
+
//! (`CompleteTrace` / `BatchEnvelope`), for posterity + to show the ragged edge.
|
|
4
|
+
//!
|
|
5
|
+
//! The dump's `accord_traces.jsonl.gz` is the **flat** lens row (schema 1.9.x,
|
|
6
|
+
//! ~90 denormalized columns), NOT CEG wire. This maps each row → a
|
|
7
|
+
//! `CompleteTrace`: the seven reasoning dict-columns become `TraceComponent`s
|
|
8
|
+
//! (thought_start→Observation/ThoughtStart, dma_results→Rationale/DmaResults,
|
|
9
|
+
//! conscience_result→Conscience/ConscienceResult, action_result→Action/
|
|
10
|
+
//! ActionResult, …). The original `signature` + `signature_key_id` are preserved
|
|
11
|
+
//! as provenance; the trace is imported **pre-verified** (the legacy signature
|
|
12
|
+
//! signed the 1.9.x bytes, not the reconstructed trace, so it is not
|
|
13
|
+
//! re-verifiable — `receive_and_persist_pre_verified`). Content-addressed dedup
|
|
14
|
+
//! makes re-runs idempotent.
|
|
15
|
+
//!
|
|
16
|
+
//! Robust to the ragged edge: a streaming JSON-value reader (not line-split)
|
|
17
|
+
//! recovers rows with embedded newlines, and persist's `#[serde(other)]`
|
|
18
|
+
//! component fallbacks keep odd rows from hard-failing.
|
|
19
|
+
|
|
20
|
+
use std::path::Path;
|
|
21
|
+
use std::sync::Arc;
|
|
22
|
+
|
|
23
|
+
use anyhow::{Context, Result};
|
|
24
|
+
use ciris_persist::prelude::Engine;
|
|
25
|
+
use ciris_persist::scrub::NullScrubber;
|
|
26
|
+
use flate2::read::GzDecoder;
|
|
27
|
+
use serde_json::{json, Map, Value};
|
|
28
|
+
|
|
29
|
+
use crate::compose::federation_signer;
|
|
30
|
+
use crate::config::ServerConfig;
|
|
31
|
+
|
|
32
|
+
/// (flat column, component_type, event_type, timestamp column) — the mapping.
|
|
33
|
+
const COMPONENTS: &[(&str, &str, &str, &str)] = &[
|
|
34
|
+
(
|
|
35
|
+
"thought_start",
|
|
36
|
+
"observation",
|
|
37
|
+
"thought_start",
|
|
38
|
+
"thought_start_at",
|
|
39
|
+
),
|
|
40
|
+
(
|
|
41
|
+
"snapshot_and_context",
|
|
42
|
+
"context",
|
|
43
|
+
"snapshot_and_context",
|
|
44
|
+
"snapshot_at",
|
|
45
|
+
),
|
|
46
|
+
("dma_results", "rationale", "dma_results", "dma_results_at"),
|
|
47
|
+
("idma_result", "rationale", "idma_result", "idma_at"),
|
|
48
|
+
("aspdma_result", "rationale", "aspdma_result", "aspdma_at"),
|
|
49
|
+
(
|
|
50
|
+
"conscience_result",
|
|
51
|
+
"conscience",
|
|
52
|
+
"conscience_result",
|
|
53
|
+
"conscience_at",
|
|
54
|
+
),
|
|
55
|
+
(
|
|
56
|
+
"action_result",
|
|
57
|
+
"action",
|
|
58
|
+
"action_result",
|
|
59
|
+
"action_result_at",
|
|
60
|
+
),
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
/// Entry point for the `import-traces` subcommand.
|
|
64
|
+
pub async fn run(dump_dir: &str) -> Result<()> {
|
|
65
|
+
let cfg = ServerConfig::from_env()?;
|
|
66
|
+
cfg.ensure_dirs()?;
|
|
67
|
+
let signer: Arc<dyn ciris_keyring::HardwareSigner> = Arc::from(federation_signer(&cfg)?);
|
|
68
|
+
let engine = Engine::with_hardware_signer(signer, &cfg.dsn())
|
|
69
|
+
.await
|
|
70
|
+
.context("open persist Engine for import")?;
|
|
71
|
+
|
|
72
|
+
let path = Path::new(dump_dir).join("accord_traces.jsonl.gz");
|
|
73
|
+
let path = if path.exists() {
|
|
74
|
+
path
|
|
75
|
+
} else {
|
|
76
|
+
Path::new(dump_dir).join("accord_traces.jsonl") // accept a pre-gunzipped dump too
|
|
77
|
+
};
|
|
78
|
+
tracing::info!(dump = %path.display(), dsn = %cfg.dsn(), "importing legacy traces as CEG objects");
|
|
79
|
+
|
|
80
|
+
let file = std::fs::File::open(&path).with_context(|| format!("open {}", path.display()))?;
|
|
81
|
+
let reader: Box<dyn std::io::Read> = if path.extension().is_some_and(|e| e == "gz") {
|
|
82
|
+
Box::new(GzDecoder::new(file))
|
|
83
|
+
} else {
|
|
84
|
+
Box::new(file)
|
|
85
|
+
};
|
|
86
|
+
// Tolerant JSONL reader: accumulate lines until a complete JSON value parses
|
|
87
|
+
// (recovers multi-line records — the ragged ~30%), and skip a genuinely
|
|
88
|
+
// corrupt record by resyncing at the next line (serde's streaming reader
|
|
89
|
+
// can't — it halts at the first bad value).
|
|
90
|
+
use std::io::BufRead;
|
|
91
|
+
let lines = std::io::BufReader::new(reader).lines();
|
|
92
|
+
let mut buf = String::new();
|
|
93
|
+
|
|
94
|
+
let (mut seen, mut inserted, mut conflicted, mut errored, mut unparsed, mut salvaged) =
|
|
95
|
+
(0u64, 0u64, 0u64, 0u64, 0u64, 0u64);
|
|
96
|
+
for line in lines {
|
|
97
|
+
let line = line.context("read dump line")?;
|
|
98
|
+
if buf.is_empty() {
|
|
99
|
+
buf.push_str(&line);
|
|
100
|
+
} else {
|
|
101
|
+
buf.push('\n');
|
|
102
|
+
buf.push_str(&line);
|
|
103
|
+
}
|
|
104
|
+
let mut was_salvaged = false;
|
|
105
|
+
let row: Value = match serde_json::from_str(&buf) {
|
|
106
|
+
Ok(v) => {
|
|
107
|
+
buf.clear();
|
|
108
|
+
v
|
|
109
|
+
}
|
|
110
|
+
Err(e) if e.is_eof() => continue, // incomplete multi-line record — keep accumulating
|
|
111
|
+
Err(_) => {
|
|
112
|
+
// Complete but malformed: the dump's systematic export bug —
|
|
113
|
+
// stringified-JSON fields escape inner quotes as `\\"` (escaped
|
|
114
|
+
// backslash + bare quote, which closes the string early) instead
|
|
115
|
+
// of `\"`. Salvage by un-doubling `\\"` → `\"` and retrying
|
|
116
|
+
// (a few passes for multi-level nesting).
|
|
117
|
+
let mut repaired = buf.clone();
|
|
118
|
+
buf.clear();
|
|
119
|
+
let mut got: Option<Value> = None;
|
|
120
|
+
for _ in 0..4 {
|
|
121
|
+
let next = repaired.replace("\\\\\"", "\\\"");
|
|
122
|
+
if next == repaired {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
repaired = next;
|
|
126
|
+
if let Ok(v) = serde_json::from_str::<Value>(&repaired) {
|
|
127
|
+
got = Some(v);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
match got {
|
|
132
|
+
Some(v) => {
|
|
133
|
+
salvaged += 1;
|
|
134
|
+
was_salvaged = true;
|
|
135
|
+
v
|
|
136
|
+
}
|
|
137
|
+
None => {
|
|
138
|
+
unparsed += 1;
|
|
139
|
+
if unparsed <= 5 {
|
|
140
|
+
tracing::warn!("skipping unparseable dump record (unrepairable)");
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
seen += 1;
|
|
148
|
+
let bytes = match reconstruct_batch(&row, was_salvaged) {
|
|
149
|
+
Some(b) => b,
|
|
150
|
+
None => {
|
|
151
|
+
errored += 1;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
match engine
|
|
156
|
+
.receive_and_persist_pre_verified(&bytes, &NullScrubber)
|
|
157
|
+
.await
|
|
158
|
+
{
|
|
159
|
+
Ok(s) => {
|
|
160
|
+
inserted += s.trace_events_inserted as u64;
|
|
161
|
+
conflicted += s.trace_events_conflicted as u64;
|
|
162
|
+
}
|
|
163
|
+
Err(e) => {
|
|
164
|
+
errored += 1;
|
|
165
|
+
if errored <= 10 {
|
|
166
|
+
let tid = row.get("trace_id").and_then(Value::as_str).unwrap_or("?");
|
|
167
|
+
tracing::warn!(trace_id = %tid, error = %e, "import: row rejected");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if seen % 1000 == 0 {
|
|
172
|
+
tracing::info!(seen, inserted, conflicted, errored, "import progress");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
tracing::info!(
|
|
176
|
+
seen,
|
|
177
|
+
inserted,
|
|
178
|
+
conflicted,
|
|
179
|
+
errored,
|
|
180
|
+
unparsed,
|
|
181
|
+
salvaged,
|
|
182
|
+
"legacy trace import complete"
|
|
183
|
+
);
|
|
184
|
+
Ok(())
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/// Reconstruct one flat 1.9.x lens row into a CEG `BatchEnvelope` JSON (bytes).
|
|
188
|
+
/// Returns `None` if the row lacks the minimum identity fields.
|
|
189
|
+
fn reconstruct_batch(row: &Value, salvaged: bool) -> Option<Vec<u8>> {
|
|
190
|
+
let s = |k: &str| row.get(k).and_then(Value::as_str);
|
|
191
|
+
let trace_id = s("trace_id")?;
|
|
192
|
+
let thought_id = s("thought_id")?;
|
|
193
|
+
let started_at = s("started_at")?;
|
|
194
|
+
let completed_at = s("completed_at").unwrap_or(started_at);
|
|
195
|
+
let level = s("trace_level").unwrap_or("generic");
|
|
196
|
+
// persist accepts a CLOSED schema set; "2.7.legacy" is its designated bucket
|
|
197
|
+
// for pre-2.7.8.9 traces. The original lens schema (e.g. 1.9.3) + signature
|
|
198
|
+
// are preserved in a provenance component below — the auditable ragged edge.
|
|
199
|
+
let orig_schema = s("schema_version").unwrap_or("(absent)");
|
|
200
|
+
let schema_version = "2.7.legacy";
|
|
201
|
+
|
|
202
|
+
let mut components = Vec::new();
|
|
203
|
+
for (col, ctype, etype, ts_col) in COMPONENTS {
|
|
204
|
+
if let Some(data) = row.get(*col).filter(|v| v.is_object()) {
|
|
205
|
+
let ts = s(ts_col).unwrap_or(started_at);
|
|
206
|
+
components.push(json!({
|
|
207
|
+
"component_type": ctype,
|
|
208
|
+
"event_type": etype,
|
|
209
|
+
"timestamp": ts,
|
|
210
|
+
"data": data,
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Provenance component — the ragged edge, made auditable: original lens
|
|
215
|
+
// schema + the legacy signature that signed the 1.9.x bytes (not re-verifiable
|
|
216
|
+
// against this reconstruction). `unknown` event_type rides persist's
|
|
217
|
+
// serde(other) fallback.
|
|
218
|
+
components.push(json!({
|
|
219
|
+
"component_type": "observation",
|
|
220
|
+
"event_type": "unknown",
|
|
221
|
+
"timestamp": started_at,
|
|
222
|
+
"data": {
|
|
223
|
+
"_imported_from": "cirislens-timescaledb",
|
|
224
|
+
"legacy_schema_version": orig_schema,
|
|
225
|
+
"legacy_signature": s("signature").unwrap_or(""),
|
|
226
|
+
"legacy_signature_key_id": s("signature_key_id").unwrap_or(""),
|
|
227
|
+
// The raggedest edge: this record's JSON was repaired (the export's
|
|
228
|
+
// `\\"`→`\"` mis-escaping in stringified-JSON fields) before import.
|
|
229
|
+
"_salvaged": salvaged,
|
|
230
|
+
},
|
|
231
|
+
}));
|
|
232
|
+
|
|
233
|
+
let mut trace = Map::new();
|
|
234
|
+
trace.insert("trace_id".into(), json!(trace_id));
|
|
235
|
+
trace.insert("thought_id".into(), json!(thought_id));
|
|
236
|
+
if let Some(t) = s("task_id") {
|
|
237
|
+
trace.insert("task_id".into(), json!(t));
|
|
238
|
+
}
|
|
239
|
+
trace.insert(
|
|
240
|
+
"agent_id_hash".into(),
|
|
241
|
+
json!(s("agent_id_hash").unwrap_or("legacy")),
|
|
242
|
+
);
|
|
243
|
+
trace.insert("started_at".into(), json!(started_at));
|
|
244
|
+
trace.insert("completed_at".into(), json!(completed_at));
|
|
245
|
+
trace.insert("trace_level".into(), json!(level));
|
|
246
|
+
trace.insert("trace_schema_version".into(), json!(schema_version));
|
|
247
|
+
trace.insert("components".into(), json!(components));
|
|
248
|
+
trace.insert("cohort_scope".into(), json!("federation"));
|
|
249
|
+
// Provenance: the legacy signature signed the 1.9.x payload, not this
|
|
250
|
+
// reconstruction — preserved, not re-verified (imported pre-verified).
|
|
251
|
+
trace.insert("signature".into(), json!(s("signature").unwrap_or("")));
|
|
252
|
+
trace.insert(
|
|
253
|
+
"signature_key_id".into(),
|
|
254
|
+
json!(s("signature_key_id").unwrap_or("imported:legacy")),
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
let consent = s("consent_timestamp").unwrap_or(started_at);
|
|
258
|
+
let envelope = json!({
|
|
259
|
+
"events": [{ "event_type": "complete_trace", "trace_level": level, "trace": Value::Object(trace) }],
|
|
260
|
+
"batch_timestamp": started_at,
|
|
261
|
+
"consent_timestamp": consent,
|
|
262
|
+
"trace_level": level,
|
|
263
|
+
"trace_schema_version": schema_version,
|
|
264
|
+
});
|
|
265
|
+
Some(envelope.to_string().into_bytes())
|
|
266
|
+
}
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
mod compose;
|
|
28
28
|
mod config;
|
|
29
|
+
mod import;
|
|
29
30
|
/// The `ciris-canonical` founder-quorum (steward-key replacement) — shared with
|
|
30
31
|
/// the registry slice at Server 0.5 (CIRISServer#1; FSD/REGISTRY_FOLD_DERISK.md).
|
|
31
32
|
pub mod quorum;
|
|
@@ -46,6 +47,12 @@ pub async fn run() -> Result<()> {
|
|
|
46
47
|
compose::serve(cfg).await
|
|
47
48
|
}
|
|
48
49
|
|
|
50
|
+
/// Import the legacy CIRISLens TimescaleDB trace dump into the persist corpus as
|
|
51
|
+
/// CEG objects (the `import-traces <dump-dir>` subcommand). See `src/import.rs`.
|
|
52
|
+
pub async fn import_traces(dump_dir: &str) -> Result<()> {
|
|
53
|
+
import::run(dump_dir).await
|
|
54
|
+
}
|
|
55
|
+
|
|
49
56
|
/// Initialize tracing (shared by the binary and the wheel entry point).
|
|
50
57
|
pub fn init_tracing() {
|
|
51
58
|
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
|
|
@@ -61,25 +68,52 @@ pub fn init_tracing() {
|
|
|
61
68
|
mod python {
|
|
62
69
|
use pyo3::prelude::*;
|
|
63
70
|
|
|
71
|
+
fn rt_block_on<F: std::future::Future<Output = anyhow::Result<()>>>(fut: F) -> PyResult<()> {
|
|
72
|
+
// ONE multi-thread runtime; the node spawns onto it (never a second
|
|
73
|
+
// runtime around the Engine — the persist dual-runtime-deadlock rule).
|
|
74
|
+
let rt = tokio::runtime::Runtime::new()
|
|
75
|
+
.map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?;
|
|
76
|
+
rt.block_on(fut)
|
|
77
|
+
.map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))
|
|
78
|
+
}
|
|
79
|
+
|
|
64
80
|
/// Console entry point: `pip install ciris-server` → the `ciris-server`
|
|
65
|
-
/// command (pyproject `[project.scripts]`).
|
|
66
|
-
///
|
|
81
|
+
/// command (pyproject `[project.scripts]`). Mirrors the binary's CLI:
|
|
82
|
+
/// `ciris-server import-traces <dump-dir>` runs the legacy-trace import;
|
|
83
|
+
/// otherwise boots a zero-setup node (mode = server, trusts `ciris-canonical`).
|
|
67
84
|
#[pyfunction]
|
|
68
85
|
#[pyo3(name = "main")]
|
|
69
86
|
fn py_main() -> PyResult<()> {
|
|
70
87
|
crate::init_tracing();
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
88
|
+
let mut args = std::env::args().skip(1);
|
|
89
|
+
match args.next().as_deref() {
|
|
90
|
+
Some("import-traces") => {
|
|
91
|
+
let dir = args.next().ok_or_else(|| {
|
|
92
|
+
pyo3::exceptions::PyRuntimeError::new_err(
|
|
93
|
+
"usage: ciris-server import-traces <dump-dir>",
|
|
94
|
+
)
|
|
95
|
+
})?;
|
|
96
|
+
rt_block_on(crate::import_traces(&dir))
|
|
97
|
+
}
|
|
98
|
+
_ => rt_block_on(crate::run()),
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// `ciris_server.import_traces(dump_dir)` — programmatic legacy-trace import
|
|
103
|
+
/// for a pip-only bridge (the CIRISLens TimescaleDB dump → persist corpus as
|
|
104
|
+
/// CEG objects). Reads `CIRIS_HOME`/DSN from the environment, same as the node.
|
|
105
|
+
#[pyfunction]
|
|
106
|
+
#[pyo3(name = "import_traces")]
|
|
107
|
+
fn py_import_traces(dump_dir: String) -> PyResult<()> {
|
|
108
|
+
crate::init_tracing();
|
|
109
|
+
rt_block_on(crate::import_traces(&dump_dir))
|
|
77
110
|
}
|
|
78
111
|
|
|
79
112
|
/// `import ciris_server` — the composition CIRISAgent embeds.
|
|
80
113
|
#[pymodule]
|
|
81
114
|
fn ciris_server(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
82
115
|
m.add_function(wrap_pyfunction!(py_main, m)?)?;
|
|
116
|
+
m.add_function(wrap_pyfunction!(py_import_traces, m)?)?;
|
|
83
117
|
// Re-export lens-core's Python surface so CIRISAgent can swap
|
|
84
118
|
// `from ciris_lens_core import LensClient` → `from ciris_server import
|
|
85
119
|
// LensClient` (drop-in). One wheel bundles the lens slice; registry +
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//! CIRISServer binary — the headless fabric node entry point.
|
|
2
|
+
//!
|
|
3
|
+
//! Thin shell: all composition lives in the `ciris_server` library
|
|
4
|
+
//! (src/lib.rs), which is ALSO built as a PyO3 abi3 wheel that CIRISAgent
|
|
5
|
+
//! consumes. `agent = fabric node + brain` — one cohabitation composition, two
|
|
6
|
+
//! shapes (MISSION.md §1.2/§6). See lib.rs and MISSION.md.
|
|
7
|
+
|
|
8
|
+
use anyhow::Result;
|
|
9
|
+
|
|
10
|
+
#[tokio::main]
|
|
11
|
+
async fn main() -> Result<()> {
|
|
12
|
+
ciris_server::init_tracing();
|
|
13
|
+
let mut args = std::env::args().skip(1);
|
|
14
|
+
match args.next().as_deref() {
|
|
15
|
+
// `ciris-server import-traces <dump-dir>` — one-shot legacy-trace import
|
|
16
|
+
// (CIRISLens TimescaleDB dump → persist corpus as CEG objects).
|
|
17
|
+
Some("import-traces") => {
|
|
18
|
+
let dump_dir = args
|
|
19
|
+
.next()
|
|
20
|
+
.ok_or_else(|| anyhow::anyhow!("usage: ciris-server import-traces <dump-dir>"))?;
|
|
21
|
+
ciris_server::import_traces(&dump_dir).await
|
|
22
|
+
}
|
|
23
|
+
// Default: boot the fabric node.
|
|
24
|
+
_ => ciris_server::run().await,
|
|
25
|
+
}
|
|
26
|
+
}
|
ciris_server-0.2.0/src/main.rs
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//! CIRISServer binary — the headless fabric node entry point.
|
|
2
|
-
//!
|
|
3
|
-
//! Thin shell: all composition lives in the `ciris_server` library
|
|
4
|
-
//! (src/lib.rs), which is ALSO built as a PyO3 abi3 wheel that CIRISAgent
|
|
5
|
-
//! consumes. `agent = fabric node + brain` — one cohabitation composition, two
|
|
6
|
-
//! shapes (MISSION.md §1.2/§6). See lib.rs and MISSION.md.
|
|
7
|
-
|
|
8
|
-
use anyhow::Result;
|
|
9
|
-
|
|
10
|
-
#[tokio::main]
|
|
11
|
-
async fn main() -> Result<()> {
|
|
12
|
-
ciris_server::init_tracing();
|
|
13
|
-
ciris_server::run().await
|
|
14
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/.github/workflows/bench.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/PUBLIC_SCHEMA_CONTRACT.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/docs/STANDARDS_COMPARISON.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/python/ciris_lens_core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/canonical/ceg_egress.rs
RENAMED
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/capacity/attestation.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/axis_metrics.rs
RENAMED
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/coherence_ratchet.rs
RENAMED
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/correlated_action.rs
RENAMED
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/detector/distributive_access.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ciris_server-0.2.0 → ciris_server-0.2.2}/crates/ciris-lens-core/src/scoring/axis_calibration.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|