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 CHANGED
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/index.js
3
- size: 38500034 bytes
4
- sha256: 99cdcb97523ccbaaab5fe62d1532b144a9a888895a39cc7c1e65aafe07f977b9
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 CliRenderEvents10, NativeSession, RGBA as RGBA4, createCliRenderer } from "@opentui/core";
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
- const height = Math.max(1, Math.min(8, this.editor.editorView.getTotalVirtualLineCount(), this.renderer.terminalHeight - 8));
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
- await renderer.idle();
9379
- reply({ type: "interface-state", id: message.id, state: frontend.captureInterfaceState() });
9380
- return;
9381
- }
9382
- if (message.type === "interface-restore") {
9383
- frontend.restoreInterfaceState(message.state);
9384
- renderer.requestRender();
9385
- await renderer.idle();
9386
- reply({ type: "ack", id: message.id });
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(CliRenderEvents10.RENDER_ERROR, (event) => {
9509
+ renderer.on(CliRenderEvents11.RENDER_ERROR, (event) => {
9427
9510
  void fail(event.error);
9428
9511
  });
9429
- renderer.on(CliRenderEvents10.HANDLER_ERROR, (event) => {
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));
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.884",
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.884",
9
+ "version": "1.0.885",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.884",
3
+ "version": "1.0.885",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/library.js",