@pipod/cli 0.1.24 → 0.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  # Keyboard input in the attached TUI
2
2
 
3
- Three input defects turn one key press into several characters, the same character twice, or
4
- into escape-sequence gibberish. All live in the local byte path — nothing typed crosses the
5
- wire — and all are fixed in `src/client/runtime/` rather than by pinning a different pi-tui,
6
- because the pinned version is what pods and the launcher share.
3
+ Input defects can turn one key press into several characters, the same character twice, or
4
+ into escape-sequence gibberish. These guards run in the local byte path, ahead of both the
5
+ built-in editor and pod-rendered extension editors. They live in `src/client/runtime/` rather
6
+ than pinning a different pi-tui, because pods and the launcher share the pinned version.
7
7
 
8
8
  ## The path
9
9
 
@@ -101,6 +101,25 @@ Left open deliberately: the reversed order (raw text first, then the CSI-u). No
101
101
  terminal writes it, and deduping it would mean dropping a key *event* on suspicion — the one
102
102
  direction where a mistake loses input.
103
103
 
104
+ ## 4. Reconnect must not leave the editor unguarded
105
+
106
+ Session replacement clears Pi's extension UI before asynchronously refreshing the remote
107
+ state. That also removes the launcher's input listeners, even though the same local editor
108
+ continues accepting keys. Previously the guards returned only when the refreshed session
109
+ bound its UI: typing during recovery bypassed both the encoding and repeat guards. A failed
110
+ refresh could leave them absent until a later successful recovery. The socket being connected
111
+ does not mean this refresh has finished.
112
+
113
+ `remote-runtime.ts` now rewires the launcher's listeners synchronously after invalidating the
114
+ old UI, before awaiting any refresh. The normal UI bind still unsubscribes and rewires them
115
+ against the new context. This keeps one set of guards active throughout reconnect, pod switch,
116
+ and session replacement, including refresh failures, without restarting the terminal or
117
+ suppressing deliberate repeated presses.
118
+
119
+ Measured on a live pod with the pinned Pi pair: a single dual-encoded press during the real
120
+ reconnect refresh inserted `bb` before the fix and `b` after it. The terminal retained one stdin
121
+ reader; the defect was a missing guard during recovery, not duplicate stdin subscriptions.
122
+
104
123
  ## Accepted rows
105
124
 
106
125
  Measured with a pty harness against pi 1.0.2 + pi-tui 1.0.2 (the pinned pair), driving
@@ -1,4 +1,4 @@
1
- .TH "PIPOD\-CONFIG" "5" "November 2026" "0.1.24"
1
+ .TH "PIPOD\-CONFIG" "5" "November 2026" "0.1.25"
2
2
  .SH "NAME"
3
3
  \fBpipod-config\fR \- pi pod configuration files
4
4
  .SH SYNOPSIS
package/man/pipod.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH "PIPOD" "1" "November 2026" "0.1.24"
1
+ .TH "PIPOD" "1" "November 2026" "0.1.25"
2
2
  .SH "NAME"
3
3
  \fBpipod\fR \- run pi coding\-agent sessions in server\-managed pods
4
4
  .SH SYNOPSIS
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@pipod/cli",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@pipod/cli",
9
- "version": "0.1.24",
9
+ "version": "0.1.25",
10
10
  "license": "AGPL-3.0-only",
11
11
  "dependencies": {
12
12
  "@earendil-works/pi-coding-agent": "1.0.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipod/cli",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "description": "Run pi coding-agent sessions in server-managed pods",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",