Skip to content

Releases

v1.5.1 — a settled retry leaves no record

Choose a tag to compare

@zchuxi zchuxi released this 03 Oct 14:03

已结束的重试不再留下记录 · A settled retry leaves no record

中文

  • 重试进行中的那条倒计时始终保留 —— 那是「可见重试」的全部意义。
  • 重试结束之后(成功、或随回合关闭而取消),那条「已重试模型请求(N/M)」「模型请求重试已取消(N/M)」记录不再留在对话里。
  • 判据全部取自产品自己的渲染:data-chat-flow-kind="model-retry" 加上只在等待退避时出现的 data-active,所以不会误伤别的行,也不需要猜某次重试是谁发起的。
  • 新增设置项 hideSettledRetry(默认开)。关掉「启用可见重试」时该项自动失效:那时对话里的重试属于产品自带预算,不该由本插件隐藏。
  • 支持 DSH 0.1.7 / 0.2.x。

English

  • The countdown shown while a retry is waiting out its backoff always stays -- that is the whole point of a visible retry.
  • Once a retry settles -- it went out, or the turn closed and cancelled it -- the "已重试模型请求 (N/M)" / "模型请求重试已取消 (N/M)" record no longer stays in the transcript.
  • The rule is keyed entirely on the product's own rendering: data-chat-flow-kind="model-retry" plus data-active, which only appears while a retry is scheduled. It cannot catch someone else's row, and nothing has to guess whose retry it was.
  • New setting hideSettledRetry (default on). It yields automatically while "visible retry" is off: those retries belong to the product's own budget and are not this plugin's to hide.
  • DSH 0.1.7 / 0.2.x supported.

See README.md §2.1 for install and settings.

v1.5.0 — recover inside the turn, visibly

Choose a tag to compare

@zchuxi zchuxi released this 01 Oct 15:21

同一步内可见地重试 · Retry inside the turn, in the open

中文

  • 请求失败不再由插件私自静默重试:改为放大产品自带的重试预算,因此每一次重试都是产品自己渲染的那一条 —— 带实时倒计时,可以看着它走完,也可以随时取消。
  • 4xx(429 除外)属于确定性错误,永不重试,直接交回宿主。
  • 输出被截断时在同一轮里续写;可选的新开一轮继续,现在也覆盖停在输出上限的答案。
  • 输入框里有草稿、或收件箱里有排队消息时,「继续」会自动让位,不与用户已经发出的内容争抢。
  • 被隐藏的轮次不再在轮次导航轨道上留下空洞。
  • 支持 DSH 0.2.x。

English

  • A failed request is no longer retried silently by the plugin. It widens the product's own retry budget, so every attempt is the one the product already renders -- a live countdown you can watch and cancel.
  • 4xx other than 429 is treated as deterministic and handed straight back to the host.
  • Truncated output keeps its in-turn continuation, and the opt-in continuation turn now also covers an answer that stopped at the output ceiling.
  • The continuation affordance stands down while the composer holds a draft or the inbox holds a queued message.
  • Hidden rounds no longer leave a gap in the round rail.
  • DSH 0.2.x is supported.

See README.md for install and settings.

v1.2.4 — send-button and rail behaviour

Choose a tag to compare

@zchuxi zchuxi released this 26 Sep 04:40

The 1.2.x line, everything since the 0.1.7 port:

  • v1.2.2 — a round whose events are not loaded is attributed from the host's whole-log projection (
    estartTaskRounds), and a hidden rail mark no longer leaves a hole: the rail is measured and compacted.
  • v1.2.3 — the send-button takeover no longer outlives the empty composer: the draft is re-read every pass and again at the click, and releasing restores the product's verdict for an empty composer.
  • v1.2.4 — the round control steps aside while the composer holds a message, keyed on the product's own primary control.

Prebuilt package: dsh-restart-task.tgz (version-free asset name on this pinned tag, so the link never rots).

v1.2.1 — awesome-dsh-plugin submission conformance

Choose a tag to compare

