replace ptyc with forkpty() via Dart FFI
test / unit + widget + golden + a11y (push) Failing after 3m13s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped

NativePty calls forkpty() directly — no helper binary, no socketpair,
no SCM_RIGHTS. The master fd stays in-process. Reader isolate uses
poll() for clean shutdown.

Based on the pty-spike proof-of-concept. Platform-aware: macOS uses
libSystem (DynamicLibrary.process), Linux needs libutil.so.1.
TIOCSWINSZ platform-detected.

PaneRegistry updated to use NativePty. registerPaneCommands no longer
needs a Toolchain parameter. All ptyc references removed from the
daemon layer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeroen Schweitzer
2026-04-30 20:30:15 +02:00
co-authored by Claude Opus 4.6
parent cf2ae48201
commit 5aa0eb46e4
12 changed files with 708 additions and 336 deletions
-5
View File
@@ -35,7 +35,6 @@ void main() {
final pane = await registry.spawn(
kind: PaneKind.terminal,
argv: const ['/bin/echo', 'hi'],
ptycPath: ptycPath,
);
expect(pane.id, startsWith('p_'));
@@ -50,7 +49,6 @@ void main() {
await registry.spawn(
kind: PaneKind.terminal,
argv: const ['/bin/echo', 'hello-panes'],
ptycPath: ptycPath,
);
// /bin/echo closes its pty quickly. Wait briefly for output +
@@ -73,7 +71,6 @@ void main() {
final pane = await registry.spawn(
kind: PaneKind.terminal,
argv: const ['/bin/cat'],
ptycPath: ptycPath,
);
final writeCount = registry.write(pane.id, utf8.encode('abc'));
@@ -90,7 +87,6 @@ void main() {
final pane = await registry.spawn(
kind: PaneKind.terminal,
argv: const ['/bin/cat'],
ptycPath: ptycPath,
);
await registry.close(pane.id);
@@ -109,7 +105,6 @@ void main() {
final pane = await registry.spawn(
kind: PaneKind.claude,
argv: const ['/bin/sh', '-c', 'exit 0'],
ptycPath: ptycPath,
);
expect(pane.kind, PaneKind.claude);
expect(pane.toJson()['kind'], 'claude');