zames_pro 2.94.4 → 2.94.6

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,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.94.6] - 2026-11-03
11
+
12
+ ### Fixed
13
+
14
+ - **ui:** clear the generating badge as soon as an answer comes back
15
+
16
+ ## [2.94.5] - 2026-11-03
17
+
18
+ ### Changed
19
+
20
+ - **deepseek:** cut the send-start deadline from 50s to 22s
21
+
10
22
  ## [2.94.4] - 2026-11-03
11
23
 
12
24
  ### Fixed
@@ -49,6 +49,7 @@ export async function runAgentLoop({ browser, tools, task, workdir, maxIteration
49
49
  // Coarse lifecycle of the send (generating/paused/settled) for the status
50
50
  // line. Same best-effort wiring as the other hooks.
51
51
  browser.onSendState = safe(onSendState);
52
+ const safeSendState = safe(onSendState);
52
53
  // Service notices (rate limit, server busy, resend) must reach the OPERATOR.
53
54
  // While a LineEditor is active a raw console.error is overwritten by the
54
55
  // editor's repaint, so the operator only saw the spinner. `onNotice` prints
@@ -425,6 +426,12 @@ export async function runAgentLoop({ browser, tools, task, workdir, maxIteration
425
426
  }
426
427
  await reportChat();
427
428
  transcript?.log('assistant_raw', { response: rawResponse });
429
+ // A returned answer is a FINISHED generation: clear the "generating" badge
430
+ // NOW, not when the next ask() happens to start. The operator used to see
431
+ // "▶ генерация" for minutes after the answer had already been printed
432
+ // (the tool-call parsing, a long Bash run) - it looked like the agent was
433
+ // still generating with nothing in flight.
434
+ safeSendState('settled');
428
435
  // The user aborted generation (Esc/Ctrl+C).
429
436
  if (/^\s*\(прервано пользователем\)\s*$/.test(rawResponse)) {
430
437
  transcript?.log('user_aborted');
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();
@@ -2512,7 +2516,7 @@ export class DeepSeekBrowser {
2512
2516
  this._askDebug('START-failed, resending');
2513
2517
  await this.page.keyboard.press('Enter');
2514
2518
  this._lastSentAt = Date.now();
2515
- const retryDeadline = Date.now() + 20_000;
2519
+ const retryDeadline = Date.now() + 10_000;
2516
2520
  while (Date.now() < retryDeadline) {
2517
2521
  if (this._abort || this._askCancelled)
2518
2522
  return '(прервано пользователем)';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.94.4",
3
+ "version": "2.94.6",
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": {