Skip to content

Releases: JanEickholt/dsh-inline-diff

Flat preference rows on the 0.2.x Plugins page + plugin icon

Choose a tag to compare

@JanEickholt JanEickholt released this 05 Oct 19:20
v1.10.0
d0ddc13

On 0.2.x hosts the config entry rendered a nested collapsible card inside the bundle detail section, whose chrome the manager already owns — this release renders the preference rows flat there and aligns the segmented controls with the platform selection idiom.

  • Flat preference rows on the 0.2.x Plugins page: the seven preferences now render flat and always extended in the bundle detail section instead of inside a nested card. The rows and their settings wiring are shared with the 0.1.x card (PreferenceRows / usePreferenceState), so both seats stay in sync from one source.
  • The new seat re-exposes the --did-* text and hover tokens from the label aliases. The rows only inherited them under .did-root/.did-card, so on the page every var(--did-text-*) was invalid at computed-value time and collapsed to the inherited near-white primary, flattening the secondary/muted hierarchy.
  • Segmented controls follow the platform actionButton idiom: the selected segment carries the business accent as text color plus 600 weight with no backdrop box, focus-visible gets an explicit ring, and disabled segments dim instead of looking interactive.
  • Plugin icon: a split add/del mark ships in the tarball and on the Plugins page.

0.2.x Plugins-page settings card + stable edit/write rendering

Choose a tag to compare

@JanEickholt JanEickholt released this 05 Oct 13:54
v1.9.0
a21b3ca

DSH 0.2.x moved where a bundle's configuration lives and changed the edit/write row lifecycle; this release keeps the plugin fully working on 0.2.x hosts while 0.1.x hosts stay supported — one build, host detected at load (full contract notes: docs/compat.md).

  • Settings card on the Plugins page: registers through the keyed plugins.bundle.config slot on the bundle's detail section (same seat dsh-client-auto-continue uses), re-registering on every page reopen. 0.1.x hosts keep the old seats with slots/changed retries; the settings transport (configForms / settingsScope) resolves at runtime.
  • Edit/write cards stay rendered for the whole session: 0.2.x mounts every row at the preparing phase and re-renders the same component instance once the call dispatches. The card's hook count changed between those renders, so React threw #310, the slot entry was abdicated for the session, and every later edit/write silently fell back to the stock collapsed row. The hook order is now stable across preparing → dispatched → settled, covered by a jsdom lifecycle regression test.
  • The preparing call phase (no arguments yet) no longer crashes the JSON args parse.
  • @deepseek-ai/dsh-settings peer range widened to <0.3.0-0; new host-matrix compat test (0.1.5 / 0.1.7 / 0.2.0).

Fold long hunks with a settings toggle

Choose a tag to compare

@JanEickholt JanEickholt released this 16 Sep 19:29
v1.8.0
19de660

New optional Fold long hunks setting (Settings → Plugins → Inline diff): hunks longer than the configured visible rows per end collapse their middle behind a toggle bar.

  • Stepper for visible rows per end, default 8, clamped to 1..100 (en and zh)
  • Click / Enter / Space reveals the hidden middle; the bar that replaces it folds it back
  • Hovering an open bar previews what would be hidden in both columns
  • Truncation policy stays intact: bars never appear on already-truncated hunks and never advertise more lines than expanding actually renders

Feature idea by @zjh1159086960-crypto in #1.

dsh-wallpaper-engine liquid glass + settings toggle

Choose a tag to compare

@JanEickholt JanEickholt released this 12 Sep 19:16
v1.7.0
b0b15bc

Diff cards go liquid glass under dsh-wallpaper-engine

