4runr-os 2.1.7 → 2.1.8
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/tui_mk2/debug/overlay.d.ts +14 -0
- package/dist/tui_mk2/debug/overlay.d.ts.map +1 -0
- package/dist/tui_mk2/debug/overlay.js +38 -0
- package/dist/tui_mk2/debug/overlay.js.map +1 -0
- package/dist/tui_mk2/layout/applyLayout.d.ts +17 -0
- package/dist/tui_mk2/layout/applyLayout.d.ts.map +1 -0
- package/dist/tui_mk2/layout/applyLayout.js +48 -0
- package/dist/tui_mk2/layout/applyLayout.js.map +1 -0
- package/dist/tui_mk2/layout/computeLayout.d.ts +51 -0
- package/dist/tui_mk2/layout/computeLayout.d.ts.map +1 -0
- package/dist/tui_mk2/layout/computeLayout.js +130 -0
- package/dist/tui_mk2/layout/computeLayout.js.map +1 -0
- package/dist/tui_mk2/layout/invariants.d.ts +21 -0
- package/dist/tui_mk2/layout/invariants.d.ts.map +1 -0
- package/dist/tui_mk2/layout/invariants.js +34 -0
- package/dist/tui_mk2/layout/invariants.js.map +1 -0
- package/dist/tui_mk2/mk2App.d.ts +16 -6
- package/dist/tui_mk2/mk2App.d.ts.map +1 -1
- package/dist/tui_mk2/mk2App.js +97 -63
- package/dist/tui_mk2/mk2App.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Debug Overlay
|
|
3
|
+
*
|
|
4
|
+
* Top line only, never exceeds safeW
|
|
5
|
+
* Shows layout info for verification
|
|
6
|
+
*/
|
|
7
|
+
import { type Widgets } from 'neo-blessed';
|
|
8
|
+
import type { LayoutSpec } from '../layout/computeLayout.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create debug overlay line (top of screen)
|
|
11
|
+
* Truncated to safeW to prevent overflow
|
|
12
|
+
*/
|
|
13
|
+
export declare function createDebugOverlay(screen: Widgets.Screen, spec: LayoutSpec): Widgets.Box;
|
|
14
|
+
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/debug/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,GAAG,CA0Bb"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Debug Overlay
|
|
3
|
+
*
|
|
4
|
+
* Top line only, never exceeds safeW
|
|
5
|
+
* Shows layout info for verification
|
|
6
|
+
*/
|
|
7
|
+
import blessed from 'neo-blessed';
|
|
8
|
+
import { safeText } from '../../tui_mk1/ui/safeText.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create debug overlay line (top of screen)
|
|
11
|
+
* Truncated to safeW to prevent overflow
|
|
12
|
+
*/
|
|
13
|
+
export function createDebugOverlay(screen, spec) {
|
|
14
|
+
// Build debug text
|
|
15
|
+
const debugText = [
|
|
16
|
+
`MK2`,
|
|
17
|
+
`canvas=${spec.cols}x${spec.rows}`,
|
|
18
|
+
`safe=${spec.safeW}x${spec.safeH}`,
|
|
19
|
+
`left=${spec.leftW} center=${spec.centerW} right=${spec.rightW}`,
|
|
20
|
+
`rightEdge=${spec.rightX + spec.rightW}`,
|
|
21
|
+
].join(' ');
|
|
22
|
+
// Truncate to safeW (never exceed)
|
|
23
|
+
const safeTextContent = safeText(debugText, spec.safeW);
|
|
24
|
+
return blessed.box({
|
|
25
|
+
parent: screen,
|
|
26
|
+
top: 0,
|
|
27
|
+
left: 0,
|
|
28
|
+
width: spec.safeW,
|
|
29
|
+
height: 1,
|
|
30
|
+
content: safeTextContent,
|
|
31
|
+
tags: false,
|
|
32
|
+
style: {
|
|
33
|
+
fg: 'yellow',
|
|
34
|
+
bg: 'black',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../src/tui_mk2/debug/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,OAAyB,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAsB,EACtB,IAAgB;IAEhB,mBAAmB;IACnB,MAAM,SAAS,GAAG;QAChB,KAAK;QACL,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;QAClC,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;QAClC,QAAQ,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE;QAChE,aAAa,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;KACzC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,mCAAmC;IACnC,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE;YACL,EAAE,EAAE,QAAQ;YACZ,EAAE,EAAE,OAAO;SACZ;KACK,CAAgB,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Box Renderer - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* Creates blessed boxes from layout spec
|
|
5
|
+
* No widget manager, no visibility hacks
|
|
6
|
+
*/
|
|
7
|
+
import { type Widgets } from 'neo-blessed';
|
|
8
|
+
import type { LayoutSpec, LayoutRect } from './computeLayout.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a blessed box with hard invariant checks
|
|
11
|
+
*/
|
|
12
|
+
export declare function mkBox(screen: Widgets.Screen, rect: LayoutRect, label: string, safeW: number, safeH: number): Widgets.Box;
|
|
13
|
+
/**
|
|
14
|
+
* Apply layout - create all boxes from spec
|
|
15
|
+
*/
|
|
16
|
+
export declare function applyLayout(screen: Widgets.Screen, spec: LayoutSpec): Widgets.Box[];
|
|
17
|
+
//# sourceMappingURL=applyLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyLayout.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/layout/applyLayout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGjE;;GAEG;AACH,wBAAgB,KAAK,CACnB,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,GAAG,CAkBb;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAmBnF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Box Renderer - Single Source of Truth
|
|
3
|
+
*
|
|
4
|
+
* Creates blessed boxes from layout spec
|
|
5
|
+
* No widget manager, no visibility hacks
|
|
6
|
+
*/
|
|
7
|
+
import blessed from 'neo-blessed';
|
|
8
|
+
import { assertBoxFits } from './invariants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a blessed box with hard invariant checks
|
|
11
|
+
*/
|
|
12
|
+
export function mkBox(screen, rect, label, safeW, safeH) {
|
|
13
|
+
// Hard invariant check - crash early if math is wrong
|
|
14
|
+
assertBoxFits(rect, safeW, safeH);
|
|
15
|
+
return blessed.box({
|
|
16
|
+
parent: screen,
|
|
17
|
+
top: rect.y,
|
|
18
|
+
left: rect.x,
|
|
19
|
+
width: rect.w,
|
|
20
|
+
height: rect.h,
|
|
21
|
+
border: { type: 'line' },
|
|
22
|
+
label: ` ${label} `,
|
|
23
|
+
tags: false,
|
|
24
|
+
style: {
|
|
25
|
+
fg: 'cyan',
|
|
26
|
+
border: { fg: 'cyan' },
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Apply layout - create all boxes from spec
|
|
32
|
+
*/
|
|
33
|
+
export function applyLayout(screen, spec) {
|
|
34
|
+
const boxes = [];
|
|
35
|
+
// Left column
|
|
36
|
+
boxes.push(mkBox(screen, spec.rects.posture, 'POSTURE', spec.safeW, spec.safeH));
|
|
37
|
+
boxes.push(mkBox(screen, spec.rects.resources, 'RESOURCES', spec.safeW, spec.safeH));
|
|
38
|
+
boxes.push(mkBox(screen, spec.rects.assets, 'ASSETS', spec.safeW, spec.safeH));
|
|
39
|
+
// Center column
|
|
40
|
+
boxes.push(mkBox(screen, spec.rects.operations, 'OPERATIONS', spec.safeW, spec.safeH));
|
|
41
|
+
// Right column
|
|
42
|
+
boxes.push(mkBox(screen, spec.rects.network, 'NETWORK', spec.safeW, spec.safeH));
|
|
43
|
+
boxes.push(mkBox(screen, spec.rects.capabilities, 'CAPABILITIES', spec.safeW, spec.safeH));
|
|
44
|
+
// Bottom command bar
|
|
45
|
+
boxes.push(mkBox(screen, spec.rects.command, 'COMMAND', spec.safeW, spec.safeH));
|
|
46
|
+
return boxes;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=applyLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyLayout.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/applyLayout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,OAAyB,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,MAAsB,EACtB,IAAgB,EAChB,KAAa,EACb,KAAa,EACb,KAAa;IAEb,sDAAsD;IACtD,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,IAAI,CAAC,CAAC;QACX,IAAI,EAAE,IAAI,CAAC,CAAC;QACZ,KAAK,EAAE,IAAI,CAAC,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,CAAC;QACd,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACxB,KAAK,EAAE,IAAI,KAAK,GAAG;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE;YACL,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;SACvB;KACK,CAAgB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAsB,EAAE,IAAgB;IAClE,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/E,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvF,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3F,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Layout Spec - Hard Numbers + Clamps
|
|
3
|
+
*
|
|
4
|
+
* All layout computed from safe canvas + invariants
|
|
5
|
+
* No percentages until stable - use clamped fixed numbers
|
|
6
|
+
*/
|
|
7
|
+
export declare const RIGHT_GUARD = 2;
|
|
8
|
+
export declare const BOTTOM_GUARD = 2;
|
|
9
|
+
export declare const GUTTER = 1;
|
|
10
|
+
export declare const PAD = 0;
|
|
11
|
+
export interface LayoutRect {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
w: number;
|
|
15
|
+
h: number;
|
|
16
|
+
}
|
|
17
|
+
export interface LayoutSpec {
|
|
18
|
+
safeW: number;
|
|
19
|
+
safeH: number;
|
|
20
|
+
cols: number;
|
|
21
|
+
rows: number;
|
|
22
|
+
leftW: number;
|
|
23
|
+
centerW: number;
|
|
24
|
+
rightW: number;
|
|
25
|
+
leftX: number;
|
|
26
|
+
centerX: number;
|
|
27
|
+
rightX: number;
|
|
28
|
+
cmdH: number;
|
|
29
|
+
usableH: number;
|
|
30
|
+
rects: {
|
|
31
|
+
posture: LayoutRect;
|
|
32
|
+
resources: LayoutRect;
|
|
33
|
+
assets: LayoutRect;
|
|
34
|
+
operations: LayoutRect;
|
|
35
|
+
network: LayoutRect;
|
|
36
|
+
capabilities: LayoutRect;
|
|
37
|
+
command: LayoutRect;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute safe canvas dimensions
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSafeCanvas(cols: number, rows: number): {
|
|
44
|
+
safeW: number;
|
|
45
|
+
safeH: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Compute layout spec from screen dimensions
|
|
49
|
+
*/
|
|
50
|
+
export declare function computeLayout(cols: number, rows: number): LayoutSpec;
|
|
51
|
+
//# sourceMappingURL=computeLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeLayout.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,GAAG,IAAI,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,OAAO,EAAE,UAAU,CAAC;QACpB,SAAS,EAAE,UAAU,CAAC;QACtB,MAAM,EAAE,UAAU,CAAC;QACnB,UAAU,EAAE,UAAU,CAAC;QACvB,OAAO,EAAE,UAAU,CAAC;QACpB,YAAY,EAAE,UAAU,CAAC;QACzB,OAAO,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAI1F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAwHpE"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Layout Spec - Hard Numbers + Clamps
|
|
3
|
+
*
|
|
4
|
+
* All layout computed from safe canvas + invariants
|
|
5
|
+
* No percentages until stable - use clamped fixed numbers
|
|
6
|
+
*/
|
|
7
|
+
import { clamp } from './invariants.js';
|
|
8
|
+
// Constants (do not change unless proven)
|
|
9
|
+
export const RIGHT_GUARD = 2; // reserve last col + 1 extra
|
|
10
|
+
export const BOTTOM_GUARD = 2; // reserve last row + 1 extra
|
|
11
|
+
export const GUTTER = 1;
|
|
12
|
+
export const PAD = 0; // keep 0 for now; padding causes drift
|
|
13
|
+
/**
|
|
14
|
+
* Compute safe canvas dimensions
|
|
15
|
+
*/
|
|
16
|
+
export function getSafeCanvas(cols, rows) {
|
|
17
|
+
const safeW = Math.max(0, cols - RIGHT_GUARD);
|
|
18
|
+
const safeH = Math.max(0, rows - BOTTOM_GUARD);
|
|
19
|
+
return { safeW, safeH };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compute layout spec from screen dimensions
|
|
23
|
+
*/
|
|
24
|
+
export function computeLayout(cols, rows) {
|
|
25
|
+
// Safe canvas
|
|
26
|
+
const { safeW, safeH } = getSafeCanvas(cols, rows);
|
|
27
|
+
// Minimum terminal size check
|
|
28
|
+
const MIN_COLS = 120;
|
|
29
|
+
const MIN_ROWS = 35;
|
|
30
|
+
if (cols < MIN_COLS || rows < MIN_ROWS) {
|
|
31
|
+
throw new Error(`Terminal too small: ${cols}x${rows} (minimum ${MIN_COLS}x${MIN_ROWS})`);
|
|
32
|
+
}
|
|
33
|
+
// Column widths (clamped)
|
|
34
|
+
let leftW = clamp(Math.floor(safeW * 0.18), 26, 34);
|
|
35
|
+
let rightW = clamp(Math.floor(safeW * 0.20), 26, 36);
|
|
36
|
+
let centerW = safeW - leftW - rightW - (GUTTER * 2);
|
|
37
|
+
// If center too small, shrink side columns
|
|
38
|
+
if (centerW < 40) {
|
|
39
|
+
const deficit = 40 - centerW;
|
|
40
|
+
const shrinkLeft = Math.min(deficit, leftW - 22);
|
|
41
|
+
leftW -= shrinkLeft;
|
|
42
|
+
const shrinkRight = Math.min(deficit - shrinkLeft, rightW - 22);
|
|
43
|
+
rightW -= shrinkRight;
|
|
44
|
+
centerW = safeW - leftW - rightW - (GUTTER * 2);
|
|
45
|
+
}
|
|
46
|
+
// X positions
|
|
47
|
+
const leftX = 0;
|
|
48
|
+
const centerX = leftW + GUTTER;
|
|
49
|
+
const rightX = leftW + GUTTER + centerW + GUTTER;
|
|
50
|
+
// Bottom command bar height
|
|
51
|
+
const cmdH = 3; // 1 border top + 1 input row + 1 bottom spacing
|
|
52
|
+
// Usable height (above command bar)
|
|
53
|
+
const usableH = safeH - cmdH - GUTTER; // leave gutter above command
|
|
54
|
+
// Vertical layout heights
|
|
55
|
+
// Left stack: posture=9, resources=12, assets=remaining
|
|
56
|
+
const postureH = 9;
|
|
57
|
+
const resourcesH = 12;
|
|
58
|
+
const assetsH = Math.max(6, usableH - postureH - resourcesH - (GUTTER * 2));
|
|
59
|
+
// Right stack: network=12, capabilities=remaining
|
|
60
|
+
const networkH = 12;
|
|
61
|
+
const capabilitiesH = Math.max(6, usableH - networkH - GUTTER);
|
|
62
|
+
// Center: operations takes full usable height
|
|
63
|
+
const operationsH = Math.max(6, usableH);
|
|
64
|
+
// Y positions
|
|
65
|
+
const leftY = 1; // Start after debug overlay line
|
|
66
|
+
const centerY = 1;
|
|
67
|
+
const rightY = 1;
|
|
68
|
+
const cmdY = safeH - cmdH;
|
|
69
|
+
// Build rects
|
|
70
|
+
const rects = {
|
|
71
|
+
posture: {
|
|
72
|
+
x: leftX,
|
|
73
|
+
y: leftY,
|
|
74
|
+
w: leftW,
|
|
75
|
+
h: postureH,
|
|
76
|
+
},
|
|
77
|
+
resources: {
|
|
78
|
+
x: leftX,
|
|
79
|
+
y: leftY + postureH + GUTTER,
|
|
80
|
+
w: leftW,
|
|
81
|
+
h: resourcesH,
|
|
82
|
+
},
|
|
83
|
+
assets: {
|
|
84
|
+
x: leftX,
|
|
85
|
+
y: leftY + postureH + GUTTER + resourcesH + GUTTER,
|
|
86
|
+
w: leftW,
|
|
87
|
+
h: assetsH,
|
|
88
|
+
},
|
|
89
|
+
operations: {
|
|
90
|
+
x: centerX,
|
|
91
|
+
y: centerY,
|
|
92
|
+
w: centerW,
|
|
93
|
+
h: operationsH,
|
|
94
|
+
},
|
|
95
|
+
network: {
|
|
96
|
+
x: rightX,
|
|
97
|
+
y: rightY,
|
|
98
|
+
w: rightW,
|
|
99
|
+
h: networkH,
|
|
100
|
+
},
|
|
101
|
+
capabilities: {
|
|
102
|
+
x: rightX,
|
|
103
|
+
y: rightY + networkH + GUTTER,
|
|
104
|
+
w: rightW,
|
|
105
|
+
h: capabilitiesH,
|
|
106
|
+
},
|
|
107
|
+
command: {
|
|
108
|
+
x: 0,
|
|
109
|
+
y: cmdY,
|
|
110
|
+
w: safeW,
|
|
111
|
+
h: cmdH,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
safeW,
|
|
116
|
+
safeH,
|
|
117
|
+
cols,
|
|
118
|
+
rows,
|
|
119
|
+
leftW,
|
|
120
|
+
centerW,
|
|
121
|
+
rightW,
|
|
122
|
+
leftX,
|
|
123
|
+
centerX,
|
|
124
|
+
rightX,
|
|
125
|
+
cmdH,
|
|
126
|
+
usableH,
|
|
127
|
+
rects,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=computeLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeLayout.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Hard Invariant Checks
|
|
3
|
+
*
|
|
4
|
+
* Crash early if layout math is wrong - don't hack around it.
|
|
5
|
+
*/
|
|
6
|
+
export interface Box {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
w: number;
|
|
10
|
+
h: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Assert that a box fits within safe canvas bounds
|
|
14
|
+
* Throws error if box exceeds bounds - this helps catch math errors early
|
|
15
|
+
*/
|
|
16
|
+
export declare function assertBoxFits(box: Box, safeW: number, safeH: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Clamp a value between min and max
|
|
19
|
+
*/
|
|
20
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
21
|
+
//# sourceMappingURL=invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/layout/invariants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA6B1E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MK2 Phase 1B: Hard Invariant Checks
|
|
3
|
+
*
|
|
4
|
+
* Crash early if layout math is wrong - don't hack around it.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Assert that a box fits within safe canvas bounds
|
|
8
|
+
* Throws error if box exceeds bounds - this helps catch math errors early
|
|
9
|
+
*/
|
|
10
|
+
export function assertBoxFits(box, safeW, safeH) {
|
|
11
|
+
if (box.x < 0 || box.y < 0) {
|
|
12
|
+
throw new Error(`Box negative position: x=${box.x} y=${box.y} (must be >= 0)`);
|
|
13
|
+
}
|
|
14
|
+
if (box.w <= 0 || box.h <= 0) {
|
|
15
|
+
throw new Error(`Box non-positive size: w=${box.w} h=${box.h} (must be > 0)`);
|
|
16
|
+
}
|
|
17
|
+
const maxX = box.x + box.w;
|
|
18
|
+
const maxY = box.y + box.h;
|
|
19
|
+
if (maxX > safeW) {
|
|
20
|
+
throw new Error(`Box overflow X: maxX=${maxX} > safeW=${safeW} ` +
|
|
21
|
+
`(box: x=${box.x} w=${box.w} overflow=${maxX - safeW})`);
|
|
22
|
+
}
|
|
23
|
+
if (maxY > safeH) {
|
|
24
|
+
throw new Error(`Box overflow Y: maxY=${maxY} > safeH=${safeH} ` +
|
|
25
|
+
`(box: y=${box.y} h=${box.h} overflow=${maxY - safeH})`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Clamp a value between min and max
|
|
30
|
+
*/
|
|
31
|
+
export function clamp(value, min, max) {
|
|
32
|
+
return Math.max(min, Math.min(max, value));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/invariants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,KAAa,EAAE,KAAa;IAClE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,iBAAiB,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,gBAAgB,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAE3B,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,YAAY,KAAK,GAAG;YAChD,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,GAAG,KAAK,GAAG,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,YAAY,KAAK,GAAG;YAChD,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,IAAI,GAAG,KAAK,GAAG,CACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/tui_mk2/mk2App.d.ts
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MK2 App - Main application entry point
|
|
3
3
|
*
|
|
4
|
-
* MK2 Phase
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
4
|
+
* MK2 Phase 1B: Frame Lock + Placeholder Boxes
|
|
5
|
+
* - 6 placeholder sections + bottom command bar
|
|
6
|
+
* - Hard invariants, no scrollbars
|
|
7
|
+
* - Stable across resize
|
|
8
8
|
*/
|
|
9
9
|
export declare class MK2App {
|
|
10
10
|
private kernel;
|
|
11
|
+
private boxes;
|
|
12
|
+
private debugOverlay;
|
|
11
13
|
constructor();
|
|
12
14
|
/**
|
|
13
15
|
* Start MK2 App
|
|
14
16
|
*/
|
|
15
17
|
start(): Promise<void>;
|
|
16
18
|
/**
|
|
17
|
-
* Render
|
|
19
|
+
* Render layout - Phase 1B: Frame Lock + Placeholder Boxes
|
|
18
20
|
*/
|
|
19
21
|
private render;
|
|
20
22
|
/**
|
|
21
|
-
* Handle resize
|
|
23
|
+
* Handle resize - Phase 1B: Hard rebuild
|
|
22
24
|
*/
|
|
23
25
|
private handleResize;
|
|
26
|
+
/**
|
|
27
|
+
* Destroy all children (kill old boxes on resize)
|
|
28
|
+
*/
|
|
29
|
+
private destroyAll;
|
|
30
|
+
/**
|
|
31
|
+
* Create error box for terminal too small
|
|
32
|
+
*/
|
|
33
|
+
private createErrorBox;
|
|
24
34
|
/**
|
|
25
35
|
* Stop app
|
|
26
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mk2App.d.ts","sourceRoot":"","sources":["../../src/tui_mk2/mk2App.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"mk2App.d.ts","sourceRoot":"","sources":["../../src/tui_mk2/mk2App.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAA4B;;IAMhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;OAEG;IACH,OAAO,CAAC,MAAM;IAiCd;;OAEG;YACW,YAAY;IAK1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,IAAI,IAAI,IAAI;CAGb;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB9C"}
|
package/dist/tui_mk2/mk2App.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MK2 App - Main application entry point
|
|
3
3
|
*
|
|
4
|
-
* MK2 Phase
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
4
|
+
* MK2 Phase 1B: Frame Lock + Placeholder Boxes
|
|
5
|
+
* - 6 placeholder sections + bottom command bar
|
|
6
|
+
* - Hard invariants, no scrollbars
|
|
7
|
+
* - Stable across resize
|
|
8
8
|
*/
|
|
9
9
|
import { MK2Kernel } from './kernel.js';
|
|
10
|
-
import
|
|
10
|
+
import { computeLayout, getSafeCanvas } from './layout/computeLayout.js';
|
|
11
|
+
import { applyLayout } from './layout/applyLayout.js';
|
|
12
|
+
import { createDebugOverlay } from './debug/overlay.js';
|
|
11
13
|
export class MK2App {
|
|
12
14
|
kernel;
|
|
15
|
+
boxes = [];
|
|
16
|
+
debugOverlay = null;
|
|
13
17
|
constructor() {
|
|
14
18
|
this.kernel = new MK2Kernel();
|
|
15
19
|
}
|
|
@@ -18,87 +22,117 @@ export class MK2App {
|
|
|
18
22
|
*/
|
|
19
23
|
async start() {
|
|
20
24
|
await this.kernel.start(() => {
|
|
21
|
-
// Initial render - will be implemented in Step 3
|
|
22
25
|
this.render();
|
|
23
26
|
}, {
|
|
24
27
|
onRebuild: async (cols, rows) => {
|
|
25
|
-
// Resize handler - will be implemented in Step 7
|
|
26
28
|
await this.handleResize(cols, rows);
|
|
27
29
|
},
|
|
28
30
|
});
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
|
-
* Render
|
|
33
|
+
* Render layout - Phase 1B: Frame Lock + Placeholder Boxes
|
|
32
34
|
*/
|
|
33
35
|
render() {
|
|
34
36
|
const screen = this.kernel.getScreen();
|
|
35
37
|
if (!screen) {
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
// Kill old children - hard rebuild
|
|
41
|
+
this.destroyAll();
|
|
42
|
+
const cols = screen.width || 80;
|
|
43
|
+
const rows = screen.height || 24;
|
|
44
|
+
try {
|
|
45
|
+
// Compute layout
|
|
46
|
+
const spec = computeLayout(cols, rows);
|
|
47
|
+
// Create debug overlay (top line)
|
|
48
|
+
this.debugOverlay = createDebugOverlay(screen, spec);
|
|
49
|
+
// Apply layout - create all boxes
|
|
50
|
+
this.boxes = applyLayout(screen, spec);
|
|
51
|
+
// Render
|
|
52
|
+
screen.render();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Terminal too small - show error box
|
|
56
|
+
const { safeW, safeH } = getSafeCanvas(cols, rows);
|
|
57
|
+
const errorBox = this.createErrorBox(screen, error instanceof Error ? error.message : String(error), safeW, safeH);
|
|
58
|
+
screen.append(errorBox);
|
|
59
|
+
screen.render();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handle resize - Phase 1B: Hard rebuild
|
|
64
|
+
*/
|
|
65
|
+
async handleResize(cols, rows) {
|
|
66
|
+
// Hard rebuild - destroy all, recompute, re-render
|
|
67
|
+
this.render();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Destroy all children (kill old boxes on resize)
|
|
71
|
+
*/
|
|
72
|
+
destroyAll() {
|
|
73
|
+
// Destroy debug overlay
|
|
74
|
+
if (this.debugOverlay) {
|
|
41
75
|
try {
|
|
42
|
-
|
|
76
|
+
if (typeof this.debugOverlay.destroy === 'function') {
|
|
77
|
+
this.debugOverlay.destroy();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Ignore
|
|
82
|
+
}
|
|
83
|
+
this.debugOverlay = null;
|
|
84
|
+
}
|
|
85
|
+
// Destroy all boxes
|
|
86
|
+
this.boxes.forEach((box) => {
|
|
87
|
+
try {
|
|
88
|
+
if (typeof box.destroy === 'function') {
|
|
89
|
+
box.destroy();
|
|
90
|
+
}
|
|
43
91
|
}
|
|
44
92
|
catch {
|
|
45
93
|
// Ignore
|
|
46
94
|
}
|
|
47
95
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
`Terminal: ${cols}x${rows}`,
|
|
65
|
-
].join('\n');
|
|
66
|
-
const placeholder = blessed.box({
|
|
67
|
-
top: 0,
|
|
68
|
-
left: 0,
|
|
69
|
-
width: '100%',
|
|
70
|
-
height: '100%',
|
|
71
|
-
content: content,
|
|
72
|
-
style: {
|
|
73
|
-
fg: 'cyan',
|
|
74
|
-
bg: 'black',
|
|
75
|
-
},
|
|
76
|
-
tags: true,
|
|
77
|
-
});
|
|
78
|
-
// Add a visible watermark box in top-right corner
|
|
79
|
-
const watermarkBox = blessed.box({
|
|
80
|
-
top: 0,
|
|
81
|
-
right: 0,
|
|
82
|
-
width: watermark.length + 4,
|
|
83
|
-
height: 3,
|
|
84
|
-
content: `┌${'─'.repeat(watermark.length + 2)}┐\n│ ${watermark} │\n└${'─'.repeat(watermark.length + 2)}┘`,
|
|
85
|
-
style: {
|
|
86
|
-
fg: 'yellow',
|
|
87
|
-
bg: 'black',
|
|
88
|
-
bold: true,
|
|
89
|
-
},
|
|
90
|
-
tags: true,
|
|
91
|
-
});
|
|
92
|
-
screen.append(placeholder);
|
|
93
|
-
screen.append(watermarkBox);
|
|
94
|
-
// Don't call screen.render() here - kernel handles it
|
|
96
|
+
this.boxes = [];
|
|
97
|
+
// Also clear screen children (safety)
|
|
98
|
+
const screen = this.kernel.getScreen();
|
|
99
|
+
if (screen) {
|
|
100
|
+
const children = screen.children || [];
|
|
101
|
+
children.forEach((child) => {
|
|
102
|
+
try {
|
|
103
|
+
if (typeof child.destroy === 'function') {
|
|
104
|
+
child.destroy();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Ignore
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
95
112
|
}
|
|
96
113
|
/**
|
|
97
|
-
*
|
|
114
|
+
* Create error box for terminal too small
|
|
98
115
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
116
|
+
createErrorBox(screen, message, safeW, safeH) {
|
|
117
|
+
const blessed = require('neo-blessed');
|
|
118
|
+
const errorW = Math.min(60, safeW - 4);
|
|
119
|
+
const errorH = 5;
|
|
120
|
+
const errorX = Math.floor((safeW - errorW) / 2);
|
|
121
|
+
const errorY = Math.floor((safeH - errorH) / 2);
|
|
122
|
+
return blessed.box({
|
|
123
|
+
parent: screen,
|
|
124
|
+
top: errorY,
|
|
125
|
+
left: errorX,
|
|
126
|
+
width: errorW,
|
|
127
|
+
height: errorH,
|
|
128
|
+
content: message,
|
|
129
|
+
border: { type: 'line' },
|
|
130
|
+
tags: false,
|
|
131
|
+
style: {
|
|
132
|
+
fg: 'red',
|
|
133
|
+
border: { fg: 'red' },
|
|
134
|
+
},
|
|
135
|
+
});
|
|
102
136
|
}
|
|
103
137
|
/**
|
|
104
138
|
* Stop app
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mk2App.js","sourceRoot":"","sources":["../../src/tui_mk2/mk2App.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mk2App.js","sourceRoot":"","sources":["../../src/tui_mk2/mk2App.ts"],"names":[],"mappings":"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"}
|