4runr-os 2.0.15 → 2.0.17

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.
@@ -127,14 +127,18 @@ export function dumpListenerBindings() {
127
127
  }
128
128
  /**
129
129
  * Step 3A: Track blocked stdout/stderr writes
130
+ *
131
+ * Enhanced: Capture full stack trace for corruption detection
130
132
  */
131
133
  export function trackBlockedWrite(stream, content) {
132
134
  const stack = new Error().stack || '';
135
+ // Capture full stack trace (first 10 lines for corruption detection)
136
+ const fullStack = stack.split('\n').slice(2, 12).join('\n ');
133
137
  const caller = stack.split('\n').slice(2, 5).join('\n ');
134
138
  const blocked = {
135
139
  ts: Date.now(),
136
- content: content.substring(0, 120),
137
- stack: caller,
140
+ content: content.substring(0, 200), // Increased to 200 for better visibility
141
+ stack: fullStack, // Full stack for corruption detection
138
142
  stream
139
143
  };
140
144
  blockedWrites.push(blocked);
@@ -144,7 +148,8 @@ export function trackBlockedWrite(stream, content) {
144
148
  }
145
149
  // Emit to operations (rate limited to prevent spam)
146
150
  if (isDebugMode()) {
147
- log(`[${stream.toUpperCase()} BLOCKED] "${blocked.content}" from: ${caller}`, 'WARN');
151
+ log(`[${stream.toUpperCase()} BLOCKED] "${blocked.content.substring(0, 50)}..."`, 'WARN');
152
+ log(` Stack: ${caller}`, 'WARN');
148
153
  }
149
154
  }
150
155
  /**
@@ -164,6 +169,8 @@ export function dumpBlockedWrites() {
164
169
  }
165
170
  /**
166
171
  * Monkeypatch stdout/stderr to catch writes
172
+ *
173
+ * Enhanced: Detect corruption during TUI runtime (captures stack traces)
167
174
  */
