omnius 1.0.325 → 1.0.327

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
@@ -294217,7 +294217,7 @@ var init_codebase_indexer = __esm({
294217
294217
  };
294218
294218
  }
294219
294219
  async index() {
294220
- const ig = ignore.default();
294220
+ const ig = ignore();
294221
294221
  if (this.config.respectGitignore) {
294222
294222
  try {
294223
294223
  const gitignoreContent = await readFile22(join69(this.config.rootDir, ".gitignore"), "utf-8");
@@ -552312,7 +552312,10 @@ function detectProvider(url) {
552312
552312
  modelsPath: isLocal ? "/v1/models" : "/v1/models"
552313
552313
  };
552314
552314
  }
552315
- var PROVIDERS;
552315
+ function listProviderPresets() {
552316
+ return PROVIDER_PRESETS.map((p2) => ({ ...p2 }));
552317
+ }
552318
+ var PROVIDERS, PROVIDER_PRESETS;
552316
552319
  var init_normalizeUrl = __esm({
552317
552320
  "packages/backend-vllm/dist/normalizeUrl.js"() {
552318
552321
  "use strict";
@@ -552384,6 +552387,28 @@ var init_normalizeUrl = __esm({
552384
552387
  info: { id: "vllm", label: "vLLM (local)", local: true, authRequired: false, modelsPath: "/v1/models" }
552385
552388
  }
552386
552389
  ];
552390
+ PROVIDER_PRESETS = [
552391
+ // --- Local runtimes ---
552392
+ { id: "ollama", label: "Ollama (local)", local: true, authRequired: false, modelsPath: "/api/tags", defaultUrl: "http://127.0.0.1:11434", description: "Local Ollama runtime on port 11434." },
552393
+ { id: "lmstudio", label: "LM Studio (local)", local: true, authRequired: false, modelsPath: "/v1/models", defaultUrl: "http://127.0.0.1:1234/v1", description: "Local OpenAI-compatible server on port 1234." },
552394
+ { id: "vllm", label: "vLLM (local)", local: true, authRequired: false, modelsPath: "/v1/models", defaultUrl: "http://127.0.0.1:8000/v1", description: "Self-hosted OpenAI-compatible vLLM endpoint." },
552395
+ // --- Cloud providers ---
552396
+ { id: "openai", label: "OpenAI", local: false, authRequired: true, keyPrefix: "sk-", modelsPath: "/v1/models", defaultUrl: "https://api.openai.com/v1", apiKeyUrl: "https://platform.openai.com/api-keys", description: "OpenAI API models." },
552397
+ { id: "anthropic", label: "Anthropic (Claude)", local: false, authRequired: true, keyPrefix: "sk-ant-", modelsPath: "/v1/models", defaultUrl: "https://api.anthropic.com/v1", apiKeyUrl: "https://console.anthropic.com/settings/keys", description: "Claude via the Anthropic API." },
552398
+ { id: "openrouter", label: "OpenRouter", local: false, authRequired: true, keyPrefix: "sk-or-", modelsPath: "/v1/models", defaultUrl: "https://openrouter.ai/api/v1", apiKeyUrl: "https://openrouter.ai/keys", description: "Routing across many hosted models." },
552399
+ { id: "groq", label: "Groq", local: false, authRequired: true, keyPrefix: "gsk_", modelsPath: "/v1/models", defaultUrl: "https://api.groq.com/openai/v1", apiKeyUrl: "https://console.groq.com/keys", description: "Groq OpenAI-compatible inference." },
552400
+ { id: "chutes", label: "Chutes AI", local: false, authRequired: true, keyPrefix: "cpk_", modelsPath: "/v1/models", defaultUrl: "https://llm.chutes.ai/v1", apiKeyUrl: "https://chutes.ai/app/api", description: "Chutes OpenAI-compatible endpoint." },
552401
+ { id: "deepinfra", label: "DeepInfra", local: false, authRequired: true, modelsPath: "/v1/models", defaultUrl: "https://api.deepinfra.com/v1/openai", apiKeyUrl: "https://deepinfra.com/dash/api_keys", description: "DeepInfra hosted models." },
552402
+ { id: "together", label: "Together AI", local: false, authRequired: true, modelsPath: "/v1/models", defaultUrl: "https://api.together.xyz/v1", apiKeyUrl: "https://api.together.xyz/settings/api-keys", description: "Together OpenAI-compatible inference." },
552403
+ { id: "fireworks", label: "Fireworks AI", local: false, authRequired: true, keyPrefix: "fw_", modelsPath: "/v1/models", defaultUrl: "https://api.fireworks.ai/inference/v1", apiKeyUrl: "https://fireworks.ai/account/api-keys", description: "Fireworks OpenAI-compatible inference." },
552404
+ { id: "mistral", label: "Mistral AI", local: false, authRequired: true, modelsPath: "/v1/models", defaultUrl: "https://api.mistral.ai/v1", apiKeyUrl: "https://console.mistral.ai/api-keys", description: "Mistral hosted models." },
552405
+ { id: "cerebras", label: "Cerebras", local: false, authRequired: true, keyPrefix: "csk-", modelsPath: "/v1/models", defaultUrl: "https://api.cerebras.ai/v1", apiKeyUrl: "https://cloud.cerebras.ai/platform", description: "Cerebras OpenAI-compatible inference." },
552406
+ { id: "sambanova", label: "SambaNova", local: false, authRequired: true, modelsPath: "/v1/models", defaultUrl: "https://api.sambanova.ai/v1", apiKeyUrl: "https://cloud.sambanova.ai/apis", description: "SambaNova OpenAI-compatible inference." },
552407
+ { id: "nvidia", label: "NVIDIA NIM", local: false, authRequired: true, keyPrefix: "nvapi-", modelsPath: "/v1/models", defaultUrl: "https://integrate.api.nvidia.com/v1", apiKeyUrl: "https://build.nvidia.com", description: "NVIDIA-hosted NIM models." },
552408
+ { id: "hyperbolic", label: "Hyperbolic", local: false, authRequired: true, modelsPath: "/v1/models", defaultUrl: "https://api.hyperbolic.xyz/v1", apiKeyUrl: "https://app.hyperbolic.xyz/settings", description: "Hyperbolic OpenAI-compatible inference." },
552409
+ // --- Catch-all ---
552410
+ { id: "custom", label: "Custom endpoint", local: false, authRequired: false, modelsPath: "/v1/models", description: "Any OpenAI-compatible endpoint — enter a URL." }
552411
+ ];
552387
552412
  }
552388
552413
  });
552389
552414
 
@@ -554045,7 +554070,7 @@ var init_messages = __esm({
554045
554070
  role: z2.enum(["user", "assistant", "system", "tool"]),
554046
554071
  content: z2.string(),
554047
554072
  timestamp: z2.string().datetime(),
554048
- metadata: z2.record(z2.unknown()).optional()
554073
+ metadata: z2.record(z2.string(), z2.unknown()).optional()
554049
554074
  });
554050
554075
  }
554051
554076
  });
