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.
- package/dist/index.js +47 -38
- package/dist/index.js.map +1 -1
- package/dist/tui_mk1/kernel.d.ts +32 -0
- package/dist/tui_mk1/kernel.d.ts.map +1 -0
- package/dist/tui_mk1/kernel.js +115 -0
- package/dist/tui_mk1/kernel.js.map +1 -0
- package/dist/tui_mk1/logger.d.ts +11 -0
- package/dist/tui_mk1/logger.d.ts.map +1 -0
- package/dist/tui_mk1/logger.js +86 -0
- package/dist/tui_mk1/logger.js.map +1 -0
- package/dist/tui_mk1/mk1App.d.ts +45 -0
- package/dist/tui_mk1/mk1App.d.ts.map +1 -0
- package/dist/tui_mk1/mk1App.js +283 -0
- package/dist/tui_mk1/mk1App.js.map +1 -0
- package/dist/tui_mk1/resizeController.d.ts +39 -0
- package/dist/tui_mk1/resizeController.d.ts.map +1 -0
- package/dist/tui_mk1/resizeController.js +108 -0
- package/dist/tui_mk1/resizeController.js.map +1 -0
- package/dist/tui_mk1/stdoutGuard.d.ts +15 -0
- package/dist/tui_mk1/stdoutGuard.d.ts.map +1 -0
- package/dist/tui_mk1/stdoutGuard.js +66 -0
- package/dist/tui_mk1/stdoutGuard.js.map +1 -0
- package/dist/tui_mk1/terminalRestore.d.ts +22 -0
- package/dist/tui_mk1/terminalRestore.d.ts.map +1 -0
- package/dist/tui_mk1/terminalRestore.js +78 -0
- package/dist/tui_mk1/terminalRestore.js.map +1 -0
- package/dist/ui/v5/viewport/getViewport.d.ts.map +1 -1
- package/dist/ui/v5/viewport/getViewport.js +7 -6
- package/dist/ui/v5/viewport/getViewport.js.map +1 -1
- package/package.json +9 -8
- package/dist/ui/v3/state/feedModel.d.ts +0 -49
- package/dist/ui/v3/state/feedModel.d.ts.map +0 -1
- package/dist/ui/v3/state/feedModel.js +0 -84
- package/dist/ui/v3/state/feedModel.js.map +0 -1
- package/dist/ui/v3/v1Adapters/__tests__/smoke.test.d.ts +0 -16
- package/dist/ui/v3/v1Adapters/__tests__/smoke.test.d.ts.map +0 -1
- package/dist/ui/v3/v1Adapters/__tests__/smoke.test.js +0 -141
- 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,
|
|
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
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
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":"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
|
|
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
|
|
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"}
|