omnius 1.0.706 → 1.0.707

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
@@ -1083,20 +1083,38 @@ async function fetchLatestVersion() {
1083
1083
  return null;
1084
1084
  }
1085
1085
  }
1086
- async function checkForUpdate(currentVersion, forceCheck = false) {
1086
+ async function queryUpdateStatus(currentVersion, forceCheck = false) {
1087
1087
  const cache8 = loadCache();
1088
1088
  const now2 = Date.now();
1089
1089
  let latest = cache8.latestVersion;
1090
- if (forceCheck || now2 - cache8.lastCheck > CHECK_INTERVAL_MS) {
1091
- latest = await fetchLatestVersion();
1092
- saveCache({ lastCheck: now2, latestVersion: latest });
1090
+ if (forceCheck || now2 - cache8.lastCheck >= UPDATE_CHECK_INTERVAL_MS) {
1091
+ const fetched = await fetchLatestVersion();
1092
+ if (fetched) {
1093
+ latest = fetched;
1094
+ saveCache({ lastCheck: now2, latestVersion: fetched });
1095
+ } else if (!latest || !isNewer(latest, currentVersion)) {
1096
+ return {
1097
+ status: "unavailable",
1098
+ currentVersion,
1099
+ latestVersion: latest
1100
+ };
1101
+ }
1093
1102
  }
1094
- if (!latest) return null;
1095
- if (!isNewer(latest, currentVersion)) return null;
1103
+ if (!latest) {
1104
+ return { status: "unavailable", currentVersion, latestVersion: null };
1105
+ }
1106
+ if (!isNewer(latest, currentVersion)) {
1107
+ return { status: "current", currentVersion, latestVersion: latest };
1108
+ }
1109
+ return { status: "available", currentVersion, latestVersion: latest };
1110
+ }
1111
+ async function checkForUpdate(currentVersion, forceCheck = false) {
1112
+ const result = await queryUpdateStatus(currentVersion, forceCheck);
1113
+ if (result.status !== "available" || !result.latestVersion) return null;
1096
1114
  return {
1097
1115
  updateAvailable: true,
1098
1116
  currentVersion,
1099
- latestVersion: latest
1117
+ latestVersion: result.latestVersion
1100
1118
  };
1101
1119
  }
1102
1120
  function formatUpdateBanner(info) {
@@ -1105,13 +1123,13 @@ function formatUpdateBanner(info) {
1105
1123
  Run: npm i -g ${PACKAGE_NAME}@${info.latestVersion} or use /update in the REPL
1106
1124
  `;
1107
1125
  }
1108
- var PACKAGE_NAME, CHECK_INTERVAL_MS, CACHE_DIR, CACHE_FILE;
1126
+ var PACKAGE_NAME, UPDATE_CHECK_INTERVAL_MS, CACHE_DIR, CACHE_FILE;
1109
1127
  var init_updater = __esm({
1110
1128
  "packages/cli/src/updater.ts"() {
1111
1129
  init_service_version();
1112
1130
  init_update_service();
1113
1131
  PACKAGE_NAME = "omnius";
1114
- CHECK_INTERVAL_MS = 60 * 1e3;
1132
+ UPDATE_CHECK_INTERVAL_MS = 60 * 1e3;
1115
1133
  CACHE_DIR = resolveUpdatePaths().stateDir;
1116
1134
  CACHE_FILE = join3(CACHE_DIR, "registry-check.json");
1117
1135
  }
@@ -745688,10 +745706,10 @@ function contrastTextColor(colorIndex) {
745688
745706
  return luma >= 140 ? 16 : 231;
745689
745707
  }
745690
745708
  function lockFooterRedraws() {
745691
- _globalFooterLock = true;
745709
+ _globalFooterLockDepth += 1;
745692
745710
  }
745693
745711
  function unlockFooterRedraws() {
745694
- _globalFooterLock = false;
745712
+ _globalFooterLockDepth = Math.max(0, _globalFooterLockDepth - 1);
745695
745713
  }
745696
745714
  function refreshThemeVars() {
745697
745715
  PANEL_BG_SEQ = tuiBgSeq();
@@ -745738,7 +745756,7 @@ function setTerminalTitle(task, version5) {
745738
745756
  process.stdout.write(data);
745739
745757
  }
745740
745758
  }
745741
- var EXPERT_TOOL_BASELINES, CONTEXT_SWITCH_OVERHEAD, TURN_PLANNING_OVERHEAD, DEFAULT_TOOL_BASELINE, CODE_READ_CHARS_PER_SEC, PROSE_READ_CHARS_PER_SEC, MIN_CONTENT_FOR_READING, CODE_CONTENT_TOOLS, PROSE_CONTENT_TOOLS, HumanSpeedTracker, PANEL_BG_SEQ, CONTENT_BG_SEQ, BOX_FG, TEXT_PRIMARY, TEXT_DIM, NO_SUB_AGENTS_HEADER_LABEL, HEADER_BUTTON_GLYPH_FG, HEADER_BUTTON_BG, HEADER_BUTTON_FG, HEADER_ACCENT_BOLD_FG, HEADER_BUTTON_HOVER_BG, HEADER_BUTTON_HOVER_FG, HEADER_TELEGRAM_FG, BOX_TL3, BOX_TR3, BOX_BL3, BOX_BR3, BOX_H3, BOX_V3, BOX_BJ, BOX_TJ, ENHANCE_SEG_INNER, ENHANCE_SPIN_FRAMES, _globalFooterLock, RESET4, CURSOR_BLINK_BLOCK, HEADER_BUTTON_LEFT, HEADER_BUTTON_RIGHT, HEADER_BUTTON_SQUARE_PAD, SPONSOR_HEADER_LABEL_MAX, _termTitleWriter, StatusBar;
745759
+ var EXPERT_TOOL_BASELINES, CONTEXT_SWITCH_OVERHEAD, TURN_PLANNING_OVERHEAD, DEFAULT_TOOL_BASELINE, CODE_READ_CHARS_PER_SEC, PROSE_READ_CHARS_PER_SEC, MIN_CONTENT_FOR_READING, CODE_CONTENT_TOOLS, PROSE_CONTENT_TOOLS, HumanSpeedTracker, PANEL_BG_SEQ, CONTENT_BG_SEQ, BOX_FG, TEXT_PRIMARY, TEXT_DIM, NO_SUB_AGENTS_HEADER_LABEL, HEADER_BUTTON_GLYPH_FG, HEADER_BUTTON_BG, HEADER_BUTTON_FG, HEADER_ACCENT_BOLD_FG, HEADER_BUTTON_HOVER_BG, HEADER_BUTTON_HOVER_FG, HEADER_TELEGRAM_FG, BOX_TL3, BOX_TR3, BOX_BL3, BOX_BR3, BOX_H3, BOX_V3, BOX_BJ, BOX_TJ, ENHANCE_SEG_INNER, ENHANCE_SPIN_FRAMES, _globalFooterLockDepth, RESET4, CURSOR_BLINK_BLOCK, HEADER_BUTTON_LEFT, HEADER_BUTTON_RIGHT, HEADER_BUTTON_SQUARE_PAD, SPONSOR_HEADER_LABEL_MAX, _termTitleWriter, StatusBar;
745742
745760
  var init_status_bar = __esm({
745743
745761
  "packages/cli/src/tui/status-bar.ts"() {
745744
745762
  init_render();
@@ -745942,7 +745960,7 @@ var init_status_bar = __esm({
745942
745960
  BOX_TJ = "┬";
745943
745961
  ENHANCE_SEG_INNER = 11;
745944
745962
  ENHANCE_SPIN_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
745945
- _globalFooterLock = false;
745963
+ _globalFooterLockDepth = 0;
745946
745964
  RESET4 = "\x1B[0m";
745947
745965
  CURSOR_BLINK_BLOCK = "\x1B[1 q";
745948
745966
  HEADER_BUTTON_LEFT = "🭁";
@@ -746084,6 +746102,8 @@ var init_status_bar = __esm({
746084
746102
  _mouseTrackingEnabled = false;
746085
746103
  /** Enabled automatically once MouseFilterStream is installed; /mouse off is an emergency escape hatch. */
746086
746104
  _mouseTrackingPreferred = false;
746105
+ /** Prevent every redraw/activity path from re-enabling mouse reports while an inherited child owns the TTY. */
746106
+ _terminalPassthroughDepth = 0;
746087
746107
  /** Legacy keyboard-selection guard; mouse drag selection is terminal-native. */
746088
746108
  _mouseSelecting = false;
746089
746109
  /** Text selection state for keyboard/explicit copy paths; mouse drag is not owned by the TUI. */
@@ -746205,13 +746225,16 @@ var init_status_bar = __esm({
746205
746225
  _inputRedrawScheduled = false;
746206
746226
  /** Suppress hookStdin redraws during Enter processing or overlay operations */
746207
746227
  _suppressStdinRedraw = false;
746228
+ _footerLockDepth = 0;
746208
746229
  /** Lock footer redraws entirely (during install overlay, loading screens, etc.) */
746209
746230
  lockFooter() {
746231
+ this._footerLockDepth += 1;
746210
746232
  this._suppressStdinRedraw = true;
746211
746233
  }
746212
746234
  /** Unlock footer redraws */
746213
746235
  unlockFooter() {
746214
- this._suppressStdinRedraw = false;
746236
+ this._footerLockDepth = Math.max(0, this._footerLockDepth - 1);
746237
+ this._suppressStdinRedraw = this._footerLockDepth > 0;
746215
746238
  }
746216
746239
  /** Begin DEC 2026 synchronized output — terminal buffers all writes */
746217
746240
  syncBegin() {
@@ -747341,7 +747364,7 @@ var init_status_bar = __esm({
747341
747364
  if (this._footerAnimationTimer) return;
747342
747365
  const intervalMs = this._pacing.remote ? this._pacing.footerAnimationIntervalMs : _StatusBar.FOOTER_ANIMATION_INTERVAL_MS;
747343
747366
  this._footerAnimationTimer = setInterval(() => {
747344
- if (!this.active || this._resizing || _globalFooterLock || isOverlayActive()) {
747367
+ if (!this.active || this._resizing || _globalFooterLockDepth > 0 || isOverlayActive()) {
747345
747368
  this._footerPaintCache = null;
747346
747369
  return;
747347
747370
  }
@@ -748366,19 +748389,47 @@ var init_status_bar = __esm({
748366
748389
  this._mouseTrackingPreferred = true;
748367
748390
  this.restoreMouseTracking();
748368
748391
  }
748392
+ /** Unconditionally disable every terminal mouse protocol Omnius may inherit or enable. */
748393
+ writeMouseTrackingOff() {
748394
+ this._mouseTrackingEnabled = false;
748395
+ if (!process.stdout.isTTY) return;
748396
+ this._trueStdoutWrite.call(
748397
+ process.stdout,
748398
+ "\x1B[?9l\x1B[?1000l\x1B[?1001l\x1B[?1002l\x1B[?1003l\x1B[?1005l\x1B[?1006l\x1B[?1015l\x1B[?1016l"
748399
+ );
748400
+ }
748369
748401
  /** Temporarily turn off terminal mouse reporting without changing user preference. */
748370
748402
  suspendMouseTracking() {
748371
748403
  if (!this._mouseTrackingEnabled) return;
748372
- this._mouseTrackingEnabled = false;
748373
- if (process.stdout.isTTY) {
748374
- this._trueStdoutWrite.call(
748375
- process.stdout,
748376
- "\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?1015l"
748404
+ this.writeMouseTrackingOff();
748405
+ }
748406
+ /**
748407
+ * Give an inherited terminal process exclusive ownership of the TTY.
748408
+ * The lease is idempotent and nestable; no redraw, overlay, or queued mouse
748409
+ * activity can restore reporting until the outermost owner releases it.
748410
+ */
748411
+ acquireTerminalPassthrough() {
748412
+ this._terminalPassthroughDepth += 1;
748413
+ this.writeMouseTrackingOff();
748414
+ let released = false;
748415
+ return () => {
748416
+ if (released) return;
748417
+ released = true;
748418
+ this._terminalPassthroughDepth = Math.max(
748419
+ 0,
748420
+ this._terminalPassthroughDepth - 1
748377
748421
  );
748378
- }
748422
+ if (this._terminalPassthroughDepth > 0) return;
748423
+ this.writeMouseTrackingOff();
748424
+ this.restoreMouseTracking();
748425
+ };
748379
748426
  }
748380
748427
  /** Re-apply the current mouse preference after overlays, password prompts, or redraws. */
748381
748428
  restoreMouseTracking() {
748429
+ if (this._terminalPassthroughDepth > 0) {
748430
+ this._mouseTrackingEnabled = false;
748431
+ return;
748432
+ }
748382
748433
  if (!this._mouseTrackingPreferred) {
748383
748434
  this.suspendMouseTracking();
748384
748435
  return;
@@ -751340,13 +751391,13 @@ ${CONTENT_BG_SEQ}`);
751340
751391
  }
751341
751392
  scheduleInputRedraw() {
751342
751393
  if (!this.active || this._resizing) return;
751343
- if (this._suppressStdinRedraw || _globalFooterLock) return;
751394
+ if (this._suppressStdinRedraw || _globalFooterLockDepth > 0) return;
751344
751395
  if (this._inputRedrawScheduled) return;
751345
751396
  this._inputRedrawScheduled = true;
751346
751397
  setImmediate(() => {
751347
751398
  this._inputRedrawScheduled = false;
751348
751399
  if (!this.active || this._resizing) return;
751349
- if (this._suppressStdinRedraw || _globalFooterLock) return;
751400
+ if (this._suppressStdinRedraw || _globalFooterLockDepth > 0) return;
751350
751401
  if (this.writeDepth > 0) {
751351
751402
  this.renderInputRowDuringStream();
751352
751403
  } else {
@@ -753852,19 +753903,36 @@ function runShellCommandAsync(command, opts = {}) {
753852
753903
  if (opts.input !== void 0) {
753853
753904
  child2.stdin?.end(opts.input);
753854
753905
  }
753855
- const timer = setTimeout(() => {
753906
+ let timedOut = false;
753907
+ let killTimer = null;
753908
+ const killChild = (signal) => {
753856
753909
  try {
753857
- child2.kill("SIGTERM");
753910
+ child2.kill(signal);
753858
753911
  } catch {
753859
753912
  }
753860
- reject(new Error(`Command timed out after ${opts.timeoutMs}ms: ${command}`));
753913
+ };
753914
+ const timer = setTimeout(() => {
753915
+ timedOut = true;
753916
+ killChild("SIGTERM");
753917
+ killTimer = setTimeout(() => killChild("SIGKILL"), 2e3);
753918
+ killTimer.unref?.();
753861
753919
  }, opts.timeoutMs ?? 6e4);
753862
753920
  child2.on("error", (err) => {
753863
753921
  clearTimeout(timer);
753922
+ if (killTimer) clearTimeout(killTimer);
753864
753923
  reject(err);
753865
753924
  });
753866
753925
  child2.on("close", (code8, signal) => {
753867
753926
  clearTimeout(timer);
753927
+ if (killTimer) clearTimeout(killTimer);
753928
+ if (timedOut) {
753929
+ reject(
753930
+ new Error(
753931
+ `Command timed out after ${opts.timeoutMs ?? 6e4}ms: ${command}`
753932
+ )
753933
+ );
753934
+ return;
753935
+ }
753868
753936
  if (code8 === 0) {
753869
753937
  resolve110();
753870
753938
  return;
@@ -760338,7 +760406,12 @@ async function startNeovimMode(opts) {
760338
760406
  nvimPath = (await execFileText5("sh", ["-lc", "command -v nvim"], { timeout: 3e3 })).trim();
760339
760407
  if (!nvimPath) throw new Error();
760340
760408
  } catch {
760341
- const installed = await ensureNeovim();
760409
+ const install = () => ensureNeovim();
760410
+ const installed = opts.withTerminalPassthrough ? await opts.withTerminalPassthrough(
760411
+ "Neovim setup",
760412
+ "The system package manager needs terminal access.",
760413
+ install
760414
+ ) : await install();
760342
760415
  if (!installed) {
760343
760416
  return "nvim not found and auto-install failed. Install Neovim: https://neovim.io";
760344
760417
  }
@@ -760765,6 +760838,10 @@ function doCleanup(state5) {
760765
760838
  stdin.removeListener(event, fn);
760766
760839
  }
760767
760840
  state5.installedFilteredListeners = [];
760841
+ process.stdout.write(
760842
+ `\x1B[?9l\x1B[?1000l\x1B[?1001l\x1B[?1002l\x1B[?1003l\x1B[?1005l\x1B[?1006l\x1B[?1015l\x1B[?1016l\x1B[?1004l\x1B[?2004l\x1B[1;${termRows()}r`
760843
+ // reset scroll region to full terminal
760844
+ );
760768
760845
  if (typeof stdin.setRawMode === "function") {
760769
760846
  try {
760770
760847
  stdin.setRawMode(false);
@@ -760782,10 +760859,6 @@ function doCleanup(state5) {
760782
760859
  }
760783
760860
  }
760784
760861
  _state2 = null;
760785
- process.stdout.write(
760786
- `\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[?1015l\x1B[?1004l\x1B[?2004l\x1B[1;${termRows()}r`
760787
- // reset scroll region to full terminal
760788
- );
760789
760862
  try {
760790
760863
  stdin.resume();
760791
760864
  stdin.read();
@@ -769985,7 +770058,7 @@ function setRawInputMode(enabled3) {
769985
770058
  } catch {
769986
770059
  }
769987
770060
  }
769988
- async function withTransientTerminalPrivilegePrompt(ctx3, reason, run4) {
770061
+ async function withTransientTerminalSession(ctx3, heading, reason, terminalElevation, run4) {
769989
770062
  const hasInteractiveTty = Boolean(
769990
770063
  process.stdin.isTTY && process.stdout.isTTY
769991
770064
  );
@@ -769998,6 +770071,7 @@ async function withTransientTerminalPrivilegePrompt(ctx3, reason, run4) {
769998
770071
  "OMNIUS_ELEVATION_MODE"
769999
770072
  );
770000
770073
  const previousElevationMode = process.env["OMNIUS_ELEVATION_MODE"];
770074
+ let releaseTerminal = null;
770001
770075
  try {
770002
770076
  ctx3.lockFooter?.();
770003
770077
  } catch {
@@ -770007,30 +770081,51 @@ async function withTransientTerminalPrivilegePrompt(ctx3, reason, run4) {
770007
770081
  } catch {
770008
770082
  }
770009
770083
  try {
770010
- ctx3.disableMouse?.();
770084
+ releaseTerminal = ctx3.acquireTerminalPassthrough?.() ?? null;
770011
770085
  } catch {
770086
+ releaseTerminal = null;
770087
+ }
770088
+ if (!releaseTerminal) {
770089
+ try {
770090
+ ctx3.disableMouse?.();
770091
+ } catch {
770092
+ }
770012
770093
  }
770013
- setRawInputMode(false);
770014
- process.env["OMNIUS_ELEVATION_MODE"] = "terminal";
770015
770094
  writeDirectTerminal(
770016
- "\x1B[?2026l\x1B[?25h\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l\x1B[r\x1B[0m\x1B[2J\x1B[H"
770095
+ `\x1B[?2026l\x1B[?25h${TERMINAL_MOUSE_OFF}\x1B[r\x1B[0m\x1B[2J\x1B[H`
770017
770096
  );
770018
- writeDirectTerminal(
770019
- `${c3.bold("Omnius needs administrator privileges")}
770097
+ setRawInputMode(false);
770098
+ if (terminalElevation) {
770099
+ process.env["OMNIUS_ELEVATION_MODE"] = "terminal";
770100
+ }
770101
+ writeDirectTerminal(`${c3.bold(heading)}
770020
770102
  ${reason}
770021
770103
 
770022
- `
770023
- );
770104
+ `);
770024
770105
  try {
770025
770106
  return await run4();
770026
770107
  } finally {
770027
- if (hadElevationMode) {
770028
- process.env["OMNIUS_ELEVATION_MODE"] = previousElevationMode;
770029
- } else {
770030
- delete process.env["OMNIUS_ELEVATION_MODE"];
770108
+ if (terminalElevation) {
770109
+ if (hadElevationMode) {
770110
+ process.env["OMNIUS_ELEVATION_MODE"] = previousElevationMode;
770111
+ } else {
770112
+ delete process.env["OMNIUS_ELEVATION_MODE"];
770113
+ }
770031
770114
  }
770115
+ writeDirectTerminal(TERMINAL_MOUSE_OFF);
770032
770116
  setRawInputMode(hadRaw);
770033
770117
  writeDirectTerminal("\x1B[?2026l\x1B[?25h\x1B[r\x1B[0m\x1B[2J\x1B[H");
770118
+ if (releaseTerminal) {
770119
+ try {
770120
+ releaseTerminal();
770121
+ } catch {
770122
+ }
770123
+ } else if (hadMouse) {
770124
+ try {
770125
+ ctx3.enableMouse?.();
770126
+ } catch {
770127
+ }
770128
+ }
770034
770129
  try {
770035
770130
  ctx3.unlockFooter?.();
770036
770131
  } catch {
@@ -770043,21 +770138,21 @@ ${reason}
770043
770138
  ctx3.refreshDisplay?.();
770044
770139
  } catch {
770045
770140
  }
770046
- try {
770047
- if (hadMouse) {
770048
- ctx3.enableMouse?.();
770049
- writeDirectTerminal("\x1B[?1000h\x1B[?1006h");
770050
- } else {
770051
- writeDirectTerminal("\x1B[?1000l\x1B[?1002l\x1B[?1006l");
770052
- }
770053
- } catch {
770054
- }
770055
770141
  try {
770056
770142
  ctx3.showPrompt?.();
770057
770143
  } catch {
770058
770144
  }
770059
770145
  }
770060
770146
  }
770147
+ async function withTransientTerminalPrivilegePrompt(ctx3, reason, run4) {
770148
+ return await withTransientTerminalSession(
770149
+ ctx3,
770150
+ "Omnius needs administrator privileges",
770151
+ reason,
770152
+ true,
770153
+ run4
770154
+ );
770155
+ }
770061
770156
  async function acquireSudoCredentials(ctx3, reason) {
770062
770157
  const isRoot = typeof process.getuid === "function" && process.getuid() === 0;
770063
770158
  if (isRoot) return true;
@@ -770073,19 +770168,28 @@ async function acquireSudoCredentials(ctx3, reason) {
770073
770168
  stdio: hasInteractiveTty ? "inherit" : "pipe"
770074
770169
  }
770075
770170
  );
770171
+ let forceTimer = null;
770076
770172
  const timer = setTimeout(() => {
770077
770173
  try {
770078
770174
  child2.kill("SIGTERM");
770079
770175
  } catch {
770080
770176
  }
770081
- resolve110(false);
770177
+ forceTimer = setTimeout(() => {
770178
+ try {
770179
+ child2.kill("SIGKILL");
770180
+ } catch {
770181
+ }
770182
+ }, 2e3);
770183
+ forceTimer.unref?.();
770082
770184
  }, 6e4);
770083
770185
  onChildExit(child2, (code8) => {
770084
770186
  clearTimeout(timer);
770187
+ if (forceTimer) clearTimeout(forceTimer);
770085
770188
  resolve110(code8 === 0);
770086
770189
  });
770087
770190
  onChildError(child2, () => {
770088
770191
  clearTimeout(timer);
770192
+ if (forceTimer) clearTimeout(forceTimer);
770089
770193
  resolve110(false);
770090
770194
  });
770091
770195
  });
@@ -774031,7 +774135,8 @@ Clone a new voice: /voice clone <wav-file> [name]`);
774031
774135
  onExit: () => {
774032
774136
  renderInfo("Neovim mode exited.");
774033
774137
  },
774034
- onFocusToTUI: ctx3.showPrompt
774138
+ onFocusToTUI: ctx3.showPrompt,
774139
+ withTerminalPassthrough: (heading, reason, run4) => withTransientTerminalSession(ctx3, heading, reason, true, run4)
774035
774140
  });
774036
774141
  if (err) {
774037
774142
  renderError(err);
@@ -774203,12 +774308,22 @@ systemctl --user enable --now omnius-daemon.service || true
774203
774308
  sleep 1
774204
774309
  `;
774205
774310
  const { spawn: spawn48 } = await import("node:child_process");
774206
- await new Promise((resolve110) => {
774207
- const child2 = spawn48("bash", ["-lc", takeover], {
774208
- stdio: "inherit"
774209
- });
774210
- onChildExit(child2, () => resolve110());
774211
- });
774311
+ await withTransientTerminalSession(
774312
+ ctx3,
774313
+ "Daemon ownership migration",
774314
+ "The migration may request administrator privileges.",
774315
+ true,
774316
+ () => new Promise((resolve110, reject) => {
774317
+ const child2 = spawn48("bash", ["-lc", takeover], {
774318
+ stdio: "inherit"
774319
+ });
774320
+ onChildExit(child2, (code8) => {
774321
+ if (code8 === 0) resolve110();
774322
+ else reject(new Error(`migration exited with ${code8}`));
774323
+ });
774324
+ onChildError(child2, reject);
774325
+ })
774326
+ );
774212
774327
  renderInfo("Daemon takeover complete.");
774213
774328
  } catch (e2) {
774214
774329
  renderError(`Takeover failed: ${e2?.message || e2}`);
@@ -783088,7 +783203,13 @@ async function handleEndpoint(arg, ctx3, local = false) {
783088
783203
  process.stdout.write(`${c3.yellow("⚠")} Could not verify
783089
783204
  `);
783090
783205
  if (provider.id === "ollama" && ctx3.rl) {
783091
- const running = await ensureOllamaRunning(normalizedUrl, ctx3.rl);
783206
+ const running = await withTransientTerminalSession(
783207
+ ctx3,
783208
+ "Ollama setup",
783209
+ "Installing or starting Ollama may need terminal access.",
783210
+ true,
783211
+ () => ensureOllamaRunning(normalizedUrl, ctx3.rl)
783212
+ );
783092
783213
  if (running) {
783093
783214
  try {
783094
783215
  const retryResp = await fetch(providerUrl(transport, "models"), {
@@ -785522,8 +785643,8 @@ async function handleUpdate(subcommand, ctx3) {
785522
785643
  )
785523
785644
  );
785524
785645
  renderInfo("Checking for updates...");
785525
- const [info, sudoInfo] = await Promise.all([
785526
- checkForUpdate(currentVersion, true),
785646
+ const [updateCheck, sudoInfo] = await Promise.all([
785647
+ queryUpdateStatus(currentVersion, true),
785527
785648
  (async () => {
785528
785649
  try {
785529
785650
  const prefix = await execA("npm prefix -g", { timeout: 5e3 });
@@ -785539,10 +785660,23 @@ async function handleUpdate(subcommand, ctx3) {
785539
785660
  }
785540
785661
  })()
785541
785662
  ]);
785663
+ const info = updateCheck.status === "available" && updateCheck.latestVersion ? {
785664
+ updateAvailable: true,
785665
+ currentVersion,
785666
+ latestVersion: updateCheck.latestVersion
785667
+ } : null;
785542
785668
  const needsSudo = sudoInfo;
785543
- renderInfo(
785544
- `v${currentVersion} — ${info ? `update available → v${info.latestVersion}` : "up to date"}`
785545
- );
785669
+ if (info) {
785670
+ renderInfo(`v${currentVersion} — update available → v${info.latestVersion}`);
785671
+ } else if (updateCheck.status === "current") {
785672
+ renderInfo(
785673
+ `v${currentVersion} — npm registry latest is v${updateCheck.latestVersion ?? currentVersion} (no newer release visible yet)`
785674
+ );
785675
+ } else {
785676
+ renderWarning(
785677
+ `v${currentVersion} — npm registry check unavailable; Quick Update status is unknown`
785678
+ );
785679
+ }
785546
785680
  let ollamaUpdate = null;
785547
785681
  try {
785548
785682
  const { checkOllamaUpdate: checkOllamaUpdate2 } = await Promise.resolve().then(() => (init_setup(), setup_exports));
@@ -785596,7 +785730,9 @@ async function handleUpdate(subcommand, ctx3) {
785596
785730
  } else {
785597
785731
  items.push({
785598
785732
  key: "info_avail",
785599
- label: c3.dim("Primary package is up to date"),
785733
+ label: c3.dim(
785734
+ updateCheck.status === "unavailable" ? "Primary package registry status unavailable" : `Registry latest: v${updateCheck.latestVersion ?? currentVersion} (no newer release visible yet)`
785735
+ ),
785600
785736
  kind: "info"
785601
785737
  });
785602
785738
  }
@@ -785836,7 +785972,13 @@ async function handleUpdate(subcommand, ctx3) {
785836
785972
  }
785837
785973
  if (menuResult.key === "quick") {
785838
785974
  if (!info) {
785839
- renderInfo(`Omnius v${currentVersion} is already up to date.`);
785975
+ if (updateCheck.status === "unavailable") {
785976
+ renderWarning("Quick Update cannot verify npm right now; retry /update quick.");
785977
+ } else {
785978
+ renderInfo(
785979
+ `No newer release is visible on npm yet (registry latest: v${updateCheck.latestVersion ?? currentVersion}).`
785980
+ );
785981
+ }
785840
785982
  return;
785841
785983
  }
785842
785984
  const updateOverlay = startInstallOverlay(info.latestVersion);
@@ -786526,7 +786668,13 @@ async function switchModel(query, ctx3, local = false) {
786526
786668
  `Model "${query}" not found locally. Pulling from Ollama registry...`
786527
786669
  );
786528
786670
  try {
786529
- await pullModelWithAutoUpdate(query);
786671
+ await withTransientTerminalSession(
786672
+ ctx3,
786673
+ "Ollama model download",
786674
+ `Pulling ${query}; an older Ollama installation may need an update first.`,
786675
+ true,
786676
+ () => pullModelWithAutoUpdate(query)
786677
+ );
786530
786678
  const refreshedModels = await fetchModels(
786531
786679
  ctx3.config.backendUrl,
786532
786680
  ctx3.config.apiKey
@@ -786914,6 +787062,8 @@ async function showExposeDashboard(gateway, rl, ctx3) {
786914
787062
  process.stdin.setRawMode(true);
786915
787063
  }
786916
787064
  process.stdin.resume();
787065
+ ctx3?.suspendMouse?.();
787066
+ writeDirectTerminal(TERMINAL_MOUSE_OFF);
786917
787067
  enterOverlay();
786918
787068
  overlayWrite("\x1B[?1049h\x1B[?25l");
786919
787069
  renderDashboard();
@@ -786952,16 +787102,10 @@ async function showExposeDashboard(gateway, rl, ctx3) {
786952
787102
  }
786953
787103
  }
786954
787104
  };
786955
- if (process.stdout.isTTY) {
786956
- process.stdout.write("\x1B[?1000l\x1B[?1002l\x1B[?1006l");
786957
- }
786958
787105
  process.stdin.on("data", onData);
786959
787106
  const cleanup = () => {
786960
787107
  stopped = true;
786961
787108
  process.stdin.removeListener("data", onData);
786962
- if (process.stdout.isTTY) {
786963
- process.stdout.write("\x1B[?1000h\x1B[?1006h");
786964
- }
786965
787109
  };
786966
787110
  const origResolve = resolve110;
786967
787111
  resolve110 = (() => {
@@ -786995,7 +787139,7 @@ async function showExposeDashboard(gateway, rl, ctx3) {
786995
787139
  renderInfo("Expose gateway stopped.");
786996
787140
  }
786997
787141
  }
786998
- var OMNIUS_PINNED_DEPENDENCY_SPECS, NEXUS_DIRECTORY_ORIGIN, NEXUS_SPONSORS_URL, _sponsorHeartbeatTimer, _lastRegisteredSponsorPayload, __COMMAND_REGISTRY, liveDashboardBlocks, DASH_INTERNAL, localGpuMetricsCache, localGpuMetricsProbeAt, localGpuMetricsProbeInFlight;
787142
+ var OMNIUS_PINNED_DEPENDENCY_SPECS, NEXUS_DIRECTORY_ORIGIN, NEXUS_SPONSORS_URL, _sponsorHeartbeatTimer, _lastRegisteredSponsorPayload, __COMMAND_REGISTRY, TERMINAL_MOUSE_OFF, liveDashboardBlocks, DASH_INTERNAL, localGpuMetricsCache, localGpuMetricsProbeAt, localGpuMetricsProbeInFlight;
786999
787143
  var init_commands = __esm({
787000
787144
  "packages/cli/src/tui/commands.ts"() {
787001
787145
  init_model_picker();
@@ -787045,6 +787189,7 @@ var init_commands = __esm({
787045
787189
  _sponsorHeartbeatTimer = null;
787046
787190
  _lastRegisteredSponsorPayload = null;
787047
787191
  __COMMAND_REGISTRY = /* @__PURE__ */ new Map();
787192
+ TERMINAL_MOUSE_OFF = "\x1B[?9l\x1B[?1000l\x1B[?1001l\x1B[?1002l\x1B[?1003l\x1B[?1005l\x1B[?1006l\x1B[?1015l\x1B[?1016l";
787048
787193
  (function registerNetworkCommandsOnce() {
787049
787194
  if (findSlashCommand("access")) return;
787050
787195
  registerSlashCommand({
@@ -845275,8 +845420,7 @@ ${result.summary}`
845275
845420
  statusBar.suspendContentLayer();
845276
845421
  banner.renderCurrentFrame();
845277
845422
  statusBar.resumeContentLayer();
845278
- statusBar.disableMouseTracking();
845279
- statusBar.enableMouseTracking();
845423
+ statusBar.restoreMouseTracking();
845280
845424
  if (statusBar.isActive) {
845281
845425
  statusBar.refreshDisplay();
845282
845426
  }
@@ -845441,11 +845585,12 @@ ${result.summary}`
845441
845585
  let setupReady = false;
845442
845586
  const setupTasks = [];
845443
845587
  let updateNotified = false;
845444
- checkForUpdate(version5).then((updateInfo) => {
845445
- if (updateInfo) {
845446
- banner.setUpdateAvailable(updateInfo.latestVersion);
845588
+ queryUpdateStatus(version5).then((updateCheck) => {
845589
+ if (updateCheck.status === "available" && updateCheck.latestVersion) {
845590
+ const latestVersion = updateCheck.latestVersion;
845591
+ banner.setUpdateAvailable(latestVersion);
845447
845592
  try {
845448
- statusBar.setUpdateAvailable(updateInfo.latestVersion);
845593
+ statusBar.setUpdateAvailable(latestVersion);
845449
845594
  } catch {
845450
845595
  }
845451
845596
  const vTextLen = ` Omnius v${version5}`.length;
@@ -845460,12 +845605,12 @@ ${result.summary}`
845460
845605
  updateNotified = true;
845461
845606
  if (statusBar?.isActive) statusBar.beginContentWrite();
845462
845607
  renderInfo(
845463
- `Update available: v${updateInfo.currentVersion} → v${c3.bold(c3.green(updateInfo.latestVersion))}. Click version ↑ or run /update.`
845608
+ `Update available: v${updateCheck.currentVersion} → v${c3.bold(c3.green(latestVersion))}. Click version ↑ or run /update.`
845464
845609
  );
845465
845610
  if (statusBar?.isActive) statusBar.endContentWrite();
845466
845611
  };
845467
845612
  if (!isResumed) writeMsg();
845468
- } else {
845613
+ } else if (updateCheck.status === "current") {
845469
845614
  try {
845470
845615
  statusBar.setUpdateAvailable(null);
845471
845616
  } catch {
@@ -845473,26 +845618,27 @@ ${result.summary}`
845473
845618
  }
845474
845619
  }).catch(() => {
845475
845620
  });
845476
- const AUTO_UPDATE_INTERVAL_MS = 5 * 60 * 1e3;
845621
+ const AUTO_UPDATE_INTERVAL_MS = UPDATE_CHECK_INTERVAL_MS;
845477
845622
  const autoUpdateTimer = setInterval(() => {
845478
845623
  const updateMode = savedSettings.updateMode ?? "auto";
845479
845624
  if (updateMode === "manual") return;
845480
- checkForUpdate(version5).then((updateInfo) => {
845481
- if (updateInfo) {
845625
+ queryUpdateStatus(version5).then((updateCheck) => {
845626
+ if (updateCheck.status === "available" && updateCheck.latestVersion) {
845627
+ const latestVersion = updateCheck.latestVersion;
845482
845628
  try {
845483
- statusBar.setUpdateAvailable(updateInfo.latestVersion);
845629
+ statusBar.setUpdateAvailable(latestVersion);
845484
845630
  } catch {
845485
845631
  }
845486
- banner.setUpdateAvailable(updateInfo.latestVersion);
845632
+ banner.setUpdateAvailable(latestVersion);
845487
845633
  if (statusBar?.isActive && !statusBar.isStreaming && !updateNotified) {
845488
845634
  updateNotified = true;
845489
845635
  statusBar.beginContentWrite();
845490
845636
  renderInfo(
845491
- `Update available: v${version5} → v${updateInfo.latestVersion}. Run /update to install.`
845637
+ `Update available: v${version5} → v${latestVersion}. Run /update to install.`
845492
845638
  );
845493
845639
  statusBar.endContentWrite();
845494
845640
  }
845495
- } else {
845641
+ } else if (updateCheck.status === "current") {
845496
845642
  try {
845497
845643
  statusBar.setUpdateAvailable(null);
845498
845644
  } catch {
@@ -846209,7 +846355,7 @@ This is an independent background session started from /background.`
846209
846355
  },
846210
846356
  () => {
846211
846357
  statusBar.cancelMouseIdle();
846212
- statusBar.enableMouseTracking();
846358
+ statusBar.restoreMouseTracking();
846213
846359
  },
846214
846360
  (type, col, row2) => {
846215
846361
  statusBar.handlePointerEvent(type, col, row2);
@@ -846269,7 +846415,7 @@ This is an independent background session started from /background.`
846269
846415
  statusBar.endContentWrite();
846270
846416
  }
846271
846417
  statusBar.cancelMouseIdle();
846272
- statusBar.enableMouseTracking();
846418
+ statusBar.restoreMouseTracking();
846273
846419
  statusBar.refreshHeaderContent();
846274
846420
  }
846275
846421
  },
@@ -846327,8 +846473,7 @@ This is an independent background session started from /background.`
846327
846473
  }
846328
846474
  headerBtnActive = null;
846329
846475
  if (statusBar.isActive) {
846330
- statusBar.disableMouseTracking();
846331
- statusBar.enableMouseTracking();
846476
+ statusBar.restoreMouseTracking();
846332
846477
  banner.renderCurrentFrame();
846333
846478
  statusBar.refreshDisplay();
846334
846479
  }
@@ -847238,12 +847383,37 @@ This is an independent background session started from /background.`
847238
847383
  disableMouse() {
847239
847384
  statusBar.disableMouseTracking();
847240
847385
  },
847386
+ suspendMouse() {
847387
+ statusBar.suspendMouseTracking();
847388
+ },
847241
847389
  enableMouse() {
847242
847390
  statusBar.enableMouseTracking();
847243
847391
  },
847244
847392
  isMouseEnabled() {
847245
847393
  return statusBar.isMouseTrackingEnabled?.() ?? true;
847246
847394
  },
847395
+ acquireTerminalPassthrough() {
847396
+ const stdinWasPaused = process.stdin.isPaused();
847397
+ const releaseMouse = statusBar.acquireTerminalPassthrough();
847398
+ try {
847399
+ rl.pause?.();
847400
+ process.stdin.pause();
847401
+ } catch {
847402
+ }
847403
+ let released = false;
847404
+ return () => {
847405
+ if (released) return;
847406
+ released = true;
847407
+ releaseMouse();
847408
+ if (!stdinWasPaused) {
847409
+ try {
847410
+ rl.resume?.();
847411
+ process.stdin.resume();
847412
+ } catch {
847413
+ }
847414
+ }
847415
+ };
847416
+ },
847247
847417
  stopBanner() {
847248
847418
  banner.stop();
847249
847419
  if (carousel.isRunning) carousel.stop();
@@ -849897,7 +850067,7 @@ ${result.content.slice(0, 2e3)}${result.content.length > 2e3 ? "\n[truncated]" :
849897
850067
  passwordShowPlain = false;
849898
850068
  sessionSudoPassword = input;
849899
850069
  activeTask.runner.setSudoPassword(input);
849900
- statusBar.enableMouseTracking();
850070
+ statusBar.restoreMouseTracking();
849901
850071
  statusBar.setInputStateProvider(() => ({
849902
850072
  line: rl.line ?? "",
849903
850073
  cursor: rl.cursor ?? 0
package/dist/launcher.cjs CHANGED
@@ -8,22 +8,27 @@ const { spawn, spawnSync } = require('node:child_process');
8
8
  const { resolve } = require('node:path');
9
9
 
10
10
  function resetTerminal() {
11
- try { if (process.stdin.isTTY && typeof process.stdin.setRawMode === 'function') process.stdin.setRawMode(false); } catch {}
12
- // Disable mouse tracking, bracketed paste, show cursor, reset attrs, exit alt screen if active
11
+ // Disable reporting before canonical/ECHO mode returns. Reversing this order
12
+ // lets buffered pointer reports appear as literal ESC[<35;x;yM text.
13
13
  const ESC = '\x1B';
14
14
  try {
15
15
  process.stdout.write(
16
16
  ESC + '[?25h' + // show cursor
17
+ ESC + '[?9l' + // legacy X10 mouse off
17
18
  ESC + '[?1000l' + // X10 mouse off
19
+ ESC + '[?1001l' + // highlight tracking off
18
20
  ESC + '[?1002l' + // button-event mouse off
19
21
  ESC + '[?1003l' + // any-event mouse off
22
+ ESC + '[?1005l' + // UTF-8 mouse encoding off
20
23
  ESC + '[?1006l' + // SGR mouse off
21
24
  ESC + '[?1015l' + // urxvt mouse off
25
+ ESC + '[?1016l' + // SGR pixel mouse off
22
26
  ESC + '[?2004l' + // bracketed paste off
23
27
  ESC + '[?1049l' + // exit alt screen
24
28
  ESC + '[0m' // reset attributes
25
29
  );
26
30
  } catch {}
31
+ try { if (process.stdin.isTTY && typeof process.stdin.setRawMode === 'function') process.stdin.setRawMode(false); } catch {}
27
32
  // stty sane (POSIX)
28
33
  if (process.platform !== 'win32' && process.stdin.isTTY) {
29
34
  try { spawnSync('stty', ['sane'], { stdio: 'inherit' }); } catch {}
@@ -296726,7 +296726,7 @@ import { basename as basename8, dirname as dirname9, join as join17 } from "node
296726
296726
 
296727
296727
  // packages/cli/src/updater.ts
296728
296728
  import { join as join16 } from "node:path";
296729
- var CHECK_INTERVAL_MS = 60 * 1e3;
296729
+ var UPDATE_CHECK_INTERVAL_MS = 60 * 1e3;
296730
296730
  var CACHE_DIR = resolveUpdatePaths().stateDir;
296731
296731
  var CACHE_FILE = join16(CACHE_DIR, "registry-check.json");
296732
296732
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.706",
3
+ "version": "1.0.707",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.706",
9
+ "version": "1.0.707",
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.706",
3
+ "version": "1.0.707",
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",