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 +8 -0
- package/dist/browser.js +18 -1
- package/package.json +1 -1
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
|
-
|
|
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.
|
|
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": {
|