@@ -554059,7 +554084,7 @@ var init_tools = __esm({
554059
554084
  ToolCallSchema = z3.object({
554060
554085
  id: z3.string().uuid(),
554061
554086
  name: z3.string(),
554062
- arguments: z3.record(z3.unknown()),
554087
+ arguments: z3.record(z3.string(), z3.unknown()),
554063
554088
  result: z3.unknown().optional(),
554064
554089
  status: z3.enum(["pending", "running", "completed", "failed"]),
554065
554090
  startedAt: z3.string().datetime().optional(),
@@ -554081,7 +554106,7 @@ var init_session3 = __esm({
554081
554106
  createdAt: z4.string().datetime(),
554082
554107
  updatedAt: z4.string().datetime(),
554083
554108
  status: z4.enum(["active", "paused", "completed", "error"]),
554084
- config: z4.record(z4.unknown()).optional()
554109
+ config: z4.record(z4.string(), z4.unknown()).optional()
554085
554110
  });
554086
554111
  }
554087
554112
  });
@@ -554612,25 +554637,25 @@ var init_config5 = __esm({
554612
554637
  * Maximum context length for the model.
554613
554638
  * Should be discovered by startup probing rather than hard-coded.
554614
554639
  */
554615
- AGENT_MAX_MODEL_LEN: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default("65536"),
554640
+ AGENT_MAX_MODEL_LEN: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default(65536),
554616
554641
  /** Enable vLLM automatic prefix caching (1 = enabled) */
554617
- AGENT_ENABLE_PREFIX_CACHING: z14.string().transform((v) => v === "1" || v.toLowerCase() === "true").pipe(z14.boolean()).default("1"),
554642
+ AGENT_ENABLE_PREFIX_CACHING: z14.string().transform((v) => v === "1" || v.toLowerCase() === "true").pipe(z14.boolean()).default(true),
554618
554643
  /** Enable vLLM sleep mode when idle (1 = enabled) */
554619
- AGENT_ENABLE_SLEEP_MODE: z14.string().transform((v) => v === "1" || v.toLowerCase() === "true").pipe(z14.boolean()).default("1"),
554644
+ AGENT_ENABLE_SLEEP_MODE: z14.string().transform((v) => v === "1" || v.toLowerCase() === "true").pipe(z14.boolean()).default(true),
554620
554645
  // -----------------------------------------------------------------------
554621
554646
  // Agent behaviour
554622
554647
  // -----------------------------------------------------------------------
554623
554648
  /** Maximum retry cycles per subtask */
554624
- AGENT_MAX_RETRIES: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().nonnegative()).default("3"),
554649
+ AGENT_MAX_RETRIES: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().nonnegative()).default(3),
554625
554650
  /** Maximum number of parallel subagents that may run simultaneously */
554626
- AGENT_MAX_PARALLEL_SUBAGENTS: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default("4"),
554651
+ AGENT_MAX_PARALLEL_SUBAGENTS: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default(4),
554627
554652
  // -----------------------------------------------------------------------
554628
554653
  // Retrieval limits
554629
554654
  // -----------------------------------------------------------------------
554630
554655
  /** Maximum files included in a single retrieval packet */
554631
- AGENT_RETRIEVAL_MAX_FILES: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default("8"),
554656
+ AGENT_RETRIEVAL_MAX_FILES: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default(8),
554632
554657
  /** Maximum snippets included in a single retrieval packet */
554633
- AGENT_RETRIEVAL_MAX_SNIPPETS: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default("16"),
554658
+ AGENT_RETRIEVAL_MAX_SNIPPETS: z14.string().transform((v) => parseInt(v, 10)).pipe(z14.number().int().positive()).default(16),
554634
554659
  // -----------------------------------------------------------------------
554635
554660
  // File paths
554636
554661
  // -----------------------------------------------------------------------
@@ -609699,7 +609724,9 @@ var init_status_bar = __esm({
609699
609724
  } else {
609700
609725
  return false;
609701
609726
  }
609702
- this.refreshDynamicBlocks();
609727
+ if (this.active && !isOverlayActive() && !this._suspendContentLayer) {
609728
+ this.repaintContent();
609729
+ }
609703
609730
  return true;
609704
609731
  }
609705
609732
  /**
@@ -628928,7 +628955,7 @@ __export(commands_exports, {
628928
628955
  registerSlashCommand: () => registerSlashCommand
628929
628956
  });
628930
628957
  import * as nodeOs from "node:os";
628931
- import { execSync as nodeExecSync } from "node:child_process";
628958
+ import { execSync as nodeExecSync, spawn as nodeSpawn2 } from "node:child_process";
628932
628959
  import { createHash as createHash35 } from "node:crypto";
628933
628960
  import {
628934
628961
  existsSync as existsSync127,
@@ -640039,6 +640066,87 @@ async function handleVoiceList(ctx3, focusFilename) {
640039
640066
  if (msg) renderInfo(msg);
640040
640067
  }
640041
640068
  }
640069
+ function openUrlInBrowser(url) {
640070
+ if (process.env["OMNIUS_NO_BROWSER"] === "1") return false;
640071
+ if (!/^https?:\/\//i.test(url)) return false;
640072
+ const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
640073
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
640074
+ try {
640075
+ const child = nodeSpawn2(cmd, args, { stdio: "ignore", detached: true });
640076
+ child.on("error", () => {
640077
+ });
640078
+ child.unref();
640079
+ return true;
640080
+ } catch {
640081
+ return false;
640082
+ }
640083
+ }
640084
+ function clickableLink(url, text2 = url) {
640085
+ if (!process.stdout.isTTY) return text2;
640086
+ return `\x1B]8;;${url}\x07${text2}\x1B]8;;\x07`;
640087
+ }
640088
+ async function browseProviderPresets(ctx3, local) {
640089
+ const presets = listProviderPresets();
640090
+ const byKey = new Map(presets.map((p2) => [p2.id, p2]));
640091
+ const items = presets.map((p2) => ({
640092
+ key: p2.id,
640093
+ label: p2.local ? `${c3.green("●")} ${p2.label}` : p2.label,
640094
+ detail: [
640095
+ p2.defaultUrl || "enter a custom URL",
640096
+ p2.authRequired ? "API key required" : p2.local ? "local · no key" : "no key",
640097
+ p2.description || ""
640098
+ ].filter(Boolean).join(" · ")
640099
+ }));
640100
+ let pending2 = null;
640101
+ const result = await tuiSelect({
640102
+ items,
640103
+ title: "Add inference provider",
640104
+ rl: ctx3.rl,
640105
+ availableRows: ctx3.availableContentRows?.(),
640106
+ onEnter: (item, { getInput, resolve: resolve71 }) => {
640107
+ const preset = byKey.get(item.key);
640108
+ if (!preset) return false;
640109
+ void (async () => {
640110
+ let url2 = preset.defaultUrl ?? "";
640111
+ if (!url2) {
640112
+ const typed = await getInput("Endpoint URL", "https://");
640113
+ if (!typed || !typed.trim()) {
640114
+ resolve71({ confirmed: false, key: item.key, index: -1 });
640115
+ return;
640116
+ }
640117
+ url2 = typed.trim();
640118
+ }
640119
+ let key2 = "";
640120
+ if (preset.authRequired || !preset.local) {
640121
+ let promptLabel = "API key";
640122
+ if (preset.apiKeyUrl) {
640123
+ const opened = openUrlInBrowser(preset.apiKeyUrl);
640124
+ promptLabel = opened ? `API key (opened ${preset.apiKeyUrl} in browser)` : `API key (get one: ${preset.apiKeyUrl})`;
640125
+ }
640126
+ const entered = await getInput(
640127
+ preset.authRequired ? promptLabel : `${promptLabel} (optional)`,
640128
+ ""
640129
+ );
640130
+ key2 = (entered ?? "").trim();
640131
+ }
640132
+ pending2 = { url: url2, key: key2 };
640133
+ resolve71({ confirmed: true, key: "__apply__", index: -1 });
640134
+ })();
640135
+ return true;
640136
+ }
640137
+ });
640138
+ if (!result.confirmed || result.key !== "__apply__" || !pending2) {
640139
+ renderInfo("Provider selection cancelled.");
640140
+ return;
640141
+ }
640142
+ const { url, key } = pending2;
640143
+ const keyUrl = presets.find((p2) => p2.defaultUrl === url)?.apiKeyUrl;
640144
+ if (keyUrl) {
640145
+ process.stdout.write(` ${c3.dim("API key page:")} ${clickableLink(keyUrl)}
640146
+ `);
640147
+ }
640148
+ await handleEndpoint(key ? `${url} --auth ${key}` : url, ctx3, local);
640149
+ }
640042
640150
  async function handleEndpoint(arg, ctx3, local = false) {
640043
640151
  if (!arg) {
640044
640152
  const history = loadUsageHistory("endpoint", ctx3.repoRoot);
@@ -640053,6 +640161,11 @@ async function handleEndpoint(arg, ctx3, local = false) {
640053
640161
  detail: `${provider2} ${uses}${auth}`
640054
640162
  };
640055
640163
  });
640164
+ items.push({
640165
+ key: "__providers__",
640166
+ label: `${c3.cyan("◈")} Add from provider list`,
640167
+ detail: "Pick OpenAI, Anthropic, Groq, Ollama… and enter a key"
640168
+ });
640056
640169
  items.push({
640057
640170
  key: "__add__",
640058
640171
  label: `${c3.green("+")} Add endpoint`,
@@ -640094,9 +640207,17 @@ async function handleEndpoint(arg, ctx3, local = false) {
640094
640207
  resolve71({ confirmed: true, key: "__sponsor__", index: -1 });
640095
640208
  return true;
640096
640209
  }
640210
+ if (item.key === "__providers__") {
640211
+ resolve71({ confirmed: true, key: "__providers__", index: -1 });
640212
+ return true;
640213
+ }
640097
640214
  return false;
640098
640215
  }
640099
640216
  });
640217
+ if (result.confirmed && result.key === "__providers__") {
640218
+ await browseProviderPresets(ctx3, local);
640219
+ return;
640220
+ }
640100
640221
  if (result.confirmed && result.key === "__add__" && addedEndpoint) {
640101
640222
  await handleEndpoint(addedEndpoint, ctx3, local);
640102
640223
  return;
@@ -640122,6 +640243,11 @@ async function handleEndpoint(arg, ctx3, local = false) {
640122
640243
  label: `${currentProvider.label} — ${ctx3.config.backendUrl}`,
640123
640244
  detail: `${ctx3.config.backendType} ${ctx3.config.apiKey ? "Auth: Bearer token set" : "No auth"}`
640124
640245
  },
640246
+ {
640247
+ key: "__providers__",
640248
+ label: `${c3.cyan("◈")} Add from provider list`,
640249
+ detail: "Pick OpenAI, Anthropic, Groq, Ollama… and enter a key"
640250
+ },
640125
640251
  {
640126
640252
  key: "__add__",
640127
640253
  label: `${c3.green("+")} Add endpoint`,
@@ -640154,10 +640280,16 @@ async function handleEndpoint(arg, ctx3, local = false) {
640154
640280
  resolve71({ confirmed: true, key: "__sponsor__", index: -1 });
640155
640281
  return true;
640156
640282
  }
640283
+ if (item.key === "__providers__") {
640284
+ resolve71({ confirmed: true, key: "__providers__", index: -1 });
640285
+ return true;
640286
+ }
640157
640287
  return false;
640158
640288
  }
640159
640289
  });
640160
- if (noHistResult.confirmed && noHistResult.key === "__add__" && addedUrl) {
640290
+ if (noHistResult.confirmed && noHistResult.key === "__providers__") {
640291
+ await browseProviderPresets(ctx3, local);
640292
+ } else if (noHistResult.confirmed && noHistResult.key === "__add__" && addedUrl) {
640161
640293
  await handleEndpoint(addedUrl, ctx3, local);
640162
640294
  } else if (noHistResult.confirmed && noHistResult.key === "__sponsor__") {
640163
640295
  await handleSponsoredEndpoint(ctx3, local);
@@ -640207,6 +640339,10 @@ async function handleEndpoint(arg, ctx3, local = false) {
640207
640339
  await handleSponsoredEndpoint(ctx3, local);
640208
640340
  return;
640209
640341
  }
640342
+ if (arg === "providers" || arg === "list" || arg === "browse") {
640343
+ await browseProviderPresets(ctx3, local);
640344
+ return;
640345
+ }
640210
640346
  if (arg.startsWith("add ")) {
640211
640347
  const addArg = arg.slice(4).replace(/\u2014/g, "--").replace(/\u2013/g, "--");
640212
640348
  const addParts = addArg.split(/\s+/);
@@ -685420,6 +685556,8 @@ body { display:flex; flex-direction:column; height:100vh; margin:0; overflow:hid
685420
685556
  </div>
685421
685557
  <h3 style="color:var(--color-brand);font-size:0.7rem;margin:16px 0 8px">Inference Provider</h3>
685422
685558
  <div id="config-endpoint" style="font-size:0.78rem;color:var(--color-fg-muted);margin-bottom:8px"></div>
685559
+ <div style="font-size:0.66rem;color:var(--color-fg-faint);margin-bottom:6px">Pick a provider to pre-fill the endpoint, then add your key and press <strong>set</strong>.</div>
685560
+ <div id="config-provider-modules" style="margin-bottom:10px"></div>
685423
685561
  <form onsubmit="event.preventDefault(); switchEndpoint();" autocomplete="off" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:4px">
685424
685562
  <input id="config-ep-url" placeholder="https://api.example.com/v1" autocomplete="off" style="flex:1;min-width:200px;background:var(--color-bg-input);border:1px solid var(--color-border);border-radius:3px;padding:4px 8px;color:var(--color-fg);font-family:inherit;font-size:0.7rem;outline:none">
685425
685563
  <input id="config-ep-key" placeholder="Bearer key (optional)" type="password" autocomplete="new-password" style="flex:1;min-width:150px;background:var(--color-bg-input);border:1px solid var(--color-border);border-radius:3px;padding:4px 8px;color:var(--color-fg);font-family:inherit;font-size:0.7rem;outline:none">
@@ -688758,6 +688896,12 @@ async function loadConfig() {
688758
688896
  '<td style="padding:4px;color:var(--color-fg)">' + (v === '[redacted]' ? '<span style="color:var(--color-fg-faint)">[redacted]</span>' : String(v)) + '</td></tr>'
688759
688897
  ).join('') + '</table>';
688760
688898
  document.getElementById('config-endpoint').textContent = ep.url + ' (' + (ep.backendType || 'unknown') + ')';
688899
+ // Provider module grid (same cards as the Settings modal) wired to the
688900
+ // config-tab endpoint form. Pre-selects the provider matching the active URL.
688901
+ try {
688902
+ const pm = document.getElementById('config-provider-modules');
688903
+ if (pm) pm.innerHTML = renderSettingsProviderModules(settingsProviderIdForUrl(ep.url), ep.url, 'selectConfigProviderModule');
688904
+ } catch {}
688761
688905
  // Populate model switcher
688762
688906
  const sel = document.getElementById('config-model-select');
688763
688907
  sel.innerHTML = '';
@@ -688797,6 +688941,38 @@ async function switchEndpoint() {
688797
688941
  } catch {}
688798
688942
  }
688799
688943
 
688944
+ // Provider-module click handler for the /settings (config tab) endpoint form.
688945
+ // Fills the URL + backend-type fields, highlights the active card, and for
688946
+ // cloud providers opens the API-key page and focuses the key input so the user
688947
+ // just pastes their key and presses "set".
688948
+ function selectConfigProviderModule(providerId) {
688949
+ const provider = settingsProviderById(providerId);
688950
+ if (!provider) return;
688951
+ const urlInput = document.getElementById('config-ep-url');
688952
+ const typeSel = document.getElementById('config-ep-type');
688953
+ const keyInput = document.getElementById('config-ep-key');
688954
+ if (urlInput) urlInput.value = provider.url || '';
688955
+ if (typeSel && provider.backendType) {
688956
+ if (!Array.from(typeSel.options).some(o => o.value === provider.backendType)) {
688957
+ const opt = document.createElement('option');
688958
+ opt.value = provider.backendType; opt.textContent = provider.backendType;
688959
+ typeSel.appendChild(opt);
688960
+ }
688961
+ typeSel.value = provider.backendType;
688962
+ }
688963
+ // Highlight the chosen card.
688964
+ document.querySelectorAll('#config-provider-modules .settings-provider-module').forEach(btn => {
688965
+ btn.classList.toggle('active', btn.getAttribute('data-provider-id') === providerId);
688966
+ });
688967
+ // Cloud providers: open the key page and focus the key field.
688968
+ if (provider.requiresAuth && provider.apiKeyUrl) {
688969
+ try { window.open(provider.apiKeyUrl, '_blank', 'noopener'); } catch {}
688970
+ }
688971
+ if (keyInput) { try { keyInput.focus(); } catch {} }
688972
+ else if (!provider.url && urlInput) { try { urlInput.focus(); } catch {} }
688973
+ }
688974
+ window.selectConfigProviderModule = selectConfigProviderModule;
688975
+
688800
688976
  async function switchModel() {
688801
688977
  const model = document.getElementById('config-model-select').value;
688802
688978
  if (!model) return;
@@ -692661,15 +692837,18 @@ function settingsProviderIcon(provider) {
692661
692837
  return '<span class="settings-provider-brand"><img src="' + escapeHtml(src) + '" alt="" onerror="this.hidden=true;this.nextElementSibling.hidden=false"><span hidden>' + initial + '</span></span>';
692662
692838
  }
692663
692839
 
692664
- function renderSettingsProviderModules(selectedId, currentUrl) {
692840
+ function renderSettingsProviderModules(selectedId, currentUrl, handler) {
692665
692841
  const activeId = settingsProviderIdForUrl(currentUrl);
692842
+ // handler is the click function name so the same grid can drive either the
692843
+ // Settings modal Connections pane or the /settings (config tab) form.
692844
+ const fn = handler || 'selectSettingsProviderModule';
692666
692845
  return '<div class="settings-provider-module-grid">' + _OMNIUS_ENDPOINT_PROVIDERS.map(provider => {
692667
692846
  const selected = provider.id === selectedId;
692668
692847
  const active = provider.id === activeId;
692669
692848
  const cls = 'settings-provider-module' + (selected ? ' active' : '');
692670
692849
  const safeId = escapeHtml(provider.id);
692671
692850
  const meta = provider.group + (active ? ' - active' : (provider.requiresAuth ? ' - API key' : ''));
692672
- return '<button type="button" class="' + cls + '" data-provider-id="' + safeId + '" onclick="selectSettingsProviderModule(\\'' + safeId + '\\', false)">' +
692851
+ return '<button type="button" class="' + cls + '" data-provider-id="' + safeId + '" onclick="' + fn + '(\\'' + safeId + '\\', false)">' +
692673
692852
  settingsProviderIcon(provider) +
692674
692853
  '<strong>' + escapeHtml(provider.label) + '</strong>' +
692675
692854
  '<small>' + escapeHtml(meta) + '</small>' +
@@ -700140,7 +700319,7 @@ async function handleRequest(req3, res, ollamaUrl, verbose, runtimeDefaults = {}
700140
700319
  return;
700141
700320
  }
700142
700321
  if (pathname === "/favicon.ico" && method === "GET") {
700143
- const svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect width="16" height="16" rx="3" fill="#b2920a"/><text x="50%" y="55%" font-size="11" font-family="monospace" font-weight="700" text-anchor="middle" dominant-baseline="middle" fill="#0b0b0b">omnius</text></svg>';
700322
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><rect width="16" height="16" fill="#000"/><rect x="3" y="3" width="10" height="10" fill="#fff"/><rect x="6" y="6" width="4" height="4" fill="#000"/></svg>';
700144
700323
  res.writeHead(200, {
700145
700324
  "Content-Type": "image/svg+xml",
700146
700325
  "Cache-Control": "public, max-age=86400"
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.325",
3
+ "version": "1.0.327",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.325",
9
+ "version": "1.0.327",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
13
13
  "hasInstallScript": true,
14
14
  "license": "CC-BY-NC-4.0",
15
15
  "dependencies": {
16
- "aiwg": "2026.5.11",
17
- "glob": "^11.0.0",
18
- "ignore": "^6.0.2",
16
+ "aiwg": "2026.6.2",
17
+ "glob": "^13.0.6",
18
+ "ignore": "^7.0.5",
19
19
  "image-to-ascii": "file:vendor/image-to-ascii",
20
20
  "nats.ws": "1.30.3",
21
21
  "omnius-fabric": "^0.12.8",
22
22
  "open-agents-nexus": "1.17.3",
23
23
  "ws": "^8.20.0",
24
- "zod": "^3.24.1"
24
+ "zod": "^4.4.3"
25
25
  },
26
26
  "bin": {
27
27
  "omnius": "dist/launcher.cjs"
@@ -543,15 +543,6 @@
543
543
  "url": "https://github.com/sponsors/sindresorhus"
544
544
  }
545
545
  },
546
- "node_modules/@isaacs/cliui": {
547
- "version": "9.0.0",
548
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
549
- "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
550
- "license": "BlueOak-1.0.0",
551
- "engines": {
552
- "node": ">=18"
553
- }
554
- },
555
546
  "node_modules/@leichtgewicht/ip-codec": {
556
547
  "version": "2.0.5",
557
548
  "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
@@ -2214,9 +2205,9 @@
2214
2205
  }
2215
2206
  },
2216
2207
  "node_modules/aiwg": {
2217
- "version": "2026.5.11",
2218
- "resolved": "https://registry.npmjs.org/aiwg/-/aiwg-2026.5.11.tgz",
2219
- "integrity": "sha512-yDEmULWXCpYElV9rEzQMp781jmKE3b2+VoWmbrf1t2yms7yeXWZYH2Jq2bVkNcqSbHJ9LKby1wOSAh0b5hSKMA==",
2208
+ "version": "2026.6.2",
2209
+ "resolved": "https://registry.npmjs.org/aiwg/-/aiwg-2026.6.2.tgz",
2210
+ "integrity": "sha512-DlZwilKJajAoQldBadYmo5EqSSYGsn/mBnhIpzJVuQkarMR1h8w1szLTiBcL7kDJ3sGM3DPIt0fUVGZhvRa7tQ==",
2220
2211
  "license": "MIT",
2221
2212
  "dependencies": {
2222
2213
  "@modelcontextprotocol/sdk": "^1.24.0",
@@ -2261,21 +2252,13 @@
2261
2252
  }
2262
2253
  }
2263
2254
  },
2264
- "node_modules/aiwg/node_modules/glob": {
2265
- "version": "13.0.6",
2266
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
2267
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
2268
- "license": "BlueOak-1.0.0",
2269
- "dependencies": {
2270
- "minimatch": "^10.2.2",
2271
- "minipass": "^7.1.3",
2272
- "path-scurry": "^2.0.2"
2273
- },
2274
- "engines": {
2275
- "node": "18 || 20 || >=22"
2276
- },
2255
+ "node_modules/aiwg/node_modules/zod": {
2256
+ "version": "3.25.76",
2257
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
2258
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
2259
+ "license": "MIT",
2277
2260
  "funding": {
2278
- "url": "https://github.com/sponsors/isaacs"
2261
+ "url": "https://github.com/sponsors/colinhacks"
2279
2262
  }
2280
2263
  },
2281
2264
  "node_modules/ajv": {
@@ -3632,22 +3615,6 @@
3632
3615
  }
3633
3616
  }
3634
3617
  },
3635
- "node_modules/foreground-child": {
3636
- "version": "3.3.1",
3637
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
3638
- "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
3639
- "license": "ISC",
3640
- "dependencies": {
3641
- "cross-spawn": "^7.0.6",
3642
- "signal-exit": "^4.0.1"
3643
- },
3644
- "engines": {
3645
- "node": ">=14"
3646
- },
3647
- "funding": {
3648
- "url": "https://github.com/sponsors/isaacs"
3649
- }
3650
- },
3651
3618
  "node_modules/form-data": {
3652
3619
  "version": "4.0.6",
3653
3620
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
@@ -3828,24 +3795,17 @@
3828
3795
  "license": "MIT"
3829
3796
  },
3830
3797
  "node_modules/glob": {
3831
- "version": "11.1.0",
3832
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
3833
- "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
3834
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
3798
+ "version": "13.0.6",
3799
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
3800
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
3835
3801
  "license": "BlueOak-1.0.0",
3836
3802
  "dependencies": {
3837
- "foreground-child": "^3.3.1",
3838
- "jackspeak": "^4.1.1",
3839
- "minimatch": "^10.1.1",
3840
- "minipass": "^7.1.2",
3841
- "package-json-from-dist": "^1.0.0",
3842
- "path-scurry": "^2.0.0"
3843
- },
3844
- "bin": {
3845
- "glob": "dist/esm/bin.mjs"
3803
+ "minimatch": "^10.2.2",
3804
+ "minipass": "^7.1.3",
3805
+ "path-scurry": "^2.0.2"
3846
3806
  },
3847
3807
  "engines": {
3848
- "node": "20 || >=22"
3808
+ "node": "18 || 20 || >=22"
3849
3809
  },
3850
3810
  "funding": {
3851
3811
  "url": "https://github.com/sponsors/isaacs"
@@ -4104,9 +4064,9 @@
4104
4064
  "license": "BSD-3-Clause"
4105
4065
  },
4106
4066
  "node_modules/ignore": {
4107
- "version": "6.0.2",
4108
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
4109
- "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
4067
+ "version": "7.0.5",
4068
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
4069
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
4110
4070
  "license": "MIT",
4111
4071
  "engines": {
4112
4072
  "node": ">= 4"
@@ -4773,21 +4733,6 @@
4773
4733
  "uint8arrays": "^5.1.0"
4774
4734
  }
4775
4735
  },
4776
- "node_modules/jackspeak": {
4777
- "version": "4.2.3",
4778
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
4779
- "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
4780
- "license": "BlueOak-1.0.0",
4781
- "dependencies": {
4782
- "@isaacs/cliui": "^9.0.0"
4783
- },
4784
- "engines": {
4785
- "node": "20 || >=22"
4786
- },
4787
- "funding": {
4788
- "url": "https://github.com/sponsors/isaacs"
4789
- }
4790
- },
4791
4736
  "node_modules/jose": {
4792
4737
  "version": "6.2.3",
4793
4738
  "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
@@ -5881,12 +5826,6 @@
5881
5826
  "url": "https://github.com/sponsors/sindresorhus"
5882
5827
  }
5883
5828
  },
5884
- "node_modules/package-json-from-dist": {
5885
- "version": "1.0.1",
5886
- "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
5887
- "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
5888
- "license": "BlueOak-1.0.0"
5889
- },
5890
5829
  "node_modules/pako": {
5891
5830
  "version": "1.0.11",
5892
5831
  "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
@@ -7593,9 +7532,9 @@
7593
7532
  }
7594
7533
  },
7595
7534
  "node_modules/zod": {
7596
- "version": "3.25.76",
7597
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
7598
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
7535
+ "version": "4.4.3",
7536
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
7537
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
7599
7538
  "license": "MIT",
7600
7539
  "funding": {
7601
7540
  "url": "https://github.com/sponsors/colinhacks"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.325",
3
+ "version": "1.0.327",
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",
@@ -80,15 +80,15 @@
80
80
  "node": ">=22.0.0"
81
81
  },
82
82
  "dependencies": {
83
- "aiwg": "2026.5.11",
83
+ "aiwg": "2026.6.2",
84
84
  "omnius-fabric": "^0.12.8",
85
- "glob": "^11.0.0",
86
- "ignore": "^6.0.2",
85
+ "glob": "^13.0.6",
86
+ "ignore": "^7.0.5",
87
87
  "image-to-ascii": "file:vendor/image-to-ascii",
88
88
  "nats.ws": "1.30.3",
89
89
  "open-agents-nexus": "1.17.3",
90
90
  "ws": "^8.20.0",
91
- "zod": "^3.24.1"
91
+ "zod": "^4.4.3"
92
92
  },
93
93
  "bundledDependencies": [
94
94
  "image-to-ascii"