* feat(pcb): add native KiCad URL launcher
* fix(pcb): harden launcher recovery choices
* fix(pcb): prevent concurrent recovery sessions
* fix(pcb): guard restored editor sessions
* refactor(pcb): extract shared pcb-diode-uri and pcb-native-dialog crates
pcb-launcher's URI validation re-implemented pcb-diode-api's SandboxFileUri
parsing; move that parser into a tiny pcb-diode-uri crate both can use, and
give the trusted-host allowlist a single home there. Likewise collapse the
duplicated osascript/zenity/kdialog/PowerShell dialog machinery from
pcb-launcher and pcbc's recovery dialog into a pcb-native-dialog crate.
Also drop the launcher's redundant staged-app cleanup (the Drop guard
covers it), the duplicate log chmod, the Debug-formatted log header, and
a clippy for_kv_map lint in the interposer pattern test.
* fix(pcb): block recovery while a recoverable session's editor is open
A recoverable stop now deliberately leaves KiCad running, so the
still-open-editor guard must cover Recoverable sessions too — otherwise
Restore reuses the same local layout dir while the first KiCad instance
still has it open. Also match the tracked pid's process name (open /
pcbnew / kicad) instead of bare liveness, so a recycled pid cannot
permanently wedge the board.
* refactor(pcb): simplify launcher install and open plumbing
Split install_shim_launcher into fetch / stage / replace helpers so the
Windows backup-rename dance is a reusable replace_executable_with_backup,
fold pcb-kicad's duplicated per-OS pcbnew command construction into one
builder, share a single Download-style helper in install.ps1 the way
install.sh already does, dedupe the recovery-cancel wind-down, and fix
the README's launcher wording.
* refactor(pcb): re-export diode URI types without a module alias
Nothing consumed the pcb_diode_api::diode_uri path; re-export the types
directly from pcb-diode-uri instead of aliasing the whole crate.
* refactor(pcb): trust *.diode.computer in release, all hosts in debug
Replaces the enumerated host allowlist: release launchers accept any
*.diode.computer subdomain (portless, so preview and gov endpoints work
without listing them), while debug builds trust every host so local API
stacks need no special-casing.
Removes 31 crates, adds none. Release binary 69,943,104 -> 62,182,992 bytes
(-11.1%); compile units 831 -> 793; Cargo.lock 884 -> 852 packages.
Remove AWS credential authentication
------------------------------------
Deletes pcb-diode-api::aws_auth and the four AWS crates it was the sole
consumer of (aws-config, aws-credential-types, aws-sigv4,
aws-smithy-runtime-api), which pulled 29 crates in total.
The feature was dead, not merely unused: aws_auth exchanged an STS
GetCallerIdentity presigned URL for a Diode service token at
POST /api/auth/aws/exchange, and that endpoint was removed server-side by
diode cb9307996 "Replace sandbox AWS/HMAC auth with challenge-callback tokens".
Every call it could make would 404.
Registry embeddings are unaffected: embeddings.rs fetches credentials from
Diode's own API and hand-rolls SigV4, and never used an AWS crate.
aws-lc-rs/aws-lc-sys deliberately stay -- they come from reqwest's rustls
feature, not the AWS SDK.
Behaviour: `pcb auth status` with no local tokens prints "Not logged in"
instead of attempting the dead exchange. `pcb auth logout` still clears
~/.pcb/service-auth, which holds Diode API bearer tokens (not AWS
credentials), so unexpired ones are not left on disk.
Drop the Oniguruma C dependency
-------------------------------
syntect moves from regex-onig to regex-fancy. It is used only for highlighting
code blocks in `pcb doc`, but regex-onig compiled Oniguruma from C via
onig_sys. fancy-regex was already in the tree via pagable, so syntect shares
that copy. Highlighting output verified identical through a pty, including ANSI
colour codes.
Drop unused tokio and reqwest's charset feature
-----------------------------------------------
tokio's only user was the runtime aws_auth built. tokio stays transitively via
reqwest -> hyper -> h2, but our declaration carried features =
["rt-multi-thread"], and dropping it removes that feature from non-dev builds.
Note plain `cargo tree -e features` still shows rt-multi-thread because
httpmock (a dev-dependency) enables it; only `--edges normal` reflects a
release build.
Nothing calls reqwest's text_with_charset, so the charset feature only pulled
encoding_rs. `.text()` now decodes as UTF-8 rather than following a declared
charset; all call sites read Diode's JSON API or the GitHub-hosted changelog.
Also removes `either` and `serde_yaml` from [workspace.dependencies] -- no
crate referenced either, and serde_yaml was not in Cargo.lock.
Verified: cargo fmt --check, cargo clippy --workspace -- -D warnings, and
cargo nextest run --workspace --profile ci (1934 passed, 1 skipped), plus full
CI green on Ubuntu, macOS and Windows.
Drop Intel macOS artifacts and client support, migrate eligible CI jobs to Blacksmith runners, standardize CI on KiCad 10.0.5, and retain GitHub-hosted npm publishing for trusted publishing/OIDC.