Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
706a256
Add standalone dlcapt workspace crate stub
Jul 16, 2026
21bd47b
Migrate dlcapt sources into persisting-dlcapt
Jul 16, 2026
74e3cd6
Fix persisting-dlcapt strict Clippy warnings
Jul 16, 2026
75db299
Add dlcapt HTTP proxy integration regressions
Jul 16, 2026
35e5ecb
Format existing CLI sources
Jul 16, 2026
4be52ee
Strengthen dlcapt HTTP proxy assertions
Jul 16, 2026
fe0288d
Add sanitized dlcapt configuration examples
Jul 16, 2026
2de98ad
Package prebuilt dlcapt release archive
Jul 16, 2026
ab1c970
Harden dlcapt release archive validation
Jul 16, 2026
36a6597
Add dlcapt CI, NOTICE, and guide entries
Jul 16, 2026
a881dca
Retain verified dlcapt release archive
Jul 16, 2026
a991cd6
Strengthen dlcapt example config contract
Jul 16, 2026
5e5a464
fix(dlcapt): replace internal hostname in test with placeholder
Jul 16, 2026
f97c4d7
fix(dlcapt): remove needless borrow in config_examples test
Jul 16, 2026
50e2f67
fix(dlcapt): gate release archive contents
Jul 16, 2026
9ba87ca
ci(dlcapt): exercise archive sanitization gate
Jul 16, 2026
39b4c9f
fix(dlcapt): close recursive archive gates
Jul 16, 2026
5b5b98d
fix(dlcapt): reject private archive path components
Jul 16, 2026
ebbc29d
Add reusable dlcapt foreground service
Jul 16, 2026
7e36e8e
Add feature-gated dlcapt proxy backend
Jul 16, 2026
abe320f
Document dlcapt CLI proxy backend
Jul 16, 2026
dab8fed
Clarify dlcapt debug option boundary
Jul 16, 2026
365fd5a
fix(dlcapt): cover CLI feature CI
Jul 16, 2026
fdfe90d
chore(dlcapt): remove archive release workflow
Jul 16, 2026
ca16c6b
fix(dlcapt): document runnable local config
Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/workflows/dlcapt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: dlcapt

on:
push:
paths:
- "crates/persisting-dlcapt/**"
- "crates/persisting-cli/**"
- "Cargo.toml"
- "Cargo.lock"
- ".github/workflows/dlcapt.yml"
pull_request:
paths:
- "crates/persisting-dlcapt/**"
- "crates/persisting-cli/**"
- "Cargo.toml"
- "Cargo.lock"
- ".github/workflows/dlcapt.yml"

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Install protoc
run: sudo apt-get update && sudo apt-get install -y protobuf-compiler
- uses: Swatinem/rust-cache@v2
- name: fmt
run: cargo fmt --check
- name: check
run: cargo check -p persisting-dlcapt --all-targets --all-features --locked
- name: test
run: cargo test -p persisting-dlcapt --all-targets --all-features --locked
- name: clippy
run: cargo clippy -p persisting-dlcapt --all-targets --all-features --locked -- -D warnings
- name: doc
run: RUSTDOCFLAGS="-D warnings" cargo doc -p persisting-dlcapt --all-features --no-deps --locked
- name: build standalone dlcapt
run: cargo build -p persisting-dlcapt --locked
- name: test persisting-cli dlcapt feature
run: |
metadata="$(cargo metadata --no-deps --format-version 1 --locked)"
target_directory="$(jq -r '.target_directory' <<<"${metadata}")"
DLCAPT_BIN="${target_directory}/debug/dlcapt" \
cargo test -p persisting-cli --features dlcapt --locked
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,10 @@ __pycache__/
.venv/
*.abi3.so
crates/persisting-engine/ds/

# persisting-dlcapt runtime / release artifacts
crates/persisting-dlcapt/var/
crates/persisting-dlcapt/.capture/
crates/persisting-dlcapt/tmp/
.build-tmp/
target/dlcapt/
40 changes: 40 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ members = [
"crates/persisting-core",
"crates/persisting-capture",
"crates/persisting-cli",
"crates/persisting-dlcapt",
]

[workspace.package]
Expand Down
13 changes: 13 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
persisting-dlcapt
=================

This workspace includes `persisting-dlcapt`, migrated from
`capture/external/dlcapt` (source tree copy of first-party Rust sources).

Target package: persisting-dlcapt
License: Apache-2.0 (workspace policy)
Third-party source files copied verbatim outside Cargo crates.io
dependencies: none identified at migration time.

If additional vendored sources or incompatible licenses are discovered,
stop publication and obtain explicit clearance before release.
13 changes: 13 additions & 0 deletions crates/persisting-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ description = "Lightweight Persisting CLI (loads persisting-engine via dlopen)"
name = "persisting"
path = "src/main.rs"

[features]
default = []
dlcapt = ["dep:persisting-dlcapt"]

[dependencies]
anyhow = "1"
chrono = "0.4"
Expand All @@ -18,6 +22,7 @@ clap = { version = "4", features = ["derive", "env"] }
dirs = "6"
libloading = "0.8"
persisting-capture = { path = "../persisting-capture" }
persisting-dlcapt = { path = "../persisting-dlcapt", optional = true }
persisting-engine = { path = "../persisting-engine" }
persisting-proto = { path = "../persisting-proto" }
ron = "0.8"
Expand All @@ -29,3 +34,11 @@ termimad = "0.34"
toml = "0.8"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

[dev-dependencies]
tempfile = "3"

[[test]]
name = "dlcapt_backend_e2e"
path = "tests/dlcapt_backend_e2e.rs"
required-features = ["dlcapt"]
30 changes: 24 additions & 6 deletions crates/persisting-cli/src/judge_manual.rs
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,9 @@ mod tests {
fn fixed_manual_scores_story_scope() {
use persisting_capture::config::CaptureLevel;
use persisting_capture::engine::Call;
use persisting_capture::sink::{llm_request_summary_record, llm_response_record_with_content};
use persisting_capture::sink::{
llm_request_summary_record, llm_response_record_with_content,
};

let call = Call {
call_id: "c1".into(),
Expand Down Expand Up @@ -368,9 +370,15 @@ mod tests {
serde_json::to_string(&resp).unwrap(),
];
let story = story_from_replay_json(&records, "s", "s").unwrap();
let scores =
fixed_manual_scores(&story, JudgeScope::Story, &["default".into()], 100, None, None)
.unwrap();
let scores = fixed_manual_scores(
&story,
JudgeScope::Story,
&["default".into()],
100,
None,
None,
)
.unwrap();
assert_eq!(scores.len(), 1);
assert_eq!(scores[0].score, 100);
assert_eq!(scores[0].verdict, "pass");
Expand All @@ -381,7 +389,9 @@ mod tests {
fn fixed_manual_scores_rejects_out_of_range() {
use persisting_capture::config::CaptureLevel;
use persisting_capture::engine::Call;
use persisting_capture::sink::{llm_request_summary_record, llm_response_record_with_content};
use persisting_capture::sink::{
llm_request_summary_record, llm_response_record_with_content,
};

let call = Call {
call_id: "c1".into(),
Expand Down Expand Up @@ -417,6 +427,14 @@ mod tests {
serde_json::to_string(&resp).unwrap(),
];
let story = story_from_replay_json(&records, "s", "s").unwrap();
assert!(fixed_manual_scores(&story, JudgeScope::Story, &["default".into()], 101, None, None).is_err());
assert!(fixed_manual_scores(
&story,
JudgeScope::Story,
&["default".into()],
101,
None,
None
)
.is_err());
}
}
Loading
Loading