4runr-os 2.1.11 → 2.1.13
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 +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tui_mk2/debug/overlay.d.ts +1 -1
- package/dist/tui_mk2/debug/overlay.js +3 -3
- package/dist/tui_mk2/debug/overlay.js.map +1 -1
- package/dist/tui_mk2/layout/applyLayout.d.ts +3 -2
- package/dist/tui_mk2/layout/applyLayout.d.ts.map +1 -1
- package/dist/tui_mk2/layout/applyLayout.js +33 -15
- package/dist/tui_mk2/layout/applyLayout.js.map +1 -1
- package/dist/tui_mk2/layout/computeLayout.d.ts +21 -7
- package/dist/tui_mk2/layout/computeLayout.d.ts.map +1 -1
- package/dist/tui_mk2/layout/computeLayout.js +209 -104
- package/dist/tui_mk2/layout/computeLayout.js.map +1 -1
- package/dist/tui_mk2/layout/invariants.d.ts +2 -2
- package/dist/tui_mk2/layout/invariants.d.ts.map +1 -1
- package/dist/tui_mk2/layout/invariants.js +14 -14
- package/dist/tui_mk2/layout/invariants.js.map +1 -1
- package/dist/tui_mk2/layout/layoutEngine.d.ts +70 -0
- package/dist/tui_mk2/layout/layoutEngine.d.ts.map +1 -0
- package/dist/tui_mk2/layout/layoutEngine.js +297 -0
- package/dist/tui_mk2/layout/layoutEngine.js.map +1 -0
- package/dist/tui_mk2/mk2App.d.ts +14 -6
- package/dist/tui_mk2/mk2App.d.ts.map +1 -1
- package/dist/tui_mk2/mk2App.js +146 -18
- package/dist/tui_mk2/mk2App.js.map +1 -1
- package/package.json +7 -8
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
import blessed from 'neo-blessed';
|
|
8
8
|
import { assertBoxFits } from './invariants.js';
|
|
9
9
|
/**
|
|
10
|
-
* Create a blessed box with hard invariant checks
|
|
10
|
+
* Create a blessed box with hard invariant checks (MK2 Hotfix: Pass topGuard)
|
|
11
11
|
*/
|
|
12
|
-
export function mkBox(screen, rect, label, safeW, safeH) {
|
|
12
|
+
export function mkBox(screen, rect, label, safeW, safeH, topGuard = 0) {
|
|
13
13
|
// Hard invariant check - crash early if math is wrong
|
|
14
|
-
assertBoxFits(rect, safeW, safeH);
|
|
14
|
+
assertBoxFits(rect, safeW, safeH, topGuard);
|
|
15
15
|
return blessed.box({
|
|
16
16
|
parent: screen,
|
|
17
17
|
top: rect.y,
|
|
@@ -19,7 +19,7 @@ export function mkBox(screen, rect, label, safeW, safeH) {
|
|
|
19
19
|
width: rect.w,
|
|
20
20
|
height: rect.h,
|
|
21
21
|
border: { type: 'line' },
|
|
22
|
-
label: ` ${label} `,
|
|
22
|
+
label: ` ${label} `, // MK2 Hotfix: Keep labels short
|
|
23
23
|
tags: false,
|
|
24
24
|
style: {
|
|
25
25
|
fg: 'cyan',
|
|
@@ -29,20 +29,38 @@ export function mkBox(screen, rect, label, safeW, safeH) {
|
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Apply layout - create all boxes from spec
|
|
32
|
+
* Handles wide (3-column), compact (2-column), and narrow (1-column) modes
|
|
32
33
|
*/
|
|
33
34
|
export function applyLayout(screen, spec) {
|
|
34
35
|
const boxes = [];
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
if (spec.mode === 'wide') {
|
|
37
|
+
// Wide: 3 columns (left: posture/resources/assets, center: operations, right: network/capabilities)
|
|
38
|
+
boxes.push(mkBox(screen, spec.rects.posture, 'POSTURE', spec.safeW, spec.safeH, spec.topGuard));
|
|
39
|
+
boxes.push(mkBox(screen, spec.rects.resources, 'RESOURCES', spec.safeW, spec.safeH, spec.topGuard));
|
|
40
|
+
boxes.push(mkBox(screen, spec.rects.assets, 'ASSETS', spec.safeW, spec.safeH, spec.topGuard));
|
|
41
|
+
boxes.push(mkBox(screen, spec.rects.operations, 'OPERATIONS', spec.safeW, spec.safeH, spec.topGuard));
|
|
42
|
+
boxes.push(mkBox(screen, spec.rects.network, 'NETWORK', spec.safeW, spec.safeH, spec.topGuard));
|
|
43
|
+
boxes.push(mkBox(screen, spec.rects.capabilities, 'CAPABILITIES', spec.safeW, spec.safeH, spec.topGuard));
|
|
44
|
+
}
|
|
45
|
+
else if (spec.mode === 'compact') {
|
|
46
|
+
// Compact: 2 columns (left: posture/resources/assets, right: operations/network/capabilities)
|
|
47
|
+
boxes.push(mkBox(screen, spec.rects.posture, 'POSTURE', spec.safeW, spec.safeH, spec.topGuard));
|
|
48
|
+
boxes.push(mkBox(screen, spec.rects.resources, 'RESOURCES', spec.safeW, spec.safeH, spec.topGuard));
|
|
49
|
+
boxes.push(mkBox(screen, spec.rects.assets, 'ASSETS', spec.safeW, spec.safeH, spec.topGuard));
|
|
50
|
+
boxes.push(mkBox(screen, spec.rects.operations, 'OPERATIONS', spec.safeW, spec.safeH, spec.topGuard));
|
|
51
|
+
boxes.push(mkBox(screen, spec.rects.network, 'NETWORK', spec.safeW, spec.safeH, spec.topGuard));
|
|
52
|
+
boxes.push(mkBox(screen, spec.rects.capabilities, 'CAPABILITIES', spec.safeW, spec.safeH, spec.topGuard));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Narrow: 1 column (all panels stacked)
|
|
56
|
+
boxes.push(mkBox(screen, spec.rects.posture, 'POSTURE', spec.safeW, spec.safeH, spec.topGuard));
|
|
57
|
+
boxes.push(mkBox(screen, spec.rects.resources, 'RESOURCES', spec.safeW, spec.safeH, spec.topGuard));
|
|
58
|
+
boxes.push(mkBox(screen, spec.rects.assets, 'ASSETS', spec.safeW, spec.safeH, spec.topGuard));
|
|
59
|
+
boxes.push(mkBox(screen, spec.rects.operations, 'OPERATIONS', spec.safeW, spec.safeH, spec.topGuard));
|
|
60
|
+
boxes.push(mkBox(screen, spec.rects.network, 'NETWORK', spec.safeW, spec.safeH, spec.topGuard));
|
|
61
|
+
boxes.push(mkBox(screen, spec.rects.capabilities, 'CAPABILITIES', spec.safeW, spec.safeH, spec.topGuard));
|
|
62
|
+
}
|
|
63
|
+
// Note: COMMAND is created separately as a textbox (see mk2App.ts)
|
|
46
64
|
return boxes;
|
|
47
65
|
}
|
|
48
66
|
//# sourceMappingURL=applyLayout.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"applyLayout.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/applyLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MK2
|
|
2
|
+
* MK2 Layout Engine - Deterministic layout computation
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Fixed layout engine that ensures no overflow:
|
|
5
|
+
* - All boxes must satisfy: x + w <= safeW (so maxX = x + w - 1 <= safeW - 1)
|
|
6
|
+
* - Accounts for gutters and borders
|
|
7
|
+
* - Supports wide (3-column), compact (2-column), and narrow (1-column) layouts
|
|
6
8
|
*/
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
10
|
-
export declare const
|
|
9
|
+
export declare const SAFE_RIGHT_MARGIN = 2;
|
|
10
|
+
export declare const SAFE_BOTTOM_MARGIN = 1;
|
|
11
|
+
export declare const TOP_GUARD = 1;
|
|
12
|
+
export declare const GUTTER_X = 1;
|
|
13
|
+
export declare const GUTTER_Y = 1;
|
|
11
14
|
export interface LayoutRect {
|
|
12
15
|
x: number;
|
|
13
16
|
y: number;
|
|
14
17
|
w: number;
|
|
15
18
|
h: number;
|
|
16
19
|
}
|
|
20
|
+
export type LayoutMode = 'wide' | 'compact' | 'narrow';
|
|
17
21
|
export interface LayoutSpec {
|
|
22
|
+
mode: LayoutMode;
|
|
18
23
|
safeW: number;
|
|
19
24
|
safeH: number;
|
|
20
25
|
cols: number;
|
|
@@ -27,6 +32,9 @@ export interface LayoutSpec {
|
|
|
27
32
|
rightX: number;
|
|
28
33
|
cmdH: number;
|
|
29
34
|
usableH: number;
|
|
35
|
+
topGuard: number;
|
|
36
|
+
rightGuard: number;
|
|
37
|
+
bottomGuard: number;
|
|
30
38
|
rects: {
|
|
31
39
|
posture: LayoutRect;
|
|
32
40
|
resources: LayoutRect;
|
|
@@ -44,8 +52,14 @@ export declare function getSafeCanvas(cols: number, rows: number): {
|
|
|
44
52
|
safeW: number;
|
|
45
53
|
safeH: number;
|
|
46
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* Validate layout - check if all rects fit within safe bounds
|
|
57
|
+
* Rule: x + w <= safeW (so maxX = x + w - 1 <= safeW - 1)
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateLayout(layout: LayoutSpec): string[];
|
|
47
60
|
/**
|
|
48
61
|
* Compute layout spec from screen dimensions
|
|
62
|
+
* Minimums: 80 cols / 20 rows (absolute), 90 cols / 22 rows (narrow), 100 cols / 30 rows (compact), 160 cols / 40 rows (wide)
|
|
49
63
|
*/
|
|
50
64
|
export declare function computeLayout(cols: number, rows: number): LayoutSpec;
|
|
51
65
|
//# sourceMappingURL=computeLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeLayout.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"computeLayout.d.ts","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAE1B,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,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,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,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,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;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAyB3D;AA+JD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAiDpE"}
|
|
@@ -1,130 +1,235 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MK2
|
|
2
|
+
* MK2 Layout Engine - Deterministic layout computation
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Fixed layout engine that ensures no overflow:
|
|
5
|
+
* - All boxes must satisfy: x + w <= safeW (so maxX = x + w - 1 <= safeW - 1)
|
|
6
|
+
* - Accounts for gutters and borders
|
|
7
|
+
* - Supports wide (3-column), compact (2-column), and narrow (1-column) layouts
|
|
6
8
|
*/
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
-
export const
|
|
10
|
-
export const
|
|
11
|
-
export const
|
|
12
|
-
export const
|
|
9
|
+
// Constants
|
|
10
|
+
export const SAFE_RIGHT_MARGIN = 2; // Reserve right edge (prevents scrollbars)
|
|
11
|
+
export const SAFE_BOTTOM_MARGIN = 1; // Reserve bottom edge
|
|
12
|
+
export const TOP_GUARD = 1; // Reserve top row for debug overlay
|
|
13
|
+
export const GUTTER_X = 1; // Horizontal gutter between columns
|
|
14
|
+
export const GUTTER_Y = 1; // Vertical gutter between rows
|
|
13
15
|
/**
|
|
14
16
|
* Compute safe canvas dimensions
|
|
15
17
|
*/
|
|
16
18
|
export function getSafeCanvas(cols, rows) {
|
|
17
|
-
const safeW = Math.max(0, cols -
|
|
18
|
-
const safeH = Math.max(0, rows -
|
|
19
|
+
const safeW = Math.max(0, cols - SAFE_RIGHT_MARGIN);
|
|
20
|
+
const safeH = Math.max(0, rows - TOP_GUARD - SAFE_BOTTOM_MARGIN);
|
|
19
21
|
return { safeW, safeH };
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
|
-
*
|
|
24
|
+
* Validate layout - check if all rects fit within safe bounds
|
|
25
|
+
* Rule: x + w <= safeW (so maxX = x + w - 1 <= safeW - 1)
|
|
23
26
|
*/
|
|
24
|
-
export function
|
|
25
|
-
|
|
26
|
-
const { safeW, safeH } =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
export function validateLayout(layout) {
|
|
28
|
+
const errors = [];
|
|
29
|
+
const { safeW, safeH, topGuard } = layout;
|
|
30
|
+
for (const [name, rect] of Object.entries(layout.rects)) {
|
|
31
|
+
if (rect.x < 0) {
|
|
32
|
+
errors.push(`${name}: x=${rect.x} < 0`);
|
|
33
|
+
}
|
|
34
|
+
if (rect.y < topGuard) {
|
|
35
|
+
errors.push(`${name}: y=${rect.y} < topGuard=${topGuard}`);
|
|
36
|
+
}
|
|
37
|
+
if (rect.w < 1 || rect.h < 1) {
|
|
38
|
+
errors.push(`${name}: invalid size w=${rect.w} h=${rect.h}`);
|
|
39
|
+
}
|
|
40
|
+
// Check: x + w <= safeW (ensures maxX = x + w - 1 <= safeW - 1)
|
|
41
|
+
if (rect.x + rect.w > safeW) {
|
|
42
|
+
errors.push(`${name}: x+w=${rect.x + rect.w} > safeW=${safeW} (overflow=${rect.x + rect.w - safeW})`);
|
|
43
|
+
}
|
|
44
|
+
const maxY = topGuard + safeH;
|
|
45
|
+
if (rect.y + rect.h > maxY) {
|
|
46
|
+
errors.push(`${name}: y+h=${rect.y + rect.h} > maxY=${maxY} (overflow=${rect.y + rect.h - maxY})`);
|
|
47
|
+
}
|
|
32
48
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
49
|
+
return errors;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compute wide 3-column layout
|
|
53
|
+
* Guarantees: leftX + leftW + GUTTER_X + centerW + GUTTER_X + rightW <= safeW
|
|
54
|
+
*/
|
|
55
|
+
function computeWideLayout(cols, rows, safeW, safeH) {
|
|
56
|
+
const LEFT_W = 30;
|
|
57
|
+
const RIGHT_W = 30;
|
|
58
|
+
// Calculate center width ensuring total <= safeW - 1 (off-by-one safety)
|
|
59
|
+
// Total width = LEFT_W + GUTTER_X + centerW + GUTTER_X + RIGHT_W
|
|
60
|
+
// We need: total <= safeW - 1
|
|
61
|
+
// So: centerW <= safeW - LEFT_W - RIGHT_W - GUTTER_X * 2 - 1
|
|
62
|
+
const centerW = safeW - LEFT_W - RIGHT_W - (GUTTER_X * 2) - 1;
|
|
38
63
|
if (centerW < 40) {
|
|
39
|
-
|
|
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);
|
|
64
|
+
throw new Error('Center too narrow for wide layout');
|
|
45
65
|
}
|
|
46
|
-
// X positions
|
|
47
66
|
const leftX = 0;
|
|
48
|
-
const centerX =
|
|
49
|
-
const rightX =
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
// Left stack: posture=9, resources=12, assets=remaining
|
|
67
|
+
const centerX = LEFT_W + GUTTER_X;
|
|
68
|
+
const rightX = LEFT_W + GUTTER_X + centerW + GUTTER_X;
|
|
69
|
+
// Verify: rightX + RIGHT_W = LEFT_W + GUTTER_X + centerW + GUTTER_X + RIGHT_W
|
|
70
|
+
// = LEFT_W + RIGHT_W + centerW + GUTTER_X * 2
|
|
71
|
+
// = safeW - 1 <= safeW ✓
|
|
72
|
+
const cmdH = 3;
|
|
73
|
+
const usableH = safeH - cmdH - GUTTER_Y;
|
|
56
74
|
const postureH = 9;
|
|
57
75
|
const resourcesH = 12;
|
|
58
|
-
const assetsH = Math.max(6, usableH - postureH - resourcesH - (
|
|
59
|
-
// Right stack: network=12, capabilities=remaining
|
|
76
|
+
const assetsH = Math.max(6, usableH - postureH - resourcesH - (GUTTER_Y * 2));
|
|
60
77
|
const networkH = 12;
|
|
61
|
-
const capabilitiesH = Math.max(6, usableH - networkH -
|
|
62
|
-
// Center: operations takes full usable height
|
|
78
|
+
const capabilitiesH = Math.max(6, usableH - networkH - GUTTER_Y);
|
|
63
79
|
const operationsH = Math.max(6, usableH);
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const cmdY = safeH - cmdH;
|
|
69
|
-
// Build rects
|
|
80
|
+
const leftY = TOP_GUARD;
|
|
81
|
+
const centerY = TOP_GUARD;
|
|
82
|
+
const rightY = TOP_GUARD;
|
|
83
|
+
const cmdY = TOP_GUARD + safeH - cmdH;
|
|
70
84
|
const rects = {
|
|
71
|
-
posture: {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
},
|
|
77
|
-
|
|
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
|
-
},
|
|
85
|
+
posture: { x: leftX, y: leftY, w: LEFT_W, h: postureH },
|
|
86
|
+
resources: { x: leftX, y: leftY + postureH + GUTTER_Y, w: LEFT_W, h: resourcesH },
|
|
87
|
+
assets: { x: leftX, y: leftY + postureH + GUTTER_Y + resourcesH + GUTTER_Y, w: LEFT_W, h: assetsH },
|
|
88
|
+
operations: { x: centerX, y: centerY, w: centerW, h: operationsH },
|
|
89
|
+
network: { x: rightX, y: rightY, w: RIGHT_W, h: networkH },
|
|
90
|
+
capabilities: { x: rightX, y: rightY + networkH + GUTTER_Y, w: RIGHT_W, h: capabilitiesH },
|
|
91
|
+
command: { x: 0, y: cmdY, w: safeW - 1, h: cmdH },
|
|
113
92
|
};
|
|
114
93
|
return {
|
|
115
|
-
|
|
116
|
-
safeH,
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
centerX,
|
|
124
|
-
rightX,
|
|
125
|
-
cmdH,
|
|
126
|
-
usableH,
|
|
94
|
+
mode: 'wide',
|
|
95
|
+
safeW, safeH, cols, rows,
|
|
96
|
+
leftW: LEFT_W, centerW, rightW: RIGHT_W,
|
|
97
|
+
leftX, centerX, rightX,
|
|
98
|
+
cmdH, usableH,
|
|
99
|
+
topGuard: TOP_GUARD,
|
|
100
|
+
rightGuard: SAFE_RIGHT_MARGIN,
|
|
101
|
+
bottomGuard: SAFE_BOTTOM_MARGIN,
|
|
127
102
|
rects,
|
|
128
103
|
};
|
|
129
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Compute compact 2-column layout
|
|
107
|
+
*/
|
|
108
|
+
function computeCompactLayout(cols, rows, safeW, safeH) {
|
|
109
|
+
const LEFT_W = Math.floor(safeW * 0.35);
|
|
110
|
+
const RIGHT_W = safeW - LEFT_W - GUTTER_X - 1; // -1 for off-by-one safety
|
|
111
|
+
const leftX = 0;
|
|
112
|
+
const rightX = LEFT_W + GUTTER_X;
|
|
113
|
+
const cmdH = 3;
|
|
114
|
+
const usableH = safeH - cmdH - GUTTER_Y;
|
|
115
|
+
const leftY = TOP_GUARD;
|
|
116
|
+
const rightY = TOP_GUARD;
|
|
117
|
+
const cmdY = TOP_GUARD + safeH - cmdH;
|
|
118
|
+
const leftStackH = Math.floor((usableH - GUTTER_Y * 2) / 3);
|
|
119
|
+
const postureH = leftStackH;
|
|
120
|
+
const resourcesH = leftStackH;
|
|
121
|
+
const assetsH = usableH - postureH - resourcesH - (GUTTER_Y * 2);
|
|
122
|
+
const operationsH = Math.floor(usableH * 0.6);
|
|
123
|
+
const networkH = Math.floor((usableH - operationsH - GUTTER_Y) / 2);
|
|
124
|
+
const capabilitiesH = usableH - operationsH - networkH - GUTTER_Y;
|
|
125
|
+
const rects = {
|
|
126
|
+
posture: { x: leftX, y: leftY, w: LEFT_W, h: postureH },
|
|
127
|
+
resources: { x: leftX, y: leftY + postureH + GUTTER_Y, w: LEFT_W, h: resourcesH },
|
|
128
|
+
assets: { x: leftX, y: leftY + postureH + GUTTER_Y + resourcesH + GUTTER_Y, w: LEFT_W, h: assetsH },
|
|
129
|
+
operations: { x: rightX, y: rightY, w: RIGHT_W, h: operationsH },
|
|
130
|
+
network: { x: rightX, y: rightY + operationsH + GUTTER_Y, w: RIGHT_W, h: networkH },
|
|
131
|
+
capabilities: { x: rightX, y: rightY + operationsH + GUTTER_Y + networkH + GUTTER_Y, w: RIGHT_W, h: capabilitiesH },
|
|
132
|
+
command: { x: 0, y: cmdY, w: safeW - 1, h: cmdH },
|
|
133
|
+
};
|
|
134
|
+
return {
|
|
135
|
+
mode: 'compact',
|
|
136
|
+
safeW, safeH, cols, rows,
|
|
137
|
+
leftW: LEFT_W, centerW: 0, rightW: RIGHT_W,
|
|
138
|
+
leftX, centerX: 0, rightX,
|
|
139
|
+
cmdH, usableH,
|
|
140
|
+
topGuard: TOP_GUARD,
|
|
141
|
+
rightGuard: SAFE_RIGHT_MARGIN,
|
|
142
|
+
bottomGuard: SAFE_BOTTOM_MARGIN,
|
|
143
|
+
rects,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Compute narrow 1-column layout (for very small terminals)
|
|
148
|
+
*/
|
|
149
|
+
function computeNarrowLayout(cols, rows, safeW, safeH) {
|
|
150
|
+
const cmdH = 3;
|
|
151
|
+
const usableH = safeH - cmdH - GUTTER_Y;
|
|
152
|
+
const cmdY = TOP_GUARD + safeH - cmdH;
|
|
153
|
+
// Single column, full width
|
|
154
|
+
const colW = safeW - 1; // -1 for off-by-one safety
|
|
155
|
+
const colX = 0;
|
|
156
|
+
// Stack all panels vertically
|
|
157
|
+
// Operations gets more space (1.5x), others share remaining space
|
|
158
|
+
const operationsH = Math.floor(usableH * 0.3); // 30% for operations
|
|
159
|
+
const remainingH = usableH - operationsH - GUTTER_Y * 5;
|
|
160
|
+
const smallPanelH = Math.floor(remainingH / 5); // 5 other panels
|
|
161
|
+
let currentY = TOP_GUARD;
|
|
162
|
+
const rects = {
|
|
163
|
+
posture: { x: colX, y: currentY, w: colW, h: smallPanelH },
|
|
164
|
+
resources: { x: colX, y: currentY + smallPanelH + GUTTER_Y, w: colW, h: smallPanelH },
|
|
165
|
+
assets: { x: colX, y: currentY + (smallPanelH + GUTTER_Y) * 2, w: colW, h: smallPanelH },
|
|
166
|
+
operations: { x: colX, y: currentY + (smallPanelH + GUTTER_Y) * 3, w: colW, h: operationsH },
|
|
167
|
+
network: { x: colX, y: currentY + (smallPanelH + GUTTER_Y) * 3 + operationsH + GUTTER_Y, w: colW, h: smallPanelH },
|
|
168
|
+
capabilities: { x: colX, y: currentY + (smallPanelH + GUTTER_Y) * 3 + operationsH + GUTTER_Y + smallPanelH + GUTTER_Y, w: colW, h: smallPanelH },
|
|
169
|
+
command: { x: 0, y: cmdY, w: safeW - 1, h: cmdH },
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
mode: 'narrow',
|
|
173
|
+
safeW, safeH, cols, rows,
|
|
174
|
+
leftW: colW, centerW: 0, rightW: 0,
|
|
175
|
+
leftX: colX, centerX: 0, rightX: 0,
|
|
176
|
+
cmdH, usableH,
|
|
177
|
+
topGuard: TOP_GUARD,
|
|
178
|
+
rightGuard: SAFE_RIGHT_MARGIN,
|
|
179
|
+
bottomGuard: SAFE_BOTTOM_MARGIN,
|
|
180
|
+
rects,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Compute layout spec from screen dimensions
|
|
185
|
+
* Minimums: 80 cols / 20 rows (absolute), 90 cols / 22 rows (narrow), 100 cols / 30 rows (compact), 160 cols / 40 rows (wide)
|
|
186
|
+
*/
|
|
187
|
+
export function computeLayout(cols, rows) {
|
|
188
|
+
const { safeW, safeH } = getSafeCanvas(cols, rows);
|
|
189
|
+
// Absolute minimum: too small for anything
|
|
190
|
+
if (cols < 80 || rows < 20) {
|
|
191
|
+
throw new Error(`Terminal too small: ${cols}x${rows} (minimum 80x20)`);
|
|
192
|
+
}
|
|
193
|
+
// Try wide layout (160+ cols, 40+ rows)
|
|
194
|
+
if (cols >= 160 && rows >= 40) {
|
|
195
|
+
try {
|
|
196
|
+
const layout = computeWideLayout(cols, rows, safeW, safeH);
|
|
197
|
+
const errors = validateLayout(layout);
|
|
198
|
+
if (errors.length === 0) {
|
|
199
|
+
return layout;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Fall through to compact
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Try compact layout (100+ cols, 30+ rows)
|
|
207
|
+
if (cols >= 100 && rows >= 30) {
|
|
208
|
+
try {
|
|
209
|
+
const layout = computeCompactLayout(cols, rows, safeW, safeH);
|
|
210
|
+
const errors = validateLayout(layout);
|
|
211
|
+
if (errors.length === 0) {
|
|
212
|
+
return layout;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Fall through to narrow
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Try narrow layout (90+ cols, 22+ rows)
|
|
220
|
+
if (cols >= 90 && rows >= 22) {
|
|
221
|
+
try {
|
|
222
|
+
const layout = computeNarrowLayout(cols, rows, safeW, safeH);
|
|
223
|
+
const errors = validateLayout(layout);
|
|
224
|
+
if (errors.length === 0) {
|
|
225
|
+
return layout;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Terminal is too small
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Too small for any layout
|
|
233
|
+
throw new Error(`Terminal too small: ${cols}x${rows} (minimum 90x22 for narrow layout)`);
|
|
234
|
+
}
|
|
130
235
|
//# sourceMappingURL=computeLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeLayout.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"computeLayout.js","sourceRoot":"","sources":["../../../src/tui_mk2/layout/computeLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,9 @@ export interface Box {
|
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Assert that a box fits within safe canvas bounds
|
|
14
|
-
*
|
|
14
|
+
* Rule: x + w <= safeW (ensures maxX = x + w - 1 <= safeW - 1)
|
|
15
15
|
*/
|
|
16
|
-
export declare function assertBoxFits(box: Box, safeW: number, safeH: number): void;
|
|
16
|
+
export declare function assertBoxFits(box: Box, safeW: number, safeH: number, topGuard?: number): void;
|
|
17
17
|
/**
|
|
18
18
|
* Clamp a value between min and max
|
|
19
19
|
*/
|
|
@@ -1 +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,
|
|
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,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI,CA4BhG;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE"}
|
|
@@ -5,24 +5,24 @@
|
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
7
|
* Assert that a box fits within safe canvas bounds
|
|
8
|
-
*
|
|
8
|
+
* Rule: x + w <= safeW (ensures maxX = x + w - 1 <= safeW - 1)
|
|
9
9
|
*/
|
|
10
|
-
export function assertBoxFits(box, safeW, safeH) {
|
|
11
|
-
if (box.x < 0 || box.y <
|
|
12
|
-
throw new Error(`Box negative position: x=${box.x} y=${box.y} (must be >=
|
|
10
|
+
export function assertBoxFits(box, safeW, safeH, topGuard = 0) {
|
|
11
|
+
if (box.x < 0 || box.y < topGuard) {
|
|
12
|
+
throw new Error(`Box negative position: x=${box.x} y=${box.y} (must be x>=0, y>=${topGuard})`);
|
|
13
13
|
}
|
|
14
|
-
if (box.w
|
|
15
|
-
throw new Error(`Box
|
|
14
|
+
if (box.w < 1 || box.h < 1) {
|
|
15
|
+
throw new Error(`Box invalid size: w=${box.w} h=${box.h} (must be >= 1)`);
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
`(box: x=${box.x} w=${box.w} overflow=${maxX - safeW})`);
|
|
17
|
+
// Check: x + w <= safeW (ensures maxX = x + w - 1 <= safeW - 1)
|
|
18
|
+
if (box.x + box.w > safeW) {
|
|
19
|
+
throw new Error(`Box overflows X: x+w=${box.x + box.w} > safeW=${safeW} ` +
|
|
20
|
+
`(box: x=${box.x} w=${box.w} overflow=${box.x + box.w - safeW})`);
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const safeMaxY = topGuard + safeH;
|
|
23
|
+
if (box.y + box.h > safeMaxY) {
|
|
24
|
+
throw new Error(`Box overflows Y: y+h=${box.y + box.h} > safeMaxY=${safeMaxY} ` +
|
|
25
|
+
`(box: y=${box.y} h=${box.h} topGuard=${topGuard} overflow=${box.y + box.h - safeMaxY})`);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
@@ -1 +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;
|
|
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,EAAE,WAAmB,CAAC;IACxF,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,sBAAsB,QAAQ,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,uBAAuB,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,iBAAiB,CACzD,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,KAAK,GAAG;YACzD,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,QAAQ,GAAG;YAC/D,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,aAAa,QAAQ,aAAa,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,CACzF,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"}
|