omnius 1.0.884 → 1.0.885
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 +2 -2
- package/dist/tui/native/worker.js +119 -35
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/dist/index.js
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 38501421 bytes
|
|
4
|
+
sha256: 93169deae92540705e32001d313d4ce473ab593892b4961028c6d743b672aa17
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { createWriteStream } from "node:fs";
|
|
3
3
|
import { createInterface } from "node:readline";
|
|
4
4
|
import { PassThrough } from "node:stream";
|
|
5
|
-
import { CliRenderEvents as
|
|
5
|
+
import { CliRenderEvents as CliRenderEvents11, NativeSession, RGBA as RGBA4, createCliRenderer } from "@opentui/core";
|
|
6
6
|
|
|
7
7
|
// packages/cli/src/tui/native/components/frontend.ts
|
|
8
8
|
import {
|
|
@@ -8724,6 +8724,28 @@ var NativeFrontend = class {
|
|
|
8724
8724
|
return visit(this.renderer.root);
|
|
8725
8725
|
}
|
|
8726
8726
|
onFrame = () => {
|
|
8727
|
+
if (this.destroyed) return;
|
|
8728
|
+
this.flushPendingInterfaceLayout();
|
|
8729
|
+
const height = Math.max(1, Math.min(8, this.editor.editorView.getTotalVirtualLineCount(), this.renderer.terminalHeight - 8));
|
|
8730
|
+
if (height !== this.editor.height) this.editor.height = height;
|
|
8731
|
+
this.layoutTabStrips();
|
|
8732
|
+
for (const media of this.context.mediaViews ?? []) media.reconcile({ x: this.scroll.viewport.x, y: this.scroll.viewport.y, width: this.scroll.viewport.width, height: this.scroll.viewport.height }, !this.paused && !this.modals.active);
|
|
8733
|
+
for (const model of this.context.modelViews ?? []) model.reconcile(this.scroll.viewport, !this.paused && !this.modals.active);
|
|
8734
|
+
this.modals.reconcileMedia();
|
|
8735
|
+
const offset2 = this.offset;
|
|
8736
|
+
if (offset2 === 0) this.newEntries = 0;
|
|
8737
|
+
this.liveButton.visible = offset2 > 0;
|
|
8738
|
+
const liveLabel = offset2 > 0 ? `↓ Live${this.newEntries ? ` · ${this.newEntries} new` : ""}` : "↓ Live";
|
|
8739
|
+
if (this.liveButton.plainText !== liveLabel) this.liveButton.content = liveLabel;
|
|
8740
|
+
const event = { type: "viewport", offset: this.scroll.scrollTop, height: this.scroll.viewport.height, width: this.scroll.viewport.width, total: this.scroll.scrollHeight };
|
|
8741
|
+
const signature = JSON.stringify(event);
|
|
8742
|
+
if (signature !== this.viewportSignature) {
|
|
8743
|
+
this.viewportSignature = signature;
|
|
8744
|
+
this.emit(event);
|
|
8745
|
+
}
|
|
8746
|
+
};
|
|
8747
|
+
/** Restore presentation after native layout, without requiring terminal drain. */
|
|
8748
|
+
flushPendingInterfaceLayout() {
|
|
8727
8749
|
if (this.destroyed) return;
|
|
8728
8750
|
if (this.pendingInterface) {
|
|
8729
8751
|
const state = this.pendingInterface;
|
|
@@ -8747,24 +8769,7 @@ var NativeFrontend = class {
|
|
|
8747
8769
|
this.scroll.scrollTo(restore.live ? this.scroll.scrollHeight : restore.top);
|
|
8748
8770
|
this.renderer.requestRender();
|
|
8749
8771
|
}
|
|
8750
|
-
|
|
8751
|
-
if (height !== this.editor.height) this.editor.height = height;
|
|
8752
|
-
this.layoutTabStrips();
|
|
8753
|
-
for (const media of this.context.mediaViews ?? []) media.reconcile({ x: this.scroll.viewport.x, y: this.scroll.viewport.y, width: this.scroll.viewport.width, height: this.scroll.viewport.height }, !this.paused && !this.modals.active);
|
|
8754
|
-
for (const model of this.context.modelViews ?? []) model.reconcile(this.scroll.viewport, !this.paused && !this.modals.active);
|
|
8755
|
-
this.modals.reconcileMedia();
|
|
8756
|
-
const offset2 = this.offset;
|
|
8757
|
-
if (offset2 === 0) this.newEntries = 0;
|
|
8758
|
-
this.liveButton.visible = offset2 > 0;
|
|
8759
|
-
const liveLabel = offset2 > 0 ? `↓ Live${this.newEntries ? ` · ${this.newEntries} new` : ""}` : "↓ Live";
|
|
8760
|
-
if (this.liveButton.plainText !== liveLabel) this.liveButton.content = liveLabel;
|
|
8761
|
-
const event = { type: "viewport", offset: this.scroll.scrollTop, height: this.scroll.viewport.height, width: this.scroll.viewport.width, total: this.scroll.scrollHeight };
|
|
8762
|
-
const signature = JSON.stringify(event);
|
|
8763
|
-
if (signature !== this.viewportSignature) {
|
|
8764
|
-
this.viewportSignature = signature;
|
|
8765
|
-
this.emit(event);
|
|
8766
|
-
}
|
|
8767
|
-
};
|
|
8772
|
+
}
|
|
8768
8773
|
onResize = () => {
|
|
8769
8774
|
this.layoutInstruments();
|
|
8770
8775
|
this.layoutTabStrips();
|
|
@@ -9244,6 +9249,11 @@ var NativeFrontend = class {
|
|
|
9244
9249
|
if (this.state) this.update(this.state);
|
|
9245
9250
|
this.layoutInstruments();
|
|
9246
9251
|
this.renderer.requestRender();
|
|
9252
|
+
const pendingScroll = this.pendingScrollRestore;
|
|
9253
|
+
return () => {
|
|
9254
|
+
if (this.pendingInterface === state) this.pendingInterface = void 0;
|
|
9255
|
+
if (this.pendingScrollRestore === pendingScroll) this.pendingScrollRestore = void 0;
|
|
9256
|
+
};
|
|
9247
9257
|
}
|
|
9248
9258
|
async dispose() {
|
|
9249
9259
|
if (this.destroyed) return;
|
|
@@ -9338,6 +9348,70 @@ function installTerminalCursorDefaults(renderer2, session) {
|
|
|
9338
9348
|
return { restore, dispose };
|
|
9339
9349
|
}
|
|
9340
9350
|
|
|
9351
|
+
// packages/cli/src/tui/native/layout-barrier.ts
|
|
9352
|
+
import { CliRenderEvents as CliRenderEvents10 } from "@opentui/core";
|
|
9353
|
+
var NATIVE_INTERFACE_LAYOUT_TIMEOUT_MS = 1e3;
|
|
9354
|
+
function waitForNativeLayout(renderer2, applyPendingLayout, options = {}) {
|
|
9355
|
+
const deadline = options.deadline ?? performance.now() + (options.timeoutMs ?? NATIVE_INTERFACE_LAYOUT_TIMEOUT_MS);
|
|
9356
|
+
return new Promise((resolve2, reject) => {
|
|
9357
|
+
let settled = false;
|
|
9358
|
+
let queued = false;
|
|
9359
|
+
let timer;
|
|
9360
|
+
const finish = (error) => {
|
|
9361
|
+
if (settled) return;
|
|
9362
|
+
settled = true;
|
|
9363
|
+
clearTimeout(timer);
|
|
9364
|
+
renderer2.removePostProcessFn(afterLayout);
|
|
9365
|
+
renderer2.off(CliRenderEvents10.DESTROY, destroyed);
|
|
9366
|
+
options.signal?.removeEventListener("abort", aborted);
|
|
9367
|
+
if (error) reject(error);
|
|
9368
|
+
else resolve2();
|
|
9369
|
+
};
|
|
9370
|
+
const destroyed = () => finish(new Error("OpenTUI closed before interface layout completed"));
|
|
9371
|
+
const aborted = () => finish(new Error("OpenTUI interface layout was cancelled"));
|
|
9372
|
+
const afterLayout = (_buffer) => {
|
|
9373
|
+
if (queued || settled) return;
|
|
9374
|
+
queued = true;
|
|
9375
|
+
queueMicrotask(() => {
|
|
9376
|
+
if (settled) return;
|
|
9377
|
+
if (performance.now() >= deadline) {
|
|
9378
|
+
timedOut();
|
|
9379
|
+
return;
|
|
9380
|
+
}
|
|
9381
|
+
try {
|
|
9382
|
+
applyPendingLayout();
|
|
9383
|
+
finish();
|
|
9384
|
+
} catch (error) {
|
|
9385
|
+
finish(error instanceof Error ? error : new Error("OpenTUI interface layout failed"));
|
|
9386
|
+
}
|
|
9387
|
+
});
|
|
9388
|
+
};
|
|
9389
|
+
renderer2.addPostProcessFn(afterLayout);
|
|
9390
|
+
renderer2.once(CliRenderEvents10.DESTROY, destroyed);
|
|
9391
|
+
options.signal?.addEventListener("abort", aborted, { once: true });
|
|
9392
|
+
if (options.signal?.aborted) {
|
|
9393
|
+
aborted();
|
|
9394
|
+
return;
|
|
9395
|
+
}
|
|
9396
|
+
if (renderer2.isDestroyed) {
|
|
9397
|
+
destroyed();
|
|
9398
|
+
return;
|
|
9399
|
+
}
|
|
9400
|
+
const timeoutMs = deadline - performance.now();
|
|
9401
|
+
const timedOut = () => finish(new Error("OpenTUI interface layout did not complete; terminal output may be paused"));
|
|
9402
|
+
if (timeoutMs <= 0) {
|
|
9403
|
+
timedOut();
|
|
9404
|
+
return;
|
|
9405
|
+
}
|
|
9406
|
+
timer = setTimeout(timedOut, timeoutMs);
|
|
9407
|
+
try {
|
|
9408
|
+
renderer2.requestRender();
|
|
9409
|
+
} catch (error) {
|
|
9410
|
+
finish(error instanceof Error ? error : new Error("OpenTUI interface layout failed"));
|
|
9411
|
+
}
|
|
9412
|
+
});
|
|
9413
|
+
}
|
|
9414
|
+
|
|
9341
9415
|
// packages/cli/src/tui/native/worker.ts
|
|
9342
9416
|
var replies = createWriteStream("", { fd: 3, autoClose: false });
|
|
9343
9417
|
var reply = (message) => replies.write(JSON.stringify(message) + "\n");
|
|
@@ -9347,9 +9421,11 @@ var frontend;
|
|
|
9347
9421
|
var cursorDefaults;
|
|
9348
9422
|
var stopping = false;
|
|
9349
9423
|
var failed = false;
|
|
9424
|
+
var layoutController = new AbortController();
|
|
9350
9425
|
async function close() {
|
|
9351
9426
|
if (stopping) return;
|
|
9352
9427
|
stopping = true;
|
|
9428
|
+
layoutController.abort();
|
|
9353
9429
|
try {
|
|
9354
9430
|
await frontend?.dispose();
|
|
9355
9431
|
await cursorDefaults?.restore();
|
|
@@ -9369,27 +9445,35 @@ async function fail(error) {
|
|
|
9369
9445
|
});
|
|
9370
9446
|
replies.end(() => process.exit(1));
|
|
9371
9447
|
}
|
|
9372
|
-
async function command(message) {
|
|
9448
|
+
async function command(message, layoutDeadline) {
|
|
9373
9449
|
if (message.type === "command") {
|
|
9374
9450
|
frontend.command(message.command);
|
|
9375
9451
|
return;
|
|
9376
9452
|
}
|
|
9377
|
-
if (message.type === "interface-capture") {
|
|
9378
|
-
|
|
9379
|
-
|
|
9380
|
-
|
|
9381
|
-
|
|
9382
|
-
|
|
9383
|
-
|
|
9384
|
-
|
|
9385
|
-
|
|
9386
|
-
|
|
9453
|
+
if (message.type === "interface-capture" || message.type === "interface-restore") {
|
|
9454
|
+
if (performance.now() >= layoutDeadline) {
|
|
9455
|
+
reply({ type: "request-error", id: message.id, message: "OpenTUI interface request expired before layout could begin" });
|
|
9456
|
+
return;
|
|
9457
|
+
}
|
|
9458
|
+
let cancelRestore;
|
|
9459
|
+
try {
|
|
9460
|
+
await waitForNativeLayout(renderer, () => {
|
|
9461
|
+
if (message.type === "interface-restore") cancelRestore = frontend.restoreInterfaceState(message.state);
|
|
9462
|
+
frontend.flushPendingInterfaceLayout();
|
|
9463
|
+
}, { signal: layoutController.signal, deadline: layoutDeadline });
|
|
9464
|
+
} catch (error) {
|
|
9465
|
+
cancelRestore?.();
|
|
9466
|
+
if (!stopping) reply({ type: "request-error", id: message.id, message: error instanceof Error ? error.message : "OpenTUI interface layout failed" });
|
|
9467
|
+
return;
|
|
9468
|
+
}
|
|
9469
|
+
if (stopping) return;
|
|
9470
|
+
if (message.type === "interface-capture") reply({ type: "interface-state", id: message.id, state: frontend.captureInterfaceState() });
|
|
9471
|
+
else reply({ type: "ack", id: message.id });
|
|
9387
9472
|
return;
|
|
9388
9473
|
}
|
|
9389
9474
|
if (message.type === "state") {
|
|
9390
9475
|
frontend.update(message.snapshot, message.content);
|
|
9391
9476
|
renderer.requestRender();
|
|
9392
|
-
await renderer.idle();
|
|
9393
9477
|
} else if (message.type === "suspend") {
|
|
9394
9478
|
frontend.pauseMedia();
|
|
9395
9479
|
await cursorDefaults.restore();
|
|
@@ -9397,7 +9481,6 @@ async function command(message) {
|
|
|
9397
9481
|
} else if (message.type === "resume") {
|
|
9398
9482
|
await renderer.resume();
|
|
9399
9483
|
renderer.requestRender();
|
|
9400
|
-
await renderer.idle();
|
|
9401
9484
|
await cursorDefaults.restore();
|
|
9402
9485
|
} else if (message.type === "stop") await close();
|
|
9403
9486
|
reply({ type: "ack", id: message.id });
|
|
@@ -9423,10 +9506,10 @@ try {
|
|
|
9423
9506
|
maxFps: 60,
|
|
9424
9507
|
clearOnShutdown: false
|
|
9425
9508
|
});
|
|
9426
|
-
renderer.on(
|
|
9509
|
+
renderer.on(CliRenderEvents11.RENDER_ERROR, (event) => {
|
|
9427
9510
|
void fail(event.error);
|
|
9428
9511
|
});
|
|
9429
|
-
renderer.on(
|
|
9512
|
+
renderer.on(CliRenderEvents11.HANDLER_ERROR, (event) => {
|
|
9430
9513
|
void fail(event.error);
|
|
9431
9514
|
});
|
|
9432
9515
|
renderer.on("error", (event) => {
|
|
@@ -9437,6 +9520,7 @@ try {
|
|
|
9437
9520
|
const controls = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
9438
9521
|
let pending = Promise.resolve();
|
|
9439
9522
|
controls.on("line", (line) => {
|
|
9523
|
+
const layoutDeadline = performance.now() + NATIVE_INTERFACE_LAYOUT_TIMEOUT_MS;
|
|
9440
9524
|
let message;
|
|
9441
9525
|
try {
|
|
9442
9526
|
message = JSON.parse(line);
|
|
@@ -9452,7 +9536,7 @@ try {
|
|
|
9452
9536
|
} catch (error) {
|
|
9453
9537
|
void fail(error);
|
|
9454
9538
|
}
|
|
9455
|
-
} else pending = pending.then(() => command(message)).catch(fail);
|
|
9539
|
+
} else pending = pending.then(() => command(message, layoutDeadline)).catch(fail);
|
|
9456
9540
|
});
|
|
9457
9541
|
controls.on("close", () => {
|
|
9458
9542
|
void pending.then(close).finally(() => process.exit(0));
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnius",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.885",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omnius",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.885",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"image-to-ascii"
|
|
12
12
|
],
|
package/package.json
CHANGED