Skip to content

Releases: Wecury/dsh-owui-chat2api

v0.8.0

Choose a tag to compare

@Wecury Wecury released this 07 Sep 18:12
c63774d

Highlights

  • 🟢 Login results land in the panel — finishing the login flow now pops a
    green "credential saved" (or yellow failure) notice in the sticky bar, so the
    outcome of a browser sign-in is visible without digging through logs.

  • 🚀 Nothing blocks the request path any more — python/deps probing is fully
    async (no more worst-case ~27s event-loop freezes), and the one-click model &
    reasoning sync answers immediately: the scan runs on the host and the
    result arrives through the status poll, with a steady "scan running" notice.

  • 🧱 A modular hostlib/index.js shrank from 650 to 193 lines of pure
    wiring; config, diagnostics, process lifecycle and settings-sync each live in
    their own module. Zero behavior change, verified by a new test suite.

  • 🧪 First test suitenpm test ships 18 node:test cases covering the
    settings.yaml patcher: idempotency, CRLF handling, byte-level preservation
    of comments and unrelated providers, and the verify-after-write round-trip.

  • 🩹 Startup credential validation (ported from upstream 32df4a5) — saved
    credentials are checked against the backend at proxy start. A revoked token
    now opens the sign-in window instead of silently serving 401s; an unreachable
    backend keeps serving so a transient outage can't kill DSH autostart. Plus the
    0.7.2 streaming fixes: truncated streams end gracefully and upstream failures
    answer 502 instead of hanging.

Changelog

Features

  • ✨ login: the flow's outcome surfaces in the sticky notice — green when a
    credential was saved, yellow on failure; a 10-minute freshness window means a
    panel reopened hours later never replays stale results
  • ✨ sync: effort-scan returns instantly ({ async: true }) and reports via
    /api/status (mirrors start/login); double clicks are refused host-side
    ("a scan is already running")
  • ✨ proxy: validate saved credentials at startup (upstream 32df4a5,
    plugin-adapted: only a definite 401/403 falls back to the browser — an
    unreachable backend keeps the saved credential and serves)

Bug Fixes

  • 🐛 proxy: truncated upstream streams finish gracefully — a final chunk with
    the observed finish_reason (or stop) plus usage and [DONE], so strict
    clients no longer fail with "Stream ended without finish_reason"; upstream
    failures answer 502 instead of leaving the request hanging (0.7.2)
  • 🐛 panel: info notices tinted with real DSH blue tokens — the brand alias is
    near-monochrome, so they previously rendered gray
  • 🐛 panel: boot anchor poll stops once the shell is pinned (ResizeObserver
    takes over); closed-panel status polling slowed from 3s to 10s

Refactoring

  • ♻️ host: index.js split into lib/config.js, lib/diagnostics.js,
    lib/proxy-process.js, lib/effort-scan.js — the entry file is a 193-line
    wiring layer only
  • ♻️ panel: styles extracted to lib/panel.css (served via /panel.css),
    dictionaries to lib/panel-i18n.js injected before panel.js
  • ⚡ host: probing rewritten on async spawn with in-flight dedup — even a cold
    probe never blocks the event loop
  • 🔧 pack: auto-relinks the junction + profile dependency and always writes the
    profile package.json BOM-free — the local test loop is now exactly
    "pack + restart"

Tests

  • npm test: 18 node:test cases for settings-patch.js — effort-block
    insertion & indentation, idempotency (NO_CHANGE + already), CRLF
    detection & preservation, byte-for-byte comment/provider preservation, empty
    models: lists, ensureProvider chain creation & name-collision avoidance,
    and the three-round verify-after-write invariant

Full Changelog: v0.7.1...v0.8.0

v0.7.1

Choose a tag to compare

@Wecury Wecury released this 04 Sep 13:23
3e405f2

Highlights

  • 🧩 One-click model & reasoning sync — the panel button scans the upstream
    through the proxy, auto-creates the model provider in ~/.dsh/settings.yaml
    when none points at the local proxy (inline auth header included, so no API key
    is ever asked for), adds every backend model that isn't declared yet, and
    writes reasoningEfforts for the models that accept the parameter. Fresh
    installs: log in once, click Sync, restart DSH — nothing to type in Settings.

  • 🛡️ Credentials leave the plugin directory — the Open WebUI session token (a
    live JWT) now lives in ~/.dsh/dsh-owui-chat2api-token.json (via
    DSH_OWUI_TOKEN_FILE), never inside the install folder; a stray bundle-side
    token is migrated once and removed. token.json / usage.db / .chrome-profile
    / __pycache__ are hard-excluded from the package even when built from a
    working copy.

  • Effort scan that survives real backends — probes run concurrently
    (8 workers, cache preserved) with a 20-minute host budget, so large model lists
    are no longer killed mid-scan; a Force re-scan button re-probes everything.

  • 🧠 Native reasoning levels in DSH — supported models show
    Off / Low / Medium / High in DSH's own model picker via auto-written
    reasoningEfforts entries.

  • 🔐 Dependable browser login — the token read from Open WebUI is validated
    before it's accepted; a stale token reopens the browser for a real sign-in
    instead of silently breaking every request with 502s.

