omnius 1.0.341 → 1.0.342

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
@@ -564747,6 +564747,111 @@ function recommendFanout(breadth) {
564747
564747
  return 3;
564748
564748
  return 1;
564749
564749
  }
564750
+ function deriveRegions(rootEntries, packagesEntries, opts = {}) {
564751
+ const max = Math.max(2, opts.max ?? 8);
564752
+ const keep = (e2) => e2.isDir && !e2.name.startsWith(".") && !REGION_IGNORE_RE.test(e2.name);
564753
+ const pkgs = (packagesEntries ?? []).filter(keep).map((e2) => `packages/${e2.name}`);
564754
+ if (pkgs.length >= 2)
564755
+ return pkgs.slice(0, max);
564756
+ const dirs = (rootEntries ?? []).filter(keep).map((e2) => e2.name);
564757
+ return dirs.slice(0, max);
564758
+ }
564759
+ function buildExplorerPrompt(brief) {
564760
+ return [
564761
+ `You are a READ-ONLY exploration sub-agent. Objective: ${brief.objective}`,
564762
+ `Your region (do NOT read outside it): ${brief.scope}`,
564763
+ "Boundaries:",
564764
+ ...brief.boundaries.map((b) => `- ${b}`),
564765
+ "FIRST run grep_search across your region for keywords from the objective; open only the most promising hits with file_read. Read NARROW — never dump whole files.",
564766
+ "Then call task_complete. In the summary, give one short line per genuinely-relevant file as `path — why it matters`.",
564767
+ "Your summary MUST END with a single line in EXACTLY this format, listing ONLY files that truly match the objective:",
564768
+ " RELEVANT_FILES: <comma-separated repo-relative paths>",
564769
+ "If your region has NOTHING pertinent, the final line must be exactly: RELEVANT_FILES: none",
564770
+ "Do NOT list files you merely read to rule the region out — only real matches go in RELEVANT_FILES."
564771
+ ].join("\n");
564772
+ }
564773
+ function extractPathFindings(text2) {
564774
+ const findings = [];
564775
+ const seen = /* @__PURE__ */ new Set();
564776
+ const pathRe = /([A-Za-z0-9_.@/-]+\/[A-Za-z0-9_./-]+\.[A-Za-z]{1,6})(?:\s*[—:\-]+\s*(.*))?/;
564777
+ for (const line of String(text2 || "").split(/\r?\n/)) {
564778
+ const m2 = line.match(pathRe);
564779
+ if (!m2 || !m2[1])
564780
+ continue;
564781
+ const path12 = m2[1].replace(/[)\]}.,;]+$/, "");
564782
+ if (seen.has(path12))
564783
+ continue;
564784
+ seen.add(path12);
564785
+ findings.push({ path: path12, whyRelevant: (m2[2] ?? "").trim().slice(0, 200) });
564786
+ }
564787
+ return findings;
564788
+ }
564789
+ function parseExplorerDigest(region, rawText) {
564790
+ const text2 = String(rawText || "");
564791
+ const reasonByPath = new Map(extractPathFindings(text2).map((f2) => [f2.path, f2.whyRelevant]));
564792
+ const relMatches = [...text2.matchAll(/RELEVANT_FILES?\s*:\s*(.+)/gi)];
564793
+ if (relMatches.length > 0) {
564794
+ const value2 = (relMatches[relMatches.length - 1][1] ?? "").trim();
564795
+ if (/^(none|n\/a|-|nil|empty)\b/i.test(value2)) {
564796
+ return { region, relevant: false, findings: [], summary: "" };
564797
+ }
564798
+ const paths = [];
564799
+ const seen = /* @__PURE__ */ new Set();
564800
+ for (const tok of value2.split(/[,|]/)) {
564801
+ const m2 = tok.match(PATH_LIKE_RE);
564802
+ if (!m2)
564803
+ continue;
564804
+ const p2 = m2[0];
564805
+ if (!seen.has(p2)) {
564806
+ seen.add(p2);
564807
+ paths.push(p2);
564808
+ }
564809
+ }
564810
+ if (paths.length > 0) {
564811
+ return compressFindings({
564812
+ region,
564813
+ relevant: true,
564814
+ findings: paths.map((p2) => ({ path: p2, whyRelevant: reasonByPath.get(p2) ?? "" })),
564815
+ summary: ""
564816
+ });
564817
+ }
564818
+ return { region, relevant: false, findings: [], summary: "" };
564819
+ }
564820
+ const jsonMatch = text2.match(/\{[\s\S]*\}/);
564821
+ if (jsonMatch) {
564822
+ try {
564823
+ const obj = JSON.parse(jsonMatch[0]);
564824
+ if (obj && typeof obj === "object") {
564825
+ const explicitlyIrrelevant = obj["relevant"] === false;
564826
+ const rawFindings = Array.isArray(obj["findings"]) ? obj["findings"] : [];
564827
+ const findings = rawFindings.map((f2) => {
564828
+ const o2 = f2 ?? {};
564829
+ const why = o2["whyRelevant"] ?? o2["why_relevant"] ?? o2["why"] ?? "";
564830
+ const snip = o2["snippet"];
564831
+ return {
564832
+ path: String(o2["path"] ?? ""),
564833
+ whyRelevant: String(why),
564834
+ ...snip ? { snippet: String(snip) } : {}
564835
+ };
564836
+ }).filter((f2) => f2.path);
564837
+ if (explicitlyIrrelevant || findings.length > 0) {
564838
+ return compressFindings({
564839
+ region,
564840
+ relevant: !explicitlyIrrelevant && findings.length > 0,
564841
+ findings,
564842
+ summary: typeof obj["summary"] === "string" ? obj["summary"] : ""
564843
+ });
564844
+ }
564845
+ }
564846
+ } catch {
564847
+ }
564848
+ }
564849
+ if (NEGATIVE_SIGNAL_RE.test(text2)) {
564850
+ return { region, relevant: false, findings: [], summary: "" };
564851
+ }
564852
+ const scraped = extractPathFindings(text2);
564853
+ return compressFindings({ region, relevant: scraped.length > 0, findings: scraped, summary: "" });
564854
+ }
564750
564855
  function buildExplorerBriefs(objectivePrefix, regions) {
564751
564856
  const outputSchema = "Return JSON: { relevant: boolean, findings: [{ path, why_relevant, snippet? }], summary }. Return relevant=false with empty findings if your region has nothing pertinent (do NOT pad).";
564752
564857
  return regions.map((region) => ({
@@ -564792,14 +564897,11 @@ function fanoutDirective(taskText) {
564792
564897
  const n2 = recommendFanout(classifyBreadth(sig));
564793
564898
  if (n2 < 2)
564794
564899
  return null;
564795
- const schema = buildExplorerBriefs("x", ["x"])[0].outputSchema;
564796
564900
  return [
564797
564901
  "[Exploration strategy — fan out]",
564798
- `This task is broad, read-heavy discovery. Prefer FANNING OUT over reading serially: split the search surface into ${n2} NON-OVERLAPPING regions (directories/subsystems) and spawn ${n2} parallel READ-ONLY \`sub_agent\` explorers one per region.`,
564799
- `Give each explorer: a one-line objective, its single region, and this exact return schema${schema}`,
564800
- "Explorers are READ-ONLY (no edit/write/mutating commands). Each returns a DISTILLED digest (paths + why-relevant + key snippets), and returns relevant=false / empty when its region has nothing pertinent — do NOT pad.",
564801
- "Then YOU merge the digests: drop the empty regions, dedupe paths, and work from the merged digest — keep your own context small by reasoning over the distilled findings, never raw file dumps.",
564802
- "Only fan out when the surface genuinely spans multiple regions; for a single-file or narrow change, just do it directly."
564902
+ "This task is broad, read-heavy discovery across multiple components. Do NOT grep the whole repo serially into your own context that floods you with raw output and is slow.",
564903
+ "Instead make ONE call to `fanout_explore` with a clear `objective` (what you need to find). It splits the codebase into non-overlapping regions, runs parallel READ-ONLY explorer sub-agents that each return a DISTILLED digest, merges them, and hands you back a compact map of relevant paths keeping your own context small.",
564904
+ "After fanout_explore returns, work from the merged digest: open only the paths it flagged. Fall back to direct grep_search/file_read only for a single-file or narrow follow-up."
564803
564905
  ].join("\n");
564804
564906
  }
564805
564907
  function mergeDigests(digests) {
@@ -564818,11 +564920,14 @@ function mergeDigests(digests) {
564818
564920
  const synthesis = relevant.length ? `${relevant.length} region(s) yielded ${paths.length} relevant path(s); ${emptyRegions.length} region(s) empty.` : `No relevant findings across ${digests.length} region(s).`;
564819
564921
  return { digests: relevant, paths, emptyRegions, synthesis };
564820
564922
  }
564821
- var EXPLORE_INTENT_RE;
564923
+ var EXPLORE_INTENT_RE, REGION_IGNORE_RE, PATH_LIKE_RE, NEGATIVE_SIGNAL_RE;
564822
564924
  var init_exploration_fanout = __esm({
564823
564925
  "packages/orchestrator/dist/exploration-fanout.js"() {
564824
564926
  "use strict";
564825
564927
  EXPLORE_INTENT_RE = /\b(explore|discover|find|locate|search|where\b|which file|map (out )?the|survey|audit|trace|understand the|gather|investigate|look (through|across)|grep|scan the (code|repo))\b/i;
564928
+ REGION_IGNORE_RE = /^(node_modules|dist|build|coverage|out|tmp|temp|\.git|\.next|\.turbo|\.cache|\.omnius|\.aiwg|\.vscode|\.idea|target|vendor)$/i;
564929
+ PATH_LIKE_RE = /[A-Za-z0-9_.@/-]+\/[A-Za-z0-9_./-]+\.[A-Za-z]{1,6}/;
564930
+ NEGATIVE_SIGNAL_RE = /findings?\s*:?\s*\**\s*none\b|\bnone\s+found\b|\bno\s+(relevant\s+)?(matches|results|findings|auth\w*|bearer|token)\b|\bnot\s+handled\b|\bnothing\s+(pertinent|relevant|found)\b|no[^.\n]{0,40}\b(was|were)\s+found\b/i;
564826
564931
  }
564827
564932
  });
564828
564933
 
@@ -590482,6 +590587,7 @@ __export(dist_exports3, {
590482
590587
  buildDecompositionDirective: () => buildDecompositionDirective,
590483
590588
  buildDecompositionTodos: () => buildDecompositionTodos,
590484
590589
  buildExplorerBriefs: () => buildExplorerBriefs,
590590
+ buildExplorerPrompt: () => buildExplorerPrompt,
590485
590591
  buildForkPrompt: () => buildForkPrompt,
590486
590592
  buildLessonQuery: () => buildLessonQuery,
590487
590593
  buildMetaCritiquePrompt: () => buildMetaCritiquePrompt,
@@ -590520,6 +590626,7 @@ __export(dist_exports3, {
590520
590626
  decomposeSpec: () => decomposeSpec,
590521
590627
  deleteAgentTaskSidecar: () => deleteAgentTaskSidecar,
590522
590628
  deriveClaimsFromProposedText: () => deriveClaimsFromProposedText,
590629
+ deriveRegions: () => deriveRegions,
590523
590630
  detectExitCodeMisread: () => detectExitCodeMisread,
590524
590631
  detectExplorationIntent: () => detectExplorationIntent,
590525
590632
  detectPressure: () => detectPressure,
@@ -590532,6 +590639,7 @@ __export(dist_exports3, {
590532
590639
  extractConstraint: () => extractConstraint,
590533
590640
  extractLessons: () => extractLessons,
590534
590641
  extractMidTaskSteeringInput: () => extractMidTaskSteeringInput,
590642
+ extractPathFindings: () => extractPathFindings,
590535
590643
  extractTaskCompleteSummary: () => extractTaskCompleteSummary,
590536
590644
  fanoutDirective: () => fanoutDirective,
590537
590645
  findDuplicateGroups: () => findDuplicateGroups,
@@ -590591,6 +590699,7 @@ __export(dist_exports3, {
590591
590699
  noteAfterTask: () => noteAfterTask,
590592
590700
  parseContextReferences: () => parseContextReferences,
590593
590701
  parseCritique: () => parseCritique,
590702
+ parseExplorerDigest: () => parseExplorerDigest,
590594
590703
  parseMetaCritique: () => parseMetaCritique,
590595
590704
  parsePlan: () => parsePlan,
590596
590705
  parseTextToolCalls: () => parseTextToolCalls,
@@ -610902,6 +611011,28 @@ var init_status_bar = __esm({
610902
611011
  _brailleSpinner = new BrailleSpinner();
610903
611012
  /** Slow refresh timer for monitoring bar when braille spinner is off */
610904
611013
  _monitorTimer = null;
611014
+ /**
611015
+ * Header inference indicator — a small braille glyph that cycles next to the
611016
+ * "Omnius v{version}" identity segment (left of the menu buttons) WHENEVER the
611017
+ * agent is inferencing, so the user can see it's working in the background and
611018
+ * not stalled — including during prompt-processing / cold-load before any
611019
+ * tokens stream. Self-driven on its own timer so it animates even when no
611020
+ * tokens are flowing yet.
611021
+ */
611022
+ static HEADER_SPINNER_FRAMES = [
611023
+ "⠋",
611024
+ "⠙",
611025
+ "⠹",
611026
+ "⠸",
611027
+ "⠼",
611028
+ "⠴",
611029
+ "⠦",
611030
+ "⠧",
611031
+ "⠇",
611032
+ "⠏"
611033
+ ];
611034
+ _headerSpinnerFrame = 0;
611035
+ _headerSpinnerTimer = null;
610905
611036
  /** Current dynamic footer height: box top + input rows + box bottom + optional metrics. */
610906
611037
  _currentFooterHeight = 4;
610907
611038
  // box-top(1) + input(1) + box-bottom(1) + metrics(1)
@@ -611006,6 +611137,14 @@ var init_status_bar = __esm({
611006
611137
  last2.width += 2;
611007
611138
  }
611008
611139
  }
611140
+ if (this._processing) {
611141
+ const glyph = _StatusBar.HEADER_SPINNER_FRAMES[this._headerSpinnerFrame] ?? "";
611142
+ const last2 = parts[parts.length - 1];
611143
+ if (last2 && glyph) {
611144
+ last2.text += `${glyph} `;
611145
+ last2.width += 2;
611146
+ }
611147
+ }
611009
611148
  return parts;
611010
611149
  }
611011
611150
  buildHeaderIdentityRender() {
@@ -611517,10 +611656,35 @@ var init_status_bar = __esm({
611517
611656
  clearInterval(this._monitorTimer);
611518
611657
  this._monitorTimer = null;
611519
611658
  }
611659
+ this._startHeaderSpinner();
611520
611660
  } else {
611661
+ this._stopHeaderSpinner();
611521
611662
  this.ensureMonitorTimer();
611522
611663
  }
611523
611664
  }
611665
+ /**
611666
+ * Start cycling the header inference glyph. Ticks on its own ~110 ms timer
611667
+ * and repaints the header panels so the braille frame advances even while the
611668
+ * model is still processing the prompt (no token stream yet). Idempotent.
611669
+ */
611670
+ _startHeaderSpinner() {
611671
+ if (this._headerSpinnerTimer) return;
611672
+ this._headerSpinnerFrame = 0;
611673
+ if (this.active) this.refreshHeaderPanels();
611674
+ this._headerSpinnerTimer = setInterval(() => {
611675
+ this._headerSpinnerFrame = (this._headerSpinnerFrame + 1) % _StatusBar.HEADER_SPINNER_FRAMES.length;
611676
+ if (this.active) this.refreshHeaderPanels();
611677
+ }, 110);
611678
+ this._headerSpinnerTimer.unref?.();
611679
+ }
611680
+ /** Stop the header inference glyph and repaint once so it disappears cleanly. */
611681
+ _stopHeaderSpinner() {
611682
+ if (this._headerSpinnerTimer) {
611683
+ clearInterval(this._headerSpinnerTimer);
611684
+ this._headerSpinnerTimer = null;
611685
+ }
611686
+ if (this.active) this.refreshHeaderPanels();
611687
+ }
611524
611688
  /**
611525
611689
  * Ensure the monitoring timer is running when the registry has entries
611526
611690
  * and the braille spinner is not active. Refreshes the buffer line
@@ -612081,6 +612245,10 @@ var init_status_bar = __esm({
612081
612245
  this._brailleSpinner.stop();
612082
612246
  this._processing = false;
612083
612247
  }
612248
+ if (this._headerSpinnerTimer) {
612249
+ clearInterval(this._headerSpinnerTimer);
612250
+ this._headerSpinnerTimer = null;
612251
+ }
612084
612252
  this.stopAllMetrics();
612085
612253
  this.termWrite(`\x1B[1;${termRows()}r`);
612086
612254
  }
@@ -710212,6 +710380,9 @@ function buildTools(repoRoot, config, contextWindowSize, modelTier2) {
710212
710380
  // MCP tools (dynamic — from connected MCP servers, WO-MCP-01)
710213
710381
  ..._mcpTools.map(adaptTool6),
710214
710382
  createSubAgentTool(config, repoRoot, contextWindowSize),
710383
+ // Active exploration fan-out — one call spawns parallel read-only explorers
710384
+ // and returns a merged digest (Workstream B).
710385
+ createFanoutExploreTool(config, repoRoot, contextWindowSize),
710215
710386
  // Self-critique plan mode (WO-TP2)
710216
710387
  createPlanModeTool(config, repoRoot, contextWindowSize),
710217
710388
  createTaskCompleteTool(modelTier2, repoRoot)
@@ -710478,6 +710649,151 @@ Use task_status(task_id="${taskId}") or task_output(task_id="${taskId}") to chec
710478
710649
  };
710479
710650
  return tool;
710480
710651
  }
710652
+ function createFanoutExploreTool(config, repoRoot, ctxWindowSize) {
710653
+ return {
710654
+ name: "fanout_explore",
710655
+ description: "Discover where something lives across a large/multi-package codebase by fanning out parallel READ-ONLY explorer sub-agents — one per region — and returning a single merged, distilled map of the relevant files. Use this ONCE for broad 'where/how is X handled across the codebase' questions instead of grepping the whole repo serially. For a single-file or narrow lookup, use grep_search/file_read directly instead.",
710656
+ parameters: {
710657
+ type: "object",
710658
+ properties: {
710659
+ objective: {
710660
+ type: "string",
710661
+ description: "What to find, e.g. 'where authentication is handled' or 'all places that read the media store path'."
710662
+ },
710663
+ regions: {
710664
+ type: "array",
710665
+ items: { type: "string" },
710666
+ description: "Optional explicit regions (dirs/packages) to split across. If omitted, regions are derived from the repo (packages/* or top-level dirs)."
710667
+ },
710668
+ max_regions: {
710669
+ type: "number",
710670
+ description: "Cap on the number of parallel explorers (default 6)."
710671
+ }
710672
+ },
710673
+ required: ["objective"]
710674
+ },
710675
+ async execute(args) {
710676
+ const objective = String(
710677
+ args["objective"] ?? args["task"] ?? args["query"] ?? ""
710678
+ ).trim();
710679
+ if (!objective) {
710680
+ return { success: false, output: "", error: "objective is required" };
710681
+ }
710682
+ const maxRegions = typeof args["max_regions"] === "number" && args["max_regions"] > 0 ? Math.min(8, Math.floor(args["max_regions"])) : 6;
710683
+ let regions = Array.isArray(args["regions"]) ? args["regions"].map((r2) => String(r2)).filter(Boolean) : [];
710684
+ if (regions.length === 0) {
710685
+ const listDir = (rel) => {
710686
+ try {
710687
+ return readdirSync57(join173(repoRoot, rel), { withFileTypes: true }).map(
710688
+ (d2) => ({ name: d2.name, isDir: d2.isDirectory() })
710689
+ );
710690
+ } catch {
710691
+ return [];
710692
+ }
710693
+ };
710694
+ regions = deriveRegions(listDir("."), listDir("packages"), {
710695
+ max: maxRegions
710696
+ });
710697
+ } else {
710698
+ regions = regions.slice(0, maxRegions);
710699
+ }
710700
+ if (regions.length < 2) {
710701
+ return {
710702
+ success: false,
710703
+ output: "",
710704
+ error: "fanout_explore needs ≥2 regions to be worthwhile; for a narrow search use grep_search/file_read directly."
710705
+ };
710706
+ }
710707
+ const briefs = buildExplorerBriefs(objective, regions);
710708
+ const subTier = getModelTier(config.model);
710709
+ const compaction = subTier === "small" ? 12e3 : subTier === "medium" ? 24e3 : 4e4;
710710
+ const debug = process.env["OMNIUS_FANOUT_DEBUG"] === "1";
710711
+ const rawReturns = [];
710712
+ const digests = await Promise.all(
710713
+ briefs.map(async (brief) => {
710714
+ try {
710715
+ const backend = new OllamaAgenticBackend(
710716
+ config.backendUrl,
710717
+ config.model,
710718
+ config.apiKey
710719
+ );
710720
+ const runner = new AgenticRunner(backend, {
710721
+ maxTurns: 10,
710722
+ maxTokens: 4096,
710723
+ temperature: 0,
710724
+ requestTimeoutMs: config.timeoutMs,
710725
+ taskTimeoutMs: config.timeoutMs * 2,
710726
+ compactionThreshold: compaction,
710727
+ contextWindowSize: ctxWindowSize ?? 0,
710728
+ modelTier: subTier,
710729
+ toolProfile: getRuntimeToolProfilePolicy(repoRoot)
710730
+ });
710731
+ const roTools = [
710732
+ new FileReadTool(repoRoot),
710733
+ new GrepSearchTool(repoRoot),
710734
+ new GlobFindTool(repoRoot),
710735
+ new ListDirectoryTool(repoRoot)
710736
+ ].map(adaptTool6);
710737
+ roTools.push(createTaskCompleteTool(subTier, repoRoot));
710738
+ for (const t2 of roTools) runner.registerTool(t2);
710739
+ const result = await runner.run(
710740
+ buildExplorerPrompt(brief),
710741
+ `Working directory: ${repoRoot}`
710742
+ );
710743
+ const raw = result.summary || "";
710744
+ if (debug) rawReturns.push({ region: brief.scope, raw });
710745
+ return parseExplorerDigest(brief.scope, raw);
710746
+ } catch (err) {
710747
+ if (debug)
710748
+ rawReturns.push({
710749
+ region: brief.scope,
710750
+ raw: `[explorer error] ${err instanceof Error ? err.message : String(err)}`
710751
+ });
710752
+ return { region: brief.scope, relevant: false, findings: [], summary: "" };
710753
+ }
710754
+ })
710755
+ );
710756
+ if (debug) {
710757
+ try {
710758
+ writeFileSync87(
710759
+ join173(repoRoot, ".omnius", "fanout-debug.json"),
710760
+ JSON.stringify({ objective, regions, rawReturns, digests }, null, 2)
710761
+ );
710762
+ } catch {
710763
+ }
710764
+ }
710765
+ const merged = mergeDigests(digests);
710766
+ if (merged.paths.length === 0) {
710767
+ return {
710768
+ success: true,
710769
+ output: `[fanout_explore] ${objective}
710770
+ ${merged.synthesis}
710771
+ Explored regions: ${regions.join(", ")}
710772
+ No relevant files found — broaden the objective or search specific paths directly.`
710773
+ };
710774
+ }
710775
+ const lines = [
710776
+ `[fanout_explore] ${objective}`,
710777
+ merged.synthesis,
710778
+ "",
710779
+ "Relevant files (deduped):",
710780
+ ...merged.paths.map((p2) => ` - ${p2}`),
710781
+ "",
710782
+ "By region:"
710783
+ ];
710784
+ for (const d2 of merged.digests) {
710785
+ lines.push(`## ${d2.region}${d2.summary ? ` — ${d2.summary}` : ""}`);
710786
+ for (const f2 of d2.findings) {
710787
+ lines.push(` - ${f2.path} — ${f2.whyRelevant}`);
710788
+ }
710789
+ }
710790
+ if (merged.emptyRegions.length > 0) {
710791
+ lines.push("", `Empty regions (covered, nothing found): ${merged.emptyRegions.join(", ")}`);
710792
+ }
710793
+ return { success: true, output: lines.join("\n") };
710794
+ }
710795
+ };
710796
+ }
710481
710797
  function createPlanModeTool(config, repoRoot, ctxWindowSize) {
710482
710798
  return {
710483
710799
  name: "enter_plan_mode",
@@ -0,0 +1,229 @@
1
+ # Auth Map — Where Authentication/Authorization is Handled Across Omnius
2
+
3
+ > Auto-generated from codebase scan. Covers all packages and apps.
4
+
5
+ ## Summary
6
+
7
+ Omnius has **no centralized auth system** (no login, no JWT, no session cookies, no OAuth). Authentication is handled **peripherally** in three ways:
8
+
9
+ 1. **External provider auth** — API keys/tokens for remote inference providers (OpenAI, Anthropic, etc.)
10
+ 2. **Secret redaction** — preventing credential leaks in logs/tool output
11
+ 3. **Session-scoped permissions** — internal permission rules for sub-agent handoffs
12
+
13
+ There is **zero auth on the REST daemon** (`apps/api`) — all routes are open.
14
+
15
+ ---
16
+
17
+ ## 1. apps/api (REST Daemon) — NO AUTH
18
+
19
+ | File | Finding |
20
+ |------|---------|
21
+ | `apps/api/src/app.ts` | Helmet, CORS, compression, morgan. **No auth middleware, no API key check, no bearer validation.** |
22
+ | `apps/api/src/routes/sessions.ts` | In-memory Map-based session store. **No auth on any route** (POST/GET/DELETE all accept unauthenticated requests). |
23
+ | `apps/api/src/routes/health.ts` | Health check — no auth needed. |
24
+ | `apps/api/src/middleware/error-handler.ts` | Error handling only. |
25
+
26
+ **Verdict:** The REST daemon is completely open. Any caller can create sessions, send messages, list/delete sessions.
27
+
28
+ ---
29
+
30
+ ## 2. apps/worker (Background Worker) — NO AUTH
31
+
32
+ | File | Finding |
33
+ |------|---------|
34
+ | `apps/worker/src/queue.ts` | Only references `sessionId: string` in queue job types. No auth logic. |
35
+
36
+ **Verdict:** Worker processes tasks from the queue without auth checks. Trusts the API daemon to route correctly.
37
+
38
+ ---
39
+
40
+ ## 3. packages/cli — Provider Auth + Secret Redaction
41
+
42
+ ### 3a. Provider API Key Configuration
43
+
44
+ | File | Line | Finding |
45
+ |------|------|---------|
46
+ | `packages/cli/src/config.ts` | 32 | `/** Optional Bearer token for authenticated vLLM deployments */` — config field for vLLM auth |
47
+ | `packages/cli/src/config.ts` | 50 | Tool-calling session opt-in logic (not auth, but session-scoped) |
48
+
49
+ ### 3b. Secret Redaction (preventing credential leaks)
50
+
51
+ | File | Finding |
52
+ |------|---------|
53
+ | `packages/cli/src/redact/secret-redactor.ts` | Comprehensive regex-based secret redactor. Detects and masks: |
54
+ | | - Known API key prefixes: `sk-`, `sk-or-`, `gsk_`, `fw_`, `cpk_`, `csk-`, `nvapi-`, `xox[baprs]-`, `hf_`, `r8_`, `npm_`, `pypi-`, `gAAAA` |
55
+ | | - Generic patterns: `api_key`, `token`, `secret`, `password`, `access_token`, `refresh_token`, `auth_token`, `bearer` |
56
+ | | - Short tokens (<18 chars) → fully masked (`***`). Longer → partial (`sk-..yKey`) |
57
+
58
+ ### 3c. Session State
59
+
60
+ | File | Finding |
61
+ |------|---------|
62
+ | `packages/cli/src/state/store.ts` | `closeSession(sessionId, endReason)` — session lifecycle management. Token counting (input/output/cache_read/cache_write/reasoning). No auth. |
63
+
64
+ ---
65
+
66
+ ## 4. packages/backend-vllm — Provider Auth (API Keys)
67
+
68
+ ### 4a. Provider Auth Configuration
69
+
70
+ | File | Line | Provider | authRequired | keyPrefix |
71
+ |------|------|----------|-------------|-----------|
72
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 81 | Anthropic | true | `sk-ant-` |
73
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 85 | OpenAI | true | `sk-` |
74
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 89 | Together AI | true | — |
75
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 93 | Groq | true | `gsk_` |
76
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 97 | OpenRouter | true | `sk-or-` |
77
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 101 | Fireworks AI | true | `fw_` |
78
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 105 | DeepInfra | true | — |
79
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 109 | Mistral AI | true | — |
80
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 113 | Chutes AI | true | `cpk_` |
81
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 117 | Cerebras | true | `csk-` |
82
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 121 | SambaNova | true | — |
83
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 125 | NVIDIA NIM | true | `nvapi-` |
84
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 129 | Hyperbolic | true | — |
85
+ | `packages/backend-vllm/src/normalizeUrl.ts` | 134 | Ollama (local) | **false** | — |
86
+
87
+ ### 4b. Runtime Auth Headers
88
+
89
+ | File | Line | Finding |
90
+ |------|------|---------|
91
+ | `packages/backend-vllm/src/VllmBackend.ts` | 217 | `private authHeaders(): Record<string, string>` — builds auth headers for vLLM requests |
92
+ | `packages/backend-vllm/src/VllmBackend.ts` | 237 | Uses `authHeaders()` in fetch calls |
93
+
94
+ **Verdict:** Provider auth is key-based (Bearer tokens). No OAuth flow. Keys are configured in CLI config and passed as headers.
95
+
96
+ ---
97
+
98
+ ## 5. packages/orchestrator — Session-Scoped Permissions
99
+
100
+ ### 5a. Permission Ruleset (sub-agent authorization)
101
+
102
+ | File | Finding |
103
+ |------|---------|
104
+ | `packages/orchestrator/src/permissionRuleset.ts` | **The only authorization logic in the codebase.** Implements: |
105
+ | | - Parent session deny rules (cascade to sub-agents) |
106
+ | | - Parent agent deny rules |
107
+ | | - External directory rules forwarded to sub-agent sessions |
108
+ | | - "Forwarding pattern" — parent agent denies + parent session denies + external_directory rules cascade |
109
+
110
+ ### 5b. Session Metrics
111
+
112
+ | File | Finding |
113
+ |------|---------|
114
+ | `packages/orchestrator/src/sessionMetrics.ts` | Tracks `sessionDurationMs`, token usage, context estimates. No auth. |
115
+
116
+ ### 5c. Adversarial Handoffs (test data only)
117
+
118
+ | File | Finding |
119
+ |------|---------|
120
+ | `packages/orchestrator/src/adversarialHandoffs.ts` | Contains test scenarios referencing logout/session cleanup (lines 324-369). These are **test fixtures**, not production auth code. |
121
+
122
+ ---
123
+
124
+ ## 6. packages/execution — Session Key Reservation + Secret Detection
125
+
126
+ ### 6a. Model Broker (session key reservation)
127
+
128
+ | File | Line | Finding |
129
+ |------|------|---------|
130
+ | `packages/execution/src/model-broker.ts` | 205-207 | `sessionKey?: string` — reserved per-chat session key for guaranteed slots |
131
+ | `packages/execution/src/model-broker.ts` | 361-362 | `_reservedBySession: Map<string, string>` — reserved slots per sessionKey |
132
+ | `packages/execution/src/model-broker.ts` | 1271-1277 | Reserved slot path: per-session, one outstanding slot per sessionKey |
133
+
134
+ ### 6b. Secret Detector (MCP)
135
+
136
+ | File | Finding |
137
+ |------|---------|
138
+ | `packages/execution/src/mcp/secret-detector.ts` | `matchType: "auth-header"` — detects auth header prefixes in strings. Sensitive field name tracking. |
139
+
140
+ ---
141
+
142
+ ## 7. packages/indexer — Auth Domain Classification (metadata only)
143
+
144
+ | File | Line | Finding |
145
+ |------|------|---------|
146
+ | `packages/indexer/src/fileSummarizer.ts` | 30 | `ownershipArea` field: "Logical ownership area (e.g. 'auth', 'api', 'db', 'frontend')" |
147
+ | `packages/indexer/src/fileSummarizer.ts` | 54 | Path regex: `/\/(auth|authentication|login|session|jwt|oauth|passport)/` → classifies as "auth" domain |
148
+ | `packages/indexer/src/fileSummarizer.ts` | 80 | Domain keyword `/auth/i` in file content |
149
+ | `packages/indexer/src/fileSummarizer.ts` | 119 | `if (domain === "auth") return "high"` — auth domain files get high priority |
150
+
151
+ **Verdict:** The indexer classifies files as "auth" domain for indexing priority, but this is metadata, not auth enforcement.
152
+
153
+ ---
154
+
155
+ ## 8. packages/memory — Session-Scoped Memory
156
+
157
+ | File | Finding |
158
+ |------|---------|
159
+ | `packages/memory/src/selfModel.ts` | `DECAY_CLASSES: ["session", "daily", "procedural", "permanent"]` — session-scoped memory decay |
160
+ | `packages/memory/src/toolOutcomes.ts` | `Reset (e.g., on session start before restoring from store)` |
161
+ | `packages/memory/src/predictionStore.ts` | `tokenSimilarity()` — token-based string comparison (not auth tokens) |
162
+
163
+ ---
164
+
165
+ ## 9. packages/schemas — Session Schema
166
+
167
+ | File | Finding |
168
+ |------|---------|
169
+ | `packages/schemas/src/messages.ts` | `sessionId: z.string().uuid()` — session ID schema |
170
+ | `packages/schemas/src/index.ts` | `export { SessionSchema, type Session }` |
171
+ | `packages/schemas/src/memory.ts` | `ownershipArea` field: "Logical ownership area (e.g. 'auth', 'api', 'db', 'frontend')" |
172
+
173
+ ---
174
+
175
+ ## 10. packages/retrieval — No Auth
176
+
177
+ | File | Finding |
178
+ |------|---------|
179
+ | `packages/retrieval/src/semanticSearch.ts` | "auth" appears only as an example query term: `Example: "auth middleware +api -test ~service"` |
180
+ | `packages/retrieval/src/snippetPacker.ts` | Token budget logic (not auth tokens) |
181
+
182
+ ---
183
+
184
+ ## 11. packages/prompts — No Auth
185
+
186
+ No auth-related code found.
187
+
188
+ ---
189
+
190
+ ## Consolidated Auth Architecture
191
+
192
+ ```
193
+ ┌─────────────────────────────────────────────────────────────────┐
194
+ │ AUTH IN OMNIUS │
195
+ │ │
196
+ │ 1. PROVIDER AUTH (API Keys) │
197
+ │ ├── CLI config → bearer tokens for remote providers │
198
+ │ ├── backend-vllm → authHeaders() for vLLM requests │
199
+ │ ├── 14 remote providers configured (all require API keys) │
200
+ │ └── Ollama (local) → no auth required │
201
+ │ │
202
+ │ 2. SECRET REDACTION │
203
+ │ ├── CLI secret-redactor.ts — regex-based masking │
204
+ │ ├── MCP secret-detector.ts — auth header detection │
205
+ │ └── Covers: sk-, gsk_, hf_, npm_, pypi-, etc. │
206
+ │ │
207
+ │ 3. SESSION-SCOPED PERMISSIONS (internal) │
208
+ │ ├── orchestrator/permissionRuleset.ts — deny cascade │
209
+ │ ├── execution/model-broker.ts — sessionKey slot reservation│
210
+ │ └── memory/selfModel.ts — session-scoped decay │
211
+ │ │
212
+ │ 4. REST DAEMON — NO AUTH │
213
+ │ ├── apps/api — helmet + cors only │
214
+ │ ├── sessionsRouter — in-memory, no auth │
215
+ │ └── healthRouter — open │
216
+ │ │
217
+ │ 5. WORKER — NO AUTH │
218
+ │ └── Trusts API daemon for routing │
219
+ └─────────────────────────────────────────────────────────────────┘
220
+ ```
221
+
222
+ ## Key Gaps
223
+
224
+ 1. **REST daemon has zero authentication** — anyone can create sessions, send messages, and read responses
225
+ 2. **No OAuth flows** — all provider auth is static API keys
226
+ 3. **No rate limiting** — no rate-limit middleware in the API
227
+ 4. **No CSRF protection** — CORS is enabled but no CSRF tokens
228
+ 5. **No session validation** — sessions are in-memory Map, no persistence or validation
229
+ 6. **No admin/auth endpoints** — no login, logout, or user management
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.341",
3
+ "version": "1.0.342",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.341",
9
+ "version": "1.0.342",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
@@ -430,9 +430,9 @@
430
430
  }
431
431
  },
432
432
  "node_modules/@helia/utils/node_modules/cborg": {
433
- "version": "5.1.3",
434
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.3.tgz",
435
- "integrity": "sha512-DddFYcafyPlnoF33ezbrh3jXT8QnuTQiy/LEL4xoMVH60WIBQbLwb2npNquSM0WouEMvl5xTJ1Y8iECaMdh3gg==",
433
+ "version": "5.1.4",
434
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.4.tgz",
435
+ "integrity": "sha512-EDoD59RBV51H5ar6i29ut7AyOJi0BUIEhtbnJJac3qYcMG74Db6eVce/dIh+Wh6tVwBi7cRWDXmdms+fKPQvcQ==",
436
436
  "license": "Apache-2.0",
437
437
  "bin": {
438
438
  "cborg": "lib/bin.js"
@@ -461,9 +461,9 @@
461
461
  }
462
462
  },
463
463
  "node_modules/@ipld/dag-cbor/node_modules/cborg": {
464
- "version": "5.1.3",
465
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.3.tgz",
466
- "integrity": "sha512-DddFYcafyPlnoF33ezbrh3jXT8QnuTQiy/LEL4xoMVH60WIBQbLwb2npNquSM0WouEMvl5xTJ1Y8iECaMdh3gg==",
464
+ "version": "5.1.4",
465
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.4.tgz",
466
+ "integrity": "sha512-EDoD59RBV51H5ar6i29ut7AyOJi0BUIEhtbnJJac3qYcMG74Db6eVce/dIh+Wh6tVwBi7cRWDXmdms+fKPQvcQ==",
467
467
  "license": "Apache-2.0",
468
468
  "bin": {
469
469
  "cborg": "lib/bin.js"
@@ -480,9 +480,9 @@
480
480
  }
481
481
  },
482
482
  "node_modules/@ipld/dag-json/node_modules/cborg": {
483
- "version": "5.1.3",
484
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.3.tgz",
485
- "integrity": "sha512-DddFYcafyPlnoF33ezbrh3jXT8QnuTQiy/LEL4xoMVH60WIBQbLwb2npNquSM0WouEMvl5xTJ1Y8iECaMdh3gg==",
483
+ "version": "5.1.4",
484
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.4.tgz",
485
+ "integrity": "sha512-EDoD59RBV51H5ar6i29ut7AyOJi0BUIEhtbnJJac3qYcMG74Db6eVce/dIh+Wh6tVwBi7cRWDXmdms+fKPQvcQ==",
486
486
  "license": "Apache-2.0",
487
487
  "bin": {
488
488
  "cborg": "lib/bin.js"
@@ -502,9 +502,9 @@
502
502
  }
503
503
  },
504
504
  "node_modules/@ipld/dag-pb/node_modules/multiformats": {
505
- "version": "14.0.0",
506
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
507
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
505
+ "version": "14.0.2",
506
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
507
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
508
508
  "license": "Apache-2.0 OR MIT"
509
509
  },
510
510
  "node_modules/@ipshipyard/libp2p-auto-tls": {
@@ -741,9 +741,9 @@
741
741
  }
742
742
  },
743
743
  "node_modules/@libp2p/http-utils/node_modules/multiformats": {
744
- "version": "14.0.0",
745
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
746
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
744
+ "version": "14.0.2",
745
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
746
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
747
747
  "license": "Apache-2.0 OR MIT"
748
748
  },
749
749
  "node_modules/@libp2p/http-utils/node_modules/uint8arraylist": {
@@ -783,9 +783,9 @@
783
783
  }
784
784
  },
785
785
  "node_modules/@libp2p/http-websocket/node_modules/multiformats": {
786
- "version": "14.0.0",
787
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
788
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
786
+ "version": "14.0.2",
787
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
788
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
789
789
  "license": "Apache-2.0 OR MIT"
790
790
  },
791
791
  "node_modules/@libp2p/http-websocket/node_modules/uint8arraylist": {
@@ -1021,9 +1021,9 @@
1021
1021
  }
1022
1022
  },
1023
1023
  "node_modules/@libp2p/peer-record/node_modules/multiformats": {
1024
- "version": "14.0.0",
1025
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
1026
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
1024
+ "version": "14.0.2",
1025
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1026
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1027
1027
  "license": "Apache-2.0 OR MIT"
1028
1028
  },
1029
1029
  "node_modules/@libp2p/peer-record/node_modules/protons-runtime": {
@@ -1131,9 +1131,9 @@
1131
1131
  }
1132
1132
  },
1133
1133
  "node_modules/@libp2p/record/node_modules/multiformats": {
1134
- "version": "14.0.0",
1135
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
1136
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
1134
+ "version": "14.0.2",
1135
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1136
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1137
1137
  "license": "Apache-2.0 OR MIT"
1138
1138
  },
1139
1139
  "node_modules/@libp2p/record/node_modules/protons-runtime": {
@@ -1368,9 +1368,9 @@
1368
1368
  }
1369
1369
  },
1370
1370
  "node_modules/@libp2p/webrtc/node_modules/multiformats": {
1371
- "version": "14.0.0",
1372
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
1373
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
1371
+ "version": "14.0.2",
1372
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1373
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1374
1374
  "license": "Apache-2.0 OR MIT"
1375
1375
  },
1376
1376
  "node_modules/@libp2p/webrtc/node_modules/node-datachannel": {
@@ -1495,9 +1495,9 @@
1495
1495
  }
1496
1496
  },
1497
1497
  "node_modules/@multiformats/dns": {
1498
- "version": "1.0.13",
1499
- "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz",
1500
- "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==",
1498
+ "version": "1.0.14",
1499
+ "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.14.tgz",
1500
+ "integrity": "sha512-5h8q+baKBsV4nW7rCREbJBpGNP8Lcn443illiZs5eWNBd+fXCt+mRGGIL7UNF7y8HD8mtciIYKJwCMbJBvsZMA==",
1501
1501
  "license": "Apache-2.0 OR MIT",
1502
1502
  "dependencies": {
1503
1503
  "@dnsquery/dns-packet": "^6.1.1",
@@ -1505,7 +1505,22 @@
1505
1505
  "hashlru": "^2.3.0",
1506
1506
  "p-queue": "^9.0.0",
1507
1507
  "progress-events": "^1.0.0",
1508
- "uint8arrays": "^5.0.2"
1508
+ "uint8arrays": "^6.1.1"
1509
+ }
1510
+ },
1511
+ "node_modules/@multiformats/dns/node_modules/multiformats": {
1512
+ "version": "14.0.2",
1513
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1514
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1515
+ "license": "Apache-2.0 OR MIT"
1516
+ },
1517
+ "node_modules/@multiformats/dns/node_modules/uint8arrays": {
1518
+ "version": "6.1.1",
1519
+ "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-6.1.1.tgz",
1520
+ "integrity": "sha512-iz7JN0XCSZYA111lhFG2Ui9EhFvTNekqSRHw3lvMHq+dzwWy1OQftxFQREEh4rffU0oSoXdQHsk2TiHKVm4fsA==",
1521
+ "license": "Apache-2.0 OR MIT",
1522
+ "dependencies": {
1523
+ "multiformats": "^14.0.0"
1509
1524
  }
1510
1525
  },
1511
1526
  "node_modules/@multiformats/multiaddr": {
@@ -1539,9 +1554,9 @@
1539
1554
  }
1540
1555
  },
1541
1556
  "node_modules/@multiformats/multiaddr/node_modules/multiformats": {
1542
- "version": "14.0.0",
1543
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
1544
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
1557
+ "version": "14.0.2",
1558
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1559
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1545
1560
  "license": "Apache-2.0 OR MIT"
1546
1561
  },
1547
1562
  "node_modules/@multiformats/multiaddr/node_modules/uint8-varint": {
@@ -1586,9 +1601,9 @@
1586
1601
  }
1587
1602
  },
1588
1603
  "node_modules/@multiformats/murmur3/node_modules/multiformats": {
1589
- "version": "14.0.0",
1590
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
1591
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
1604
+ "version": "14.0.2",
1605
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
1606
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
1592
1607
  "license": "Apache-2.0 OR MIT"
1593
1608
  },
1594
1609
  "node_modules/@multiformats/uri-to-multiaddr": {
@@ -3858,9 +3873,9 @@
3858
3873
  }
3859
3874
  },
3860
3875
  "node_modules/hamt-sharding/node_modules/multiformats": {
3861
- "version": "14.0.0",
3862
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
3863
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
3876
+ "version": "14.0.2",
3877
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
3878
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
3864
3879
  "license": "Apache-2.0 OR MIT"
3865
3880
  },
3866
3881
  "node_modules/hamt-sharding/node_modules/uint8arrays": {
@@ -4232,9 +4247,9 @@
4232
4247
  }
4233
4248
  },
4234
4249
  "node_modules/ipns/node_modules/cborg": {
4235
- "version": "5.1.3",
4236
- "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.3.tgz",
4237
- "integrity": "sha512-DddFYcafyPlnoF33ezbrh3jXT8QnuTQiy/LEL4xoMVH60WIBQbLwb2npNquSM0WouEMvl5xTJ1Y8iECaMdh3gg==",
4250
+ "version": "5.1.4",
4251
+ "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.4.tgz",
4252
+ "integrity": "sha512-EDoD59RBV51H5ar6i29ut7AyOJi0BUIEhtbnJJac3qYcMG74Db6eVce/dIh+Wh6tVwBi7cRWDXmdms+fKPQvcQ==",
4238
4253
  "license": "Apache-2.0",
4239
4254
  "bin": {
4240
4255
  "cborg": "lib/bin.js"
@@ -4624,9 +4639,9 @@
4624
4639
  }
4625
4640
  },
4626
4641
  "node_modules/it-protobuf-stream/node_modules/multiformats": {
4627
- "version": "14.0.0",
4628
- "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.0.tgz",
4629
- "integrity": "sha512-iWK1RrAS58p2NDfeZFuSUSv3ZPewTIhsGbh/5NgeGGJwJmRljLxGtjRR3nkn+loG3zl+IrfR/W1590QnrSK+Gg==",
4642
+ "version": "14.0.2",
4643
+ "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-14.0.2.tgz",
4644
+ "integrity": "sha512-sF7F3gBKCyehzIhDwVuTRf79TZ8qWRz5NXwWYBX+4a+n22KcFqqcDYJvZr7tySrI0MhuTBXVOlo3qMTiAHC78g==",
4630
4645
  "license": "Apache-2.0 OR MIT"
4631
4646
  },
4632
4647
  "node_modules/it-protobuf-stream/node_modules/uint8arraylist": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.341",
3
+ "version": "1.0.342",
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",