168
175
  export function installStdoutMonkeypatch() {
169
176
  const originalStdoutWrite = process.stdout.write.bind(process.stdout);
@@ -173,18 +180,21 @@ export function installStdoutMonkeypatch() {
173
180
  const content = String(chunk);
174
181
  // Allow ANSI escape codes (cursor control) and blessed writes
175
182
  const stack = new Error().stack || '';
176
- const isBlessed = stack.includes('neo-blessed') || stack.includes('Program.prototype');
183
+ const isBlessed = stack.includes('neo-blessed') || stack.includes('Program.prototype') || stack.includes('blessed');
177
184
  const isAnsiEscape = /^\x1b\[[\d;]*[A-Za-z]/.test(content);
178
- if (isBlessed || isAnsiEscape) {
185
+ const isClearScreen = content === '\x1b[2J\x1b[H' || content.includes('\x1b[2J');
186
+ // Allow blessed, ANSI escapes, and clear screen commands (from our hard clear)
187
+ if (isBlessed || isAnsiEscape || isClearScreen) {
179
188
  return originalStdoutWrite(chunk, ...args);
180
189
  }
181
- // Block and track
190
+ // Block and track (capture full stack for corruption detection)
182
191
  trackBlockedWrite('stdout', content);
183
- return true; // Pretend success
192
+ return true; // Pretend success to prevent corruption
184
193
  };
185
- // Patch stderr (less strict - allow it but track)
194
+ // Patch stderr (track but allow - less strict)
186
195
  process.stderr.write = function (chunk, ...args) {
187
196
  const content = String(chunk);
197
+ // Track but allow stderr (some libraries use it for errors)
188
198
  trackBlockedWrite('stderr', content);
189
199
  return originalStderrWrite(chunk, ...args);
190
200
  };
@@ -197,7 +207,9 @@ export function installStdoutMonkeypatch() {
197
207
  let resizeStats = {
198
208
  eventCount: 0,
199
209
  applyCount: 0,
200
- handlerBound: false
210
+ handlerBound: false,
211
+ listenerCount: 0,
212
+ uiRebuildCount: 0
201
213
  };
202
214
  /**
203
215
  * Update resize stats (called from phase1RuntimeClean)
@@ -1 +1 @@
1
- {"version":3,"file":"debugUtils.js","sourceRoot":"","sources":["../../../../src/ui/v3/ui/debugUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAUrF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;AAUrD,MAAM,gBAAgB,GAAsB,EAAE,CAAC;AAC/C,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAU3B,MAAM,aAAa,GAAmB,EAAE,CAAC;AACzC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,WAAW,GAAG,GAAY,EAAE;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,QAAmC,MAAM,EAAE,EAAE;IACrE,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,SAAS,OAAO,KAAK,GAAG,EAAE;QAC/B,KAAK;KACN,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAW,EAAE,IAAY;IACnD,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAE3B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IAErB,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE7B,GAAG,CAAC,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,QAAQ,GAAI,MAAc,CAAC,QAAQ,IAAI,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEtC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC5B,GAAG,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;IAExC,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqE,CAAC;IAEhG,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAI,KAAa,CAAC,MAAM,IAAI,SAAS,CAAC;QAChD,MAAM,EAAE,GAAI,KAAa,CAAC,IAAI,IAAI,OAAO,CAAC;QAC1C,MAAM,SAAS,GAAI,KAAa,CAAC,WAAW,IAAI,CAAC,CAAC;QAClD,MAAM,SAAS,GAAI,KAAa,CAAC,WAAW,IAAI,SAAS,CAAC;QAE1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;QAC/B,GAAG,CAAC,GAAG,IAAI,KAAK,KAAK,cAAc,CAAC,CAAC;QAErC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,GAAG,CAAC,+BAA+B,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAChF,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,WAAW,EAAE;QAAE,OAAO;IAE3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,kBAAkB,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAoB;QAC/B,IAAI;QACJ,UAAU,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAC7G,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,KAAK,EAAE,OAAO;KACf,CAAC;IAEF,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/B,GAAG,CAAC,SAAS,IAAI,YAAY,OAAO,CAAC,UAAU,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACjC,GAAG,CAAC,mBAAmB,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IAElD,gBAAgB;IAChB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACpD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,GAAG,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;QAE9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,8BAA8B,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,GAAG,CAAC,eAAe,OAAO,CAAC,UAAU,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvF,GAAG,CAAC,cAAc,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,+BAA+B,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA2B,EAAE,OAAe;IAC5E,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAiB;QAC5B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QAClC,KAAK,EAAE,MAAM;QACb,MAAM;KACP,CAAC;IAEF,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE5B,oCAAoC;IACpC,IAAI,aAAa,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC9C,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,oDAAoD;IACpD,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,OAAO,CAAC,OAAO,WAAW,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAC5C,GAAG,CAAC,kBAAkB,aAAa,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1E,GAAG,CAAC,gBAAgB,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,aAAa,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,4BAA4B,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE,eAAe;IACd,OAAO,CAAC,MAAM,CAAC,KAAa,GAAG,UAAS,KAAU,EAAE,GAAG,IAAW;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9B,8DAA8D;QAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACvF,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3D,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,OAAO,mBAAmB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,kBAAkB;QAClB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,CAAC,kBAAkB;IACjC,CAAC,CAAC;IAEF,kDAAkD;IACjD,OAAO,CAAC,MAAM,CAAC,KAAa,GAAG,UAAS,KAAU,EAAE,GAAG,IAAW;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,mBAAmB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,mBAA0B,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,mBAA0B,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AASD,IAAI,WAAW,GAAgB;IAC7B,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA2B;IAC3D,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAO3B,OAAO;QACL,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,cAAc,CAAC,IAAI;QAChC,aAAa,EAAE,gBAAgB,CAAC,MAAM;QACtC,iBAAiB,EAAE,aAAa,CAAC,MAAM;QACvC,WAAW,EAAE,cAAc,EAAE;KAC9B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"debugUtils.js","sourceRoot":"","sources":["../../../../src/ui/v3/ui/debugUtils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"phase1Layout.d.ts","sourceRoot":"","sources":["../../../../../src/ui/v3/ui/layout/phase1Layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAGD,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,UAAU,KAAK,CAAC;AAM7B;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CA6OxG"}
1
+ {"version":3,"file":"phase1Layout.d.ts","sourceRoot":"","sources":["../../../../../src/ui/v3/ui/layout/phase1Layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAGD,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,UAAU,KAAK,CAAC;AAM7B;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CA4QxG"}
@@ -207,27 +207,51 @@ export function computePhase1Layout(width, height, screen) {
207
207
  if (layout.commandLine.top + layout.commandLine.height > safeHeight) {
208
208
  errors.push(`Command line overflow: ${layout.commandLine.top + layout.commandLine.height} > ${safeHeight}`);
209
209
  }
210
- // DEBUG MODE: Assert right edge <= cols - 1 for all panels (prevents horizontal scrollbar)
211
- const isDebugMode = process.env.TUI_DEBUG === '1';
212
- if (isDebugMode) {
213
- const panels = [
214
- { name: 'POSTURE', rect: layout.posture },
215
- { name: 'RESOURCES', rect: layout.resources },
216
- { name: 'ASSETS', rect: layout.assets },
217
- { name: 'OPERATIONS', rect: layout.operations },
218
- { name: 'NETWORK', rect: layout.network },
219
- { name: 'CAPABILITIES', rect: layout.capabilities },
220
- { name: 'COMMAND_LINE', rect: layout.commandLine },
221
- ];
222
- for (const { name, rect } of panels) {
223
- const rightEdge = rect.left + rect.width;
224
- // CRITICAL: right edge must be <= cols - 1 to prevent scrollbar
225
- // For safeCols, use <= safeCols - 1 (accounting for browser margins)
226
- const maxRightEdge = safeWidth - 1;
227
- if (rightEdge > maxRightEdge) {
228
- errors.push(`⚠ WARNING: ${name} right edge overflow: ${rightEdge} > ${maxRightEdge} (cols=${geo.cols}, safeCols=${safeWidth})`);
210
+ // CRITICAL: Hard clamp ALL panels to safeWidth - 1 (ALWAYS, not just debug mode)
211
+ // This prevents horizontal scrollbar in ALL environments (local, SSH, browser terminals)
212
+ const panels = [
213
+ { name: 'POSTURE', rect: layout.posture },
214
+ { name: 'RESOURCES', rect: layout.resources },
215
+ { name: 'ASSETS', rect: layout.assets },
216
+ { name: 'OPERATIONS', rect: layout.operations },
217
+ { name: 'NETWORK', rect: layout.network },
218
+ { name: 'CAPABILITIES', rect: layout.capabilities },
219
+ { name: 'COMMAND_LINE', rect: layout.commandLine },
220
+ ];
221
+ const maxRightEdge = safeWidth - 1; // Hard boundary: never exceed this
222
+ for (const { name, rect } of panels) {
223
+ const rightEdge = rect.left + rect.width;
224
+ // CRITICAL: Hard clamp if overflow detected (prevents horizontal scrollbar)
225
+ if (rightEdge > maxRightEdge) {
226
+ const overflow = rightEdge - maxRightEdge;
227
+ // Clamp width to fit within boundary
228
+ rect.width = Math.max(1, rect.width - overflow);
229
+ // Log the clamp (in debug mode only to prevent spam)
230
+ if (process.env.TUI_DEBUG === '1') {
231
+ errors.push(`⚠ HARD CLAMP: ${name} width reduced by ${overflow} to prevent overflow (rightEdge was ${rightEdge}, clamped to ${rect.left + rect.width})`);
229
232
  }
230
233
  }
234
+ // Validate Y bounds (top + height <= safeHeight)
235
+ const bottomEdge = rect.top + rect.height;
236
+ const maxBottomEdge = safeHeight - 1;
237
+ if (bottomEdge > maxBottomEdge) {
238
+ const overflow = bottomEdge - maxBottomEdge;
239
+ rect.height = Math.max(1, rect.height - overflow);
240
+ if (process.env.TUI_DEBUG === '1') {
241
+ errors.push(`⚠ HARD CLAMP: ${name} height reduced by ${overflow} to prevent overflow (bottomEdge was ${bottomEdge}, clamped to ${rect.top + rect.height})`);
242
+ }
243
+ }
244
+ }
245
+ // Re-validate after clamping
246
+ for (const { name, rect } of panels) {
247
+ const rightEdge = rect.left + rect.width;
248
+ if (rightEdge > maxRightEdge) {
249
+ errors.push(`FATAL: ${name} still overflows after clamp: ${rightEdge} > ${maxRightEdge}`);
250
+ }
251
+ const bottomEdge = rect.top + rect.height;
252
+ if (bottomEdge > safeHeight) {
253
+ errors.push(`FATAL: ${name} bottom still overflows after clamp: ${bottomEdge} > ${safeHeight}`);
254
+ }
231
255
  }
232
256
  if (errors.length > 0) {
233
257
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"phase1Layout.js","sourceRoot":"","sources":["../../../../../src/ui/v3/ui/layout/phase1Layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"phase1Layout.js","sourceRoot":"","sources":["../../../../../src/ui/v3/ui/layout/phase1Layout.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,14 @@
7
7
  * - Zero stdout writes
8
8
  * - Clean unbinding
9
9
  */
10
+ /**
11
+ * Toggle resize trace mode (exported for debug commands)
12
+ */
13
+ export declare function setResizeTraceEnabled(enabled: boolean): void;
14
+ /**
15
+ * Get resize trace status (exported for debug commands)
16
+ */
17
+ export declare function getResizeTraceEnabled(): boolean;
10
18
  /**
11
19
  * Step 1: Single instance guard
12
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"phase1RuntimeClean.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/ui/phase1RuntimeClean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4OH;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6LxD;AAgkBD;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAyJrC"}
1
+ {"version":3,"file":"phase1RuntimeClean.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/ui/phase1RuntimeClean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoFH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAgKD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgMxD;AA0sBD;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAyJrC"}
@@ -23,7 +23,7 @@ import { renderNetworkPanel } from './panels/NetworkPanel.js';
23
23
  import { renderCapabilitiesPanel } from './panels/CapabilitiesPanel.js';
24
24
  import { isAvailable } from '../state/value.js';
25
25
  import { parse, execute, UiAction } from '../commands/commandEngine.js';
26
- import { BOOT_ID, isDebugMode, trackWidget, trackListenerBinding, installStdoutMonkeypatch, updateResizeStats } from './debugUtils.js';
26
+ import { BOOT_ID, isDebugMode, trackWidget, trackListenerBinding, installStdoutMonkeypatch, updateResizeStats, getResizeStats } from './debugUtils.js';
27
27
  import { getTerminalGeometry, isGeometryStable, formatGeometry } from '../tui/geometry.js';
28
28
  import { detectTerminalMode, getDetectionLog } from '../tui/terminalMode.js';
29
29
  const blessedLib = blessed;
@@ -51,10 +51,25 @@ let scrollOffset = 0;
51
51
  // Phase C1: Resize debounce (prevent resize storm)
52
52
  let resizeDebounceTimer = null;
53
53
  let lastAppliedSize = null;
54
- const RESIZE_DEBOUNCE_MS = 200; // 200ms debounce to handle resize storms
54
+ const RESIZE_DEBOUNCE_MS = 100; // 100ms debounce for smooth resize
55
55
  let resizeEventCount = 0;
56
56
  let resizeApplyCount = 0;
57
57
  let layoutUIInProgress = false; // Guard against re-entrant layoutUI calls
58
+ let isResizing = false; // Freeze flag to prevent state updates during resize
59
+ let resizeTraceEnabled = false; // Enable resize trace logging
60
+ let firstResizeSinceMount = true; // Track first resize for immediate render
61
+ /**
62
+ * Toggle resize trace mode (exported for debug commands)
63
+ */
64
+ export function setResizeTraceEnabled(enabled) {
65
+ resizeTraceEnabled = enabled;
66
+ }
67
+ /**
68
+ * Get resize trace status (exported for debug commands)
69
+ */
70
+ export function getResizeTraceEnabled() {
71
+ return resizeTraceEnabled;
72
+ }
58
73
  // Resize handler guard (Step 4A: bind once)
59
74
  let resizeHandlerBound = false;
60
75
  /**
@@ -93,6 +108,8 @@ function safeAppend(screen, widget) {
93
108
  function mountUI(screen, layout) {
94
109
  // Issue 1 - Step 1: Hard guard - mount exactly once
95
110
  if (mounted) {
111
+ // Track UI rebuild attempts (should never happen)
112
+ updateResizeStats({ uiRebuildCount: (getResizeStats().uiRebuildCount || 0) + 1 });
96
113
  throw new Error('UI already mounted - cannot mount twice');
97
114
  }
98
115
  mounted = true;
@@ -282,6 +299,8 @@ export async function startPhase1Runtime() {
282
299
  }
283
300
  // A) mountUI() - Create widgets ONCE
284
301
  widgets = mountUI(screen, layout);
302
+ // Track initial mount (not a rebuild)
303
+ updateResizeStats({ uiRebuildCount: 0 });
285
304
  // Store unbind functions
286
305
  const unbindFns = [];
287
306
  // Step 3A: Install stdout monkeypatch (debug mode)
@@ -353,66 +372,143 @@ export async function startPhase1Runtime() {
353
372
  });
354
373
  }
355
374
  /**
356
- * Schedule resize application with throttling and "last applied" guard
375
+ * Hard clear terminal buffer - removes all artifacts
376
+ */
377
+ function hardClearTerminal(screen) {
378
+ try {
379
+ const program = screen.program;
380
+ // Try blessed's program.clear() + home() first
381
+ if (program && typeof program.clear === 'function' && typeof program.home === 'function') {
382
+ program.clear();
383
+ program.home();
384
+ return;
385
+ }
386
+ // Fallback: ANSI escape codes
387
+ // \x1b[2J = Clear entire screen
388
+ // \x1b[H = Move cursor to home position (0,0)
389
+ if (process.stdout.isTTY) {
390
+ process.stdout.write('\x1b[2J\x1b[H');
391
+ }
392
+ }
393
+ catch (e) {
394
+ // If clear fails, try ANSI escape as last resort
395
+ if (process.stdout.isTTY) {
396
+ process.stdout.write('\x1b[2J\x1b[H');
397
+ }
398
+ }
399
+ }
400
+ /**
401
+ * Atomic resize application - single path, no incremental updates
402
+ *
403
+ * Sequence:
404
+ * 1. Freeze rendering (isResizing = true)
405
+ * 2. Hard clear terminal buffer
406
+ * 3. Recompute layout from scratch
407
+ * 4. Force full repaint
408
+ * 5. Unfreeze rendering
409
+ */
410
+ function applyResizeAtomic(cols, rows, screen, widgets) {
411
+ // Step 1: Freeze rendering (ignore state updates during resize)
412
+ isResizing = true;
413
+ try {
414
+ // Resize trace logging
415
+ if (resizeTraceEnabled || isDebugMode()) {
416
+ const childrenCount = (screen.children || []).length;
417
+ log('DBG', `[RESIZE TRACE] Apply #${resizeApplyCount}: ${cols}x${rows}, children=${childrenCount}`);
418
+ }
419
+ // Step 2: Hard clear terminal buffer (removes all artifacts)
420
+ hardClearTerminal(screen);
421
+ // Step 3: Recompute layout from scratch (using fresh dimensions)
422
+ layoutUI(screen, widgets, cols, rows);
423
+ // Step 4: Force full repaint
424
+ screen.render();
425
+ // Step 5: Validate no duplication occurred
426
+ const screenChildren = screen.children || [];
427
+ const widgetCount = screenChildren.length;
428
+ const commandLineCount = screenChildren.filter((w) => w === widgets.commandLine).length;
429
+ const postureCount = screenChildren.filter((w) => w === widgets.posture).length;
430
+ const operationsCount = screenChildren.filter((w) => w === widgets.operations).length;
431
+ if (commandLineCount > 1 || postureCount > 1 || operationsCount > 1) {
432
+ log('ERR', `DUPLICATION DETECTED: commandLine=${commandLineCount}, posture=${postureCount}, operations=${operationsCount}`, 'ERROR');
433
+ if (isDebugMode()) {
434
+ log('DBG', `Total screen children: ${widgetCount} (expected ~8 widgets)`);
435
+ log('DBG', `Widgets: ${screenChildren.map((w) => w.type || 'unknown').join(', ')}`);
436
+ }
437
+ }
438
+ if (resizeTraceEnabled || (isDebugMode() && resizeApplyCount % 5 === 0)) {
439
+ const finalChildrenCount = (screen.children || []).length;
440
+ log('DBG', `[RESIZE TRACE] Complete: children=${finalChildrenCount}, size=${cols}x${rows}`);
441
+ }
442
+ }
443
+ finally {
444
+ // Step 6: Unfreeze rendering
445
+ isResizing = false;
446
+ }
447
+ }
448
+ /**
449
+ * Schedule resize application with smooth behavior
450
+ *
451
+ * Strategy:
452
+ * - First resize: render immediately (fast response)
453
+ * - Subsequent resizes: debounce 100ms (smooth, no spam)
357
454
  *
358
455
  * Ensures:
359
456
  * - Debounce: Multiple rapid resize events result in single layout update
360
457
  * - Ignore duplicates: Skip if size hasn't changed from last applied
361
- * - Single render: Only one render per resize application
458
+ * - Atomic: Full redraw from scratch, not incremental
362
459
  */
363
460
  function scheduleResize(nextCols, nextRows, screen, widgets) {
364
461
  // Check if this is the same as last applied (ignore duplicates)
365
462
  if (lastAppliedSize && lastAppliedSize.cols === nextCols && lastAppliedSize.rows === nextRows) {
366
463
  return; // Same size, no need to recompute
367
464
  }
368
- // Cancel any pending resize
465
+ // First resize: render immediately for fast response
466
+ if (firstResizeSinceMount) {
467
+ firstResizeSinceMount = false;
468
+ resizeApplyCount++;
469
+ lastAppliedSize = { cols: nextCols, rows: nextRows };
470
+ updateResizeStats({ eventCount: resizeEventCount, applyCount: resizeApplyCount });
471
+ // Immediate atomic resize
472
+ applyResizeAtomic(nextCols, nextRows, screen, widgets);
473
+ // Schedule a final debounced resize to catch any rapid subsequent changes
474
+ if (resizeDebounceTimer) {
475
+ clearTimeout(resizeDebounceTimer);
476
+ }
477
+ resizeDebounceTimer = setTimeout(() => {
478
+ resizeDebounceTimer = null;
479
+ // Check if size changed during debounce
480
+ const currentGeo = getTerminalGeometry(screen);
481
+ if (currentGeo.cols !== nextCols || currentGeo.rows !== nextRows) {
482
+ resizeApplyCount++;
483
+ lastAppliedSize = { cols: currentGeo.cols, rows: currentGeo.rows };
484
+ updateResizeStats({ eventCount: resizeEventCount, applyCount: resizeApplyCount });
485
+ applyResizeAtomic(currentGeo.cols, currentGeo.rows, screen, widgets);
486
+ }
487
+ }, RESIZE_DEBOUNCE_MS);
488
+ return;
489
+ }
490
+ // Subsequent resizes: cancel pending and schedule new debounced resize
369
491
  if (resizeDebounceTimer) {
370
492
  clearTimeout(resizeDebounceTimer);
371
493
  }
372
- // Schedule resize application
373
494
  resizeDebounceTimer = setTimeout(() => {
374
495
  resizeDebounceTimer = null;
375
496
  resizeApplyCount++;
376
497
  // Update last applied size BEFORE processing (prevents duplicate processing)
377
498
  lastAppliedSize = { cols: nextCols, rows: nextRows };
378
499
  updateResizeStats({ eventCount: resizeEventCount, applyCount: resizeApplyCount });
379
- // Get current geometry (always fresh from screen)
500
+ // Get current geometry (may have changed during debounce)
380
501
  const geo = getTerminalGeometry(screen);
381
- // Verify we're applying the expected size
502
+ // Use current geometry if it changed during debounce
503
+ const finalCols = geo.cols !== nextCols ? geo.cols : nextCols;
504
+ const finalRows = geo.rows !== nextRows ? geo.rows : nextRows;
382
505
  if (geo.cols !== nextCols || geo.rows !== nextRows) {
383
- // Screen dimensions changed while debouncing - use current screen dimensions
384
- if (isDebugMode()) {
385
- log('DBG', `Size changed during debounce: requested ${nextCols}x${nextRows}, using ${geo.cols}x${geo.rows}`);
386
- }
387
- }
388
- // Throttle resize logging to prevent spam (only log every 5th resize apply)
389
- if (isDebugMode() && resizeApplyCount % 5 === 0) {
390
- log('DBG', `Resize apply #${resizeApplyCount} (${resizeEventCount} events): ${formatGeometry(geo)}`);
391
- const screenCols = screen.cols ?? screen.program?.cols ?? screen.width;
392
- const screenRows = screen.rows ?? screen.program?.rows ?? screen.height;
393
- log('DBG', `screen.cols=${screenCols} screen.rows=${screenRows} screen.width=${screen.width} screen.height=${screen.height}`);
394
- }
395
- // Resize = REFLOW ONLY
396
- // Pass explicit dimensions to layoutUI (more accurate than reading from screen during resize)
397
- // Use the dimensions we computed in the resize handler (from process.stdout for native terminals)
398
- layoutUI(screen, widgets, nextCols, nextRows);
399
- // Render once (no logging inside render)
400
- screen.render();
401
- // Validate no duplication occurred (check all critical widgets)
402
- const screenChildren = screen.children || [];
403
- const widgetCount = screenChildren.length;
404
- const commandLineCount = screenChildren.filter((w) => w === widgets.commandLine).length;
405
- const postureCount = screenChildren.filter((w) => w === widgets.posture).length;
406
- const operationsCount = screenChildren.filter((w) => w === widgets.operations).length;
407
- // Expected widget count: 7 widgets (posture, resources, assets, operations, network, capabilities, statusStrip, commandLine)
408
- // But commandLine and statusStrip might be children of a container, so we check individually
409
- if (commandLineCount > 1 || postureCount > 1 || operationsCount > 1) {
410
- log('ERR', `DUPLICATION DETECTED: commandLine=${commandLineCount}, posture=${postureCount}, operations=${operationsCount}`, 'ERROR');
411
506
  if (isDebugMode()) {
412
- log('DBG', `Total screen children: ${widgetCount} (expected ~7-8 widgets)`);
413
- log('DBG', `Widgets: ${screenChildren.map((w) => w.type || 'unknown').join(', ')}`);
507
+ log('DBG', `Size changed during debounce: requested ${nextCols}x${nextRows}, using ${finalCols}x${finalRows}`);
414
508
  }
415
509
  }
510
+ // Atomic resize application
511
+ applyResizeAtomic(finalCols, finalRows, screen, widgets);
416
512
  }, RESIZE_DEBOUNCE_MS);
417
513
  }
418
514
  /**
@@ -499,12 +595,22 @@ function setupResizeHandling(screen, widgets, unbindFns) {
499
595
  };
500
596
  // Debug: Track listener binding
501
597
  trackListenerBinding('resize');
598
+ // Count resize listeners (must be exactly 1 for screen + optionally 1 for stdout)
599
+ let listenerCount = 0;
502
600
  // Bind to blessed screen resize event
503
601
  screen.on('resize', handleResize);
602
+ listenerCount++;
504
603
  // Also bind to process.stdout resize (for Windows compatibility)
505
604
  // Both handlers call the same function to avoid double-processing
506
- if (process.stdout.on && typeof process.stdout.on === 'function') {
605
+ if (typeof process.stdout.on === 'function') {
507
606
  process.stdout.on('resize', handleResize);
607
+ listenerCount++;
608
+ }
609
+ // Update stats with listener count (should be 1 for screen-only, 2 if stdout also bound)
610
+ updateResizeStats({ listenerCount });
611
+ if (isDebugMode()) {
612
+ const stdoutBound = typeof process.stdout.on === 'function' ? '1' : '0';
613
+ log('DBG', `Resize listeners bound: ${listenerCount} (screen=1, stdout=${stdoutBound})`);
508
614
  }
509
615
  unbindFns.push(() => {
510
616
  // Unbind screen resize
@@ -757,8 +863,14 @@ function setupInputHandling(screen, commandLine, unbindFns) {
757
863
  }
758
864
  /**
759
865
  * Update all panel content
866
+ *
867
+ * Guard: Skip updates during resize to prevent corruption
760
868
  */
761
869
  function updateAllPanels(widgets) {
870
+ // Skip state updates during resize (prevents corruption)
871
+ if (isResizing) {
872
+ return;
873
+ }
762
874
  updatePanel(widgets.posture, renderPosturePanel(currentUiState.posture));
763
875
  updatePanel(widgets.resources, renderResourcesPanel(currentUiState.resources));
764
876
  updatePanel(widgets.assets, renderAssetsPanel(currentUiState.assets));
@@ -777,33 +889,55 @@ function updateAllPanels(widgets) {
777
889
  }
778
890
  /**
779
891
  * Update a panel with content lines
892
+ *
893
+ * Fix: Clear panel content before writing to prevent vertical artifacts
780
894
  */
781
895
  function updatePanel(panel, lines) {
782
896
  const panelWidth = panel.width;
783
897
  const panelHeight = panel.height;
784
898
  const innerWidth = Math.max(1, panelWidth - 4);
785
899
  const innerHeight = Math.max(1, panelHeight - 2);
900
+ // Clear panel content first (prevent vertical artifacts)
901
+ // Fill with blank lines to ensure old content is overwritten
902
+ const blankLines = [];
903
+ for (let i = 0; i < innerHeight; i++) {
904
+ blankLines.push(' '.repeat(innerWidth));
905
+ }
906
+ const clearedContent = '\n ' + blankLines.join('\n ');
907
+ panel.setContent(clearedContent);
908
+ // Now set actual content
786
909
  const truncatedLines = lines.slice(0, innerHeight).map(line => {
787
910
  if (line.length > innerWidth) {
788
911
  return line.substring(0, innerWidth - 3) + '...';
789
912
  }
790
- return line;
913
+ // Pad with spaces to full width (ensures old content is overwritten)
914
+ return line.padEnd(innerWidth, ' ');
791
915
  });
792
916
  const content = '\n ' + truncatedLines.join('\n ');
793
917
  panel.setContent(content);
794
918
  }
795
919
  /**
796
920
  * Update operations panel
921
+ *
922
+ * Fix: Clear panel content before writing to prevent vertical artifacts
797
923
  */
798
924
  function updateOperationsPanel(panel) {
799
925
  const panelHeight = panel.height;
800
926
  const panelWidth = panel.width;
801
927
  const innerHeight = Math.max(1, panelHeight - 2);
802
928
  const innerWidth = Math.max(1, panelWidth - 2);
929
+ // Clear panel content first (prevent vertical artifacts)
930
+ const blankLines = [];
931
+ for (let i = 0; i < innerHeight; i++) {
932
+ blankLines.push(' '.repeat(innerWidth));
933
+ }
934
+ const clearedContent = '\n ' + blankLines.join('\n ');
935
+ panel.setContent(clearedContent);
936
+ // Now set actual content
803
937
  const events = feedStore.getLatest(innerHeight);
804
938
  const lines = [];
805
939
  if (events.length === 0) {
806
- lines.push('No operations yet');
940
+ lines.push('No operations yet'.padEnd(innerWidth, ' '));
807
941
  }
808
942
  else {
809
943
  for (const event of events.slice(-innerHeight)) {
@@ -813,7 +947,8 @@ function updateOperationsPanel(panel) {
813
947
  lines.push(line.substring(0, innerWidth - 3) + '...');
814
948
  }
815
949
  else {
816
- lines.push(line);
950
+ // Pad with spaces to full width
951
+ lines.push(line.padEnd(innerWidth, ' '));
817
952
  }
818
953
  }
819
954
  }
@@ -822,10 +957,16 @@ function updateOperationsPanel(panel) {
822
957
  }
823
958
  /**
824
959
  * Start background state updates
960
+ *
961
+ * Guard: Skip updates during resize to prevent corruption
825
962
  */
826
963
  function startBackgroundUpdates(widgets, screen) {
827
964
  const interval = setInterval(async () => {
828
965
  try {
966
+ // Skip state updates during resize (prevents corruption)
967
+ if (isResizing) {
968
+ return;
969
+ }
829
970
  const newState = await buildUiState(currentUiState);
830
971
  currentUiState = newState;
831
972
  updateAllPanels(widgets);