zames_pro 2.95.1 → 2.95.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.95.2] - 2026-11-04
11
+
12
+ ### Changed
13
+
14
+ - fix-deepseek-head-only
15
+ - test: pin the streamed-answer head snapshot (the resend loop)
16
+ - docs: theme gallery, mobile menu and code copy buttons
17
+
10
18
  ## [2.95.1] - 2026-11-03
11
19
 
12
20
  ### Fixed
package/dist/browser.js CHANGED
@@ -510,6 +510,12 @@ export class DeepSeekBrowser {
510
510
  this._lastSentAt = Date.now();
511
511
  }
512
512
  this._netBody = body;
513
+ // The answer clock drives the "is this body FRESH?" gate in both
514
+ // ask loops. A body that carries a (head) fragment but no decodable
515
+ // answer text left the clock at 0, so every detector below saw a
516
+ // stale body and stayed silent. Give it a fresh timestamp.
517
+ if (!this._netCaptureAt)
518
+ this._netCaptureAt = Date.now();
513
519
  const cid = url.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/);
514
520
  if (cid)
515
521
  this._netChatId = cid[0];
@@ -2631,6 +2637,15 @@ export class DeepSeekBrowser {
2631
2637
  const noAnswer = !doneAnswer &&
2632
2638
  this._netNoAnswer &&
2633
2639
  this._netCaptureAt >= this._lastSentAt;
2640
+ // A HEAD-ONLY snapshot is NOT a dead turn: DeepSeek opens a turn
2641
+ // with a RESPONSE fragment that holds only newlines, and the text
2642
+ // arrives in the following bare `data: {"v":...}` chunks.
2643
+ // `_netBody` is the body of the LAST network event, so a poll that
2644
+ // lands between the snapshot and the first chunk sees FINISHED with
2645
+ // no answer, and the old code threw at once (the operator saw
2646
+ // "DeepSeek оборвал ответ") while the chat was still streaming.
2647
+ const headOnly = this._netCaptureAt >= this._lastSentAt &&
2648
+ isFinishedAwaitingAnswer(this._netBody);
2634
2649
  if ((truncated || noAnswer) && this.autoContinue) {
2635
2650
  // MEASURED: a COMPLETE DSML tool call ends with the event `close`
2636
2651
  // and `{click_behavior:'none', auto_resume:false}`, yet the DOM may
@@ -2660,7 +2675,9 @@ export class DeepSeekBrowser {
2660
2675
  // autoContinue is off. Do NOT wait out the whole timeout — the turn is
2661
2676
  // dead (truncated / finished with no answer), so tell ask() to RESEND
2662
2677
  // the prompt right away (that is the only remaining way to continue).
2663
- if (truncated || noAnswer) {
2678
+ // EXCEPT a head-only snapshot: the rest of the answer is still on
2679
+ // its way (see `headOnly`), so keep waiting for the append chunks.
2680
+ if ((truncated || noAnswer) && !headOnly) {
2664
2681
  throw new GenerationIncompleteError((this._netBody || 'finished without answer').slice(-300));
2665
2682
  }
2666
2683
  // Reasoning-mode pause: DeepSeek caps the THINK phase and shows a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.95.1",
3
+ "version": "2.95.2",
4
4
  "description": "Terminal coding agent that drives a real browser to chat with DeepSeek, Qwen or GLM — no API key required. Reads and edits files, runs commands, commits to git, like Claude Code / Codex CLI.",
5
5
  "type": "module",
6
6
  "bin": {