Skip to content

Releases: btspoony/dsh-keys-manager

v0.2.11

Choose a tag to compare

@github-actions github-actions released this 28 Oct 10:06
bac5e51

[0.2.11] - 2026-10-28

Changed

  • A route without a usage probe now says "usage is not shown for this route" instead of leaving the plan-usage line looking like a failed read.

v0.2.10

Choose a tag to compare

@github-actions github-actions released this 26 Oct 04:11
d041472

[0.2.10] - 2026-10-26

Added

  • Key-pool routes now prefer the account whose plan quota resets soonest (weekly window first, then a session window below 90% used), so leftover quota is spent before it expires; routes without usage data and equally-ranked accounts keep the existing cursor rotation.
  • Plan usage can now be read for the Factory Droid transport route: the host resolves the route's read-only llm-omp-transports/factory-droid grant and probes its billing limits, so the five-hour and weekly windows become visible without ever rotating or writing the credential.

Fixed

  • A plan-usage read that never answers now gives up after a bounded wait and reports "not reported" (retrying on the slow cadence), and an answer that arrives later is discarded instead of overwriting a newer reading.
  • Plan-usage reads now probe at most four accounts at once and skip the credential lookup entirely for a cached account, so a wide key pool no longer opens one vendor request per key on every refresh.
  • Dead cache entries are evicted when a key is removed or a provider is released, and a displayed snapshot can no longer be mutated by a caller.
  • The plan-usage label now trusts the expiry of the credential actually used, so a stale account-row timestamp can neither mask a real refusal nor fake an expired account.
  • A stale usage reading is re-checked on the slow (ten-minute) cadence instead of sticking until the card is remounted.
  • A rejected plan-usage refresh now shows a localized "not reported" state and retries on the slow ten-minute cadence, instead of leaving the account row pending for the rest of the card session.
  • A credential-store read that fails transiently is retried once and then reported as a temporary failure, so a momentary blip no longer looks like a refused or expired credential (the last known numbers stay visible and no sign-in is prompted).
  • An expired stored OAuth credential no longer asks the user to sign in again for plan usage: the card says the account is managed by DSH instead, because only a model request refreshes that token.
  • Plan-usage states that are not reported now refresh on a ten-minute cadence (and keep their last known label while doing so), instead of sticking until the card is remounted.

v0.2.9

Choose a tag to compare

@github-actions github-actions released this 25 Oct 03:27
30dd00b

[0.2.9] - 2026-10-25

Fixed

  • Read a provider card's plan usage from the credential that actually serves the route: an OAuth account managed natively by DSH no longer shows "sign in again" (and no longer re-prompts after a successful sign-in), and when that credential is unreadable the row says "managed by DSH" instead of pretending the provider reports no usage.

Changed

  • Plan usage now renders as one muted line at the bottom of each key or account row (W 61% · 5h 32% · 3 天后重置) instead of a separate block on the provider card, so the card no longer grows a usage section.
  • A route that cannot report usage shows nothing at all — no block, no line, no placeholder; the "sign in again" note stays for an OAuth account whose grant needs renewing.
  • Usage coverage now includes Command Code, xAI SuperGrok and Cline, alongside Claude, Codex, Z.AI, Kimi, MiniMax and OpenCode Go.

v0.2.8

Choose a tag to compare

@github-actions github-actions released this 24 Oct 14:58
97c4771

[0.2.8] - 2026-10-24

