omnius 1.0.484 → 1.0.486

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
@@ -576193,6 +576193,7 @@ function normalizeCompletionStatus(value2) {
576193
576193
  function isEvidenceGatheringTool(toolName) {
576194
576194
  return [
576195
576195
  "file_read",
576196
+ "file_explore",
576196
576197
  "grep_search",
576197
576198
  "find_files",
576198
576199
  "list_directory",
@@ -576200,6 +576201,9 @@ function isEvidenceGatheringTool(toolName) {
576200
576201
  "todo_write"
576201
576202
  ].includes(toolName);
576202
576203
  }
576204
+ function isEvidenceLike(toolName, isReadLike) {
576205
+ return isReadLike || isEvidenceGatheringTool(toolName);
576206
+ }
576203
576207
  function isEditTool(toolName) {
576204
576208
  return ["file_write", "file_edit", "file_patch", "batch_edit"].includes(toolName);
576205
576209
  }
@@ -576541,7 +576545,7 @@ var init_focusSupervisor = __esm({
576541
576545
  return this.pass();
576542
576546
  }
576543
576547
  const strict = this.shouldStrictlyIntervene(input.context);
576544
- const sameTurnAsDirective = input.turn <= prior.createdTurn;
576548
+ const sameTurnAsDirective = prior.state === "verify_or_block" ? input.turn < prior.createdTurn : input.turn <= prior.createdTurn;
576545
576549
  const alreadyCountedThisTurn = this.lastIgnoredDirectiveTurn === input.turn;
576546
576550
  if (sameTurnAsDirective || alreadyCountedThisTurn) {
576547
576551
  if (strict) {
@@ -576692,10 +576696,32 @@ var init_focusSupervisor = __esm({
576692
576696
  this.clearSatisfiedDirective("requested edit already applied", input.turn);
576693
576697
  return;
576694
576698
  }
576695
- if (input.success && input.noop && input.isReadLike && (this.directive?.requiredNextAction === "use_cached_evidence" || this.directive?.requiredNextAction === "read_authoritative_target")) {
576699
+ if (input.success && input.noop && isEvidenceLike(input.toolName, input.isReadLike) && (this.directive?.requiredNextAction === "use_cached_evidence" || this.directive?.requiredNextAction === "read_authoritative_target")) {
576696
576700
  this.clearSatisfiedDirective(input.runtimeAuthored ? "cached authoritative evidence reused" : "authoritative evidence already available", input.turn);
576697
576701
  return;
576698
576702
  }
576703
+ if (input.success && isEvidenceLike(input.toolName, input.isReadLike) && this.directive?.requiredNextAction === "use_cached_evidence") {
576704
+ this.clearSatisfiedDirective(input.runtimeAuthored ? "cached evidence reused via successful read" : "alternative read action succeeded after cached evidence", input.turn);
576705
+ return;
576706
+ }
576707
+ if (input.toolName === "shell" && input.success) {
576708
+ if (this.convergenceBreaker) {
576709
+ const fam = actionFamily(input.toolName, input.args, this.familyCwd);
576710
+ this.convergenceBreaker.resolve(fam);
576711
+ this.convergenceFamilyCounts.delete(fam);
576712
+ }
576713
+ if (this.directive?.requiredNextAction === "run_verification") {
576714
+ this.clearSatisfiedDirective(input.runtimeAuthored ? "cached verification replay consumed" : "verification ran successfully", input.turn);
576715
+ } else if (isEvidenceLike(input.toolName, input.isReadLike) && this.directive?.requiredNextAction === "read_authoritative_target") {
576716
+ this.clearSatisfiedDirective("authoritative evidence read via shell", input.turn);
576717
+ } else if (!input.isReadLike && this.directive?.requiredNextAction === "use_cached_evidence") {
576718
+ this.clearSatisfiedDirective("distinct shell action executed after cached evidence", input.turn);
576719
+ } else if (input.runtimeAuthored) {
576720
+ this.lastDecision = "runtime_authored_not_satisfied";
576721
+ this.lastReason = "runtime-authored control result did not execute the requested tool";
576722
+ }
576723
+ return;
576724
+ }
576699
576725
  if (input.runtimeAuthored) {
576700
576726
  this.lastDecision = "runtime_authored_not_satisfied";
576701
576727
  this.lastReason = "runtime-authored control result did not execute the requested tool";
@@ -576725,21 +576751,6 @@ var init_focusSupervisor = __esm({
576725
576751
  }
576726
576752
  return;
576727
576753
  }
576728
- if (input.toolName === "shell" && input.success) {
576729
- if (this.convergenceBreaker) {
576730
- const fam = actionFamily(input.toolName, input.args, this.familyCwd);
576731
- this.convergenceBreaker.resolve(fam);
576732
- this.convergenceFamilyCounts.delete(fam);
576733
- }
576734
- if (this.directive?.requiredNextAction === "run_verification") {
576735
- this.clearSatisfiedDirective("verification ran successfully", input.turn);
576736
- } else if (input.isReadLike && this.directive?.requiredNextAction === "read_authoritative_target") {
576737
- this.clearSatisfiedDirective("authoritative evidence read via shell", input.turn);
576738
- } else if (!input.isReadLike && this.directive?.requiredNextAction === "use_cached_evidence") {
576739
- this.clearSatisfiedDirective("distinct shell action executed after cached evidence", input.turn);
576740
- }
576741
- return;
576742
- }
576743
576754
  if (input.success)
576744
576755
  return;
576745
576756
  const family = failureFamilyKey(input.toolName, input.args, input.error, input.output, this.familyCwd);
@@ -576828,8 +576839,9 @@ var init_focusSupervisor = __esm({
576828
576839
  markCompletionBlocked(input) {
576829
576840
  if (!this.enabled)
576830
576841
  return;
576842
+ const effectiveTurn = input.turn + 1;
576831
576843
  this.setDirective({
576832
- turn: input.turn,
576844
+ turn: effectiveTurn,
576833
576845
  state: "verify_or_block",
576834
576846
  reason: input.reason,
576835
576847
  requiredNextAction: this.resolveRequiredNextAction(input.requiredNextAction ?? "run_verification"),
@@ -576896,7 +576908,7 @@ var init_focusSupervisor = __esm({
576896
576908
  createdTurn: input.turn,
576897
576909
  ignoredCount: 0
576898
576910
  };
576899
- if (!stable) {
576911
+ if (!stable && (!existing || existing.state !== input.state || existing.requiredNextAction !== input.requiredNextAction)) {
576900
576912
  this.repeatedViolationCounts.clear();
576901
576913
  }
576902
576914
  this.directive = directive;
@@ -583713,6 +583725,8 @@ ${result.output ?? ""}`;
583713
583725
  if (this._completionIncompleteVerification)
583714
583726
  return true;
583715
583727
  const directive = this._focusSupervisor?.snapshot().directive;
583728
+ if (directive?.state === "forced_replan" && directive.requiredNextAction === "creative_pivot_or_research")
583729
+ return true;
583716
583730
  return directive?.state === "terminal_incomplete" || directive?.requiredNextAction === "report_incomplete" || directive?.requiredNextAction === "report_blocked";
583717
583731
  }
583718
583732
  /**
@@ -585600,7 +585614,13 @@ ${contentPreview}
585600
585614
  return true;
585601
585615
  if (/\b(?:cp|mv|rm|mkdir|rmdir|touch|truncate|ln|install|chmod|chown|chgrp|setfacl)\b/i.test(unquoted))
585602
585616
  return true;
585603
- if (/\b(?:udevadm|mount|umount|modprobe|insmod)\b/i.test(unquoted))
585617
+ if (/\b(?:udevadm|mount|umount|modprobe|insmod|kill|pkill|killall)\b/i.test(unquoted))
585618
+ return true;
585619
+ if (/\b(?:nohup|systemctl|service|chvt|renice)\b/i.test(unquoted))
585620
+ return true;
585621
+ if (/\bservice\s+(start|stop|restart|reload|reload-or-restart)\b/i.test(unquoted))
585622
+ return true;
585623
+ if (/\bsystemctl\s+(start|stop|restart|reload|daemon-reload|enable|disable|isolate|set-default)\b/i.test(unquoted))
585604
585624
  return true;
585605
585625
  if (/\b(?:python3?|node|ruby|deno|bun)\b[\s\S]{0,240}\b(?:writeFile|writeFileSync|openSync|mkdirSync|renameSync|unlinkSync|rmSync)\b/i.test(cmd))
585606
585626
  return true;
@@ -588778,6 +588798,7 @@ TASK: ${scrubbedTask}` : scrubbedTask;
588778
588798
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
588779
588799
  });
588780
588800
  };
588801
+ let executeSingle = async () => null;
588781
588802
  const turnCap = this.options.maxTurns && this.options.maxTurns > 0 ? this.options.maxTurns : Number.MAX_SAFE_INTEGER;
588782
588803
  for (let turn = 0; turn < turnCap; turn++) {
588783
588804
  clearTurnState(this._appState);
@@ -590810,7 +590831,7 @@ ${memoryLines.join("\n")}`
590810
590831
  });
590811
590832
  }
590812
590833
  let editFeedbackRequiredBeforeMoreEdits = null;
590813
- const executeSingle = async (tc) => {
590834
+ executeSingle = async (tc) => {
590814
590835
  if (this.aborted)
590815
590836
  return null;
590816
590837
  const actionReasonForAdvisory = this._toolActionReasonForCall(tc.name, tc.arguments ?? {});
@@ -591530,7 +591551,7 @@ Read the current file if needed, make a different concrete edit, or move to veri
591530
591551
  });
591531
591552
  }
591532
591553
  const _repeatGateMax = this._resolveRepeatGateMax();
591533
- const isFailedShellRepeat = tc.name === "shell" && typeof _existingFp?.result === "string" && _existingFp.result.includes("status: failure");
591554
+ const isFailedShellRepeat = tc.name === "shell" && typeof _existingFp?.result === "string" && _existingFp.result.includes("status: failure") && !shellLikelyMutatesFilesystem;
591534
591555
  const repeatGateEligible = isReadLike || tc.name === "memory_write" || isFailedShellRepeat;
591535
591556
  const suppressSuccessfulShellCacheGuidance = tc.name === "shell" && !isFailedShellRepeat;
591536
591557
  if (suppressSuccessfulShellCacheGuidance)
@@ -592673,7 +592694,8 @@ Respond with EXACTLY this structure before your next tool call:
592673
592694
  }
592674
592695
  const cacheableMemoryNoop = tc.name === "memory_write" && result.success && result.noop;
592675
592696
  const cacheableProjectWriteNoop = this._isProjectEditTool(tc.name) && result.success && !this._isRealProjectMutation(tc.name, result) && (result.noop === true || result.mutated === false);
592676
- if (isReadLike && result.success && result.runtimeAuthored !== true || tc.name === "shell" && result.runtimeAuthored !== true || cacheableMemoryNoop || cacheableProjectWriteNoop) {
592697
+ const cacheableShellResult = tc.name === "shell" && result.runtimeAuthored !== true && !shellLikelyMutatesFilesystem;
592698
+ if (isReadLike && result.success && result.runtimeAuthored !== true || cacheableShellResult || cacheableMemoryNoop || cacheableProjectWriteNoop) {
592677
592699
  recentToolResults.set(toolFingerprint, {
592678
592700
  result: tc.name === "shell" ? this._buildShellCacheResult(tc.arguments, result) : (
592679
592701
  // Read-like results are SERVED BACK to the model when the
@@ -594577,183 +594599,21 @@ ${this.options.maxTurns && this.options.maxTurns > 0 ? `You have ${this.options.
594577
594599
  for (const tc of msg.toolCalls) {
594578
594600
  if (this.aborted)
594579
594601
  break;
594580
- toolCallCount++;
594581
- const bfActionReason = this._toolActionReasonForCall(tc.name, tc.arguments ?? {});
594582
- const bfArgsKey = this._buildExactArgsKey(tc.arguments ?? {});
594583
- toolCallLog.push({ name: tc.name, argsKey: bfArgsKey });
594584
- this._toolLastUsedTurn.set(tc.name, turn);
594585
- if (this._contextTree) {
594586
- this._contextTree.observeToolCall(tc.name, bfArgsKey, turn);
594587
- const transition = this._contextTree.maybeTransition(turn);
594588
- if (transition) {
594589
- const phaseSlice = messages2.slice(this._phaseMessageStartIdx);
594590
- if (phaseSlice.length > 0) {
594591
- const fromNode = this._contextTree.getSnapshot().phases[transition.from];
594592
- if (fromNode) {
594593
- fromNode.messages = phaseSlice;
594594
- }
594595
- }
594596
- this.emit({
594597
- type: "status",
594598
- content: `Phase: ${transition.from} → ${transition.to} (brute-force cycle)`,
594599
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594600
- });
594601
- const summarizer = this.makePhaseSummarizer();
594602
- const contracted = this._contextTree.contractInactive(turn, summarizer ? (msgs) => summarizer(transition.from, msgs) : void 0);
594603
- if (contracted.length > 0) {
594604
- this.emit({
594605
- type: "status",
594606
- content: `Phase contraction: ${contracted.join(", ")} → contracted (${summarizer ? "LLM-summarized" : "stub-summarized"}, anchors retained, brute-force)`,
594607
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594608
- });
594609
- }
594610
- this._phaseMessageStartIdx = messages2.length;
594611
- this._taskState.phase = transition.to;
594612
- this._taskState.phaseSince = turn;
594613
- }
594614
- }
594615
- this.emit({
594616
- type: "tool_call",
594617
- toolName: tc.name,
594618
- toolArgs: tc.arguments,
594619
- turn,
594620
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594621
- });
594622
- const _decomp2BFBlock = this._maybeDecomp2Block(tc, turn);
594623
- if (_decomp2BFBlock) {
594624
- this.emit({
594625
- type: "tool_result",
594626
- toolName: tc.name,
594627
- content: _decomp2BFBlock.slice(0, 200),
594628
- success: false,
594629
- turn,
594630
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594631
- });
594632
- messages2.push(this.buildToolMessage(_decomp2BFBlock, tc.id, tc.name));
594602
+ const r2 = await executeSingle(tc);
594603
+ if (!r2)
594633
594604
  continue;
594634
- }
594635
- const resolvedTool = this.lookupRegisteredTool(tc.name);
594636
- const tool = resolvedTool?.tool;
594637
- let result;
594638
- if (!tool) {
594639
- result = {
594640
- success: false,
594641
- output: "",
594642
- error: this.unknownToolError(tc.name)
594643
- };
594644
- } else {
594645
- try {
594646
- result = await tool.execute(tc.arguments);
594647
- result = this.applyRegisteredToolResultTriage(result, resolvedTool?.name ?? tc.name, tool);
594648
- } catch (err) {
594649
- result = {
594650
- success: false,
594651
- output: "",
594652
- error: err instanceof Error ? err.message : String(err)
594653
- };
594654
- }
594655
- }
594656
- if (!result.success && tc.name === "shell" && /\[PERMISSION_ERROR\]/.test(result.error ?? "")) {
594657
- this.emit({
594658
- type: "sudo_request",
594659
- content: `Command requires elevated privileges: ${tc.arguments.command?.slice(0, 100) ?? ""}`,
594660
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594661
- });
594662
- const pw2 = await this.waitForSudoPassword(12e4);
594663
- if (pw2 && tool) {
594664
- try {
594665
- result = await tool.execute(tc.arguments);
594666
- result = this.applyRegisteredToolResultTriage(result, resolvedTool?.name ?? tc.name, tool);
594667
- } catch (err) {
594668
- result = {
594669
- success: false,
594670
- output: "",
594671
- error: err instanceof Error ? err.message : String(err)
594672
- };
594673
- }
594674
- }
594675
- }
594676
- const { toolOutputMaxChars: maxLen2 } = this.contextLimits();
594677
- let output;
594678
- const modelContent2 = result.llmContent ?? result.output;
594679
- const isAlreadyTriaged = modelContent2.startsWith(TRIAGE_ENVELOPE_MARKER) && modelContent2.includes(TRIAGE_SAVED_PATH_MARKER);
594680
- if (!result.success) {
594681
- output = `Error: ${result.error || "unknown error"}
594682
- ${modelContent2}`;
594683
- } else if (isAlreadyTriaged) {
594684
- output = modelContent2;
594685
- } else if (modelContent2.length > maxLen2) {
594686
- const handleId = this.quickHash(tc.name + String(tc.arguments?.["path"] ?? "") + String(turn));
594687
- const lineCount = (result.output.match(/\n/g) || []).length + 1;
594688
- const preview = result.output.slice(0, 500).replace(/\n/g, " ");
594689
- this._memexArchive.set(handleId, {
594690
- id: handleId,
594691
- toolName: tc.name,
594692
- summary: `${tc.name} output (${lineCount} lines, ${result.output.length} chars)`,
594693
- fullContent: result.output,
594694
- turn,
594695
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594605
+ messages2.push(this.buildModelFacingToolMessage(r2.output, r2.tc.id, r2.tc.name, r2.tc.arguments, r2.success));
594606
+ if (r2.systemGuidance) {
594607
+ messages2.push({
594608
+ role: "system",
594609
+ content: r2.systemGuidance
594696
594610
  });
594697
- output = `[${tc.name} succeeded — output externalized: ${result.output.length} chars, ${lineCount} lines]
594698
- Handle: ${handleId}
594699
- Preview: ${preview}...
594700
- Full content available via: repl_exec(code="data = retrieve('${handleId}')") or memex_retrieve(id="${handleId}")`;
594701
- } else {
594702
- output = modelContent2;
594703
594611
  }
594704
- const bfRealFileMutation = this._isRealProjectMutation(tc.name, result);
594705
- const bfRealMutationPaths = bfRealFileMutation ? this._extractToolTargetPaths(tc.name, tc.arguments, result) : [];
594706
- const bfLogEntry = toolCallLog[toolCallLog.length - 1];
594707
- if (bfLogEntry) {
594708
- bfLogEntry.success = result.success;
594709
- bfLogEntry.mutated = bfRealFileMutation;
594710
- bfLogEntry.mutatedFiles = bfRealMutationPaths;
594711
- bfLogEntry.outputPreview = this._toolEvidencePreview(result, output, 1200, tc.name);
594712
- }
594713
- this.emit({
594714
- type: "tool_result",
594715
- toolName: tc.name,
594716
- content: this.toolResultEventContent(tc.name, output || result.output || result.error || ""),
594717
- success: result.success,
594718
- turn,
594719
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
594720
- });
594721
- this._trackDecomp2(tc, result, turn);
594722
- this._recordCompletionToolEvidenceFromResult({
594723
- toolName: tc.name,
594724
- argsKey: bfArgsKey,
594725
- args: tc.arguments,
594726
- actionReason: bfActionReason,
594727
- result,
594728
- outputPreview: this._toolEvidencePreview(result, output, 1200, tc.name),
594729
- realFileMutation: bfRealFileMutation,
594730
- realMutationPaths: bfRealMutationPaths
594731
- });
594732
- const enoentTools2 = /* @__PURE__ */ new Set([
594733
- "file_read",
594734
- "list_directory",
594735
- "find_files"
594736
- ]);
594737
- if (!result.success && enoentTools2.has(tc.name) && /ENOENT|no such file|does not exist|not found/i.test(result.error ?? result.output)) {
594738
- this._consecutiveEnoent++;
594739
- if (this._consecutiveEnoent >= 2) {
594740
- const failedPath2 = String(tc.arguments?.["path"] ?? tc.arguments?.["file"] ?? "unknown");
594741
- this.enqueueRuntimeGuidance(`[SYSTEM] ${this._consecutiveEnoent} consecutive file-not-found errors (last: "${failedPath2}"). You are repeating failed paths. CHANGE YOUR APPROACH:
594742
- 1. Call list_directory(".") to see what exists at the project root
594743
- 2. Entries in a directory listing are RELATIVE to that directory. If you listed "parent/" and saw "child", the full path is "parent/child" — NOT ".child" or just "child"
594744
- 3. If an entry is a directory (marked "d"), use list_directory on it, NOT file_read
594745
- 4. Use the FULL relative paths shown in list_directory output — they are copy-paste ready`);
594746
- }
594747
- } else {
594748
- this._consecutiveEnoent = 0;
594749
- }
594750
- const toolMsg = this.buildModelFacingToolMessage(output, tc.id, tc.name, tc.arguments, result.success);
594751
- messages2.push(toolMsg);
594752
- if (tc.name === "task_complete") {
594753
- if (!result.success) {
594612
+ if (r2.tc.name === "task_complete") {
594613
+ if (!r2.success) {
594754
594614
  messages2.push({
594755
594615
  role: "system",
594756
- content: this.buildTaskCompleteToolFailureGuard(output)
594616
+ content: this.buildTaskCompleteToolFailureGuard(r2.output)
594757
594617
  });
594758
594618
  this.emit({
594759
594619
  type: "status",
@@ -594762,7 +594622,7 @@ Full content available via: repl_exec(code="data = retrieve('${handleId}')") or
594762
594622
  });
594763
594623
  continue;
594764
594624
  }
594765
- const taskCompleteArgs = tc.arguments;
594625
+ const taskCompleteArgs = r2.tc.arguments;
594766
594626
  const open2 = this.getOpenTodoItems();
594767
594627
  if (open2.length > 0 && !this._shouldBypassTodoCompletionGuardForTaskComplete(taskCompleteArgs)) {
594768
594628
  const guard = this.buildTodoCompletionGuard(open2);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.484",
3
+ "version": "1.0.486",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.484",
9
+ "version": "1.0.486",
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.484",
3
+ "version": "1.0.486",
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",