Skip to content

feat(cli): read terminal send text from a file or stdin (--text-file) - #17401

Closed
Tauri-EPO wants to merge 1 commit into
stablyai:mainfrom
Tauri-EPO:Tauri-EPO/terminal-send-text-file
Closed

Tauri-EPO wants to merge 1 commit into
stablyai:mainfrom
Tauri-EPO:Tauri-EPO/terminal-send-text-file

Conversation

@Tauri-EPO

@Tauri-EPO Tauri-EPO commented Aug 30, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

Coordinators keep losing multi-line briefings when sending them to agent terminals: shell quoting mangles or truncates what --text carries. Now the message can come from a file (--text-file <path>) or from stdin (--text-file -), byte-identical to what you wrote.

What Changed

  • terminal send gains --text-file <path|->: UTF-8 file input, - reads stdin. Mutually exclusive with --text (explicit error), and an explicitly passed empty file/stdin is rejected with the path named — an explicit flag must not degrade into a bare Enter send.
  • Input that is not valid UTF-8 is rejected, not repaired. Both branches decode through one new TextDecoder('utf-8', { fatal: true }), so a Latin-1 or UTF-16 file (easy to produce on Windows) fails with invalid_argument and the path named instead of reaching the agent with U+FFFD replacement characters. Sending a prompt that silently differs from the file is worse than refusing it.
  • --retry-request / --wait-submit now report that they require --text or --text-file; the old message named only --text even though a file-sourced prompt satisfies it.
  • New src/cli/terminal-send-text-source.ts resolves the send text from --text or --text-file. terminalSendHandler calls it as its first step, so the payload is fully materialized before prompt candidacy, the prompt-delivery capability preflight, and the --retry-request check. That ordering matters: the retry ID is bound to the prompt payload, and --retry-request / --wait-submit are only legal for a prompt candidate — a file-sourced prompt has to count as one, and an unreadable file must fail before any host contact.
  • Agent-prompt semantics are unchanged: text from a file combined with --enter (and not --interrupt) is classified exactly like --text.
  • The existing 16 MiB terminal-input limit is enforced through the canonical assertTerminalInputWithinLimit / TERMINAL_INPUT_MAX_BYTES (no new limit invented). An oversized file is refused from its stat size, before a read stream is opened.
  • The bounded stdin reader used by artifacts create was extracted to src/cli/bounded-stdin-text.ts and reused; behavior and error message there are unchanged. It now exposes a byte-level readStreamBytesWithinLimit (so terminal input can be decoded strictly) and keeps a plain Uint8Array chunk as bytes rather than stringifying it into "226,130,172".
  • Spec src/cli/specs/terminal-send.ts: usage becomes [--text <text> | --text-file <path|->], text-file joins allowedFlags, and a note documents the file/stdin form and its refusals, including the non-UTF-8 one.

Why

Multi-line dispatch briefings through --text are quoting-hostile on every shell (worst on Windows), and a truncated briefing is one of the feeders of the paste-without-submit failures coordinators then have to untangle. Reading from a file/stdin removes the quoting layer entirely. Stdin precedent already existed in-tree for artifacts; this promotes it to a shared, concretely-named module.

Rebased onto current main after #16904 moved the send handler to src/cli/handlers/terminal-send.ts and its spec to src/cli/specs/terminal-send.ts. The new coverage lives in its own src/cli/handlers/terminal-send-text-file.test.ts rather than growing terminal.test.ts past the 800-line test budget.

Linked Issue

Fixes #14915

Visual Proof

N/A — CLI flag with no UI surface; behavior is covered by the tests listed below (file, stdin, exclusivity, missing file, empty file, size limit, agent-prompt classification, retry-request binding, help/usage).

Testing

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