Changelog

Features

  • ✨ sync: create the llm-pi-ai > providers chain in settings.yaml when no
    provider points at the local proxy — no manual "add provider + fill key" step
  • ✨ sync: auto-created provider carries an inline Authorization header, so DSH
    never prompts for a key (the proxy ignores incoming keys and uses its own token)
  • ✨ sync: declare missing backend models (- id: + name:) in the matching
    provider only; every other provider and byte of the file is untouched
  • ✨ sync: timestamped .bak-reasoning-* backup before any write; re-runs are
    idempotent
  • ✨ sync: Force re-scan re-probes every model, ignoring the cached results
  • ✨ login: prefer a long-lived Open WebUI API key when authenticating

Bug Fixes

  • 🐛 pack: files-allowlist negations + .npmignore/.gitignore — a JWT can no
    longer ride a tarball even if a login ran inside the repo copy
  • 🐛 scan: concurrency + explicit host timeout — large model lists aren't killed
    at 90s any more; results are collected in one run
  • 🐛 scan: host-side busy guard + long panel busy window — two clicks can't start
    a second concurrent scan that races the settings.yaml write
  • 🐛 settings: keep only the newest 4 .bak-reasoning-* files so ~/.dsh isn't
    buried over years
  • 🐛 settings: verify-after-write — the patched file is re-read and re-checked
    (provider exists / models present / efforts applied) and warns if not
  • 🐛 login: validate the saved token against the upstream instead of trusting
    localStorage — no more flash-and-close window followed by dead 502s
  • 🐛 login: keep the browser open until a valid token is stored; auto re-auth on
    401/403
  • 🐛 proxy: refuse oversized request bodies (>8 MiB) before reading
  • 🐛 panel: effort-scan and Save results show inline under the buttons instead of
    the top status banner
  • 🐛 panel: close/language controls respond to Enter/Space (keyboard a11y);
    overlay warns once when falling back to the page body and pauses while hidden
  • 🐛 panel: save / sync results surface in the single sticky notice bar (one
    notification language, consistent auto-clear)

Full Changelog: v0.5.1...v0.7.1

v0.5.1

Choose a tag to compare

@Wecury Wecury released this 03 Sep 17:01
bacbe1f

v0.5.1 — First public release

dsh-owui-chat2api is a DeepSeek Harness plugin that runs Open WebUI's
chat2api reverse proxy inside DSH and lets you control it from a floating
panel — no manual Python setup, config files, or separate terminal.

What's inside

  • 📌 Floating control pill docked to the top-right of the DSH content area
    (themed, EN/中文)
  • ▶️ Start / Stop / Login controls with a live status card and dependency
    diagnostics (checks Python + requests + Playwright)
  • 📊 Usage dashboard: Today / Yesterday / Month / Cumulative — stat cards for
    calls, in/out/cached tokens, latency, errors, plus a per-model share-bar
    ranking
    (top 6 + "Other N", hover for the full breakdown)
  • 🤖 Auto-start toggle (persisted), pre-filled base URL
  • 💾 Stable usage tracking in <DSH_HOME>; one-time merge of legacy data
  • 🔐 Login session kept in a private browser profile — never shipped in the
    artifact; bundle carries no credentials by design
  • 📦 Packed bundle (npm pack / pack.ps1, MIT + THIRD_PARTY_NOTICES)

Fixes in this release

  • Pill now sits below the DSH top bar instead of under the window close button
  • Fixed the pill shrinking and overflowing its label (left+right layout bug);
    width stays content-sized, 28px from the right edge
  • Host messages (login success, etc.) localized to Chinese when the UI language
    is Chinese
  • Safe repack: pack.ps1 (now mirror-mode) preserves the live login profile
  • README release commands fixed for Windows PowerShell

Install

npm i <link to the .tgz in DSH profile>   # or follow README's profile wiring