zames_pro 2.94.3 → 2.94.5

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,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.94.5] - 2026-11-03
11
+
12
+ ### Changed
13
+
14
+ - **deepseek:** cut the send-start deadline from 50s to 22s
15
+
16
+ ## [2.94.4] - 2026-11-03
17
+
18
+ ### Fixed
19
+
20
+ - **deepseek:** never resend a truncated turn while an answer is captured
21
+
22
+ ### Changed
23
+
24
+ - format ask-deadline test
25
+
10
26
  ## [2.94.3] - 2026-11-02
11
27
 
12
28
  ### Fixed
package/dist/browser.js CHANGED
@@ -2278,7 +2278,11 @@ export class DeepSeekBrowser {
2278
2278
  // Wait for the start: either Stop appeared, or the answer text changed,
2279
2279
  // or the page grew (a new answer node / longer last answer). In parallel we
2280
2280
  // catch the rate-limit toast (only toasts, not the whole body).
2281
- const startDeadline = Date.now() + 30_000;
2281
+ // MEASURED live: an answer either starts within a few seconds or the send
2282
+ // did not go out at all. The old 30s + 20s windows meant FIFTY seconds of
2283
+ // a frozen "generating" status on every missed start; 12s + 10s is
2284
+ // plenty for DeepSeek to show the Stop button or start streaming.
2285
+ const startDeadline = Date.now() + 12_000;
2282
2286
  // A CHEAP growth signal (message-node count + last-answer length)
2283
2287
  // instead of document.body.innerText.length, which walked the whole page.
2284
2288
  const startSignal = await this._chatSignal();
@@ -2350,7 +2354,10 @@ export class DeepSeekBrowser {
2350
2354
  }
2351
2355
  if (!awaitingAnswer &&
2352
2356
  this._netCaptureAt >= this._lastSentAt &&
2353
- isGenerationIncompleteText(this._netBody)) {
2357
+ isGenerationIncompleteText(this._netBody) &&
2358
+ // A body can carry BOTH the marker and a real answer in a late
2359
+ // fragment: never declare the turn dead while text is already there.
2360
+ !(this._netCapture && this._netCapture.trim().length > 0)) {
2354
2361
  // PREFER the Continue button: it RESUMES the same truncated turn (a
2355
2362
  // `chat/continue` request). Resending the prompt creates a NEW turn and
2356
2363
  // duplicates the work. Only resend when there is no button to click.
@@ -2509,7 +2516,7 @@ export class DeepSeekBrowser {
2509
2516
  this._askDebug('START-failed, resending');
2510
2517
  await this.page.keyboard.press('Enter');
2511
2518
  this._lastSentAt = Date.now();
2512
- const retryDeadline = Date.now() + 20_000;
2519
+ const retryDeadline = Date.now() + 10_000;
2513
2520
  while (Date.now() < retryDeadline) {
2514
2521
  if (this._abort || this._askCancelled)
2515
2522
  return '(прервано пользователем)';
@@ -2592,7 +2599,10 @@ export class DeepSeekBrowser {
2592
2599
  isFinishedWithAnswer(this._netBody);
2593
2600
  const truncated = !doneAnswer &&
2594
2601
  this._netCaptureAt >= this._lastSentAt &&
2595
- isGenerationIncompleteText(this._netBody);
2602
+ isGenerationIncompleteText(this._netBody) &&
2603
+ // A truncation marker may arrive BEFORE a late RESPONSE fragment:
2604
+ // never declare the turn dead while text is already captured.
2605
+ !(this._netCapture && this._netCapture.trim().length > 0);
2596
2606
  const noAnswer = !doneAnswer &&
2597
2607
  this._netNoAnswer &&
2598
2608
  this._netCaptureAt >= this._lastSentAt;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.94.3",
3
+ "version": "2.94.5",
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": {