Windows 11, Node 24.19.0, pnpm 12 (corepack). No live end-to-end run against a packaged build, so the manual box stays unchecked.

  • pnpm tc:cli — exit 0
  • pnpm tc:node — exit 0
  • vitest run src/cli/bounded-stdin-text.test.ts src/cli/handlers/terminal-send-text-file.test.ts — 20 passed. 16 cover the CLI (multi-line UTF-8 file, stdin, --text + --text-file conflict, missing file, empty file, empty stdin, oversized file refused before createReadStream, oversized stdin, non-UTF-8 file and non-UTF-8 stdin both refused with terminal.send never called, a multi-byte character split across two stdin chunks still joining, agent-prompt classification through the capability preflight, --retry-request bound to the file payload, unreadable file failing before any host contact, the --text or --text-file flag message, help usage); 4 cover the bounded reader (Uint8Array chunk bytes, byte-length limit, subarray view, string chunks)
  • vitest run src/cli/handlers/terminal.test.ts src/cli/handlers/artifacts.test.ts — 36 passed (unchanged upstream send coverage plus artifacts, green after the stdin-reader extraction)
  • vitest run src/cli — 1153 passed / 13 failed. The same 13 fail on a clean checkout of the base commit (9d29e6878e) on this machine: orchestration-mutation-recovery (3), orchestration-gate-cli (1), orchestration-timeout-cli (1), orchestration-worker-cli (2) and runtime/client-recovery (6), all asserting shell quoting of recovery commands. None touch this diff.
  • ORCA_CODE_QUALITY_BASE=upstream/main pnpm run check:code-quality:changed — 0 new finding(s) across 7 changed file(s) for native, type-aware and React Doctor
  • oxlint on the 7 changed files — 0 findings; pnpm run check:max-lines-ratchet — OK, no new bypasses

Full pnpm lint / pnpm test / pnpm build were not run locally; CI covers them.

AI Disclosure

Implemented by a Codex lane under my orchestration (strict TDD); rebased, re-scoped to the new file layout, and re-verified locally with Claude Code assistance.

Review

  • Cross-platform: resolve(cwd, path) for the file path, never a hand-built separator; stdin is read as a stream with no tty assumption; no shell is involved, which is the point of the flag on Windows.
  • SSH / remote & wire compatibility: none. The RPC payload keeps the same text field and the same agentPrompt / waitSubmitMs shape; only where the CLI sources the string changed. The file is read on the client, which is correct — the path the user types is a client path.
  • Folder workspaces: unaffected; the flag never inspects the workspace type.
  • Agent / integration compatibility: --text-file is additive. Existing --text callers take an identical code path, and the old-host and legacy-prompt branches are untouched.
  • Performance: input is bounded by the existing 16 MiB limit before any RPC, and an oversized file is rejected from its stat size without streaming it into memory.
  • Security: file errors report only the path the caller passed, never file contents nor the offending bytes. No new privilege boundary is crossed — the CLI already reads caller-supplied files for artifacts create.
  • UI quality: N/A, no UI surface.

Agent skill upstream boundary

  • Not applicable, or this change follows docs/reference/agent-skill-sharing-upstream-boundary.md and copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Checklist

  • This PR is small and focused
  • I explained what changed and why (including ELI5)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

Author

X: @EnricoPin

@greptile-apps

greptile-apps Bot commented Aug 30, 2026 •

Copy link
Copy Markdown

Greptile Summary

The PR adds --text-file <path|-> to terminal send, supporting bounded UTF-8 input from files or stdin while preserving existing terminal-send semantics.

  • Rejects conflicting, empty, unreadable, and oversized input before issuing the terminal RPC.
  • Extracts the existing bounded stdin reader for reuse by terminal and artifact commands.
  • Updates CLI usage and adds file, stdin, validation, size-limit, and agent-prompt coverage.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
