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.
@@ -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
- // 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));
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;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"}
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 Phase 1B: Layout Spec - Hard Numbers + Clamps
2
+ * MK2 Layout Engine - Deterministic layout computation
3
3
  *
4
- * All layout computed from safe canvas + invariants
5
- * No percentages until stable - use clamped fixed numbers
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 RIGHT_GUARD = 2;
8
- export declare const BOTTOM_GUARD = 2;
9
- export declare const GUTTER = 1;
10
- export declare const PAD = 0;
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;;;;;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"}
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 Phase 1B: Layout Spec - Hard Numbers + Clamps
2
+ * MK2 Layout Engine - Deterministic layout computation
3
3
  *
4
- * All layout computed from safe canvas + invariants
5
- * No percentages until stable - use clamped fixed numbers
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
- 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
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 - RIGHT_GUARD);
18
- const safeH = Math.max(0, rows - BOTTOM_GUARD);
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
- * Compute layout spec from screen dimensions
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 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})`);
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
- // 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
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
- 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);
64
+ throw new Error('Center too narrow for wide layout');
45
65
  }
46
- // X positions
47
66
  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
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 - (GUTTER * 2));
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 - GUTTER);
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
- // 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
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
- 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
- },
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
- safeW,
116
- safeH,
117
- cols,
118
- rows,
119
- leftW,
120
- centerW,
121
- rightW,
122
- leftX,
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":"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"}
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
- * Throws error if box exceeds bounds - this helps catch math errors early
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,CA6B1E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE"}
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
- * Throws error if box exceeds bounds - this helps catch math errors early
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 < 0) {
12
- throw new Error(`Box negative position: x=${box.x} y=${box.y} (must be >= 0)`);
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 <= 0 || box.h <= 0) {
15
- throw new Error(`Box non-positive size: w=${box.w} h=${box.h} (must be > 0)`);
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
- 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})`);
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
- 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})`);
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;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"}
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"}