Give injected agent submit Enter a longer settle delay
The trailing CR that submits orchestrator-injected input was written only 15ms after the body, inside TUI agents' paste-coalescing window, so codex (and other paste-detecting agents) intermittently swallowed it as a newline and left the message composed but unsent. Centralize the per-piece timing in a pure pieceWriteDelay helper: keep 15ms between body lines but give the final lone Enter a 100ms settle gap so the agent closes the preceding burst and registers the CR as submit. Covers send_input, send_message, timers, and the spawn initial prompt (all go through writeInput). Resolves the codex composer-submit TODO item.
This commit is contained in:
@@ -3,6 +3,7 @@ package app
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestInputWritePiecesOnlySplitAgentEnters(t *testing.T) {
|
||||
@@ -27,3 +28,63 @@ func TestInputWritePiecesOnlySplitAgentEnters(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestPieceWriteDelay(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
index int
|
||||
total int
|
||||
piece []byte
|
||||
want time.Duration
|
||||
}{
|
||||
{
|
||||
name: "first piece",
|
||||
index: 0,
|
||||
total: 3,
|
||||
piece: []byte("body"),
|
||||
want: 0,
|
||||
},
|
||||
{
|
||||
name: "middle body piece",
|
||||
index: 1,
|
||||
total: 3,
|
||||
piece: []byte("body"),
|
||||
want: agentInterPieceDelay,
|
||||
},
|
||||
{
|
||||
name: "final carriage return submit",
|
||||
index: 1,
|
||||
total: 2,
|
||||
piece: []byte("\r"),
|
||||
want: agentSubmitSettleDelay,
|
||||
},
|
||||
{
|
||||
name: "final newline submit",
|
||||
index: 1,
|
||||
total: 2,
|
||||
piece: []byte("\n"),
|
||||
want: agentSubmitSettleDelay,
|
||||
},
|
||||
{
|
||||
name: "final non-enter piece",
|
||||
index: 2,
|
||||
total: 3,
|
||||
piece: []byte("tail"),
|
||||
want: agentInterPieceDelay,
|
||||
},
|
||||
{
|
||||
name: "standalone enter fast path",
|
||||
index: 0,
|
||||
total: 1,
|
||||
piece: []byte("\r"),
|
||||
want: 0,
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
if got := pieceWriteDelay(tc.index, tc.total, tc.piece); got != tc.want {
|
||||
t.Fatalf("pieceWriteDelay(%d, %d, %q) = %s, want %s", tc.index, tc.total, tc.piece, got, tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user