src/cli/bounded-stdin-text.ts Extracts a reusable stream reader that stops once cumulative input exceeds the supplied byte limit.
src/cli/handlers/artifacts.ts Replaces the local stdin implementation with the shared bounded reader without changing its error contract.
src/cli/handlers/terminal.ts Adds file and stdin text sourcing with an early file-size check, bounded streaming, exclusivity validation, and unchanged RPC semantics.
src/cli/handlers/terminal.test.ts Covers file and stdin input, validation errors, bounded oversized input, help output, and agent-prompt classification.
src/cli/specs/core.ts Registers and documents the new mutually exclusive `--text-file <path

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A[terminal send] --> B{Input source}
    B -->|--text| C[Inline text]
    B -->|--text-file path| D[Stat file]
    B -->|--text-file -| E[Read stdin]
    D --> F[Bounded stream reader]
    E --> F
    C --> G[Validate terminal input limit]
    F --> G
    G --> H[terminal.send RPC]
Loading

Reviews (2): Last reviewed commit: "fix(cli): bound terminal text file reads" | Re-trigger Greptile

Comment thread src/cli/handlers/terminal.ts Outdated
@coderabbitai

coderabbitai Bot commented Aug 30, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: c5e2d02e-8401-4bb2-bbd1-035d68d97fb2

📥 Commits

Reviewing files that changed from the base of the PR and between 85237e4109c78e726422b6ded7d66737f3b65f89 and 22f58c0.

📒 Files selected for processing (6)
  • src/cli/bounded-stdin-text.test.ts
  • src/cli/bounded-stdin-text.ts
  • src/cli/handlers/terminal-send-text-file.test.ts
  • src/cli/handlers/terminal-send.ts
  • src/cli/specs/terminal-send.ts
  • src/cli/terminal-send-text-source.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

Adds bounded UTF-8 text reading for async streams and stdin. Adds terminal send --text-file <path|-> with file and stdin support, size limits, empty-input checks, and flag validation. Integrates resolved text before prompt and retry handling. Reuses the bounded reader for artifact input and adds comprehensive tests.

Merge Risk: ⚪ Minimal · up to 22f58

Terminal send now supports bounded UTF-8 text from files or stdin while retaining existing prompt and retry behavior. The previously incomplete validation guidance has been corrected, leaving no current merge-blocking risk.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 16 functions across 10 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The implementation satisfies the coding objectives in [#14915] by adding --text-file support, stdin support through --text-file -, reliable multiline input handling, mutual exclusion with --text, and …
Out of Scope Changes check ✅ Passed The changes remain within scope. The shared bounded-stream utility, artifact-handler refactor, CLI specification updates, implementation, and focused tests directly support the terminal send input fea…
Title check ✅ Passed The title clearly and concisely describes the main change: adding file or stdin input for terminal send text.
Description check ✅ Passed The description follows the repository template and covers the change, rationale, linked issue, testing, compatibility, security, performance, AI disclosure, and checklist. It also explains that full …
  • Fix all pre-merge checks with AI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5013e96a-64f4-44c3-b417-7ddc09eb5cce

📥 Commits

Reviewing files that changed from the base of the PR and between d607a63 and 32bdf27f8912709655d4e3f73a329e9d936b9696.

📒 Files selected for processing (5)
  • src/cli/bounded-stdin-text.ts
  • src/cli/handlers/artifacts.ts
  • src/cli/handlers/terminal.test.ts
  • src/cli/handlers/terminal.ts
  • src/cli/specs/core.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Comment thread src/cli/handlers/terminal.ts Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The feature works and is well-tested, but the file path reads the whole file into memory before enforcing the 16 MiB limit (the stdin path is streaming-bounded), and the file too-large error is a plain Error while the stdin one is a RuntimeClientError — so --json consumers get different error codes for the same condition. Both are anchored inline.

Reviewed changes

  • terminal send gains --text-file <path|-> (UTF-8 file, or stdin via -), mutually exclusive with --text, with explicit rejection of empty input and the existing 16 MiB terminal-input limit enforced.
  • Extracted the bounded stdin reader used by artifacts create into src/cli/bounded-stdin-text.ts and reused it in both handlers (artifact behavior unchanged).
  • Agent-prompt classification (text + enter, not interrupt) is preserved for file/stdin input.
  • Spec/usage line updated, plus tests for file, stdin, exclusivity, missing/empty file, size limit, agent-prompt semantics, and help text.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

Comment thread src/cli/handlers/terminal.ts Outdated
Comment thread src/cli/handlers/terminal.ts Outdated
@Tauri-EPO
Tauri-EPO force-pushed the Tauri-EPO/terminal-send-text-file branch from 32bdf27 to 7af6d50 Compare August 31, 2026 13:50
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 45732c9a-c376-4ed0-9b75-ab1254e1b5e1

📥 Commits

Reviewing files that changed from the base of the PR and between 212c0e4 and 7af6d50c3ba5bcb90e0883d1088f767768defcbc.

📒 Files selected for processing (5)
  • src/cli/bounded-stdin-text.ts
  • src/cli/handlers/artifacts.ts
  • src/cli/handlers/terminal.test.ts
  • src/cli/handlers/terminal.ts
  • src/cli/specs/core.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/cli/handlers/artifacts.ts
  • src/cli/specs/core.ts
  • src/cli/handlers/terminal.ts
  • src/cli/handlers/terminal.test.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.

Comment thread src/cli/bounded-stdin-text.ts Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

The delta against the prior review resolves both open findings: the file read path is now bounded and the too-large error surface is unified.

  • Bounded the --text-file file read — readTerminalSendTextFile now stats the path first (size pre-check) and streams via createReadStream through readTextStreamWithinLimit, so oversized files are rejected before a read stream is even opened.
  • Generalized the bounded stdin reader — extracted readTextStreamWithinLimit(input, maxBytes, createTooLargeError) with a readStdinTextWithinLimit wrapper; artifacts.ts reuses it with unchanged behavior.
  • Unified the too-large error code — file and stdin paths both throw RuntimeClientError('invalid_argument', TERMINAL_INPUT_TOO_LARGE_ERROR), so --json consumers no longer see divergent codes.
  • Added regression tests — oversized-file short-circuit (createReadStream never called) and oversized-stdin JSON code parity, via a vi.hoisted mock of node:fs createReadStream.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

@Tauri-EPO
Tauri-EPO force-pushed the Tauri-EPO/terminal-send-text-file branch from 7af6d50 to 85237e4 Compare September 7, 2026 11:50
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@Tauri-EPO

Copy link
Copy Markdown
Contributor Author

Rebased onto upstream/main at 9d29e6878e, after #16904 moved the send handler to src/cli/handlers/terminal-send.ts and its spec to src/cli/specs/terminal-send.ts. Head is now 85237e4109c78e726422b6ded7d66737f3b65f89 (single commit, 6 files).

What moved: the flag lives on TERMINAL_SEND_COMMAND_SPEC instead of specs/core.ts, the text resolution moved into a new src/cli/terminal-send-text-source.ts, and the new coverage moved to src/cli/handlers/terminal-send-text-file.test.ts so terminal.test.ts (687 lines upstream) stays inside the 800-line test budget.

Ordering note: terminalSendHandler now resolves the text from --text / --text-file as its first step, before promptCandidate, the prompt-delivery capability preflight and the --retry-request check — the retry ID is bound to the prompt payload, so the payload must exist first, and an unreadable file must fail before any host contact. Two tests pin that: --retry-request with --text-file reaches terminal.send with the file text and the orchestrationRequestId option, and a missing --text-file with --retry-request rejects without getCliStatus ever being called.

Verified on Windows 11, Node 24.19.0, pnpm 12 (corepack): pnpm tc:cli and pnpm tc:node exit 0; vitest run src/cli/handlers/terminal-send-text-file.test.ts 12 passed; vitest run src/cli/handlers/terminal.test.ts src/cli/handlers/artifacts.test.ts 36 passed; pnpm run check:code-quality:changed reports 0 new findings across the 6 changed files. vitest run src/cli is 1153 passed / 13 failed, and the same 13 fail on a clean checkout of 9d29e6878e on this machine (all shell-quoting assertions in the orchestration recovery and client-recovery suites, none in this diff). No live end-to-end run against a packaged build.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/cli/handlers/terminal-send.ts (1)

26-26: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Update the prompt-option validation message.

--text-file now satisfies this requirement. The message still says that --retry-request and --wait-submit require --text.

State that either --text or --text-file is required, with --enter and without --interrupt.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 335eba78-e889-478e-a68e-255456aa5000

📥 Commits

Reviewing files that changed from the base of the PR and between 8cd0abf and 85237e4109c78e726422b6ded7d66737f3b65f89.

📒 Files selected for processing (6)
  • src/cli/bounded-stdin-text.ts
  • src/cli/handlers/artifacts.ts
  • src/cli/handlers/terminal-send-text-file.test.ts
  • src/cli/handlers/terminal-send.ts
  • src/cli/specs/terminal-send.ts
  • src/cli/terminal-send-text-source.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/cli/handlers/artifacts.ts
  • src/cli/bounded-stdin-text.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 5 remain after this review.

Comment thread src/cli/terminal-send-text-source.ts Outdated

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the delta since the prior pullfrog review at 7af6d50: a rebase onto current main plus an extraction of the file/stdin resolution into its own module.

  • Extracted the input resolution — readTerminalSendTextFile and getTerminalSendText moved out of the terminal handler into src/cli/terminal-send-text-source.ts; the logic is byte-identical to the previously-reviewed version.
  • Integrated into the richer handler — src/cli/handlers/terminal-send.ts now resolves input via await getTerminalSendText(flags, cwd), so file/stdin input flows through the existing prompt-candidacy, --retry-request/--wait-submit preflight, and legacy-host paths exactly like --text.
  • Relocated spec and coverage — the usage/flag changes now live in src/cli/specs/terminal-send.ts, and the tests in src/cli/handlers/terminal-send-text-file.test.ts (12 tests passing; tc:cli clean).

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

Review follow-up: the bounded reader now keeps Uint8Array chunks as bytes
instead of stringifying them, terminal input is decoded with a fatal UTF-8
decoder so a malformed file or stdin is refused rather than sent with U+FFFD
replacements, and the prompt-only flag error names --text-file.
@Tauri-EPO
Tauri-EPO force-pushed the Tauri-EPO/terminal-send-text-file branch from 85237e4 to 22f58c0 Compare September 7, 2026 15:23
@Tauri-EPO

Copy link
Copy Markdown
Contributor Author

Follow-up on the CodeRabbit outside-diff comment for src/cli/handlers/terminal-send.ts:26: applied in 22f58c0.

--text-file does satisfy the prompt-candidate requirement, so the message was wrong. It now reads:

--retry-request and --wait-submit require --text or --text-file with --enter and without --interrupt.

A regression test in src/cli/handlers/terminal-send-text-file.test.ts asserts the message names --text or --text-file.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the delta against the prior pullfrog review at 85237e4: a fix to the shared bounded reader's byte handling plus strict UTF-8 validation on the file/stdin input path.

  • Fixed Uint8Array chunk handling — readStreamBytesWithinLimit now wraps plain Uint8Array chunks with Buffer.from instead of stringifying them, so stdin/file bytes decode correctly rather than into decimal lists like "226,130,172".
  • Split the shared reader into bytes/text layers — readStreamBytesWithinLimit returns a Buffer; readTextStreamWithinLimit (lossy, unchanged for artifacts) and readStdinBytesWithinLimit build on it.
  • Rejected invalid UTF-8 at the source — decodeTerminalSendText uses TextDecoder('utf-8', { fatal: true }), so a non-UTF-8 file or stdin is refused instead of silently sent with U+FFFD replacement characters, including split multi-byte sequences.
  • Corrected the prompt-option message — the --retry-request/--wait-submit preflight now names --text or --text-file.
  • Extended coverage — new bounded-stdin-text.test.ts plus tests for invalid-UTF-8 file/stdin refusal, split multi-byte characters, and the updated flag-requirement message.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) | 𝕏

@Tauri-EPO

Copy link
Copy Markdown
Contributor Author

Closing. On v1.4.200 a three-line --text payload reaches the terminal intact (24 bytes written, all three lines executed), so the truncation that motivated #14915 no longer reproduces here. What this PR still offered was convenience for long briefings, not a fix. Branch kept on the fork.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: terminal send needs --text-file or stdin — multi-line text cannot be sent reliably today

1 participant