While a wallpaper is live, diff cards used to sit as opaque dark slabs over the wallpaper. The plugin now watches body[data-we-wallpaper] (the attribute dsh-wallpaper-engine sets while a wallpaper is rendered) and toggles a did-we-themed marker on <html> — the same pattern as the existing dsh-stylevault support. While the marker is on, the stylesheet adopts the plugin's own conversation glass recipe:

  • translucent surface and header driven by --we-glass-alpha (surface ×0.8, header ×1.0, matching the plugin's bubble/composer weights), so the wallpaper shows through
  • the same frosted backdrop-filter (blur(--we-blur) + saturate + brightness + contrast), specular sheen and glass shadow — the cards track the plugin's 玻璃 sliders live, including dark scheme
  • without backdrop-filter support the card reverts to the opaque stock recipe so code stays readable
  • placed after the stylevault block, so wallpaper glass wins the cascade

New setting: Wallpaper glass (壁纸玻璃)

The plugin settings card gains an On/Off row for the adaptation, persisted as inline-diff.wallpaper (default on), wired through the same plumbing as the other prefs. The Plugins-page settings card itself is untouched: under the glass settings window it already inherits the dialog treatment, and its own blur would double-frost.

pnpm test covers the new row (36 PASS / 0 FAIL).

v1.6.1

Choose a tag to compare

@JanEickholt JanEickholt released this 11 Sep 13:42
v1.6.1
281abd7

Whole-file writes no longer break the diff cards

Harness 0.1.5 records meta.diffs: [] for a file a write call creates, so the card falls back to the argument-derived whole-file hunk — whose oldText was null there. The card's cache key read null.length and crashed; one crash abdicated the slot entry, and every further edit/write call silently fell back to the stock collapsed row. That is the "inline diff is broken in the new harness" report.

Argument-derived hunks now carry oldText: "" (the same normalization wire hunks already get). An empty old side diffs as all-added, which is the intended whole-file view — created files show a fully green right column with real gutter numbers again. Ships with a regression test for the exact crash shape.

v1.6.0

Choose a tag to compare

@JanEickholt JanEickholt released this 06 Sep 07:15
v1.6.0
394c0f8

Svelte files get real syntax highlighting

svelte files now highlight with a dedicated svelte grammar on top of the vendored highlight.js lib/common set — markup, {#if} blocks and inline expressions each get their own token classes, so word-diff chips land on the changed fragment instead of the whole tag soup. The vendored language set ships with the plugin; no host-side highlight.js dependency needed.

Word chips diff whole changed blocks

Chips used to be computed per modified row pair, so a one-line removal replaced by a multi-line block chipped its surviving prefix against whichever sibling line it paired with, while genuinely novel lines rendered with no emphasis at all. Changed blocks now diff as one token stream:

  • tokens surviving anywhere in the run stay chip-free on both sides
  • wholly-novel lines keep the row tint instead of a full-line chip
  • one-sided rows apply the same run-level segments
  • whitespace never chips (no full-width indent bars)

Pairing fixes

  • Folded statements (an attribute list collapsed into one line, e.g. a one-line <a href=…>…</a>) anchor at the block head, so their counterparts stop pairing with a stray closing tag lower down.
  • Blank changed lines tint green/red like any other changed row; the faint ⏎ marker is gone.

Autoscroll survives big streaming edits

The row height-sync cleared every pair's min-height before remeasuring, and the forced layout in between saw the card collapsed. A conversation scroller pinned to the bottom clamped its scroll position into that collapsed layout and never recovered — on bigger edits each streaming tick stranded the bottom hundreds of pixels out of view until follow-scroll latched off. The sync now holds the card's current height across the measure, so the clamp never fires.

v1.5.0

Choose a tag to compare

@JanEickholt JanEickholt released this 06 Sep 00:03
v1.5.0
ed99c6a

Replacements stack on one row

A single removed line facing a single added line now always renders as one modified row — del on the left, its add on the right, level — instead of a red row stacked above a green row on opposite sides:

  • 1:1 runs pair unconditionally — with exactly one candidate per side there is nothing to mispair against, so the similarity score no longer leaves weak replacements (e.g. identityRoles.filter(...) → readonly string[] = TENANT_ROLES) one-sided.
  • Same-row convention — matches side-by-side diff rendering elsewhere (a replacement reads left→right in one pass) and saves a full row of height on wrapped lines.
  • Score gate untouched for n:1 runs — one removed line against several added lines still pairs by token similarity, so an insertion above an edited line still cannot steal its counterpart.

v1.4.0

Choose a tag to compare

@JanEickholt JanEickholt released this 05 Sep 18:05
v1.4.0
34cb856

Changed lines pair by similarity

Modified-row pairs are now matched by token similarity instead of run order, so the word chips land on the real counterpart:

  • Similarity pairing — an insertion placed above an edited line (a comment, a blank line) no longer steals the changed line's counterpart; unmatched lines render as plain additions or removals.
  • File-order rows — lines inside a changed block render top-down on both panes, so gutters never read backwards.
  • Containment pairing — a line folded into a spread or conditional (e.g. customerPhone: "0201 555000", → ...(options?.withoutPhone ? {} : { customerPhone: "0201 555000" }),) still pairs; the wrapper no longer dilutes the score below the threshold.

Line-count stats are unchanged — they keep counting the full removed/added runs.

v1.3.0

Choose a tag to compare

@JanEickholt JanEickholt released this 04 Sep 13:33
v1.3.0
e7e9c69

Features

  • Line numbers as a plugin setting — toggle real file line numbers next to diff rows instead of always-on (#e7e9c69, #fcb4c98)
  • Failed edit calls render as attempted diffs — dimmed diff of what was attempted, collapsed behind a failed badge header that toggles open (#2e3cac7, #9f3593f)

Fixes

  • Always render gutters from a stable per-card lane; empty diff rows keep line height; autoscroll keeps following while edit calls stream and during large diff growth (#2a99e37, #0c7f717, #4d254a2, #098245f)
  • Host stamps line positions through the presentationMeta dispatch gate (#5e12261)
  • Empty cards and centering with the new chat-width handles (#10f5cb9)
  • Use plain string settings namespace for host alpha (#8a53229)
  • Include cordis.patch.yml in published npm files (#0b6b9f1)

Chores

  • Ignore local pnpm lockfile from profile link installs; refreshed screenshots (#f3b64e8, #ff4ab88, #0eab5a3)

v1.0.0

Choose a tag to compare

@JanEickholt JanEickholt released this 26 Aug 17:07
v1.0.0
73506cb

First stable release.

Always-expanded split diff view for edit/write tool calls in the DeepSeek Harness web GUI: shadows the stock collapsed rows via the tool.call.toolview slot and renders each mutation as an inline side-by-side diff with line numbers. Bundled highlight.js syntax coloring, word-level highlighting, and common-indentation stripping are optional (Settings → Plugins).