zames_pro 2.94.5 → 2.94.7
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 +12 -0
- package/dist/agent-loop.js +7 -0
- package/dist/browser.js +25 -0
- package/package.json +1 -1
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.7] - 2026-11-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **deepseek:** recognise the server-busy notice from the SSE body
|
|
15
|
+
|
|
16
|
+
## [2.94.6] - 2026-11-03
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **ui:** clear the generating badge as soon as an answer comes back
|
|
21
|
+
|
|
10
22
|
## [2.94.5] - 2026-11-03
|
|
11
23
|
|
|
12
24
|
### Changed
|
package/dist/agent-loop.js
CHANGED
|
@@ -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
|
@@ -117,6 +117,10 @@ export class DeepSeekBrowser {
|
|
|
117
117
|
// threw ds.send_no_new_answer while the chat plainly showed the rate limit.
|
|
118
118
|
// Reset before a send.
|
|
119
119
|
_netRateLimited;
|
|
120
|
+
// True when the LAST completion/continue body carried the server-busy
|
|
121
|
+
// notice ("Server busy, please try again later"). It arrives WITHOUT a
|
|
122
|
+
// DOM toast, so the SSE body is the authoritative source. Reset per send.
|
|
123
|
+
_netServerBusy;
|
|
120
124
|
_netChatId;
|
|
121
125
|
// The latest CONTEXT size (in tokens) DeepSeek reported in the current
|
|
122
126
|
// chat. It is the `accumulated_token_usage` counter taken from the SSE
|
|
@@ -228,6 +232,7 @@ export class DeepSeekBrowser {
|
|
|
228
232
|
this._netCaptureAt = 0;
|
|
229
233
|
this._netNoAnswer = false;
|
|
230
234
|
this._netRateLimited = false;
|
|
235
|
+
this._netServerBusy = false;
|
|
231
236
|
this._netChatId = null;
|
|
232
237
|
this._lastTokenUsage = null;
|
|
233
238
|
this._toggles = { deepThinking, webSearch };
|
|
@@ -537,6 +542,13 @@ export class DeepSeekBrowser {
|
|
|
537
542
|
this._netRateLimited = true;
|
|
538
543
|
this._netCapture = '';
|
|
539
544
|
}
|
|
545
|
+
// The SERVER-BUSY notice can arrive ONLY in the body: the toast is
|
|
546
|
+
// short-lived, and without this the loop waited out the deadline and
|
|
547
|
+
// reported "no answer" for a turn the server had refused.
|
|
548
|
+
if (isServerBusyText(body)) {
|
|
549
|
+
this._netServerBusy = true;
|
|
550
|
+
this._netCapture = '';
|
|
551
|
+
}
|
|
540
552
|
this._netCaptureAt = Date.now();
|
|
541
553
|
}
|
|
542
554
|
}
|
|
@@ -2198,6 +2210,7 @@ export class DeepSeekBrowser {
|
|
|
2198
2210
|
this._netCaptureAt = 0;
|
|
2199
2211
|
this._netNoAnswer = false;
|
|
2200
2212
|
this._netRateLimited = false;
|
|
2213
|
+
this._netServerBusy = false;
|
|
2201
2214
|
this._netBody = '';
|
|
2202
2215
|
// Align the DeepSeek chat toggles (deep thinking / web search) with the
|
|
2203
2216
|
// configured state BEFORE typing. Doing it here (after the send-pause) it
|
|
@@ -2324,6 +2337,12 @@ export class DeepSeekBrowser {
|
|
|
2324
2337
|
if (this._netRateLimited && this._netCaptureAt >= this._lastSentAt) {
|
|
2325
2338
|
throw new RateLimitError(this._netBody.slice(0, 300) || 'rate limit (from network)');
|
|
2326
2339
|
}
|
|
2340
|
+
// Body-only server-busy notice: retry instead of waiting out the
|
|
2341
|
+
// whole deadline (a live chat showed it while the agent reported
|
|
2342
|
+
// "no answer").
|
|
2343
|
+
if (this._netServerBusy && this._netCaptureAt >= this._lastSentAt) {
|
|
2344
|
+
throw new ServerBusyError(this._netBody.slice(-300));
|
|
2345
|
+
}
|
|
2327
2346
|
// The turn was truncated by the server: the SSE body carries
|
|
2328
2347
|
// finish_reason=generation_err / quasi_status=INCOMPLETE and the UI
|
|
2329
2348
|
// shows "Continue". Retry instead of waiting out the whole timeout.
|
|
@@ -2579,6 +2598,12 @@ export class DeepSeekBrowser {
|
|
|
2579
2598
|
if (this._netRateLimited && this._netCaptureAt >= this._lastSentAt) {
|
|
2580
2599
|
throw new RateLimitError(this._netBody.slice(0, 300) || 'rate limit (from network)');
|
|
2581
2600
|
}
|
|
2601
|
+
// Body-only server-busy notice: retry instead of waiting out the
|
|
2602
|
+
// whole deadline (a live chat showed it while the agent reported
|
|
2603
|
+
// "no answer").
|
|
2604
|
+
if (this._netServerBusy && this._netCaptureAt >= this._lastSentAt) {
|
|
2605
|
+
throw new ServerBusyError(this._netBody.slice(-300));
|
|
2606
|
+
}
|
|
2582
2607
|
// The exhausted context can likewise be visible only in the captured
|
|
2583
2608
|
// body rather than in a toast, so ask() must see it here as well.
|
|
2584
2609
|
if (this._netCaptureAt >= this._lastSentAt &&
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zames_pro",
|
|
3
|
-
"version": "2.94.
|
|
3
|
+
"version": "2.94.7",
|
|
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": {
|