fix(mobile): only clear terminal output after the computer accepts Clear (#31703)

* fix(mobile): clear terminal output only after the computer accepts Clear

The phone erased its terminal before sending terminal.clearBuffer and
reported success on any reply, refusal included. Wait for the host's
{ clear: { cleared: true } } reply, fail immediately when disconnected so
the request cannot replay after reconnect, ignore late replies after the
client or terminal changed, and resubscribe a subscribed terminal so its
snapshot (including output that arrived during the request) replaces the
old screen. An unsubscribed tab draws its snapshot when it next subscribes.

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>

* test(mobile): return the subscribe result from the gesture recording adapter

* fix(mobile): keep accepted clears when the terminal view re-renders

The WebView handle is rebuilt on every render and a relay/direct cutover
bumps the connection generation without changing the host, so both
checks treated accepted clears as stale: the phone neither reloaded the
output nor showed a toast. Only a replaced client is stale now.

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
This commit is contained in:
Neil
2026-10-28 23:09:18 +00:00
committed by GitHub
co-authored by Kelvin Amoaba
parent 78ad9f4255
commit 90ef900757
10 changed files with 783 additions and 502 deletions
@@ -61,6 +61,13 @@
"$rpc": "undefined"
}
},
"2744881d0748": {
"name": "terminal-subscribe",
"ordinal": 8,
"value": {
"handle": "terminal-1"
}
},
"31a1ebf3ac68": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -98,16 +105,6 @@
}
}
},
"3dc7f55dee2a": {
"name": "toast",
"ordinal": 7,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"41eb762c53f0": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -145,6 +142,43 @@
}
}
},
"42b4a7d170de": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"clear": {
"cleared": true,
"handle": "terminal-1"
}
}
}
}
},
"47c387a75ffc": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -249,6 +283,16 @@
"startedAt": 16
}
},
"7e0ebd472c7b": {
"name": "toast",
"ordinal": 9,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"8224ccdb2cd8": {
"name": "terminal.send#1",
"ordinal": 2,
@@ -307,6 +351,13 @@
"ordinal": 6,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.clearBuffer\",\"params\":{\"terminal\":\"terminal-1\"}}"
},
"94a34b9a1800": {
"name": "terminal-unsubscribe",
"ordinal": 7,
"value": {
"handle": "terminal-1"
}
},
"94ce15ec36dc": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -482,7 +533,7 @@
}
}
},
"afb61324f54a": {
"bfd73b81d7a1": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -499,7 +550,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -598,40 +649,6 @@
"value": {
"$rpc": "undefined"
}
},
"ebaa6b64425b": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"cleared": true
}
}
}
}
},
"recording": {
@@ -692,7 +709,7 @@
{
"id": "terminal-gesture-flush-and-clear.normal:clearing",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "afb61324f54a"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -706,7 +723,7 @@
{
"id": "terminal-gesture-flush-and-clear.normal:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -714,7 +731,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -733,7 +750,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-absent:clearing",
"observation": {
"sender": ["47c387a75ffc", "e24bc71ad7f1", "afb61324f54a"],
"sender": ["47c387a75ffc", "e24bc71ad7f1", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -747,7 +764,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-absent:cleared",
"observation": {
"sender": ["47c387a75ffc", "e24bc71ad7f1", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "e24bc71ad7f1", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -755,7 +772,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -774,7 +791,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-null:clearing",
"observation": {
"sender": ["47c387a75ffc", "9c7f27a40956", "afb61324f54a"],
"sender": ["47c387a75ffc", "9c7f27a40956", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -788,7 +805,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-null:cleared",
"observation": {
"sender": ["47c387a75ffc", "9c7f27a40956", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "9c7f27a40956", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -796,7 +813,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -815,7 +832,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-ok-missing:clearing",
"observation": {
"sender": ["47c387a75ffc", "0bbc8e9d2e60", "afb61324f54a"],
"sender": ["47c387a75ffc", "0bbc8e9d2e60", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -829,7 +846,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-ok-missing:cleared",
"observation": {
"sender": ["47c387a75ffc", "0bbc8e9d2e60", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "0bbc8e9d2e60", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -837,7 +854,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -856,7 +873,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-string-error:clearing",
"observation": {
"sender": ["47c387a75ffc", "41eb762c53f0", "afb61324f54a"],
"sender": ["47c387a75ffc", "41eb762c53f0", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -870,7 +887,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-string-error:cleared",
"observation": {
"sender": ["47c387a75ffc", "41eb762c53f0", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "41eb762c53f0", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -878,7 +895,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -897,7 +914,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-object-error:clearing",
"observation": {
"sender": ["47c387a75ffc", "8412fcb9c620", "afb61324f54a"],
"sender": ["47c387a75ffc", "8412fcb9c620", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -911,7 +928,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-object-error:cleared",
"observation": {
"sender": ["47c387a75ffc", "8412fcb9c620", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "8412fcb9c620", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -919,7 +936,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -938,7 +955,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused:clearing",
"observation": {
"sender": ["47c387a75ffc", "dfe8d1bab9c5", "afb61324f54a"],
"sender": ["47c387a75ffc", "dfe8d1bab9c5", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -952,7 +969,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused:cleared",
"observation": {
"sender": ["47c387a75ffc", "dfe8d1bab9c5", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "dfe8d1bab9c5", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -960,7 +977,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -979,7 +996,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused-no-message:clearing",
"observation": {
"sender": ["47c387a75ffc", "9850afd5b555", "afb61324f54a"],
"sender": ["47c387a75ffc", "9850afd5b555", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -993,7 +1010,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused-no-message:cleared",
"observation": {
"sender": ["47c387a75ffc", "9850afd5b555", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "9850afd5b555", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1001,7 +1018,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -1020,7 +1037,7 @@
{
"id": "terminal-gesture-flush-and-clear.method-not-found:clearing",
"observation": {
"sender": ["47c387a75ffc", "31a1ebf3ac68", "afb61324f54a"],
"sender": ["47c387a75ffc", "31a1ebf3ac68", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1034,7 +1051,7 @@
{
"id": "terminal-gesture-flush-and-clear.method-not-found:cleared",
"observation": {
"sender": ["47c387a75ffc", "31a1ebf3ac68", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "31a1ebf3ac68", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1042,7 +1059,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -1061,7 +1078,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection:clearing",
"observation": {
"sender": ["47c387a75ffc", "aa1058fa6654", "afb61324f54a"],
"sender": ["47c387a75ffc", "aa1058fa6654", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1075,7 +1092,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection:cleared",
"observation": {
"sender": ["47c387a75ffc", "aa1058fa6654", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "aa1058fa6654", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1083,7 +1100,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -1102,7 +1119,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection-no-message:clearing",
"observation": {
"sender": ["47c387a75ffc", "60ae3b4c26a5", "afb61324f54a"],
"sender": ["47c387a75ffc", "60ae3b4c26a5", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1116,7 +1133,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection-no-message:cleared",
"observation": {
"sender": ["47c387a75ffc", "60ae3b4c26a5", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "60ae3b4c26a5", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1124,7 +1141,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
}
]
@@ -17,7 +17,7 @@
"$rpc": "null"
}
},
"0db561233383": {
"15e2e6598861": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -34,44 +34,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"error": {
"message": "inner refused"
},
"ok": false
}
}
}
},
"13e21e9d5a19": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -89,7 +52,22 @@
}
}
},
"14826318e3f0": {
"204da356c8b7": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"$rpc": "undefined"
}
},
"2744881d0748": {
"name": "terminal-subscribe",
"ordinal": 8,
"value": {
"handle": "terminal-1"
}
},
"4176bcebcf7b": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -106,7 +84,78 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"error": "refused"
}
}
}
},
"42b4a7d170de": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"clear": {
"cleared": true,
"handle": "terminal-1"
}
}
}
}
},
"4696dadf3552": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
@@ -121,55 +170,6 @@
}
}
},
"18f37862e26f": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true
}
}
},
"204da356c8b7": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"$rpc": "undefined"
}
},
"3dc7f55dee2a": {
"name": "toast",
"ordinal": 7,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"47c387a75ffc": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -212,7 +212,7 @@
}
}
},
"4dd92d5c81be": {
"5f9d4dda97d0": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -229,41 +229,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"$rpc": "null"
}
}
}
},
"52f4b33bfffe": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -273,8 +239,8 @@
"settledAt": 16,
"value": {
"error": {
"code": "refused",
"message": ""
"code": "method_not_found",
"message": "Unknown method"
},
"id": "frame-3",
"ok": false
@@ -309,6 +275,16 @@
"startedAt": 16
}
},
"7e0ebd472c7b": {
"name": "toast",
"ordinal": 9,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"8224ccdb2cd8": {
"name": "terminal.send#1",
"ordinal": 2,
@@ -318,7 +294,17 @@
"status": "pending",
"startedAt": 16
},
"85797d45b4ec": {
"85a38010bc83": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"orchestration.workerTerminalUserInput\",\"params\":{\"terminal\":\"terminal-1\"}}"
},
"8716af94ca80": {
"name": "terminal.clearBuffer#1",
"ordinal": 6,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.clearBuffer\",\"params\":{\"terminal\":\"terminal-1\"}}"
},
"8f3a96ddce74": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -335,7 +321,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -345,17 +331,12 @@
"settledAt": 16,
"error": {
"category": "Error",
"message": "transport failure",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"85a38010bc83": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 4,
"json": "{\"id\":\"frame-2\",\"deviceToken\":\"recording-device\",\"method\":\"orchestration.workerTerminalUserInput\",\"params\":{\"terminal\":\"terminal-1\"}}"
},
"86e68519e4fc": {
"8fb1e35238ae": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -372,7 +353,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -382,17 +363,51 @@
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"error": "refused"
}
"ok": true
}
}
},
"8716af94ca80": {
"949a86468951": {
"name": "terminal.clearBuffer#1",
"ordinal": 6,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.clearBuffer\",\"params\":{\"terminal\":\"terminal-1\"}}"
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"error": {
"code": "refused",
"message": "outer refused"
},
"id": "frame-3",
"ok": false
}
}
},
"94a34b9a1800": {
"name": "terminal-unsubscribe",
"ordinal": 7,
"value": {
"handle": "terminal-1"
}
},
"94ce15ec36dc": {
"name": "orchestration.workerTerminalUserInput#1",
@@ -430,6 +445,41 @@
}
}
},
"985c83a876c6": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"error": {
"code": "refused",
"message": ""
},
"id": "frame-3",
"ok": false
}
}
},
"9fa6cd0b7fa0": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -462,7 +512,7 @@
"startedAt": 0
}
},
"a2ee798dd5e4": {
"a99e20d3b060": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -479,39 +529,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 16,
"settledAt": 16,
"error": {
"category": "Error",
"message": "Connection closed",
"isRpcDeliveryUnknown": true
}
}
},
"af47e4950d3c": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -520,16 +538,15 @@
"startedAt": 16,
"settledAt": 16,
"value": {
"error": {
"code": "refused",
"message": "outer refused"
},
"id": "frame-3",
"ok": false
"ok": true,
"result": {
"$rpc": "null"
}
}
}
},
"afb61324f54a": {
"bfd73b81d7a1": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -546,7 +563,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -568,7 +585,7 @@
"$rpc": "null"
}
},
"e9ab8b56056e": {
"e14358e73867": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -585,50 +602,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"error": {
"code": "method_not_found",
"message": "Unknown method"
},
"id": "frame-3",
"ok": false
}
}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"ebaa6b64425b": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -640,11 +614,54 @@
"id": "frame-3",
"ok": true,
"result": {
"cleared": true
"error": {
"message": "inner refused"
},
"ok": false
}
}
}
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
},
"f0e97f295e31": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "rejected",
"startedAt": 16,
"settledAt": 16,
"error": {
"category": "Error",
"message": "transport failure",
"isRpcDeliveryUnknown": true
}
}
},
"f9995c5eb101": {
"name": "toast",
"ordinal": 7,
@@ -712,7 +729,7 @@
{
"id": "terminal-gesture-flush-and-clear.prelude:clearing",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "afb61324f54a"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -726,7 +743,7 @@
{
"id": "terminal-gesture-flush-and-clear.prelude:cleanup",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "a2ee798dd5e4"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "8f3a96ddce74"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -740,7 +757,7 @@
{
"id": "terminal-gesture-flush-and-clear.normal:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -748,13 +765,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
"id": "terminal-gesture-flush-and-clear.result-absent:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "18f37862e26f"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "8fb1e35238ae"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -762,13 +779,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.result-null:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "4dd92d5c81be"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "a99e20d3b060"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -776,13 +793,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.inner-ok-missing:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "86e68519e4fc"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "4176bcebcf7b"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -790,13 +807,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.inner-false-string-error:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "13e21e9d5a19"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "15e2e6598861"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -804,13 +821,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.inner-false-object-error:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "0db561233383"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "e14358e73867"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -818,13 +835,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.outer-refused:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "af47e4950d3c"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "949a86468951"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -832,13 +849,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.outer-refused-no-message:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "52f4b33bfffe"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "985c83a876c6"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -846,13 +863,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.method-not-found:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "e9ab8b56056e"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "5f9d4dda97d0"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -860,13 +877,13 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["f9995c5eb101"]
}
},
{
"id": "terminal-gesture-flush-and-clear.transport-rejection:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "85797d45b4ec"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "f0e97f295e31"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -880,7 +897,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection-no-message:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "14826318e3f0"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "4696dadf3552"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -54,40 +54,6 @@
"$rpc": "null"
}
},
"165d659fda65": {
"name": "terminal.clearBuffer#1",
"ordinal": 3,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"cleared": true
}
}
}
},
"18ae72c963d5": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -177,6 +143,13 @@
}
}
},
"2744881d0748": {
"name": "terminal-subscribe",
"ordinal": 8,
"value": {
"handle": "terminal-1"
}
},
"3a2f96d25da8": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -268,6 +241,43 @@
"message": "Terminal cleared"
}
},
"42b4a7d170de": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"clear": {
"cleared": true,
"handle": "terminal-1"
}
}
}
}
},
"47c387a75ffc": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -310,7 +320,7 @@
}
}
},
"5ec72f058605": {
"4b5c402c0aac": {
"name": "terminal.clearBuffer#1",
"ordinal": 3,
"args": [
@@ -327,7 +337,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -336,6 +346,50 @@
"startedAt": 16
}
},
"4d7959cb9208": {
"name": "terminal.clearBuffer#1",
"ordinal": 3,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-2",
"ok": true,
"result": {
"clear": {
"cleared": true,
"handle": "terminal-1"
}
}
}
}
},
"70f80fc43078": {
"name": "terminal-subscribe",
"ordinal": 6,
"value": {
"handle": "terminal-1"
}
},
"77d8a44e0dcc": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -364,6 +418,16 @@
"startedAt": 16
}
},
"7e0ebd472c7b": {
"name": "toast",
"ordinal": 9,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"8224ccdb2cd8": {
"name": "terminal.send#1",
"ordinal": 2,
@@ -464,6 +528,13 @@
}
}
},
"94a34b9a1800": {
"name": "terminal-unsubscribe",
"ordinal": 7,
"value": {
"handle": "terminal-1"
}
},
"94ce15ec36dc": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -573,17 +644,14 @@
"startedAt": 0
}
},
"a1ae5051ed70": {
"name": "toast",
"a8bcca91a365": {
"name": "terminal-unsubscribe",
"ordinal": 5,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
"handle": "terminal-1"
}
},
"afb61324f54a": {
"bfd73b81d7a1": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -600,7 +668,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -676,40 +744,6 @@
"$rpc": "undefined"
}
},
"ebaa6b64425b": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"cleared": true
}
}
}
},
"eecb4c1a0308": {
"name": "terminal.send#1",
"ordinal": 1,
@@ -807,7 +841,7 @@
{
"id": "terminal-gesture-flush-and-clear.normal:clearing",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "afb61324f54a"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -821,7 +855,7 @@
{
"id": "terminal-gesture-flush-and-clear.normal:cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -829,7 +863,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
},
{
@@ -861,7 +895,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-absent:clearing",
"observation": {
"sender": ["038694606b99", "5ec72f058605"],
"sender": ["038694606b99", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -875,7 +909,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-absent:cleared",
"observation": {
"sender": ["038694606b99", "165d659fda65"],
"sender": ["038694606b99", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -883,7 +917,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -915,7 +949,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-null:clearing",
"observation": {
"sender": ["3a2f96d25da8", "5ec72f058605"],
"sender": ["3a2f96d25da8", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -929,7 +963,7 @@
{
"id": "terminal-gesture-flush-and-clear.result-null:cleared",
"observation": {
"sender": ["3a2f96d25da8", "165d659fda65"],
"sender": ["3a2f96d25da8", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -937,7 +971,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -969,7 +1003,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-ok-missing:clearing",
"observation": {
"sender": ["8cc2f30cc0d2", "5ec72f058605"],
"sender": ["8cc2f30cc0d2", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -983,7 +1017,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-ok-missing:cleared",
"observation": {
"sender": ["8cc2f30cc0d2", "165d659fda65"],
"sender": ["8cc2f30cc0d2", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -991,7 +1025,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1023,7 +1057,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-string-error:clearing",
"observation": {
"sender": ["3ac9be406587", "5ec72f058605"],
"sender": ["3ac9be406587", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1037,7 +1071,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-string-error:cleared",
"observation": {
"sender": ["3ac9be406587", "165d659fda65"],
"sender": ["3ac9be406587", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1045,7 +1079,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1077,7 +1111,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-object-error:clearing",
"observation": {
"sender": ["2198adee8c06", "5ec72f058605"],
"sender": ["2198adee8c06", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1091,7 +1125,7 @@
{
"id": "terminal-gesture-flush-and-clear.inner-false-object-error:cleared",
"observation": {
"sender": ["2198adee8c06", "165d659fda65"],
"sender": ["2198adee8c06", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1099,7 +1133,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1131,7 +1165,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused:clearing",
"observation": {
"sender": ["8d84d72cf6d5", "5ec72f058605"],
"sender": ["8d84d72cf6d5", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1145,7 +1179,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused:cleared",
"observation": {
"sender": ["8d84d72cf6d5", "165d659fda65"],
"sender": ["8d84d72cf6d5", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1153,7 +1187,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1185,7 +1219,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused-no-message:clearing",
"observation": {
"sender": ["94fa272beafb", "5ec72f058605"],
"sender": ["94fa272beafb", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1199,7 +1233,7 @@
{
"id": "terminal-gesture-flush-and-clear.outer-refused-no-message:cleared",
"observation": {
"sender": ["94fa272beafb", "165d659fda65"],
"sender": ["94fa272beafb", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1207,7 +1241,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1239,7 +1273,7 @@
{
"id": "terminal-gesture-flush-and-clear.method-not-found:clearing",
"observation": {
"sender": ["e1076775e5c2", "5ec72f058605"],
"sender": ["e1076775e5c2", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1253,7 +1287,7 @@
{
"id": "terminal-gesture-flush-and-clear.method-not-found:cleared",
"observation": {
"sender": ["e1076775e5c2", "165d659fda65"],
"sender": ["e1076775e5c2", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1261,7 +1295,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1293,7 +1327,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection:clearing",
"observation": {
"sender": ["18ae72c963d5", "5ec72f058605"],
"sender": ["18ae72c963d5", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1307,7 +1341,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection:cleared",
"observation": {
"sender": ["18ae72c963d5", "165d659fda65"],
"sender": ["18ae72c963d5", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1315,7 +1349,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
},
{
@@ -1347,7 +1381,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection-no-message:clearing",
"observation": {
"sender": ["eecb4c1a0308", "5ec72f058605"],
"sender": ["eecb4c1a0308", "4b5c402c0aac"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1361,7 +1395,7 @@
{
"id": "terminal-gesture-flush-and-clear.transport-rejection-no-message:cleared",
"observation": {
"sender": ["eecb4c1a0308", "165d659fda65"],
"sender": ["eecb4c1a0308", "4d7959cb9208"],
"payloads": ["8224ccdb2cd8", "d9c52be2f839"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -1369,7 +1403,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["a1ae5051ed70"]
"effects": ["a8bcca91a365", "70f80fc43078", "3dc7f55dee2a"]
}
}
]
@@ -25,14 +25,48 @@
"$rpc": "undefined"
}
},
"3dc7f55dee2a": {
"name": "toast",
"ordinal": 7,
"2744881d0748": {
"name": "terminal-subscribe",
"ordinal": 8,
"value": {
"durationMs": {
"$rpc": "null"
"handle": "terminal-1"
}
},
"42b4a7d170de": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
"message": "Terminal cleared"
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"failWhenDisconnected": true
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"clear": {
"cleared": true,
"handle": "terminal-1"
}
}
}
}
},
"47c387a75ffc": {
@@ -105,6 +139,16 @@
"startedAt": 16
}
},
"7e0ebd472c7b": {
"name": "toast",
"ordinal": 9,
"value": {
"durationMs": {
"$rpc": "null"
},
"message": "Terminal cleared"
}
},
"8224ccdb2cd8": {
"name": "terminal.send#1",
"ordinal": 2,
@@ -124,6 +168,13 @@
"ordinal": 6,
"json": "{\"id\":\"frame-3\",\"deviceToken\":\"recording-device\",\"method\":\"terminal.clearBuffer\",\"params\":{\"terminal\":\"terminal-1\"}}"
},
"94a34b9a1800": {
"name": "terminal-unsubscribe",
"ordinal": 7,
"value": {
"handle": "terminal-1"
}
},
"94ce15ec36dc": {
"name": "orchestration.workerTerminalUserInput#1",
"ordinal": 3,
@@ -192,7 +243,7 @@
"startedAt": 0
}
},
"afb61324f54a": {
"bfd73b81d7a1": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
@@ -209,7 +260,7 @@
{
"name": "options",
"value": {
"$rpc": "absent"
"failWhenDisconnected": true
}
}
],
@@ -238,40 +289,6 @@
"value": {
"$rpc": "undefined"
}
},
"ebaa6b64425b": {
"name": "terminal.clearBuffer#1",
"ordinal": 5,
"args": [
{
"name": "method",
"value": "terminal.clearBuffer"
},
{
"name": "params",
"value": {
"terminal": "terminal-1"
}
},
{
"name": "options",
"value": {
"$rpc": "absent"
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 16,
"settledAt": 16,
"value": {
"id": "frame-3",
"ok": true,
"result": {
"cleared": true
}
}
}
}
},
"recording": {
@@ -332,7 +349,7 @@
{
"id": "clearing",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "afb61324f54a"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "bfd73b81d7a1"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -346,7 +363,7 @@
{
"id": "cleared",
"observation": {
"sender": ["47c387a75ffc", "94ce15ec36dc", "ebaa6b64425b"],
"sender": ["47c387a75ffc", "94ce15ec36dc", "42b4a7d170de"],
"payloads": ["8224ccdb2cd8", "85a38010bc83", "8716af94ca80"],
"settlements": {
"mount": "eb79a9b3682a",
@@ -354,7 +371,7 @@
"clear": "204da356c8b7"
},
"state": "0cc3e25ebff5",
"effects": ["3dc7f55dee2a"]
"effects": ["94a34b9a1800", "2744881d0748", "7e0ebd472c7b"]
}
}
]
+1 -1
View File
@@ -21487,7 +21487,7 @@
"reply": {
"ok": true,
"result": {
"cleared": true
"clear": { "handle": "terminal-1", "cleared": true }
}
}
},
@@ -0,0 +1,167 @@
import { createElement } from 'react'
import { act, create } from 'react-test-renderer'
import { describe, expect, it, vi } from 'vitest'
import type { RpcResponse } from '../transport/types'
import { useMobileSessionTerminalInput } from './use-mobile-session-terminal-input'
function mountClear(sendRequest: () => Promise<RpcResponse>, opts: { subscribed?: boolean } = {}) {
let generation = 1
const client = { sendRequest, getGeneration: () => generation }
const clear = vi.fn()
const terminal = { clear }
let currentTerminal = terminal
const clientRef = { current: client }
const showToast = vi.fn()
const unsubscribeTerminal = vi.fn()
const subscribeToTerminal = vi.fn()
const terminalUnsubsRef = {
current: new Map<string, () => void>(opts.subscribed === false ? [] : [['term', () => {}]])
}
let actions: ReturnType<typeof useMobileSessionTerminalInput> | undefined
function Harness() {
actions = useMobileSessionTerminalInput(
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: This fixture supplies every field reached by handleClearTerminal.
{
client,
clientRef,
showToast,
getTerminalRef: () => currentTerminal,
unsubscribeTerminal,
subscribeToTerminal,
terminalUnsubsRef
} as unknown as Parameters<typeof useMobileSessionTerminalInput>[0]
)
return null
}
let renderer: ReturnType<typeof create> | undefined
act(() => {
renderer = create(createElement(Harness))
})
return {
clear,
showToast,
unsubscribeTerminal,
subscribeToTerminal,
clearHost: () =>
actions?.handleClearTerminal({
handle: 'term',
title: 'Shell',
isActive: true
}),
replaceTerminal: () => {
currentTerminal = { clear: vi.fn() }
},
migrateAuthority: () => {
generation += 1
},
replaceClient: () => {
clientRef.current = { ...client }
},
dispose: () => act(() => renderer?.unmount())
}
}
function deferredReply() {
let resolve: (reply: RpcResponse) => void = () => {}
const promise = new Promise<RpcResponse>((done) => {
resolve = done
})
return { promise, resolve }
}
const cleared: RpcResponse = {
id: 'clear',
ok: true,
result: { clear: { handle: 'term', cleared: true } }
}
describe('mobile terminal buffer clear acknowledgement', () => {
it.each([
{
id: 'refused',
ok: false,
error: { code: 'not_found', message: 'Terminal missing' }
},
{
id: 'not-cleared',
ok: true,
result: { clear: { handle: 'term', cleared: false } }
},
{ id: 'incompatible', ok: true, result: {} }
] satisfies RpcResponse[])(
'preserves local output when the host does not clear it: $id',
async (reply) => {
const view = mountClear(async () => reply)
try {
await view.clearHost()
expect(view.clear).not.toHaveBeenCalled()
expect(view.subscribeToTerminal).not.toHaveBeenCalled()
expect(view.showToast.mock.calls).toEqual([["Couldn't clear terminal", 1500]])
} finally {
view.dispose()
}
}
)
it('refreshes the ordered host snapshot after acknowledgement instead of erasing current output', async () => {
const reply = deferredReply()
const view = mountClear(() => reply.promise)
try {
const pending = view.clearHost()
expect(view.subscribeToTerminal).not.toHaveBeenCalled()
expect(view.showToast).not.toHaveBeenCalled()
reply.resolve(cleared)
await pending
expect(view.clear).not.toHaveBeenCalled()
expect(view.unsubscribeTerminal).toHaveBeenCalledWith('term')
expect(view.subscribeToTerminal).toHaveBeenCalledWith('term')
expect(view.showToast.mock.calls).toEqual([['Terminal cleared']])
} finally {
view.dispose()
}
})
it('leaves an unsubscribed tab to draw its snapshot when it next subscribes', async () => {
const view = mountClear(async () => cleared, { subscribed: false })
try {
await view.clearHost()
expect(view.subscribeToTerminal).not.toHaveBeenCalled()
expect(view.showToast.mock.calls).toEqual([['Terminal cleared']])
} finally {
view.dispose()
}
})
it.each(['replaceTerminal', 'migrateAuthority'] as const)(
'still refreshes when the clear is accepted after %s',
async (change) => {
const reply = deferredReply()
const view = mountClear(() => reply.promise)
try {
const pending = view.clearHost()
view[change]()
reply.resolve(cleared)
await pending
expect(view.subscribeToTerminal).toHaveBeenCalledWith('term')
expect(view.showToast.mock.calls).toEqual([['Terminal cleared']])
} finally {
view.dispose()
}
}
)
it('ignores a clear acknowledgement after the client is replaced', async () => {
const reply = deferredReply()
const view = mountClear(() => reply.promise)
try {
const pending = view.clearHost()
view.replaceClient()
reply.resolve(cleared)
await pending
expect(view.clear).not.toHaveBeenCalled()
expect(view.subscribeToTerminal).not.toHaveBeenCalled()
expect(view.showToast).not.toHaveBeenCalled()
} finally {
view.dispose()
}
})
})
@@ -45,9 +45,10 @@ export function useMobileSessionTerminalInput(scope: MobileSessionFileActionsMod
sendLiveInputClick,
sendLiveTerminalInputRef,
showToast,
getTerminalRef,
hostQueryReplyInputSupportedRef,
hostProgramStatusSupportedRef
hostProgramStatusSupportedRef,
unsubscribeTerminal,
subscribeToTerminal
} = scope
const toggleLiveInput = useCallback(() => {
if (!activeHandle) {
@@ -242,13 +243,31 @@ export function useMobileSessionTerminalInput(scope: MobileSessionFileActionsMod
if (!client) {
return
}
getTerminalRef(target.handle)?.clear()
// Why: only a different client is stale; the WebView handle is rebuilt on re-render and a path cutover keeps the same host.
const isCurrent = () => clientRef.current === client
try {
// Reply is intentionally unread; historical success feedback follows any fulfilled envelope, including refusal.
await terminalBufferClear.request(client, { terminal: target.handle })
const response = await terminalBufferClear.request(
client,
{ terminal: target.handle },
{ failWhenDisconnected: true }
)
if (!isCurrent()) {
return
}
if (terminalBufferClear.interpret(response) !== true) {
showToast("Couldn't clear terminal", 1500)
return
}
// Why: an unsubscribed tab draws a fresh snapshot when it next subscribes; subscribing it here would leak a background stream.
if (terminalUnsubsRef.current.has(target.handle)) {
unsubscribeTerminal(target.handle)
subscribeToTerminal(target.handle)
}
showToast('Terminal cleared')
} catch {
showToast("Couldn't clear terminal", 1500)
if (isCurrent()) {
showToast("Couldn't clear terminal", 1500)
}
}
}
return {
@@ -2,6 +2,7 @@ import { bindDeferredRpcOperation, defineRpcOperation } from '../transport/rpc-o
import { rpcResultVariant } from '../transport/rpc-operation-result-reader'
import {
terminalAutoRestoreFitSchema,
terminalBufferClearedSchema,
terminalSendAcceptedSchema,
terminalViewportUpdatedSchema,
terminalWriteUnreadReplySchema
@@ -60,13 +61,13 @@ export const workerTerminalTakeoverReport = bindDeferredRpcOperation(
})
)
// Preserve legacy clear semantics: fulfilled replies report success; only transport rejection reaches failure copy.
/** A clear is successful only when the host confirms its buffer was cleared. */
export const terminalBufferClear = bindDeferredRpcOperation(
defineRpcOperation({
name: 'terminal.clear-buffer-or-skip',
name: 'terminal.clear-buffer',
method: 'terminal.clearBuffer',
acceptance: 'success-result-or-skip',
acceptance: 'object-result-or-null',
barrier: 'after-caller-barrier',
read: rpcResultVariant('terminal-buffer-cleared', terminalWriteUnreadReplySchema)
read: rpcResultVariant('terminal-buffer-cleared', terminalBufferClearedSchema)
})
)
+5 -1
View File
@@ -21,5 +21,9 @@ export const terminalViewportUpdatedSchema = z
export const terminalAutoRestoreFitSchema = z.looseObject({ ms: z.number().nullable() })
// Payloads are unread; requiring changed/clear fields would reject hosts without affecting any consumer.
export const terminalBufferClearedSchema = z
.looseObject({ clear: z.looseObject({ cleared: z.boolean() }) })
.transform((reply) => reply.clear.cleared)
// The worker-takeover report's `{ changed }` payload is unread; requiring it would reject hosts without affecting any consumer.
export const terminalWriteUnreadReplySchema = z.unknown()
@@ -59,12 +59,17 @@ export function sessionTerminalGestureMountAdapters(
terminalGestureInputInFlightRef: inFlight,
liveInputRef: { current: null },
liveInputFocusTimerRef: { current: null },
terminalUnsubsRef: { current: new Map() },
terminalUnsubsRef: { current: new Map([[HANDLE, () => {}]]) },
hostQueryReplyInputSupportedRef: { current: false },
hostProgramStatusSupportedRef: { current: false },
clearPendingLiveInputCommit: () => {},
toggleTerminalLiveInput: () => false,
getTerminalRef: () => undefined,
unsubscribeTerminal: (handle) => effect('terminal-unsubscribe', { handle }),
subscribeToTerminal: (handle) => {
effect('terminal-subscribe', { handle })
return true
},
showToast: (message: string, durationMs?: number) =>
effect('toast', { message, durationMs: durationMs ?? null })
})