omnius 1.0.461 → 1.0.462

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
@@ -563781,6 +563781,15 @@ function isSuccessfulVerificationEvidence(entry) {
563781
563781
  function isFailedVerificationEvidence(entry) {
563782
563782
  return entry.role === "verification" && entry.success === false;
563783
563783
  }
563784
+ function isSuccessfulPostMutationObservation(entry) {
563785
+ if (entry.success !== true)
563786
+ return false;
563787
+ if (entry.role === "blocker")
563788
+ return false;
563789
+ if (isMutationEvidence(entry))
563790
+ return false;
563791
+ return entry.kind === "tool_result" || entry.kind === "runtime_observation" || entry.kind === "delivery_result";
563792
+ }
563784
563793
  function verificationFamily(entry) {
563785
563794
  if (entry.role !== "verification")
563786
563795
  return null;
@@ -563807,6 +563816,7 @@ function finalizeCompletionLedgerTruth(ledger) {
563807
563816
  let unresolved = [...ledger.unresolved];
563808
563817
  let lastVerificationInvalidatingMutation = -1;
563809
563818
  let lastVerification = -1;
563819
+ let lastCriticApprovedVerification = -1;
563810
563820
  const lastSuccessfulVerificationByFamily = /* @__PURE__ */ new Map();
563811
563821
  ledger.evidence.forEach((entry, index) => {
563812
563822
  if (isVerificationInvalidatingMutation(entry))
@@ -563818,6 +563828,21 @@ function finalizeCompletionLedgerTruth(ledger) {
563818
563828
  lastSuccessfulVerificationByFamily.set(family, index);
563819
563829
  }
563820
563830
  });
563831
+ for (const critique2 of ledger.critiques) {
563832
+ if (critique2.verdict !== "approve")
563833
+ continue;
563834
+ if (lastVerificationInvalidatingMutation >= 0 && critique2.evidenceSequence <= lastVerificationInvalidatingMutation) {
563835
+ continue;
563836
+ }
563837
+ const reviewedEvidence = ledger.evidence.slice(Math.max(0, lastVerificationInvalidatingMutation + 1), Math.max(0, critique2.evidenceSequence));
563838
+ if (reviewedEvidence.some(isSuccessfulPostMutationObservation)) {
563839
+ lastCriticApprovedVerification = Math.max(lastCriticApprovedVerification, critique2.evidenceSequence - 1);
563840
+ }
563841
+ }
563842
+ const effectiveLastVerification = Math.max(lastVerification, lastCriticApprovedVerification);
563843
+ if (effectiveLastVerification >= 0 && effectiveLastVerification >= lastVerificationInvalidatingMutation) {
563844
+ unresolved = unresolved.filter((item) => item.source !== "verification_missing" && item.source !== "verification_freshness");
563845
+ }
563821
563846
  ledger.evidence.forEach((entry, index) => {
563822
563847
  if (isFailedVerificationEvidence(entry)) {
563823
563848
  const family = verificationFamily(entry);
@@ -563830,12 +563855,13 @@ function finalizeCompletionLedgerTruth(ledger) {
563830
563855
  unresolved = appendUnresolved(unresolved, `Stale edit failure remains unresolved: ${entry.summary}`, entry.id);
563831
563856
  }
563832
563857
  });
563833
- if (lastVerificationInvalidatingMutation >= 0 && lastVerification < 0) {
563858
+ if (lastVerificationInvalidatingMutation >= 0 && effectiveLastVerification < 0) {
563834
563859
  unresolved = appendUnresolved(unresolved, "File changes occurred without any successful verification evidence.", "verification_missing");
563835
- } else if (lastVerification >= 0 && lastVerificationInvalidatingMutation > lastVerification) {
563860
+ } else if (effectiveLastVerification >= 0 && lastVerificationInvalidatingMutation > effectiveLastVerification) {
563836
563861
  unresolved = appendUnresolved(unresolved, "File changes occurred after the last successful verification; final verification is stale.", "verification_freshness");
563837
563862
  }
563838
- const status = ledger.status === "blocked" || ledger.status === "request_changes" ? ledger.status : unresolved.length > 0 ? "incomplete_verification" : ledger.status;
563863
+ const latestCritique = ledger.critiques.at(-1);
563864
+ const status = ledger.status === "blocked" || ledger.status === "request_changes" ? ledger.status : unresolved.length > 0 ? "incomplete_verification" : latestCritique?.verdict === "approve" ? "approved" : ledger.status === "incomplete_verification" ? "open" : ledger.status;
563839
563865
  return {
563840
563866
  ...ledger,
563841
563867
  unresolved,
@@ -579170,6 +579196,15 @@ var init_agenticRunner = __esm({
579170
579196
  _workboardDir() {
579171
579197
  return this.options.workboardDir || this._workingDirectory || process.cwd();
579172
579198
  }
579199
+ _todoWriteAvailable() {
579200
+ return this.tools.has("todo_write");
579201
+ }
579202
+ _availablePreferredTools(candidates) {
579203
+ const available = candidates.filter((name10) => this.tools.has(name10));
579204
+ if (available.length > 0)
579205
+ return available;
579206
+ return this.tools.has("task_complete") ? ["task_complete"] : [];
579207
+ }
579173
579208
  getOrCreateWorkboard() {
579174
579209
  const goal = this._taskState.originalGoal || this._taskState.goal || "";
579175
579210
  if (this._workboard) {
@@ -579425,7 +579460,7 @@ ${parts.join("\n")}
579425
579460
  cardId: integration.id,
579426
579461
  title: integration.title,
579427
579462
  reason: "implementation evidence exists; exercise the changed runtime path before more discovery",
579428
- preferredTools: ["shell"]
579463
+ preferredTools: this._availablePreferredTools(["shell"])
579429
579464
  };
579430
579465
  }
579431
579466
  if (hasVerificationEvidence && verification) {
@@ -579433,7 +579468,10 @@ ${parts.join("\n")}
579433
579468
  cardId: verification.id,
579434
579469
  title: verification.title,
579435
579470
  reason: "verification evidence exists; reconcile outcome, todos, and blockers",
579436
- preferredTools: ["todo_write", "task_complete"]
579471
+ preferredTools: this._availablePreferredTools([
579472
+ "todo_write",
579473
+ "task_complete"
579474
+ ])
579437
579475
  };
579438
579476
  }
579439
579477
  if (discoveryEvidence > 0 && !hasImplementationEvidence && implementation2) {
@@ -579441,7 +579479,12 @@ ${parts.join("\n")}
579441
579479
  cardId: implementation2.id,
579442
579480
  title: implementation2.title,
579443
579481
  reason: "discovery evidence is already present; land the smallest concrete repair",
579444
- preferredTools: ["file_patch", "batch_edit", "file_edit", "file_write"]
579482
+ preferredTools: this._availablePreferredTools([
579483
+ "file_patch",
579484
+ "batch_edit",
579485
+ "file_edit",
579486
+ "file_write"
579487
+ ])
579445
579488
  };
579446
579489
  }
579447
579490
  const active = snapshot.cards.find((card) => card.status === "in_progress") ?? snapshot.cards.find((card) => card.status === "needs_changes") ?? snapshot.cards.find((card) => card.status === "open") ?? discovery;
@@ -579451,13 +579494,24 @@ ${parts.join("\n")}
579451
579494
  cardId: active.id,
579452
579495
  title: active.title,
579453
579496
  reason: active.id === "discover-current-state" ? "no authoritative target evidence is recorded yet" : "workboard card is the next unresolved card",
579454
- preferredTools: active.id === "discover-current-state" ? ["file_read", "grep_search", "list_directory", "shell"] : ["file_patch", "batch_edit", "file_edit", "file_write", "shell"]
579497
+ preferredTools: active.id === "discover-current-state" ? this._availablePreferredTools([
579498
+ "file_read",
579499
+ "grep_search",
579500
+ "list_directory",
579501
+ "shell"
579502
+ ]) : this._availablePreferredTools([
579503
+ "file_patch",
579504
+ "batch_edit",
579505
+ "file_edit",
579506
+ "file_write",
579507
+ "shell"
579508
+ ])
579455
579509
  };
579456
579510
  }
579457
579511
  _focusToolsForRequiredAction(action) {
579458
579512
  switch (action) {
579459
579513
  case "update_todos":
579460
- return "todo_write with a changed plan/status, or a real file edit if that is the active work";
579514
+ return this._todoWriteAvailable() ? "todo_write with a changed plan/status, or a real file edit if that is the active work" : "todo_write is unavailable in this tool surface; continue with the intended substantive action, or task_complete with evidence if done";
579461
579515
  case "read_authoritative_target":
579462
579516
  return "use cached evidence or one authoritative file_read/read-only shell, then act";
579463
579517
  case "use_cached_evidence":
@@ -579511,7 +579565,9 @@ ${parts.join("\n")}
579511
579565
  const integration = byId.get("integrate-and-run");
579512
579566
  const verification = byId.get("verify-observed-outcome");
579513
579567
  lines.push(`workboard_current_card=${action.cardId} (${action.title})`);
579514
- lines.push(`workboard_preferred_tools=${action.preferredTools.join(", ")}`);
579568
+ if (action.preferredTools.length > 0) {
579569
+ lines.push(`workboard_preferred_tools=${action.preferredTools.join(", ")}`);
579570
+ }
579515
579571
  lines.push(`workboard_reason=${action.reason}`);
579516
579572
  lines.push(`workboard_evidence_counts=discover:${this._workboardEvidenceCount(discovery)} implement:${this._workboardEvidenceCount(implementation2)} integrate:${this._workboardEvidenceCount(integration)} verify:${this._workboardEvidenceCount(verification)}`);
579517
579573
  if (this._workboardHasEditEvidence(implementation2)) {
@@ -579537,7 +579593,7 @@ ${parts.join("\n")}
579537
579593
  }
579538
579594
  if (lines.length === 2)
579539
579595
  return null;
579540
- lines.push("not_progress=repeat unchanged todo_write; repeat broad discovery already represented in this frame; keep discovery active after a real mutation");
579596
+ lines.push(this._todoWriteAvailable() ? "not_progress=repeat unchanged todo_write; repeat broad discovery already represented in this frame; keep discovery active after a real mutation" : "not_progress=repeat broad discovery already represented in this frame; keep discovery active after a real mutation");
579541
579597
  return lines.join("\n");
579542
579598
  }
579543
579599
  _workboardTargetCardId(snapshot, toolName, result, meta = {}) {
@@ -580266,10 +580322,23 @@ ${parts.join("\n")}
580266
580322
  const pressureCue = pressureCheck(task);
580267
580323
  const rawPrompt = getSystemPromptForTier(this.options.modelTier);
580268
580324
  const basePrompt = rawPrompt + pressureCue;
580325
+ const todoBatchGuidance = this._todoWriteAvailable() ? " Use todo_write between batches to mark progress." : "";
580269
580326
  const _BATCH_GUIDANCE = {
580270
- small: "\n\n## Response batching\n\nEmit AT MOST 2 tool calls per response. After observing their results, plan the next 2 in your following response. Smaller batches let the orchestrator deliver cache/failure/progress signals to you between actions. Tool calls beyond the cap are dropped. Use todo_write between batches to mark progress.",
580271
- medium: "\n\n## Response batching\n\nEmit AT MOST 4 tool calls per response. After observing their results, plan the next batch in your following response. Smaller batches let the orchestrator deliver cache/failure/progress signals to you between actions. Tool calls beyond the cap are dropped. Use todo_write between batches to mark progress.",
580272
- large: "\n\n## Response batching\n\nEmit AT MOST 6 tool calls per response. Smaller batches receive better feedback (cache/failure/progress signals between actions). Tool calls beyond the cap are dropped. Use todo_write between batches."
580327
+ small: `
580328
+
580329
+ ## Response batching
580330
+
580331
+ Emit AT MOST 2 tool calls per response. After observing their results, plan the next 2 in your following response. Smaller batches let the orchestrator deliver cache/failure/progress signals to you between actions. Tool calls beyond the cap are dropped.${todoBatchGuidance}`,
580332
+ medium: `
580333
+
580334
+ ## Response batching
580335
+
580336
+ Emit AT MOST 4 tool calls per response. After observing their results, plan the next batch in your following response. Smaller batches let the orchestrator deliver cache/failure/progress signals to you between actions. Tool calls beyond the cap are dropped.${todoBatchGuidance}`,
580337
+ large: `
580338
+
580339
+ ## Response batching
580340
+
580341
+ Emit AT MOST 6 tool calls per response. Smaller batches receive better feedback (cache/failure/progress signals between actions). Tool calls beyond the cap are dropped.${todoBatchGuidance}`
580273
580342
  };
580274
580343
  const batchGuidance = _BATCH_GUIDANCE[this.options.modelTier ?? "large"] ?? _BATCH_GUIDANCE.large;
580275
580344
  const shellGuidance = "\n\n## Shell command patterns\n\nWhen investigating a build/test/install failure, RUN THE COMMAND WITHOUT TRUNCATION FIRST to see the full error.\nAvoid `| tail -N` / `| head -N` / `| sed -n '1,Np'` on commands you don't yet trust — they drop the part of the output where errors usually appear.\nPipefail is on by default in this orchestrator: a pipeline's exit code reflects the FIRST failing stage, not just the last. So `<cmd> | tail -80` returns non-zero if `<cmd>` failed.\nWhen you DO want to limit context (after diagnosis), prefer `<cmd> 2>&1 | tail -300` (or larger) so you keep enough output to see the actual error block.\nIf your command exited 0 but produced suspiciously short output (~< 800 chars), the orchestrator will inject a [HINT — pipe-to-truncator detected] block telling you to re-run without truncation.";
@@ -581506,6 +581575,8 @@ ${result.output ?? ""}`;
581506
581575
  getOpenTodoItems() {
581507
581576
  if (this.options.disableTodoCompletionGuard)
581508
581577
  return [];
581578
+ if (!this._todoWriteAvailable())
581579
+ return [];
581509
581580
  const todos = this.readSessionTodos();
581510
581581
  if (!todos || todos.length === 0)
581511
581582
  return [];
@@ -582496,6 +582567,8 @@ ${_checks}`
582496
582567
  * Mutates `_lastTodoReminderTurn` when a reminder is produced.
582497
582568
  */
582498
582569
  getTodoReminderContent(currentTurn) {
582570
+ if (!this._todoWriteAvailable())
582571
+ return null;
582499
582572
  const todos = this.readSessionTodos();
582500
582573
  const result = computeTodoReminder({
582501
582574
  currentTurn,
@@ -582856,6 +582929,8 @@ ${contentPreview}
582856
582929
  * Recommends marking progress before further work. Returns null otherwise.
582857
582930
  */
582858
582931
  _renderProgressNudgeBlock(turn) {
582932
+ if (!this._todoWriteAvailable())
582933
+ return null;
582859
582934
  const n2 = this._writesSinceLastTodoWrite;
582860
582935
  if (n2 < 4)
582861
582936
  return null;
@@ -583469,11 +583544,14 @@ ${contentPreview}
583469
583544
  ].join("\n");
583470
583545
  }
583471
583546
  if (latest.tool === "todo_write") {
583547
+ const raw2 = `${latest.error || ""}
583548
+ ${latest.output || ""}`;
583549
+ const unavailable = /Unknown tool/i.test(raw2);
583472
583550
  return [
583473
583551
  `[PLANNING TOOL RECOVERY]`,
583474
583552
  `Last failing tool: todo_write (turn ${latest.turn})`,
583475
- `A checklist write failure is bookkeeping/argument transport, not evidence that the target codebase is broken.`,
583476
- `Repair the todo_write payload if you still need the visible plan, or continue with the intended first substantive task using the plan content you already attempted to record.`,
583553
+ unavailable ? `todo_write is not registered in this tool surface. Do not retry it.` : `A checklist write failure is bookkeeping/argument transport, not evidence that the target codebase is broken.`,
583554
+ unavailable ? `Use the attempted checklist only as private state; continue with available substantive tools or task_complete with evidence.` : `Repair the todo_write payload if you still need the visible plan, or continue with the intended first substantive task using the plan content you already attempted to record.`,
583477
583555
  `Do not inspect or edit project files solely because todo_write rejected its arguments.`
583478
583556
  ].join("\n");
583479
583557
  }
@@ -583571,7 +583649,7 @@ ${latest.output || ""}`.trim();
583571
583649
  lines.push(`... +${ordered.length - visible.length} more todo node(s)`);
583572
583650
  }
583573
583651
  lines.push("decomposition_contract=Use stable ids plus parentId for subtasks. If the active item has multiple remaining actions, rewrite it as a parent with concrete child leaf todos; work leaf-first and do not complete a parent before all children are complete with evidence.");
583574
- lines.push(`(turn ${turn} — call todo_write ONLY to update state, never to re-read this plan)`);
583652
+ lines.push(this._todoWriteAvailable() ? `(turn ${turn} — call todo_write ONLY to update state, never to re-read this plan)` : `(turn ${turn} — todo_write is unavailable in this tool surface; use this plan as read-only state)`);
583575
583653
  return lines.join("\n");
583576
583654
  } catch {
583577
583655
  return null;
@@ -583825,12 +583903,13 @@ ${sections.join("\n")}` : sections.join("\n");
583825
583903
  */
583826
583904
  _buildRepeatGateBlock(toolName, args, hits) {
583827
583905
  const argPreview = JSON.stringify(args ?? {}).slice(0, 200);
583906
+ const progressStep = this._todoWriteAvailable() ? ` 1. Call todo_write — decompose the remaining work into concrete, verifiable steps, mark the current step in_progress, and mark anything already done as completed.` : ` 1. Re-anchor on the active evidence and name the concrete next action; do not call unavailable planning tools.`;
583828
583907
  return [
583829
583908
  `[REPEAT GATE] Exact repeat #${hits} of ${toolName}(${argPreview}).`,
583830
583909
  `You ALREADY have this result — re-reading identical arguments cannot produce new information, so this call was NOT executed.`,
583831
583910
  ``,
583832
583911
  `You are looping because progress tracking has drifted. Before any further redundant calls you MUST:`,
583833
- ` 1. Call todo_write — decompose the remaining work into concrete, verifiable steps, mark the current step in_progress, and mark anything already done as completed.`,
583912
+ progressStep,
583834
583913
  ` 2. Then take a CONCRETE action on the evidence you already have: edit/write the implicated file, run a verification command, or call task_complete with evidence.`,
583835
583914
  ``,
583836
583915
  `Do NOT repeat this exact call. If you believe state changed, perform the concrete change first, then retry with distinct evidence.`
@@ -583847,7 +583926,7 @@ ${sections.join("\n")}` : sections.join("\n");
583847
583926
  "This call was not executed again, and the cached payload was not re-emitted because repeating it bloats the model context.",
583848
583927
  summary,
583849
583928
  "",
583850
- "Required next action: use the active evidence frame/tool cache and take a concrete next step: edit/write, run verification, update todos with changed state, or task_complete with evidence.",
583929
+ this._todoWriteAvailable() ? "Required next action: use the active evidence frame/tool cache and take a concrete next step: edit/write, run verification, update todos with changed state, or task_complete with evidence." : "Required next action: use the active evidence frame/tool cache and take a concrete next step: edit/write, run verification, or task_complete with evidence.",
583851
583930
  "If you need different information, use a distinct offset/limit/query. For broad multi-file discovery, use file_explore, grep_search, fanout_explore, or full_sub_agent instead of repeating this call."
583852
583931
  ].join("\n");
583853
583932
  }
@@ -587683,7 +587762,7 @@ ${_staleSamples.join("\n")}` : ``,
587683
587762
  }
587684
587763
  }
587685
587764
  const turnTier = this.options.modelTier ?? "large";
587686
- if (turn === 0 && !this.options.disableTodoPlanningNudges && (turnTier === "small" || turnTier === "medium")) {
587765
+ if (turn === 0 && !this.options.disableTodoPlanningNudges && this._todoWriteAvailable() && (turnTier === "small" || turnTier === "medium")) {
587687
587766
  const goal = this._taskState.goal || "";
587688
587767
  const substantiveGoal = goal.replace(/\b(?:then\s+)?call\s+task_complete\b[^.?!;]*/gi, "").replace(/\b(?:observe|report|summarize|finish|complete)\b[^.?!;]*/gi, "");
587689
587768
  const wordCount2 = substantiveGoal.split(/\s+/).filter(Boolean).length;
@@ -587796,7 +587875,7 @@ ${top.map((t2) => `- ${t2.name}: ${t2.desc}`).join("\n")}`);
587796
587875
  const isReadTask = /\bread\b|\bshow\b|\btell me\b|\bwhat is\b/i.test(taskGoal);
587797
587876
  const hints = [];
587798
587877
  if (isSimpleTask) {
587799
- hints.push("This is a simple task — if it needs only ONE substantive tool call, skip todo_write and call the tool directly, then task_complete. Do not count reporting, observing output, or task_complete as planning steps. If it needs 2+ substantive work steps, use todo_write to plan.");
587878
+ hints.push(this._todoWriteAvailable() ? "This is a simple task — if it needs only ONE substantive tool call, skip todo_write and call the tool directly, then task_complete. Do not count reporting, observing output, or task_complete as planning steps. If it needs 2+ substantive work steps, use todo_write to plan." : "This is a simple task — if it needs only ONE substantive tool call, call the tool directly, then task_complete. Do not count reporting, observing output, or task_complete as planning steps.");
587800
587879
  }
587801
587880
  if (isSearchTask) {
587802
587881
  hints.push("SEARCH STRATEGY: Use grep_search to find what you need FIRST, THEN file_read only the specific file and lines. Do NOT read entire files hoping to find something.");
@@ -588532,7 +588611,7 @@ ${memoryLines.join("\n")}`
588532
588611
  `Best practice for this model tier: emit at most ${_responseCap} tool calls per turn.`,
588533
588612
  `Observe the results of the first ${_responseCap}, then plan the next batch in the NEXT turn.`,
588534
588613
  `Smaller batches let cache/dedup/progress-gate/failure signals reach you BEFORE you commit to more work.`,
588535
- `Use todo_write between batches to track which items are done.`
588614
+ this._todoWriteAvailable() ? `Use todo_write between batches to track which items are done.` : `Track progress internally between batches; do not call unavailable planning tools.`
588536
588615
  ].join("\n")
588537
588616
  });
588538
588617
  }
@@ -588873,7 +588952,7 @@ Corrective action: try a different approach first: read relevant files, adjust a
588873
588952
  turn,
588874
588953
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
588875
588954
  });
588876
- const budgetMsg = `[BUDGET EXHAUSTED] You have used all ${toolBudgets[tc.name]} allowed ${tc.name} calls for the current phase. You ALREADY have enough information from previous calls. DO NOT try to call ${tc.name} again — it will be blocked. If your todo list shows more phases pending: mark the current phase completed via todo_write so a new budget allowance kicks in. If all phases are done: call task_complete with your final summary.`;
588955
+ const budgetMsg = `[BUDGET EXHAUSTED] You have used all ${toolBudgets[tc.name]} allowed ${tc.name} calls for the current phase. You ALREADY have enough information from previous calls. DO NOT try to call ${tc.name} again — it will be blocked. ` + (this._todoWriteAvailable() ? `If your todo list shows more phases pending: mark the current phase completed via todo_write so a new budget allowance kicks in. ` : `If more phases remain, continue with a different available tool instead of repeating the exhausted one. `) + `If all phases are done: call task_complete with your final summary.`;
588877
588956
  this.emit({
588878
588957
  type: "tool_result",
588879
588958
  toolName: tc.name,
@@ -590559,14 +590638,15 @@ Respond with EXACTLY this structure before your next tool call:
590559
590638
  }
590560
590639
  if (!_prior && !this._opaqueErrorHintInjected.has(_refStem) && _entry.subject == null && (categorizeError(_refErr) === "unknown" || _refErr.length > 100)) {
590561
590640
  this._opaqueErrorHintInjected.add(_refStem);
590641
+ const todoWriteUnavailable = tc.name === "todo_write" && /Unknown tool/i.test(_entry.wentWrong);
590562
590642
  const opaqueMessage = tc.name === "todo_write" ? [
590563
590643
  `[PLANNING TOOL RECOVERY — todo_write failed before updating the visible checklist.]`,
590564
590644
  ``,
590565
590645
  `Tool: ${tc.name}`,
590566
590646
  `Error: "${_entry.wentWrong}"`,
590567
590647
  ``,
590568
- `This is a recoverable planning-tool argument issue, not a local code or dependency failure.`,
590569
- `Correct the todo_write payload if a visible checklist is still needed; otherwise continue with the first substantive task from the attempted plan.`,
590648
+ todoWriteUnavailable ? `todo_write is not registered in this tool surface. Do not retry it; continue using the available tools and call task_complete with evidence when done.` : `This is a recoverable planning-tool argument issue, not a local code or dependency failure.`,
590649
+ todoWriteUnavailable ? `Use the attempted checklist only as private state; do not let missing bookkeeping block substantive work.` : `Correct the todo_write payload if a visible checklist is still needed; otherwise continue with the first substantive task from the attempted plan.`,
590570
590650
  `Do not pivot to broad shell discovery or code edits solely because todo_write failed.`,
590571
590651
  ``,
590572
590652
  this._renderLocalFailureNudge(turn)
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.461",
3
+ "version": "1.0.462",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.461",
9
+ "version": "1.0.462",
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.461",
3
+ "version": "1.0.462",
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",