omnius 1.0.121 → 1.0.127

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
@@ -558153,7 +558153,7 @@ function ensureVenvForTranscribeCli() {
558153
558153
  }
558154
558154
  }
558155
558155
  function ensureTranscribeCliBackground() {
558156
- if (_bgInstallPromise) return;
558156
+ if (_bgInstallPromise) return _bgInstallPromise;
558157
558157
  _bgInstallPromise = (async () => {
558158
558158
  try {
558159
558159
  const globalRoot = execSync46("npm root -g", {
@@ -558177,6 +558177,7 @@ function ensureTranscribeCliBackground() {
558177
558177
  return false;
558178
558178
  }
558179
558179
  })();
558180
+ return _bgInstallPromise;
558180
558181
  }
558181
558182
  async function waitForTranscribeCli() {
558182
558183
  if (_bgInstallPromise) {
@@ -579918,6 +579919,158 @@ function ensurePythonVenv() {
579918
579919
  }
579919
579920
  process.stdout.write(` ${c3.cyan("⚠")} Could not install python3-venv. Install manually: sudo apt install python3-venv
579920
579921
 
579922
+ `);
579923
+ }
579924
+ async function pretuiSudoPasswordCallback(rl) {
579925
+ process.stdout.write(` ${c3.dim("Some dependencies need administrator access to install system packages.")}
579926
+ `);
579927
+ const pw2 = await askSecret(rl, ` ${c3.bold("sudo password")} ${c3.dim("(empty to skip this dep)")}: `);
579928
+ if (!pw2) {
579929
+ process.stdout.write(` ${c3.dim("Skipped — install can be re-attempted later via /vision-status or by re-running omnius setup.")}
579930
+
579931
+ `);
579932
+ return null;
579933
+ }
579934
+ return pw2;
579935
+ }
579936
+ async function runOptionalDepsSetup(rl) {
579937
+ const canPrompt = process.stdout.isTTY && process.stdin.isTTY && process.env["CI"] !== "true" && process.env["OMNIUS_SETUP_AUTO_CONTINUE"] !== "1";
579938
+ if (!canPrompt) {
579939
+ process.stdout.write(` ${c3.dim("Non-interactive mode — skipping optional dependency prompts.")}
579940
+
579941
+ `);
579942
+ return;
579943
+ }
579944
+ const logTo = (label) => (msg) => {
579945
+ process.stdout.write(` ${c3.dim(`[${label}]`)} ${msg}
579946
+ `);
579947
+ };
579948
+ process.stdout.write(` ${c3.bold("Optional dependencies")}
579949
+ `);
579950
+ process.stdout.write(` ${c3.dim("These add features (vision/OCR, voice tunnel, live transcription). You can install them now or later via the in-TUI commands.")}
579951
+
579952
+ `);
579953
+ const askVision = await ask(rl, ` ${c3.bold("Install vision / OCR deps?")} (Y/n) `);
579954
+ if (askVision.toLowerCase() !== "n") {
579955
+ process.stdout.write(` ${c3.cyan("●")} Installing vision + OCR deps...
579956
+ `);
579957
+ try {
579958
+ await ensureVisionDeps(
579959
+ logTo("vision"),
579960
+ () => pretuiSudoPasswordCallback(rl)
579961
+ );
579962
+ process.stdout.write(` ${c3.green("✔")} Vision deps complete.
579963
+
579964
+ `);
579965
+ } catch (err) {
579966
+ process.stdout.write(` ${c3.cyan("⚠")} Vision deps install hit an error: ${err instanceof Error ? err.message : String(err)}
579967
+ `);
579968
+ process.stdout.write(` ${c3.dim("Continuing — vision features may be limited.")}
579969
+
579970
+ `);
579971
+ }
579972
+ } else {
579973
+ process.stdout.write(` ${c3.dim("Skipped vision deps.")}
579974
+
579975
+ `);
579976
+ }
579977
+ const askCloudflared = await ask(rl, ` ${c3.bold("Install cloudflared for voice tunnel?")} (Y/n) `);
579978
+ if (askCloudflared.toLowerCase() !== "n") {
579979
+ process.stdout.write(` ${c3.cyan("●")} Installing cloudflared...
579980
+ `);
579981
+ const ok3 = await ensureCloudflaredBackground((msg) => {
579982
+ process.stdout.write(` ${c3.dim("[cloudflared]")} ${msg}
579983
+ `);
579984
+ });
579985
+ if (ok3) {
579986
+ process.stdout.write(` ${c3.green("✔")} Cloudflared ready.
579987
+
579988
+ `);
579989
+ } else {
579990
+ process.stdout.write(` ${c3.cyan("⚠")} Cloudflared install did not complete — voice tunnel will be unavailable.
579991
+
579992
+ `);
579993
+ }
579994
+ } else {
579995
+ process.stdout.write(` ${c3.dim("Skipped cloudflared.")}
579996
+
579997
+ `);
579998
+ }
579999
+ const askTranscribe = await ask(rl, ` ${c3.bold("Install transcribe-cli for live transcription?")} (Y/n) `);
580000
+ if (askTranscribe.toLowerCase() !== "n") {
580001
+ process.stdout.write(` ${c3.cyan("●")} Installing transcribe-cli (npm i -g transcribe-cli)...
580002
+ `);
580003
+ try {
580004
+ const ok3 = await ensureTranscribeCliBackground();
580005
+ if (ok3) {
580006
+ process.stdout.write(` ${c3.green("✔")} Transcribe-CLI installed.
580007
+
580008
+ `);
580009
+ } else {
580010
+ process.stdout.write(` ${c3.cyan("⚠")} transcribe-cli install did not complete — live transcription will be unavailable.
580011
+
580012
+ `);
580013
+ }
580014
+ } catch (err) {
580015
+ process.stdout.write(` ${c3.cyan("⚠")} transcribe-cli install hit an error: ${err instanceof Error ? err.message : String(err)}
580016
+
580017
+ `);
580018
+ }
580019
+ } else {
580020
+ process.stdout.write(` ${c3.dim("Skipped transcribe-cli.")}
580021
+
580022
+ `);
580023
+ }
580024
+ }
580025
+ function writeSetupIncompleteWalkthrough(cc) {
580026
+ process.stdout.write(`
580027
+ ${cc.bold("Setup incomplete — no model configured.")}
580028
+ `);
580029
+ process.stdout.write(` ${cc.dim("Nothing was saved. The primary TUI was NOT started so you can finish setup on your terms.")}
580030
+
580031
+ `);
580032
+ process.stdout.write(` ${cc.bold("To finish setup, pick one of:")}
580033
+
580034
+ `);
580035
+ process.stdout.write(` ${cc.cyan("1.")} ${cc.bold("Use a local Ollama model")}
580036
+ `);
580037
+ process.stdout.write(` ${cc.dim("# install / start Ollama")}
580038
+ `);
580039
+ process.stdout.write(` curl -fsSL https://ollama.com/install.sh | sh
580040
+ `);
580041
+ process.stdout.write(` ollama serve &
580042
+ `);
580043
+ process.stdout.write(` ${cc.dim("# pull a tool-capable model (any of these works)")}
580044
+ `);
580045
+ process.stdout.write(` ollama pull qwen3.6:35b ${cc.dim("# recommended on a 32GB+ VRAM rig")}
580046
+ `);
580047
+ process.stdout.write(` ollama pull qwen3.5:9b ${cc.dim("# smaller fallback")}
580048
+ `);
580049
+ process.stdout.write(` ${cc.dim("# then re-run setup")}
580050
+ `);
580051
+ process.stdout.write(` omnius
580052
+
580053
+ `);
580054
+ process.stdout.write(` ${cc.cyan("2.")} ${cc.bold("Use a remote OpenAI-compatible endpoint")}
580055
+ `);
580056
+ process.stdout.write(` omnius config set backendUrl https://api.example.com/v1
580057
+ `);
580058
+ process.stdout.write(` omnius config set model your-model-name
580059
+ `);
580060
+ process.stdout.write(` omnius config set apiKey sk-...
580061
+ `);
580062
+ process.stdout.write(` omnius config set backendType vllm
580063
+ `);
580064
+ process.stdout.write(` omnius
580065
+
580066
+ `);
580067
+ process.stdout.write(` ${cc.cyan("3.")} ${cc.bold("Open the setup wizard again")}
580068
+ `);
580069
+ process.stdout.write(` omnius setup ${cc.dim("# explicit re-entry")}
580070
+
580071
+ `);
580072
+ process.stdout.write(` ${cc.dim("Docs: ")}${cc.bold("https://github.com/<repo>/blob/main/README.md")}${cc.dim(' — "Quickstart"')}
580073
+
579921
580074
  `);
579922
580075
  }
579923
580076
  async function runSetupWizard(config) {
@@ -580130,6 +580283,13 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580130
580283
  }
580131
580284
  process.stdout.write(hLine("└"));
580132
580285
  process.stdout.write("\n");
580286
+ const canPause = process.stdout.isTTY && process.stdin.isTTY && process.env["CI"] !== "true" && process.env["OMNIUS_SETUP_AUTO_CONTINUE"] !== "1";
580287
+ if (canPause) {
580288
+ process.stdout.write(` ${c3.dim("Review the capability summary above. ")}${c3.bold("Press Enter to continue")}${c3.dim(", or Ctrl+C to exit.")}
580289
+ `);
580290
+ await ask(rl, " > ");
580291
+ process.stdout.write("\n");
580292
+ }
580133
580293
  let hasPython = hasCmd("python3") || hasCmd("python");
580134
580294
  if (!hasPython) {
580135
580295
  process.stdout.write(` ${c3.cyan("⚠")} Python3 not found (needed for vision, OCR, browser automation).
@@ -580245,6 +580405,21 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580245
580405
  process.stdout.write(` ${c3.cyan("⚠")} Default model ${c3.bold(config.model)} is not available.
580246
580406
 
580247
580407
  `);
580408
+ if (canPause) {
580409
+ process.stdout.write(` ${c3.bold("Next step:")} ${c3.dim("choose a model.")}
580410
+ `);
580411
+ process.stdout.write(` ${c3.dim("[Enter] open model picker / [s] skip + configure later / [c] custom endpoint")}
580412
+ `);
580413
+ const next = (await ask(rl, " > ")).trim().toLowerCase();
580414
+ if (next === "s" || next === "skip") {
580415
+ writeSetupIncompleteWalkthrough(c3);
580416
+ process.exit(0);
580417
+ }
580418
+ if (next === "c" || next === "custom") {
580419
+ const endpointResult = await promptForCustomEndpoint(config, rl);
580420
+ if (endpointResult) return endpointResult;
580421
+ }
580422
+ }
580248
580423
  if (models.length > 0) {
580249
580424
  const backendUrl2 = config.backendUrl || "http://localhost:11434";
580250
580425
  const modelChecks = await Promise.all(
@@ -580271,8 +580446,13 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580271
580446
  ${c3.green("✔")} Selected ${c3.bold(selected.name)} — ${mode}. Saved to config.
580272
580447
 
580273
580448
  `);
580449
+ await runOptionalDepsSetup(rl);
580274
580450
  return selected.name;
580275
580451
  }
580452
+ if (!modelResult.confirmed) {
580453
+ writeSetupIncompleteWalkthrough(c3);
580454
+ process.exit(0);
580455
+ }
580276
580456
  } else {
580277
580457
  process.stdout.write(` ${c3.cyan("⚠")} No models found on this system.
580278
580458
 
@@ -580296,11 +580476,8 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580296
580476
  });
580297
580477
  let selectedVariant;
580298
580478
  if (!pullResult.confirmed || !pullResult.key) {
580299
- process.stdout.write(`
580300
- ${c3.dim("Skipping model pull. You can pull manually with: ollama pull <model>")}
580301
-
580302
- `);
580303
- return config.model;
580479
+ writeSetupIncompleteWalkthrough(c3);
580480
+ process.exit(0);
580304
580481
  }
580305
580482
  selectedVariant = QWEN_VARIANTS.find((v) => v.tag === pullResult.key) ?? recommended;
580306
580483
  process.stdout.write(`
@@ -580354,6 +580531,7 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580354
580531
  process.stdout.write(` ${c3.green("✔")} Saved as default model in config.
580355
580532
 
580356
580533
  `);
580534
+ await runOptionalDepsSetup(rl);
580357
580535
  return customName;
580358
580536
  } catch (err) {
580359
580537
  renderWarning(`Could not create custom model: ${err instanceof Error ? err.message : String(err)}`);
@@ -580365,6 +580543,7 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580365
580543
  ${c3.green("✔")} Saved ${c3.bold(selectedVariant.tag)} as default model.
580366
580544
 
580367
580545
  `);
580546
+ await runOptionalDepsSetup(rl);
580368
580547
  return selectedVariant.tag;
580369
580548
  }
580370
580549
  setConfigValue("model", selectedVariant.tag);
@@ -580372,6 +580551,7 @@ ${c3.cyan(OMNIUS_FIRST_RUN_BANNER)}
580372
580551
  ${c3.green("✔")} Saved ${c3.bold(selectedVariant.tag)} as default model.
580373
580552
 
580374
580553
  `);
580554
+ await runOptionalDepsSetup(rl);
580375
580555
  return selectedVariant.tag;
580376
580556
  }
580377
580557
  async function isModelAvailable(config) {
@@ -580824,10 +581004,10 @@ async function ensureVisionDeps(onInfo, getSudoPassword) {
580824
581004
  }
580825
581005
  }
580826
581006
  function ensureCloudflaredBackground(onInfo) {
580827
- if (_cloudflaredInstallPromise) return;
581007
+ if (_cloudflaredInstallPromise) return _cloudflaredInstallPromise;
580828
581008
  if (hasCmd("cloudflared")) {
580829
581009
  _cloudflaredInstallPromise = Promise.resolve(true);
580830
- return;
581010
+ return _cloudflaredInstallPromise;
580831
581011
  }
580832
581012
  const log22 = onInfo ?? (() => {
580833
581013
  });
@@ -580880,6 +581060,7 @@ function ensureCloudflaredBackground(onInfo) {
580880
581060
  log22("cloudflared not available — live voice sessions disabled.");
580881
581061
  return false;
580882
581062
  })();
581063
+ return _cloudflaredInstallPromise;
580883
581064
  }
580884
581065
  async function isCloudflaredReady() {
580885
581066
  if (hasCmd("cloudflared")) return true;
@@ -581389,6 +581570,7 @@ var init_setup = __esm({
581389
581570
  init_config();
581390
581571
  init_dist();
581391
581572
  init_tui_select();
581573
+ init_listen();
581392
581574
  execAsync2 = promisify6(exec4);
581393
581575
  OMNIUS_FIRST_RUN_BANNER = [
581394
581576
  " ░▒▓██████▓▒░░▒▓██████████████▓▒░░▒▓███████▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓███████▓▒░ ",
@@ -603055,13 +603237,13 @@ async function handleUpdate(subcommand, ctx3) {
603055
603237
  }
603056
603238
  if (!hasCf) {
603057
603239
  installOverlay.setStatus("Installing cloudflared...");
603058
- ensureCloudflaredBackground(() => {
603240
+ void ensureCloudflaredBackground(() => {
603059
603241
  });
603060
603242
  await new Promise((r2) => setTimeout(r2, 1e3));
603061
603243
  } else {
603062
603244
  installOverlay.setStatus("cloudflared ready");
603063
603245
  }
603064
- ensureTranscribeCliBackground();
603246
+ void ensureTranscribeCliBackground();
603065
603247
  }
603066
603248
  if (!primaryUpdated) {
603067
603249
  installOverlay.stop("Done — no restart needed");
@@ -654394,75 +654576,6 @@ ${result.summary}`
654394
654576
  const workEvaluator = new WorkEvaluator();
654395
654577
  let setupReady = false;
654396
654578
  const setupTasks = [];
654397
- ensureTranscribeCliBackground();
654398
- ensureCloudflaredBackground((msg) => {
654399
- if (statusBar?.isActive) {
654400
- statusBar.beginContentWrite();
654401
- renderInfo(msg);
654402
- statusBar.endContentWrite();
654403
- }
654404
- });
654405
- let depSudoResolver = null;
654406
- let depSudoPromptPending = false;
654407
- const visionDepsPromise = ensureVisionDeps(
654408
- (msg) => {
654409
- if (statusBar?.isActive) {
654410
- statusBar.beginContentWrite();
654411
- renderInfo(msg);
654412
- statusBar.endContentWrite();
654413
- }
654414
- },
654415
- () => new Promise((resolve52) => {
654416
- depSudoPromptPending = true;
654417
- if (process.stdout.isTTY) {
654418
- process.stdout.write("\x1B[?1000l\x1B[?1002l\x1B[?1006l");
654419
- }
654420
- const origProvider = statusBar.inputStateProvider;
654421
- if (statusBar?.isActive) {
654422
- statusBar.inputStateProvider = () => {
654423
- const state = origProvider?.() ?? { line: "", cursor: 0 };
654424
- return { line: "●".repeat(state.line.length), cursor: state.cursor };
654425
- };
654426
- }
654427
- const footerPwPrompt = `\x1B[38;5;198m● password:\x1B[0m `;
654428
- const prevPromptText = statusBar.promptText;
654429
- const prevPromptWidth = statusBar.promptWidth;
654430
- if (statusBar?.isActive) {
654431
- statusBar.setPromptText(footerPwPrompt, 12);
654432
- }
654433
- depSudoResolver = (pw2) => {
654434
- depSudoPromptPending = false;
654435
- depSudoResolver = null;
654436
- if (statusBar?.isActive) {
654437
- statusBar.inputStateProvider = origProvider ?? (() => ({ line: rl.line ?? "", cursor: rl.cursor ?? 0 }));
654438
- if (prevPromptText !== void 0 && prevPromptWidth !== void 0) {
654439
- statusBar.setPromptText(prevPromptText, prevPromptWidth);
654440
- }
654441
- }
654442
- if (process.stdout.isTTY) {
654443
- process.stdout.write("\x1B[?1002h\x1B[?1006h");
654444
- }
654445
- if (pw2) sessionSudoPassword = pw2;
654446
- resolve52(pw2);
654447
- };
654448
- const pwPrompt = `
654449
- \x1B[5;38;5;198m⚠ Password needed for dependency install\x1B[0m
654450
- ${c3.dim("Type your sudo password below and press Enter. Input is hidden.")}
654451
-
654452
- `;
654453
- if (isNeovimActive()) {
654454
- writeToNeovimOutput(pwPrompt);
654455
- } else {
654456
- if (statusBar?.isActive) statusBar.beginContentWrite();
654457
- process.stdout.write(pwPrompt);
654458
- if (statusBar?.isActive) statusBar.endContentWrite();
654459
- if (statusBar?.isActive) statusBar.handleResize();
654460
- }
654461
- })
654462
- ).catch(() => {
654463
- });
654464
- setupTasks.push(visionDepsPromise.catch(() => {
654465
- }));
654466
654579
  let updateNotified = false;
654467
654580
  checkForUpdate(version4).then((updateInfo) => {
654468
654581
  if (updateInfo) {
@@ -658152,20 +658265,6 @@ ${result.content.slice(0, 2e3)}${result.content.length > 2e3 ? "\n[truncated]" :
658152
658265
  };
658153
658266
  };
658154
658267
  rl.on("line", (line) => {
658155
- if (depSudoPromptPending && depSudoResolver) {
658156
- const pw2 = line.trim();
658157
- depSudoPromptPending = false;
658158
- const resolver = depSudoResolver;
658159
- depSudoResolver = null;
658160
- if (pw2) sessionSudoPassword = pw2;
658161
- if (statusBar?.isActive) {
658162
- statusBar.beginContentWrite();
658163
- renderInfo("🔑 Password received");
658164
- statusBar.endContentWrite();
658165
- }
658166
- resolver(pw2 || null);
658167
- return;
658168
- }
658169
658268
  if (!setupReady) return;
658170
658269
  persistHistoryLine(line);
658171
658270
  const input = line.trim();
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.121",
3
+ "version": "1.0.127",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.121",
9
+ "version": "1.0.127",
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.121",
3
+ "version": "1.0.127",
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",