4runr-os 2.0.39 → 2.0.41
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/ui/v5/debug/debugCommands.d.ts +20 -0
- package/dist/ui/v5/debug/debugCommands.d.ts.map +1 -0
- package/dist/ui/v5/debug/debugCommands.js +104 -0
- package/dist/ui/v5/debug/debugCommands.js.map +1 -0
- package/dist/ui/v5/guardrails/stdoutGuard.d.ts +23 -0
- package/dist/ui/v5/guardrails/stdoutGuard.d.ts.map +1 -0
- package/dist/ui/v5/guardrails/stdoutGuard.js +94 -0
- package/dist/ui/v5/guardrails/stdoutGuard.js.map +1 -0
- package/dist/ui/v5/guardrails/terminalRestore.d.ts +17 -0
- package/dist/ui/v5/guardrails/terminalRestore.d.ts.map +1 -0
- package/dist/ui/v5/guardrails/terminalRestore.js +47 -0
- package/dist/ui/v5/guardrails/terminalRestore.js.map +1 -0
- package/dist/ui/v5/index.d.ts +13 -3
- package/dist/ui/v5/index.d.ts.map +1 -1
- package/dist/ui/v5/index.js +48 -39
- package/dist/ui/v5/index.js.map +1 -1
- package/dist/ui/v5/kernel/kernel.d.ts +80 -0
- package/dist/ui/v5/kernel/kernel.d.ts.map +1 -0
- package/dist/ui/v5/kernel/kernel.js +283 -0
- package/dist/ui/v5/kernel/kernel.js.map +1 -0
- package/dist/ui/v5/layout/clampRect.d.ts +22 -0
- package/dist/ui/v5/layout/clampRect.d.ts.map +1 -0
- package/dist/ui/v5/layout/clampRect.js +40 -0
- package/dist/ui/v5/layout/clampRect.js.map +1 -0
- package/dist/ui/v5/layout/layoutEngine.d.ts +16 -0
- package/dist/ui/v5/layout/layoutEngine.d.ts.map +1 -0
- package/dist/ui/v5/layout/layoutEngine.js +99 -0
- package/dist/ui/v5/layout/layoutEngine.js.map +1 -0
- package/dist/ui/v5/resize/resizeController.d.ts +62 -0
- package/dist/ui/v5/resize/resizeController.d.ts.map +1 -0
- package/dist/ui/v5/resize/resizeController.js +133 -0
- package/dist/ui/v5/resize/resizeController.js.map +1 -0
- package/dist/ui/v5/viewport/getViewport.d.ts +19 -0
- package/dist/ui/v5/viewport/getViewport.d.ts.map +1 -0
- package/dist/ui/v5/viewport/getViewport.js +98 -0
- package/dist/ui/v5/viewport/getViewport.js.map +1 -0
- package/dist/ui/v5/viewport.js +2 -2
- package/dist/ui/v5/viewport.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/kernel/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAiB,KAAK,MAAM,EAAgB,MAAM,2BAA2B,CAAC;AAIrF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAC5B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,YAAY,CAA4B;gBAEpC,MAAM,EAAE,OAAO,CAAC,MAAM;IAIlC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM;IAOnB;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC,GAAG,GAAG,SAAS;IAI7C;;OAEG;IACH,UAAU,IAAI,SAAS,GAAG,IAAI;IAI9B;;OAEG;IACH,IAAI,IAAI,IAAI;IAiBZ;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IA8DtC;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;OAEG;IACH,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IA6C1C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,aAAa;CAmDtB"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 UI Kernel
|
|
3
|
+
*
|
|
4
|
+
* Owns the screen and all widgets. Provides atomic rebuild capability.
|
|
5
|
+
*
|
|
6
|
+
* HARD RULE: Never resize/move existing widgets.
|
|
7
|
+
* On every committed resize: destroy all widgets and recreate them.
|
|
8
|
+
*/
|
|
9
|
+
import blessed from 'neo-blessed';
|
|
10
|
+
import { getViewport } from '../viewport/getViewport.js';
|
|
11
|
+
import { computeLayout } from '../layout/layoutEngine.js';
|
|
12
|
+
import { setLayoutVersion } from '../renderGate.js';
|
|
13
|
+
export class UIKernel {
|
|
14
|
+
screen;
|
|
15
|
+
widgets = null;
|
|
16
|
+
layout = null;
|
|
17
|
+
layoutVersion = 0;
|
|
18
|
+
isRebuilding = false;
|
|
19
|
+
pendingRebuild = null;
|
|
20
|
+
debugOverlayVisible = false;
|
|
21
|
+
debugOverlay = null;
|
|
22
|
+
constructor(screen) {
|
|
23
|
+
this.screen = screen;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get current layout version (for render gating)
|
|
27
|
+
*/
|
|
28
|
+
getLayoutVersion() {
|
|
29
|
+
return this.layoutVersion;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current layout
|
|
33
|
+
*/
|
|
34
|
+
getLayout() {
|
|
35
|
+
if (!this.layout) {
|
|
36
|
+
throw new Error('Layout not computed yet');
|
|
37
|
+
}
|
|
38
|
+
return this.layout;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get operations panel (for debug commands)
|
|
42
|
+
*/
|
|
43
|
+
getOperationsPanel() {
|
|
44
|
+
return this.widgets?.operations;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get current widgets (for external access)
|
|
48
|
+
*/
|
|
49
|
+
getWidgets() {
|
|
50
|
+
return this.widgets;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Boot the kernel - initial mount
|
|
54
|
+
*/
|
|
55
|
+
boot() {
|
|
56
|
+
if (this.widgets) {
|
|
57
|
+
throw new Error('Kernel already booted');
|
|
58
|
+
}
|
|
59
|
+
const vp = getViewport(this.screen);
|
|
60
|
+
this.layout = computeLayout(vp.safeCols, vp.safeRows);
|
|
61
|
+
this.widgets = this.createWidgets(this.layout);
|
|
62
|
+
this.layoutVersion = 1;
|
|
63
|
+
setLayoutVersion(this.layoutVersion);
|
|
64
|
+
// Force a render after a small delay to ensure screen is ready
|
|
65
|
+
setImmediate(() => {
|
|
66
|
+
this.screen.render();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Rebuild the UI - atomic destroy and recreate
|
|
71
|
+
*/
|
|
72
|
+
rebuild(options) {
|
|
73
|
+
// A) Block re-entrant rebuild
|
|
74
|
+
if (this.isRebuilding) {
|
|
75
|
+
this.pendingRebuild = options;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.isRebuilding = true;
|
|
79
|
+
try {
|
|
80
|
+
// B) Clear the terminal buffer
|
|
81
|
+
const program = this.screen.program;
|
|
82
|
+
if (program) {
|
|
83
|
+
if (typeof program.clear === 'function') {
|
|
84
|
+
program.clear();
|
|
85
|
+
}
|
|
86
|
+
if (typeof program.flush === 'function') {
|
|
87
|
+
program.flush();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// C) Destroy everything currently mounted (hard)
|
|
91
|
+
this.destroyAllChildren();
|
|
92
|
+
// D) Compute viewport and layout
|
|
93
|
+
const vp = getViewport(this.screen);
|
|
94
|
+
this.layout = computeLayout(vp.safeCols, vp.safeRows);
|
|
95
|
+
// E) Recreate widgets fresh
|
|
96
|
+
this.widgets = this.createWidgets(this.layout);
|
|
97
|
+
this.layoutVersion = options.version;
|
|
98
|
+
setLayoutVersion(this.layoutVersion);
|
|
99
|
+
// F) Render once
|
|
100
|
+
this.screen.render();
|
|
101
|
+
// Update debug overlay if visible
|
|
102
|
+
if (this.debugOverlayVisible && this.debugOverlay) {
|
|
103
|
+
this.updateDebugOverlay();
|
|
104
|
+
}
|
|
105
|
+
// G) Restore input focus
|
|
106
|
+
if (this.widgets.command) {
|
|
107
|
+
this.widgets.command.focus?.();
|
|
108
|
+
this.screen.render();
|
|
109
|
+
}
|
|
110
|
+
process.stderr.write(`[V5] Rebuilt layout v${options.version} (raw: ${vp.cols}x${vp.rows}, safe: ${vp.safeCols}x${vp.safeRows}, mode: ${this.layout.mode}) from ${options.source} (burst: ${options.burstCount})\n`);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
this.isRebuilding = false;
|
|
114
|
+
// Process pending rebuild if one was queued
|
|
115
|
+
if (this.pendingRebuild) {
|
|
116
|
+
const pending = this.pendingRebuild;
|
|
117
|
+
this.pendingRebuild = null;
|
|
118
|
+
// Use setImmediate to avoid re-entrancy issues
|
|
119
|
+
setImmediate(() => this.rebuild(pending));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Destroy the kernel and all widgets
|
|
125
|
+
*/
|
|
126
|
+
destroy() {
|
|
127
|
+
this.destroyAllChildren();
|
|
128
|
+
this.widgets = null;
|
|
129
|
+
this.layout = null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Toggle debug overlay
|
|
133
|
+
*/
|
|
134
|
+
toggleDebugOverlay(content) {
|
|
135
|
+
this.debugOverlayVisible = !this.debugOverlayVisible;
|
|
136
|
+
if (this.debugOverlayVisible) {
|
|
137
|
+
// Create or update debug overlay
|
|
138
|
+
if (this.debugOverlay) {
|
|
139
|
+
if (typeof this.debugOverlay.detach === 'function') {
|
|
140
|
+
this.debugOverlay.detach();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const vp = getViewport(this.screen);
|
|
144
|
+
const overlayContent = content || this.buildDebugOverlayContent();
|
|
145
|
+
this.debugOverlay = blessed.box({
|
|
146
|
+
top: 0,
|
|
147
|
+
left: 0,
|
|
148
|
+
width: vp.safeCols,
|
|
149
|
+
height: Math.min(10, vp.safeRows),
|
|
150
|
+
content: overlayContent,
|
|
151
|
+
scrollable: true,
|
|
152
|
+
alwaysScroll: true,
|
|
153
|
+
style: {
|
|
154
|
+
fg: 'yellow',
|
|
155
|
+
bg: 'black',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
this.screen.append(this.debugOverlay);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Remove debug overlay
|
|
162
|
+
if (this.debugOverlay) {
|
|
163
|
+
if (typeof this.debugOverlay.detach === 'function') {
|
|
164
|
+
this.debugOverlay.detach();
|
|
165
|
+
}
|
|
166
|
+
if (typeof this.debugOverlay.destroy === 'function') {
|
|
167
|
+
this.debugOverlay.destroy();
|
|
168
|
+
}
|
|
169
|
+
this.debugOverlay = null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
this.screen.render();
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Update debug overlay with new info
|
|
176
|
+
*/
|
|
177
|
+
updateDebugOverlay() {
|
|
178
|
+
if (this.debugOverlayVisible && this.debugOverlay && this.layout) {
|
|
179
|
+
const content = this.buildDebugOverlayContent();
|
|
180
|
+
this.debugOverlay.setContent(content);
|
|
181
|
+
this.screen.render();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Build debug overlay content
|
|
186
|
+
*/
|
|
187
|
+
buildDebugOverlayContent() {
|
|
188
|
+
if (!this.layout) {
|
|
189
|
+
return 'Layout not computed';
|
|
190
|
+
}
|
|
191
|
+
const lines = [
|
|
192
|
+
`mode: ${this.layout.mode} | v${this.layoutVersion}`,
|
|
193
|
+
];
|
|
194
|
+
for (const [id, rect] of Object.entries(this.layout.rects)) {
|
|
195
|
+
const rightEdge = rect.x + rect.w;
|
|
196
|
+
const bottomEdge = rect.y + rect.h;
|
|
197
|
+
lines.push(`${id}: x=${rect.x} y=${rect.y} w=${rect.w} h=${rect.h} rightEdge=${rightEdge} bottomEdge=${bottomEdge}`);
|
|
198
|
+
}
|
|
199
|
+
return lines.join('\n');
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Destroy all children widgets (hard destroy)
|
|
203
|
+
*/
|
|
204
|
+
destroyAllChildren() {
|
|
205
|
+
// Copy list first because detach mutates
|
|
206
|
+
const kids = [...this.screen.children];
|
|
207
|
+
for (const k of kids) {
|
|
208
|
+
try {
|
|
209
|
+
if (typeof k.detach === 'function') {
|
|
210
|
+
k.detach();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
// Ignore detach errors
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
if (typeof k.destroy === 'function') {
|
|
218
|
+
k.destroy();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
// Ignore destroy errors
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Remove from screen.children manually (blessed sometimes doesn't clean up)
|
|
226
|
+
const screenChildren = this.screen.children || [];
|
|
227
|
+
while (screenChildren.length > 0) {
|
|
228
|
+
screenChildren.pop();
|
|
229
|
+
}
|
|
230
|
+
// Clear debug overlay reference
|
|
231
|
+
this.debugOverlay = null;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Create all widgets fresh from layout
|
|
235
|
+
*/
|
|
236
|
+
createWidgets(layout) {
|
|
237
|
+
const widgets = {};
|
|
238
|
+
// Create panel widgets
|
|
239
|
+
for (const [id, rect] of Object.entries(layout.rects)) {
|
|
240
|
+
const panelId = id;
|
|
241
|
+
const title = panelId.charAt(0).toUpperCase() + panelId.slice(1);
|
|
242
|
+
const box = blessed.box({
|
|
243
|
+
top: rect.y,
|
|
244
|
+
left: rect.x,
|
|
245
|
+
width: rect.w,
|
|
246
|
+
height: rect.h,
|
|
247
|
+
border: {
|
|
248
|
+
type: 'line',
|
|
249
|
+
},
|
|
250
|
+
content: `${title} Panel\n\nMode: ${layout.mode}`,
|
|
251
|
+
style: {
|
|
252
|
+
border: {
|
|
253
|
+
fg: 'cyan',
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
tags: true,
|
|
257
|
+
});
|
|
258
|
+
box.setLabel(` {cyan-fg}${title.toUpperCase()}{/}`);
|
|
259
|
+
this.screen.append(box);
|
|
260
|
+
widgets[panelId] = box;
|
|
261
|
+
}
|
|
262
|
+
// V5 Watermark - top right corner
|
|
263
|
+
const vp = getViewport(this.screen);
|
|
264
|
+
const watermarkLeft = vp.safeCols - 10;
|
|
265
|
+
if (watermarkLeft >= 0) {
|
|
266
|
+
const watermark = blessed.box({
|
|
267
|
+
top: 0,
|
|
268
|
+
left: watermarkLeft,
|
|
269
|
+
width: 10,
|
|
270
|
+
height: 1,
|
|
271
|
+
content: '{cyan-fg}V5{/cyan-fg}',
|
|
272
|
+
style: {
|
|
273
|
+
fg: 'cyan',
|
|
274
|
+
},
|
|
275
|
+
tags: true,
|
|
276
|
+
});
|
|
277
|
+
this.screen.append(watermark);
|
|
278
|
+
widgets.watermark = watermark;
|
|
279
|
+
}
|
|
280
|
+
return widgets;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=kernel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../../../src/ui/v5/kernel/kernel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 Rect Clamping
|
|
3
|
+
*
|
|
4
|
+
* Hard requirement: Every single widget rect must pass through clampRect.
|
|
5
|
+
* No exceptions.
|
|
6
|
+
*/
|
|
7
|
+
export type Rect = {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
w: number;
|
|
11
|
+
h: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Clamp rectangle to fit within safe bounds
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* 1) Clamp x/y within bounds
|
|
18
|
+
* 2) Clamp w/h so x+w <= safeCols and y+h <= safeRows
|
|
19
|
+
* 3) Enforce w>=1, h>=1
|
|
20
|
+
*/
|
|
21
|
+
export declare function clampRect(r: Rect, safeCols: number, safeRows: number): Rect;
|
|
22
|
+
//# sourceMappingURL=clampRect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clampRect.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/layout/clampRect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA8B3E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 Rect Clamping
|
|
3
|
+
*
|
|
4
|
+
* Hard requirement: Every single widget rect must pass through clampRect.
|
|
5
|
+
* No exceptions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Clamp rectangle to fit within safe bounds
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* 1) Clamp x/y within bounds
|
|
12
|
+
* 2) Clamp w/h so x+w <= safeCols and y+h <= safeRows
|
|
13
|
+
* 3) Enforce w>=1, h>=1
|
|
14
|
+
*/
|
|
15
|
+
export function clampRect(r, safeCols, safeRows) {
|
|
16
|
+
let { x, y, w, h } = r;
|
|
17
|
+
// Clamp x/y to non-negative
|
|
18
|
+
x = Math.max(0, x);
|
|
19
|
+
y = Math.max(0, y);
|
|
20
|
+
// Clamp width so x+w <= safeCols
|
|
21
|
+
const maxW = safeCols - x;
|
|
22
|
+
w = Math.min(w, maxW);
|
|
23
|
+
// Clamp height so y+h <= safeRows
|
|
24
|
+
const maxH = safeRows - y;
|
|
25
|
+
h = Math.min(h, maxH);
|
|
26
|
+
// Enforce minimums
|
|
27
|
+
w = Math.max(1, w);
|
|
28
|
+
h = Math.max(1, h);
|
|
29
|
+
// Final check: ensure right edge and bottom edge are within bounds
|
|
30
|
+
if (x + w > safeCols) {
|
|
31
|
+
w = safeCols - x;
|
|
32
|
+
w = Math.max(1, w);
|
|
33
|
+
}
|
|
34
|
+
if (y + h > safeRows) {
|
|
35
|
+
h = safeRows - y;
|
|
36
|
+
h = Math.max(1, h);
|
|
37
|
+
}
|
|
38
|
+
return { x, y, w, h };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=clampRect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clampRect.js","sourceRoot":"","sources":["../../../../src/ui/v5/layout/clampRect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,QAAgB,EAAE,QAAgB;IACnE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAEvB,4BAA4B;IAC5B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnB,iCAAiC;IACjC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC1B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAEtB,kCAAkC;IAClC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC1B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAEtB,mBAAmB;IACnB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnB,mEAAmE;IACnE,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACjB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACjB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 Layout Engine
|
|
3
|
+
*
|
|
4
|
+
* Simple + deterministic layout with normal/narrow modes.
|
|
5
|
+
*/
|
|
6
|
+
import type { Rect } from './clampRect.js';
|
|
7
|
+
export type PanelId = 'posture' | 'resources' | 'assets' | 'operations' | 'network' | 'capabilities' | 'command';
|
|
8
|
+
export type Layout = {
|
|
9
|
+
mode: 'normal' | 'narrow';
|
|
10
|
+
rects: Record<PanelId, Rect>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Compute layout from safe viewport dimensions
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeLayout(safeCols: number, safeRows: number): Layout;
|
|
16
|
+
//# sourceMappingURL=layoutEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutEngine.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/layout/layoutEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAEjH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;CAC9B,CAAC;AAKF;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA0BxE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 Layout Engine
|
|
3
|
+
*
|
|
4
|
+
* Simple + deterministic layout with normal/narrow modes.
|
|
5
|
+
*/
|
|
6
|
+
import { clampRect } from './clampRect.js';
|
|
7
|
+
const CMD_HEIGHT = 3;
|
|
8
|
+
const MIN_CENTER_WIDTH = 40;
|
|
9
|
+
/**
|
|
10
|
+
* Compute layout from safe viewport dimensions
|
|
11
|
+
*/
|
|
12
|
+
export function computeLayout(safeCols, safeRows) {
|
|
13
|
+
const mainH = safeRows - CMD_HEIGHT;
|
|
14
|
+
// Compute column widths with integer math
|
|
15
|
+
const leftW = Math.max(30, Math.floor(safeCols * 0.22));
|
|
16
|
+
const rightW = Math.max(34, Math.floor(safeCols * 0.27));
|
|
17
|
+
const centerW = safeCols - leftW - rightW;
|
|
18
|
+
// Check if we need narrow mode
|
|
19
|
+
if (centerW < MIN_CENTER_WIDTH) {
|
|
20
|
+
return computeNarrowLayout(safeCols, safeRows);
|
|
21
|
+
}
|
|
22
|
+
// Normal mode - 3 columns
|
|
23
|
+
const leftX = 0;
|
|
24
|
+
const centerX = leftW;
|
|
25
|
+
const rightX = leftW + centerW;
|
|
26
|
+
// Verify right edge
|
|
27
|
+
if (rightX + rightW > safeCols) {
|
|
28
|
+
// Adjust if needed
|
|
29
|
+
const adjustedRightW = safeCols - rightX;
|
|
30
|
+
return computeNormalLayout(safeCols, safeRows, leftW, adjustedRightW);
|
|
31
|
+
}
|
|
32
|
+
return computeNormalLayout(safeCols, safeRows, leftW, rightW);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compute normal layout (3 columns)
|
|
36
|
+
*/
|
|
37
|
+
function computeNormalLayout(safeCols, safeRows, leftW, rightW) {
|
|
38
|
+
const mainH = safeRows - CMD_HEIGHT;
|
|
39
|
+
const centerW = safeCols - leftW - rightW;
|
|
40
|
+
const leftX = 0;
|
|
41
|
+
const centerX = leftW;
|
|
42
|
+
const rightX = leftW + centerW;
|
|
43
|
+
// Left stack: posture, resources, assets split equally
|
|
44
|
+
const leftPanelH = Math.floor(mainH / 3);
|
|
45
|
+
const leftRemainder = mainH - (leftPanelH * 3);
|
|
46
|
+
// Right stack: network (50%), capabilities (remainder)
|
|
47
|
+
const netH = Math.floor(mainH * 0.5);
|
|
48
|
+
const capH = mainH - netH;
|
|
49
|
+
const rects = {
|
|
50
|
+
// Left column
|
|
51
|
+
posture: { x: leftX, y: 0, w: leftW, h: leftPanelH + (leftRemainder > 0 ? 1 : 0) },
|
|
52
|
+
resources: { x: leftX, y: leftPanelH + (leftRemainder > 0 ? 1 : 0), w: leftW, h: leftPanelH + (leftRemainder > 1 ? 1 : 0) },
|
|
53
|
+
assets: { x: leftX, y: (leftPanelH * 2) + Math.min(leftRemainder, 2), w: leftW, h: leftPanelH + (leftRemainder > 2 ? 1 : 0) },
|
|
54
|
+
// Center column
|
|
55
|
+
operations: { x: centerX, y: 0, w: centerW, h: mainH },
|
|
56
|
+
// Right column
|
|
57
|
+
network: { x: rightX, y: 0, w: rightW, h: netH },
|
|
58
|
+
capabilities: { x: rightX, y: netH, w: rightW, h: capH },
|
|
59
|
+
// Command line
|
|
60
|
+
command: { x: 0, y: mainH, w: safeCols, h: CMD_HEIGHT },
|
|
61
|
+
};
|
|
62
|
+
// Clamp all rects
|
|
63
|
+
const clampedRects = {};
|
|
64
|
+
for (const [id, rect] of Object.entries(rects)) {
|
|
65
|
+
clampedRects[id] = clampRect(rect, safeCols, safeRows);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
mode: 'normal',
|
|
69
|
+
rects: clampedRects,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Compute narrow layout (fallback for small terminals)
|
|
74
|
+
*/
|
|
75
|
+
function computeNarrowLayout(safeCols, safeRows) {
|
|
76
|
+
const mainH = safeRows - CMD_HEIGHT;
|
|
77
|
+
// Narrow mode: single column, stack vertically
|
|
78
|
+
const panelH = Math.floor(mainH / 6);
|
|
79
|
+
const remainder = mainH - (panelH * 6);
|
|
80
|
+
const rects = {
|
|
81
|
+
posture: { x: 0, y: 0, w: safeCols, h: panelH + (remainder > 0 ? 1 : 0) },
|
|
82
|
+
resources: { x: 0, y: panelH + (remainder > 0 ? 1 : 0), w: safeCols, h: panelH + (remainder > 1 ? 1 : 0) },
|
|
83
|
+
assets: { x: 0, y: (panelH * 2) + Math.min(remainder, 2), w: safeCols, h: panelH + (remainder > 2 ? 1 : 0) },
|
|
84
|
+
operations: { x: 0, y: (panelH * 3) + Math.min(remainder, 3), w: safeCols, h: panelH + (remainder > 3 ? 1 : 0) },
|
|
85
|
+
network: { x: 0, y: (panelH * 4) + Math.min(remainder, 4), w: safeCols, h: panelH + (remainder > 4 ? 1 : 0) },
|
|
86
|
+
capabilities: { x: 0, y: (panelH * 5) + Math.min(remainder, 5), w: safeCols, h: panelH + (remainder > 5 ? 1 : 0) },
|
|
87
|
+
command: { x: 0, y: mainH, w: safeCols, h: CMD_HEIGHT },
|
|
88
|
+
};
|
|
89
|
+
// Clamp all rects
|
|
90
|
+
const clampedRects = {};
|
|
91
|
+
for (const [id, rect] of Object.entries(rects)) {
|
|
92
|
+
clampedRects[id] = clampRect(rect, safeCols, safeRows);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
mode: 'narrow',
|
|
96
|
+
rects: clampedRects,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=layoutEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutEngine.js","sourceRoot":"","sources":["../../../../src/ui/v5/layout/layoutEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V5 Atomic Resize Controller
|
|
3
|
+
*
|
|
4
|
+
* Debounced resize handling with atomic rebuild strategy.
|
|
5
|
+
*
|
|
6
|
+
* Strategy: rebuild children on resize (remove/destroy all, recreate fresh)
|
|
7
|
+
* This avoids "ghost borders" and duplicated panels.
|
|
8
|
+
*/
|
|
9
|
+
import type { Widgets } from 'neo-blessed';
|
|
10
|
+
import type { UIKernel } from '../kernel/kernel.js';
|
|
11
|
+
export declare class ResizeController {
|
|
12
|
+
private screen;
|
|
13
|
+
private kernel;
|
|
14
|
+
private timer;
|
|
15
|
+
private layoutVersion;
|
|
16
|
+
private lastCommitted;
|
|
17
|
+
private pending;
|
|
18
|
+
private burstCount;
|
|
19
|
+
private lastResizeTs;
|
|
20
|
+
private lastSource;
|
|
21
|
+
constructor(screen: Widgets.Screen, kernel: UIKernel);
|
|
22
|
+
/**
|
|
23
|
+
* Start listening to resize events
|
|
24
|
+
*/
|
|
25
|
+
start(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Stop listening to resize events
|
|
28
|
+
*/
|
|
29
|
+
stop(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get current layout version
|
|
32
|
+
*/
|
|
33
|
+
getLayoutVersion(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Get last committed size
|
|
36
|
+
*/
|
|
37
|
+
getLastCommitted(): {
|
|
38
|
+
cols: number;
|
|
39
|
+
rows: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Get burst count
|
|
43
|
+
*/
|
|
44
|
+
getBurstCount(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Get last resize timestamp
|
|
47
|
+
*/
|
|
48
|
+
getLastResizeTs(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Get last resize source
|
|
51
|
+
*/
|
|
52
|
+
getLastSource(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Handle resize event (debounced)
|
|
55
|
+
*/
|
|
56
|
+
private onResizeEvent;
|
|
57
|
+
/**
|
|
58
|
+
* Commit resize (atomic)
|
|
59
|
+
*/
|
|
60
|
+
private commitResize;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=resizeController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizeController.d.ts","sourceRoot":"","sources":["../../../../src/ui/v5/resize/resizeController.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,qBAAqB,CAAC;AAEpE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAwD;IAC7E,OAAO,CAAC,OAAO,CAAwD;IACvE,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,UAAU,CAAc;gBAEpB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ;IAKpD;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAIlD;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkCrB"}
|