Skip to content

Releases

v0.2 - complete long answers, non-modal card

Choose a tag to compare

@andrewhmir andrewhmir released this 22 Oct 10:08

v0.2 — complete long answers, non-modal card

Fixes the two ways a long /btw answer could fail: it was cut mid-sentence, or
nothing appeared at all.

Why it happened

  • The routed Messages protocol counts thinking against max_tokens. The old
    1200-token cap could be consumed entirely by reasoning, leaving zero answer
    text; otherwise the answer stopped mid-sentence on finish: max-tokens.
  • A hard 120 s wall clock aborted healthy streams while tokens were still
    arriving, and the client replaced the already-streamed text with the error.

What changed

  • output budget default 8192, capped by the session's composed output cap
  • automatic continuation on max-tokens (up to 2 rounds) instead of showing
    half a sentence; continuation rounds run without thinking
  • one thinking-off retry when the budget is spent before any visible text, so
    a thinking-heavy call still produces an answer
  • stall watchdog (no chunk for 60 s) plus a 10 min ceiling, reported as
    STALLED / DEADLINE; partial text is never dropped
  • non-modal floating card: no backdrop, no data-shortcut-modal, Space/Enter
    never captured, close button or Escape-while-focused; the composer and chat
    stay usable while an answer streams
  • the stream always settles (STREAM_ENDED) and a failure renders beside the
    partial answer; thinking progress shows as "Thinking… 1.5k"
  • configurable: maxTokens, continuations, stallTimeoutMs, deadlineMs
    (alias timeoutMs), thinking: inherit|off

Verification

  • Unit suite: 89 tests, fully green in CI (ubuntu), including the client-bundle
    currency and node --check gates; 88/89 locally because the confined Windows
    sandbox blocks the E2E parser test's child process
  • node tools/build-client.mjs --check clean
  • browser E2E updated for the non-modal dismissal contract; re-run pending an
    unconfined Chrome run

Upgrading

Restart dsh web to load the new host half; the client bundle hot-swaps.

plugin_manager install_bundle  target: @andrewhmir/dsh-btw@0.2.0

Git tag v0.2.0. Not yet published to npm.

v0.1.2 - ephemeral /btw side questions

Choose a tag to compare

@andrewhmir andrewhmir released this 22 Oct 09:37

/btw <question> answers a side question from the full current conversation, with no tools, and the exchange is never written to session history — no transcript rows, no model-visible messages on the next turn. The answer streams into a dismissible overlay (Space / Enter / Escape) and works while the main turn is still running.

It is the inverse of a subagent: a subagent gets the full tool surface and an empty context; /btw gets the full conversation context and no tools.

Install

Requires DSH >= 0.2.0-rc.2 with the Web GUI (dsh web).

From a local checkout:

plugin_manager install_bundle  target: /absolute/path/to/dsh-btw

Package: @andrewhmir/dsh-btw@0.1.2 — a DSH bundle; it declares dsh.bundle.patch and one client+host plugin row (id: btw). Restart dsh web after installing.

In this release

  • package identity @andrewhmir/dsh-btw, version 0.1.2, MIT, engines.dsh floor set to the measured >=0.2.0-rc.2
  • repository layout: the package sits at the repository root; CI checks the client bundle, syntax, the unit suite, and the packed file set
  • README (install, semantics, privacy, limits, compatibility, independence), MOUNT.md machine notes, and docs/VERIFICATION.md evidence
  • clean-room E2E tooling: first-run against a fresh DSH home, browser CDP E2E, mid-stream concurrency, and session-log ephemerality assertions

Verification

  • node --test "test/*.test.mjs" → 67/67 pass
  • node tools/build-client.mjs --check → bundle current; node --check client.js → clean
  • GitHub Actions CI green on this commit
  • ephemerality checks: the question and answer are absent from the session log; the overlay refuses attachments and dismisses without leaving state

Privacy

No persistence, no tool calls, no extra provider: the request reuses the session's routed provider/model/reasoning effort and its prompt-cache prefix. Dismissing the overlay aborts the provider call.