omnius 1.0.510 → 1.0.512

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
@@ -31906,7 +31906,7 @@ async function _collectSysMetrics() {
31906
31906
  } catch {}
31907
31907
  try {
31908
31908
  var cp = await import('node:child_process');
31909
- var smiOut = cp.execSync('nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,name --format=csv,noheader,nounits 2>/dev/null', { encoding: 'utf8', timeout: 3000 });
31909
+ var smiOut = cp.execSync('nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,name --format=csv,noheader,nounits 2>/dev/null', { encoding: 'utf8', timeout: 8000 });
31910
31910
  var smiLine = smiOut.trim().split('\\n')[0];
31911
31911
  if (smiLine) {
31912
31912
  var sp = smiLine.split(',').map(function(s) { return s.trim(); });
@@ -31917,7 +31917,21 @@ async function _collectSysMetrics() {
31917
31917
  gpuInfo.name = sp[3] || '';
31918
31918
  gpuInfo.vramUtilization = gpuInfo.vramTotalMB > 0 ? Math.round((gpuInfo.vramUsedMB / gpuInfo.vramTotalMB) * 100) : 0;
31919
31919
  }
31920
- } catch {}
31920
+ } catch {
31921
+ // nvidia-smi can be killed or time out under tight memory pressure even
31922
+ // when a GPU is present (e.g. Ollama actively holding VRAM). Fall back to a
31923
+ // cheap /dev/nvidia* node probe so we don't falsely report the GPU as
31924
+ // unavailable on systems that clearly have an NVIDIA device.
31925
+ try {
31926
+ var fsProbe = await import('node:fs');
31927
+ var devEntries = fsProbe.readdirSync('/dev');
31928
+ var nvidiaPresent = devEntries.some(function(d) { return /^nvidiad+$/.test(d); });
31929
+ if (nvidiaPresent) {
31930
+ gpuInfo.available = true;
31931
+ if (!gpuInfo.name) gpuInfo.name = 'NVIDIA GPU (nvidia-smi probe failed)';
31932
+ }
31933
+ } catch {}
31934
+ }
31921
31935
  _sysMetricsCache = {
31922
31936
  cpu: { utilization: Math.min(100, Math.round((loads[0] / cores) * 100)), cores: cores, model: cpuModel },
31923
31937
  memory: { utilization: Math.round((usedMem / totalMem) * 100), totalGB: Math.round((totalMem / (1024*1024*1024)) * 10) / 10, usedGB: Math.round((usedMem / (1024*1024*1024)) * 10) / 10 },
@@ -34279,7 +34293,7 @@ async function handleCmd(cmd) {
34279
34293
  } catch {}
34280
34294
  try {
34281
34295
  var cp = await import('node:child_process');
34282
- var smiOut = cp.execSync('nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,name --format=csv,noheader,nounits 2>/dev/null', { encoding: 'utf8', timeout: 3000 });
34296
+ var smiOut = cp.execSync('nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,name --format=csv,noheader,nounits 2>/dev/null', { encoding: 'utf8', timeout: 8000 });
34283
34297
  var smiLine = smiOut.trim().split('\\n')[0];
34284
34298
  if (smiLine) {
34285
34299
  var sp = smiLine.split(',').map(function(s) { return s.trim(); });
@@ -34290,7 +34304,27 @@ async function handleCmd(cmd) {
34290
34304
  gpuInfo.name = sp[3] || '';
34291
34305
  gpuInfo.vramUtilization = gpuInfo.vramTotalMB > 0 ? Math.round((gpuInfo.vramUsedMB / gpuInfo.vramTotalMB) * 100) : 0;
34292
34306
  }
34293
- } catch (ge) { /* no GPU */ }
34307
+ } catch {
34308
+ // nvidia-smi can be killed or time out under tight memory pressure
34309
+ // even when a GPU is present (e.g. Ollama holding VRAM). Fall back to
34310
+ // a cheap /dev/nvidia* node probe so we don't falsely report the GPU
34311
+ // as unavailable on systems that clearly have an NVIDIA device.
34312
+ try {
34313
+ var fsProbe = await import('node:fs');
34314
+ var devEntries = fsProbe.readdirSync('/dev');
34315
+ var nvidiaPresent = devEntries.some(function(d) { return /^nvidiad+$/.test(d); });
34316
+ // Also accept the nvidia-smi binary existing on PATH as a
34317
+ // permissive signal — on tight-memory systems the driver is
34318
+ // loaded (so the binary is present) even when a live query is
34319
+ // killed. Either signal means a GPU is genuinely available.
34320
+ var smiBin = '';
34321
+ try { smiBin = cp.execSync('command -v nvidia-smi 2>/dev/null', { encoding: 'utf8', timeout: 3000 }).trim(); } catch {}
34322
+ if (nvidiaPresent || !!smiBin) {
34323
+ gpuInfo.available = true;
34324
+ if (!gpuInfo.name) gpuInfo.name = 'NVIDIA GPU (nvidia-smi probe failed)';
34325
+ }
34326
+ } catch {}
34327
+ }
34294
34328
  var cpuModel = '';
34295
34329
  try { var cpuInfoArr = os.cpus(); if (cpuInfoArr.length > 0) cpuModel = cpuInfoArr[0].model || ''; } catch {}
34296
34330
  var metricsPayload = {
@@ -602900,19 +602934,22 @@ ${description}`
602900
602934
  }
602901
602935
  const requestMessages = effectiveThink ? cleanedMessages : injectNoThinkDirective(cleanedMessages);
602902
602936
  const responseFormat = request.responseFormat ?? request.response_format;
602937
+ const isOllama = shouldUseOllamaPoolForBaseUrl(this.baseUrl);
602903
602938
  const body = {
602904
602939
  model: this.model,
602905
602940
  messages: requestMessages,
602906
602941
  tools: request.tools,
602907
602942
  temperature: request.temperature,
602908
- max_tokens: effectiveMaxTokens,
602909
- think: effectiveThink
602943
+ max_tokens: effectiveMaxTokens
602910
602944
  };
602945
+ if (isOllama) {
602946
+ body["think"] = effectiveThink;
602947
+ }
602911
602948
  if (responseFormat !== void 0) {
602912
602949
  body["response_format"] = responseFormat;
602913
602950
  }
602914
602951
  const reqNumCtx = request.numCtx ?? request.num_ctx;
602915
- if (Number.isFinite(reqNumCtx) && (reqNumCtx ?? 0) > 0) {
602952
+ if (isOllama && Number.isFinite(reqNumCtx) && (reqNumCtx ?? 0) > 0) {
602916
602953
  const opts = body["options"] ?? {};
602917
602954
  opts["num_ctx"] = reqNumCtx;
602918
602955
  body["options"] = opts;
@@ -638602,9 +638639,8 @@ var init_status_bar = __esm({
638602
638639
  _toolCalls = 0;
638603
638640
  _turns = 0;
638604
638641
  /** Debug data panel overlay state. */
638605
- _debugPanelOpen = false;
638606
- _debugPanelPage = 0;
638607
- _debugPanelPages = 4;
638642
+ /** Bottom-row page: -1 = compact metrics, 0-3 = debug panels (token, model, SNR, cost) */
638643
+ _debugPanelPage = -1;
638608
638644
  active = false;
638609
638645
  scrollRegionTop = 1;
638610
638646
  // ── Agent View Multiplexing (WO-NA1) ──
@@ -640788,6 +640824,14 @@ var init_status_bar = __esm({
640788
640824
  }
640789
640825
  return;
640790
640826
  }
640827
+ if (type === "press" && this._footerMetricsVisible) {
640828
+ const metricsRow = layout().footerMetrics;
640829
+ if (row === metricsRow && col >= termCols() - 5) {
640830
+ this.cycleDebugPanelPage();
640831
+ this.renderFooterAndPositionInput();
640832
+ return;
640833
+ }
640834
+ }
640791
640835
  if (type === "press" && this._scrollBtnRegion && row === this._scrollBtnRegion.row) {
640792
640836
  if (col >= this._scrollBtnRegion.start && col <= this._scrollBtnRegion.end) {
640793
640837
  this.jumpToLive();
@@ -641101,9 +641145,6 @@ var init_status_bar = __esm({
641101
641145
  );
641102
641146
  buf += `\x1B[${pos.bufferRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildInputBoxBottom(w)}${PANEL_BG_SEQ}`;
641103
641147
  if (pos.metricsRow > 0) {
641104
- if (this._debugPanelOpen && pos.metricsRow > 1) {
641105
- buf += `\x1B[${pos.metricsRow - 1};1H${PANEL_BG_SEQ}\x1B[2K${this.buildDebugPanel()}${RESET4}${PANEL_BG_SEQ}`;
641106
- }
641107
641148
  buf += `\x1B[${pos.metricsRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildMetricsLine()}${RESET4}${PANEL_BG_SEQ}`;
641108
641149
  }
641109
641150
  buf += `\x1B[?7h\x1B[${pos.inputStartRow + 1};1H`;
@@ -642158,16 +642199,66 @@ ${CONTENT_BG_SEQ}`);
642158
642199
  const pctColor = pct2 > 50 ? 120 : pct2 > 20 ? 222 : 210;
642159
642200
  ctxStr = `${bar} \x1B[38;5;${pctColor}m${pct2}%\x1B[0m`;
642160
642201
  }
642161
- const arrow = this._debugPanelOpen ? `\x1B[38;5;183m▼\x1B[0m` : `\x1B[38;5;240m▶\x1B[0m`;
642162
- const rightParts = [uptimeStr];
642163
- if (ctxStr) rightParts.push(ctxStr);
642164
- rightParts.push(arrow);
642165
- const rightSide = rightParts.join(" ");
642202
+ const arrow = `\x1B[38;5;240m▶\x1B[0m`;
642203
+ let rightSide;
642204
+ let pageLabel;
642205
+ if (this._debugPanelPage === -1) {
642206
+ const body = [uptimeStr];
642207
+ if (ctxStr) body.push(ctxStr);
642208
+ rightSide = body.join(" ");
642209
+ pageLabel = "";
642210
+ } else {
642211
+ const m3 = this.metrics;
642212
+ const pages = [];
642213
+ const tokInRaw = m3.promptTokens > 0 ? m3.promptTokens + (this.isStreaming ? this._streamingTokens : 0) : Math.max(m3.estimatedContextTokens, 0);
642214
+ const effectiveOut = this.effectiveCompletionTokens;
642215
+ const tokOutRaw = effectiveOut > 0 ? effectiveOut : Math.ceil(
642216
+ m3.totalTokens > 0 ? m3.totalTokens - m3.promptTokens : m3.estimatedContextTokens * 0.3
642217
+ );
642218
+ const tpsStr = _StatusBar.formatTokensPerSecond(this._tokensPerSecond);
642219
+ pages.push(
642220
+ `\x1B[38;5;117m↑${_StatusBar.formatInteger(tokInRaw)}\x1B[0m \x1B[38;5;151m↓${_StatusBar.formatInteger(tokOutRaw)}\x1B[0m \x1B[38;5;222mt/s ${tpsStr}\x1B[0m`
642221
+ );
642222
+ const model = this._modelName || "unknown";
642223
+ const backend = this._backend || "?";
642224
+ const gpu = this._gpuName || "none";
642225
+ pages.push(
642226
+ `\x1B[38;5;183m${model}\x1B[0m \x1B[38;5;240m${backend}\x1B[0m \x1B[38;5;120mGPU ${gpu}\x1B[0m`
642227
+ );
642228
+ if (this._snr) {
642229
+ const snrPct = Math.round(this._snr.ratio * 100);
642230
+ const snrColor = snrPct >= 70 ? 120 : snrPct >= 40 ? 222 : 210;
642231
+ const dPrime = this._snr.dPrime.toFixed(1);
642232
+ const capWarn = this._snr.capacityWarning ? " \x1B[38;5;210m!CAP\x1B[0m" : "";
642233
+ pages.push(
642234
+ `SNR \x1B[38;5;${snrColor}m${snrPct}%\x1B[0m d'${dPrime}${capWarn}`
642235
+ );
642236
+ } else {
642237
+ pages.push("SNR --");
642238
+ }
642239
+ {
642240
+ let costStr = "Cost --";
642241
+ if (m3.hasPricing && m3.estimatedCost !== void 0) {
642242
+ costStr = m3.estimatedCost < 0.01 ? `Cost \x1B[38;5;222m$${m3.estimatedCost.toFixed(4)}\x1B[0m` : m3.estimatedCost < 1 ? `Cost \x1B[38;5;222m$${m3.estimatedCost.toFixed(3)}\x1B[0m` : `Cost \x1B[38;5;222m$${m3.estimatedCost.toFixed(2)}\x1B[0m`;
642243
+ }
642244
+ const recStr = this._recording ? " \x1B[38;5;210m● REC\x1B[0m" : "";
642245
+ pages.push(costStr + recStr);
642246
+ }
642247
+ while (pages.length < 4) pages.push("--");
642248
+ const idx = Math.min(this._debugPanelPage, pages.length - 1);
642249
+ rightSide = pages[idx] ?? "--";
642250
+ pageLabel = "";
642251
+ }
642252
+ rightSide = rightSide ? rightSide + " " : "";
642253
+ const pageTotal = 5;
642254
+ const pageIdx = this._debugPanelPage + 2;
642255
+ const indicator = `\x1B[38;5;240m[${pageIdx > 5 ? 1 : pageIdx}/${pageTotal}]\x1B[0m `;
642256
+ const fullRight = pageLabel + rightSide + indicator + arrow;
642166
642257
  const stageW = stripAnsi(stageBlock).length;
642167
- const rightW = stripAnsi(rightSide).length;
642258
+ const rightW = stripAnsi(fullRight).length;
642168
642259
  const padNeeded = termWidth - stageW - rightW - 1;
642169
642260
  const gap = padNeeded > 0 ? " ".repeat(padNeeded) : " ";
642170
- return (stageBlock + gap + rightSide).replace(
642261
+ return (stageBlock + gap + fullRight).replace(
642171
642262
  /\x1B\[0m/g,
642172
642263
  `\x1B[0m${PANEL_BG_SEQ}`
642173
642264
  );
@@ -642183,60 +642274,9 @@ ${CONTENT_BG_SEQ}`);
642183
642274
  if (m2 > 0) return `${m2}m ${s2}s`;
642184
642275
  return `${s2}s`;
642185
642276
  }
642186
- /** Toggle the floating debug panel on/off */
642187
- toggleDebugPanel() {
642188
- this._debugPanelOpen = !this._debugPanelOpen;
642189
- this._debugPanelPage = 0;
642190
- }
642191
- /** Cycle to next debug panel page */
642277
+ /** Cycle to next bottom-row page (-1→0→1→2→3→-1) */
642192
642278
  cycleDebugPanelPage() {
642193
- this._debugPanelPage = (this._debugPanelPage + 1) % this._debugPanelPages;
642194
- }
642195
- /** Build the floating debug panel content (rendered above metrics row) */
642196
- buildDebugPanel() {
642197
- const m2 = this.metrics;
642198
- const pages = [];
642199
- const tokInRaw = m2.promptTokens > 0 ? m2.promptTokens + (this.isStreaming ? this._streamingTokens : 0) : Math.max(m2.estimatedContextTokens, 0);
642200
- const effectiveOut = this.effectiveCompletionTokens;
642201
- const tokOutRaw = effectiveOut > 0 ? effectiveOut : Math.ceil(
642202
- m2.totalTokens > 0 ? m2.totalTokens - m2.promptTokens : m2.estimatedContextTokens * 0.3
642203
- );
642204
- const tpsStr = _StatusBar.formatTokensPerSecond(this._tokensPerSecond);
642205
- pages.push(
642206
- `\x1B[38;5;117m↑${_StatusBar.formatInteger(tokInRaw)}\x1B[0m \x1B[38;5;151m↓${_StatusBar.formatInteger(tokOutRaw)}\x1B[0m \x1B[38;5;222mt/s ${tpsStr}\x1B[0m`
642207
- );
642208
- const model = this._modelName || "unknown";
642209
- const backend = this._backend || "?";
642210
- const gpu = this._gpuName || "none";
642211
- pages.push(
642212
- `\x1B[38;5;183m${model}\x1B[0m \x1B[38;5;240m${backend}\x1B[0m \x1B[38;5;120mGPU ${gpu}\x1B[0m`
642213
- );
642214
- if (this._snr) {
642215
- const snrPct = Math.round(this._snr.ratio * 100);
642216
- const snrColor = snrPct >= 70 ? 120 : snrPct >= 40 ? 222 : 210;
642217
- const dPrime = this._snr.dPrime.toFixed(1);
642218
- const capWarn = this._snr.capacityWarning ? " \x1B[38;5;210m!CAP\x1B[0m" : "";
642219
- pages.push(
642220
- `SNR \x1B[38;5;${snrColor}m${snrPct}%\x1B[0m d'${dPrime}${capWarn}`
642221
- );
642222
- } else {
642223
- pages.push("SNR --");
642224
- }
642225
- {
642226
- let costStr = "Cost --";
642227
- if (m2.hasPricing && m2.estimatedCost !== void 0) {
642228
- costStr = m2.estimatedCost < 0.01 ? `Cost \x1B[38;5;222m$${m2.estimatedCost.toFixed(4)}\x1B[0m` : m2.estimatedCost < 1 ? `Cost \x1B[38;5;222m$${m2.estimatedCost.toFixed(3)}\x1B[0m` : `Cost \x1B[38;5;222m$${m2.estimatedCost.toFixed(2)}\x1B[0m`;
642229
- }
642230
- const recStr = this._recording ? " \x1B[38;5;210m● REC\x1B[0m" : "";
642231
- pages.push(costStr + recStr);
642232
- }
642233
- while (pages.length < this._debugPanelPages) {
642234
- pages.push("--");
642235
- }
642236
- const page2 = Math.min(this._debugPanelPage, pages.length - 1);
642237
- const content = pages[page2] ?? "--";
642238
- const pageInd = `\x1B[38;5;240m[${page2 + 1}/${pages.length}]\x1B[0m`;
642239
- return `${content} ${pageInd}`;
642279
+ this._debugPanelPage = this._debugPanelPage >= 3 ? -1 : this._debugPanelPage + 1;
642240
642280
  }
642241
642281
  // -------------------------------------------------------------------------
642242
642282
  // Private
@@ -642806,9 +642846,6 @@ ${CONTENT_BG_SEQ}`);
642806
642846
  buf += `\x1B[${pos.bufferRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildInputBoxBottom(w)}${PANEL_BG_SEQ}`;
642807
642847
  }
642808
642848
  if (pos.metricsRow > 0) {
642809
- if (this._debugPanelOpen && pos.metricsRow > 1) {
642810
- buf += `\x1B[${pos.metricsRow - 1};1H${PANEL_BG_SEQ}\x1B[2K${this.buildDebugPanel()}${RESET4}${PANEL_BG_SEQ}`;
642811
- }
642812
642849
  buf += `\x1B[${pos.metricsRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildMetricsLine()}${RESET4}${PANEL_BG_SEQ}`;
642813
642850
  }
642814
642851
  buf += "\x1B[?7h";
@@ -642861,9 +642898,6 @@ ${CONTENT_BG_SEQ}`);
642861
642898
  buf += `\x1B[${pos.bufferRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildInputBoxBottom(w)}`;
642862
642899
  }
642863
642900
  if (pos.metricsRow > 0) {
642864
- if (this._debugPanelOpen && pos.metricsRow > 1) {
642865
- buf += `\x1B[${pos.metricsRow - 1};1H${PANEL_BG_SEQ}\x1B[2K${this.buildDebugPanel()}${RESET4}${PANEL_BG_SEQ}`;
642866
- }
642867
642901
  buf += `\x1B[${pos.metricsRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildMetricsLine()}${RESET4}${PANEL_BG_SEQ}`;
642868
642902
  }
642869
642903
  buf += "\x1B[?7h\x1B8" + // DEC restore cursor
@@ -642942,9 +642976,6 @@ ${CONTENT_BG_SEQ}`);
642942
642976
  }
642943
642977
  buf += `\x1B[${pos.bufferRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildInputBoxBottom(w)}`;
642944
642978
  if (pos.metricsRow > 0) {
642945
- if (this._debugPanelOpen && pos.metricsRow > 1) {
642946
- buf += `\x1B[${pos.metricsRow - 1};1H${PANEL_BG_SEQ}\x1B[2K${this.buildDebugPanel()}${RESET4}${PANEL_BG_SEQ}`;
642947
- }
642948
642979
  buf += `\x1B[${pos.metricsRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildMetricsLine()}${RESET4}`;
642949
642980
  }
642950
642981
  buf += "\x1B[?7h";
@@ -642990,9 +643021,6 @@ ${CONTENT_BG_SEQ}`);
642990
643021
  }
642991
643022
  buf += `\x1B[${pos.bufferRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildInputBoxBottom(w)}${PANEL_BG_SEQ}`;
642992
643023
  if (pos.metricsRow > 0) {
642993
- if (this._debugPanelOpen && pos.metricsRow > 1) {
642994
- buf += `\x1B[${pos.metricsRow - 1};1H${PANEL_BG_SEQ}\x1B[2K${this.buildDebugPanel()}${RESET4}${PANEL_BG_SEQ}`;
642995
- }
642996
643024
  buf += `\x1B[${pos.metricsRow};1H${PANEL_BG_SEQ}\x1B[2K${this.buildMetricsLine()}${RESET4}${PANEL_BG_SEQ}`;
642997
643025
  }
642998
643026
  buf += "\x1B[?7h\x1B8\x1B[?25l";
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.510",
3
+ "version": "1.0.512",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.510",
9
+ "version": "1.0.512",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
@@ -2579,9 +2579,9 @@
2579
2579
  }
2580
2580
  },
2581
2581
  "node_modules/bare-path": {
2582
- "version": "3.1.0",
2583
- "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.0.tgz",
2584
- "integrity": "sha512-322oSBHOhMhOm2CVwn7b3+gWQqwzSgIY4gNpKKb+Ha5jx2dEl9ClOgz/SK57DwuDql8YQg8JRpb9U0o8K3pW9g==",
2582
+ "version": "3.1.1",
2583
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz",
2584
+ "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==",
2585
2585
  "license": "Apache-2.0",
2586
2586
  "optional": true
2587
2587
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.510",
3
+ "version": "1.0.512",
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/index.js",