4runr-os 2.0.71 → 2.1.0

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.
Files changed (38) hide show
  1. package/dist/index.js +47 -38
  2. package/dist/index.js.map +1 -1
  3. package/dist/tui_mk1/kernel.d.ts +32 -0
  4. package/dist/tui_mk1/kernel.d.ts.map +1 -0
  5. package/dist/tui_mk1/kernel.js +115 -0
  6. package/dist/tui_mk1/kernel.js.map +1 -0
  7. package/dist/tui_mk1/logger.d.ts +11 -0
  8. package/dist/tui_mk1/logger.d.ts.map +1 -0
  9. package/dist/tui_mk1/logger.js +86 -0
  10. package/dist/tui_mk1/logger.js.map +1 -0
  11. package/dist/tui_mk1/mk1App.d.ts +45 -0
  12. package/dist/tui_mk1/mk1App.d.ts.map +1 -0
  13. package/dist/tui_mk1/mk1App.js +283 -0
  14. package/dist/tui_mk1/mk1App.js.map +1 -0
  15. package/dist/tui_mk1/resizeController.d.ts +39 -0
  16. package/dist/tui_mk1/resizeController.d.ts.map +1 -0
  17. package/dist/tui_mk1/resizeController.js +108 -0
  18. package/dist/tui_mk1/resizeController.js.map +1 -0
  19. package/dist/tui_mk1/stdoutGuard.d.ts +15 -0
  20. package/dist/tui_mk1/stdoutGuard.d.ts.map +1 -0
  21. package/dist/tui_mk1/stdoutGuard.js +66 -0
  22. package/dist/tui_mk1/stdoutGuard.js.map +1 -0
  23. package/dist/tui_mk1/terminalRestore.d.ts +22 -0
  24. package/dist/tui_mk1/terminalRestore.d.ts.map +1 -0
  25. package/dist/tui_mk1/terminalRestore.js +78 -0
  26. package/dist/tui_mk1/terminalRestore.js.map +1 -0
  27. package/dist/ui/v5/viewport/getViewport.d.ts.map +1 -1
  28. package/dist/ui/v5/viewport/getViewport.js +7 -6
  29. package/dist/ui/v5/viewport/getViewport.js.map +1 -1
  30. package/package.json +9 -8
  31. package/dist/ui/v3/state/feedModel.d.ts +0 -49
  32. package/dist/ui/v3/state/feedModel.d.ts.map +0 -1
  33. package/dist/ui/v3/state/feedModel.js +0 -84
  34. package/dist/ui/v3/state/feedModel.js.map +0 -1
  35. package/dist/ui/v3/v1Adapters/__tests__/smoke.test.d.ts +0 -16
  36. package/dist/ui/v3/v1Adapters/__tests__/smoke.test.d.ts.map +0 -1
  37. package/dist/ui/v3/v1Adapters/__tests__/smoke.test.js +0 -141
  38. package/dist/ui/v3/v1Adapters/__tests__/smoke.test.js.map +0 -1
