Skip to content

v1.3.2 — first public release

Choose a tag to compare

@hoshF hoshF released this 03 Oct 12:52
· 20 commits to main since this release

A "导出 MD" button in the DSH Web session header that exports the current
conversation as clean Markdown through the native save dialog, plus a CLI over
the same renderer.

It reads session logs directly from disk — including the multi-frame zstd layout —
which is what makes it work on DSH 0.2.x where the existing export plugins fail on
the version gate, the session format, or the decompression.

Requires Node 22.15+. The node:zlib zstd API does not exist in Node 20 or 21.

Install

Open Plugins in the DSH sidebar → Add plugin → paste
https://github.com/hoshF/dsh-md-export → restart DSH. Or clone and run
./install.sh.


Fixed

  • The plugin required a newer Node than it claimed. engines said >=20 and
    the README said the same, but reading a session log needs
    zstdDecompressSync, which node:zlib only gained in Node 22.15 (23.8 on
    the 23 line). On Node 20 the named import made the module fail to link, so the
    plugin did not even load — it surfaced as does not provide an export named 'zstdDecompressSync'. engines now says >=22.15, the docs say so, and
    src/session.js imports node:zlib as a namespace and checks at runtime so an
    unsupported runtime gets a sentence instead of a module error. The plugin also
    warns once at load time in that case.

    CI caught this: the Node 20 matrix leg failed while 22, 24 and 26 passed. The
    matrix is now 22.15.0 (the real floor), 24 and 26 — testing the claimed
    minimum is the point.

  • The unsupported-runtime error was being swallowed. decompressZstdAll()
    catches failures while probing for frame boundaries, which also caught "this
    runtime has no zstd" and replaced it with a misleading
    zstd frame boundary parse failed. The capability check now runs before the
    loop.

Changed

  • install.sh deletes the profile lockfile before installing. pnpm reuses the
    previously locked tarball when a rebuilt one keeps the same version, so
    editing the source and re-running the script could report success while
    changing nothing. A profile locks only this one dependency, so there is no
    cost to regenerating it.