Changed

  • Name all seven transport routes in the known limits, and stop describing factory-droid as deferred.
  • Restructure both READMEs into grouped capability areas with comparison tables for accounts, transport routes and failure policy; the extra-provider catalog stays as a folded list.
  • Regroup provider coverage into four groups — DSH built-in, plugin extra built-in, OAuth accounts and transport routes — with the supported and not-pooled lists folded into two details blocks; kilo and zai are OAuth accounts signed in by the plugin's bundled clients, not a separate category.
  • Bump the @oh-my-pi/* build-time pin from 18.12.3 to 18.12.6 (whole cohort: pi-ai, pi-catalog, pi-utils, pi-natives, pi-wire, omptype) and regenerate the pi-ai patch; the cursor exec-frame handoff patch body is unchanged.

Fixed

  • Restore the legacy-tier case in the Google transport note — the README now names both legacy-tier and paid accounts that must set GOOGLE_CLOUD_PROJECT / GOOGLE_CLOUD_PROJECT_ID.
  • Cursor route: native shell (batch and streamed), mini_swe_agent_bash,
  • The handoff translation into DSH's tool schemas is lossy: every GrepArgs
  • The pinned @oh-my-pi/pi-ai@18.12.3 is now patched via
  • A transport route with no stored credential no longer appears in DSH's model picker or the Settings → Models provider list; the route's provider card and sign-in entry stay on the Keys Manager page.

Added

  • Show each managed account's plan usage on its provider card: a compact one-line hint when collapsed, and an expanded strip with one thin bar per window (session and weekly), the used percentage and the reset countdown.
  • Quota reads are pull-only, cached in memory with TTL jitter and failure backoff, and never touch key selection or cooldown; a provider whose plan cannot be read shows "not reported" (or "sign in again" on a stale OAuth account) instead of a zero bar.

v0.2.6

Choose a tag to compare

@github-actions github-actions released this 24 Oct 03:01
7d3253c

[0.2.6] - 2026-10-24

Added

  • Add the bundled lib/omp/google.mjs artifact: omp's Gemini Cloud Code Assist provider, shared by the google-gemini-cli and google-antigravity routes and dispatching on model.provider, with a manifest entry, pinned source hashes and a calibrated size ceiling.
  • Add the generated Google model tables (google-gemini-cli, google-antigravity) and their googleGeminiCliCatalogModels() / googleAntigravityCatalogModels() projections for host-side model pickers.
  • Add the google-gemini-cli and google-antigravity sign-in flows: a loopback listener on 127.0.0.1 (port fallback to an ephemeral port, five-minute bounded wait, abort-safe), a paste fallback, Cloud Code Assist project discovery and a single-window token refresh that preserves the project and an un-rotated refresh token.
  • Register both Google routes: configurable providers.google-gemini-cli / providers.google-antigravity allow-lists, catalog-model exports for host pickers, and lazy loading of the shared lib/omp/google.mjs artifact (a missing build reaches the request as TRANSPORT_UNAVAILABLE, never a failed start).
  • Project the transport package's model catalogs into the Keys Manager model picker for the google-gemini-cli, google-antigravity and factory-droid routes, each from its own catalog export.
  • A transport build that registers one of these routes without shipping its catalog reports the missing catalog in the picker's response instead of showing an unexplained empty model list.

Fixed

  • Fix the Cursor route's file and shell tools: DSH tools whose names collide with Cursor's native exec channel (read, bash, write, delete, ls, grep, todo) are advertised as dsh_<name> so the transport keeps them in its MCP tool list; the event stream restores the DSH name on the tool call, while history replay keeps the advertised dsh_<name> alias so the follow-up request matches. The seven dsh_<native> names are reserved: declaring a DSH tool under one fails the request with TOOL_ALIAS_COLLISION instead of being silently resolved.

v0.2.5

Choose a tag to compare

@github-actions github-actions released this 23 Oct 11:06
d77c5d3

[0.2.5] - 2026-10-23

Added

  • Sign in to Kilo and Z.AI (GLM Coding Plan) from Keys Manager: Kilo polls a device-code page, Z.AI opens a browser URL and accepts the pasted redirect URL or code.
  • Both sign-ins mint a static credential stored as an ordinary key row (signin:kilo / signin:zai-coding-plan); Sign in again replaces that row's literal in place.
  • The first Kilo sign-in creates its plugin route and first key; Z.AI joins an adopted route as one more pool row, and neither writes a llm-pi-ai grant.
  • Add the devin transport route: a second omp-backed artifact (lib/omp/devin.mjs) speaking Devin's Connect-framed chat protocol, with its own generated catalog (swe-1-6, swe-1-6-fast), manifest entry, drift gate and calibrated size ceiling.
  • Add the llm-omp-transports/devin sign-in flow: PKCE authorize page plus a paste-the-callback prompt (the pinned loopback listener is Bun-only), a token exchange and a static bearer with a derived expires; there is no refresh.
  • Register the Devin adapter, its Models-page profile, providers.devin.models allow-list and provider info beside Cursor's, sharing one route-parameterised adapter and projection.
  • Fill DSH attribution headers only where a request left them absent, so Devin's chat call keeps its required connect-go client identity while the header-less GetUserJwt handshake still carries the harness user-agent.

Fixed

  • Document the devin transport route in the root README (EN/ZH): paste-only sign-in, no refresh token, unverified endpoints, and the corrected "one grant per route" wording.
  • Root known limits now name Kilo and Z.AI Coding Plan as in-process sign-in routes and state the transport expires contract per resolver.
  • The sign-in dialog masks a pasted authorization code (Z.AI and Devin) behind a reveal toggle, resets the reveal on every new prompt, and uses autocomplete="new-password" so a saved password is never filled in.
  • A transport grant with a usable token and no expires stays active on the Devin route with no expiry cell, while the Cursor route (which needs a dated grant) reports needs-reauth.
  • A transport route whose installed build ships no model catalog now reports it once in the state warnings instead of showing an empty model list without explanation.
  • Signing in to Kilo seeds the route from the plugin catalog instead of waiting for endpoint model discovery before the key row appears.
  • The model picker explains an empty catalog instead of rendering a bare empty list when the installed transport build ships no catalog for the route; Save is off until the catalog exists.
  • Adopting a catalog route that has no Models profile now creates one from the installed catalog, so the connection test and the Models page can select the route's models instead of refusing with "no settings profile yet".

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 22 Oct 15:28
72615c0

[0.2.4] - 2026-10-22

Fixed

  • A per-key connection test against a healthy provider reports success again (a one-token answer ends with max-tokens, which is a completion), and a failed re-authentication no longer deletes the grant record its surviving account row references; an account whose grant record was lost is now healed on the read path (activation or a connection test) from the route's live projection, instead of staying unusable.
  • Cursor now appears as a configured provider wherever providers are listed (DSH Models, fallback chains, third-party plugins), and its transport card gains a collapsible model picker that narrows the route to the selected catalog models; an empty selection keeps the full catalog.
  • The transport model picker fails closed when the settings store cannot be read: it reports the read error with a Retry action and keeps Save disabled, instead of showing the all-models state whose one save would have cleared a narrowed selection; a stored model id the shipped catalog no longer offers is filtered out of the picker so the remaining selection still saves.

v0.2.3

Choose a tag to compare

@github-actions github-actions released this 22 Oct 04:36
ac568c8

[0.2.3] - 2026-10-22

Added

  • The provider list gains five single-select quick filters — All, Built-in, Plugin, OAuth-capable and Transport — that narrow the managed and available lists and compose with the existing search.
  • OAuth-capable uses the same verdict as a row's Add account button, so it lists exactly the routes that can start a sign-in right now.
  • The chosen filter also governs the transport accounts section, which appears under All and Transport; with Transport selected and no accounts it stays visible with a 0 count and the existing empty copy.
  • The quick-filter chips show a visible focus ring, the row is announced as a labelled group, the unattributed count keeps its number in its accessible name, and an empty transport list says so instead of reusing the search-empty copy.

Fixed

  • A transport-plugin route (Cursor) now renders as a plugin Transport provider card and can no longer be adopted, key-bound or tested as a pi-ai provider; its account controls moved into that card.
  • A transport account whose route id collides with an ordinary provider's id keeps its row (and its only sign-in/remove control) instead of being treated as card-owned by a card that never rendered it.
  • Activating an account no longer holds the global mutation queue while it reads the OAuth credential, so a slow credential store cannot delay unrelated key or settings changes; the activation's errors, returned state and cooldown reset are unchanged.
  • An activation now writes its credential projection only while the route still serves the value it read, and never deletes a grant another writer replaced. A rejected state flush puts the projection back — removing it only when the activation created it — so a refused activation leaves nothing behind.
  • A refused activation restores the route's owner classification along with the projection it puts back, so requests keep using the restored credential and failures keep attributing to it instead of falling back to the key pool; the activated account keeps its claim whenever its projection is still serving.
  • Provider rows show an Unattributed count for stream attempts a route served with no account owner — whether its ownership read had not landed yet or had failed — and the count clears once a later read attributes the route. A failover retry is a new attempt, so one request can be counted more than once.
  • A request waiting on ownership hydration no longer keeps the process alive for the rest of the bounded wait.

Changed

  • Release notes are now assembled from authored .changes/unreleased/ fragments instead of git log subjects, and a release with no changelog bullets is refused.
  • Backfill CHANGELOG.md for 0.1.0–0.2.2 with authored notes; earlier sections listed merge subjects.

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 21 Oct 14:53
f695418

[0.2.2] - 2026-10-21

Added

  • Extra providers can declare environment-sourced request headers; values are read from your environment when the provider is added and refused loudly when missing, blank or credential-bearing.
  • coreweave joins the catalog through that carrier with COREWEAVE_API_KEY and COREWEAVE_PROJECT for its OpenAI-Project header, and providers with declared headers use their seed catalog instead of model discovery.
  • Changing the environment later surfaces as a state warning, and removing the provider drops only the header value it set.
  • New published component dsh-llm-omp-transports serves Cursor through DSH's LLM seam: text and reasoning deltas, usage before a single finish, finish kinds, error classification and abort.
  • Tool calls are projected from DSH into the transport and unresolved calls hand off to DSH's tool loop; transport-resolved native frames are not re-dispatched.
  • Cursor sign-in uses a PKCE flow with poll and refresh, and a generated 123-row model table comes from a pinned catalog.
  • The install now mounts two components (the plugin detail page lists both), and the keys manager lists, activates, removes and re-authenticates the resulting Cursor accounts beside the pi-ai pool.
  • Key and account rows gain a Test action that runs one real request through the LLM seam and reports whether that credential serves the route, without touching health, cursor or binding state.

Changed

  • Release prep drives both published packages from one version input: the resolved version is written to both manifests with both tags, and a transport manifest that disagrees with it is refused.

Fixed

  • An OAuth-served route no longer fails with MISSING_CREDENTIAL: a broker reference is written only while the key pool actually serves the route, so pi-ai can reach its own grant, and a broken binding left by an earlier version is healed at startup.
  • A login harvest that aborts because the attempt already settled now demotes the pi-ai projection it had written, so the route stops serving a superseded grant instead of staying bound to it.

Docs

  • README documents the Desktop/Web install path.
  • README lists the extra providers in a collapsible table.

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 20 Oct 10:08
1558c7b

[0.2.1] - 2026-10-20

Fixed

  • The plugin declares authorization in its inject list, so loading no longer fails with cannot get property "authorization" without inject.