[rush-daemon][WS2.7][6/9] Forward interactive I/O - #5969
Merged
Mo Jazayeri (mojaza) merged 4 commits intoAug 27, 2026
Merged
Conversation
Mo Jazayeri (mojaza)
requested a review
from Bharat Middha (bmiddha)
as a code owner
August 26, 2026 22:41
Sean Larkin (TheLarkInn)
approved these changes
Aug 26, 2026
Base automatically changed from
mojazayeri-microsoft-rushd-ws2-exit-semantics-upstream
to
main
August 27, 2026 00:11
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Mo Jazayeri (mojaza)
force-pushed
the
mojazayeri-microsoft-rushd-ws2-interactive-io-upstream-86a
branch
from
August 27, 2026 00:11
6e7b8f4 to
3eadbbb
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
Adds request-scoped interactive I/O for daemon-routed commands, including stdin framing, raw-mode coordination, terminal fallback policy, and asynchronous transport backpressure.
Changes:
- Adds protocol contracts for stdin, raw mode, and terminal policy.
- Integrates interactive sessions with phased/global routing.
- Serializes asynchronous inbound frame handling and adds tests.
Reviewed changes
Copilot reviewed 44 out of 44 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
libraries/rush-daemon/src/test/RushDaemonHost.test.ts |
Tests host-level stdin routing and failure isolation. |
libraries/rush-daemon/src/test/PhasedRequestRouterTestUtilities.ts |
Extends phased test clients for interactive sessions. |
libraries/rush-daemon/src/test/PhasedRequestInteractive.test.ts |
Tests phased raw-mode lifecycle and fallback. |
libraries/rush-daemon/src/test/InteractiveRequestInputRouter.test.ts |
Tests input routing, ordering, cleanup, and failures. |
libraries/rush-daemon/src/test/GlobalCommandRequestRouter.test.ts |
Tests global stdin forwarding and terminal policy. |
libraries/rush-daemon/src/test/DaemonInteractiveConnection.test.ts |
Tests negotiation and raw-mode ownership. |
libraries/rush-daemon/src/RushDaemonHost.ts |
Exposes each connection’s interactive broker. |
libraries/rush-daemon/src/PhasedRequestRouter.ts |
Adds interactive cleanup and terminal policy handling. |
libraries/rush-daemon/src/PhasedRequestClient.ts |
Extends phased client capabilities. |
libraries/rush-daemon/src/InteractiveRequestInputRouter.ts |
Implements request-scoped stdin routing. |
libraries/rush-daemon/src/index.ts |
Exports interactive APIs. |
libraries/rush-daemon/src/GlobalCommandRequestRouter.ts |
Integrates global-command interactive lifecycle. |
libraries/rush-daemon/src/GlobalCommandRequestClient.ts |
Extends global client capabilities. |
libraries/rush-daemon/src/GlobalCommandRequest.ts |
Adds terminal requirements and stdin metadata. |
libraries/rush-daemon/src/GlobalCommandExecutionContext.ts |
Forwards input to child processes. |
libraries/rush-daemon/src/DaemonTerminalPolicy.ts |
Evaluates daemon terminal compatibility. |
libraries/rush-daemon/src/DaemonInteractiveConnection.ts |
Coordinates connection-level interactive behavior. |
libraries/rush-daemon/src/DaemonControlSession.ts |
Routes stdin and interactive control frames. |
libraries/rush-daemon/README.md |
Documents interactive behavior and limitations. |
libraries/rush-daemon-transport/src/test/AsyncFrameHandler.test.ts |
Tests serialized asynchronous frame handlers. |
libraries/rush-daemon-transport/src/DaemonFrameConnection.ts |
Adds inbound asynchronous backpressure. |
libraries/rush-daemon-transport/README.md |
Documents inbound flow control. |
libraries/rush-daemon-protocol/src/test/StdinFrameCodec.test.ts |
Tests stdin framing and byte preservation. |
libraries/rush-daemon-protocol/src/test/InteractiveControl.test.ts |
Tests interactive control messages. |
libraries/rush-daemon-protocol/src/test/ControlFrame.test.ts |
Updates subscription codec coverage. |
libraries/rush-daemon-protocol/src/StdinFrameCodec.ts |
Implements request-tagged stdin encoding. |
libraries/rush-daemon-protocol/src/InteractiveControlValidation.ts |
Validates interactive controls. |
libraries/rush-daemon-protocol/src/index.ts |
Exports new protocol contracts. |
libraries/rush-daemon-protocol/src/FrameConstants.ts |
Defines stdin request-ID framing constants. |
libraries/rush-daemon-protocol/src/DaemonTerminalPolicy.ts |
Defines terminal policy types. |
libraries/rush-daemon-protocol/src/DaemonProtocolVersion.ts |
Advances the protocol minor version. |
libraries/rush-daemon-protocol/src/DaemonPhasedRequest.ts |
Adds phased terminal/input metadata. |
libraries/rush-daemon-protocol/src/DaemonInteractiveControl.ts |
Defines raw-mode and policy messages. |
libraries/rush-daemon-protocol/src/DaemonControlMessage.ts |
Includes interactive control variants. |
libraries/rush-daemon-protocol/src/DaemonControlKinds.ts |
Centralizes control-message kinds. |
libraries/rush-daemon-protocol/src/DaemonClientCaps.ts |
Adds interactive capability negotiation. |
libraries/rush-daemon-protocol/src/ControlMessageValidation.ts |
Validates new control-message kinds. |
libraries/rush-daemon-protocol/README.md |
Documents interactive protocol contracts. |
common/reviews/api/rush-daemon.api.md |
Updates daemon API report. |
common/reviews/api/rush-daemon-transport.api.md |
Updates transport API report. |
common/reviews/api/rush-daemon-protocol.api.md |
Updates protocol API report. |
common/changes/@rushstack/rush-daemon/mojazayeri-interactive-io_2026-08-21-21-00.json |
Records daemon package change. |
common/changes/@rushstack/rush-daemon-transport/mojazayeri-interactive-io_2026-08-21-21-00.json |
Records transport package change. |
common/changes/@rushstack/rush-daemon-protocol/mojazayeri-interactive-io_2026-08-21-21-00.json |
Records protocol package change. |
Suppressed comments (1)
libraries/rush-daemon/src/DaemonControlSession.ts:94
- A subsequent valid
subscribethat omits the optional capability (for example, to update verbosity) disables interactive I/O. If a request currently owns raw mode, its mandatory cooked-mode restoration then fails at#assertEnabled()and nosetRawMode(false)is sent. Treat negotiated interactive support as immutable/monotonic for the connection, or reject capability changes while requests are active.
} else if (message.kind === 'subscribe') {
this._interactiveConnection.setEnabled(
this._peerSupportsInteractiveProtocol && message.payload.supportsInteractiveIO === true
);
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Mo Jazayeri (mojaza)
deleted the
mojazayeri-microsoft-rushd-ws2-interactive-io-upstream-86a
branch
August 27, 2026 02:05
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds request-scoped interactive input forwarding for daemon-routed phased and global commands while preserving isolation from daemon process stdio.
Depends on #5966. This stack follows merged #5949 and continues the work tracked in #5897 (reference only; does not close it).
Work item: https://onedrive.visualstudio.com/EFun/_workitems/edit/3216023
Details
Uint8Arraypayloads and preserves ordered delivery under backpressure without cross-request leakage.requiresInProcesswhen the requested terminal capability cannot be safely provided by the daemon.Limitations
SIGWINCH.How it was tested
node common/scripts/install-run-rush.js test --only @rushstack/rush-daemon-protocol --only @rushstack/rush-daemon-transport --only @rushstack/rush-daemonnode common/scripts/install-run-rush.js change --verifygit diff --checkgit range-diff --no-color 5fde27f24f3bb6dc5725448072e83ee09805c8fb..7cfc9f0b7b198a15195e0d7677c00e970955d453 353a0dc65a973e39cc6ecf24e61ec3decdd7924f..HEAD