Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ jobs:
test:
# IPC is interprocess::local_socket on every platform (Unix sockets on
# Linux/macOS, named pipes on Windows). Signals are cfg-gated so Windows
# gets GenerateConsoleCtrlEvent + TerminateProcess instead of killpg.
# uses ConPTY-input ETX (SIGINT) + taskkill tree-kill (SIGTERM/SIGKILL)
# instead of killpg.
name: test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
Expand Down
8 changes: 5 additions & 3 deletions docs/design/windows-strategy.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
## TL;DR

Windows works once we swap three cfg-gated pieces: **IPC** (Unix socket → named
pipe), **signal delivery** (`killpg` → `GenerateConsoleCtrlEvent`/Job Object
termination), and a few **path/comm assumptions**. None require an architecture
change. Estimate: ~2 cycles.
pipe), **signal delivery** (`killpg` → ConPTY-input ETX for SIGINT +
`taskkill /F /T` descendant-tree kill for SIGTERM/SIGKILL — as implemented in
PR #124, superseding the original `GenerateConsoleCtrlEvent`/Job Object plan;
see the signal table in §2), and a few **path/comm assumptions**. None require
an architecture change. Estimate: ~2 cycles.

PTY itself isn't a blocker — `portable-pty` already uses ConPTY on Windows.

Expand Down
2 changes: 1 addition & 1 deletion tracker.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Implication: v1 does not have Kitty graphics + Sixel + OSC 8 hyperlinks in the e
- **PluginAdapter (sub-process JSON-RPC over stdio)** — Moved to P4 alongside `mcp serve`. Both speak stdio JSON-RPC; build the framework once.
- **nvim / tmux built-in adapters** — Will land as external plug-ins via PluginAdapter once #2 ships. Avoids dragging `nvim --headless` / `tmux -CC` into CI.
- **wezterm engine real impl** — Blocked on `wezterm-term` being published to crates.io. Track only.
- **Windows runtime — cycle W2 (signal mapping + `.exe` strip in adapter comm + re-enable `windows-latest` in CI).** Cycle W1 (IPC swap to `interprocess`) shipped on all platforms; Windows-specific signal handling (`GenerateConsoleCtrlEvent` / `TerminateProcess` instead of `killpg`) is the next ~80 LOC cycle. See `docs/design/windows-strategy.md` for the full plan.
- **Windows runtime — cycle W2 — SHIPPED (PR #124), with a mechanism change.** Cycle W1 (IPC swap to `interprocess`) shipped on all platforms; W2 landed signal handling as ConPTY-input ETX (SIGINT) + `taskkill /F /T` descendant-tree kill (SIGTERM/SIGKILL) instead of the planned `GenerateConsoleCtrlEvent` (which cannot reach a child on its own pseudoconsole), plus ConPTY DSR render, headless pipe spawn for `run`/`ask`/`edit`, the `run | consumer` handle-inheritance fix, and `windows-latest` in the CI matrix. SIGBREAK/SIGQUIT is rejected honestly (no delivery path). Still open: owner-only DACL on the named pipe, real Ctrl-Break delivery — see `docs/design/windows-strategy.md`.

### P-UX6 — timeout fix + small primitives (this PR)

Expand Down
Loading