4runr-os 2.0.37 → 2.0.39

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 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/tui/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,MAAM,WAAW,gBAAgB;IAE/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;CAAE,CA0E3H;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,gBAAgB,CA2B7E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CASnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CASjE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAG5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM,CAG9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAE5D"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/tui/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,MAAM,WAAW,gBAAgB;IAE/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;CAAE,CA0E3H;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAgC7E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CASnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CASjE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,CAG5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM,CAG9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAE5D"}
@@ -113,11 +113,16 @@ export function getTerminalGeometry(screen) {
113
113
  const { cols, rows, source } = getTerminalSize(screen);
114
114
  // Apply mode-specific margins
115
115
  // Browser terminals (CloudShell) need extra margin to prevent scrollbars
116
+ // SSH terminals should use full width (no margin)
116
117
  const isBrowserTerminal = mode === 'browser';
117
- const browserTerminalMargin = isBrowserTerminal ? 12 : 0; // 12-char margin for CloudShell
118
+ const isSSHTerminal = mode === 'ssh';
119
+ // Only apply browser margin for actual browser terminals, not SSH
120
+ const browserTerminalMargin = (isBrowserTerminal && !isSSHTerminal) ? 12 : 0; // 12-char margin for CloudShell only
118
121
  // Calculate safe dimensions (accounting for margins)
119
122
  // CRITICAL: right edge must be <= cols - 1 to prevent scrollbars
120
123
  // NO HARD CAP - allow fullscreen to expand fully
124
+ // For SSH/native terminals: use full width (cols - 1 for safety)
125
+ // For browser terminals: subtract margin to prevent scrollbars
121
126
  const safeCols = Math.max(MIN_COLS, cols - HORIZONTAL_MARGIN - browserTerminalMargin);
122
127
  const safeRows = Math.max(MIN_ROWS, rows - VERTICAL_MARGIN);
123
128
  const geometry = {
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../src/ui/v3/tui/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,kDAAkD;AAClD,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,+CAA+C;AAC/C,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,qCAAqC;AAClE,MAAM,eAAe,GAAG,CAAC,CAAC,CAAG,qCAAqC;AAiBlE,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAElC,iFAAiF;IACjF,sEAAsE;IAEtE,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAwB,CAAC;IAC7B,IAAI,MAA8C,CAAC;IAEnD,wFAAwF;IACxF,IAAI,MAAM,IAAK,MAAc,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,OAAO,GAAI,MAAc,CAAC,OAAO,CAAC;QACxC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACjH,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACpB,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnJ,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;QACpB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACrB,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,yDAAyD;IACzD,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,QAAQ,IAAK,MAAc,CAAC,IAAI,GAAG,CAAC,IAAK,MAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACjL,IAAI,GAAI,MAAc,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAI,MAAc,CAAC,IAAI,CAAC;QAC5B,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,0FAA0F;IAC1F,wFAAwF;IACxF,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACjI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3B,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,QAAQ,CAAC;QAChB,IAAI,GAAG,QAAQ,CAAC;QAChB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,qFAAqF;IACrF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,mEAAmE;IACnE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,wFAAwF;IACxF,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACvC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/C,yCAAyC;YACzC,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;gBACjD,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,IAAI,IAAI,uBAAuB,UAAU,IAAI,UAAU,iBAAiB,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEvD,8BAA8B;IAC9B,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,IAAI,KAAK,SAAS,CAAC;IAC7C,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;IAE1F,qDAAqD;IACrD,iEAAiE;IACjE,iDAAiD;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,iBAAiB,GAAG,qBAAqB,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,eAAe,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAqB;QACjC,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,YAAY,GAAG,QAAQ,CAAC;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAuB;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,uFAAuF;IACvF,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI;QAClC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAuB;IACtD,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAExC,oDAAoD;IACpD,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,KAAa;IACjD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAEtC,+BAA+B;IAC/B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEhD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,WAAmB,EAAE;IAClE,MAAM,GAAG,GAAG,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,YAAoB,CAAC;IACpE,MAAM,GAAG,GAAG,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,OAAO,QAAQ,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,QAAQ,aAAa,GAAG,CAAC,QAAQ,WAAW,GAAG,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC;AACrI,CAAC"}
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../src/ui/v3/tui/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * V5 Debug Commands
3
+ *
4
+ * dbg:size - Print size info to Operations panel
5
+ * dbg:layout - Toggle layout debug overlay
6
+ */
7
+ import type { Widgets } from 'neo-blessed';
8
+ import type { UIKernel } from './kernel.js';
9
+ import type { ResizeController } from './resizeController.js';
10
+ export interface DebugCommandsContext {
11
+ screen: Widgets.Screen;
12
+ kernel: UIKernel;
13
+ resizeController: ResizeController;
14
+ operationsPanel?: Widgets.Box;
15
+ }
16
+ /**
17
+ * Handle debug command
18
+ */
19
+ export declare function handleDebugCommand(command: string, context: DebugCommandsContext): boolean;
20
+ //# sourceMappingURL=debugCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugCommands.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/debugCommands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAYT"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * V5 Debug Commands
3
+ *
4
+ * dbg:size - Print size info to Operations panel
5
+ * dbg:layout - Toggle layout debug overlay
6
+ */
7
+ import { safeStderrWrite } from './runtime/stdoutGuard.js';
8
+ import { safeRender, getLayoutVersion } from './renderGate.js';
9
+ import { computeViewport } from './viewport.js';
10
+ /**
11
+ * Handle debug command
12
+ */
13
+ export function handleDebugCommand(command, context) {
14
+ if (command === 'dbg:size') {
15
+ handleDbgSize(context);
16
+ return true;
17
+ }
18
+ if (command === 'dbg:layout') {
19
+ handleDbgLayout(context);
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ /**
25
+ * Handle dbg:size command
26
+ */
27
+ function handleDbgSize(context) {
28
+ const { screen, resizeController } = context;
29
+ const vp = computeViewport(screen);
30
+ const stdoutCols = process.stdout.columns || 'N/A';
31
+ const stdoutRows = process.stdout.rows || 'N/A';
32
+ const term = process.env.TERM || 'N/A';
33
+ const platform = process.platform;
34
+ const lastCommitted = resizeController.getLastCommitted();
35
+ const burstCount = resizeController.getBurstCount();
36
+ const lastSource = resizeController.getLastSource();
37
+ const info = [
38
+ '=== V5 Size Debug ===',
39
+ `raw: ${vp.rawCols} x ${vp.rawRows}`,
40
+ `safe: ${vp.safeCols} x ${vp.safeRows}`,
41
+ `margins: R=${vp.marginRight}, B=${vp.marginBottom}`,
42
+ `environment guess: isBrowserLikely=${vp.isBrowserLikely}`,
43
+ `process.stdout.columns: ${stdoutCols}`,
44
+ `process.stdout.rows: ${stdoutRows}`,
45
+ `TERM: ${term}`,
46
+ `platform: ${platform}`,
47
+ `last committed: ${lastCommitted.cols}x${lastCommitted.rows}`,
48
+ `burstCount: ${burstCount}`,
49
+ `last source: ${lastSource}`,
50
+ ].join('\n');
51
+ // Print to operations panel if available, otherwise to stderr
52
+ if (context.operationsPanel) {
53
+ const currentContent = context.operationsPanel.content || '';
54
+ context.operationsPanel.setContent((currentContent ? currentContent + '\n\n' : '') + info);
55
+ // Show the panel when content is added
56
+ context.operationsPanel.hidden = false;
57
+ const currentVersion = getLayoutVersion();
58
+ safeRender(screen, currentVersion);
59
+ }
60
+ else {
61
+ safeStderrWrite(info + '\n');
62
+ }
63
+ }
64
+ /**
65
+ * Handle dbg:layout command
66
+ */
67
+ function handleDbgLayout(context) {
68
+ const { kernel, resizeController, screen } = context;
69
+ const vp = computeViewport(screen);
70
+ const version = resizeController.getLayoutVersion();
71
+ const burstCount = resizeController.getBurstCount();
72
+ const lastSource = resizeController.getLastSource();
73
+ kernel.toggleDebugOverlay({
74
+ cols: vp.rawCols,
75
+ rows: vp.rawRows,
76
+ version,
77
+ source: lastSource || 'manual',
78
+ burstCount,
79
+ });
80
+ }
81
+ //# sourceMappingURL=debugCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugCommands.js","sourceRoot":"","sources":["../../../src/ui/v5/debugCommands.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,11 @@
2
2
  /**
3
3
  * V5 TUI - Display Kernel Entry Point
4
4
  *
5
- * This is the minimal kernel that proves the guardrails work.
6
- *
7
- * Phase 1: Runtime Guardrails
5
+ * Phase 1: Runtime Guardrails + Atomic Resize
8
6
  * - Stdout guard (prevents glyph soup)
9
7
  * - Keep-alive (prevents black screen)
10
8
  * - Terminal restore (always restores terminal)
9
+ * - Atomic resize (no duplicate borders, no ghosts)
11
10
  *
12
11
  * Boot with: TUI_V5=1
13
12
  */
@@ -16,9 +15,6 @@ declare global {
16
15
  }
17
16
  /**
18
17
  * Start V5 TUI Display Kernel
19
- *
20
- * This is Phase 1 - just proves the guardrails work.
21
- * We'll add the actual display kernel in Phase 2.
22
18
  */
23
19
  export declare function startV5Shell(): Promise<void>;
24
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAUH,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,2BAA2B,EAAE,OAAO,GAAG,SAAS,CAAC;CACtD;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoHlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAeH,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,2BAA2B,EAAE,OAAO,GAAG,SAAS,CAAC;CACtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoKlD"}
@@ -2,12 +2,11 @@
2
2
  /**
3
3
  * V5 TUI - Display Kernel Entry Point
4
4
  *
5
- * This is the minimal kernel that proves the guardrails work.
6
- *
7
- * Phase 1: Runtime Guardrails
5
+ * Phase 1: Runtime Guardrails + Atomic Resize
8
6
  * - Stdout guard (prevents glyph soup)
9
7
  * - Keep-alive (prevents black screen)
10
8
  * - Terminal restore (always restores terminal)
9
+ * - Atomic resize (no duplicate borders, no ghosts)
11
10
  *
12
11
  * Boot with: TUI_V5=1
13
12
  */
@@ -16,13 +15,19 @@ import { initStdoutGuard, restoreStdout } from './runtime/stdoutGuard.js';
16
15
  import { attachRuntime, detachRuntime } from './runtime/keepAlive.js';
17
16
  import { restoreTerminal } from './runtime/restoreTerminal.js';
18
17
  import { safeStderrWrite } from './runtime/stdoutGuard.js';
18
+ import { UIKernel } from './kernel.js';
19
+ import { ResizeController } from './resizeController.js';
20
+ import { safeRender, getLayoutVersion } from './renderGate.js';
21
+ import { handleDebugCommand } from './debugCommands.js';
19
22
  /**
20
23
  * Start V5 TUI Display Kernel
21
- *
22
- * This is Phase 1 - just proves the guardrails work.
23
- * We'll add the actual display kernel in Phase 2.
24
24
  */
25
25
  export async function startV5Shell() {
26
+ // Check TTY before booting
27
+ if (!process.stdout.isTTY) {
28
+ console.log('V5 TUI requires a TTY. Exiting.');
29
+ process.exit(1);
30
+ }
26
31
  // Singleton guard - prevent multiple instances
27
32
  if (globalThis.__FOURRUNR_V5_TUI_RUNNING__) {
28
33
  safeStderrWrite('[V5] Already running - ignoring\n');
@@ -32,11 +37,14 @@ export async function startV5Shell() {
32
37
  globalThis.__FOURRUNR_V5_TUI_RUNNING__ = true;
33
38
  // CRITICAL: Initialize stdout guard BEFORE creating screen
34
39
  // This prevents any stdout pollution from corrupting the TUI
40
+ // TUI_DEBUG=1 -> redirects to /tmp/tui_v5.log
35
41
  initStdoutGuard({
36
42
  strict: process.env.TUI_STRICT === '1',
37
43
  logFile: process.env.TUI_V5_LOG_FILE,
38
44
  });
39
45
  let screen = null;
46
+ let kernel = null;
47
+ let resizeController = null;
40
48
  try {
41
49
  // CRITICAL: Prepare stdin BEFORE creating screen
42
50
  // This ensures stdin owns the event loop
@@ -44,13 +52,14 @@ export async function startV5Shell() {
44
52
  if (process.stdin.isTTY && !process.stdin.isRaw) {
45
53
  process.stdin.setRawMode(true);
46
54
  }
47
- // Create minimal screen (just to prove guardrails work)
55
+ // Create screen
48
56
  screen = blessed.screen({
49
57
  smartCSR: true,
50
58
  fastCSR: false,
51
59
  title: '4Runr OS - V5 Kernel (Phase 1)',
52
60
  fullUnicode: false, // Start conservative
53
- autoPadding: false,
61
+ autoPadding: false, // CRITICAL: No padding - use full width
62
+ dockBorders: false,
54
63
  });
55
64
  // CRITICAL: Attach runtime keep-alive AFTER screen creation
56
65
  // This sets up signal handlers and event loop anchor
@@ -60,37 +69,58 @@ export async function startV5Shell() {
60
69
  if (program && typeof program.hideCursor === 'function') {
61
70
  program.hideCursor();
62
71
  }
63
- // Phase 1: Just render a simple test box to prove guardrails work
64
- const testBox = blessed.box({
65
- top: 0,
66
- left: 0,
67
- width: '100%',
68
- height: '100%',
69
- content: 'V5 Kernel - Phase 1\n\nGuardrails Active:\n✓ Stdout guard\n✓ Keep-alive\n✓ Terminal restore\n\nPress Ctrl+C to exit',
70
- border: {
71
- type: 'line',
72
- },
73
- style: {
74
- border: {
75
- fg: 'green',
76
- },
77
- },
78
- });
79
- screen.append(testBox);
80
- screen.render();
72
+ // Wait a tick for screen to initialize
73
+ await new Promise(resolve => setImmediate(resolve));
74
+ // Create kernel
75
+ kernel = new UIKernel(screen);
76
+ // Create resize controller
77
+ resizeController = new ResizeController(screen, kernel);
78
+ resizeController.start();
79
+ // Boot kernel (initial mount)
80
+ kernel.boot();
81
81
  safeStderrWrite('[V5] Kernel started - guardrails active\n');
82
82
  safeStderrWrite('[V5] Screen rendered - check for glyph corruption\n');
83
- // Keep process alive - the keep-alive interval handles this
84
- // But we also need to handle input
83
+ // Setup debug commands context
84
+ const debugContext = {
85
+ screen,
86
+ kernel,
87
+ resizeController,
88
+ operationsPanel: kernel.getOperationsPanel(),
89
+ };
90
+ // Handle input - debug commands and Ctrl+C
85
91
  screen.key(['C-c'], () => {
86
92
  safeStderrWrite('\n[V5] Ctrl+C pressed - exiting...\n');
87
93
  cleanup();
88
94
  process.exit(0);
89
95
  });
90
- // Handle resize (minimal for Phase 1)
91
- screen.on('resize', () => {
92
- screen?.render();
93
- });
96
+ // Handle command input (for future use)
97
+ const widgets = kernel.getWidgets();
98
+ if (widgets?.commandInput) {
99
+ // For now, handle input via key events since we're using Box instead of Textbox
100
+ widgets.commandInput.on('keypress', (ch, key) => {
101
+ if (key.name === 'enter') {
102
+ const value = widgets.commandInput.content || '';
103
+ const command = String(value).trim();
104
+ // Handle debug commands
105
+ if (handleDebugCommand(command, debugContext)) {
106
+ // Command handled
107
+ widgets.commandInput.setContent('');
108
+ const currentVersion = getLayoutVersion();
109
+ safeRender(screen, currentVersion);
110
+ return;
111
+ }
112
+ // Future: handle other commands here
113
+ widgets.commandInput.setContent('');
114
+ const currentVersion = getLayoutVersion();
115
+ safeRender(screen, currentVersion);
116
+ }
117
+ });
118
+ // Focus command input
119
+ widgets.commandInput.focus();
120
+ }
121
+ // All async renders must use safeRender
122
+ // Example: if you have eventBus or timers, they should call:
123
+ // safeRender(screen, getLayoutVersion());
94
124
  }
95
125
  catch (error) {
96
126
  const errorMsg = error instanceof Error ? error.message : String(error);
@@ -106,6 +136,14 @@ export async function startV5Shell() {
106
136
  function cleanup() {
107
137
  // Reset singleton guard
108
138
  globalThis.__FOURRUNR_V5_TUI_RUNNING__ = false;
139
+ // Stop resize controller
140
+ if (resizeController) {
141
+ resizeController.stop();
142
+ }
143
+ // Destroy kernel
144
+ if (kernel) {
145
+ kernel.destroy();
146
+ }
109
147
  // Detach runtime
110
148
  if (screen) {
111
149
  detachRuntime(screen);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/v5/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/v5/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * V5 UI Kernel
3
+ *
4
+ * Owns the screen and all widgets. Provides atomic rebuild capability.
5
+ *
6
+ * HARD RULE: Never resize/move existing widgets.
7
+ * On every committed resize: destroy all widgets and recreate them.
8
+ */
9
+ import type { Widgets } from 'neo-blessed';
10
+ export interface RebuildOptions {
11
+ cols: number;
12
+ rows: number;
13
+ version: number;
14
+ source: string;
15
+ burstCount: number;
16
+ }
17
+ export interface UIWidgets {
18
+ testBox: Widgets.Box;
19
+ watermark: Widgets.Box;
20
+ commandInput?: Widgets.Box;
21
+ debugOverlay?: Widgets.Box;
22
+ operationsPanel?: Widgets.Box;
23
+ }
24
+ export declare class UIKernel {
25
+ private screen;
26
+ private widgets;
27
+ private layoutVersion;
28
+ private isRebuilding;
29
+ private pendingRebuild;
30
+ private debugOverlayVisible;
31
+ constructor(screen: Widgets.Screen);
32
+ /**
33
+ * Get current layout version (for render gating)
34
+ */
35
+ getLayoutVersion(): number;
36
+ /**
37
+ * Boot the kernel - initial mount
38
+ */
39
+ boot(): void;
40
+ /**
41
+ * Rebuild the UI - atomic destroy and recreate
42
+ */
43
+ rebuild(options: RebuildOptions): void;
44
+ /**
45
+ * Destroy the kernel and all widgets
46
+ */
47
+ destroy(): void;
48
+ /**
49
+ * Get current widgets (for external access)
50
+ */
51
+ getWidgets(): UIWidgets | null;
52
+ /**
53
+ * Get operations panel (for debug commands)
54
+ */
55
+ getOperationsPanel(): Widgets.Box | undefined;
56
+ /**
57
+ * Toggle debug overlay
58
+ */
59
+ toggleDebugOverlay(options: RebuildOptions): void;
60
+ /**
61
+ * Update debug overlay with new info
62
+ */
63
+ updateDebugOverlay(options: RebuildOptions): void;
64
+ /**
65
+ * Destroy all children widgets (hard destroy)
66
+ */
67
+ private destroyAllChildren;
68
+ /**
69
+ * Create all widgets fresh
70
+ *
71
+ * CRITICAL: Uses safeCols/safeRows to prevent overflow
72
+ */
73
+ private createWidgets;
74
+ }
75
+ //# sourceMappingURL=kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;CAC/B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAAkB;gBAEjC,MAAM,EAAE,OAAO,CAAC,MAAM;IAIlC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,IAAI,IAAI,IAAI;IAgBZ;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA2DtC;;OAEG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,UAAU,IAAI,SAAS,GAAG,IAAI;IAI9B;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC,GAAG,GAAG,SAAS;IAI7C;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA6CjD;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAUjD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;;;OAIG;IACH,OAAO,CAAC,aAAa;CA6FtB"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * V5 UI Kernel
3
+ *
4
+ * Owns the screen and all widgets. Provides atomic rebuild capability.
5
+ *
6
+ * HARD RULE: Never resize/move existing widgets.
7
+ * On every committed resize: destroy all widgets and recreate them.
8
+ */
9
+ import blessed from 'neo-blessed';
10
+ import { safeStderrWrite } from './runtime/stdoutGuard.js';
11
+ import { setLayoutVersion } from './renderGate.js';
12
+ import { computeViewport, assertRect } from './viewport.js';
13
+ export class UIKernel {
14
+ screen;
15
+ widgets = null;
16
+ layoutVersion = 0;
17
+ isRebuilding = false;
18
+ pendingRebuild = null;
19
+ debugOverlayVisible = false;
20
+ constructor(screen) {
21
+ this.screen = screen;
22
+ }
23
+ /**
24
+ * Get current layout version (for render gating)
25
+ */
26
+ getLayoutVersion() {
27
+ return this.layoutVersion;
28
+ }
29
+ /**
30
+ * Boot the kernel - initial mount
31
+ */
32
+ boot() {
33
+ if (this.widgets) {
34
+ throw new Error('Kernel already booted');
35
+ }
36
+ const vp = computeViewport(this.screen);
37
+ this.widgets = this.createWidgets(vp);
38
+ this.layoutVersion = 1;
39
+ setLayoutVersion(this.layoutVersion);
40
+ // Force a render after a small delay to ensure screen is ready
41
+ setImmediate(() => {
42
+ this.screen.render();
43
+ });
44
+ }
45
+ /**
46
+ * Rebuild the UI - atomic destroy and recreate
47
+ */
48
+ rebuild(options) {
49
+ // A) Block re-entrant rebuild
50
+ if (this.isRebuilding) {
51
+ this.pendingRebuild = options;
52
+ return;
53
+ }
54
+ this.isRebuilding = true;
55
+ try {
56
+ // B) Clear the terminal buffer
57
+ const program = this.screen.program;
58
+ if (program) {
59
+ if (typeof program.clear === 'function') {
60
+ program.clear();
61
+ }
62
+ if (typeof program.flush === 'function') {
63
+ program.flush();
64
+ }
65
+ }
66
+ // C) Destroy everything currently mounted (hard)
67
+ this.destroyAllChildren();
68
+ // D) Compute viewport (single source of truth)
69
+ const vp = computeViewport(this.screen);
70
+ // E) Recreate widgets fresh using safe dimensions
71
+ this.widgets = this.createWidgets(vp);
72
+ this.layoutVersion = options.version;
73
+ setLayoutVersion(this.layoutVersion);
74
+ // F) Render once
75
+ this.screen.render();
76
+ // Update debug overlay if visible
77
+ this.updateDebugOverlay(options);
78
+ // G) Restore input focus
79
+ if (this.widgets.commandInput) {
80
+ this.widgets.commandInput.focus();
81
+ this.screen.render();
82
+ }
83
+ safeStderrWrite(`[V5] Rebuilt layout v${options.version} (raw: ${vp.rawCols}x${vp.rawRows}, safe: ${vp.safeCols}x${vp.safeRows}) from ${options.source} (burst: ${options.burstCount})\n`);
84
+ }
85
+ finally {
86
+ this.isRebuilding = false;
87
+ // Process pending rebuild if one was queued
88
+ if (this.pendingRebuild) {
89
+ const pending = this.pendingRebuild;
90
+ this.pendingRebuild = null;
91
+ // Use setImmediate to avoid re-entrancy issues
92
+ setImmediate(() => this.rebuild(pending));
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Destroy the kernel and all widgets
98
+ */
99
+ destroy() {
100
+ this.destroyAllChildren();
101
+ this.widgets = null;
102
+ }
103
+ /**
104
+ * Get current widgets (for external access)
105
+ */
106
+ getWidgets() {
107
+ return this.widgets;
108
+ }
109
+ /**
110
+ * Get operations panel (for debug commands)
111
+ */
112
+ getOperationsPanel() {
113
+ return this.widgets?.operationsPanel;
114
+ }
115
+ /**
116
+ * Toggle debug overlay
117
+ */
118
+ toggleDebugOverlay(options) {
119
+ this.debugOverlayVisible = !this.debugOverlayVisible;
120
+ if (this.widgets) {
121
+ if (this.debugOverlayVisible) {
122
+ // Create or update debug overlay
123
+ if (this.widgets.debugOverlay) {
124
+ if (typeof this.widgets.debugOverlay.detach === 'function') {
125
+ this.widgets.debugOverlay.detach();
126
+ }
127
+ }
128
+ const vp = computeViewport(this.screen);
129
+ const overlayWidth = vp.safeCols;
130
+ this.widgets.debugOverlay = blessed.box({
131
+ top: 0,
132
+ left: 0,
133
+ width: overlayWidth,
134
+ height: 1,
135
+ content: `raw: ${vp.rawCols}x${vp.rawRows} safe: ${vp.safeCols}x${vp.safeRows} | v${options.version} | burst: ${options.burstCount} | ${options.source}`,
136
+ style: {
137
+ fg: 'yellow',
138
+ },
139
+ });
140
+ assertRect('debugOverlay', { x: 0, y: 0, w: overlayWidth, h: 1 }, vp);
141
+ this.screen.append(this.widgets.debugOverlay);
142
+ }
143
+ else {
144
+ // Remove debug overlay
145
+ if (this.widgets.debugOverlay) {
146
+ if (typeof this.widgets.debugOverlay.detach === 'function') {
147
+ this.widgets.debugOverlay.detach();
148
+ }
149
+ if (typeof this.widgets.debugOverlay.destroy === 'function') {
150
+ this.widgets.debugOverlay.destroy();
151
+ }
152
+ this.widgets.debugOverlay = undefined;
153
+ }
154
+ }
155
+ this.screen.render();
156
+ }
157
+ }
158
+ /**
159
+ * Update debug overlay with new info
160
+ */
161
+ updateDebugOverlay(options) {
162
+ if (this.debugOverlayVisible && this.widgets?.debugOverlay) {
163
+ const vp = computeViewport(this.screen);
164
+ this.widgets.debugOverlay.setContent(`raw: ${vp.rawCols}x${vp.rawRows} safe: ${vp.safeCols}x${vp.safeRows} | v${options.version} | burst: ${options.burstCount} | ${options.source}`);
165
+ this.screen.render();
166
+ }
167
+ }
168
+ /**
169
+ * Destroy all children widgets (hard destroy)
170
+ */
171
+ destroyAllChildren() {
172
+ // Copy list first because detach mutates
173
+ const kids = [...this.screen.children];
174
+ for (const k of kids) {
175
+ try {
176
+ if (typeof k.detach === 'function') {
177
+ k.detach();
178
+ }
179
+ }
180
+ catch (e) {
181
+ // Ignore detach errors
182
+ }
183
+ try {
184
+ if (typeof k.destroy === 'function') {
185
+ k.destroy();
186
+ }
187
+ }
188
+ catch (e) {
189
+ // Ignore destroy errors
190
+ }
191
+ }
192
+ // Remove from screen.children manually (blessed sometimes doesn't clean up)
193
+ const screenChildren = this.screen.children || [];
194
+ while (screenChildren.length > 0) {
195
+ screenChildren.pop();
196
+ }
197
+ }
198
+ /**
199
+ * Create all widgets fresh
200
+ *
201
+ * CRITICAL: Uses safeCols/safeRows to prevent overflow
202
+ */
203
+ createWidgets(vp) {
204
+ // Use explicit pixel dimensions - use ~95% of SAFE viewport
205
+ const boxWidth = Math.floor(vp.safeCols * 0.95);
206
+ const boxHeight = Math.floor(vp.safeRows * 0.95);
207
+ const boxLeft = Math.floor((vp.safeCols - boxWidth) / 2);
208
+ const boxTop = Math.floor((vp.safeRows - boxHeight) / 2);
209
+ // Assert no overflow
210
+ assertRect('testBox', { x: boxLeft, y: boxTop, w: boxWidth, h: boxHeight }, vp);
211
+ const testBox = blessed.box({
212
+ top: boxTop,
213
+ left: boxLeft,
214
+ width: boxWidth,
215
+ height: boxHeight,
216
+ content: 'V5 Kernel - Phase 1\n\nGuardrails Active:\n✓ Stdout guard\n✓ Keep-alive\n✓ Terminal restore\n✓ Atomic resize\n✓ Safe viewport\n\nPress Ctrl+C to exit',
217
+ border: {
218
+ type: 'line',
219
+ },
220
+ style: {
221
+ border: {
222
+ fg: 'green',
223
+ },
224
+ },
225
+ });
226
+ // V5 Watermark - top right corner (within safe bounds)
227
+ const watermarkLeft = vp.safeCols - 10;
228
+ const watermark = blessed.box({
229
+ top: 0,
230
+ left: watermarkLeft,
231
+ width: 10,
232
+ height: 1,
233
+ content: '{cyan-fg}V5{/cyan-fg}',
234
+ style: {
235
+ fg: 'cyan',
236
+ },
237
+ tags: true,
238
+ });
239
+ assertRect('watermark', { x: watermarkLeft, y: 0, w: 10, h: 1 }, vp);
240
+ // Operations panel (for debug output) - hidden initially, shown when dbg:size is used
241
+ // Position it below the testBox so it doesn't overlap
242
+ const opsTop = boxTop + boxHeight + 1;
243
+ const opsHeight = 5;
244
+ const operationsPanel = blessed.box({
245
+ top: opsTop,
246
+ left: boxLeft,
247
+ width: boxWidth,
248
+ height: opsHeight,
249
+ content: '',
250
+ scrollable: true,
251
+ alwaysScroll: true,
252
+ keys: true,
253
+ mouse: true,
254
+ hidden: true, // Hidden by default
255
+ style: {
256
+ fg: 'white',
257
+ },
258
+ });
259
+ // Only assert if panel would be visible (not hidden)
260
+ // assertRect('operationsPanel', { x: boxLeft, y: opsTop, w: boxWidth, h: opsHeight }, vp);
261
+ // Command input (for future use) - use box instead of textbox
262
+ const cmdTop = vp.safeRows - 3;
263
+ const cmdLeft = 1;
264
+ const cmdWidth = vp.safeCols - 2;
265
+ const commandInput = blessed.box({
266
+ top: cmdTop,
267
+ left: cmdLeft,
268
+ width: cmdWidth,
269
+ height: 1,
270
+ keys: true,
271
+ input: true,
272
+ style: {
273
+ fg: 'white',
274
+ },
275
+ });
276
+ assertRect('commandInput', { x: cmdLeft, y: cmdTop, w: cmdWidth, h: 1 }, vp);
277
+ this.screen.append(testBox);
278
+ this.screen.append(watermark);
279
+ this.screen.append(operationsPanel);
280
+ this.screen.append(commandInput);
281
+ return {
282
+ testBox,
283
+ watermark,
284
+ commandInput,
285
+ operationsPanel,
286
+ };
287
+ }
288
+ }
289
+ //# sourceMappingURL=kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../../src/ui/v5/kernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * V5 Render Gating
3
+ *
4
+ * Prevents stale renders from async events.
5
+ * Any render that can happen asynchronously must be gated.
6
+ */
7
+ /**
8
+ * Set the current layout version (called by kernel)
9
+ */
10
+ export declare function setLayoutVersion(version: number): void;
11
+ /**
12
+ * Get the current layout version
13
+ */
14
+ export declare function getLayoutVersion(): number;
15
+ /**
16
+ * Safe render - only renders if version matches
17
+ */
18
+ export declare function safeRender(screen: any, expectedVersion: number, renderFn?: () => void): boolean;
19
+ //# sourceMappingURL=renderGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderGate.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/renderGate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,GAAG,EACX,eAAe,EAAE,MAAM,EACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,OAAO,CAaT"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * V5 Render Gating
3
+ *
4
+ * Prevents stale renders from async events.
5
+ * Any render that can happen asynchronously must be gated.
6
+ */
7
+ let currentLayoutVersion = 0;
8
+ /**
9
+ * Set the current layout version (called by kernel)
10
+ */
11
+ export function setLayoutVersion(version) {
12
+ currentLayoutVersion = version;
13
+ }
14
+ /**
15
+ * Get the current layout version
16
+ */
17
+ export function getLayoutVersion() {
18
+ return currentLayoutVersion;
19
+ }
20
+ /**
21
+ * Safe render - only renders if version matches
22
+ */
23
+ export function safeRender(screen, expectedVersion, renderFn) {
24
+ if (expectedVersion !== currentLayoutVersion) {
25
+ // Stale render - ignore
26
+ return false;
27
+ }
28
+ if (renderFn) {
29
+ renderFn();
30
+ }
31
+ else {
32
+ screen.render();
33
+ }
34
+ return true;
35
+ }
36
+ //# sourceMappingURL=renderGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderGate.js","sourceRoot":"","sources":["../../../src/ui/v5/renderGate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,IAAI,oBAAoB,GAAW,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,oBAAoB,GAAG,OAAO,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,MAAW,EACX,eAAuB,EACvB,QAAqB;IAErB,IAAI,eAAe,KAAK,oBAAoB,EAAE,CAAC;QAC7C,wBAAwB;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;IACb,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * V5 Atomic Resize Controller
3
+ *
4
+ * Listens to BOTH resize sources and debounces commits.
5
+ * Tracks layoutVersion for render gating.
6
+ */
7
+ import type { Widgets } from 'neo-blessed';
8
+ import type { UIKernel } from './kernel.js';
9
+ export declare class ResizeController {
10
+ private screen;
11
+ private kernel;
12
+ private timer;
13
+ private layoutVersion;
14
+ private lastCommitted;
15
+ private pending;
16
+ private burstCount;
17
+ private lastSource;
18
+ constructor(screen: Widgets.Screen, kernel: UIKernel);
19
+ /**
20
+ * Start listening to resize events
21
+ */
22
+ start(): void;
23
+ /**
24
+ * Stop listening to resize events
25
+ */
26
+ stop(): void;
27
+ /**
28
+ * Get current layout version
29
+ */
30
+ getLayoutVersion(): number;
31
+ /**
32
+ * Get last committed size
33
+ */
34
+ getLastCommitted(): {
35
+ cols: number;
36
+ rows: number;
37
+ };
38
+ /**
39
+ * Get burst count
40
+ */
41
+ getBurstCount(): number;
42
+ /**
43
+ * Get last resize source
44
+ */
45
+ getLastSource(): string;
46
+ /**
47
+ * Handle resize event (debounced)
48
+ */
49
+ private onResizeEvent;
50
+ /**
51
+ * Commit resize (atomic)
52
+ */
53
+ private commitResize;
54
+ }
55
+ //# sourceMappingURL=resizeController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizeController.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/resizeController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAG5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAwD;IAC7E,OAAO,CAAC,OAAO,CAAwD;IACvE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAc;gBAEpB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ;IAKpD;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAIlD;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,YAAY;CAoCrB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * V5 Atomic Resize Controller
3
+ *
4
+ * Listens to BOTH resize sources and debounces commits.
5
+ * Tracks layoutVersion for render gating.
6
+ */
7
+ import { computeViewport } from './viewport.js';
8
+ export class ResizeController {
9
+ screen;
10
+ kernel;
11
+ timer = null;
12
+ layoutVersion = 0;
13
+ lastCommitted = { cols: 0, rows: 0 };
14
+ pending = { cols: 0, rows: 0 };
15
+ burstCount = 0;
16
+ lastSource = '';
17
+ constructor(screen, kernel) {
18
+ this.screen = screen;
19
+ this.kernel = kernel;
20
+ }
21
+ /**
22
+ * Start listening to resize events
23
+ */
24
+ start() {
25
+ // Listen to screen resize
26
+ this.screen.on('resize', () => {
27
+ this.onResizeEvent('screen');
28
+ });
29
+ // Listen to process.stdout resize (Windows can be weird)
30
+ if (process.stdout.on) {
31
+ process.stdout.on('resize', () => {
32
+ this.onResizeEvent('stdout');
33
+ });
34
+ }
35
+ }
36
+ /**
37
+ * Stop listening to resize events
38
+ */
39
+ stop() {
40
+ if (this.timer) {
41
+ clearTimeout(this.timer);
42
+ this.timer = null;
43
+ }
44
+ // Remove listeners (blessed doesn't have removeAllListeners in types)
45
+ if (typeof this.screen.removeAllListeners === 'function') {
46
+ this.screen.removeAllListeners('resize');
47
+ }
48
+ if (process.stdout && typeof process.stdout.removeAllListeners === 'function') {
49
+ process.stdout.removeAllListeners('resize');
50
+ }
51
+ }
52
+ /**
53
+ * Get current layout version
54
+ */
55
+ getLayoutVersion() {
56
+ return this.layoutVersion;
57
+ }
58
+ /**
59
+ * Get last committed size
60
+ */
61
+ getLastCommitted() {
62
+ return { ...this.lastCommitted };
63
+ }
64
+ /**
65
+ * Get burst count
66
+ */
67
+ getBurstCount() {
68
+ return this.burstCount;
69
+ }
70
+ /**
71
+ * Get last resize source
72
+ */
73
+ getLastSource() {
74
+ return this.lastSource;
75
+ }
76
+ /**
77
+ * Handle resize event (debounced)
78
+ */
79
+ onResizeEvent(source) {
80
+ // Use viewport to get raw dimensions (will be committed in commitResize)
81
+ const vp = computeViewport(this.screen);
82
+ this.pending = { cols: vp.rawCols, rows: vp.rawRows };
83
+ this.burstCount++;
84
+ if (this.timer) {
85
+ clearTimeout(this.timer);
86
+ }
87
+ this.timer = setTimeout(() => {
88
+ this.commitResize(source);
89
+ }, 120);
90
+ }
91
+ /**
92
+ * Commit resize (atomic)
93
+ */
94
+ commitResize(source) {
95
+ this.timer = null;
96
+ // Use viewport to get raw dimensions (kernel will compute safe viewport)
97
+ const vp = computeViewport(this.screen);
98
+ const cols = vp.rawCols;
99
+ const rows = vp.rawRows;
100
+ // Ignore bogus zero sizes
101
+ if (!cols || !rows) {
102
+ return;
103
+ }
104
+ // Ignore duplicate commits
105
+ if (cols === this.lastCommitted.cols && rows === this.lastCommitted.rows) {
106
+ return;
107
+ }
108
+ this.lastCommitted = { cols, rows };
109
+ this.lastSource = source;
110
+ this.layoutVersion++;
111
+ const myVersion = this.layoutVersion;
112
+ const myBurstCount = this.burstCount;
113
+ // Reset burst count after commit
114
+ this.burstCount = 0;
115
+ this.kernel.rebuild({
116
+ cols,
117
+ rows,
118
+ version: myVersion,
119
+ source,
120
+ burstCount: myBurstCount,
121
+ });
122
+ }
123
+ }
124
+ //# sourceMappingURL=resizeController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizeController.js","sourceRoot":"","sources":["../../../src/ui/v5/resizeController.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stdoutGuard.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/runtime/stdoutGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CAyFZ;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAkBpC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMlD"}
1
+ {"version":3,"file":"stdoutGuard.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/runtime/stdoutGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CA2FZ;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAkBpC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMlD"}
@@ -29,7 +29,9 @@ export function initStdoutGuard(options = {}) {
29
29
  }
30
30
  stdoutGuardActive = true;
31
31
  const strict = options.strict || process.env.TUI_STRICT === '1';
32
- const logFilePath = options.logFile || process.env.TUI_V5_LOG_FILE;
32
+ // TUI_DEBUG=1 -> write to /tmp/tui_v5.log, otherwise use provided logFile or stderr
33
+ const logFilePath = options.logFile || process.env.TUI_V5_LOG_FILE ||
34
+ (process.env.TUI_DEBUG === '1' ? '/tmp/tui_v5.log' : undefined);
33
35
  // Store originals
34
36
  originalConsoleLog = console.log;
35
37
  originalStdoutWrite = process.stdout.write.bind(process.stdout);
@@ -1 +1 @@
1
- {"version":3,"file":"stdoutGuard.js","sourceRoot":"","sources":["../../../../src/ui/v5/runtime/stdoutGuard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdoutGuard.js","sourceRoot":"","sources":["../../../../src/ui/v5/runtime/stdoutGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * V5 Safe Viewport Module
3
+ *
4
+ * Single source of truth for terminal dimensions.
5
+ * Always use safeCols/safeRows for layout to prevent overflow.
6
+ *
7
+ * Rules:
8
+ * - Never place any widget whose right edge touches screen.cols
9
+ * - Default margin: right=1, bottom=1
10
+ * - For AWS web terminals, default margin: right=3, bottom=2
11
+ * - Allow override via env vars
12
+ */
13
+ export type Viewport = {
14
+ rawCols: number;
15
+ rawRows: number;
16
+ safeCols: number;
17
+ safeRows: number;
18
+ marginRight: number;
19
+ marginBottom: number;
20
+ isBrowserLikely: boolean;
21
+ };
22
+ /**
23
+ * Compute safe viewport from screen
24
+ *
25
+ * This is the single source of truth for terminal dimensions.
26
+ * Always use safeCols/safeRows for layout calculations.
27
+ */
28
+ export declare function computeViewport(screen: any): Viewport;
29
+ /**
30
+ * Assert that a rectangle fits within safe viewport bounds
31
+ *
32
+ * Throws in debug mode if overflow detected.
33
+ * This prevents accidental regressions.
34
+ */
35
+ export declare function assertRect(name: string, r: {
36
+ x: number;
37
+ y: number;
38
+ w: number;
39
+ h: number;
40
+ }, vp: Viewport): void;
41
+ //# sourceMappingURL=viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/ui/v5/viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAsDrD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EACjD,EAAE,EAAE,QAAQ,GACX,IAAI,CAUN"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * V5 Safe Viewport Module
3
+ *
4
+ * Single source of truth for terminal dimensions.
5
+ * Always use safeCols/safeRows for layout to prevent overflow.
6
+ *
7
+ * Rules:
8
+ * - Never place any widget whose right edge touches screen.cols
9
+ * - Default margin: right=1, bottom=1
10
+ * - For AWS web terminals, default margin: right=3, bottom=2
11
+ * - Allow override via env vars
12
+ */
13
+ /**
14
+ * Clamp a number to a minimum value
15
+ */
16
+ function clamp(n, min) {
17
+ return n < min ? min : n;
18
+ }
19
+ /**
20
+ * Compute safe viewport from screen
21
+ *
22
+ * This is the single source of truth for terminal dimensions.
23
+ * Always use safeCols/safeRows for layout calculations.
24
+ */
25
+ export function computeViewport(screen) {
26
+ // Get raw dimensions from screen (most authoritative)
27
+ const program = screen?.program;
28
+ let rawCols;
29
+ let rawRows;
30
+ if (program && typeof program.cols === 'number' && program.cols > 0) {
31
+ rawCols = program.cols;
32
+ rawRows = program.rows;
33
+ }
34
+ else if (typeof screen.width === 'number' && typeof screen.height === 'number' && screen.width > 0 && screen.height > 0) {
35
+ rawCols = screen.width;
36
+ rawRows = screen.height;
37
+ }
38
+ else if (typeof screen.cols === 'number' && typeof screen.rows === 'number') {
39
+ rawCols = screen.cols;
40
+ rawRows = screen.rows;
41
+ }
42
+ else {
43
+ rawCols = process.stdout.columns || 80;
44
+ rawRows = process.stdout.rows || 24;
45
+ }
46
+ // Heuristic: AWS web terminals often set these envs
47
+ const isBrowserLikely = !!process.env.AWS_REGION ||
48
+ !!process.env.CLOUDSHELL ||
49
+ !!process.env.AWS_EXECUTION_ENV ||
50
+ !!process.env.EC2_INSTANCE_ID ||
51
+ (process.env.TERM || '').toLowerCase().includes('xterm'); // weak but ok as fallback
52
+ // Defaults - AWS web terminals need more margin to prevent scrollbar
53
+ // Increased from 3 to 6 based on testing (horizontal scrollbar still appears with 3-5)
54
+ let marginRight = isBrowserLikely ? 6 : 1;
55
+ let marginBottom = isBrowserLikely ? 2 : 1;
56
+ // Override knobs (must exist)
57
+ if (process.env.TUI_SAFE_MARGIN_RIGHT) {
58
+ marginRight = Number(process.env.TUI_SAFE_MARGIN_RIGHT);
59
+ }
60
+ if (process.env.TUI_SAFE_MARGIN_BOTTOM) {
61
+ marginBottom = Number(process.env.TUI_SAFE_MARGIN_BOTTOM);
62
+ }
63
+ // Final safe viewport (clamp to minimums)
64
+ const safeCols = clamp(rawCols - marginRight, 20);
65
+ const safeRows = clamp(rawRows - marginBottom, 10);
66
+ return {
67
+ rawCols,
68
+ rawRows,
69
+ safeCols,
70
+ safeRows,
71
+ marginRight,
72
+ marginBottom,
73
+ isBrowserLikely,
74
+ };
75
+ }
76
+ /**
77
+ * Assert that a rectangle fits within safe viewport bounds
78
+ *
79
+ * Throws in debug mode if overflow detected.
80
+ * This prevents accidental regressions.
81
+ */
82
+ export function assertRect(name, r, vp) {
83
+ const right = r.x + r.w;
84
+ const bottom = r.y + r.h;
85
+ if (right > vp.safeCols || bottom > vp.safeRows) {
86
+ throw new Error(`[V5] OVERFLOW ${name}: right=${right} (max=${vp.safeCols}) bottom=${bottom} (max=${vp.safeRows}) ` +
87
+ `rect: x=${r.x} y=${r.y} w=${r.w} h=${r.h} viewport: raw=${vp.rawCols}x${vp.rawRows} safe=${vp.safeCols}x${vp.safeRows}`);
88
+ }
89
+ }
90
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/ui/v5/viewport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "2.0.37",
3
+ "version": "2.0.39",
4
4
  "type": "module",
5
5
  "description": "4Runr AI Agent OS - Interactive terminal for managing AI agents",
6
6
  "main": "dist/index.js",