Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
447 commits
Select commit Hold shift + click to select a range
236c10b
perf: bound ChaCha UDP cipher state and HY2 receive credit
Oct 16, 2026
3d5fae3
fix(hysteria2): retire setup deadline after stream admission
Oct 16, 2026
2f9301a
perf(quic): notify only on queue capacity transitions
Oct 16, 2026
199a8e2
perf(shadowsocks): yield between native UDP sends
Oct 16, 2026
038dfdb
perf(xhttp): share four active H3 leases per connection
Oct 16, 2026
e553c38
perf(hysteria2): bound receive bursts and avoid needless fragmentation
Oct 16, 2026
2161bd3
fix(quic): keep receive progress during controlled UDP sends
Oct 16, 2026
2fc7156
fix(tun): retain ingress across transient queue pressure
Oct 16, 2026
3390482
perf(hysteria2): balance receive credit across TCP streams
Oct 16, 2026
83ff1ab
fix(hysteria2): bound submissions and share explicit-bandwidth sessions
Oct 16, 2026
4ba1077
perf(hysteria2): use cubic for automatic bandwidth
Oct 17, 2026
e322e2d
docs: publish representative TUN pressure results
Oct 17, 2026
f9a892b
perf(rule-providers): keep domain rules compact
Oct 17, 2026
aa730da
refactor(netstack): remove redundant TCP queue checks
Oct 17, 2026
389fe56
fix(geodata): load official sing and Meta country databases
Oct 17, 2026
c66757b
perf: compact referenced MetaDB categories
Oct 17, 2026
d96ffe8
perf: allocate TCP application queues on demand
Oct 17, 2026
e77c357
perf: share immutable proxy dispatcher registries
Oct 18, 2026
2fbe6d5
fix: expose DNS response queue drops in CLI warnings
Oct 18, 2026
b8d15da
docs: keep benchmark conclusions outside core
Oct 18, 2026
7900433
fix: initialize SS2022 handshakes and preserve half-close
Oct 18, 2026
a16d806
perf: encode XUDP destinations directly into send frames
Oct 18, 2026
c7e0677
refactor(tuic): support only UoT v2
Oct 18, 2026
7c3e68e
feat(network): apply shared physical egress policies
Oct 18, 2026
225ac79
feat(resource): accept bounded URI subscriptions and gzip downloads
Oct 18, 2026
e969d59
feat(routing): add functional routes and local process predicates
Oct 18, 2026
6959871
feat(controller): add bounded WebSocket streams and runtime logs
Oct 18, 2026
d0de1f9
feat(runtime): share bounded configuration application and rollback
Oct 18, 2026
c368287
feat(transports): share stream identities and SS2022 plugins
Oct 18, 2026
bc930e0
feat(vmess): add bounded mKCP transport over controlled UDP
Oct 18, 2026
57d214c
feat(quic): add HY2 Gecko and Realm client paths
Oct 18, 2026
a7dee4f
fix(masque): isolate runtime IPv6 packet budget shrink
Oct 18, 2026
322524c
feat(tun): extend native Linux routing and passive PMTU
Oct 18, 2026
a49ca56
feat(http): apply separate URL rewrite policies through Invoke
Oct 18, 2026
9dbb3d3
feat(http): add selective TLS interception and bounded H2 forwarding
Oct 18, 2026
5a96018
fix(resource): preserve supported subscription transport options
Oct 18, 2026
b95d24d
fix(mkcp): preserve pending replies after peer close
Oct 18, 2026
9b48b49
fix: complete mainline feature checks and reduce inline state
Oct 18, 2026
942aebe
fix(apple): set IPv6 traffic class on iOS and tvOS
Oct 18, 2026
6aa4d62
fix(kcptun): keep FEC portable without legacy std locks
Oct 18, 2026
edc29fb
fix: allow delayed VMess responses after request submission
Oct 19, 2026
62066dc
perf: bound mKCP transmit prefetch before copying
Oct 19, 2026
d737e80
perf: scope Shadowsocks UDP ciphers to associations
Oct 19, 2026
7bda80c
perf: bound shared mKCP receive payload credit
Oct 19, 2026
82d902b
fix: allow slow origins to consume HTTP uploads
Oct 19, 2026
3a8081e
perf: share bounded Hysteria2 sessions in automatic mode
Oct 19, 2026
d28461d
docs: clarify MASQUE path MTU discovery boundary
Oct 19, 2026
dc84ed0
docs: allow relaxed matched-reference 1Gbps targets
Oct 19, 2026
6d0174d
refactor: require smux v2 for kcptun
Oct 19, 2026
1c09aaf
fix: keep zero-credit smux streams from reserving send capacity
Oct 19, 2026
d3408b1
refactor: remove kcptun and its dedicated dependencies
Oct 19, 2026
ce251ec
refactor: remove mKCP transport support
Oct 19, 2026
0f73f47
test: align DNS route assertions with interface selectors
Oct 19, 2026
102b4ab
fix: refresh QUIC recovery timers after sending
Oct 19, 2026
9f3fd33
fix: start H2 response timeout after upload completes
Oct 19, 2026
f7e542a
docs: define HTTP snapshot and private material ownership
Oct 19, 2026
40e85c7
feat: compile flat HTTP rules and bounded URL actions
Oct 19, 2026
fc35e3e
feat: isolate private HTTP CA inputs and protected Windows handoff
Oct 19, 2026
9637245
feat: prepare ordered HTTP providers as immutable candidates
Oct 19, 2026
1ae9401
fix: keep disabled HTTP sources free of filesystem access
Oct 19, 2026
3fa41ec
feat: share HTTP resource preparation and session recovery through In…
Oct 19, 2026
e5892e1
feat: apply ordered HTTP header rules across H1 and H2
Oct 19, 2026
3eb444f
feat: enable bounded HTTP body replacement and exact replay
Oct 19, 2026
0fb98e3
feat: enable literal and regex HTTP body rewriting
Oct 19, 2026
915613a
feat: enable atomic JSON Patch without silent numeric rounding
Oct 19, 2026
6a492a2
feat: decode bounded HTTP content with negotiation-aware fallback
Oct 19, 2026
5cea86e
docs: finalize HTTP content and offline Invoke contracts
Oct 19, 2026
f6d9f25
fix: resolve HTTP resources through protected generation contexts
Oct 19, 2026
eb4a139
perf: allocate HTTP1 forwarding state only on its selected path
Oct 19, 2026
a49a8d5
fix: preserve HTTP capability and protected snapshot build boundaries
Oct 19, 2026
88e2842
perf: keep HTTP2 exchange state out of nested driver futures
Oct 19, 2026
73bfdf6
fix: enforce distinct MITM ports and clarify shared allocator policy
Oct 19, 2026
94a0953
Remove unused QUIC tuning fields
Oct 20, 2026
c730b11
Model bounded stale DNS cache entries
Oct 20, 2026
ed9917d
Serve stale DNS answers with bounded refresh
Oct 20, 2026
d4a622f
Expose bounded raw DNS records in Controller queries
Oct 20, 2026
b7548ec
Add generation-local Controller rule switches
Oct 20, 2026
86d29be
Model rematch routing controls
Oct 20, 2026
9593829
Execute bounded rematch decisions in routing and DNS
Oct 20, 2026
bb1b742
Support bounded Base64 and AGE foreground inputs
Oct 20, 2026
345b7e4
Apply concrete foreground Controller overrides
Oct 20, 2026
238f418
Reload foreground configuration through the candidate worker
Oct 20, 2026
aea353a
Authorize provider roots with bounded cache reads
Oct 20, 2026
7eb1463
Serve the shared Controller over an owned Linux Unix socket
Oct 20, 2026
1ec9740
Apply Linux Controller routing marks without losing YAML defaults
Oct 20, 2026
7a96da8
Scope Linux TUN routing by input interface
Oct 20, 2026
5cff2e1
Model opt-in IP4P endpoint conversion
Oct 20, 2026
1d92649
Convert IP4P only at controlled physical endpoint seams
Oct 20, 2026
ad52dce
feat(tun): validate bounded Linux ICMP echo forwarding
Oct 20, 2026
bfc8c2a
feat(tun): configure real Linux ICMP echo forwarding
Oct 20, 2026
bb8b735
feat(outbound): add controlled Linux TCP Fast Open
Oct 20, 2026
b71beff
test(tuic): pin cold early-data API boundary
Oct 20, 2026
9468e5a
feat(quic): add bounded same-socket GSO and ECN
Oct 20, 2026
7700104
chore(netstack): satisfy ICMP packet Clippy contracts
Oct 20, 2026
a25f8e4
chore: resolve final Linux Clippy findings
Oct 20, 2026
bb057fb
ci: run core tests on Ubuntu 26.04
Oct 20, 2026
4278b76
perf: share native TUIC associations across tracked UDP targets
Oct 20, 2026
9ddd003
feat: accept Mihomo client identity and HY2 input forms
Oct 20, 2026
bb254ce
feat: align WebSocket early data and XHTTP request options
Oct 20, 2026
34a1853
feat: support additional TLS profiles with standard H2 settings
Oct 20, 2026
df2a92a
fix: permit classic group selection with hybrid REALITY enabled
Oct 20, 2026
b4f417d
fix: give shared HY2 handshakes node-owned deadlines
Oct 20, 2026
a1a1da5
fix: align inbound names and bounded rule expression semantics
Oct 20, 2026
fe28d77
fix: preserve configured egress marks with native TUN routing
Oct 20, 2026
ebf6f71
feat: rotate file client identities at the physical TLS boundary
Oct 20, 2026
e5ed427
perf: share TUIC QUIC UDP associations across destinations
Oct 20, 2026
e58acb5
docs: synchronize bounded transport limit contracts
Oct 20, 2026
960ff9c
docs: clarify H1/H2 MITM and transparent H3 scope
Oct 21, 2026
538f818
feat: add safe opt-in Linux MPTCP dialing
Oct 21, 2026
0417e2e
feat: negotiate remote TCP Brutal through sing-mux
Oct 21, 2026
220b638
feat: apply TCP Brutal through owned physical sockets
Oct 21, 2026
4e28f32
fix: safely share sing-mux UDP destination streams
Oct 21, 2026
ff1cbd7
fix: allow delayed sing-mux replies after business uploads
Oct 21, 2026
7a807bf
fix: reduce h2mux backpressure in mixed traffic
Oct 21, 2026
f5d4955
fix: share packetaddr destinations across cancelled writes
Oct 21, 2026
eff4315
fix: avoid per-datagram XHTTP flushes in smux
Oct 21, 2026
8dd257b
fix: keep WireGuard peer work fair under receive pressure
Oct 21, 2026
96b9c19
chore: deduplicate Cargo feature activation
Oct 21, 2026
19e0e21
fix: retain complete logs and share Trojan UDP associations
Oct 21, 2026
63f792a
fix: share SOCKS5 UDP associations across managed destinations
Oct 22, 2026
1dbafb2
fix: make UDP association sharing capabilities explicit
Oct 22, 2026
0fc28a1
docs: align Controller config update contract
Oct 22, 2026
4012ed7
fix: allow TrustTunnel H2 prior knowledge without ALPN
Oct 22, 2026
293648f
perf: reduce TrustTunnel H3 queued send capacity
Oct 22, 2026
7a52093
docs: clarify TrustTunnel UDP backpressure boundaries
Oct 22, 2026
2afb925
docs: align default pressure matrix with 1 and 2 Gbps
Oct 22, 2026
b412391
Document performance investigation and shared layer regressions
Oct 23, 2026
fc6203c
perf(vmess): allocate authenticated-length keys on demand
Oct 23, 2026
b1e46d0
perf(vmess): reuse polled UDP receive state
Oct 23, 2026
8a6acca
perf(vmess): release fully drained output frames
Oct 23, 2026
5f327c0
fix(vmess): separate gRPC response wait from setup deadline
Oct 23, 2026
78e9421
fix(vless): keep gRPC uploads alive after request setup
Oct 24, 2026
3fbc84f
fix(smux): budget receive frames across logical streams
Oct 24, 2026
5da1ca8
fix(trojan): end gRPC setup timing after authentication submission
Oct 24, 2026
194876f
perf(tuic): lower the default connection receive window
Oct 24, 2026
07c64ec
fix(logging): retain TCP relay failure causes
Oct 24, 2026
baff9ed
fix(vless): drive established XHTTP packetaddr writes independently
Oct 24, 2026
b05f39a
fix(vmess): match official body counter wrap behavior
Oct 24, 2026
e047c37
fix(http): allow delayed responses after request submission
Oct 24, 2026
3246fbf
perf(vmess): reuse encrypted packetaddr associations
Oct 24, 2026
c4f8ca6
perf(tuic): lower default connection receive credit to 2 MiB
Oct 24, 2026
0c7ba3d
perf(xhttp): share scoped H2 connections within peer stream limits
Oct 24, 2026
dfb809e
Let private packet-up h2mux advance DATA before strong flush
Oct 24, 2026
d9b97bd
Retain WireGuard Full packets for one cooperative handoff
Oct 25, 2026
92d7eac
Keep HTTP1 request queue slots pointer-sized
Oct 25, 2026
c459e5d
Reuse active HTTP2 connections for static REALITY legs
Oct 25, 2026
5b65bd1
docs: allow bounded memory tradeoffs for performance
Oct 25, 2026
730fe40
chore(deps): update h2 to 0.4.20
Oct 25, 2026
5aebb3a
Keep TCP acknowledgments moving when raw output is full
Oct 25, 2026
2769c55
perf(xhttp): submit full default packet batches without timer delay
Oct 25, 2026
f5d55c8
perf: prepare plain Linux sockets without blocking worker jobs
Oct 25, 2026
b68fe41
fix: advance queued private h2mux data during pending flush
Oct 25, 2026
fbfb316
fix: stream validated Gun payloads without whole-record staging
Oct 25, 2026
0f66f2d
perf: shrink cached UDP routing send futures
Oct 26, 2026
e7f9671
docs: evaluate progressive performance gains across all metrics
Oct 26, 2026
d24fea7
perf: reuse XUDP send-frame storage
Oct 26, 2026
c31ac67
perf: use two connections for default gRPC pools
Oct 26, 2026
7bac5c8
perf: read Trojan datagrams into the frame buffer
Oct 26, 2026
eba7611
perf: use four on-demand connections for default gRPC pools
Oct 26, 2026
14ec89f
perf: widen the private WireGuard TCP send budget
Oct 26, 2026
abcd275
perf: increase the MASQUE H2 stream receive window
Oct 26, 2026
99a1943
perf: skip empty half-open tracking lookups
Oct 26, 2026
34413ee
perf: reuse native AEAD for standard Mieru UDP carriers
Oct 27, 2026
54efe88
fix(mieru): exclude missing-head reserve from advertised receive credit
Oct 27, 2026
1e90736
fix(config): align VLESS and QUIC UDP behavior with Mihomo
Oct 27, 2026
f3835f7
docs: align TUIC interoperability targets with official server
Oct 27, 2026
74e054c
fix: keep TUIC UDP packets progressing within bounded state
Oct 27, 2026
cc5f769
perf(mieru): pipeline one admitted UDP write per session
Oct 27, 2026
ad37701
perf(mieru): balance UDP carrier reuse within isolated business pools
Oct 27, 2026
5fdd7ec
fix(mieru): retain bounded TCP reorder slack
Oct 28, 2026
72d8b5c
docs: define diagnosed reference client fallback
Oct 28, 2026
92e6dbc
perf(mieru): reuse full-chunk low-entropy masks
Oct 28, 2026
1ae6e86
perf(quic): raise the GSO batch cap to ten segments
Oct 28, 2026
173c19b
perf(quic): allow concurrent IO on the protected UDP lease
Oct 28, 2026
d73aaa0
perf(tuic): amortize native receive scheduling and send budgets
Oct 28, 2026
5391916
docs: use Mihomo comparisons and account for raw throughput
Oct 28, 2026
41673c1
perf(tuic): skip reassembly scans before the first expiry
Oct 28, 2026
31568d9
fix(tuic): isolate quic datagram sessions from TCP
Oct 28, 2026
717c361
perf(tuic): spread native sessions across two source pools
Oct 28, 2026
772d37b
perf(mieru): pack low-entropy bodies with bounded bit plans
Oct 28, 2026
4c24883
perf(tuic): consume ready EOF after declared datagram payload
Oct 28, 2026
6053801
fix(mieru): retain bounded in-flight TCP data after remote close
Oct 29, 2026
a816016
fix(tuic): enable address codec for protocol-only builds
Oct 29, 2026
671d1ea
docs(mieru): clarify bounded in-flight close recovery
Oct 29, 2026
e6dc453
perf(tuic): bound physical receive space for native relay
Oct 29, 2026
059f12c
docs: use reference-based performance acceptance
Oct 29, 2026
3d021c5
perf(mieru): use native AEAD for patterned UDP sends
Oct 29, 2026
28b84f0
fix(mieru): await tail ACKs on standard UDP stream shutdown
Oct 29, 2026
c29e02a
perf(mieru): allow two queued UDP-associate writes
Oct 29, 2026
09a447b
perf(masque): batch H3 datagrams and retain IP receive bursts
Oct 29, 2026
a5ae445
perf(mieru): admit four bounded UDP-associate writes
Oct 29, 2026
be6502f
perf(mieru): reuse scan-local retransmission base
Oct 30, 2026
4b292d0
fix(netstack): retain bounded TCP recovery
Oct 30, 2026
020fd9a
perf(netstack): lower active TCP recovery floor
Oct 30, 2026
8d65178
perf(smux): increase bounded receive budget
Oct 30, 2026
cd76adc
perf(masque): coalesce ready H2 IP capsules
Oct 30, 2026
d396c7e
perf(masque): scan more ready capsules per bounded batch
Oct 30, 2026
377a48c
perf(wireguard): match single-prefix routes directly
Oct 30, 2026
9e0f9ef
perf(masque): enlarge bounded H2 TCP send capacity
Oct 30, 2026
6551cfd
perf(mieru): give isolated UDP carriers bounded TX headroom
Oct 30, 2026
8a3c07e
perf(wireguard): borrow already-normalized input packets
Oct 30, 2026
fe3adec
perf(wireguard): request UDP receive capacity for bursts
Oct 30, 2026
e921351
perf(xhttp): use a bounded 128 KiB H3 packet batch
Oct 30, 2026
680b088
perf(mieru): reuse scratch when polling UDP carriers
Oct 30, 2026
7b69096
perf(xhttp): overlap two H3 responses with one body workspace
Oct 31, 2026
62f0384
perf(wireguard): backpressure full single-peer output
Oct 31, 2026
8f1fa3d
perf(smux): raise shared receive budget to 4 MiB
Oct 31, 2026
de6db7b
perf(xhttp): raise native H3 send budget after UDP association
Oct 31, 2026
b43e22e
perf(mieru): pack low-entropy chunks in NEON pairs
Oct 31, 2026
c3225f3
perf(mieru): defer unused select deadline scans
Oct 31, 2026
e6e8a7f
perf(mieru): yield after UDP send quantum exhaustion
Oct 31, 2026
ea59987
perf(sing-mux): amortize UDP frame prefix reads
Oct 31, 2026
7ce39b6
fix(mieru): receive late packets after the last UDP session closes
Oct 31, 2026
96c50e0
perf(xhttp): shorten default aggregation for shared H3 uploads
Oct 31, 2026
3bf5fe7
perf(xhttp): reduce shared H3 partial-batch waiting
Oct 31, 2026
c899860
perf(mieru): improve UDP associate carrier admission
Oct 31, 2026
dd07596
fix(mieru): retry lost TCP session closes on UDP carriers
Oct 31, 2026
d02ad7f
perf(mieru): coalesce timeout responses across bounded output turns
Nov 1, 2026
62a82b5
test(netstack): satisfy current Clippy diagnostics
Nov 1, 2026
36a0b6f
perf(mieru): retain send-time RTO for UDP associations
Nov 1, 2026
3fdee46
docs: bound Mihomo-relative performance optimization
Nov 1, 2026
e774a51
perf: bound ordinary H3 packet-up batches
Nov 1, 2026
2ce2b90
perf: bound HTTP/1 packet-up batches
Nov 1, 2026
6c3e3c2
perf(http): reduce H2 request queue sentinel storage
Nov 2, 2026
f134bf1
chore: remove intermediate test evidence exporters
Nov 2, 2026
10f0833
chore: manage Boring PR dependencies by commit
Nov 2, 2026
9b23111
chore: refresh dependencies and pin Boring 5.4.0
Nov 2, 2026
9efbb02
fix(build): load native Windows SDK environment in vcpkg
Nov 2, 2026
b71ebbc
fix(routing): find healthy sticky fallback after sampling misses
Nov 2, 2026
b89d766
fix(http): protect foreground inputs from rewrite cache writes
Nov 2, 2026
54cbf60
fix(health): apply expected status per group to shared probes
Nov 2, 2026
61a5744
fix(build): preserve MSVC paths and release UWP compiler checks
Nov 2, 2026
9302811
test(config): report failed domain regex evaluations
Nov 2, 2026
73fe5be
fix(build): align UWP native dependencies with dynamic CRT
Nov 2, 2026
276ab2d
fix(outbound): retain client source across upstream group selection
Nov 2, 2026
9814ad3
fix(providers): commit file candidates with their observed timestamp
Nov 2, 2026
f01507f
fix(routing): retain cached UDP paths across group health changes
Nov 2, 2026
43d0e87
fix(windows): disambiguate the process adapter crate import
Nov 2, 2026
89425f2
fix(dns): retain newly required hints across live config updates
Nov 2, 2026
b0f074e
fix(ci): run smux tests at their shared module path
Nov 2, 2026
cce3ad6
fix: isolate default provider caches by request identity
Nov 2, 2026
f830699
docs: clarify Controller WebSocket origin semantics
Nov 2, 2026
57c2492
test: keep Linux packet fixtures independent of TUN adoption
Nov 2, 2026
bc5ff44
test: share socketpair fixtures across TUN runtime tests
Nov 2, 2026
28e0cb9
fix: retain new fake-IP pools when enabling DNS live
Nov 2, 2026
0d4dbc2
fix: include Mieru in runtime feature gates
Nov 2, 2026
1880eb6
fix: restrict Unix controller socket before bind
Nov 2, 2026
0abe48c
test: isolate independent source routing decisions
Nov 2, 2026
b79291d
fix: preserve live fake-IP pool and storage ownership
Nov 2, 2026
81df0a9
test: gate transport fixtures by their required features
Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 14 additions & 14 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@ jobs:
python-version: "3.x"
check-latest: true
architecture: ${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}
- uses: astral-sh/setup-uv@v10.2.0
- uses: astral-sh/setup-uv@v10.3.3
with:
version: "0.12"
version: "0.13.6"
- name: Linux native dependencies
if: matrix.platform == 'linux'
run: |
Expand All @@ -90,9 +90,9 @@ jobs:
- name: Cache native Rust dependencies
uses: Swatinem/rust-cache@v2
with:
key: release-${{ matrix.name }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**') }}
key: release-${{ matrix.name }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**', 'scripts/native/**') }}
workspaces: ". -> target"
env-vars: ImageOS ImageVersion SDKROOT DEVELOPER_DIR BORING AWS_LC LIBCLANG BINDGEN
env-vars: ImageOS ImageVersion SDKROOT DEVELOPER_DIR VOLE BORING AWS_LC LIBCLANG BINDGEN
cache-bin: "false"
- name: Build and package production CLI
shell: bash
Expand Down Expand Up @@ -193,9 +193,9 @@ jobs:
python-version: "3.x"
check-latest: true
architecture: ${{ runner.arch == 'ARM64' && 'arm64' || 'x64' }}
- uses: astral-sh/setup-uv@v10.2.0
- uses: astral-sh/setup-uv@v10.3.3
with:
version: "0.12"
version: "0.13.6"
- name: Locked source
run: cargo fetch --locked
- name: Linux native dependencies
Expand All @@ -222,7 +222,7 @@ jobs:
- name: Cache native Rust dependencies
uses: Swatinem/rust-cache@v2
with:
key: release-${{ matrix.name }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**') }}
key: release-${{ matrix.name }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**', 'scripts/native/**') }}
workspaces: ". -> target"
env-vars: ImageOS ImageVersion SDKROOT DEVELOPER_DIR ANDROID_NDK_HOME VOLE BORING AWS_LC LIBCLANG BINDGEN
cache-bin: "false"
Expand Down Expand Up @@ -295,13 +295,13 @@ jobs:
with:
python-version: "3.x"
check-latest: true
- uses: astral-sh/setup-uv@v10.2.0
- uses: astral-sh/setup-uv@v10.3.3
with:
version: "0.12"
version: "0.13.6"
- name: Cache native Rust dependencies
uses: Swatinem/rust-cache@v2
with:
key: release-ffi-apple-${{ matrix.target }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**') }}
key: release-ffi-apple-${{ matrix.target }}-${{ hashFiles('scripts/src/vole_scripts/*.py', 'scripts/cmake/**', 'scripts/native/**') }}
workspaces: ". -> target"
env-vars: ImageOS ImageVersion SDKROOT DEVELOPER_DIR VOLE BORING AWS_LC LIBCLANG BINDGEN
cache-bin: "false"
Expand Down Expand Up @@ -335,9 +335,9 @@ jobs:
with:
python-version: "3.x"
check-latest: true
- uses: astral-sh/setup-uv@v10.2.0
- uses: astral-sh/setup-uv@v10.3.3
with:
version: "0.12"
version: "0.13.6"
- uses: actions/download-artifact@v8
with:
pattern: vole-apple-*-${{ github.sha }}
Expand Down Expand Up @@ -368,9 +368,9 @@ jobs:
with:
python-version: "3.x"
check-latest: true
- uses: astral-sh/setup-uv@v10.2.0
- uses: astral-sh/setup-uv@v10.3.3
with:
version: "0.12"
version: "0.13.6"
- uses: actions/download-artifact@v8
with:
pattern: vole-release-build-*-${{ github.sha }}
Expand Down
162 changes: 143 additions & 19 deletions .github/workflows/test.yml

Large diffs are not rendered by default.

16 changes: 10 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,54 @@

Vole is a standalone Rust proxy core with native libraries and an optional foreground CLI. The native library contract is the JSON Invoke API, with no API or configuration revision fields. The `invoke` feature owns the shared request handler; `cli` and `ffi` are its command-line and native transports. The CLI parses flags, calls Invoke, renders responses, and sets exit status without requiring C ABI or Windows package entry points. Runtime configuration uses the strict schema documented in `docs/config.yaml`; native callers pass it inline as `configYaml` / `configYamls`; the explicit Invoke `foreground` operation owns bounded file/stdin reads, environment/path defaults, signals, and cleanup for CLI use. YAML does not contain `default-proxy`. Business proxy listeners use only `mixed-port`: shared HTTP/SOCKS5 TCP and SOCKS5 UDP require both inbound features. Top-level `port`, `socks-port`, `udp`, and `listeners` are rejected; proxy-node `port` and `udp` retain their outbound semantics. `allow-lan` and `authentication` are independent; omitted or empty authentication leaves both loopback and wildcard bindings unauthenticated. Public lifecycle state is runtime-local and single-instance.

iOS, tvOS 17+ (ARM64 device/simulator), macOS, Android and Linux use config-owned `tun.file-descriptor` through the Unix `tun-rs` adapter; positive descriptors remain host-owned and Vole closes only its duplicate. With descriptor 0, Linux and macOS can create/open native TUN devices from `tun.device`. Linux validates a real single-queue raw-IP TUN and its configured MTU; the host owns addresses, DNS, namespace/routing isolation, and physical egress. Apple packetFlow does not publicly guarantee raw-fd access; Linux or simulator results do not sign off a physical Network Extension. Windows has mutually exclusive `windows-uwp` (`windows-rs` / `Windows.Networking.Vpn`) and `windows-wintun` builds sharing the same core. Validate Wintun devices and packaged UWP integration separately.
iOS, tvOS 17+ (ARM64 device/simulator), macOS, Android and Linux use config-owned `tun.file-descriptor` through the Unix `tun-rs` adapter; positive descriptors remain host-owned and Vole closes only its duplicate. With descriptor 0, Linux and macOS can create/open native TUN devices from `tun.device`. Linux validates a real single-queue raw-IP TUN and its configured MTU; the host owns borrowed-fd addresses, DNS, namespace/routing isolation, and physical egress. Core-owned Linux TUN supports auto-detect-interface, auto-route and per-link systemd-resolved setup with rollback; package installation supplies capabilities and noninteractive DNS authorization. Apple packetFlow does not publicly guarantee raw-fd access; Linux or simulator results do not sign off a physical Network Extension. Windows has mutually exclusive `windows-uwp` (`windows-rs` / `Windows.Networking.Vpn`) and `windows-wintun` builds sharing the same core. Validate Wintun devices and packaged UWP integration separately.

# Sources of Truth

Current source, tests, and the public contract documents under `docs/` define implemented behavior. Keep documentation focused on current usage and contracts; record validation results in the relevant CI run or PR rather than accumulating development logs. When touching a documented boundary, reconcile its document with the Invoke API and current tests in the same change.

Keep all development plans in the workspace's `references/plan/` directory outside Git repositories (`../references/plan/` from this checkout). Repository documentation contains finalized conclusions, accepted decisions, and current contracts; implementation plans and task lists stay in that external directory.

Read the relevant document completely before changing that area:

- Mihomo compatibility, protocol interoperability, or compatibility/performance tradeoffs: `docs/mihomo-compatibility.md`. Apply its compatibility principles to implementation, tests, and reviews. For performance or defect fixes, first compare local Mihomo, clash-rs and official client source, then profile the matched workload to locate the bottleneck, and only then change Vole. Distinguish Core, peer and benchmark causes; retain confirmed peer failures instead of changing Core for them. Shared-layer changes require explicit regressions of affected previously passing windows; historical PASS does not sign off changed code.
- Invoke, FFI, lifecycle, Android protect, or config delivery: `docs/invoke-api.md`, `src/invoke/`, and `src/ffi/`.
- YAML, proxy graph, proxy groups, DNS, rules, or sniffer: `docs/config.yaml`, `docs/tun-icmp-dns.md`, and `src/config/`.
- HTTP/SOCKS5 inbound, authentication, or listeners: `docs/inbounds.md` and `src/inbound/`.
- Business HTTP rewrite, selective TLS, or its separate configuration: `docs/http-processing.md` and `src/http_processing/`.
- SOCKS5, AnyTLS, Trojan, VMess, Hysteria2, TUIC v5 or SS 2022: `docs/outbounds.md`.
- VLESS, Vision, Encryption, JLS or static ECH: `docs/vless.md`.
- XHTTP request fields, download legs, H1/H2/H3 or sing-mux: `docs/xhttp.md`.
- Runtime Controller, proxy-group selection, or TUN traffic metrics: `docs/controller-api.md` and `src/controller.rs`.
- GeoData: `docs/geodata.md`.
- TLS profiles, certificate policy or TLS dependencies: `docs/tls-client-fingerprint.md` and `docs/tls-dependencies.md`; REALITY also requires `docs/reality-wire-protocol.md`. Before local boring development or opening/updating a PR, follow the dependency-source workflow in `docs/tls-dependencies.md`. Keep dependency auditing in CI rather than duplicating it in platform build scripts.
- TLS profiles, certificate policy or TLS dependencies: `docs/tls-client-fingerprint.md` and `docs/tls-dependencies.md`; REALITY also requires `docs/reality-wire-protocol.md`. Before local Boring development or opening/updating a Vole PR, follow the path-to-commit workflow and Boring PR prerequisite in `docs/tls-dependencies.md`. Keep dependency auditing in CI rather than duplicating it in platform build scripts.
- TUN fields, resource acquisition, fd ownership, packet I/O, MTU, or UDP idle policy: `docs/config.yaml`, `docs/tun-platform.md`, and `docs/tun-icmp-dns.md`.
- Windows VPN/TUN, outbound binding, AppContainer packet buffers, or package lifecycle: `docs/windows-vpn.md` and `docs/tun-platform.md`.
- CLI, foreground file/environment/path/signal behavior, or tag releases: `docs/cli.md`, `docs/invoke-api.md`, `scripts/README.md`, `src/cli.rs`, `src/invoke/foreground.rs`, and `.github/workflows/release.yml`; distinguish configured workflows from executed release validation.
- Builds: `scripts/README.md`; `vole-scripts build` compiles platform outputs, and `vole_scripts.release` packages them for CI.
- Offline regressions: `tests/README.md`. Rust memory/configuration tests remain in Vole; run explicit pure-memory filters, with all-target coverage limited to `--no-run`.
- Protocol interoperability or pressure: the public [container-benchmark](https://github.com/YuanDevTeam/container-benchmark) owns all container orchestration and fixtures. Supply the checkout explicitly with `--source vole=PATH`; Vole builds do not import it or infer workspace paths.
- Protocol interoperability or pressure: isolated benchmark tooling owns container orchestration and fixtures. Supply the checkout explicitly with `--source vole=PATH`; Vole builds do not import it or infer workspace paths. Keep benchmark results, comparisons and conclusions in the benchmark project; Vole documents implementation contracts and acceptance criteria. Keep tooling repository addresses and raw runs outside Vole.
- Server-side tests: `docs/testing-isolation.md`. Use isolated benchmark containers for every server peer and network origin; container failure is not permission for a host fallback.
- Claims that something passed: `docs/acceptance.md`. Record only commands and environments actually executed; host tests and cross-builds do not prove physical-device data paths.

# Architecture Boundaries

- `src/invoke/` owns shared JSON dispatch, registry, lifecycle admission, panic containment, and engine completion. `start(configYaml)` performs internal preparation and platform acquisition; no public `prepare` or fd/framing payload exists. `validateConfig` needs no initialization.
- `src/ffi/` adapts C ABI and Android JNI to Invoke and preserves native buffer/callback boundaries.
- `src/cli.rs` owns five flags, Invoke request conversion, rendering, and exit status. `src/invoke/foreground.rs` owns file/stdin reads, native path metadata, environment defaults, process signals, bounded stderr, and foreground cleanup. Foreground validation reads its input but does not initialize data, resolve remote endpoints, or inspect platform devices.
- `src/cli.rs` owns argument parsing, Invoke request conversion, rendering, and exit status. `src/invoke/foreground.rs` owns file/stdin reads, native path metadata, environment defaults, process signals, stderr logging, and foreground cleanup. Foreground validation reads its input but does not initialize data, resolve remote endpoints, or inspect platform devices.
- `src/runtime.rs` prepares and owns DNS, routing, outbound graphs, listeners, GeoData, and long-lived tasks.
- `src/tun_runtime.rs` connects platform raw-IP I/O to `vole-netstack` and dispatches TCP, UDP, DNS, ICMP, and sniffing.
- `src/platform/` contains platform adapters. Keep framing internal, propagate configured MTU, and preserve original borrowed-fd flags and ownership. Windows backend selection occurs at compilation; keep Windows callback semantics here instead of simulating a Unix fd.
- `src/dialer.rs` is the shared physical TCP/UDP socket seam. Fix socket protection or Windows `(source IP, interface index)` binding once here rather than in each outbound.
- Static `select` groups share Running Session selection between routing and `dialer-proxy`. Keep protocol configuration immutable, validate the complete node/member DAG, and retain only declared dependencies to avoid Arc cycles. Resolve upstreams at the `OutboundConnector` seam using one setup deadline and per-group selection snapshot; prepare every potential DIRECT server endpoint. `measureDelay` remains node-only.
- Static and provider-backed select, url-test and fallback groups share Running Session selection between routing and `dialer-proxy`. Provider candidates validate the complete graph before publication; existing sessions retain their old resource generation until release. Keep protocol configuration immutable, validate the complete node/member DAG, and retain only declared dependencies to avoid Arc cycles. Resolve upstreams at the `OutboundConnector` seam using one setup deadline and per-group selection snapshot; resolve DIRECT server endpoints on demand through the proxy DNS role. `measureDelay` remains node-only.
- `crates/vole-netstack` is platform-independent raw-IP state and must not depend on WinRT, JNI, Swift, or host UI frameworks.
- Core runtime lifecycle does not infer App, extension, service, or daemon roles and does not implement cross-process state or IPC. The Windows-only host Invoke is the explicit package integration seam for profile/status/Session Snapshot/StartupTask operations and an optional bounded `sessionBackend`; its Session Host owns backend process liveness without interpreting arguments, files, ports, or protocols. Provider runtime state remains process-local.

# Development Rules

1. Keep the latest-only schema strict. Reject unknown and obsolete fields instead of adding compatibility branches or silent migration.
2. Preserve bounded queues, packet/buffer/parser limits, cancellation, and synchronous stop barriers. Do not turn UDP callback paths into blocking waits.
3. Keep secrets, UUIDs, DNS questions, full config/request bodies, and runtime traffic destinations out of logs and errors. Configuration-service endpoints may appear only as a bounded, sanitized origin or source index when operational diagnosis requires it; never log userinfo, query, fragment, private addresses, or redirect targets.
3. CLI and Controller logs preserve each emitted event's complete target, message and fields, including strings, errors and Debug values. Apply configured log levels and bounded subscription queues, without content redaction, field allowlists, truncation or additional rate limits. Do not add logging of configuration/request bodies or credentials merely to populate logs; API error and snapshot contracts remain separate.
4. Platform trust boundaries fail closed. Android protect failure, WinRT VPN physical-interface loss, invalid packet-buffer ownership, or unsupported target startup must not fall back to an unprotected socket. Desktop Wintun leaves interface addresses, DNS, routes and physical-egress isolation to the host; it does not inherit the WinRT Provider's binding or network-change monitor.
5. Packaged Windows VPN uses official `Windows.Networking.Vpn` through `windows-rs`. `VpnPacketBuffer` bytes are copied within callbacks. After acquiring a framework buffer, return it to Windows before propagating any later local error; a return-API failure propagates the platform error and fails closed. Every framework buffer is returned exactly once. Network changes stop this path; they do not silently rebind or reconnect.
6. Reuse the existing raw-IP netstack, runtime and outbound graph. Windows WinRT VPN and desktop Wintun use separate platform adapters with the shared Dialer and synchronous stop barrier; Wintun's DLL and first-release network configuration are host-owned. Add no second Windows proxy core, per-protocol socket factory or fake fd layer.
Expand Down
11 changes: 9 additions & 2 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,21 @@ _Avoid_: Managed core, child core, URI configuration
A named, concrete outbound protocol path that can be selected as a route target or referenced by another proxy node through `dialer-proxy`.
_Avoid_: Proxy when a proxy group or route target is intended, server profile

**Routing control**:
A named rule-flow effect that updates the current decision and resumes rule evaluation without establishing a protocol connection. It is not a measurable proxy node.
_Avoid_: Physical outbound, transport, fake connection

**Proxy group**:
A named route or upstream target whose current-session selection identifies one direct member. Routing and `dialer-proxy` share the same selection; an upstream group's DIRECT member connects the current node's prepared server.
A named route or upstream target whose current-session selection identifies one direct member. Routing and `dialer-proxy` share the same selection; an upstream group's DIRECT member connects the current node's server resolved on demand.
_Avoid_: Folder, provider, subscription

**Route target**:
A proxy node, proxy group, or reserved built-in target that routing rules, the final `MATCH`, and DNS routes can select.
A proxy node, routing control, proxy group, or reserved built-in target. Rule-flow controls run only during rule evaluation; selecting one as a physical upstream does not establish a connection.
_Avoid_: Proxy when the distinction between a node and group matters, dialer

**Group selection**:
The running-session state identifying the direct member route target currently chosen by a proxy group.
_Avoid_: Variant, configuration switch, active profile

**Resource generation**:
A validated combination of provider content, proxy nodes, groups, rules and DNS policies. New sessions use the published generation; existing sessions retain their dependencies until completion. Failed candidates preserve the usable generation and its HTTP cache.
Loading
Loading