@@ -0,0 +1,108 @@
1
+ import { logger } from './logger.js';
2
+ let resizeTimer = null;
3
+ let pendingResize = null;
4
+ let stats = {
5
+ lastCols: 0,
6
+ lastRows: 0,
7
+ burstCount: 0,
8
+ lastResizeTime: 0,
9
+ totalResizes: 0,
10
+ };
11
+ const DEBOUNCE_MS = 150;
12
+ const BURST_WINDOW_MS = 500;
13
+ let rebuildCallback = null;
14
+ /**
15
+ * Initialize resize controller
16
+ */
17
+ export function initResizeController(screen, onRebuild) {
18
+ rebuildCallback = onRebuild;
19
+ // Get initial size
20
+ stats.lastCols = screen.width;
21
+ stats.lastRows = screen.height;
22
+ // Listen for resize events
23
+ screen.on('resize', () => {
24
+ handleResize(screen.width, screen.height);
25
+ });
26
+ logger.debug(`Resize controller initialized: ${stats.lastCols}x${stats.lastRows}`);
27
+ }
28
+ /**
29
+ * Handle resize event (debounced)
30
+ */
31
+ function handleResize(cols, rows) {
32
+ const now = Date.now();
33
+ // Check if this is part of a burst
34
+ if (now - stats.lastResizeTime < BURST_WINDOW_MS) {
35
+ stats.burstCount++;
36
+ }
37
+ else {
38
+ stats.burstCount = 1;
39
+ }
40
+ stats.lastResizeTime = now;
41
+ pendingResize = { cols, rows };
42
+ // Clear existing timer
43
+ if (resizeTimer) {
44
+ clearTimeout(resizeTimer);
45
+ }
46
+ // Debounce: wait 150ms before committing
47
+ resizeTimer = setTimeout(() => {
48
+ commitResize();
49
+ }, DEBOUNCE_MS);
50
+ logger.debug(`Resize event: ${cols}x${rows} (burst: ${stats.burstCount})`);
51
+ }
52
+ /**
53
+ * Commit resize (atomic rebuild)
54
+ */
55
+ async function commitResize() {
56
+ if (!pendingResize || !rebuildCallback) {
57
+ return;
58
+ }
59
+ const { cols, rows } = pendingResize;
60
+ pendingResize = null;
61
+ stats.lastCols = cols;
62
+ stats.lastRows = rows;
63
+ stats.totalResizes++;
64
+ logger.debug(`Committing resize: ${cols}x${rows} (total: ${stats.totalResizes})`);
65
+ try {
66
+ // Atomic rebuild: destroy + recreate everything
67
+ await rebuildCallback(cols, rows);
68
+ logger.debug(`Resize committed successfully`);
69
+ }
70
+ catch (error) {
71
+ logger.error(`Resize rebuild failed: ${error.message}`);
72
+ }
73
+ }
74
+ /**
75
+ * Get resize statistics
76
+ */
77
+ export function getResizeStats() {
78
+ return { ...stats };
79
+ }
80
+ /**
81
+ * Force immediate rebuild (for dbg:panic)
82
+ */
83
+ export async function forceRebuild() {
84
+ if (resizeTimer) {
85
+ clearTimeout(resizeTimer);
86
+ resizeTimer = null;
87
+ }
88
+ if (pendingResize && rebuildCallback) {
89
+ await commitResize();
90
+ }
91
+ else if (rebuildCallback) {
92
+ // Rebuild with current stats
93
+ await rebuildCallback(stats.lastCols, stats.lastRows);
94
+ }
95
+ }
96
+ /**
97
+ * Destroy resize controller
98
+ */
99
+ export function destroyResizeController() {
100
+ if (resizeTimer) {
101
+ clearTimeout(resizeTimer);
102
+ resizeTimer = null;
103
+ }
104
+ rebuildCallback = null;
105
+ pendingResize = null;
106
+ logger.debug('Resize controller destroyed');
107
+ }
108
+ //# sourceMappingURL=resizeController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizeController.js","sourceRoot":"","sources":["../../src/tui_mk1/resizeController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Enable stdout guard
3
+ * Call this BEFORE creating the screen
4
+ */
5
+ export declare function enableStdoutGuard(): void;
6
+ /**
7
+ * Disable stdout guard
8
+ * Call this on exit/cleanup
9
+ */
10
+ export declare function disableStdoutGuard(): void;
11
+ /**
12
+ * Check if guard is enabled
13
+ */
14
+ export declare function isStdoutGuardEnabled(): boolean;
15
+ //# sourceMappingURL=stdoutGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdoutGuard.d.ts","sourceRoot":"","sources":["../../src/tui_mk1/stdoutGuard.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAqCxC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAWzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MK1 Stdout Guard - Block stdout writes unless explicitly allowed
3
+ *
4
+ * Critical: Prevents "weird symbols / box drawing dumped to console" issue
5
+ *
6
+ * Rules:
7
+ * - By default, block process.stdout.write
8
+ * - Allow only if TUI_ALLOW_STDOUT=1
9
+ * - When blocked, redirect to logger.debug() (rate-limited)
10
+ */
11
+ import { logger } from './logger.js';
12
+ let stdoutGuardEnabled = false;
13
+ let originalStdoutWrite;
14
+ /**
15
+ * Enable stdout guard
16
+ * Call this BEFORE creating the screen
17
+ */
18
+ export function enableStdoutGuard() {
19
+ if (stdoutGuardEnabled) {
20
+ return; // Already enabled
21
+ }
22
+ stdoutGuardEnabled = true;
23
+ originalStdoutWrite = process.stdout.write.bind(process.stdout);
24
+ // Wrap stdout.write
25
+ process.stdout.write = function (chunk, encoding, callback) {
26
+ // Check if stdout is explicitly allowed
27
+ if (process.env.TUI_ALLOW_STDOUT === '1') {
28
+ return originalStdoutWrite(chunk, encoding, callback);
29
+ }
30
+ // Block stdout - redirect to logger
31
+ const str = typeof chunk === 'string' ? chunk : chunk.toString();
32
+ const lines = str.split('\n');
33
+ for (const line of lines) {
34
+ if (line.trim()) {
35
+ logger.debug(`BLOCKED stdout: ${line.substring(0, 100)}`);
36
+ }
37
+ }
38
+ // Return success to prevent errors, but don't actually write
39
+ if (callback) {
40
+ callback();
41
+ }
42
+ return true;
43
+ };
44
+ logger.debug('Stdout guard enabled');
45
+ }
46
+ /**
47
+ * Disable stdout guard
48
+ * Call this on exit/cleanup
49
+ */
50
+ export function disableStdoutGuard() {
51
+ if (!stdoutGuardEnabled) {
52
+ return;
53
+ }
54
+ if (originalStdoutWrite) {
55
+ process.stdout.write = originalStdoutWrite;
56
+ }
57
+ stdoutGuardEnabled = false;
58
+ logger.debug('Stdout guard disabled');
59
+ }
60
+ /**
61
+ * Check if guard is enabled
62
+ */
63
+ export function isStdoutGuardEnabled() {
64
+ return stdoutGuardEnabled;
65
+ }
66
+ //# sourceMappingURL=stdoutGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdoutGuard.js","sourceRoot":"","sources":["../../src/tui_mk1/stdoutGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,IAAI,mBAAgD,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,kBAAkB;IAC5B,CAAC;IAED,kBAAkB,GAAG,IAAI,CAAC;IAC1B,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE,oBAAoB;IACnB,OAAO,CAAC,MAAc,CAAC,KAAK,GAAG,UAC9B,KAAU,EACV,QAAc,EACd,QAAc;QAEd,wCAAwC;QACxC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG,EAAE,CAAC;YACzC,OAAO,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,oCAAoC;QACpC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACvB,OAAO,CAAC,MAAc,CAAC,KAAK,GAAG,mBAAmB,CAAC;IACtD,CAAC;IAED,kBAAkB,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MK1 Terminal Restore - Ensure terminal state restored on exit
3
+ *
4
+ * On exit (SIGINT, SIGTERM, uncaught exception):
5
+ * - screen?.destroy()
6
+ * - Reset colors, show cursor, disable mouse
7
+ * - Ensure process exits cleanly
8
+ */
9
+ import type { Widgets } from 'neo-blessed';
10
+ /**
11
+ * Register screen for terminal restore
12
+ */
13
+ export declare function registerScreen(s: Widgets.Screen): void;
14
+ /**
15
+ * Restore terminal to safe state
16
+ */
17
+ export declare function restoreTerminal(): void;
18
+ /**
19
+ * Unregister screen (cleanup)
20
+ */
21
+ export declare function unregisterScreen(): void;
22
+ //# sourceMappingURL=terminalRestore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalRestore.d.ts","sourceRoot":"","sources":["../../src/tui_mk1/terminalRestore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAM3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAMtD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAuBtC;AAyCD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,78 @@
1
+ import { logger } from './logger.js';
2
+ let screen = null;
3
+ let restoreHandlersAttached = false;
4
+ /**
5
+ * Register screen for terminal restore
6
+ */
7
+ export function registerScreen(s) {
8
+ screen = s;
9
+ if (!restoreHandlersAttached) {
10
+ attachRestoreHandlers();
11
+ }
12
+ }
13
+ /**
14
+ * Restore terminal to safe state
15
+ */
16
+ export function restoreTerminal() {
17
+ try {
18
+ // Destroy screen if it exists
19
+ if (screen) {
20
+ try {
21
+ screen.destroy();
22
+ }
23
+ catch (error) {
24
+ // Ignore destroy errors
25
+ }
26
+ screen = null;
27
+ }
28
+ // Reset terminal state
29
+ // \x1b[0m = reset colors
30
+ // \x1b[?25h = show cursor
31
+ // \x1b[?1000l = disable mouse
32
+ process.stdout.write('\x1b[0m\x1b[?25h\x1b[?1000l');
33
+ process.stderr.write('\x1b[0m\x1b[?25h\x1b[?1000l');
34
+ logger.debug('Terminal restored');
35
+ }
36
+ catch (error) {
37
+ // Ignore restore errors - we're exiting anyway
38
+ }
39
+ }
40
+ /**
41
+ * Attach exit handlers
42
+ */
43
+ function attachRestoreHandlers() {
44
+ if (restoreHandlersAttached) {
45
+ return;
46
+ }
47
+ restoreHandlersAttached = true;
48
+ // SIGINT (Ctrl+C)
49
+ process.on('SIGINT', () => {
50
+ restoreTerminal();
51
+ process.exit(0);
52
+ });
53
+ // SIGTERM
54
+ process.on('SIGTERM', () => {
55
+ restoreTerminal();
56
+ process.exit(0);
57
+ });
58
+ // Uncaught exception
59
+ process.on('uncaughtException', (error) => {
60
+ logger.error(`Uncaught exception: ${error.message}`);
61
+ restoreTerminal();
62
+ process.exit(1);
63
+ });
64
+ // Unhandled rejection
65
+ process.on('unhandledRejection', (reason) => {
66
+ logger.error(`Unhandled rejection: ${reason}`);
67
+ restoreTerminal();
68
+ process.exit(1);
69
+ });
70
+ logger.debug('Terminal restore handlers attached');
71
+ }
72
+ /**
73
+ * Unregister screen (cleanup)
74
+ */
75
+ export function unregisterScreen() {
76
+ screen = null;
77
+ }
78
+ //# sourceMappingURL=terminalRestore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalRestore.js","sourceRoot":"","sources":["../../src/tui_mk1/terminalRestore.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,IAAI,MAAM,GAA0B,IAAI,CAAC;AACzC,IAAI,uBAAuB,GAAG,KAAK,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,CAAiB;IAC9C,MAAM,GAAG,CAAC,CAAC;IAEX,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,qBAAqB,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,8BAA8B;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wBAAwB;YAC1B,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,yBAAyB;QACzB,0BAA0B;QAC1B,8BAA8B;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB;IAC5B,IAAI,uBAAuB,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,uBAAuB,GAAG,IAAI,CAAC;IAE/B,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,MAAM,CAAC,KAAK,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;QAC/C,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getViewport.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/viewport/getViewport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAsCF;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAwFjD"}
1
+ {"version":3,"file":"getViewport.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/viewport/getViewport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAsCF;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAyFjD"}
@@ -82,12 +82,13 @@ export function getViewport(screen) {
82
82
  // Get TTY dimensions (may differ from screen dimensions in browser terminals)
83
83
  const ttyCols = process.stdout.columns || cols;
84
84
  const ttyRows = process.stdout.rows || rows;
85
- // CRITICAL: Use blessed's screen dimensions as the authoritative source
86
- // Don't use Math.min() - blessed knows the real screen size
87
- // The screen dimensions from blessed are what matter for layout
88
- const effectiveCols = cols; // Use blessed's screen width directly
89
- const effectiveRows = rows; // Use blessed's screen height directly
90
- // Compute safe dimensions by applying margins to blessed's actual dimensions
85
+ // CRITICAL: Use the SMALLER of blessed's screen vs stdout dimensions
86
+ // In browser terminals, blessed might report width that includes scrollbar area,
87
+ // but stdout.columns is closer to the actual visible width
88
+ // Using Math.min() ensures we don't exceed the visible area
89
+ const effectiveCols = Math.min(cols, ttyCols);
90
+ const effectiveRows = Math.min(rows, ttyRows);
91
+ // Compute safe dimensions by applying margins to the effective (visible) dimensions
91
92
  let safeCols = effectiveCols - marginRight;
92
93
  let safeRows = effectiveRows - marginBottom;
93
94
  // Clamp minimums (fail into narrow mode if too small)
@@ -1 +1 @@
1
- {"version":3,"file":"getViewport.js","sourceRoot":"","sources":["../../../../src/ui/v5/viewport/getViewport.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAW;IACxC,cAAc;IACd,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iFAAiF;IACjF,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACpF,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YACf,uDAAuD;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IACE,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,EAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAW;IACrC,+DAA+D;IAC/D,oDAAoD;IACpD,MAAM,OAAO,GAAI,MAAc,EAAE,OAAO,CAAC;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,IAAY,CAAC;IAEjB,uFAAuF;IACvF,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACpE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IACD,gDAAgD;SAC3C,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;QACxH,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;QACpB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,yDAAyD;SACpD,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9F,IAAI,GAAI,MAAc,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAI,MAAc,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,qFAAqF;SAChF,CAAC;QACJ,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,0BAA0B;IAC1B,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAExD,oBAAoB;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,iBAAiB,EAAE,CAAC;QACtB,mEAAmE;QACnE,mEAAmE;QACnE,WAAW,GAAG,EAAE,CAAC,CAAC,gEAAgE;QAClF,YAAY,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACvC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC5D,CAAC;IAED,8EAA8E;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAE5C,wEAAwE;IACxE,4DAA4D;IAC5D,gEAAgE;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,sCAAsC;IAClE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,uCAAuC;IAEnE,6EAA6E;IAC7E,IAAI,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC;IAC3C,IAAI,QAAQ,GAAG,aAAa,GAAG,YAAY,CAAC;IAE5C,sDAAsD;IACtD,MAAM,aAAa,GAAG,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,EAAE,CAAC;IAEzB,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;QAC7B,QAAQ,GAAG,aAAa,CAAC;IAC3B,CAAC;IACD,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;QAC7B,QAAQ,GAAG,aAAa,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,OAAO;QACP,OAAO;QACP,aAAa;QACb,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getViewport.js","sourceRoot":"","sources":["../../../../src/ui/v5/viewport/getViewport.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.71",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "description": "4Runr AI Agent OS - Interactive terminal for managing AI agents",
6
6
  "main": "dist/index.js",
@@ -9,11 +9,6 @@
9
9
  "4runr-os": "dist/index.js",
10
10
  "4r": "dist/index.js"
11
11
  },
12
- "scripts": {
13
- "build": "tsc",
14
- "dev": "tsc --watch",
15
- "prepublishOnly": "npm run build"
16
- },
17
12
  "keywords": [
18
13
  "4runr",
19
14
  "ai",
@@ -31,7 +26,8 @@
31
26
  },
32
27
  "devDependencies": {
33
28
  "@types/node": "^20.8.0",
34
- "typescript": "^5.2.2"
29
+ "typescript": "^5.2.2",
30
+ "cross-env": "^7.0.3"
35
31
  },
36
32
  "files": [
37
33
  "dist/**/*",
@@ -42,5 +38,10 @@
42
38
  },
43
39
  "publishConfig": {
44
40
  "access": "public"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "dev": "tsc --watch",
45
+ "tui:mk1": "cross-env TUI_MK1=1 TUI_DEBUG=1 TERM=xterm-256color node dist/index.js"
45
46
  }
46
- }
47
+ }
@@ -1,49 +0,0 @@
1
- /**
2
- * Operations Feed Model (Phase 3)
3
- *
4
- * Feed store that subscribes to EventBus.
5
- * All events flow through EventBus → feedStore.
6
- */
7
- import type { Event } from '../core/event.js';
8
- /**
9
- * Feed store (singleton)
10
- * Subscribes to EventBus on initialization
11
- */
12
- declare class FeedStore {
13
- private events;
14
- private maxEvents;
15
- private unsubscribe;
16
- constructor();
17
- /**
18
- * Add event to feed (called by EventBus subscription)
19
- */
20
- private append;
21
- /**
22
- * Clear all events
23
- * Does not break subscription - feed continues receiving new events
24
- */
25
- clear(): void;
26
- /**
27
- * Get all events
28
- */
29
- getAll(): Event[];
30
- /**
31
- * Get latest N events
32
- */
33
- getLast(count: number): Event[];
34
- /**
35
- * Get event count
36
- */
37
- getCount(): number;
38
- /**
39
- * Cleanup (unsubscribe from EventBus)
40
- */
41
- destroy(): void;
42
- }
43
- export declare const feedStore: FeedStore;
44
- /**
45
- * Format timestamp (number) to HH:MM:SS
46
- */
47
- export declare function formatTimestamp(ts: number): string;
48
- export {};
49
- //# sourceMappingURL=feedModel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedModel.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/state/feedModel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;GAGG;AACH,cAAM,SAAS;IACb,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAA6B;;IAShD;;OAEG;IACH,OAAO,CAAC,MAAM;IASd;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,KAAK,EAAE;IAIjB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;IAI/B;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUlD"}
@@ -1,84 +0,0 @@
1
- /**
2
- * Operations Feed Model (Phase 3)
3
- *
4
- * Feed store that subscribes to EventBus.
5
- * All events flow through EventBus → feedStore.
6
- */
7
- import { eventBus } from '../core/eventBus.js';
8
- /**
9
- * Feed store (singleton)
10
- * Subscribes to EventBus on initialization
11
- */
12
- class FeedStore {
13
- events = [];
14
- maxEvents = 1000; // Keep last 1000 events in memory
15
- unsubscribe = null;
16
- constructor() {
17
- // Subscribe to EventBus on initialization
18
- this.unsubscribe = eventBus.subscribe((event) => {
19
- this.append(event);
20
- });
21
- }
22
- /**
23
- * Add event to feed (called by EventBus subscription)
24
- */
25
- append(event) {
26
- this.events.push(event);
27
- // Trim if too many events
28
- if (this.events.length > this.maxEvents) {
29
- this.events = this.events.slice(-this.maxEvents);
30
- }
31
- }
32
- /**
33
- * Clear all events
34
- * Does not break subscription - feed continues receiving new events
35
- */
36
- clear() {
37
- this.events = [];
38
- }
39
- /**
40
- * Get all events
41
- */
42
- getAll() {
43
- return [...this.events];
44
- }
45
- /**
46
- * Get latest N events
47
- */
48
- getLast(count) {
49
- return this.events.slice(-count);
50
- }
51
- /**
52
- * Get event count
53
- */
54
- getCount() {
55
- return this.events.length;
56
- }
57
- /**
58
- * Cleanup (unsubscribe from EventBus)
59
- */
60
- destroy() {
61
- if (this.unsubscribe) {
62
- this.unsubscribe();
63
- this.unsubscribe = null;
64
- }
65
- }
66
- }
67
- // Singleton instance (subscribes to EventBus on creation)
68
- export const feedStore = new FeedStore();
69
- /**
70
- * Format timestamp (number) to HH:MM:SS
71
- */
72
- export function formatTimestamp(ts) {
73
- try {
74
- const date = new Date(ts);
75
- const hours = date.getHours().toString().padStart(2, '0');
76
- const minutes = date.getMinutes().toString().padStart(2, '0');
77
- const seconds = date.getSeconds().toString().padStart(2, '0');
78
- return `${hours}:${minutes}:${seconds}`;
79
- }
80
- catch {
81
- return '00:00:00';
82
- }
83
- }
84
- //# sourceMappingURL=feedModel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedModel.js","sourceRoot":"","sources":["../../../../src/ui/v3/state/feedModel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;GAGG;AACH,MAAM,SAAS;IACL,MAAM,GAAY,EAAE,CAAC;IACrB,SAAS,GAAG,IAAI,CAAC,CAAC,kCAAkC;IACpD,WAAW,GAAwB,IAAI,CAAC;IAEhD;QACE,0CAA0C;QAC1C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAY,EAAE,EAAE;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAY;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,OAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Smoke Test for V1 Adapters
3
- *
4
- * Proves adapters work without TUI
5
- * - No neo-blessed imports
6
- * - No stdout spam
7
- * - Returns structured { ok, ... } responses
8
- *
9
- * Run: npm test (or node dist/ui/v3/v1Adapters/__tests__/smoke.test.js)
10
- */
11
- /**
12
- * Main smoke test
13
- */
14
- declare function runSmokeTest(): Promise<void>;
15
- export { runSmokeTest };
16
- //# sourceMappingURL=smoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.d.ts","sourceRoot":"","sources":["../../../../../src/ui/v3/v1Adapters/__tests__/smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgHH;;GAEG;AACH,iBAAe,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B3C;AAUD,OAAO,EAAE,YAAY,EAAE,CAAC"}