Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
79aaa49
plan: clarify ConPTY support contract
passcod Sep 24, 2026
fda4566
plan: expose PTY capability queries
passcod Sep 24, 2026
40fcd85
plan: map ConPTY recovery sequence
passcod Sep 24, 2026
d0eb580
plan: decompose ConPTY recovery tasks
passcod Sep 25, 2026
c852725
plan: separate ConPTY recovery from capability API
passcod Sep 25, 2026
ea89dbd
feat(pty): resolve Windows executables
passcod Aug 25, 2026
4f8132e
feat(pty): resolve ConPTY capabilities dynamically
passcod Aug 25, 2026
5f43231
feat(pty): create ConPTY named pipes
passcod Aug 25, 2026
5c7715c
feat(pty): own ConPTY startup state
passcod Aug 25, 2026
8ff220c
feat(pty): own ConPTY child processes
passcod Aug 25, 2026
e4fe2ce
feat(pty): share ConPTY controller ownership
passcod Aug 25, 2026
27f50b1
feat(pty): create ConPTY processes exactly
passcod Aug 25, 2026
ad4e1f1
feat(pty): integrate ConPTY spawn provider
passcod Aug 25, 2026
be2be8a
test(pty): adopt wrapper-native ConPTY API
passcod Aug 26, 2026
40cfb1f
test(pty): cover ConPTY lifecycle failures
passcod Aug 26, 2026
6ac03ba
fix(pty): let ConPTY install standard handles
passcod Aug 26, 2026
92c085e
fix(pty): release canceled ConPTY waits
passcod Aug 26, 2026
314cb30
fix(pty): detach ConPTY waits from Tokio runtimes
passcod Sep 25, 2026
c59cc98
fix(job-object): keep rollback armed through finalization
passcod Sep 25, 2026
b78fc3b
feat(pty): expose backend capability queries
passcod Sep 25, 2026
c63b767
test(pty): cover capability queries across targets
passcod Sep 25, 2026
9c8469a
fix(pty): attach ConPTY standard handles
passcod Sep 25, 2026
a1aedf6
docs(pty): document Windows ConPTY support
passcod Sep 25, 2026
a480ad1
fix(pty): release ConPTY startup before hooks
passcod Sep 25, 2026
bf2544e
revert: retain ConPTY startup release until commit
passcod Sep 25, 2026
3e8865e
test(pty): diagnose pre-commit ConPTY child failure
passcod Sep 25, 2026
29ed0fb
test(pty): wait for descendants after ConPTY commit
passcod Sep 25, 2026
f9f6f40
test(pty): cover post-exit ConPTY kills
passcod Sep 25, 2026
3ad8858
test(pty): remove invalid pre-return descendant case
passcod Sep 25, 2026
4a7a76c
fix(pty): reap failed ConPTY spawns off-thread
passcod Sep 25, 2026
55df8e4
fix(pty): isolate ConPTY cleanup diagnostics
passcod Sep 26, 2026
150f5c5
fix(pty): serialize ConPTY cleanup diagnostics
passcod Sep 26, 2026
983e0c9
fix(pty): preserve Windows executable entries
passcod Sep 26, 2026
7e1c1df
fix(pty): detach pseudoconsole close workers
passcod Sep 26, 2026
455268c
test(pty): skip unavailable ConPTY spawns
passcod Sep 26, 2026
a3bd636
test(pty): bound Windows process cleanup
passcod Sep 26, 2026
f3ba544
test(pty): scan terminal markers incrementally
passcod Sep 26, 2026
6f200a5
test(provider): cover transaction commit panics
passcod Sep 26, 2026
fd6cdbb
fix(windows): retain provider rollback through finalization
passcod Sep 26, 2026
3acbb72
fix(windows): own completion ports across blocking waits
passcod Sep 26, 2026
22f1deb
fix(pty): suppress inline close failure diagnostics
passcod Sep 26, 2026
b3b16f9
fix(pty): validate Windows PTY size before hooks
passcod Sep 26, 2026
97a9946
test(pty): bound synchronous lifecycle polling
passcod Sep 26, 2026
502890a
test(pty): require ConPTY on supported Windows
passcod Sep 26, 2026
ad4bf9a
ci(pty): compile unsupported-target integration tests
passcod Sep 26, 2026
55cd76e
docs(provider): scope panic recovery to unwinding
passcod Sep 26, 2026
0759689
docs(pty): record ConPTY FFI premises
passcod Sep 26, 2026
9fc3ee8
docs(pty): document the portable migration flow
passcod Sep 26, 2026
14c3ae5
fix(windows): wait for complete JobObject drain
passcod Sep 26, 2026
a62ddfd
docs(windows): state ConPTY platform assumptions
passcod Sep 26, 2026
5dcbd71
fix(windows): preserve JobObject polling cadence
passcod Sep 26, 2026
cf34f48
test(provider): cover committed transaction ownership transfer
passcod Sep 26, 2026
af8ec83
fix(provider): transfer committed residue with child
passcod Sep 26, 2026
4059d7a
fix(pty): release committed rollback resources
passcod Sep 26, 2026
77b65b2
docs(provider): define committed residue ownership
passcod Sep 26, 2026
ec04908
test(provider): keep lifecycle fixtures lint-clean
passcod Sep 26, 2026
a5bd203
test(lifecycle): expose child custody failures
passcod Sep 26, 2026
0056a00
fix(provider): keep sidecar formatting residue-blind
passcod Sep 26, 2026
4312881
fix(lifecycle): retain child cleanup custody
passcod Sep 26, 2026
7fa0f13
docs(lifecycle): describe detached child layers
passcod Sep 26, 2026
bc029eb
test(windows): expose prepared custody escapes
passcod Sep 26, 2026
d513052
fix(windows): enforce prepared state custody
passcod Sep 26, 2026
41a34c1
fix(tests): guard bounded subprocess setup
passcod Sep 26, 2026
0c9f35d
fix(windows): keep minimal Tokio build warning-free
passcod Sep 26, 2026
79ef81a
test(windows): cover stable prepared custody
passcod Sep 27, 2026
3d54e71
fix(windows): retain stable prepared custody
passcod Sep 27, 2026
f2a87f4
fix(tokio): order prepared output-wait cleanup
passcod Sep 27, 2026
dc7a851
fix(windows): revoke prepared state on owner drop
passcod Sep 27, 2026
1ad8e69
fix(windows): make final JobObject disarm terminal
passcod Sep 27, 2026
b011036
fix(windows): linearize prepared access closure
passcod Sep 27, 2026
2e540f2
fix(windows): retain spawn cleanup with child
passcod Sep 27, 2026
e4e9b6e
fix(windows): gate job test support by feature
passcod Sep 27, 2026
4262a0d
fix(tests): gate wrapper lookup macro
passcod Sep 27, 2026
aedd2a3
fix(tests): isolate pipe close checks
passcod Sep 27, 2026
67ffeb8
test(windows): prove prepared closure paths
passcod Sep 27, 2026
f78720f
fix(tests): make descriptor fixture portable
passcod Sep 27, 2026
55cd40e
fix(tests): bound descriptor closure wait
passcod Sep 27, 2026
c1ff2b7
test(windows): prove prepared extraction transfer
passcod Sep 27, 2026
1024ae7
test(miri): ignore native cleanup fixture
passcod Sep 27, 2026
a2a67de
test(miri): ignore native subprocess regressions
passcod Sep 27, 2026
8175760
test(miri): make panic quarantine payloads leak-free
passcod Sep 27, 2026
3c2cea4
fix(lifecycle): contain tracing subscriber panics
passcod Sep 27, 2026
710e164
fix(windows): validate prepared custody before publication
passcod Sep 27, 2026
2c09898
fix(unix): separate spawned identity from live signalling
passcod Sep 27, 2026
bbb54da
fix(tokio): close extracted JobObject resources
passcod Sep 27, 2026
99a340c
test(windows): bound final-owner tracing isolation
passcod Sep 27, 2026
b7926fb
docs: correct lifecycle and supervision contracts
passcod Sep 27, 2026
07945f0
fix(windows): scope JobObject extraction probes
passcod Sep 27, 2026
e9f55b2
test(miri): ignore native signal seam fixtures
passcod Sep 27, 2026
1a04500
style(pty): simplify rollback kill error guard
passcod Sep 27, 2026
7c58341
style(windows): normalize PTY validation paths
passcod Sep 27, 2026
4723138
test(tracing): isolate lifecycle subscriber regressions
passcod Sep 27, 2026
d3d2ebf
test(windows): prove prepared reader publication ordering
passcod Sep 27, 2026
a9ccd1a
test(unix): make shared signalling proof deterministic
passcod Sep 27, 2026
27a6cca
test(windows): prove JobObject drain resource closure
passcod Sep 27, 2026
7fa65ec
test(windows): prove watchdog stall readiness
passcod Sep 27, 2026
ac94c4f
test(ci): lock downstream README fixtures
passcod Sep 27, 2026
b893f2a
test(windows): isolate JobObject custodian assertions
passcod Sep 27, 2026
213e282
test(windows): own prepared reader setup workers
passcod Sep 27, 2026
111e50f
test(unix): prove signal mutex acquisition
passcod Sep 27, 2026
6da0932
test(windows): measure warmed handle slope
passcod Sep 28, 2026
ea5d450
ci: add explicit major-release semver path
passcod Sep 28, 2026
2536d17
ci: restrict major baseline to base ancestry
passcod Sep 28, 2026
dde5378
ci: keep semver compatibility checks strict
passcod Sep 28, 2026
1d50d7c
test(windows): decouple JobObject extraction fixture
passcod Sep 29, 2026
ad52bbe
fix(windows): preserve JobObject limit state
passcod Sep 29, 2026
e8ed9ee
fix(windows): verify JobObject extraction disarm
passcod Sep 29, 2026
6a4d416
test(windows): prove terminal JobObject set ordering
passcod Sep 29, 2026
cbbf9af
test(windows): extend terminal ordering coverage
passcod Sep 29, 2026
9202477
test(windows): distinguish final-owner call attempts
passcod Sep 29, 2026
1224562
ci: check out exact triggering head
passcod Sep 29, 2026
a4a47de
docs: distinguish live and spawned child identity
passcod Sep 29, 2026
627a5a2
docs: require terminal spawned identity capability
passcod Sep 29, 2026
474aefe
unplan: command API and PTY provider
passcod Oct 1, 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
60 changes: 60 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ jobs:

name: "Test on ${{ matrix.platform }} with Rust ${{ matrix.toolchain }} (feat: ${{ matrix.features }})"
runs-on: "${{ matrix.platform }}-latest"
timeout-minutes: 30
env:
PROCESS_WRAP_EXPECT_CONPTY: "${{ matrix.platform == 'windows' && '1' || '0' }}"

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -41,6 +45,11 @@ jobs:
rustup default ${{ matrix.toolchain }}
rustup component add clippy

- name: Report expected ConPTY mode
if: matrix.platform == 'windows'
shell: pwsh
run: Write-Host "PROCESS_WRAP_EXPECT_CONPTY=$env:PROCESS_WRAP_EXPECT_CONPTY"

- run: tests/multiproc_helper.rs 1 1

- name: Test defaults plus frontend
Expand All @@ -50,6 +59,14 @@ jobs:
if: matrix.toolchain == 'stable'
run: cargo test --locked --no-default-features --features ${{ matrix.features }} --all-targets

- name: Compile PTY README example as a downstream crate
if: matrix.features == 'pty'
run: cargo check --locked --manifest-path tests/readme/pty/Cargo.toml

- name: Compile Windows README example as a downstream crate
if: matrix.platform == 'windows' && matrix.features == 'pty'
run: cargo check --locked --manifest-path tests/readme/windows/Cargo.toml

