| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: route every reqwest client through codewhale_release::tls (#6153) Bare Client::builder()/new() under rustls-no-provider panics before the first provider install. Add a Lint gate (scripts/check-reqwest-builders.py + hermetic test, wired into ci.yml) and sweep the 17 remaining call sites onto tls/platform builders, dropping the hand-installed providers. Gate: test_check_reqwest_builders.py 5/5 ok; check fails with 17 hits before the sweep, passes after. clippy workspace clean. | 18 小时前 | |
feat(app-server): unix-socket transport + daemon/attach advertisement (#5749) * feat(app-server): unix-domain-socket daemon transport with attach/claim handshake Desktop Phase 0, socket half (backlog #36; DESKTOP-APP-BRIEF §2/§5, CORE-PROTOCOL §5 attachment styles). `daemon_socket` serves the existing stdio JSON-RPC protocol verbatim over a user-private unix socket: - path resolution under the Codewhale runtime dir (explicit > $CODEWHALE_HOME/run > $XDG_RUNTIME_DIR/codewhale > macOS Application Support > ~/.codewhale/run), kernel path-length check, dir 0700, socket 0600, peer-uid check on accept; - stale-socket cleanup on start: dead socket reclaimed, live daemon refused (AlreadyRunning), non-socket file never touched (NotASocket); - `daemon/attach` claim handshake: attach vs claim, exclusive owner slot that frees on disconnect, bundle-skew guard via expect_daemon_version, typed errors -32010..-32014; only the owner may `shutdown`, enforced in the loop (also mid-turn) so a guest can neither stop the daemon nor interrupt turns; - Windows: named pipe reserved, bind/run return a typed UnsupportedPlatform error — no silent fallback; - run_stdio_loop gains a per-connection policy (transport label + shutdown authority) and a typed exit reason so the daemon knows an owner asked it to stop; stdio behavior is unchanged. Integration tests bind a daemon, connect over the socket, complete the handshake, round-trip app/* requests through the shared dispatcher, exercise guest/owner/relaunch claim semantics, version skew, stale cleanup, and clean shutdown (socket removed). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * feat(cli): `codewhale app-server --socket [--socket-path]` and daemon socket docs Wire the daemon socket transport into the app-server subcommand (mutually exclusive with --stdio/--http/--mobile) and document endpoint resolution, the daemon/attach handshake, ownership rules, and the Windows named-pipe reservation in docs/RUNTIME_API.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * fix(app-server): cfg-gate daemon-attach error ctors so Windows builds stay warning-free ATTACH_REQUIRED_CODE / DAEMON_ALREADY_CLAIMED_CODE / DAEMON_VERSION_SKEW_CODE and JsonRpcError::{attach_required, daemon_already_claimed, daemon_version_skew} are only reached from daemon_socket::platform, which is #[cfg(unix)]. On cfg(not(unix)) rustc flags them dead, and the workspace's `warnings = "deny"` (plus CI's -Dwarnings) turns that into a build failure on the Windows leg. Gate the three consts and ctors on unix; the remaining daemon errors (not_daemon_owner, already_attached) are referenced unconditionally. Proven with a scratch crate mirroring the shape: the pre-fix shape errors with four dead-code diagnostics under --target x86_64-pc-windows-msvc, the gated shape checks clean. A direct app-server Windows check is still blocked on this host by ring's build script (missing Windows C headers). Signed-off-by: CodeWhale Bot <bot@codewhale.net> * feat(app-server): advertise daemon/attach on the socket transport; widen socket/CLI tests - `capabilities` on the unix-socket transport now lists `daemon/attach` right after `healthz`; the stdio pin (EXPECTED_CAPABILITY_METHODS) is untouched and a new unit test pins the socket variant. - AlreadyRunning wording no longer claims the live listener is a codewhale daemon (it may be anything bound at an explicit --socket-path). - Integration tests: pre-attach gating proven for capabilities, thread/list and prompt/run; post-attach capabilities checked; a still-attached guest is proven to receive EOF when the owner shuts the daemon down. - CLI: --socket conflicts with --stdio/--http/--mobile are unit-tested, and --socket-path without --socket is proven to be a MissingRequiredArgument. - docs/RUNTIME_API.md: capabilities note for the socket transport and the updated AlreadyRunning message. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * docs(changelog): release-note receipt for the app-server unix socket The squash subject carries (#5749), so check-feature-release-notes.sh requires a matching receipt in CHANGELOG.md or the range red-lines main for everyone. Regenerated crates/tui/CHANGELOG.md via sync-changelog.sh. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * fix(app-server): release the owner claim when the socket closes Review P1 on daemon_socket.rs. The ConnectionGuard was held by the caller across the whole run_stdio_loop await: let exit = run_stdio_loop(&context.state, lines, writer, policy).await; drop(guard); During a thread/message turn the loop selects on the dispatch future and stdin. On EOF it sets stdin_open = false (lib.rs:457) and keeps awaiting the dispatch, so an owner who disconnects mid-turn keeps the daemon claimed for as long as that turn runs. If the turn is stalled and emits nothing further, a relaunched desktop gets daemon_already_claimed, and falling back to guest attachment leaves it unable to shut the daemon down either -- a user-visible lockout whose only exit is killing the process. run_stdio_loop now takes an opaque input_claim: Option<C> and drops it at the EOF arm rather than on return. The socket transport moves its guard in; process stdio has no claim and passes None. Opaque because ConnectionGuard is private to daemon_socket and lib.rs should not learn about it -- only that something must be released when input closes. No regression test: reproducing this needs a stub runtime that blocks a turn open while the socket closes, and the daemon_socket suite has no turn scaffolding. The invariant is stated on the parameter instead. cargo nextest run -p codewhale-app-server Summary [0.213s] 104 tests run: 104 passed, 0 skipped Signed-off-by: CodeWhale Bot <bot@codewhale.net> * docs(changelog): drop the branch-time entry; entries move to merge-time receipts on main --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 13 天前 | |
chore(release): prepare v0.9.13 Version bumps across the workspace, npm packages, VS Code extension, and facts surfaces; CHANGELOG 0.9.13 section with the release narrative, the missing #5989 receipts (ACP schema, queue data loss, metrics, goal-loop), the truncated-tool-args fix, the paste regression fix, allow_insecure_http, the Computer Use 0.2.0 bundle refresh, an upgrade-notes subsection (re-trust Computer Use), and the 0.9.13 contributor ledger; derived web surfaces regenerated (changelog.generated, facts.generated, GT catalogs); contributor credits chain in parity (CHANGELOG ledger = website arrays = docs/CONTRIBUTORS.md band = facts requiredCandidateCredits); INSTALL.md and the trust/telemetry copy bumped to 0.9.13. Gates: web 407/407 (npm test); check:facts OK; check:locales OK; check-versions OK (workspace/npm/npm-binary/lockfile = 0.9.13); feature release-note receipts OK (15); prepare-release transaction completed. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 7 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 18 小时前 | ||
| 13 天前 | ||
| 7 天前 |