@zchuxi zchuxi released this 25 Sep 15:33
  • peerDependencies (and the declarative engines.dsh) now carry an explicit
    prerelease branch per supported tuple:
    ">=0.1.7-rc.1 <0.1.8-0 || >=0.1.8-rc.1 <0.2.0-0". node-semver only lets a
    prerelease satisfy a range when a comparator on that exact major.minor.patch
    tuple carries a prerelease tag, so the previous open-ended ">=0.1.7-rc.2"
    admitted the next stable patch while silently excluding its release candidates.
    The floor moves to 0.1.7-rc.1 after checking that runtime: it already ships
    SettingsForms (no settings.register) and volatile config updates in
    cordis-plugin-loader, so the settings seam this plugin needs is present there.
    "<0.2.0-0" keeps the next major out on purpose: 0.2.0 is unverified, and an
    explicit skip beats an unverified load.
  • screenshots.json declares the two settings-card images for storefronts, with
    paths relative to the manifest and inside the package, as the list requires.
  • docs/awesome-dsh-plugin-entry.yml is the one-file submission for the list,
    ready to copy to data/plugins/zchuxi__dsh-restart-task.yml.
  • Both READMEs explain the range's two branches and list the new files. Version
    1.2.1 so the release can carry a prebuilt tarball.
  • Harness: 307 assertions; the range itself is pinned, including the rule that
    every supported tuple needs its own prerelease branch.

Prebuilt package: dsh-restart-task.tgz (attached; the asset name carries no version, so this pinned-tag link never rots).

v1.2.0 — DSH 0.1.7 adaptation

Choose a tag to compare

@zchuxi zchuxi released this 25 Sep 12:19

Port the plugin to the 0.1.7 plugin contract and repair the surfaces that had
silently stopped working.

Host half

  • Declare the policy as a volatile Config and read it through the live
    references the loader hands apply. The retired
    settings.register(namespace, schema) seam is gone, and the settings form now
    addresses the profile entry id (restart-task); the plugin records that it
    ships its own page with settings.configure({ auto: false }, ctx.fiber).
  • The plugin requires DSH >= 0.1.7-rc.2 through the enforced
    peerDependencies["@deepseek-ai/dsh"] range, and @deepseek-ai/schemastery
    ^3.18.4 - the first release whose schemas can be .volatile().

Browser half

  • Register the settings card into the Plugins page's plugins.bundle.config
    seat, keyed by the bundle package name, and acquire the form through
    configForms inside an optional child, so the composer control survives a
    composition without the settings domain.
  • Continuation rows: the old :has([data-context-source=...]) rule could never
    match - the attribute is valueless and the producer name is text - and a round
    this plugin opens renders as a non-human trigger notice that carries no
    provenance at all. Attribution now reads the session event window: a round is
    this plugin's when one of its messages is that round's first input. The set
    accumulates while the transcript stays on one session, so folding a completed
    round or paging history can no longer take a round back.
  • Turn rail: read the 0.1.7 mark DOM (button[data-index] inside the marks
    container) and take the rounds from the window rather than from tagged rows, so
    a tier-2 steer never hides the human's own round.
  • Send button (sendBecomesContinue, default on): while a continuation is on
    offer and the composer is empty, the shipped send button carries it - the one
    control the product disables in exactly that state. The takeover clears
    disabled, intercepts the click in the capture phase, and runs the composer
    control's own action; every other click passes through, a composer the human is
    typing in is never touched, and the release leaves disabled to the product.
  • Both injected stylesheets declare their owner with data-plugin, so the module
    system cannot adopt them for another plugin and delete them on its unload.

Harness

  • 305 assertions across four layers: pure rules, platform wiring, real host
    behaviour through a stub Cordis context, and the transcript/rail/send-button
    passes over a stub DOM whose event fixtures are copied from a real
    session.v4.jsonl.

Packaging

  • English and Chinese README, icon, licence, .gitattributes, and a CI workflow
    that installs the single runtime dependency, syntax-checks both halves, runs
    the harness and packs the published artifact.