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 host β
lib/index.jsshrank 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 suite β
npm testships 18node:testcases covering the
settings.yamlpatcher: 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 observedfinish_reason(orstop) 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.jssplit intolib/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 tolib/panel-i18n.jsinjected beforepanel.js - β‘ host: probing rewritten on async
spawnwith in-flight dedup β even a cold
probe never blocks the event loop - π§ pack: auto-relinks the junction + profile dependency and always writes the
profilepackage.jsonBOM-free β the local test loop is now exactly
"pack + restart"
Tests
- β
npm test: 18node:testcases forsettings-patch.jsβ effort-block
insertion & indentation, idempotency (NO_CHANGE+already), CRLF
detection & preservation, byte-for-byte comment/provider preservation, empty
models:lists,ensureProviderchain creation & name-collision avoidance,
and the three-round verify-after-write invariant
Full Changelog: v0.7.1...v0.8.0