Compare commits

..

1 Commits

Author SHA1 Message Date
adevwithpurpose
8512dd47f0 fix(combo): actionable recovery hint for the all_targets_skipped terminal reason (#9303) 2026-08-15 19:37:09 -03:00
5 changed files with 38 additions and 29 deletions

1
.gitignore vendored
View File

@@ -1,7 +1,6 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# project-specific directories
/output/
.slim/deepwork/
.omnivscodeagent/
omnirouteCloud/

View File

@@ -702,7 +702,6 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute
<tr><td align="left" nowrap>📱 <b>Android (Termux)</b></td><td align="left" nowrap><code>pkg install nodejs && npx -y omniroute</code></td><td align="left">Runs <b>on your phone</b>, 24/7, no root</td></tr>
<tr><td align="left" nowrap>📲 <b>PWA</b></td><td align="left" nowrap>"Add to Home Screen"</td><td align="left">Fullscreen, offline, installable from browser</td></tr>
<tr><td align="left" nowrap>🧩 <b>OpenCode plugin</b></td><td align="left" nowrap><code>@omniroute/opencode-provider</code></td><td align="left">Native OpenCode integration</td></tr>
<tr><td align="left" nowrap>🤖 <b>VS Code Copilot Chat</b></td><td align="left" nowrap>install <b>OmniCopilot</b> extension</td><td align="left">Every OmniRoute model in the native Copilot Chat picker — stable &amp; Insiders</td></tr>
<tr><td align="left" nowrap>🛠️ <b>From source</b></td><td align="left" nowrap><code>npm install && npm run dev</code></td><td align="left">Hack on it, contribute</td></tr>
</table>
@@ -712,33 +711,6 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute
<div align="center">
### 🧩 New: OmniRoute inside VS Code's native Copilot Chat
</div>
> No new sidebar, no new chat UI — every model OmniRoute serves shows up right in the
> **Copilot Chat model picker you already use**. Since VS Code 1.122, provider models work
> without a GitHub sign-in or a Copilot subscription — agent mode, tool calling and vision, for
> free.
Install the **[OmniCopilot](https://github.com/diegosouzapw/OmniCopilot)** extension, point it
at your OmniRoute server (defaults to `localhost:20128`), then open Copilot Chat → model picker
**Manage Models…****OmniRoute**.
<table>
<tr><th align="left">Store</th><th align="left">Link</th><th align="left">Works with</th></tr>
<tr><td align="left" nowrap>🧩 <b>VS Code Marketplace</b></td><td align="left"><a href="https://marketplace.visualstudio.com/items?itemName=diegosouzapw.omnicopilot">Install →</a></td><td align="left">VS Code — stable &amp; Insiders</td></tr>
<tr><td align="left" nowrap>🔓 <b>Open VSX Registry</b></td><td align="left"><a href="https://open-vsx.org/extension/diegosouzapw/omnicopilot">Install →</a></td><td align="left">Cursor, Windsurf, VSCodium, Theia, code-server, Gitpod, Antigravity, Kiro…</td></tr>
</table>
From inside the editor: open the **Extensions** view, search **"OmniRoute"**, click **Install**
— works the same way on both stores. Source, issues and the publishing runbook live at
[diegosouzapw/OmniCopilot](https://github.com/diegosouzapw/OmniCopilot).
<br/>
<div align="center">
## 🔒 Private & Local-First
</div>

View File

@@ -0,0 +1 @@
- fix(combo): recovery hint for all_targets_skipped now points at provider quota/availability instead of 'transient, just retry' (#9303)

View File

@@ -53,6 +53,12 @@ export function buildRecoveryHint(
next_step:
"Strict context requirements removed every target (known context windows are below minContextWindow). Lower minContextWindow, switch contextFilterMode to lenient, or add larger-context models.",
};
case "all_targets_skipped":
return {
action: "switch-combo",
next_step:
"Every target was skipped before dispatch (capability pre-filter narrowed the pool and the remaining targets were all quota-exhausted/unavailable). Check the provider's quota in /dashboard/providers, reconnect or top up the account, or switch to a combo/model that has a healthy capability-matching target.",
};
default:
return {
action: "retry",

View File

@@ -0,0 +1,31 @@
import test from "node:test";
import assert from "node:assert/strict";
const { buildRecoveryHint } = await import("../../open-sse/services/combo/pinRecovery.ts");
test(
"#9303: buildRecoveryHint('all_targets_skipped') must return an actionable " +
"hint, not the generic 'transient, just retry' default",
() => {
const hint = buildRecoveryHint("all_targets_skipped");
assert.notEqual(
hint.action,
"retry",
"the pre-dispatch full-exhaustion terminal reason must not be classified as a " +
"generically 'retry'-able transient failure — the reporter's log shows the " +
"identical exhaustion recurring across ~9 consecutive requests with no recovery"
);
assert.doesNotMatch(
hint.next_step,
/failed transiently/i,
"must not tell the client this was transient when the whole target pool was " +
"pre-filtered/quota-exhausted before a single dispatch attempt was made"
);
assert.match(
hint.next_step,
/quota|availability|provider/s,
"the hint must point at the provider quota/availability as the actionable next step"
);
}
);