- run: cargo clippy --locked --features ${{ matrix.features }} --all-targets

no-default-features:
Expand All @@ -59,6 +76,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -68,6 +86,25 @@ jobs:

- run: cargo check --locked --no-default-features --lib

windows-production-features:
name: Check Windows production feature closure
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
run: |
rustup toolchain install --profile minimal --no-self-update stable
rustup default stable
rustup target add x86_64-pc-windows-gnu

- name: Check Tokio JobObject production library
run: cargo check --locked --target x86_64-pc-windows-gnu --no-default-features --features tokio1,job-object --lib

# Miri deliberately excludes native process creation and FFI.
miri-process-free:
name: Miri (process-free state and ownership)
Expand All @@ -76,6 +113,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -101,10 +139,14 @@ jobs:

name: "Test all features on ${{ matrix.platform }}"
runs-on: "${{ matrix.platform }}-latest"
timeout-minutes: 30
env:
PROCESS_WRAP_EXPECT_CONPTY: "${{ matrix.platform == 'windows' && '1' || '0' }}"

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -114,6 +156,11 @@ jobs:
rustup default stable
rustup component add clippy

- name: Report expected ConPTY mode
if: matrix.platform == 'windows'
shell: pwsh
run: Write-Host "PROCESS_WRAP_EXPECT_CONPTY=$env:PROCESS_WRAP_EXPECT_CONPTY"

