omnius 1.0.572 → 1.0.573

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
@@ -468840,7 +468840,7 @@ ${newComment.split("\n").map((c9) => ` * ${c9}`).join("\n")}
468840
468840
  }
468841
468841
  }
468842
468842
  return result;
468843
- function escapeRegExp3(str) {
468843
+ function escapeRegExp4(str) {
468844
468844
  return str.replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&");
468845
468845
  }
468846
468846
  function getTodoCommentsRegExp() {
@@ -468848,7 +468848,7 @@ ${newComment.split("\n").map((c9) => ` * ${c9}`).join("\n")}
468848
468848
  const multiLineCommentStart = /(?:\/\*+\s*)/.source;
468849
468849
  const anyNumberOfSpacesAndAsterisksAtStartOfLine = /(?:^(?:\s|\*)*)/.source;
468850
468850
  const preamble = "(" + anyNumberOfSpacesAndAsterisksAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")";
468851
- const literals = "(?:" + map2(descriptors, (d2) => "(" + escapeRegExp3(d2.text) + ")").join("|") + ")";
468851
+ const literals = "(?:" + map2(descriptors, (d2) => "(" + escapeRegExp4(d2.text) + ")").join("|") + ")";
468852
468852
  const endOfLineOrEndOfComment = /(?:$|\*\/)/.source;
468853
468853
  const messageRemainder = /(?:.*?)/.source;
468854
468854
  const messagePortion = "(" + literals + messageRemainder + ")";
@@ -568001,6 +568001,9 @@ function setClaimDiscoveryState(ledger, state) {
568001
568001
  function claimDiscoveryStateFromSurvey(input) {
568002
568002
  const normalizedInventory = input.boundedInventory;
568003
568003
  const paths = [...new Set((Array.isArray(input.candidatePaths) ? input.candidatePaths : []).map((value2) => normalizeEvidencePath(value2)).filter(Boolean).slice(0, 16))];
568004
+ const requestedRequiredPaths = input.requiredArtifactPaths === void 0 ? paths : input.requiredArtifactPaths;
568005
+ const requiredPathSet = new Set((Array.isArray(requestedRequiredPaths) ? requestedRequiredPaths : []).map((value2) => normalizeEvidencePath(value2)).filter((path16) => paths.includes(path16)));
568006
+ const requiredArtifactPaths = paths.filter((path16) => requiredPathSet.has(path16));
568004
568007
  const reasons = /* @__PURE__ */ Object.create(null);
568005
568008
  for (const [rawPath, rawReason] of Object.entries(input.pathReasons ?? {})) {
568006
568009
  const path16 = normalizeEvidencePath(rawPath);
@@ -568008,7 +568011,7 @@ function claimDiscoveryStateFromSurvey(input) {
568008
568011
  if (path16)
568009
568012
  reasons[path16] = reason || "candidate selected from bounded workspace inventory";
568010
568013
  }
568011
- const openDeltas = paths.map((path16) => ({
568014
+ const openDeltas = requiredArtifactPaths.map((path16) => ({
568012
568015
  path: path16,
568013
568016
  reason: reasons[path16] || "candidate selected from bounded workspace inventory"
568014
568017
  }));
@@ -568016,7 +568019,7 @@ function claimDiscoveryStateFromSurvey(input) {
568016
568019
  const blockers = Array.isArray(input.survivingBlockers) ? input.survivingBlockers.map((item) => cleanText(item, 220)).filter(Boolean) : [];
568017
568020
  const hasBlockers = blockers.length > 0;
568018
568021
  const hasQuestions = unresolved.length > 0;
568019
- const resolvedStatus = paths.length === 0 ? hasBlockers || hasQuestions ? "blocked" : "skipped" : hasBlockers || hasQuestions ? "blocked" : "active";
568022
+ const resolvedStatus = requiredArtifactPaths.length === 0 ? hasBlockers || hasQuestions ? "blocked" : "skipped" : hasBlockers || hasQuestions ? "blocked" : "active";
568020
568023
  return {
568021
568024
  status: resolvedStatus,
568022
568025
  generatedAtIso: nowIso3(),
@@ -568024,13 +568027,14 @@ function claimDiscoveryStateFromSurvey(input) {
568024
568027
  context: cleanText(input.context, 480),
568025
568028
  boundedInventory: normalizedInventory,
568026
568029
  candidatePaths: paths,
568030
+ requiredArtifactPaths,
568027
568031
  pathReasons: reasons,
568028
568032
  unresolvedQuestions: unresolved.slice(0, 10),
568029
568033
  openDeltas,
568030
568034
  survivingBlockers: blockers.slice(0, 8),
568031
- evidenceHandles: [...new Set(paths.map((path16) => `workspace:${path16}`))],
568035
+ evidenceHandles: [...new Set(requiredArtifactPaths.map((path16) => `workspace:${path16}`))],
568032
568036
  resolvedEvidenceHandles: [],
568033
- requiresEvidence: typeof input.requiresEvidence === "boolean" ? input.requiresEvidence : true
568037
+ requiresEvidence: typeof input.requiresEvidence === "boolean" ? input.requiresEvidence : requiredArtifactPaths.length > 0
568034
568038
  };
568035
568039
  }
568036
568040
  function nowIso3(now2 = /* @__PURE__ */ new Date()) {
@@ -568240,6 +568244,9 @@ function claimDiscoveryControllerSignals(stage2) {
568240
568244
  const unresolvedQuestions = stage2.unresolvedQuestions ?? [];
568241
568245
  const boundedInventory = stage2.boundedInventory;
568242
568246
  const boundedDirs = boundedInventory?.dirs ?? [];
568247
+ const requiredArtifactPaths = stage2.requiredArtifactPaths ?? stage2.candidatePaths ?? [];
568248
+ const requiredSet = new Set(requiredArtifactPaths);
568249
+ const exploratoryPaths = (stage2.candidatePaths ?? []).filter((path16) => !requiredSet.has(path16));
568243
568250
  const resolvedCount = Math.min(evidenceHandles.length, new Set(resolvedEvidenceHandles).size);
568244
568251
  const unresolvedEvidenceCount = Math.max(evidenceHandles.length - resolvedCount, 0);
568245
568252
  return [
@@ -568247,7 +568254,8 @@ function claimDiscoveryControllerSignals(stage2) {
568247
568254
  `status=${stage2.status ?? "skipped"} generated_at=${stage2.generatedAtIso ?? ""}`,
568248
568255
  `requires_evidence=${stage2.requiresEvidence ? "true" : "false"}`,
568249
568256
  `bounded_inventory=${boundedInventory ? `${boundedInventory.root}|files=${boundedInventory.files.length}|dirs=${boundedDirs.length}|truncated=${Boolean(boundedInventory.truncated)}` : "none"}`,
568250
- `candidate_paths=${(stage2.candidatePaths ?? []).join(",") || "none"}`,
568257
+ `required_artifact_paths=${requiredArtifactPaths.join(",") || "none"}`,
568258
+ `exploratory_paths=${exploratoryPaths.join(",") || "none"}`,
568251
568259
  `open_deltas=${openDeltas.map((delta) => `${delta.path} :: ${delta.reason}`.replace(/\s+/g, " ")).join(" | ") || "none"}`,
568252
568260
  `open_delta_count=${openDeltas.length} unresolved_evidence_count=${unresolvedEvidenceCount}`,
568253
568261
  `surviving_blockers=${survivingBlockers.join(" | ") || "none"}`,
@@ -568438,7 +568446,10 @@ function buildCriticPacketFromLedger(ledger) {
568438
568446
  lines.push("Claim Discovery:");
568439
568447
  lines.push(` status=${ledger.claimDiscovery.status}`);
568440
568448
  lines.push(` generated_at=${ledger.claimDiscovery.generatedAtIso}`);
568441
- lines.push(` candidate_paths=${ledger.claimDiscovery.candidatePaths.join(",") || "none"}`);
568449
+ const requiredArtifactPaths = ledger.claimDiscovery.requiredArtifactPaths ?? ledger.claimDiscovery.candidatePaths;
568450
+ const exploratoryPaths = ledger.claimDiscovery.candidatePaths.filter((path16) => !requiredArtifactPaths.includes(path16));
568451
+ lines.push(` exploratory_paths=${exploratoryPaths.join(",") || "none"}`);
568452
+ lines.push(` required_artifact_paths=${requiredArtifactPaths.join(",") || "none"}`);
568442
568453
  lines.push(` open_deltas=${ledger.claimDiscovery.openDeltas.map((delta) => `${delta.path} :: ${delta.reason}`).slice(0, 10).join(" | ") || "none"}`);
568443
568454
  lines.push(` surviving_blockers=${ledger.claimDiscovery.survivingBlockers.join(" | ") || "none"}`);
568444
568455
  lines.push(` unresolved_questions=${ledger.claimDiscovery.unresolvedQuestions.join(" | ") || "none"}`);
@@ -568558,7 +568569,7 @@ function claimDiscoveryResolvedHandles(ledger, state) {
568558
568569
  if (!state)
568559
568570
  return [];
568560
568571
  const inspected = /* @__PURE__ */ new Set();
568561
- const candidatePaths = [...state.candidatePaths].map((value2) => normalizeEvidencePath(value2)).filter(Boolean).map((path16) => path16.replace(/^\/+/, ""));
568572
+ const candidatePaths = [...state.requiredArtifactPaths ?? state.candidatePaths].map((value2) => normalizeEvidencePath(value2)).filter(Boolean).map((path16) => path16.replace(/^\/+/, ""));
568562
568573
  for (const entry of ledger.evidence) {
568563
568574
  if (entry.success !== true)
568564
568575
  continue;
@@ -569145,6 +569156,10 @@ import { createHash as createHash28 } from "node:crypto";
569145
569156
  function clean3(value2, max) {
569146
569157
  return String(value2 ?? "").replace(/\s+/g, " ").trim().slice(0, max);
569147
569158
  }
569159
+ function isValidObservationReceipt(entry) {
569160
+ const receipt = entry.receipt;
569161
+ return entry.success === true && entry.role === "observation" && receipt?.schema === "omnius.command-evidence-receipt.v1" && Boolean(receipt.canonicalCommand.trim()) && Boolean(receipt.cwd.trim()) && receipt.exitCode === 0 && receipt.timedOut === false;
569162
+ }
569148
569163
  function selectedEvidence(ledger) {
569149
569164
  if (!ledger) {
569150
569165
  return {
@@ -569153,7 +569168,7 @@ function selectedEvidence(ledger) {
569153
569168
  artifactHashes: []
569154
569169
  };
569155
569170
  }
569156
- const candidates = ledger.evidence.filter((entry) => entry.success === true && (entry.role === "verification" || entry.role === "mutation")).slice(-16);
569171
+ const candidates = ledger.evidence.filter((entry) => entry.success === true && (entry.role === "verification" || entry.role === "mutation" || isValidObservationReceipt(entry))).slice(-16);
569157
569172
  const artifacts = /* @__PURE__ */ new Map();
569158
569173
  const commandReceipts = [];
569159
569174
  for (const entry of candidates) {
@@ -569174,6 +569189,7 @@ function selectedEvidence(ledger) {
569174
569189
  timedOut: Boolean(receipt.timedOut),
569175
569190
  startedAtIso: receipt.startedAtIso ?? "",
569176
569191
  finishedAtIso: receipt.finishedAtIso ?? "",
569192
+ observedPaths: receipt.observedPaths ?? [],
569177
569193
  artifactHashes: entry.receipt.artifactHashes?.length ? entry.receipt.artifactHashes : []
569178
569194
  });
569179
569195
  }
@@ -590943,6 +590959,25 @@ function chunkHasSymbolMatch(token, text2) {
590943
590959
  const tokens = haystack.split(" ").filter(Boolean);
590944
590960
  return tokens.includes(token);
590945
590961
  }
590962
+ function escapeRegExp3(value2) {
590963
+ return value2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
590964
+ }
590965
+ function shellCommandLooksLikeInspection(command) {
590966
+ const outsideQuotes = stripShellQuotedSegments(command);
590967
+ return /\b(?:cat|sed|head|tail|less|more|awk|grep|rg|file|stat|wc|sha(?:1|224|256|384|512)sum|md5sum|git\s+(?:show|diff))\b/i.test(outsideQuotes);
590968
+ }
590969
+ function shellCommandReferencesExactPath(command, path16, workspaceRoot) {
590970
+ const normalized = path16.replace(/\\/g, "/").replace(/^\.\//, "").trim();
590971
+ if (!normalized || normalized.includes(".."))
590972
+ return false;
590973
+ const absolute = _pathResolve(workspaceRoot, normalized).replace(/\\/g, "/");
590974
+ const candidates = [normalized, `./${normalized}`, absolute];
590975
+ return candidates.some((candidate) => {
590976
+ const escaped = escapeRegExp3(candidate);
590977
+ const matcher = new RegExp(`(?:^|[\\s"'\`=:(])${escaped}(?=$|[\\s"'\`;|)&,])`);
590978
+ return matcher.test(command);
590979
+ });
590980
+ }
590946
590981
  function isCompilerLikeVerifierCommand(command) {
590947
590982
  const normalized = command.toLowerCase();
590948
590983
  return /\b(?:pio|platformio|tsc|gcc|g\+\+|clang\+\+?|clang|cargo\s+(?:build|check)|go\s+(?:build|test)|javac|gradle|mvn|msbuild|dotnet\s+build|python(?:3)?\s+-m\s+(?:py_compile|compileall)|mypy|pyright)\b/.test(normalized);
@@ -597291,11 +597326,17 @@ ${modelVisible}` : modelVisible || result.error || displayOutput || "";
597291
597326
  return;
597292
597327
  const realFileMutation = input.realFileMutation ?? this._isRealProjectMutation(input.toolName, input.result);
597293
597328
  const attemptedTargetPaths = this._extractToolTargetPaths(input.toolName, input.args, input.result);
597329
+ const explicitInspectionPaths = this._successfulShellInspectionAnchorPaths(input.toolName, input.result);
597330
+ const evidenceTargetPaths2 = [
597331
+ .../* @__PURE__ */ new Set([...attemptedTargetPaths, ...explicitInspectionPaths])
597332
+ ];
597294
597333
  const realMutationPaths = input.realMutationPaths ?? (realFileMutation ? attemptedTargetPaths : []);
597295
597334
  const receipt = input.result.executionReceipt ? {
597296
597335
  ...input.result.executionReceipt,
597336
+ ...explicitInspectionPaths.length > 0 ? { observedPaths: explicitInspectionPaths } : {},
597297
597337
  artifactHashes: this._completionArtifactHashes([
597298
597338
  ...attemptedTargetPaths,
597339
+ ...explicitInspectionPaths,
597299
597340
  ...realMutationPaths
597300
597341
  ])
597301
597342
  } : void 0;
@@ -597312,8 +597353,8 @@ ${modelVisible}` : modelVisible || result.error || displayOutput || "";
597312
597353
  success: input.result.success,
597313
597354
  outputPreview: (input.outputPreview ?? this._toolEvidencePreview(input.result, void 0, 1200, input.toolName)).toString().slice(0, input.toolName === "audio_analyze" || input.toolName === "video_understand" ? 1200 : 500),
597314
597355
  argsKey: input.argsKey.slice(0, 300),
597315
- targetPaths: attemptedTargetPaths,
597316
- role: input.result.completionEvidenceRole ?? (input.result.alreadyApplied === true ? "mutation" : realFileMutation ? "mutation" : input.result.runtimeAuthored === true && !shellVerification ? "blocker" : shellVerification ? "verification" : void 0),
597356
+ targetPaths: evidenceTargetPaths2,
597357
+ role: input.result.completionEvidenceRole ?? (input.result.alreadyApplied === true ? "mutation" : realFileMutation ? "mutation" : input.result.runtimeAuthored === true && !shellVerification ? "blocker" : shellVerification ? "verification" : input.result.success === true ? "observation" : void 0),
597317
597358
  family: input.result.completionEvidenceFamily ?? (input.result.runtimeAuthored === true && !shellVerification ? "runtime_control" : shellVerification ? shellVerificationFamily : void 0),
597318
597359
  verificationImpact: input.result.completionVerificationImpact ?? (input.result.alreadyApplied === true ? "neutral" : realFileMutation ? "invalidates" : void 0),
597319
597360
  metrics: input.result.completionEvidenceMetrics,
@@ -597338,14 +597379,38 @@ ${modelVisible}` : modelVisible || result.error || displayOutput || "";
597338
597379
  }
597339
597380
  this._saveCompletionLedgerSafe();
597340
597381
  }
597382
+ /**
597383
+ * Credit a shell read only when it has a trusted successful local receipt
597384
+ * and mentions one of the user's explicit, inventory-resolved artifact
597385
+ * anchors. This prevents filename/token guesses, echoed path strings, and
597386
+ * arbitrary shell output from becoming discovery evidence.
597387
+ */
597388
+ _successfulShellInspectionAnchorPaths(toolName, result) {
597389
+ if (toolName !== "shell" || result.success !== true)
597390
+ return [];
597391
+ const receipt = result.executionReceipt;
597392
+ if (!receipt || receipt.schema !== "omnius.command-evidence-receipt.v1" || receipt.exitCode !== 0 || receipt.timedOut || !receipt.command.trim() || !receipt.canonicalCommand.trim() || !receipt.cwd.trim()) {
597393
+ return [];
597394
+ }
597395
+ const command = receipt.command;
597396
+ if (!shellCommandLooksLikeInspection(command))
597397
+ return [];
597398
+ const anchors = this._completionLedger?.claimDiscovery?.requiredArtifactPaths ?? [];
597399
+ if (anchors.length === 0)
597400
+ return [];
597401
+ const root = this.authoritativeWorkingDirectory();
597402
+ return anchors.filter((path16) => shellCommandReferencesExactPath(command, path16, root)).slice(0, 16);
597403
+ }
597341
597404
  _refreshClaimDiscoveryStateFromEvidence() {
597342
597405
  if (!this._completionLedger?.claimDiscovery)
597343
597406
  return;
597344
597407
  const state = this._completionLedger.claimDiscovery;
597345
- const evidenceHandles = state.evidenceHandles ?? [];
597408
+ const legacyUnclassifiedCandidates = !Array.isArray(state.requiredArtifactPaths);
597409
+ const requiredArtifactPaths = legacyUnclassifiedCandidates ? [] : state.requiredArtifactPaths;
597410
+ const evidenceHandles = legacyUnclassifiedCandidates ? [] : state.evidenceHandles ?? [];
597346
597411
  const survivingBlockers = state.survivingBlockers ?? [];
597347
597412
  const unresolvedQuestions = state.unresolvedQuestions ?? [];
597348
- const openDeltas = state.openDeltas ?? [];
597413
+ const openDeltas = legacyUnclassifiedCandidates ? [] : state.openDeltas ?? [];
597349
597414
  const resolved = claimDiscoveryResolvedHandles(this._completionLedger, state);
597350
597415
  const unresolvedEvidence = evidenceHandles.filter((handle2) => !resolved.includes(handle2));
597351
597416
  const unresolvedHandleSet = new Set(unresolvedEvidence);
@@ -597355,11 +597420,11 @@ ${modelVisible}` : modelVisible || result.error || displayOutput || "";
597355
597420
  return unresolvedHandleSet.has(handle2);
597356
597421
  });
597357
597422
  const hasBlockers = survivingBlockers.length > 0;
597358
- const hasCandidates = state.candidatePaths.length > 0;
597423
+ const hasRequiredAnchors = evidenceHandles.length > 0;
597359
597424
  const hasOpenQuestions = unresolvedQuestions.length > 0;
597360
597425
  const hasOpenEvidence = unresolvedEvidence.length > 0;
597361
597426
  let status;
597362
- if (!hasCandidates) {
597427
+ if (!hasRequiredAnchors) {
597363
597428
  status = hasBlockers || hasOpenQuestions ? "blocked" : "skipped";
597364
597429
  } else if (hasOpenEvidence || hasOpenQuestions || hasBlockers) {
597365
597430
  status = hasOpenQuestions || hasBlockers ? "blocked" : "active";
@@ -597370,12 +597435,14 @@ ${modelVisible}` : modelVisible || result.error || displayOutput || "";
597370
597435
  ...this._completionLedger,
597371
597436
  claimDiscovery: {
597372
597437
  ...state,
597438
+ requiredArtifactPaths,
597373
597439
  openDeltas: unresolvedOpenDeltas,
597374
597440
  resolvedEvidenceHandles: resolved,
597375
597441
  evidenceHandles,
597376
597442
  survivingBlockers,
597377
597443
  unresolvedQuestions,
597378
- status
597444
+ status,
597445
+ requiresEvidence: legacyUnclassifiedCandidates ? false : state.requiresEvidence
597379
597446
  }
597380
597447
  };
597381
597448
  this._completionLedger = updated;
@@ -603687,11 +603754,13 @@ ${rawTask}`;
603687
603754
  const survivingBlockers = unmatchedHints.size > 0 ? [
603688
603755
  `Unmatched explicit task hints: ${[...unmatchedHints].slice(0, 3).join(", ")}`
603689
603756
  ] : [];
603690
- const shouldRequireEvidence = finalCandidatePaths.length > 0 && (explicitPathHints.length > 0 || rankedCandidates.length > 0);
603757
+ const requiredArtifactPaths = [...new Set(explicitCandidates)].slice(0, 8);
603758
+ const shouldRequireEvidence = requiredArtifactPaths.length > 0 || unmatchedHints.size > 0;
603691
603759
  return claimDiscoveryStateFromSurvey({
603692
603760
  request: task,
603693
603761
  boundedInventory,
603694
603762
  candidatePaths: finalCandidatePaths,
603763
+ requiredArtifactPaths,
603695
603764
  pathReasons,
603696
603765
  unresolvedQuestions,
603697
603766
  survivingBlockers,
@@ -634466,7 +634535,11 @@ function mapExecutionToolResult(result) {
634466
634535
  partial: result.partial,
634467
634536
  beforeHash: result.beforeHash,
634468
634537
  afterHash: result.afterHash,
634469
- evidenceEvents: result.evidenceEvents
634538
+ evidenceEvents: result.evidenceEvents,
634539
+ // Preserve process facts separately from display text. The orchestrator
634540
+ // uses this receipt for completion evidence; reconstructing it from a
634541
+ // truncated/streamed transcript would be unsound.
634542
+ executionReceipt: result.executionReceipt
634470
634543
  };
634471
634544
  }
634472
634545
  function adaptExecutionTool(tool, options2 = {}) {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.572",
3
+ "version": "1.0.573",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.572",
9
+ "version": "1.0.573",
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.572",
3
+ "version": "1.0.573",
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",