- run: tests/multiproc_helper.rs 1 1
- run: cargo test --locked --all-features --all-targets
- run: cargo clippy --locked --all-features --all-targets
Expand All @@ -125,6 +172,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand Down Expand Up @@ -163,6 +211,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -184,13 +233,18 @@ jobs:
cargo clippy --locked --target "${{ matrix.target }}" --no-default-features --features pty --lib
fi

- name: Compile unsupported PTY integration test
if: matrix.target == 'aarch64-apple-ios'
run: cargo check --locked --target aarch64-apple-ios --all-features --test tokio_pty_unsupported

rustdoc:
name: Rustdoc
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -206,13 +260,17 @@ jobs:
- name: Test documentation examples
run: cargo test --locked --all-features --doc

- name: Compile PTY README example as a downstream crate
run: cargo check --locked --manifest-path tests/readme/pty/Cargo.toml

package:
name: Package contents
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand All @@ -233,6 +291,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
fetch-depth: 0
persist-credentials: false

Expand Down Expand Up @@ -260,6 +319,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- name: Configure Rust
Expand Down
10 changes: 9 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,12 @@ windows = { version = "0.62.2", optional = true }
# as process-wrap is carefully designed to never expose windows's types

[dev-dependencies]
remoteprocess = "0.5.0"
tempfile = { version = "3.20.0", default-features = false }
tokio = { version = "1.38.2", features = ["io-util", "macros", "process", "rt", "rt-multi-thread", "time"] }

[target.'cfg(any(target_os = "freebsd", target_os = "linux", target_os = "macos"))'.dev-dependencies]
remoteprocess = "0.5.0"

[features]
default = ["creation-flags", "job-object", "kill-on-drop", "process-group", "process-session", "tracing"]

Expand All @@ -67,7 +69,13 @@ pty = [
"tokio/net",
"dep:windows",
"windows/Win32_Globalization",
"windows/Win32_Security",
"windows/Win32_Storage_FileSystem",
"windows/Win32_System_Console",
"windows/Win32_System_Environment",
"windows/Win32_System_LibraryLoader",
"windows/Win32_System_Pipes",
"windows/Win32_System_SystemInformation",
"windows/Win32_System_Threading",
]

Expand Down
Loading
Loading